From 4cb14c38c0cb036f04fb4feb5dbe68d1e0a901c1 Mon Sep 17 00:00:00 2001 From: Raashish Aggarwal <94279692+raashish1601@users.noreply.github.com> Date: Wed, 7 Oct 2026 15:53:46 +0530 Subject: [PATCH] fix(test-runner-core): fail sessions on returned teardown errors --- .changeset/tidy-browsers-fail.md | 5 +++++ .../src/runner/TestScheduler.ts | 2 +- .../test/src/runner/TestScheduler.test.ts | 17 +++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 .changeset/tidy-browsers-fail.md 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');