diff --git a/.changeset/tidy-browsers-fail.md b/.changeset/tidy-browsers-fail.md new file mode 100644 index 0000000000..e1f0da2b3a --- /dev/null +++ b/.changeset/tidy-browsers-fail.md @@ -0,0 +1,5 @@ +--- +'@web/test-runner-core': patch +--- + +Mark test sessions as failed when the browser launcher returns errors while stopping the session. diff --git a/packages/test-runner-core/src/runner/TestScheduler.ts b/packages/test-runner-core/src/runner/TestScheduler.ts index e13d44b174..5006e64e1b 100644 --- a/packages/test-runner-core/src/runner/TestScheduler.ts +++ b/packages/test-runner-core/src/runner/TestScheduler.ts @@ -176,7 +176,7 @@ export class TestScheduler { 'Timed out stopping the browser page', this.config.testsFinishTimeout, ); - updatedSession.errors = [...(updatedSession.errors ?? []), ...(errors ?? [])]; + sessionErrors.push(...(errors ?? [])); updatedSession.testCoverage = testCoverage; } } catch (error) { diff --git a/packages/test-runner-core/test/src/runner/TestScheduler.test.ts b/packages/test-runner-core/test/src/runner/TestScheduler.test.ts index dd4b0752b5..3d3240e760 100644 --- a/packages/test-runner-core/test/src/runner/TestScheduler.test.ts +++ b/packages/test-runner-core/test/src/runner/TestScheduler.test.ts @@ -223,6 +223,23 @@ describe('TestScheduler', () => { assert.equal(finalSession1.errors[0].message, 'mock error'); }); + it('errors returned while stopping browser mark session as failed', async () => { + const [scheduler, sessions, [session1], browser] = createTestFixture('1'); + browser.stopSession.mock.mockImplementation(() => + Promise.resolve({ errors: [{ message: 'mock error' }] }), + ); + scheduler.schedule(1, [session1]); + + await waitUntilEqual(() => sessions.get(session1.id)!.status, SESSION_STATUS.INITIALIZING); + + sessions.updateStatus({ ...session1, passed: true }, SESSION_STATUS.TEST_FINISHED); + await waitUntilEqual(() => sessions.get(session1.id)!.status, SESSION_STATUS.FINISHED); + const finalSession1 = sessions.get(session1.id)!; + assert.equal(finalSession1.passed, false); + assert.equal(finalSession1.errors.length, 1); + assert.equal(finalSession1.errors[0].message, 'mock error'); + }); + it('timeout starting the browser marks the session as failed', async () => { mockConfig.browserStartTimeout = 2; const [scheduler, sessions, [session1], browser] = createTestFixture('1');