UNPKG

se-runner

Version:
244 lines (203 loc) 9.65 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.SeRunner = undefined; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _globAll = require('glob-all'); var _globAll2 = _interopRequireDefault(_globAll); var _logger = require('./logger'); var _logger2 = _interopRequireDefault(_logger); var _utils = require('./utils'); var _utils2 = _interopRequireDefault(_utils); var _worker = require('./worker'); var _worker2 = _interopRequireDefault(_worker); var _workerState = require('./worker-state'); var _workerState2 = _interopRequireDefault(_workerState); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var SeRunner = exports.SeRunner = function () { function SeRunner(config) { _classCallCheck(this, SeRunner); this.config = _utils2.default.extend({}, this.defaultConfig, config); this.config = _utils2.default.extend(this.config, { basePath: process.cwd(), concurrency: Math.min(this.config.capabilities.length, this.config.concurrency), driverFactory: { create: this.config.driverFactory.create.toString() }, tests: this.config.tests ? _globAll2.default.sync(this.config.tests) : [] }); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = this.config.dependencies[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var d = _step.value; require(d); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } this.logger = new _logger2.default(this.config.logLevel); this.reports = []; this.workers = {}; } _createClass(SeRunner, [{ key: 'run', value: function run(done) { var _self = this, _doneCalled = false, _start = new Date().getTime(), _done = function _done(error) { !_doneCalled && (_doneCalled = true) && done && done({ duration: (new Date().getTime() - _start) / 1000, error: error || null, reports: _self.reports, success: error ? false : !_self.reports.some(function (r) { return !r.report.success; }) }); }, _workers = function _workers() { var state = arguments.length <= 0 || arguments[0] === undefined ? _workerState2.default.Working : arguments[0]; var _workers = []; for (var worker in _self.workers) { if (!_self.workers.hasOwnProperty(worker)) continue; if (state === _self.workers[worker].state) { _workers.push(_self.workers[worker]); } } return _workers; }, _onExit = function _onExit() { var _workers = _utils2.default.extend({}, _self.workers); for (var worker in _workers) { if (!_workers.hasOwnProperty(worker)) continue; if (_workerState2.default.Done !== _workers[worker].state) { _workers[worker].done(true); } } _done(); }, _onWorkerStopped = function _onWorkerStopped() { if (_workerState2.default.Done !== this.state) { this.done(); } _self.logger.log('Worker: ' + this.id + ' stopped'); if (_workers(_workerState2.default.Done).length !== Object.keys(_self.workers).length) { var _pendingWorkers = _workers(_workerState2.default.Pending); for (var worker in _pendingWorkers) { if (!_pendingWorkers.hasOwnProperty(worker)) continue; if (_self.config.concurrency > _workers(_workerState2.default.Working).length) { _pendingWorkers[worker].work(); } } return; } _self.logger.log('SeRunner::run(): Done...'); _done(); }; process.on('SIGINT', _onExit); process.on('exit', _onExit); _self.logger.log('SeRunner::run(): Starting ' + _self.config.capabilities.length + ' workers, maximum ' + _self.config.concurrency + ' at the time...'); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = _self.config.capabilities[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { var capabilities = _step2.value; var worker = new _worker2.default(_utils2.default.guid(), _utils2.default.extend({}, _self.config), _utils2.default.extend({}, capabilities)); worker.on('message', function (e) { switch (e.type) { case 'created': _self.logger.log('Worker: ' + this.id + ' started, slave process id: ' + this.slave.pid); break; case 'data': break; case 'error': _done(e); break; case 'exit': _onWorkerStopped.call(this); break; case 'log': _self.logger[e.logLevel](e.message); break; case 'report': var _config = _utils2.default.extend({}, this.config, { workerId: this.id }); delete _config.capabilities; _self.reports.push({ config: _config, description: this.description, report: e.report }); break; } }); worker.on('error', _onWorkerStopped.bind(worker)); worker.on('exit', _onWorkerStopped.bind(worker)); this.workers[worker.id] = worker; if (_self.config.concurrency > _workers(_workerState2.default.Working).length) { worker.work(); } } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } } }, { key: 'defaultConfig', get: function get() { return { basePath: process.cwd(), capabilities: [], concurrency: 1, context: {}, dependencies: [], driverFactory: { create: function create(capabilities) { return new (require('selenium-webdriver').Builder)().usingServer(this.selenium.hub).withCapabilities(capabilities).build(); } }, framework: 'jasmine', logLevel: 'INFO', selenium: { hub: 'http://hub.browserstack.com/wd/hub' }, tests: [], timeout: 60000, jasmine: { consoleReporter: true, dependencies: [], timeout: 60000 } }; } }]); return SeRunner; }();