'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _helpers = require('../../formatter/helpers'); var _command_types = require('./command_types'); var _command_types2 = _interopRequireDefault(_command_types); var _events = require('events'); var _events2 = _interopRequireDefault(_events); var _readline = require('readline'); var _readline2 = _interopRequireDefault(_readline); var _serializeError = require('serialize-error'); var _serializeError2 = _interopRequireDefault(_serializeError); var _stack_trace_filter = require('../stack_trace_filter'); var _stack_trace_filter2 = _interopRequireDefault(_stack_trace_filter); var _support_code_library_builder = require('../../support_code_library_builder'); var _support_code_library_builder2 = _interopRequireDefault(_support_code_library_builder); var _test_case_runner = require('../test_case_runner'); var _test_case_runner2 = _interopRequireDefault(_test_case_runner); var _user_code_runner = require('../../user_code_runner'); var _user_code_runner2 = _interopRequireDefault(_user_code_runner); var _verror = require('verror'); var _verror2 = _interopRequireDefault(_verror); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var EVENTS = ['test-case-prepared', 'test-case-started', 'test-step-started', 'test-step-attachment', 'test-step-finished', 'test-case-finished']; function replacerSerializeErrors(key, value) { if (_lodash2.default.isError(value)) { return (0, _serializeError2.default)(value); } return value; } var Slave = function () { function Slave(_ref) { var _this = this; var cwd = _ref.cwd, stdin = _ref.stdin, stdout = _ref.stdout; (0, _classCallCheck3.default)(this, Slave); this.initialized = false; this.stdin = stdin; this.stdout = stdout; this.cwd = cwd; this.eventBroadcaster = new _events2.default(); this.stackTraceFilter = new _stack_trace_filter2.default(); EVENTS.forEach(function (name) { _this.eventBroadcaster.on(name, function (data) { return _this.stdout.write(JSON.stringify({ command: _command_types2.default.EVENT, name: name, data: data }, replacerSerializeErrors) + '\n'); }); }); } (0, _createClass3.default)(Slave, [{ key: 'initialize', value: function () { var _ref3 = (0, _bluebird.coroutine)(function* (_ref2) { var filterStacktraces = _ref2.filterStacktraces, supportCodeRequiredModules = _ref2.supportCodeRequiredModules, supportCodePaths = _ref2.supportCodePaths, worldParameters = _ref2.worldParameters; supportCodeRequiredModules.map(function (module) { return require(module); }); _support_code_library_builder2.default.reset(this.cwd); supportCodePaths.forEach(function (codePath) { return require(codePath); }); this.supportCodeLibrary = _support_code_library_builder2.default.finalize(); this.worldParameters = worldParameters; this.filterStacktraces = filterStacktraces; if (this.filterStacktraces) { this.stackTraceFilter.filter(); } yield this.runTestRunHooks('beforeTestRunHookDefinitions', 'a BeforeAll'); this.stdout.write(JSON.stringify({ command: _command_types2.default.READY }) + '\n'); }); function initialize(_x) { return _ref3.apply(this, arguments); } return initialize; }() }, { key: 'finalize', value: function () { var _ref4 = (0, _bluebird.coroutine)(function* () { yield this.runTestRunHooks('afterTestRunHookDefinitions', 'an AfterAll'); if (this.filterStacktraces) { this.stackTraceFilter.unfilter(); } process.exit(); }); function finalize() { return _ref4.apply(this, arguments); } return finalize; }() }, { key: 'parseMasterLine', value: function parseMasterLine(line) { var input = JSON.parse(line); if (input.command === 'initialize') { this.initialize(input); } else if (input.command === 'finalize') { this.finalize(); } else if (input.command === 'run') { this.runTestCase(input); } } }, { key: 'run', value: function () { var _ref5 = (0, _bluebird.coroutine)(function* () { var _this2 = this; this.rl = _readline2.default.createInterface({ input: this.stdin }); this.rl.on('line', function (line) { _this2.parseMasterLine(line); }); }); function run() { return _ref5.apply(this, arguments); } return run; }() }, { key: 'runTestCase', value: function () { var _ref7 = (0, _bluebird.coroutine)(function* (_ref6) { var testCase = _ref6.testCase, skip = _ref6.skip; var testCaseRunner = new _test_case_runner2.default({ eventBroadcaster: this.eventBroadcaster, skip: skip, supportCodeLibrary: this.supportCodeLibrary, testCase: testCase, worldParameters: this.worldParameters }); yield testCaseRunner.run(); this.stdout.write(JSON.stringify({ command: _command_types2.default.READY }) + '\n'); }); function runTestCase(_x2) { return _ref7.apply(this, arguments); } return runTestCase; }() }, { key: 'runTestRunHooks', value: function () { var _ref8 = (0, _bluebird.coroutine)(function* (key, name) { var _this3 = this; yield _bluebird2.default.each(this.supportCodeLibrary[key], function () { var _ref9 = (0, _bluebird.coroutine)(function* (hookDefinition) { var _ref10 = yield _user_code_runner2.default.run({ argsArray: [], fn: hookDefinition.code, thisArg: null, timeoutInMilliseconds: hookDefinition.options.timeout || _this3.supportCodeLibrary.defaultTimeout }), error = _ref10.error; if (error) { var location = (0, _helpers.formatLocation)(hookDefinition); throw new _verror2.default(error, name + ' hook errored, process exiting: ' + location); } }); return function (_x5) { return _ref9.apply(this, arguments); }; }()); }); function runTestRunHooks(_x3, _x4) { return _ref8.apply(this, arguments); } return runTestRunHooks; }() }]); return Slave; }(); exports.default = Slave; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW50aW1lL3BhcmFsbGVsL3NsYXZlLmpzIl0sIm5hbWVzIjpbIkVWRU5UUyIsInJlcGxhY2VyU2VyaWFsaXplRXJyb3JzIiwia2V5IiwidmFsdWUiLCJpc0Vycm9yIiwiU2xhdmUiLCJjd2QiLCJzdGRpbiIsInN0ZG91dCIsImluaXRpYWxpemVkIiwiZXZlbnRCcm9hZGNhc3RlciIsInN0YWNrVHJhY2VGaWx0ZXIiLCJmb3JFYWNoIiwib24iLCJuYW1lIiwid3JpdGUiLCJKU09OIiwic3RyaW5naWZ5IiwiY29tbWFuZCIsIkVWRU5UIiwiZGF0YSIsImZpbHRlclN0YWNrdHJhY2VzIiwic3VwcG9ydENvZGVSZXF1aXJlZE1vZHVsZXMiLCJzdXBwb3J0Q29kZVBhdGhzIiwid29ybGRQYXJhbWV0ZXJzIiwibWFwIiwicmVxdWlyZSIsIm1vZHVsZSIsInJlc2V0IiwiY29kZVBhdGgiLCJzdXBwb3J0Q29kZUxpYnJhcnkiLCJmaW5hbGl6ZSIsImZpbHRlciIsInJ1blRlc3RSdW5Ib29rcyIsIlJFQURZIiwidW5maWx0ZXIiLCJwcm9jZXNzIiwiZXhpdCIsImxpbmUiLCJpbnB1dCIsInBhcnNlIiwiaW5pdGlhbGl6ZSIsInJ1blRlc3RDYXNlIiwicmwiLCJjcmVhdGVJbnRlcmZhY2UiLCJwYXJzZU1hc3RlckxpbmUiLCJ0ZXN0Q2FzZSIsInNraXAiLCJ0ZXN0Q2FzZVJ1bm5lciIsInJ1biIsImVhY2giLCJob29rRGVmaW5pdGlvbiIsImFyZ3NBcnJheSIsImZuIiwiY29kZSIsInRoaXNBcmciLCJ0aW1lb3V0SW5NaWxsaXNlY29uZHMiLCJvcHRpb25zIiwidGltZW91dCIsImRlZmF1bHRUaW1lb3V0IiwiZXJyb3IiLCJsb2NhdGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBRUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7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QUQrQztBQUFBLGdCQUMvREMsS0FEK0QsVUFDL0RBLEtBRCtEOztBQVN2RSxnQkFBSUEsS0FBSixFQUFXO0FBQ1Qsa0JBQU1DLFdBQVcsNkJBQWVWLGNBQWYsQ0FBakI7QUFDQSxvQkFBTSxxQkFDSlMsS0FESSxFQUVEOUMsSUFGQyx3Q0FFc0MrQyxRQUZ0QyxDQUFOO0FBSUQ7QUFDRixXQWhCSzs7QUFBQTtBQUFBO0FBQUE7QUFBQSxZQUFOO0FBaUJELE87Ozs7Ozs7Ozs7OztrQkEvRmtCeEQsSyIsImZpbGUiOiJzbGF2ZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCdcbmltcG9ydCB7IGZvcm1hdExvY2F0aW9uIH0gZnJvbSAnLi4vLi4vZm9ybWF0dGVyL2hlbHBlcnMnXG5pbXBvcnQgY29tbWFuZFR5cGVzIGZyb20gJy4vY29tbWFuZF90eXBlcydcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRzJ1xuaW1wb3J0IFByb21pc2UgZnJvbSAnYmx1ZWJpcmQnXG5pbXBvcnQgcmVhZGxpbmUgZnJvbSAncmVhZGxpbmUnXG5pbXBvcnQgc2VyaWFsaXplRXJyb3IgZnJvbSAnc2VyaWFsaXplLWVycm9yJ1xuaW1wb3J0IFN0YWNrVHJhY2VGaWx0ZXIgZnJvbSAnLi4vc3RhY2tfdHJhY2VfZmlsdGVyJ1xuaW1wb3J0IHN1cHBvcnRDb2RlTGlicmFyeUJ1aWxkZXIgZnJvbSAnLi4vLi4vc3VwcG9ydF9jb2RlX2xpYnJhcnlfYnVpbGRlcidcbmltcG9ydCBUZXN0Q2FzZVJ1bm5lciBmcm9tICcuLi90ZXN0X2Nhc2VfcnVubmVyJ1xuaW1wb3J0IFVzZXJDb2RlUnVubmVyIGZyb20gJy4uLy4uL3VzZXJfY29kZV9ydW5uZXInXG5pbXBvcnQgVkVycm9yIGZyb20gJ3ZlcnJvcidcblxuY29uc3QgRVZFTlRTID0gW1xuICAndGVzdC1jYXNlLXByZXBhcmVkJyxcbiAgJ3Rlc3QtY2FzZS1zdGFydGVkJyxcbiAgJ3Rlc3Qtc3RlcC1zdGFydGVkJyxcbiAgJ3Rlc3Qtc3RlcC1hdHRhY2htZW50JyxcbiAgJ3Rlc3Qtc3RlcC1maW5pc2hlZCcsXG4gICd0ZXN0LWNhc2UtZmluaXNoZWQnLFxuXVxuXG5mdW5jdGlvbiByZXBsYWNlclNlcmlhbGl6ZUVycm9ycyhrZXksIHZhbHVlKSB7XG4gIGlmIChfLmlzRXJyb3IodmFsdWUpKSB7XG4gICAgcmV0dXJuIHNlcmlhbGl6ZUVycm9yKHZhbHVlKVxuICB9XG4gIHJldHVybiB2YWx1ZVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbGF2ZSB7XG4gIGNvbnN0cnVjdG9yKHsgY3dkLCBzdGRpbiwgc3Rkb3V0IH0pIHtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2VcbiAgICB0aGlzLnN0ZGluID0gc3RkaW5cbiAgICB0aGlzLnN0ZG91dCA9IHN0ZG91dFxuICAgIHRoaXMuY3dkID0gY3dkXG4gICAgdGhpcy5ldmVudEJyb2FkY2FzdGVyID0gbmV3IEV2ZW50RW1pdHRlcigpXG4gICAgdGhpcy5zdGFja1RyYWNlRmlsdGVyID0gbmV3IFN0YWNrVHJhY2VGaWx0ZXIoKVxuICAgIEVWRU5UUy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgdGhpcy5ldmVudEJyb2FkY2FzdGVyLm9uKG5hbWUsIGRhdGEgPT5cbiAgICAgICAgdGhpcy5zdGRvdXQud3JpdGUoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB7IGNvbW1hbmQ6IGNvbW1hbmRUeXBlcy5FVkVOVCwgbmFtZSwgZGF0YSB9LFxuICAgICAgICAgICAgcmVwbGFjZXJTZXJpYWxpemVFcnJvcnNcbiAgICAgICAgICApICsgJ1xcbidcbiAgICAgICAgKVxuICAgICAgKVxuICAgIH0pXG4gIH1cblxuICBhc3luYyBpbml0aWFsaXplKHtcbiAgICBmaWx0ZXJTdGFja3RyYWNlcyxcbiAgICBzdXBwb3J0Q29kZVJlcXVpcmVkTW9kdWxlcyxcbiAgICBzdXBwb3J0Q29kZVBhdGhzLFxuICAgIHdvcmxkUGFyYW1ldGVycyxcbiAgfSkge1xuICAgIHN1cHBvcnRDb2RlUmVxdWlyZWRNb2R1bGVzLm1hcChtb2R1bGUgPT4gcmVxdWlyZShtb2R1bGUpKVxuICAgIHN1cHBvcnRDb2RlTGlicmFyeUJ1aWxkZXIucmVzZXQodGhpcy5jd2QpXG4gICAgc3VwcG9ydENvZGVQYXRocy5mb3JFYWNoKGNvZGVQYXRoID0+IHJlcXVpcmUoY29kZVBhdGgpKVxuICAgIHRoaXMuc3VwcG9ydENvZGVMaWJyYXJ5ID0gc3VwcG9ydENvZGVMaWJyYXJ5QnVpbGRlci5maW5hbGl6ZSgpXG4gICAgdGhpcy53b3JsZFBhcmFtZXRlcnMgPSB3b3JsZFBhcmFtZXRlcnNcbiAgICB0aGlzLmZpbHRlclN0YWNrdHJhY2VzID0gZmlsdGVyU3RhY2t0cmFjZXNcbiAgICBpZiAodGhpcy5maWx0ZXJTdGFja3RyYWNlcykge1xuICAgICAgdGhpcy5zdGFja1RyYWNlRmlsdGVyLmZpbHRlcigpXG4gICAgfVxuICAgIGF3YWl0IHRoaXMucnVuVGVzdFJ1bkhvb2tzKCdiZWZvcmVUZXN0UnVuSG9va0RlZmluaXRpb25zJywgJ2EgQmVmb3JlQWxsJylcbiAgICB0aGlzLnN0ZG91dC53cml0ZShKU09OLnN0cmluZ2lmeSh7IGNvbW1hbmQ6IGNvbW1hbmRUeXBlcy5SRUFEWSB9KSArICdcXG4nKVxuICB9XG5cbiAgYXN5bmMgZmluYWxpemUoKSB7XG4gICAgYXdhaXQgdGhpcy5ydW5UZXN0UnVuSG9va3MoJ2FmdGVyVGVzdFJ1bkhvb2tEZWZpbml0aW9ucycsICdhbiBBZnRlckFsbCcpXG4gICAgaWYgKHRoaXMuZmlsdGVyU3RhY2t0cmFjZXMpIHtcbiAgICAgIHRoaXMuc3RhY2tUcmFjZUZpbHRlci51bmZpbHRlcigpXG4gICAgfVxuICAgIHByb2Nlc3MuZXhpdCgpXG4gIH1cblxuICBwYXJzZU1hc3RlckxpbmUobGluZSkge1xuICAgIGNvbnN0IGlucHV0ID0gSlNPTi5wYXJzZShsaW5lKVxuICAgIGlmIChpbnB1dC5jb21tYW5kID09PSAnaW5pdGlhbGl6ZScpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZShpbnB1dClcbiAgICB9IGVsc2UgaWYgKGlucHV0LmNvbW1hbmQgPT09ICdmaW5hbGl6ZScpIHtcbiAgICAgIHRoaXMuZmluYWxpemUoKVxuICAgIH0gZWxzZSBpZiAoaW5wdXQuY29tbWFuZCA9PT0gJ3J1bicpIHtcbiAgICAgIHRoaXMucnVuVGVzdENhc2UoaW5wdXQpXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcnVuKCkge1xuICAgIHRoaXMucmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2UoeyBpbnB1dDogdGhpcy5zdGRpbiB9KVxuICAgIHRoaXMucmwub24oJ2xpbmUnLCBsaW5lID0+IHtcbiAgICAgIHRoaXMucGFyc2VNYXN0ZXJMaW5lKGxpbmUpXG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIHJ1blRlc3RDYXNlKHsgdGVzdENhc2UsIHNraXAgfSkge1xuICAgIGNvbnN0IHRlc3RDYXNlUnVubmVyID0gbmV3IFRlc3RDYXNlUnVubmVyKHtcbiAgICAgIGV2ZW50QnJvYWRjYXN0ZXI6IHRoaXMuZXZlbnRCcm9hZGNhc3RlcixcbiAgICAgIHNraXAsXG4gICAgICBzdXBwb3J0Q29kZUxpYnJhcnk6IHRoaXMuc3VwcG9ydENvZGVMaWJyYXJ5LFxuICAgICAgdGVzdENhc2UsXG4gICAgICB3b3JsZFBhcmFtZXRlcnM6IHRoaXMud29ybGRQYXJhbWV0ZXJzLFxuICAgIH0pXG4gICAgYXdhaXQgdGVzdENhc2VSdW5uZXIucnVuKClcbiAgICB0aGlzLnN0ZG91dC53cml0ZShKU09OLnN0cmluZ2lmeSh7IGNvbW1hbmQ6IGNvbW1hbmRUeXBlcy5SRUFEWSB9KSArICdcXG4nKVxuICB9XG5cbiAgYXN5bmMgcnVuVGVzdFJ1bkhvb2tzKGtleSwgbmFtZSkge1xuICAgIGF3YWl0IFByb21pc2UuZWFjaCh0aGlzLnN1cHBvcnRDb2RlTGlicmFyeVtrZXldLCBhc3luYyBob29rRGVmaW5pdGlvbiA9PiB7XG4gICAgICBjb25zdCB7IGVycm9yIH0gPSBhd2FpdCBVc2VyQ29kZVJ1bm5lci5ydW4oe1xuICAgICAgICBhcmdzQXJyYXk6IFtdLFxuICAgICAgICBmbjogaG9va0RlZmluaXRpb24uY29kZSxcbiAgICAgICAgdGhpc0FyZzogbnVsbCxcbiAgICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOlxuICAgICAgICAgIGhvb2tEZWZpbml0aW9uLm9wdGlvbnMudGltZW91dCB8fFxuICAgICAgICAgIHRoaXMuc3VwcG9ydENvZGVMaWJyYXJ5LmRlZmF1bHRUaW1lb3V0LFxuICAgICAgfSlcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGZvcm1hdExvY2F0aW9uKGhvb2tEZWZpbml0aW9uKVxuICAgICAgICB0aHJvdyBuZXcgVkVycm9yKFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICAgIGAke25hbWV9IGhvb2sgZXJyb3JlZCwgcHJvY2VzcyBleGl0aW5nOiAke2xvY2F0aW9ufWBcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==