From b40cbf664e91de3518c61bde89d39019e33b347f Mon Sep 17 00:00:00 2001 From: Aleksey Popov Date: Wed, 22 Jun 2022 11:20:39 +0400 Subject: [PATCH 1/3] test: added test Should not start any test before report task start finishes --- test/functional/fixtures/concurrency/test.js | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/functional/fixtures/concurrency/test.js b/test/functional/fixtures/concurrency/test.js index 6f33876ced..be25606888 100644 --- a/test/functional/fixtures/concurrency/test.js +++ b/test/functional/fixtures/concurrency/test.js @@ -77,6 +77,17 @@ if (config.useLocalBrowsers) { }, }); + const slowReporter = createReporter({ + reportTaskStart: async function () { + await new Promise(resolve => setTimeout(() => resolve(), 100)); + this.write('Task start').newline(); + }, + + reportTestStart: async function () { + this.write('Test start').newline(); + }, + }); + beforeEach(function () { data = ''; }); @@ -138,6 +149,19 @@ if (config.useLocalBrowsers) { }); }); + it('Should not start any test before report task start finishes', function () { + return run('chrome:headless --no-sandbox', 2, './testcafe-fixtures/concurrent-test.js', slowReporter) + .then(failedCount => { + expect(failedCount).eql(0); + expect(data.split('\n')).eql([ + 'Task start', + 'Test start', + 'Test start', + '', + ]); + }); + }); + it('Should fail if number of remotes is not divisible by concurrency', function () { return createConnections(3) .then(function (connections) { From 27a895a673fd40f1bb85402d145af8aa507115ef Mon Sep 17 00:00:00 2001 From: Aleksey Popov Date: Wed, 22 Jun 2022 11:23:14 +0400 Subject: [PATCH 2/3] fix: fixed start test before task starting finishes --- src/runner/browser-job.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/runner/browser-job.ts b/src/runner/browser-job.ts index 78d26e3615..2e82535f60 100644 --- a/src/runner/browser-job.ts +++ b/src/runner/browser-job.ts @@ -20,8 +20,10 @@ interface BrowserJobResultInfo { data?: any; // eslint-disable-line @typescript-eslint/no-explicit-any } +enum StartStatus { none, starting, started } + export default class BrowserJob extends AsyncEventEmitter { - private _started: boolean; + private _startStatus: StartStatus; private _startTime: Date; private _total: number; private _passed: number; @@ -53,7 +55,7 @@ export default class BrowserJob extends AsyncEventEmitter { }: BrowserJobInit) { super(); - this._started = false; + this._startStatus = StartStatus.none; this._startTime = new Date(); this._total = 0; @@ -170,6 +172,11 @@ export default class BrowserJob extends AsyncEventEmitter { } private async _isNextTestRunAvailable (testRunController: TestRunController): Promise { + // NOTE: event task start is currently executing, + // so test run is temporary blocked + if (this._startStatus === StartStatus.starting) + return false; + // NOTE: before hook for test run fixture is currently // executing, so test run is temporary blocked const isBlocked = testRunController.blocked; @@ -213,11 +220,13 @@ export default class BrowserJob extends AsyncEventEmitter { this._testRunControllerQueue.shift(); this._addToCompletionQueue(testRunController); - if (!this._started) { - this._started = true; - this._startTime = new Date(); + if (this._startStatus === StartStatus.none) { + this._startStatus = StartStatus.starting; + this._startTime = new Date(); await this.emit('start', this._startTime); + + this._startStatus = StartStatus.started; } const testRunUrl = await testRunController.start(connection, this._startTime); From 7aae4ed25222a48ad8eb349935bc47ef224eaae6 Mon Sep 17 00:00:00 2001 From: Aleksey Popov Date: Wed, 22 Jun 2022 13:04:22 +0400 Subject: [PATCH 3/3] fix: fixes based on comments --- src/runner/browser-job.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/runner/browser-job.ts b/src/runner/browser-job.ts index 2e82535f60..41739a5faa 100644 --- a/src/runner/browser-job.ts +++ b/src/runner/browser-job.ts @@ -20,10 +20,10 @@ interface BrowserJobResultInfo { data?: any; // eslint-disable-line @typescript-eslint/no-explicit-any } -enum StartStatus { none, starting, started } +enum BrowserJobStatus { initialized, starting, started } export default class BrowserJob extends AsyncEventEmitter { - private _startStatus: StartStatus; + private _status: BrowserJobStatus; private _startTime: Date; private _total: number; private _passed: number; @@ -55,7 +55,7 @@ export default class BrowserJob extends AsyncEventEmitter { }: BrowserJobInit) { super(); - this._startStatus = StartStatus.none; + this._status = BrowserJobStatus.initialized; this._startTime = new Date(); this._total = 0; @@ -174,7 +174,7 @@ export default class BrowserJob extends AsyncEventEmitter { private async _isNextTestRunAvailable (testRunController: TestRunController): Promise { // NOTE: event task start is currently executing, // so test run is temporary blocked - if (this._startStatus === StartStatus.starting) + if (this._status === BrowserJobStatus.starting) return false; // NOTE: before hook for test run fixture is currently @@ -220,13 +220,13 @@ export default class BrowserJob extends AsyncEventEmitter { this._testRunControllerQueue.shift(); this._addToCompletionQueue(testRunController); - if (this._startStatus === StartStatus.none) { - this._startStatus = StartStatus.starting; + if (this._status === BrowserJobStatus.initialized) { + this._status = BrowserJobStatus.starting; this._startTime = new Date(); await this.emit('start', this._startTime); - this._startStatus = StartStatus.started; + this._status = BrowserJobStatus.started; } const testRunUrl = await testRunController.start(connection, this._startTime);