test(perf): avoid cron min-refire delay in auto-run coverage

This commit is contained in:
Peter Steinberger
2026-03-02 17:41:39 +00:00
parent e339c75d5d
commit 26b8e6d510

View File

@@ -2,7 +2,7 @@ import fs from "node:fs/promises";
import os from "node:os"; import os from "node:os";
import path from "node:path"; import path from "node:path";
import { setImmediate as setImmediatePromise } from "node:timers/promises"; import { setImmediate as setImmediatePromise } from "node:timers/promises";
import { beforeEach, describe, expect, test, vi } from "vitest"; import { afterAll, beforeEach, describe, expect, test, vi } from "vitest";
import type { GuardedFetchOptions } from "../infra/net/fetch-guard.js"; import type { GuardedFetchOptions } from "../infra/net/fetch-guard.js";
import { import {
connectOk, connectOk,
@@ -36,6 +36,15 @@ vi.mock("../infra/net/fetch-guard.js", () => ({
installGatewayTestHooks({ scope: "suite" }); installGatewayTestHooks({ scope: "suite" });
const CRON_WAIT_INTERVAL_MS = 5; const CRON_WAIT_INTERVAL_MS = 5;
const CRON_WAIT_TIMEOUT_MS = 3_000; const CRON_WAIT_TIMEOUT_MS = 3_000;
let cronSuiteTempRootPromise: Promise<string> | null = null;
let cronSuiteCaseId = 0;
async function getCronSuiteTempRoot(): Promise<string> {
if (!cronSuiteTempRootPromise) {
cronSuiteTempRootPromise = fs.mkdtemp(path.join(os.tmpdir(), "openclaw-gw-cron-suite-"));
}
return await cronSuiteTempRootPromise;
}
async function yieldToEventLoop() { async function yieldToEventLoop() {
await setImmediatePromise(); await setImmediatePromise();
@@ -79,7 +88,6 @@ async function cleanupCronTestRun(params: {
}) { }) {
params.ws.close(); params.ws.close();
await params.server.close(); await params.server.close();
await rmTempDir(params.dir);
testState.cronStorePath = undefined; testState.cronStorePath = undefined;
if (params.clearSessionConfig) { if (params.clearSessionConfig) {
testState.sessionConfig = undefined; testState.sessionConfig = undefined;
@@ -100,7 +108,9 @@ async function setupCronTestRun(params: {
}): Promise<{ prevSkipCron: string | undefined; dir: string }> { }): Promise<{ prevSkipCron: string | undefined; dir: string }> {
const prevSkipCron = process.env.OPENCLAW_SKIP_CRON; const prevSkipCron = process.env.OPENCLAW_SKIP_CRON;
process.env.OPENCLAW_SKIP_CRON = "0"; process.env.OPENCLAW_SKIP_CRON = "0";
const dir = await fs.mkdtemp(path.join(os.tmpdir(), params.tempPrefix)); const suiteRoot = await getCronSuiteTempRoot();
const dir = path.join(suiteRoot, `${params.tempPrefix}${cronSuiteCaseId++}`);
await fs.mkdir(dir, { recursive: true });
testState.cronStorePath = path.join(dir, "cron", "jobs.json"); testState.cronStorePath = path.join(dir, "cron", "jobs.json");
testState.sessionConfig = params.sessionConfig; testState.sessionConfig = params.sessionConfig;
testState.cronEnabled = params.cronEnabled; testState.cronEnabled = params.cronEnabled;
@@ -113,6 +123,15 @@ async function setupCronTestRun(params: {
} }
describe("gateway server cron", () => { describe("gateway server cron", () => {
afterAll(async () => {
if (!cronSuiteTempRootPromise) {
return;
}
await rmTempDir(await cronSuiteTempRootPromise);
cronSuiteTempRootPromise = null;
cronSuiteCaseId = 0;
});
beforeEach(() => { beforeEach(() => {
// Keep polling helpers deterministic even if other tests left fake timers enabled. // Keep polling helpers deterministic even if other tests left fake timers enabled.
vi.useRealTimers(); vi.useRealTimers();
@@ -473,7 +492,7 @@ describe("gateway server cron", () => {
const autoRes = await rpcReq(ws, "cron.add", { const autoRes = await rpcReq(ws, "cron.add", {
name: "auto run test", name: "auto run test",
enabled: true, enabled: true,
schedule: { kind: "at", at: new Date(Date.now() - 10).toISOString() }, schedule: { kind: "at", at: new Date(Date.now() + 50).toISOString() },
sessionTarget: "main", sessionTarget: "main",
wakeMode: "next-heartbeat", wakeMode: "next-heartbeat",
payload: { kind: "systemEvent", text: "auto" }, payload: { kind: "systemEvent", text: "auto" },