54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
import "../setup.ts";
|
|
import { assertEquals } from "@std/assert";
|
|
import { FakeTime } from "@std/testing/time";
|
|
import { startJobs } from "../../lib/scheduler.ts";
|
|
|
|
Deno.test("startJobs: waits for the first run, then repeats, skipping a run still going", async () => {
|
|
using time = new FakeTime();
|
|
let runs = 0;
|
|
let release = () => {};
|
|
startJobs([{
|
|
name: "slow",
|
|
everyMs: 1_000,
|
|
firstAfterMs: 500,
|
|
run: () => {
|
|
runs++;
|
|
return new Promise<void>((resolve) => release = resolve);
|
|
},
|
|
}]);
|
|
await time.tickAsync(499);
|
|
assertEquals(runs, 0);
|
|
await time.tickAsync(1);
|
|
assertEquals(runs, 1);
|
|
// Still running at the next tick: skipped.
|
|
await time.tickAsync(1_000);
|
|
assertEquals(runs, 1);
|
|
release();
|
|
await time.tickAsync(1_000);
|
|
assertEquals(runs, 2);
|
|
});
|
|
|
|
Deno.test("startJobs: a failed run is logged, and the next one runs anyway", async () => {
|
|
using time = new FakeTime();
|
|
const errors: unknown[][] = [];
|
|
const consoleError = console.error;
|
|
console.error = (...args: unknown[]) => errors.push(args);
|
|
try {
|
|
let runs = 0;
|
|
startJobs([{
|
|
name: "flaky",
|
|
everyMs: 1_000,
|
|
run: () => {
|
|
runs++;
|
|
throw new Error("boom");
|
|
},
|
|
}]);
|
|
await time.tickAsync(2_000);
|
|
assertEquals(runs, 2);
|
|
assertEquals(errors.length, 2);
|
|
assertEquals(errors[0][0], "[flaky] run failed:");
|
|
} finally {
|
|
console.error = consoleError;
|
|
}
|
|
});
|