test: use runner runtime in scenarios

This commit is contained in:
2026-04-30 07:23:22 +00:00
parent fc29bc9f7e
commit 3680b9c979
2 changed files with 45 additions and 52 deletions
+40 -44
View File
@@ -1,15 +1,9 @@
import { assert, assertEquals, assertRejects } from "jsr:@std/assert@^1.0.0";
import { RunnerAdmin } from "../../../uptime.link/ts_api/classes/runner-admin.ts";
import { RunnerCoordinator } from "../../../uptime.link/ts_api/classes/runner-coordinator.ts";
import { RunnerFileStore } from "../../../uptime.link/ts_api/classes/runner-file-store.ts";
import {
createRunnerSchedulesFromMonitors,
type IRunnerMonitorDefinition,
} from "../../../uptime.link/ts_api/classes/runner-monitor-mapper.ts";
import { createRunnerRequestHandler } from "../../../uptime.link/ts_api/classes/runner-request-handler.ts";
import type { IRunnerMonitorDefinition } from "../../../uptime.link/ts_api/classes/runner-monitor-mapper.ts";
import { RunnerResultIngestor } from "../../../uptime.link/ts_api/classes/runner-result-ingestor.ts";
import { RunnerScheduler } from "../../../uptime.link/ts_api/classes/runner-scheduler.ts";
import { RunnerRuntime } from "../../../uptime.link/ts_api/classes/runner-runtime.ts";
import { UptimeRunner } from "../../../uptimerunner/ts/runner.ts";
import type { IResultSubmitRequest } from "../../../uptimerunner/ts/interfaces.ts";
@@ -65,27 +59,20 @@ const main = async () => {
},
];
const coordinator = new RunnerCoordinator();
const admin = new RunnerAdmin(coordinator);
const registration = admin.registerRunner({
const runtime = new RunnerRuntime({ monitors, now: () => 1000 });
const coordinator = runtime.coordinator;
const registration = await runtime.registerRunner({
runnerId,
token: runnerToken,
labels: ["scenario:basic"],
});
assertEquals(registration.runner.runnerId, runnerId);
assertEquals(registration.token, runnerToken);
const scheduler = new RunnerScheduler(coordinator, { now: () => 1000 });
const scheduleResult = scheduler.scheduleDueChecks(
createRunnerSchedulesFromMonitors(monitors),
);
const scheduleResult = await runtime.scheduleDueChecks();
assertEquals(scheduleResult.scheduledChecks.length, 4);
assertEquals(coordinator.getQueueLength(), 4);
assertEquals(
scheduler.scheduleDueChecks(scheduleResult.schedules).scheduledChecks
.length,
0,
);
const runnerRequestHandler = createRunnerRequestHandler(coordinator);
assertEquals((await runtime.scheduleDueChecks()).scheduledChecks.length, 0);
const runnerRequestHandler = runtime.createRequestHandler();
const coordinatorServer = await startServer(async (request) => {
if (
@@ -125,7 +112,8 @@ const main = async () => {
assertEquals(coordinator.listResults().length, 4);
assertEquals(coordinator.getQueueLength(), 0);
assertMonitorStatusDerivation(coordinator.listResults());
await assertSnapshotPersistence(coordinator, targetServer.url);
assertEquals(runtime.listMonitorStates().length, 4);
await assertSnapshotPersistence(runtime, targetServer.url);
const emptyResult = await runner.runOnce();
assertEquals(emptyResult.checks.length, 0);
@@ -140,8 +128,7 @@ const main = async () => {
});
await assertRejects(() => unauthorizedRunner.runOnce(), Error, "401");
await assertRunnerTokenLifecycle(
admin,
coordinator,
runtime,
coordinatorServer.url,
runner,
);
@@ -226,16 +213,15 @@ function assertMonitorStatusDerivation(
}
async function assertRunnerTokenLifecycle(
adminArg: RunnerAdmin,
coordinatorArg: RunnerCoordinator,
runtimeArg: RunnerRuntime,
instanceUrlArg: string,
staleRunnerArg: UptimeRunner,
): Promise<void> {
const rotated = adminArg.rotateRunnerToken(runnerId, "rotated-token");
const rotated = await runtimeArg.rotateRunnerToken(runnerId, "rotated-token");
assertEquals(rotated.token, "rotated-token");
assertEquals(adminArg.listRunners()[0].tokenPreview, "rotate...oken");
assertEquals(runtimeArg.admin.listRunners()[0].tokenPreview, "rotate...oken");
coordinatorArg.enqueueCheck({
runtimeArg.coordinator.enqueueCheck({
id: "post-rotate-assumption",
type: "assumption",
assumedStatus: "ok",
@@ -255,42 +241,51 @@ async function assertRunnerTokenLifecycle(
assertEquals(rotatedResult.results.length, 1);
assertEquals(rotatedResult.results[0].status, "ok");
adminArg.disableRunner(runnerId);
assertEquals(adminArg.listRunners()[0].enabled, false);
await runtimeArg.disableRunner(runnerId);
assertEquals(runtimeArg.admin.listRunners()[0].enabled, false);
await assertRejects(() => rotatedRunner.runOnce(), Error, "401");
adminArg.enableRunner(runnerId);
adminArg.setRunnerLabels(runnerId, ["scenario:basic", "role:external"]);
await runtimeArg.enableRunner(runnerId);
await runtimeArg.setRunnerLabels(runnerId, [
"scenario:basic",
"role:external",
]);
assertEquals(
adminArg.listRunners()[0].labels.includes("role:external"),
runtimeArg.admin.listRunners()[0].labels.includes("role:external"),
true,
);
}
async function assertSnapshotPersistence(
coordinatorArg: RunnerCoordinator,
runtimeArg: RunnerRuntime,
targetUrlArg: string,
): Promise<void> {
const snapshotPath = await Deno.makeTempFile();
const store = RunnerFileStore.fromDenoPath(snapshotPath);
try {
await store.save(coordinatorArg.getSnapshot());
const snapshot = await store.load();
assert(snapshot);
const restoredCoordinator = new RunnerCoordinator({ snapshot });
assertEquals(restoredCoordinator.listResults().length, 4);
assertEquals(restoredCoordinator.listRunners().length, 1);
restoredCoordinator.enqueueCheck({
const persistedRuntime = new RunnerRuntime({
coordinator: runtimeArg.coordinator,
fileStore: store,
});
await persistedRuntime.save();
const restoredRuntime = await RunnerRuntime.fromFileStore(store);
assertEquals(restoredRuntime.coordinator.listResults().length, 4);
assertEquals(restoredRuntime.coordinator.listRunners().length, 1);
assertEquals(restoredRuntime.listMonitorStates().length, 4);
restoredRuntime.coordinator.enqueueCheck({
id: "post-restart-http-health",
type: "http",
url: targetUrlArg,
expectedStatusCodes: [200],
expectedBodyIncludes: "healthy",
metadata: {
monitorId: "post-restart-http-health",
},
});
const restoredServer = await startServer(
createRunnerRequestHandler(restoredCoordinator),
restoredRuntime.createRequestHandler(),
);
try {
const restoredRunner = new UptimeRunner({
@@ -301,7 +296,8 @@ async function assertSnapshotPersistence(
const restoredResult = await restoredRunner.runOnce();
assertEquals(restoredResult.results.length, 1);
assertEquals(restoredResult.results[0].status, "ok");
assertEquals(restoredCoordinator.listResults().length, 5);
assertEquals(restoredRuntime.coordinator.listResults().length, 5);
assertEquals(restoredRuntime.listMonitorStates().length, 5);
} finally {
await restoredServer.server.shutdown();
}