test: stabilize cron auto-run test
This commit is contained in:
@@ -10,19 +10,6 @@ import {
|
|||||||
testState,
|
testState,
|
||||||
} from "./test-helpers.js";
|
} from "./test-helpers.js";
|
||||||
|
|
||||||
const decodeWsData = (data: unknown): string => {
|
|
||||||
if (typeof data === "string") return data;
|
|
||||||
if (Buffer.isBuffer(data)) return data.toString("utf-8");
|
|
||||||
if (Array.isArray(data)) return Buffer.concat(data).toString("utf-8");
|
|
||||||
if (data instanceof ArrayBuffer) return Buffer.from(data).toString("utf-8");
|
|
||||||
if (ArrayBuffer.isView(data)) {
|
|
||||||
return Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString(
|
|
||||||
"utf-8",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return "";
|
|
||||||
};
|
|
||||||
|
|
||||||
installGatewayTestHooks();
|
installGatewayTestHooks();
|
||||||
|
|
||||||
describe("gateway server cron", () => {
|
describe("gateway server cron", () => {
|
||||||
@@ -327,9 +314,9 @@ describe("gateway server cron", () => {
|
|||||||
: "";
|
: "";
|
||||||
expect(storePath).toContain("jobs.json");
|
expect(storePath).toContain("jobs.json");
|
||||||
|
|
||||||
// Avoid races: if we schedule too close to "now", the cron runner can
|
// Keep the job due immediately; we poll run logs instead of relying on
|
||||||
// finish before we start listening for the "finished" event.
|
// the cron finished event to avoid timing races under heavy load.
|
||||||
const atMs = Date.now() + 1000;
|
const atMs = Date.now() - 10;
|
||||||
const addRes = await rpcReq(ws, "cron.add", {
|
const addRes = await rpcReq(ws, "cron.add", {
|
||||||
name: "auto run test",
|
name: "auto run test",
|
||||||
enabled: true,
|
enabled: true,
|
||||||
@@ -343,33 +330,8 @@ describe("gateway server cron", () => {
|
|||||||
const jobId = typeof jobIdValue === "string" ? jobIdValue : "";
|
const jobId = typeof jobIdValue === "string" ? jobIdValue : "";
|
||||||
expect(jobId.length > 0).toBe(true);
|
expect(jobId.length > 0).toBe(true);
|
||||||
|
|
||||||
const finishedEvt = await new Promise<{
|
|
||||||
type: "event";
|
|
||||||
event: string;
|
|
||||||
payload?: { jobId?: string; action?: string; status?: string } | null;
|
|
||||||
}>((resolve, reject) => {
|
|
||||||
const timeout = setTimeout(() => {
|
|
||||||
reject(
|
|
||||||
new Error(`timeout waiting for cron finished event: ${jobId}`),
|
|
||||||
);
|
|
||||||
}, 8000);
|
|
||||||
ws.on("message", (data) => {
|
|
||||||
const obj = JSON.parse(decodeWsData(data));
|
|
||||||
if (
|
|
||||||
obj.type === "event" &&
|
|
||||||
obj.event === "cron" &&
|
|
||||||
obj.payload?.jobId === jobId &&
|
|
||||||
obj.payload?.action === "finished"
|
|
||||||
) {
|
|
||||||
clearTimeout(timeout);
|
|
||||||
resolve(obj);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
expect(finishedEvt.payload?.status).toBe("ok");
|
|
||||||
|
|
||||||
const waitForRuns = async () => {
|
const waitForRuns = async () => {
|
||||||
for (let i = 0; i < 200; i += 1) {
|
for (let i = 0; i < 500; i += 1) {
|
||||||
const runsRes = await rpcReq(ws, "cron.runs", {
|
const runsRes = await rpcReq(ws, "cron.runs", {
|
||||||
id: jobId,
|
id: jobId,
|
||||||
limit: 10,
|
limit: 10,
|
||||||
@@ -378,7 +340,7 @@ describe("gateway server cron", () => {
|
|||||||
const entries = (runsRes.payload as { entries?: unknown } | null)
|
const entries = (runsRes.payload as { entries?: unknown } | null)
|
||||||
?.entries;
|
?.entries;
|
||||||
if (Array.isArray(entries) && entries.length > 0) return entries;
|
if (Array.isArray(entries) && entries.length > 0) return entries;
|
||||||
await new Promise((r) => setTimeout(r, 10));
|
await new Promise((r) => setTimeout(r, 20));
|
||||||
}
|
}
|
||||||
throw new Error("timeout waiting for cron.runs entries");
|
throw new Error("timeout waiting for cron.runs entries");
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user