1 | ;
|
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
|
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
|
4 | };
|
5 | Object.defineProperty(exports, "__esModule", { value: true });
|
6 | const events_1 = __importDefault(require("events"));
|
7 | const lodash_1 = require("lodash");
|
8 | const test_run_1 = require("./test-run");
|
9 | const test_run_state_1 = __importDefault(require("./test-run-state"));
|
10 | class 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 | }
|
96 | exports.default = LiveModeTestRunController;
|
97 | module.exports = exports.default;
|
98 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1ydW4tY29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saXZlL3Rlc3QtcnVuLWNvbnRyb2xsZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBa0M7QUFDbEMsbUNBQW9DO0FBQ3BDLHlDQUFnRDtBQUNoRCxzRUFBOEM7QUFFOUMsTUFBTSx5QkFBMEIsU0FBUSxnQkFBWTtJQUNoRDtRQUNJLEtBQUssRUFBRSxDQUFDO1FBRVIsSUFBSSxDQUFDLFlBQVksR0FBUSxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFRLElBQUksQ0FBQztRQUU5QixJQUFJLENBQUMsUUFBUSxHQUFrQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqRCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsYUFBSSxDQUFDO1FBRXBDLElBQUksQ0FBQyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUMsQ0FBQztJQUN4RSxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFlBQVksR0FBRyw2QkFBa0IsQ0FBQztnQkFDbkMsT0FBTyxFQUFNLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQztnQkFDdkQsSUFBSSxFQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDO2dCQUN0RSxXQUFXLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDO2FB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QixHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQy9DLE9BQU8sQ0FBQyxjQUFjLEdBQUcsT0FBTyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFFN0QsSUFBSSxtQkFBbUIsSUFBSSxDQUFDLGFBQWE7WUFDckMsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFFN0IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6QixPQUFPLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtnQkFDbEIsT0FBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBRXRCLE9BQU8sRUFBRSxDQUFDO1lBQ2QsQ0FBQyxDQUFDO1FBQ04sQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQscUJBQXFCLENBQUUsT0FBTztRQUMxQixPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELGVBQWUsQ0FBRSxPQUFPO1FBQ3BCLE1BQU0sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRXJDLElBQUksQ0FBQyxVQUFVO1lBQ1gsT0FBTyxJQUFJLENBQUM7UUFFaEIsT0FBTyxVQUFVLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksVUFBVSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVGLENBQUM7Q0FDSjtBQUVELGtCQUFlLHlCQUF5QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgbm9vcCwgdW5pcSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBUZXN0UnVuQ3RvckZhY3RvcnkgfSBmcm9tICcuL3Rlc3QtcnVuJztcbmltcG9ydCBURVNUX1JVTl9TVEFURSBmcm9tICcuL3Rlc3QtcnVuLXN0YXRlJztcblxuY2xhc3MgTGl2ZU1vZGVUZXN0UnVuQ29udHJvbGxlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMudGVzdFdyYXBwZXJzICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5leHBlY3RlZFRlc3RDb3VudCA9IDA7XG4gICAgICAgIHRoaXMuX3Rlc3RSdW5DdG9yICAgICAgPSBudWxsO1xuXG4gICAgICAgIHRoaXMudGVzdFJ1bnMgICAgICAgICAgICAgICAgPSB7fTtcbiAgICAgICAgdGhpcy5hbGxUZXN0c0NvbXBsZXRlUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB0aGlzLmNvbXBsZXRlQWxsUnVubmluZ1Rlc3RzID0gbm9vcDtcblxuICAgICAgICB0aGlzLm9uKCdhbGwtdGVzdHMtY29tcGxldGUnLCAoKSA9PiB0aGlzLmNvbXBsZXRlQWxsUnVubmluZ1Rlc3RzKCkpO1xuICAgIH1cblxuICAgIGdldCBUZXN0UnVuQ3RvciAoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdGVzdFJ1bkN0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuX3Rlc3RSdW5DdG9yID0gVGVzdFJ1bkN0b3JGYWN0b3J5KHtcbiAgICAgICAgICAgICAgICBjcmVhdGVkOiAgICAgdGVzdFJ1biA9PiB0aGlzLl9vblRlc3RSdW5DcmVhdGVkKHRlc3RSdW4pLFxuICAgICAgICAgICAgICAgIGRvbmU6ICAgICAgICAodGVzdFJ1biwgZm9yY2VkKSA9PiB0aGlzLl9vblRlc3RSdW5Eb25lKHRlc3RSdW4sIGZvcmNlZCksXG4gICAgICAgICAgICAgICAgcmVhZHlUb05leHQ6IHRlc3RSdW4gPT4gdGhpcy5fb25UZXN0UnVuUmVhZHlUb05leHQodGVzdFJ1bilcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rlc3RSdW5DdG9yO1xuICAgIH1cblxuICAgIHNldEV4cGVjdGVkVGVzdENvdW50ICh0ZXN0Q291bnQpIHtcbiAgICAgICAgdGhpcy5leHBlY3RlZFRlc3RDb3VudCA9IHRlc3RDb3VudDtcbiAgICB9XG5cbiAgICBfZ2V0VGVzdFJ1bnMgKCkge1xuICAgICAgICByZXR1cm4gW10uY29uY2F0KC4uLk9iamVjdC52YWx1ZXModGhpcy50ZXN0UnVucykpO1xuICAgIH1cblxuICAgIHJ1biAoKSB7XG4gICAgICAgIGNvbnN0IHJlYWR5VG9OZXh0UHJvbWlzZXMgPSBbXTtcblxuICAgICAgICBjb25zdCB0ZXN0UnVucyA9IFtdLmNvbmNhdCguLi5PYmplY3QudmFsdWVzKHRoaXMudGVzdFJ1bnMpKTtcblxuICAgICAgICB0ZXN0UnVucy5mb3JFYWNoKHRlc3RSdW4gPT4ge1xuICAgICAgICAgICAgaWYgKHRlc3RSdW4uZmluaXNoKSB7XG4gICAgICAgICAgICAgICAgcmVhZHlUb05leHRQcm9taXNlcy5wdXNoKHRlc3RSdW4ucmVhZHlUb05leHRQcm9taXNlKTtcbiAgICAgICAgICAgICAgICB0ZXN0UnVuLmZpbmlzaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnRlc3RSdW5zID0ge307XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHJlYWR5VG9OZXh0UHJvbWlzZXMpO1xuICAgIH1cblxuICAgIHN0b3AgKCkge1xuICAgICAgICB0aGlzLl9nZXRUZXN0UnVucygpLmZvckVhY2godGVzdFJ1biA9PiB7XG4gICAgICAgICAgICB0ZXN0UnVuLnN0b3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2dldFRlc3RXcmFwcGVyICh0ZXN0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlc3RXcmFwcGVycy5maW5kKHcgPT4gdy50ZXN0ID09PSB0ZXN0KTtcbiAgICB9XG5cbiAgICBfb25UZXN0UnVuQ3JlYXRlZCAodGVzdFJ1bikge1xuICAgICAgICB0aGlzLmFsbFRlc3RzQ29tcGxldGVQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbXBsZXRlQWxsUnVubmluZ1Rlc3RzID0gcmVzb2x2ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY29ubmVjdGlvbklkID0gdGVzdFJ1bi5icm93c2VyQ29ubmVjdGlvbi5pZDtcblxuICAgICAgICB0aGlzLnRlc3RSdW5zW2Nvbm5lY3Rpb25JZF0gPSB0aGlzLnRlc3RSdW5zW2Nvbm5lY3Rpb25JZF0gfHwgW107XG5cbiAgICAgICAgdGhpcy50ZXN0UnVuc1tjb25uZWN0aW9uSWRdLnB1c2godGVzdFJ1bik7XG4gICAgfVxuXG4gICAgX29uVGVzdFJ1bkRvbmUgKHRlc3RSdW4pIHtcbiAgICAgICAgdGVzdFJ1bi5zdGF0ZSA9IFRFU1RfUlVOX1NUQVRFLmRvbmU7XG5cbiAgICAgICAgY29uc3QgdGVzdFdpbGxCZVJlc3RhcnRlZCAgICAgICAgICAgID0gIXRoaXMuX2lzVGVzdEZpbmlzaGVkKHRlc3RSdW4pO1xuICAgICAgICBjb25zdCBoYXNSdW5uaW5nVGVzdHNJbk90aGVyQnJvd3NlcnMgPSB0aGlzLl9nZXRUZXN0UnVucygpLnNvbWUodCA9PiB0LnN0YXRlICE9PSBURVNUX1JVTl9TVEFURS5kb25lKTtcblxuICAgICAgICBpZiAoIWhhc1J1bm5pbmdUZXN0c0luT3RoZXJCcm93c2VycyAmJiAhdGVzdFdpbGxCZVJlc3RhcnRlZClcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYWxsLXRlc3RzLWNvbXBsZXRlJyk7XG5cbiAgICAgICAgY29uc3QgYnJvd3NlclRlc3RSdW5zID0gdGhpcy50ZXN0UnVuc1t0ZXN0UnVuLmJyb3dzZXJDb25uZWN0aW9uLmlkXTtcbiAgICAgICAgY29uc3QgdGVzdHMgICAgICAgICAgID0gdW5pcShicm93c2VyVGVzdFJ1bnMubWFwKHQgPT4gdC50ZXN0KSk7XG5cbiAgICAgICAgdGVzdFJ1bi5yZWFkeVRvTmV4dFByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHRlc3RSdW4uc2V0UmVhZHlUb05leHQgPSByZXNvbHZlO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBpc0xhc3RUZXN0UnVuID0gdGVzdHMubGVuZ3RoID49IHRoaXMuZXhwZWN0ZWRUZXN0Q291bnQ7XG5cbiAgICAgICAgaWYgKHRlc3RXaWxsQmVSZXN0YXJ0ZWQgfHwgIWlzTGFzdFRlc3RSdW4pXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgdGVzdFJ1bi5maW5pc2ggPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGVzdFJ1bi5maW5pc2ggPSBudWxsO1xuXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX29uVGVzdFJ1blJlYWR5VG9OZXh0ICh0ZXN0UnVuKSB7XG4gICAgICAgIHRlc3RSdW4uc2V0UmVhZHlUb05leHQoKTtcbiAgICB9XG5cbiAgICBfaXNUZXN0RmluaXNoZWQgKHRlc3RSdW4pIHtcbiAgICAgICAgY29uc3QgeyBxdWFyYW50aW5lLCBlcnJzIH0gPSB0ZXN0UnVuO1xuXG4gICAgICAgIGlmICghcXVhcmFudGluZSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAgIHJldHVybiBxdWFyYW50aW5lLmlzRmlyc3RBdHRlbXB0U3VjY2Vzc2Z1bChlcnJzKSB8fCBxdWFyYW50aW5lLmlzVGhyZXNob2xkUmVhY2hlZChlcnJzKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IExpdmVNb2RlVGVzdFJ1bkNvbnRyb2xsZXI7XG4iXX0= |
\ | No newline at end of file |