Files
linuxcncWebWASM/web/worker/test_recovery_offline_faults.mjs

30 lines
1.9 KiB
JavaScript

import assert from "node:assert/strict";
import { MemoryStorage, WorkspaceJournal } from "../workspace/journal.mjs";
import { verifyOfflinePackage } from "../workspace/migration.mjs";
import { ProjectWorkflow } from "../app/project-workflow.mjs";
import { ReplayTimeline } from "./replay.mjs";
import { createCheckpoint, recoverSimulation } from "../workspace/recovery.mjs";
const contextId = "linuxcnc-2.10.0-pre0-wasm-m1-py-c1";
const storage = new MemoryStorage();
const journal = new WorkspaceJournal(storage, { projectId: "faults" });
journal.prepare("op-1", [{ path: "config/main.ini", data: "[EMC]\n" }]);
journal.commit("op-1");
const half = new MemoryStorage(Object.fromEntries(storage.entries()));
const halfJournal = new WorkspaceJournal(half, { projectId: "faults" });
halfJournal.prepare("op-half", [{ path: "programs/main.ngc", data: "G0 X1\n" }]);
assert.equal(halfJournal.recover().half_commits.length, 1);
const timeline = new ReplayTimeline();
timeline.appendEvent(1, 0, "SESSION_READY", {});
timeline.checkpoint(1, 0, { tick: 0 });
const checkpoint = createCheckpoint({ contextId, timeline, state: { tick: 0 }, operations: [] });
const damaged = structuredClone(checkpoint); damaged.state.tick = 9;
assert.equal(recoverSimulation({ checkpoint: damaged }).status, "blocked");
const workflow = new ProjectWorkflow({ contextId, storage: new MemoryStorage(), projectId: "offline" });
workflow.importFiles([{ path: "config/main.ini", data: "[EMC]\n" }]);
const pkg = workflow.package({ timeline, checkpoint, committedSeq: 1 });
const offline = workflow.offline(pkg, [{ path: "ui/index.html", data: "<main>" }]);
assert.throws(() => verifyOfflinePackage(offline, { contextId, workspacePackage: pkg, available: [], online: false }), /offline_resource_invalid/);
assert.equal(verifyOfflinePackage(offline, { contextId, workspacePackage: pkg, available: [], online: true }).status, "network_required");
console.log("recovery_offline_faults=passed scenarios=5");