4 lines
3.9 KiB
JavaScript
4 lines
3.9 KiB
JavaScript
#!/usr/bin/env node
|
|
import crypto from "node:crypto"; import assert from "node:assert/strict"; 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 build = path.resolve(process.argv[2] ?? path.join(root, "freecad-source/build-web/configure/bin")); globalThis.__dirname = `${build}${path.sep}`; globalThis.require = createRequire(import.meta.url); const loader = await import(pathToFileURL(path.join(build, "FreeCADWebMaterialKernelProbe.js"))); const kernel = await loader.default({ wasmBinary: fs.readFileSync(path.join(build, "FreeCADWebMaterialKernelProbe.wasm")) }); const c = (name, type = "number") => kernel.ccall(name, type); const run = () => ({ run: c("fc_web_material_persistence_recovery"), invalid: { return: c("fc_web_material_persistence_recovery_invalid_return"), code: c("fc_web_material_persistence_recovery_error_code", "string"), message: c("fc_web_material_persistence_recovery_error_message", "string") }, state: { before: c("fc_web_material_persistence_recovery_state_before", "string"), afterReject: c("fc_web_material_persistence_recovery_state_after_reject", "string"), afterRecovery: c("fc_web_material_persistence_recovery_state_after_recovery", "string") }, unchangedAfterReject: c("fc_web_material_persistence_recovery_unchanged_after_reject"), replayEqual: c("fc_web_material_persistence_recovery_replay_equal"), resourcesReleased: c("fc_web_material_persistence_recovery_resources_released") }); const first = run(); const second = run(); const hash = (value) => crypto.createHash("sha256").update(value).digest("hex"); assert.equal(first.run, 1); assert.equal(first.invalid.return, 0); assert.equal(first.invalid.code, "missing_resource"); assert.match(first.invalid.message, /MaterialMissingResource/); assert.equal(first.unchangedAfterReject, 1); assert.equal(first.replayEqual, 1); assert.equal(first.resourcesReleased, 1); assert.equal(first.state.before, first.state.afterReject); assert.equal(first.state.before, first.state.afterRecovery); assert.deepEqual(second, first); const report = { schema: "freecad-web-p6-material-action-04-recovery/v1", taskId: "FW-P6-MAT-ACT-04-D", module: "Material", action: "save/reopen", result: "pass", invalidInput: { kind: "missing_resource", path: "/tmp/MaterialMissingResource.FCStd", inputSha256: crypto.createHash("sha256").update("/tmp/MaterialMissingResource.FCStd").digest("hex") }, baseline: first.state.before, rejected: first.invalid, recovered: first.state.afterRecovery, recovery: { unchangedAfterReject: first.unchangedAfterReject === 1, repeatedErrorStable: first.replayEqual === 1, repeatedRunStable: JSON.stringify(first) === JSON.stringify(second), resourcesReleased: first.resourcesReleased === 1 }, state: { beforeSha256: hash(first.state.before), afterRejectSha256: hash(first.state.afterReject), afterRecoverySha256: hash(first.state.afterRecovery) }, commands: ["node tools/run_p6_material_action04_recovery_smoke.mjs freecad-source/build-web/configure/bin"], artifacts: { kernel: "docs/p6/material-action-04-kernel.json", workerLog: "docs/freecad-p6-material-action-04-d-recovery.log" }, boundaries: ["Material UUID/name metadata recovery is covered; Materials::PropertyMaterial library restore remains explicitly excluded."] }; fs.writeFileSync(path.join(root, "docs/p6/material-action-04-recovery.json"), `${JSON.stringify(report, null, 2)}\n`); fs.writeFileSync(path.join(root, "docs/freecad-p6-material-action-04-d-recovery.log"), `${JSON.stringify({ result: report.result, invalidCode: first.invalid.code, unchangedAfterReject: report.recovery.unchangedAfterReject, replayEqual: report.recovery.repeatedErrorStable })}\n`); console.log(JSON.stringify({ result: report.result, invalidCode: first.invalid.code, unchangedAfterReject: report.recovery.unchangedAfterReject }));
|