123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- 'use strict';
- var _exit;
- function _load_exit() {
- return (_exit = _interopRequireDefault(require('exit')));
- }
- var _run_test;
- function _load_run_test() {
- return (_run_test = _interopRequireDefault(require('./run_test')));
- }
- var _throat;
- function _load_throat() {
- return (_throat = _interopRequireDefault(require('throat')));
- }
- var _jestWorker;
- function _load_jestWorker() {
- return (_jestWorker = _interopRequireDefault(require('jest-worker')));
- }
- function _interopRequireDefault(obj) {
- return obj && obj.__esModule ? obj : {default: obj};
- }
- function _asyncToGenerator(fn) {
- return function() {
- var gen = fn.apply(this, arguments);
- return new Promise(function(resolve, reject) {
- function step(key, arg) {
- try {
- var info = gen[key](arg);
- var value = info.value;
- } catch (error) {
- reject(error);
- return;
- }
- if (info.done) {
- resolve(value);
- } else {
- return Promise.resolve(value).then(
- function(value) {
- step('next', value);
- },
- function(err) {
- step('throw', err);
- }
- );
- }
- }
- return step('next');
- });
- };
- }
- /**
- * Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- *
- *
- */
- const TEST_WORKER_PATH = require.resolve('./test_worker');
- class TestRunner {
- constructor(globalConfig) {
- this._globalConfig = globalConfig;
- }
- runTests(tests, watcher, onStart, onResult, onFailure, options) {
- var _this = this;
- return _asyncToGenerator(function*() {
- return yield options.serial
- ? _this._createInBandTestRun(
- tests,
- watcher,
- onStart,
- onResult,
- onFailure
- )
- : _this._createParallelTestRun(
- tests,
- watcher,
- onStart,
- onResult,
- onFailure
- );
- })();
- }
- _createInBandTestRun(tests, watcher, onStart, onResult, onFailure) {
- var _this2 = this;
- return _asyncToGenerator(function*() {
- process.env.JEST_WORKER_ID = '1';
- const mutex = (0, (_throat || _load_throat()).default)(1);
- return tests.reduce(function(promise, test) {
- return mutex(function() {
- return promise
- .then(
- _asyncToGenerator(function*() {
- if (watcher.isInterrupted()) {
- throw new CancelRun();
- }
- yield onStart(test);
- return (0,
- (_run_test || _load_run_test())
- .default)(test.path, _this2._globalConfig, test.context.config, test.context.resolver);
- })
- )
- .then(function(result) {
- return onResult(test, result);
- })
- .catch(function(err) {
- return onFailure(test, err);
- });
- });
- }, Promise.resolve());
- })();
- }
- _createParallelTestRun(tests, watcher, onStart, onResult, onFailure) {
- var _this3 = this;
- return _asyncToGenerator(function*() {
- // $FlowFixMe: class object is augmented with worker when instantiating.
- const worker = new (_jestWorker || _load_jestWorker()).default(
- TEST_WORKER_PATH,
- {
- exposedMethods: ['worker'],
- forkOptions: {stdio: 'inherit'},
- maxRetries: 3,
- numWorkers: _this3._globalConfig.maxWorkers
- }
- );
- const mutex = (0, (_throat || _load_throat()).default)(
- _this3._globalConfig.maxWorkers
- );
- // Send test suites to workers continuously instead of all at once to track
- // the start time of individual tests.
- const runTestInWorker = function(test) {
- return mutex(
- _asyncToGenerator(function*() {
- if (watcher.isInterrupted()) {
- return Promise.reject();
- }
- yield onStart(test);
- return worker.worker({
- config: test.context.config,
- globalConfig: _this3._globalConfig,
- path: test.path,
- rawModuleMap: watcher.isWatchMode()
- ? test.context.moduleMap.getRawModuleMap()
- : null
- });
- })
- );
- };
- const onError = (() => {
- var _ref3 = _asyncToGenerator(function*(err, test) {
- yield onFailure(test, err);
- if (err.type === 'ProcessTerminatedError') {
- console.error(
- 'A worker process has quit unexpectedly! ' +
- 'Most likely this is an initialization error.'
- );
- (0, (_exit || _load_exit()).default)(1);
- }
- });
- return function onError(_x, _x2) {
- return _ref3.apply(this, arguments);
- };
- })();
- const onInterrupt = new Promise(function(_, reject) {
- watcher.on('change', function(state) {
- if (state.interrupted) {
- reject(new CancelRun());
- }
- });
- });
- const runAllTests = Promise.all(
- tests.map(function(test) {
- return runTestInWorker(test)
- .then(function(testResult) {
- return onResult(test, testResult);
- })
- .catch(function(error) {
- return onError(error, test);
- });
- })
- );
- const cleanup = function() {
- return worker.end();
- };
- return Promise.race([runAllTests, onInterrupt]).then(cleanup, cleanup);
- })();
- }
- }
- class CancelRun extends Error {
- constructor(message) {
- super(message);
- this.name = 'CancelRun';
- }
- }
- module.exports = TestRunner;
|