From aa9756247be837e5678044ebb9bda1dac68938bb Mon Sep 17 00:00:00 2001 From: "Anthony Fu (via agent)" Date: Fri, 10 Jul 2026 02:52:13 +0000 Subject: [PATCH] fix(devframe): stop mcp-http tests from sharing a port MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Every test in mcp-http.test.ts booted its dev server on the same default port (9999). Since Node's global fetch() (undici) pools keep-alive sockets per origin, a later test could get handed a stale socket left over from an earlier test's already-closed server — failing instantly with a socket error, or leaving the earlier server's close() hanging until undici's keep-alive timeout released it. This was flaking CI's unit-test job on every platform/Node version. Pass port: 0 so each boot() gets a fresh OS-assigned port, eliminating the origin collision entirely. 🤖 Generated with an agent (opencode). --- .../src/adapters/mcp/__tests__/mcp-http.test.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/devframe/src/adapters/mcp/__tests__/mcp-http.test.ts b/packages/devframe/src/adapters/mcp/__tests__/mcp-http.test.ts index 014bb66..46441f2 100644 --- a/packages/devframe/src/adapters/mcp/__tests__/mcp-http.test.ts +++ b/packages/devframe/src/adapters/mcp/__tests__/mcp-http.test.ts @@ -34,7 +34,15 @@ describe('mcp adapter (streamable http route)', () => { }) async function boot(def = defineTestDef()): Promise { - server = await createDevServer(def, { host: '127.0.0.1', mcp: true }) + // `port: 0` lets the OS assign a fresh ephemeral port per test. Without + // it every test binds the same default port, and since they all share + // one process, Node's global `fetch()` (undici) pools keep-alive + // sockets per origin (`http://127.0.0.1:`) — a later test can get + // handed a stale, already-closed socket left over from an earlier + // test's (torn-down) server, failing instantly with a socket error, or + // making that earlier server's `close()` hang until undici's + // keep-alive timeout releases it. + server = await createDevServer(def, { host: '127.0.0.1', port: 0, mcp: true }) return server } @@ -47,7 +55,7 @@ describe('mcp adapter (streamable http route)', () => { }) it('omits the mcp block when the route is disabled', async () => { - server = await createDevServer(defineTestDef(), { host: '127.0.0.1', mcp: false }) + server = await createDevServer(defineTestDef(), { host: '127.0.0.1', port: 0, mcp: false }) const res = await fetch(`${server.origin}/__connection.json`) const meta = await res.json() as { mcp?: unknown } expect(meta.mcp).toBeUndefined()