From eea3c132ff4d93af8bc9317819457cc1784b9464 Mon Sep 17 00:00:00 2001 From: Chinesezjc Date: Tue, 25 Aug 2026 16:36:28 +0800 Subject: [PATCH] test(subagent-acp): skip stdout half-close tests on Windows Windows anonymous pipes do not surface a child stdout EOF while the child process stays alive. The three tests that simulate 'child closes protocol but stays alive' therefore cannot be reproduced on Windows and hang until the test timeout. Skip them on win32. --- .../subagent-acp/tests/subagent-acp.spec.ts | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/subagent/subagent-acp/tests/subagent-acp.spec.ts b/packages/subagent/subagent-acp/tests/subagent-acp.spec.ts index a7e5693148..28007f4a6e 100644 --- a/packages/subagent/subagent-acp/tests/subagent-acp.spec.ts +++ b/packages/subagent/subagent-acp/tests/subagent-acp.spec.ts @@ -1,4 +1,4 @@ -import { describe, expect, it, vi } from 'vitest' +import { describe, expect, it } from 'vitest' import { Context } from '@deepseek-ai/cordis' import Loader from '@deepseek-ai/cordis-plugin-loader' import { chmodSync, existsSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from 'node:fs' @@ -14,12 +14,6 @@ import { acpStopReason, acpContentText, DEFAULT_DISPOSE_EOF_GRACE_MS, DEFAULT_DI import LocalSubprocessRuntime from '@deepseek-ai/dsh-subprocess-local' import { spawnSubprocess } from '@deepseek-ai/dsh-subprocess-local/src/spawn.ts' -// These tests spawn real ACP child subprocesses. On contended self-hosted -// Windows runners the default per-test budget is too tight, so give this file -// twice the configured default timeout (DSH_COVERAGE_TEST_TIMEOUT_MS in CI). -const DEFAULT_TEST_TIMEOUT_MS = Number(process.env.DSH_COVERAGE_TEST_TIMEOUT_MS ?? 5_000) -vi.setConfig({ testTimeout: DEFAULT_TEST_TIMEOUT_MS * 2 }) - /** * Keyless integration tests for the ACP subagent backend. Each spawns a REAL * subprocess — the scripted mock ACP server (tests/mock-acp-server.ts) — and @@ -595,7 +589,10 @@ describe('dsh-subagent-acp', () => { ) }) - it('reports initialize-stage transport when the child closes the protocol but stays alive', async () => { + it.skipIf( + process.platform === 'win32', + 'Windows anonymous pipes do not surface a child stdout half-close while the child stays alive', + )('reports initialize-stage transport when the child closes the protocol but stays alive', async () => { const error = await startAcpRun(request(), { command: process.execPath, args: [mockServer], @@ -942,7 +939,10 @@ describe('dsh-subagent-acp', () => { await run.dispose() }) - it('classifies a prompt transport failure without copying SDK text', async () => { + it.skipIf( + process.platform === 'win32', + 'Windows anonymous pipes do not surface a child stdout half-close while the child stays alive', + )('classifies a prompt transport failure without copying SDK text', async () => { const run = await startAcpRun(request('private prompt text'), { command: process.execPath, args: [mockServer], @@ -963,7 +963,10 @@ describe('dsh-subagent-acp', () => { await run.dispose() }) - it('lets local cancellation interrupt prompt-failure process observation', async () => { + it.skipIf( + process.platform === 'win32', + 'Windows anonymous pipes do not surface a child stdout half-close while the child stays alive', + )('lets local cancellation interrupt prompt-failure process observation', async () => { const controller = new AbortController() const protocolEnded = Promise.withResolvers() let boundedExitWaits = 0