Files
FreeCADWasmDev/freecad-source/src/WebAssembly/FreeCADCoreProbe/cloud-recovery-smoke.js
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

76 lines
3.4 KiB
JavaScript

// SPDX-License-Identifier: LGPL-2.1-or-later
const crypto = require("crypto");
const fs = require("fs");
const path = require("path");
const { pathToFileURL } = require("url");
const buildDirectory = path.resolve(process.argv[2] || "build-web/cloud-configure/bin");
async function main()
{
globalThis.__dirname = `${buildDirectory}${path.sep}`;
globalThis.require = require;
const moduleUrl = pathToFileURL(path.join(buildDirectory, "FreeCADWebCloudKernelProbe.js")).href;
const module = await import(moduleUrl);
const probe = await module.default({
wasmBinary: fs.readFileSync(path.join(buildDirectory, "FreeCADWebCloudKernelProbe.wasm")),
});
const call = (name, returnType = "number") => probe.ccall(name, returnType);
const sha256 = (value) => crypto.createHash("sha256").update(value).digest("hex");
const run = () => {
const result = {
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"),
hasError: call("fc_web_cloud_recovery_has_error"),
};
result.state.beforeSha256 = sha256(result.state.before);
result.state.afterSha256 = sha256(result.state.after);
result.state.afterReplaySha256 = sha256(result.state.afterReplay);
return result;
};
const first = run();
const second = run();
const valid = (result) => result.run === 1
&& result.error.code === ""
&& result.error.message === ""
&& result.invalid.return === 0
&& result.invalid.code === "invalid_argument"
&& result.invalid.field === "URL"
&& result.invalid.message.includes("Cloud.URL expects a string value")
&& result.state.before === result.state.after
&& result.state.after === result.state.afterReplay
&& result.state.beforeSha256 === result.state.afterSha256
&& result.state.afterSha256 === result.state.afterReplaySha256
&& result.unchangedAfterReject === 1
&& result.replayEqual === 1
&& result.recomputeCount === 2
&& result.hasError === 0;
if (!valid(first) || !valid(second) || JSON.stringify(first) !== JSON.stringify(second)) {
throw new Error(JSON.stringify({ first, second }));
}
console.log(JSON.stringify({ result: "pass", action: "recompute/recovery", runs: 2, details: first }));
}
main().catch((error) => {
console.error(error);
process.exitCode = 1;
});