
























@@ -0,0 +1,70 @@
1+import { afterEach, describe, expect, it, vi } from "vitest";
2+import type { OpenClawConfig } from "../config/config.js";
3+4+function createHeartbeatConfig(every: string): OpenClawConfig {
5+return {
6+agents: {
7+defaults: { heartbeat: { every } },
8+list: [{ id: "main", heartbeat: { every } }],
9+},
10+} as OpenClawConfig;
11+}
12+13+describe("startHeartbeatRunner timeout overflow warnings", () => {
14+afterEach(() => {
15+vi.useRealTimers();
16+vi.resetModules();
17+vi.restoreAllMocks();
18+});
19+20+it("warns once per runner lifetime when clamping an oversized scheduler delay", async () => {
21+const warn = vi.fn();
22+const noop = vi.fn();
23+const logger = {
24+subsystem: "gateway/heartbeat",
25+isEnabled: vi.fn(() => true),
26+trace: noop,
27+debug: noop,
28+info: noop,
29+ warn,
30+error: noop,
31+fatal: noop,
32+raw: noop,
33+child: vi.fn(() => logger),
34+};
35+36+vi.doMock("../logging/subsystem.js", async () => {
37+const actual =
38+await vi.importActual<typeof import("../logging/subsystem.js")>("../logging/subsystem.js");
39+return {
40+ ...actual,
41+createSubsystemLogger: vi.fn(() => logger),
42+};
43+});
44+45+const [{ startHeartbeatRunner }, { resetHeartbeatWakeStateForTests }] = await Promise.all([
46+import("./heartbeat-runner.js"),
47+import("./heartbeat-wake.js"),
48+]);
49+50+vi.useFakeTimers();
51+vi.setSystemTime(new Date(0));
52+const cfg = createHeartbeatConfig("365d");
53+const runnerA = startHeartbeatRunner({
54+ cfg,
55+runOnce: vi.fn().mockResolvedValue({ status: "ran", durationMs: 1 }),
56+stableSchedulerSeed: "seed-0",
57+});
58+const runnerB = startHeartbeatRunner({
59+ cfg,
60+runOnce: vi.fn().mockResolvedValue({ status: "ran", durationMs: 1 }),
61+stableSchedulerSeed: "seed-0",
62+});
63+64+expect(warn).toHaveBeenCalledTimes(2);
65+66+runnerA.stop();
67+runnerB.stop();
68+resetHeartbeatWakeStateForTests();
69+});
70+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。