55 lines
3.4 KiB
JavaScript
55 lines
3.4 KiB
JavaScript
#!/usr/bin/env node
|
|
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 docs = path.join(root, "docs/p6");
|
|
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, "FreeCADWebMeshRuntimeProbe.js")));
|
|
const kernel = await loader.default({ wasmBinary: fs.readFileSync(path.join(build, "FreeCADWebMeshRuntimeProbe.wasm")) });
|
|
const call = (name, type = "number", argTypes = [], args = []) => kernel.ccall(name, type, argTypes, args);
|
|
const valid = () => ({
|
|
returnCode: call("fc_web_mesh_create_recompute"),
|
|
objectType: call("fc_web_mesh_kernel_object_type", "string"),
|
|
facets: call("fc_web_mesh_kernel_facets"),
|
|
points: call("fc_web_mesh_kernel_points"),
|
|
resourcesReleased: call("fc_web_mesh_kernel_resources_released"),
|
|
});
|
|
const invalid = () => ({
|
|
returnCode: call("fc_web_mesh_type_probe", "number", ["string"], ["Mesh::MissingType"]),
|
|
code: call("fc_web_mesh_error_code", "string"),
|
|
message: call("fc_web_mesh_error_message", "string"),
|
|
});
|
|
const baseline = valid();
|
|
const rejected = invalid();
|
|
const repeatedReject = invalid();
|
|
const recovered = valid();
|
|
const beforeHash = crypto.createHash("sha256").update(JSON.stringify(baseline)).digest("hex");
|
|
const recoveredHash = crypto.createHash("sha256").update(JSON.stringify(recovered)).digest("hex");
|
|
const report = {
|
|
schema: "freecad-web-p6-mesh-recovery/v1",
|
|
taskId: "FW-P6-MSH-D",
|
|
module: "Mesh",
|
|
action: "create/recompute",
|
|
result: baseline.returnCode === 1 && rejected.returnCode === 0 && repeatedReject.returnCode === 0 && recovered.returnCode === 1 && rejected.code === "type_not_found" && repeatedReject.code === rejected.code && beforeHash === recoveredHash ? "pass" : "fail",
|
|
invalidInput: { field: "typeName", value: "Mesh::MissingType", inputSha256: crypto.createHash("sha256").update("Mesh::MissingType").digest("hex") },
|
|
baseline,
|
|
rejected,
|
|
repeatedReject,
|
|
recovered,
|
|
recovery: { unchangedAfterReject: beforeHash === recoveredHash, repeatedErrorStable: rejected.code === repeatedReject.code && rejected.message === repeatedReject.message, resourcesReleased: recovered.resourcesReleased === 1 },
|
|
state: { beforeSha256: beforeHash, afterRecoverySha256: recoveredHash },
|
|
commands: ["node tools/run_p6_mesh_recovery_smoke.mjs freecad-source/build-web/configure/bin"],
|
|
artifacts: { kernel: "docs/p6/mesh-kernel.json", workerLog: "docs/freecad-p6-mesh-d-recovery.log" },
|
|
boundaries: ["Unsupported Mesh type is rejected without changing the valid triangle fixture; no concurrent document mutation is covered."],
|
|
};
|
|
if (report.result !== "pass") throw new Error(JSON.stringify(report));
|
|
fs.writeFileSync(path.join(docs, "mesh-recovery.json"), `${JSON.stringify(report, null, 2)}\n`);
|
|
fs.writeFileSync(path.join(root, "docs/freecad-p6-mesh-d-recovery.log"), `${JSON.stringify({ result: report.result, rejectedCode: rejected.code, unchangedAfterReject: report.recovery.unchangedAfterReject, resourcesReleased: report.recovery.resourcesReleased })}\n`);
|
|
console.log(JSON.stringify({ result: report.result, rejectedCode: rejected.code, unchangedAfterReject: report.recovery.unchangedAfterReject }));
|