76 lines
3.4 KiB
JavaScript
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;
|
|
});
|