diff --git a/test/helpers/qa-only-cleanup.ts b/test/helpers/qa-only-cleanup.ts index b020cdd51..73d8e4c90 100644 --- a/test/helpers/qa-only-cleanup.ts +++ b/test/helpers/qa-only-cleanup.ts @@ -7,7 +7,8 @@ import { isAgentRecordGone, isOurAgent, readAgentRecord } from '../../browse/src export async function stopQaOnlyBrowser(directory: string, timeoutMs: number): Promise { if (!Number.isFinite(timeoutMs) || timeoutMs <= 100) throw new Error('QA-only browser cleanup: no settlement budget remains; retaining fixture'); - const worker = Bun.spawn([process.execPath, import.meta.path, directory, String(timeoutMs - 100)], { + // An absolute deadline keeps worker startup inside its own budget, so it reports its reason before the kill. + const worker = Bun.spawn([process.execPath, import.meta.path, directory, String(Date.now() + timeoutMs - 100)], { stdout: 'ignore', stderr: 'pipe', }); let timedOut = false; @@ -21,8 +22,9 @@ export async function stopQaOnlyBrowser(directory: string, timeoutMs: number): P } finally { clearTimeout(timer); } } -async function settleOwnedBrowser(directory: string, timeoutMs: number): Promise { +async function settleOwnedBrowser(directory: string, deadlineEpochMs: number): Promise { const started = performance.now(); + const timeoutMs = deadlineEpochMs - Date.now(); const deadline = started + timeoutMs; let pending = ['identity verification']; const fail = (message: string): never => { throw new Error(`QA-only browser cleanup: ${message}`); }; diff --git a/test/qa-only-cleanup.test.ts b/test/qa-only-cleanup.test.ts index 6ffea85c2..607d9294e 100644 --- a/test/qa-only-cleanup.test.ts +++ b/test/qa-only-cleanup.test.ts @@ -114,8 +114,8 @@ Bun.spawnSync = (...args) => { const errors = { 'ack-only': 'settlement deadline exceeded', 'replaced-state': 'daemon state was replaced', 'terminal-mismatch': 'terminal ownership is unconfirmed', 'chromium-mismatch': 'Chromium ownership is unconfirmed', 'missing-terminal': 'terminal identity is unavailable', 'blocked-identity': 'owned worker settlement deadline exceeded' }; - await expect(stopQaOnlyBrowser(dir, 300)).rejects.toThrow(errors[scenario]); - expect(performance.now() - started).toBeLessThan(1000); + await expect(stopQaOnlyBrowser(dir, 1000)).rejects.toThrow(errors[scenario]); + expect(performance.now() - started).toBeLessThan(2000); expect(daemon.exitCode).toBeNull(); expect(readPidStartTime(chromiumPid)).not.toBe(''); expect(fs.existsSync(stateFile)).toBe(true);