From 31939397a92d7e3791e7900e38fc9d8fb3ce8abe Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 16 Feb 2026 03:49:01 +0000 Subject: [PATCH] test: optimize hot-path test runtime --- .../chat.abort-persistence.test.ts | 51 +++++++++++-------- src/process/exec.test.ts | 24 ++------- src/process/supervisor/supervisor.test.ts | 2 +- 3 files changed, 35 insertions(+), 42 deletions(-) diff --git a/src/gateway/server-methods/chat.abort-persistence.test.ts b/src/gateway/server-methods/chat.abort-persistence.test.ts index cdf2dba83b..bee1382e07 100644 --- a/src/gateway/server-methods/chat.abort-persistence.test.ts +++ b/src/gateway/server-methods/chat.abort-persistence.test.ts @@ -8,6 +8,29 @@ type TranscriptLine = { message?: Record; }; +const sessionEntryState = vi.hoisted(() => ({ + transcriptPath: "", + sessionId: "", +})); + +vi.mock("../session-utils.js", async (importOriginal) => { + const original = await importOriginal(); + return { + ...original, + loadSessionEntry: () => ({ + cfg: {}, + storePath: path.join(path.dirname(sessionEntryState.transcriptPath), "sessions.json"), + entry: { + sessionId: sessionEntryState.sessionId, + sessionFile: sessionEntryState.transcriptPath, + }, + canonicalKey: "main", + }), + }; +}); + +const { chatHandlers } = await import("./chat.js"); + function createActiveRun(sessionKey: string, sessionId: string) { const now = Date.now(); return { @@ -44,29 +67,13 @@ async function readTranscriptLines(transcriptPath: string): Promise { - const original = await importOriginal(); - return { - ...original, - loadSessionEntry: () => ({ - cfg: {}, - storePath: path.join(path.dirname(transcriptPath), "sessions.json"), - entry: { - sessionId, - sessionFile: transcriptPath, - }, - canonicalKey: "main", - }), - }; - }); - return import("./chat.js"); +function setMockSessionEntry(transcriptPath: string, sessionId: string) { + sessionEntryState.transcriptPath = transcriptPath; + sessionEntryState.sessionId = sessionId; } afterEach(() => { vi.restoreAllMocks(); - vi.resetModules(); }); describe("chat abort transcript persistence", () => { @@ -77,7 +84,7 @@ describe("chat abort transcript persistence", () => { const runId = "idem-abort-run-1"; await writeTranscriptHeader(transcriptPath, sessionId); - const { chatHandlers } = await importChatHandlersWithSession(transcriptPath, sessionId); + setMockSessionEntry(transcriptPath, sessionId); const respond = vi.fn(); const context = { chatAbortControllers: new Map([[runId, createActiveRun("main", sessionId)]]), @@ -142,7 +149,7 @@ describe("chat abort transcript persistence", () => { const sessionId = "sess-main"; await writeTranscriptHeader(transcriptPath, sessionId); - const { chatHandlers } = await importChatHandlersWithSession(transcriptPath, sessionId); + setMockSessionEntry(transcriptPath, sessionId); const respond = vi.fn(); const context = { chatAbortControllers: new Map([ @@ -203,7 +210,7 @@ describe("chat abort transcript persistence", () => { const sessionId = "sess-main"; await writeTranscriptHeader(transcriptPath, sessionId); - const { chatHandlers } = await importChatHandlersWithSession(transcriptPath, sessionId); + setMockSessionEntry(transcriptPath, sessionId); const respond = vi.fn(); const context = { chatAbortControllers: new Map([["run-stop-1", createActiveRun("main", sessionId)]]), diff --git a/src/process/exec.test.ts b/src/process/exec.test.ts index c2ac03e4b3..0548da9728 100644 --- a/src/process/exec.test.ts +++ b/src/process/exec.test.ts @@ -12,20 +12,6 @@ describe("runCommandWithTimeout", () => { ).toBe(false); }); - it("passes env overrides to child", async () => { - const result = await runCommandWithTimeout( - [process.execPath, "-e", 'process.stdout.write(process.env.OPENCLAW_TEST_ENV ?? "")'], - { - timeoutMs: 5_000, - env: { OPENCLAW_TEST_ENV: "ok" }, - }, - ); - - expect(result.code).toBe(0); - expect(result.stdout).toBe("ok"); - expect(result.termination).toBe("exit"); - }); - it("merges custom env with process.env", async () => { const envSnapshot = captureEnv(["OPENCLAW_BASE_ENV"]); process.env.OPENCLAW_BASE_ENV = "base"; @@ -56,12 +42,12 @@ describe("runCommandWithTimeout", () => { [process.execPath, "-e", "setTimeout(() => {}, 10_000)"], { timeoutMs: 5_000, - noOutputTimeoutMs: 300, + noOutputTimeoutMs: 200, }, ); const durationMs = Date.now() - startedAt; - expect(durationMs).toBeLessThan(2_500); + expect(durationMs).toBeLessThan(1_500); expect(result.termination).toBe("no-output-timeout"); expect(result.noOutputTimedOut).toBe(true); expect(result.code).not.toBe(0); @@ -72,7 +58,7 @@ describe("runCommandWithTimeout", () => { [ process.execPath, "-e", - 'let i=0; const t=setInterval(() => { process.stdout.write("."); i += 1; if (i >= 5) { clearInterval(t); process.exit(0); } }, 50);', + 'let i=0; const t=setInterval(() => { process.stdout.write("."); i += 1; if (i >= 4) { clearInterval(t); process.exit(0); } }, 30);', ], { timeoutMs: 5_000, @@ -83,14 +69,14 @@ describe("runCommandWithTimeout", () => { expect(result.code).toBe(0); expect(result.termination).toBe("exit"); expect(result.noOutputTimedOut).toBe(false); - expect(result.stdout.length).toBeGreaterThanOrEqual(5); + expect(result.stdout.length).toBeGreaterThanOrEqual(4); }); it("reports global timeout termination when overall timeout elapses", async () => { const result = await runCommandWithTimeout( [process.execPath, "-e", "setTimeout(() => {}, 10_000)"], { - timeoutMs: 200, + timeoutMs: 120, }, ); diff --git a/src/process/supervisor/supervisor.test.ts b/src/process/supervisor/supervisor.test.ts index 08b22ca8f3..aa48cde00d 100644 --- a/src/process/supervisor/supervisor.test.ts +++ b/src/process/supervisor/supervisor.test.ts @@ -26,7 +26,7 @@ describe("process supervisor", () => { mode: "child", argv: [process.execPath, "-e", "setTimeout(() => {}, 10_000)"], timeoutMs: 5_000, - noOutputTimeoutMs: 200, + noOutputTimeoutMs: 120, stdinMode: "pipe-closed", }); const exit = await run.wait();