


























11// Verifies agent cleanup steps time out with bounded diagnostic logging.
22import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
3-import {
4-AGENT_CLEANUP_STEP_TIMEOUT_MS,
5-CLEANUP_TIMEOUT_DETAILS_MAX_CHARS,
6-resolveAgentCleanupStepTimeoutMs,
7-runAgentCleanupStep,
8-} from "./run-cleanup-timeout.js";
3+import { runAgentCleanupStep } from "./run-cleanup-timeout.js";
4+5+const AGENT_CLEANUP_STEP_TIMEOUT_MS = 10_000;
6+const CLEANUP_TIMEOUT_DETAILS_MAX_CHARS = 512;
97108describe("agent cleanup timeout", () => {
119const log = {
@@ -192,51 +190,98 @@ describe("agent cleanup timeout", () => {
192190);
193191});
194192195-it("prefers explicit cleanup timeout values over environment overrides", () => {
196-expect(
197-resolveAgentCleanupStepTimeoutMs({
198-step: "openclaw-trajectory-flush",
199-timeoutMs: 2_000,
200-env: {
201-OPENCLAW_TRAJECTORY_FLUSH_TIMEOUT_MS: "25000",
202-OPENCLAW_AGENT_CLEANUP_TIMEOUT_MS: "15000",
203-},
204-}),
205-).toBe(2_000);
193+it("prefers explicit cleanup timeout values over environment overrides", async () => {
194+const cleanup = vi.fn(async () => new Promise<never>(() => {}));
195+196+const result = runAgentCleanupStep({
197+runId: "run-explicit",
198+sessionId: "session-explicit",
199+step: "openclaw-trajectory-flush",
200+timeoutMs: 2_000,
201+ cleanup,
202+ log,
203+env: {
204+OPENCLAW_TRAJECTORY_FLUSH_TIMEOUT_MS: "25000",
205+OPENCLAW_AGENT_CLEANUP_TIMEOUT_MS: "15000",
206+},
207+});
208+209+await vi.advanceTimersByTimeAsync(1_999);
210+expect(log.warn).not.toHaveBeenCalled();
211+212+await vi.advanceTimersByTimeAsync(1);
213+await expect(result).resolves.toBeUndefined();
214+215+expect(log.warn).toHaveBeenCalledWith(
216+"agent cleanup timed out: runId=run-explicit sessionId=session-explicit step=openclaw-trajectory-flush timeoutMs=2000",
217+);
206218});
207219208-it("keeps explicit zero cleanup timeouts as a one millisecond timeout", () => {
209-expect(
210-resolveAgentCleanupStepTimeoutMs({
211-step: "openclaw-trajectory-flush",
212-timeoutMs: 0,
213-env: {
214-OPENCLAW_TRAJECTORY_FLUSH_TIMEOUT_MS: "25000",
215-},
216-}),
217-).toBe(1);
220+it("keeps explicit zero cleanup timeouts as a one millisecond timeout", async () => {
221+const cleanup = vi.fn(async () => new Promise<never>(() => {}));
222+223+const result = runAgentCleanupStep({
224+runId: "run-zero",
225+sessionId: "session-zero",
226+step: "openclaw-trajectory-flush",
227+timeoutMs: 0,
228+ cleanup,
229+ log,
230+env: {
231+OPENCLAW_TRAJECTORY_FLUSH_TIMEOUT_MS: "25000",
232+},
233+});
234+235+await vi.advanceTimersByTimeAsync(1);
236+await expect(result).resolves.toBeUndefined();
237+238+expect(log.warn).toHaveBeenCalledWith(
239+"agent cleanup timed out: runId=run-zero sessionId=session-zero step=openclaw-trajectory-flush timeoutMs=1",
240+);
218241});
219242220-it("ignores invalid cleanup timeout environment values", () => {
221-expect(
222-resolveAgentCleanupStepTimeoutMs({
223-step: "openclaw-trajectory-flush",
224-env: {
225-OPENCLAW_TRAJECTORY_FLUSH_TIMEOUT_MS: "0",
226-OPENCLAW_AGENT_CLEANUP_TIMEOUT_MS: "not-a-number",
227-},
228-}),
229-).toBe(AGENT_CLEANUP_STEP_TIMEOUT_MS);
230-expect(
231-resolveAgentCleanupStepTimeoutMs({
243+it.each([
244+{
245+runId: "run-invalid-env-number",
246+sessionId: "session-invalid-env-number",
247+env: {
248+OPENCLAW_TRAJECTORY_FLUSH_TIMEOUT_MS: "0",
249+OPENCLAW_AGENT_CLEANUP_TIMEOUT_MS: "not-a-number",
250+},
251+},
252+{
253+runId: "run-invalid-env-format",
254+sessionId: "session-invalid-env-format",
255+env: {
256+OPENCLAW_TRAJECTORY_FLUSH_TIMEOUT_MS: "1e3",
257+OPENCLAW_AGENT_CLEANUP_TIMEOUT_MS: "0x10",
258+},
259+},
260+])(
261+"ignores invalid cleanup timeout environment values",
262+async ({ runId, sessionId, env }) => {
263+const cleanup = vi.fn(async () => new Promise<never>(() => {}));
264+265+const result = runAgentCleanupStep({
266+ runId,
267+ sessionId,
232268step: "openclaw-trajectory-flush",
233-env: {
234-OPENCLAW_TRAJECTORY_FLUSH_TIMEOUT_MS: "1e3",
235-OPENCLAW_AGENT_CLEANUP_TIMEOUT_MS: "0x10",
236-},
237-}),
238-).toBe(AGENT_CLEANUP_STEP_TIMEOUT_MS);
239-});
269+ cleanup,
270+ log,
271+ env,
272+});
273+274+await vi.advanceTimersByTimeAsync(AGENT_CLEANUP_STEP_TIMEOUT_MS - 1);
275+expect(log.warn).not.toHaveBeenCalled();
276+277+await vi.advanceTimersByTimeAsync(1);
278+await expect(result).resolves.toBeUndefined();
279+280+expect(log.warn).toHaveBeenCalledWith(
281+`agent cleanup timed out: runId=${runId} sessionId=${sessionId} step=openclaw-trajectory-flush timeoutMs=10000`,
282+);
283+},
284+);
240285241286it("logs cleanup rejection without throwing", async () => {
242287await expect(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。