From 598084b3d7ee113b3cf6a883499650d622a3382f Mon Sep 17 00:00:00 2001 From: Harsh Mathur Date: Wed, 5 Aug 2026 21:15:41 +0530 Subject: [PATCH 1/2] test(mcp): cover stdio disconnect cleanup --- tests/mcp/fixtures.ts | 6 +++--- tests/mcp/launch.spec.ts | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/tests/mcp/fixtures.ts b/tests/mcp/fixtures.ts index 98ffc26e144ce..575ef903856f7 100644 --- a/tests/mcp/fixtures.ts +++ b/tests/mcp/fixtures.ts @@ -61,7 +61,7 @@ export type StartClient = (options?: { rootsResponseDelay?: number, env?: NodeJS.ProcessEnv, noTimeoutForTest?: boolean, -}) => Promise<{ client: Client, stderr: () => string }>; +}) => Promise<{ client: Client, stderr: () => string, transport: Transport }>; type TestFixtures = { @@ -151,10 +151,10 @@ export const test = serverTest.extend stderrBuffer }; + return { client, stderr: () => stderrBuffer, transport }; }); - await Promise.all(clients.map(client => client.close())); + await Promise.all(clients.map(client => client.close().catch(() => {}))); }, wsEndpoint: async ({ }, use) => { diff --git a/tests/mcp/launch.spec.ts b/tests/mcp/launch.spec.ts index 9e410e3c796e8..02166cb6996ed 100644 --- a/tests/mcp/launch.spec.ts +++ b/tests/mcp/launch.spec.ts @@ -161,6 +161,29 @@ test('isolated context', async ({ startClient, server }) => { }); }); +test('isolated stdio server closes browser on client transport disconnect', async ({ startClient, server }) => { + const { client, stderr, transport } = await startClient({ + args: [`--isolated`], + env: { DEBUG: 'pw:mcp:test' }, + }); + + expect(await client.callTool({ + name: 'browser_navigate', + arguments: { url: server.HELLO_WORLD }, + })).toHaveResponse({ + snapshot: expect.stringContaining(`Hello, world!`), + }); + + await transport.close(); + + await expect.poll(() => formatLog(stderr())).toEqual({ + 'create browser (isolated)': 1, + 'create context': 1, + 'close browser': 1, + 'gracefully closing 1': 1, + }); +}); + test('isolated context relaunches the browser after it dies', async ({ startClient, server, mcpBrowser }, testInfo) => { test.skip(!['chrome', 'msedge', 'chromium'].includes(mcpBrowser!), 'The test kills the browser over CDP'); From dd41cf1f0deba0e917f9333700cfb2e0d4a93c15 Mon Sep 17 00:00:00 2001 From: Harsh Mathur Date: Wed, 5 Aug 2026 21:53:53 +0530 Subject: [PATCH 2/2] test(mcp): narrow transport disconnect fixture cleanup --- tests/mcp/fixtures.ts | 21 ++++++++++++++++++--- tests/mcp/launch.spec.ts | 4 ++-- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/tests/mcp/fixtures.ts b/tests/mcp/fixtures.ts index 575ef903856f7..57e82003046cd 100644 --- a/tests/mcp/fixtures.ts +++ b/tests/mcp/fixtures.ts @@ -61,7 +61,7 @@ export type StartClient = (options?: { rootsResponseDelay?: number, env?: NodeJS.ProcessEnv, noTimeoutForTest?: boolean, -}) => Promise<{ client: Client, stderr: () => string, transport: Transport }>; +}) => Promise<{ client: Client, stderr: () => string, closeTransport: () => Promise }>; type TestFixtures = { @@ -95,6 +95,7 @@ export const test = serverTest.extend { const configDir = path.dirname(test.info().config.configFile!); const clients: Client[] = []; + const disconnectedClients = new Set(); await use(async options => { let args: string[] = mcpArgs ?? []; @@ -151,10 +152,24 @@ export const test = serverTest.extend stderrBuffer, transport }; + return { + client, + stderr: () => stderrBuffer, + closeTransport: async () => { + disconnectedClients.add(client); + await transport.close(); + }, + }; }); - await Promise.all(clients.map(client => client.close().catch(() => {}))); + await Promise.all(clients.map(async client => { + try { + await client.close(); + } catch (e) { + if (!disconnectedClients.has(client)) + throw e; + } + })); }, wsEndpoint: async ({ }, use) => { diff --git a/tests/mcp/launch.spec.ts b/tests/mcp/launch.spec.ts index 02166cb6996ed..04b0940b51369 100644 --- a/tests/mcp/launch.spec.ts +++ b/tests/mcp/launch.spec.ts @@ -162,7 +162,7 @@ test('isolated context', async ({ startClient, server }) => { }); test('isolated stdio server closes browser on client transport disconnect', async ({ startClient, server }) => { - const { client, stderr, transport } = await startClient({ + const { client, stderr, closeTransport } = await startClient({ args: [`--isolated`], env: { DEBUG: 'pw:mcp:test' }, }); @@ -174,7 +174,7 @@ test('isolated stdio server closes browser on client transport disconnect', asyn snapshot: expect.stringContaining(`Hello, world!`), }); - await transport.close(); + await closeTransport(); await expect.poll(() => formatLog(stderr())).toEqual({ 'create browser (isolated)': 1,