UNPKG

13.4 kBJavaScriptView Raw
1"use strict";
2var __importDefault = (this && this.__importDefault) || function (mod) {
3 return (mod && mod.__esModule) ? mod : { "default": mod };
4};
5Object.defineProperty(exports, "__esModule", { value: true });
6const events_1 = __importDefault(require("events"));
7const lodash_1 = require("lodash");
8const test_run_1 = require("./test-run");
9const test_run_state_1 = __importDefault(require("./test-run-state"));
10class LiveModeTestRunController extends events_1.default {
11 constructor() {
12 super();
13 this.testWrappers = [];
14 this.expectedTestCount = 0;
15 this._testRunCtor = null;
16 this.testRuns = {};
17 this.allTestsCompletePromise = Promise.resolve();
18 this.completeAllRunningTests = lodash_1.noop;
19 this.on('all-tests-complete', () => this.completeAllRunningTests());
20 }
21 get TestRunCtor() {
22 if (!this._testRunCtor) {
23 this._testRunCtor = test_run_1.TestRunCtorFactory({
24 created: testRun => this._onTestRunCreated(testRun),
25 done: (testRun, forced) => this._onTestRunDone(testRun, forced),
26 readyToNext: testRun => this._onTestRunReadyToNext(testRun)
27 });
28 }
29 return this._testRunCtor;
30 }
31 setExpectedTestCount(testCount) {
32 this.expectedTestCount = testCount;
33 }
34 _getTestRuns() {
35 return [].concat(...Object.values(this.testRuns));
36 }
37 run() {
38 const readyToNextPromises = [];
39 const testRuns = [].concat(...Object.values(this.testRuns));
40 testRuns.forEach(testRun => {
41 if (testRun.finish) {
42 readyToNextPromises.push(testRun.readyToNextPromise);
43 testRun.finish();
44 }
45 });
46 this.testRuns = {};
47 return Promise.all(readyToNextPromises);
48 }
49 stop() {
50 this._getTestRuns().forEach(testRun => {
51 testRun.stop();
52 });
53 }
54 _getTestWrapper(test) {
55 return this.testWrappers.find(w => w.test === test);
56 }
57 _onTestRunCreated(testRun) {
58 this.allTestsCompletePromise = new Promise(resolve => {
59 this.completeAllRunningTests = resolve;
60 });
61 const connectionId = testRun.browserConnection.id;
62 this.testRuns[connectionId] = this.testRuns[connectionId] || [];
63 this.testRuns[connectionId].push(testRun);
64 }
65 _onTestRunDone(testRun) {
66 testRun.state = test_run_state_1.default.done;
67 const testWillBeRestarted = !this._isTestFinished(testRun);
68 const hasRunningTestsInOtherBrowsers = this._getTestRuns().some(t => t.state !== test_run_state_1.default.done);
69 if (!hasRunningTestsInOtherBrowsers && !testWillBeRestarted)
70 this.emit('all-tests-complete');
71 const browserTestRuns = this.testRuns[testRun.browserConnection.id];
72 const tests = lodash_1.uniq(browserTestRuns.map(t => t.test));
73 testRun.readyToNextPromise = new Promise(resolve => {
74 testRun.setReadyToNext = resolve;
75 });
76 const isLastTestRun = tests.length >= this.expectedTestCount;
77 if (testWillBeRestarted || !isLastTestRun)
78 return Promise.resolve();
79 return new Promise(resolve => {
80 testRun.finish = () => {
81 testRun.finish = null;
82 resolve();
83 };
84 });
85 }
86 _onTestRunReadyToNext(testRun) {
87 testRun.setReadyToNext();
88 }
89 _isTestFinished(testRun) {
90 const { quarantine, errs } = testRun;
91 if (!quarantine)
92 return true;
93 return quarantine.isFirstAttemptSuccessful(errs) || quarantine.isThresholdReached(errs);
94 }
95}
96exports.default = LiveModeTestRunController;
97module.exports = exports.default;
98//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1ydW4tY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saXZlL3Rlc3QtcnVuLWNvbnRyb2xsZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBa0M7QUFDbEMsbUNBQW9DO0FBQ3BDLHlDQUFnRDtBQUNoRCxzRUFBOEM7QUFFOUMsTUFBTSx5QkFBMEIsU0FBUSxnQkFBWTtJQUNoRDtRQUNJLEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxDQUFDLFlBQVksR0FBUSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFRLElBQUksQ0FBQztRQUU5QixJQUFJLENBQUMsUUFBUSxHQUFrQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsYUFBSSxDQUFDO1FBRXBDLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyw2QkFBa0IsQ0FBQztnQkFDbkMsT0FBTyxFQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztnQkFDdkQsSUFBSSxFQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDO2dCQUN0RSxXQUFXLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDO2FB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QixHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQy9DLE9BQU8sQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFFN0QsSUFBSSxtQkFBbUIsSUFBSSxDQUFDLGFBQWE7WUFDckMsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFN0IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6QixPQUFPLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtnQkFDbEIsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBRXRCLE9BQU8sRUFBRSxDQUFDO1lBQ2QsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQscUJBQXFCLENBQUUsT0FBTztRQUMxQixPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELGVBQWUsQ0FBRSxPQUFPO1FBQ3BCLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRXJDLElBQUksQ0FBQyxVQUFVO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFFaEIsT0FBTyxVQUFVLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVGLENBQUM7Q0FDSjtBQUVELGtCQUFlLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgbm9vcCwgdW5pcSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBUZXN0UnVuQ3RvckZhY3RvcnkgfSBmcm9tICcuL3Rlc3QtcnVuJztcbmltcG9ydCBURVNUX1JVTl9TVEFURSBmcm9tICcuL3Rlc3QtcnVuLXN0YXRlJztcblxuY2xhc3MgTGl2ZU1vZGVUZXN0UnVuQ29udHJvbGxlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMudGVzdFdyYXBwZXJzICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5leHBlY3RlZFRlc3RDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuX3Rlc3RSdW5DdG9yICAgICAgPSBudWxsO1xuXG4gICAgICAgIHRoaXMudGVzdFJ1bnMgICAgICAgICAgICAgICAgPSB7fTtcbiAgICAgICAgdGhpcy5hbGxUZXN0c0NvbXBsZXRlUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLmNvbXBsZXRlQWxsUnVubmluZ1Rlc3RzID0gbm9vcDtcblxuICAgICAgICB0aGlzLm9uKCdhbGwtdGVzdHMtY29tcGxldGUnLCAoKSA9PiB0aGlzLmNvbXBsZXRlQWxsUnVubmluZ1Rlc3RzKCkpO1xuICAgIH1cblxuICAgIGdldCBUZXN0UnVuQ3RvciAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdGVzdFJ1bkN0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlc3RSdW5DdG9yID0gVGVzdFJ1bkN0b3JGYWN0b3J5KHtcbiAgICAgICAgICAgICAgICBjcmVhdGVkOiAgICAgdGVzdFJ1biA9PiB0aGlzLl9vblRlc3RSdW5DcmVhdGVkKHRlc3RSdW4pLFxuICAgICAgICAgICAgICAgIGRvbmU6ICAgICAgICAodGVzdFJ1biwgZm9yY2VkKSA9PiB0aGlzLl9vblRlc3RSdW5Eb25lKHRlc3RSdW4sIGZvcmNlZCksXG4gICAgICAgICAgICAgICAgcmVhZHlUb05leHQ6IHRlc3RSdW4gPT4gdGhpcy5fb25UZXN0UnVuUmVhZHlUb05leHQodGVzdFJ1bilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rlc3RSdW5DdG9yO1xuICAgIH1cblxuICAgIHNldEV4cGVjdGVkVGVzdENvdW50ICh0ZXN0Q291bnQpIHtcbiAgICAgICAgdGhpcy5leHBlY3RlZFRlc3RDb3VudCA9IHRlc3RDb3VudDtcbiAgICB9XG5cbiAgICBfZ2V0VGVzdFJ1bnMgKCkge1xuICAgICAgICByZXR1cm4gW10uY29uY2F0KC4uLk9iamVjdC52YWx1ZXModGhpcy50ZXN0UnVucykpO1xuICAgIH1cblxuICAgIHJ1biAoKSB7XG4gICAgICAgIGNvbnN0IHJlYWR5VG9OZXh0UHJvbWlzZXMgPSBbXTtcblxuICAgICAgICBjb25zdCB0ZXN0UnVucyA9IFtdLmNvbmNhdCguLi5PYmplY3QudmFsdWVzKHRoaXMudGVzdFJ1bnMpKTtcblxuICAgICAgICB0ZXN0UnVucy5mb3JFYWNoKHRlc3RSdW4gPT4ge1xuICAgICAgICAgICAgaWYgKHRlc3RSdW4uZmluaXNoKSB7XG4gICAgICAgICAgICAgICAgcmVhZHlUb05leHRQcm9taXNlcy5wdXNoKHRlc3RSdW4ucmVhZHlUb05leHRQcm9taXNlKTtcbiAgICAgICAgICAgICAgICB0ZXN0UnVuLmZpbmlzaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRlc3RSdW5zID0ge307XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlYWR5VG9OZXh0UHJvbWlzZXMpO1xuICAgIH1cblxuICAgIHN0b3AgKCkge1xuICAgICAgICB0aGlzLl9nZXRUZXN0UnVucygpLmZvckVhY2godGVzdFJ1biA9PiB7XG4gICAgICAgICAgICB0ZXN0UnVuLnN0b3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2dldFRlc3RXcmFwcGVyICh0ZXN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlc3RXcmFwcGVycy5maW5kKHcgPT4gdy50ZXN0ID09PSB0ZXN0KTtcbiAgICB9XG5cbiAgICBfb25UZXN0UnVuQ3JlYXRlZCAodGVzdFJ1bikge1xuICAgICAgICB0aGlzLmFsbFRlc3RzQ29tcGxldGVQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlQWxsUnVubmluZ1Rlc3RzID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY29ubmVjdGlvbklkID0gdGVzdFJ1bi5icm93c2VyQ29ubmVjdGlvbi5pZDtcblxuICAgICAgICB0aGlzLnRlc3RSdW5zW2Nvbm5lY3Rpb25JZF0gPSB0aGlzLnRlc3RSdW5zW2Nvbm5lY3Rpb25JZF0gfHwgW107XG5cbiAgICAgICAgdGhpcy50ZXN0UnVuc1tjb25uZWN0aW9uSWRdLnB1c2godGVzdFJ1bik7XG4gICAgfVxuXG4gICAgX29uVGVzdFJ1bkRvbmUgKHRlc3RSdW4pIHtcbiAgICAgICAgdGVzdFJ1bi5zdGF0ZSA9IFRFU1RfUlVOX1NUQVRFLmRvbmU7XG5cbiAgICAgICAgY29uc3QgdGVzdFdpbGxCZVJlc3RhcnRlZCAgICAgICAgICAgID0gIXRoaXMuX2lzVGVzdEZpbmlzaGVkKHRlc3RSdW4pO1xuICAgICAgICBjb25zdCBoYXNSdW5uaW5nVGVzdHNJbk90aGVyQnJvd3NlcnMgPSB0aGlzLl9nZXRUZXN0UnVucygpLnNvbWUodCA9PiB0LnN0YXRlICE9PSBURVNUX1JVTl9TVEFURS5kb25lKTtcblxuICAgICAgICBpZiAoIWhhc1J1bm5pbmdUZXN0c0luT3RoZXJCcm93c2VycyAmJiAhdGVzdFdpbGxCZVJlc3RhcnRlZClcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYWxsLXRlc3RzLWNvbXBsZXRlJyk7XG5cbiAgICAgICAgY29uc3QgYnJvd3NlclRlc3RSdW5zID0gdGhpcy50ZXN0UnVuc1t0ZXN0UnVuLmJyb3dzZXJDb25uZWN0aW9uLmlkXTtcbiAgICAgICAgY29uc3QgdGVzdHMgICAgICAgICAgID0gdW5pcShicm93c2VyVGVzdFJ1bnMubWFwKHQgPT4gdC50ZXN0KSk7XG5cbiAgICAgICAgdGVzdFJ1bi5yZWFkeVRvTmV4dFByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRlc3RSdW4uc2V0UmVhZHlUb05leHQgPSByZXNvbHZlO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBpc0xhc3RUZXN0UnVuID0gdGVzdHMubGVuZ3RoID49IHRoaXMuZXhwZWN0ZWRUZXN0Q291bnQ7XG5cbiAgICAgICAgaWYgKHRlc3RXaWxsQmVSZXN0YXJ0ZWQgfHwgIWlzTGFzdFRlc3RSdW4pXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgdGVzdFJ1bi5maW5pc2ggPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGVzdFJ1bi5maW5pc2ggPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX29uVGVzdFJ1blJlYWR5VG9OZXh0ICh0ZXN0UnVuKSB7XG4gICAgICAgIHRlc3RSdW4uc2V0UmVhZHlUb05leHQoKTtcbiAgICB9XG5cbiAgICBfaXNUZXN0RmluaXNoZWQgKHRlc3RSdW4pIHtcbiAgICAgICAgY29uc3QgeyBxdWFyYW50aW5lLCBlcnJzIH0gPSB0ZXN0UnVuO1xuXG4gICAgICAgIGlmICghcXVhcmFudGluZSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIHJldHVybiBxdWFyYW50aW5lLmlzRmlyc3RBdHRlbXB0U3VjY2Vzc2Z1bChlcnJzKSB8fCBxdWFyYW50aW5lLmlzVGhyZXNob2xkUmVhY2hlZChlcnJzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpdmVNb2RlVGVzdFJ1bkNvbnRyb2xsZXI7XG4iXX0=
\No newline at end of file