perf(test): avoid deadline sleeps and broad tool imports

This commit is contained in:
Peter Steinberger 2026-07-09 10:32:21 -04:00
parent a1466b2400
commit 3ebcfb8ee3
2 changed files with 21 additions and 13 deletions

View file

@ -1,4 +1,5 @@
import { afterEach, describe, expect, it, vi } from "vitest";
import { createDeferred } from "../shared/deferred.js";
import { runCodeModeScriptHeadless, testing, type CodeModeHeadlessResult } from "./code-mode.js";
import {
createToolSearchCatalogRef,
@ -49,6 +50,7 @@ function expectFailed(result: CodeModeHeadlessResult) {
describe("headless Code Mode", () => {
afterEach(() => {
vi.useRealTimers();
expect(testing.activeRuns.size).toBe(0);
testing.activeRuns.clear();
testing.resumingRunIds.clear();
@ -174,7 +176,10 @@ describe("headless Code Mode", () => {
});
it("enforces one wall-clock deadline across worker and tool legs", async () => {
vi.useFakeTimers({ toFake: ["setTimeout", "clearTimeout", "Date"] });
const toolStarted = createDeferred();
const slow = fakeTool("slow_leg", async (_toolCallId, _input, signal) => {
toolStarted.resolve();
await new Promise<void>((resolve, reject) => {
const timer = setTimeout(resolve, 30_000);
signal?.addEventListener(
@ -188,16 +193,19 @@ describe("headless Code Mode", () => {
});
return jsonResult({ ok: true });
});
const result = expectFailed(
await runCodeModeScriptHeadless({
ctx: createHeadlessHarness([slow]),
code: `
await tools.call("openclaw:core:slow_leg", {});
return true;
`,
wallClockMs: 15_000,
}),
);
const resultPromise = runCodeModeScriptHeadless({
ctx: createHeadlessHarness([slow]),
code: `
await tools.call("openclaw:core:slow_leg", {});
return true;
`,
wallClockMs: 15_000,
});
// Advance the shared deadline only after the real worker reaches the tool leg.
await toolStarted.promise;
await vi.advanceTimersByTimeAsync(15_000);
const result = expectFailed(await resultPromise);
expect(result.code).toBe("timeout");
expect(result.toolCallCount).toBe(1);

View file

@ -314,11 +314,11 @@ vi.mock("../model-auth.js", () => ({
},
}));
vi.mock("../openclaw-tools.js", async (importOriginal) => {
const actual = await importOriginal<typeof import("../openclaw-tools.js")>();
// Client-cap filtering has dedicated coverage; this suite only needs image-tool propagation.
vi.mock("../openclaw-tools.js", async () => {
const { createImageTool: createImageToolLocal } = await import("./image-tool.js");
return {
filterToolsByClientCaps: actual.filterToolsByClientCaps,
filterToolsByClientCaps: (tools: unknown[]) => tools,
createOpenClawTools: vi.fn((options?: MockOpenClawToolsOptions) => {
const imageTool = createImageToolLocal({
config: options?.config,