按规划继续工作
结论:补齐通用会话快照 envelope 的格式、版本、会话 ID 与对象形状拒绝验证,覆盖 Node OPFS 与 Chromium OPFS 路径,并通过 host/WASM/browser 聚合验证。
This commit is contained in:
@@ -9,7 +9,7 @@
|
||||
<script type="module">
|
||||
import { createLinuxCncIniSdk } from "../../runtime/sdk/src/index.js";
|
||||
import { loadTextFile, saveTextFile } from "../../runtime/opfs/file-service.js";
|
||||
import { machineIniPath } from "../../runtime/opfs/path-model.js";
|
||||
import { machineIniPath, sessionSnapshotPath } from "../../runtime/opfs/path-model.js";
|
||||
import {
|
||||
loadSessionSnapshot,
|
||||
saveSessionSnapshot,
|
||||
@@ -29,6 +29,18 @@
|
||||
}
|
||||
}
|
||||
|
||||
async function assertRejects(label, operation, expectedPattern) {
|
||||
try {
|
||||
await operation();
|
||||
} catch (error) {
|
||||
if (!expectedPattern.test(error.message)) {
|
||||
throw new Error(`${label}: unexpected error ${error.message}`);
|
||||
}
|
||||
return;
|
||||
}
|
||||
throw new Error(`${label}: expected rejection`);
|
||||
}
|
||||
|
||||
function delay(ms) {
|
||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||
}
|
||||
@@ -104,6 +116,44 @@ JOINTS = 3
|
||||
assertEqual(loadedSnapshot.createdAt, savedSnapshot.createdAt, "snapshot timestamp");
|
||||
assertEqual(loadedSnapshot.payload.files.ini, opfsPath, "snapshot payload");
|
||||
assertEqual(loadedSnapshot.metadata.source, "browser-smoke", "snapshot metadata");
|
||||
await saveTextFile(
|
||||
sessionSnapshotPath("browser-bad-format"),
|
||||
JSON.stringify({
|
||||
...loadedSnapshot,
|
||||
format: "other-format",
|
||||
sessionId: "browser-bad-format",
|
||||
}),
|
||||
);
|
||||
await assertRejects(
|
||||
"browser snapshot bad format",
|
||||
() => loadSessionSnapshot("browser-bad-format"),
|
||||
/Unsupported session snapshot format/,
|
||||
);
|
||||
await saveTextFile(
|
||||
sessionSnapshotPath("browser-bad-version"),
|
||||
JSON.stringify({
|
||||
...loadedSnapshot,
|
||||
version: 99,
|
||||
sessionId: "browser-bad-version",
|
||||
}),
|
||||
);
|
||||
await assertRejects(
|
||||
"browser snapshot bad version",
|
||||
() => loadSessionSnapshot("browser-bad-version"),
|
||||
/Unsupported session snapshot version/,
|
||||
);
|
||||
await saveTextFile(
|
||||
sessionSnapshotPath("browser-bad-session-id"),
|
||||
JSON.stringify({
|
||||
...loadedSnapshot,
|
||||
sessionId: "other-browser-session",
|
||||
}),
|
||||
);
|
||||
await assertRejects(
|
||||
"browser snapshot id mismatch",
|
||||
() => loadSessionSnapshot("browser-bad-session-id"),
|
||||
/Session snapshot id mismatch/,
|
||||
);
|
||||
|
||||
await saveMachineTextFiles("browser-smoke", {
|
||||
ini: iniText,
|
||||
|
||||
@@ -130,6 +130,26 @@ assert.deepEqual(snapshot, {
|
||||
payload: snapshotPayload,
|
||||
});
|
||||
assert.equal(validateSessionSnapshot(snapshot, "session-1"), snapshot);
|
||||
assert.throws(
|
||||
() => validateSessionSnapshot({ ...snapshot, format: "other-format" }, "session-1"),
|
||||
/Unsupported session snapshot format/,
|
||||
);
|
||||
assert.throws(
|
||||
() => validateSessionSnapshot({ ...snapshot, version: 99 }, "session-1"),
|
||||
/Unsupported session snapshot version/,
|
||||
);
|
||||
assert.throws(
|
||||
() => validateSessionSnapshot({ ...snapshot, sessionId: "other-session" }, "session-1"),
|
||||
/Session snapshot id mismatch/,
|
||||
);
|
||||
assert.throws(
|
||||
() => validateSessionSnapshot({ ...snapshot, metadata: null }, "session-1"),
|
||||
/snapshot metadata must be a plain object/,
|
||||
);
|
||||
assert.throws(
|
||||
() => validateSessionSnapshot({ ...snapshot, payload: [] }, "session-1"),
|
||||
/snapshot payload must be a plain object/,
|
||||
);
|
||||
|
||||
await saveTextFile(
|
||||
"linuxcnc/machines/xyzab.ini",
|
||||
@@ -558,6 +578,33 @@ await assert.rejects(
|
||||
() => loadSessionSnapshot("bad-json", { storage }),
|
||||
/Invalid session snapshot JSON/,
|
||||
);
|
||||
await saveTextFile(
|
||||
sessionSnapshotPath("bad-format"),
|
||||
JSON.stringify({ ...snapshot, sessionId: "bad-format", format: "other-format" }),
|
||||
storage,
|
||||
);
|
||||
await assert.rejects(
|
||||
() => loadSessionSnapshot("bad-format", { storage }),
|
||||
/Unsupported session snapshot format/,
|
||||
);
|
||||
await saveTextFile(
|
||||
sessionSnapshotPath("bad-version"),
|
||||
JSON.stringify({ ...snapshot, sessionId: "bad-version", version: 99 }),
|
||||
storage,
|
||||
);
|
||||
await assert.rejects(
|
||||
() => loadSessionSnapshot("bad-version", { storage }),
|
||||
/Unsupported session snapshot version/,
|
||||
);
|
||||
await saveTextFile(
|
||||
sessionSnapshotPath("bad-session-id"),
|
||||
JSON.stringify({ ...snapshot, sessionId: "other-session" }),
|
||||
storage,
|
||||
);
|
||||
await assert.rejects(
|
||||
() => loadSessionSnapshot("bad-session-id", { storage }),
|
||||
/Session snapshot id mismatch/,
|
||||
);
|
||||
await assert.rejects(
|
||||
() => loadSessionSnapshot("missing-session", { storage }),
|
||||
/missing directory|missing file/,
|
||||
|
||||
Reference in New Issue
Block a user