perf(test): remove slow port inspection and reconnect sleeps

This commit is contained in:
Peter Steinberger
2026-02-14 04:52:02 +00:00
parent 1f432ffb93
commit e6d5b5fb11
3 changed files with 46 additions and 29 deletions

View File

@@ -2,6 +2,7 @@ import fs from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import type { CronEvent } from "./service.js";
import type { CronJob } from "./types.js";
import { CronService } from "./service.js";
@@ -22,21 +23,25 @@ async function makeStorePath() {
};
}
async function waitForJob(
cron: CronService,
id: string,
predicate: (job: CronJob | undefined) => boolean,
) {
let latest: CronJob | undefined;
for (let i = 0; i < 30; i++) {
const jobs = await cron.list({ includeDisabled: true });
latest = jobs.find((job) => job.id === id);
if (predicate(latest)) {
return latest;
}
await vi.runOnlyPendingTimersAsync();
}
return latest;
function createFinishedBarrier() {
const resolvers = new Map<string, (evt: CronEvent) => void>();
return {
waitForOk: (jobId: string) =>
new Promise<CronEvent>((resolve) => {
resolvers.set(jobId, resolve);
}),
onEvent: (evt: CronEvent) => {
if (evt.action !== "finished" || evt.status !== "ok") {
return;
}
const resolve = resolvers.get(evt.jobId);
if (!resolve) {
return;
}
resolvers.delete(evt.jobId);
resolve(evt);
},
};
}
describe("CronService interval/cron jobs fire on time", () => {
@@ -57,6 +62,7 @@ describe("CronService interval/cron jobs fire on time", () => {
const store = await makeStorePath();
const enqueueSystemEvent = vi.fn();
const requestHeartbeatNow = vi.fn();
const finished = createFinishedBarrier();
const cron = new CronService({
storePath: store.storePath,
@@ -65,6 +71,7 @@ describe("CronService interval/cron jobs fire on time", () => {
enqueueSystemEvent,
requestHeartbeatNow,
runIsolatedAgentJob: vi.fn(async () => ({ status: "ok" })),
onEvent: finished.onEvent,
});
await cron.start();
@@ -84,7 +91,9 @@ describe("CronService interval/cron jobs fire on time", () => {
vi.setSystemTime(new Date(firstDueAt + 5));
await vi.runOnlyPendingTimersAsync();
const updated = await waitForJob(cron, job.id, (current) => current?.state.lastStatus === "ok");
await finished.waitForOk(job.id);
const jobs = await cron.list({ includeDisabled: true });
const updated = jobs.find((current) => current.id === job.id);
expect(enqueueSystemEvent).toHaveBeenCalledWith("tick", { agentId: undefined });
expect(updated?.state.lastStatus).toBe("ok");
@@ -99,6 +108,7 @@ describe("CronService interval/cron jobs fire on time", () => {
const store = await makeStorePath();
const enqueueSystemEvent = vi.fn();
const requestHeartbeatNow = vi.fn();
const finished = createFinishedBarrier();
// Set time to just before a minute boundary.
vi.setSystemTime(new Date("2025-12-13T00:00:59.000Z"));
@@ -110,6 +120,7 @@ describe("CronService interval/cron jobs fire on time", () => {
enqueueSystemEvent,
requestHeartbeatNow,
runIsolatedAgentJob: vi.fn(async () => ({ status: "ok" })),
onEvent: finished.onEvent,
});
await cron.start();
@@ -128,7 +139,9 @@ describe("CronService interval/cron jobs fire on time", () => {
vi.setSystemTime(new Date(firstDueAt + 5));
await vi.runOnlyPendingTimersAsync();
const updated = await waitForJob(cron, job.id, (current) => current?.state.lastStatus === "ok");
await finished.waitForOk(job.id);
const jobs = await cron.list({ includeDisabled: true });
const updated = jobs.find((current) => current.id === job.id);
expect(enqueueSystemEvent).toHaveBeenCalledWith("cron-tick", { agentId: undefined });
expect(updated?.state.lastStatus).toBe("ok");