Files
openclaw/src/agents/pi-embedded-runner.compaction-safety-timeout.test.ts
Bin Deng c0cd3c3c08 fix: add safety timeout to session.compact() to prevent lane deadlock (#16533)
Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: 21e4045addca7a424828478d84dd5e4b202cbcfd
Co-authored-by: BinHPdev <219093083+BinHPdev@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
2026-02-14 17:54:12 -05:00

46 lines
1.4 KiB
TypeScript

import { afterEach, describe, expect, it, vi } from "vitest";
import {
compactWithSafetyTimeout,
EMBEDDED_COMPACTION_TIMEOUT_MS,
} from "./pi-embedded-runner/compaction-safety-timeout.js";
describe("compactWithSafetyTimeout", () => {
afterEach(() => {
vi.useRealTimers();
});
it("rejects with timeout when compaction never settles", async () => {
vi.useFakeTimers();
const compactPromise = compactWithSafetyTimeout(() => new Promise<never>(() => {}));
const timeoutAssertion = expect(compactPromise).rejects.toThrow("Compaction timed out");
await vi.advanceTimersByTimeAsync(EMBEDDED_COMPACTION_TIMEOUT_MS);
await timeoutAssertion;
expect(vi.getTimerCount()).toBe(0);
});
it("returns result and clears timer when compaction settles first", async () => {
vi.useFakeTimers();
const compactPromise = compactWithSafetyTimeout(
() => new Promise<string>((resolve) => setTimeout(() => resolve("ok"), 10)),
30,
);
await vi.advanceTimersByTimeAsync(10);
await expect(compactPromise).resolves.toBe("ok");
expect(vi.getTimerCount()).toBe(0);
});
it("preserves compaction errors and clears timer", async () => {
vi.useFakeTimers();
const error = new Error("provider exploded");
await expect(
compactWithSafetyTimeout(async () => {
throw error;
}, 30),
).rejects.toBe(error);
expect(vi.getTimerCount()).toBe(0);
});
});