Files
FreeCADWasmDev/tools/run_p6_part_facade_smoke.mjs
wangdequan 9a7c4f0335 Save FreeCAD Web workspace sources and user validation evidence
IFC native binding remains incomplete; preserve accurate test results.
2026-09-15 22:01:58 +08:00

4 lines
2.5 KiB
JavaScript

#!/usr/bin/env node
import crypto from "node:crypto"; import fs from "node:fs"; import path from "node:path"; import { Worker } from "node:worker_threads"; import { fileURLToPath, pathToFileURL } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), ".."); const build = path.resolve(process.argv[2] || path.join(root, "freecad-source/build-web/configure/bin")); const out = path.resolve(process.argv[3] || "/tmp/freecad-p6-part-facade"); const recv = (w) => new Promise((resolve, reject) => { const m = (x) => { w.off("error", reject); resolve(x); }; w.once("message", m); w.once("error", reject); }); const w = new Worker(path.join(root, "tools/part-facade-smoke-worker.mjs"), { workerData: { buildDirectory: build, facadePath: pathToFileURL(path.join(out, "part-facade.js")).href, envelopePath: pathToFileURL(path.join(out, "facade-envelope.js")).href } }); const facade = await import(pathToFileURL(path.join(out, "part-facade.js"))); const envelope = await import(pathToFileURL(path.join(out, "facade-envelope.js"))); const ready = await recv(w); const successReq = facade.createPartRequest("part-success-1"); w.postMessage(successReq); const success = await recv(w); w.postMessage(facade.createPartRequest("part-error-1", { ...facade.PART_FIXTURE, dimensions: [0, 3, 4] })); const expectedError = await recv(w); w.postMessage(successReq); const duplicate = await recv(w); const cancelReq = facade.createPartRequest("part-cancel-1"); const cancelledP = new Promise((resolve, reject) => { const m = (x) => { if (x.requestId === cancelReq.requestId) { w.off("error", reject); resolve(x); } }; w.on("message", m); w.once("error", reject); }); w.postMessage(cancelReq); w.postMessage(envelope.createCancel("part-cancel-control", cancelReq.requestId)); const cancelled = await cancelledP; await w.terminate(); const trace = [ready, success, expectedError, duplicate, cancelled]; const result = { schema: "freecad-web-part-facade-smoke/v1", envelopeSchema: envelope.FACADE_SCHEMA, ready, success, expectedError, duplicate, cancelled, traceSha256: crypto.createHash("sha256").update(JSON.stringify(trace)).digest("hex") }; if (ready.kind !== "ready" || success.kind !== "result" || success.result.volume < 23.9 || expectedError.error.code !== "invalid_fixture" || duplicate.error.code !== "duplicate_request" || cancelled.error.code !== "cancelled") throw new Error(JSON.stringify(result)); const output = process.env.P6_FACADE_OUTPUT; if (output) fs.writeFileSync(output, `${JSON.stringify(result, null, 2)}\n`); console.log(JSON.stringify(result));