import { exec as rawExec } from "../src/utils/agent/sandbox/raw-exec.js"; import { describe, it, expect } from "vitest"; // Import the low‑level exec implementation so we can verify that AbortSignal // correctly terminates a spawned process. We bypass the higher‑level wrappers // to keep the test focused and fast. describe("exec cancellation", () => { it("kills the child process when the abort signal is triggered", async () => { const abortController = new AbortController(); // Spawn a node process that would normally run for 5 seconds before // printing anything. We should abort long before that happens. const cmd = ["node", "-e", "setTimeout(() => console.log('late'), 5000);"]; const start = Date.now(); const promise = rawExec(cmd, {}, [], abortController.signal); // Abort almost immediately. abortController.abort(); const result = await promise; const durationMs = Date.now() - start; // The process should have been terminated rapidly (well under the 5s the // child intended to run) – give it a generous 2s budget. expect(durationMs).toBeLessThan(2000); // Exit code should indicate abnormal termination (anything but zero) expect(result.exitCode).not.toBe(0); // The child never got a chance to print the word "late". expect(result.stdout).not.toContain("late"); }); it("allows the process to finish when not aborted", async () => { const abortController = new AbortController(); const cmd = ["node", "-e", "console.log('finished')"]; const result = await rawExec(cmd, {}, [], abortController.signal); expect(result.exitCode).toBe(0); expect(result.stdout.trim()).toBe("finished"); }); });