From b04b5e8bc5f762cca575c315ba82408a8a2226da Mon Sep 17 00:00:00 2001 From: ScriptedAlchemy Date: Sat, 29 Aug 2026 02:17:21 +0000 Subject: [PATCH] fix(tests): destroy browser-held connections before closing fixture servers Node's server.close() waits for any connection that still has a request in flight, so the shared closeServer teardown could hang for the full test budget on two-core CI runners whenever the Playwright page held a request open at close time. The client-scope Eval test hit exactly this after its last assertion; an earlier fix (ad3a5bc) band-aided only the sibling test by navigating to about:blank first. Destroy the connections before close(), matching the runtime-client-surface-proxy teardown pattern, and drop the now-redundant navigation. --- packages/workbench/tests/evals-real.e2e.test.ts | 1 - packages/workbench/tests/support/http.ts | 8 ++++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/workbench/tests/evals-real.e2e.test.ts b/packages/workbench/tests/evals-real.e2e.test.ts index 1061b461c..2634082c0 100644 --- a/packages/workbench/tests/evals-real.e2e.test.ts +++ b/packages/workbench/tests/evals-real.e2e.test.ts @@ -462,7 +462,6 @@ e2e('fails closed while replacing an active Eval client and ignores every late c }).__evalClientScopeFixture.stats().eventsB)).toEqual(['run-b']); expect(pageErrors).toEqual([]); } finally { - await page.goto('about:blank'); await fixture.close(); } }); diff --git a/packages/workbench/tests/support/http.ts b/packages/workbench/tests/support/http.ts index 448beb898..1f3c70071 100644 --- a/packages/workbench/tests/support/http.ts +++ b/packages/workbench/tests/support/http.ts @@ -1,6 +1,14 @@ import type { Server } from 'node:http'; +/** + * Teardown must not wait for the browser to release its connections: Node's + * `server.close()` blocks while any connection still has a request in flight, + * which hangs test teardown on two-core CI runners where the page can hold a + * request open at close time. Destroying connections first keeps `close()` + * deterministic regardless of browser state. + */ export const closeServer = async (server: Server): Promise => { + server.closeAllConnections(); await new Promise((resolve, reject) => { server.close((error) => error === undefined ? resolve() : reject(error)); });