21 lines
3.3 KiB
JavaScript
21 lines
3.3 KiB
JavaScript
#!/usr/bin/env node
|
|
import assert from "node:assert/strict";
|
|
import crypto from "node:crypto";
|
|
import fs from "node:fs";
|
|
import path from "node:path";
|
|
import { createRequire } from "node:module";
|
|
import { pathToFileURL } from "node:url";
|
|
const root = path.resolve(path.dirname(new URL(import.meta.url).pathname), "..");
|
|
const buildDirectory = path.resolve(process.argv[2] || path.join(root, "freecad-source/build-web/cloud-configure-r2/bin"));
|
|
globalThis.__dirname = `${buildDirectory}${path.sep}`; globalThis.require = createRequire(import.meta.url);
|
|
const loader = await import(pathToFileURL(path.join(buildDirectory, "FreeCADWebCloudKernelProbe.js")).href);
|
|
const kernel = await loader.default({ wasmBinary: fs.readFileSync(path.join(buildDirectory, "FreeCADWebCloudKernelProbe.wasm")) });
|
|
const call = (name, type = "number") => kernel.ccall(name, type);
|
|
const run = () => ({ run: call("fc_web_cloud_kernel_recovery"), error: { code: call("fc_web_cloud_kernel_error_code", "string"), message: call("fc_web_cloud_kernel_error_message", "string") }, invalid: { return: call("fc_web_cloud_recovery_invalid_return"), code: call("fc_web_cloud_recovery_error_code", "string"), field: call("fc_web_cloud_recovery_error_field", "string"), message: call("fc_web_cloud_recovery_error_message", "string") }, state: { before: call("fc_web_cloud_recovery_state_before", "string"), after: call("fc_web_cloud_recovery_state_after", "string"), afterReplay: call("fc_web_cloud_recovery_state_after_replay", "string") }, unchangedAfterReject: call("fc_web_cloud_recovery_unchanged_after_reject"), replayEqual: call("fc_web_cloud_recovery_replay_equal"), recomputeCount: call("fc_web_cloud_recovery_recompute_count") });
|
|
const first = run(); const second = run();
|
|
assert.equal(first.run, 1); assert.equal(first.invalid.return, 0); assert.equal(first.invalid.code, "invalid_argument"); assert.equal(first.invalid.field, "URL"); assert.equal(first.unchangedAfterReject, 1); assert.equal(first.replayEqual, 1); assert.equal(first.recomputeCount, 2); assert.deepEqual(second, first);
|
|
const report = { schema: "freecad-web-p6-cloud-action-03-recovery/v1", task_id: "FW-P6-CLD-ACT-03-D", module: "Cloud", action: "python-api", status: "pass", invalid_input: { field: "URL", valueType: "integer", input_sha256: crypto.createHash("sha256").update(JSON.stringify({ field: "URL", valueType: "integer" })).digest("hex") }, result: { baseline: first.state.before, rejected: first.invalid, recovered: first.state.afterReplay }, recovery: { unchanged_after_reject: first.unchangedAfterReject === 1, repeated_error_stable: first.replayEqual === 1, runs_equal: JSON.stringify(first) === JSON.stringify(second) }, commands: ["node tools/run_p6_cloud_action03_recovery_smoke.mjs"], artifacts: { kernel: "docs/p6/cloud-action-03-kernel.json" }, boundaries: ["Only invalid Cloud.URL argument recovery is covered; no remote Save/Restore request is made."] };
|
|
fs.writeFileSync(path.join(root, "docs/p6/cloud-action-03-recovery.json"), `${JSON.stringify(report, null, 2)}\n`);
|
|
fs.writeFileSync(path.join(root, "docs/freecad-p6-cloud-act03-d-recovery.log"), `${JSON.stringify({ result: report.status, invalidCode: first.invalid.code, unchangedAfterReject: first.unchangedAfterReject, replayEqual: first.replayEqual })}\n`);
|
|
console.log(JSON.stringify({ result: report.status, invalidCode: first.invalid.code, unchangedAfterReject: first.unchangedAfterReject }));
|