Files
FreeCADWasmDev/tools/run_p6_cloud_action03_kernel_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

33 lines
3.8 KiB
JavaScript

#!/usr/bin/env node
import assert from "node:assert/strict";
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 buildDirectory = path.resolve(process.argv[2] || path.join(root, "freecad-source/build-web/cloud-configure-r2/bin"));
const sourceRevision = "b5a086fda59b0325fe0996147e6e9b344414f9bc";
const fixture = { module: "Cloud", entry: "src/Mod/Cloud/App/AppCloud.h", sourceRevision, readOnly: true };
globalThis.__dirname = `${buildDirectory}${path.sep}`;
globalThis.require = createRequire(import.meta.url);
const loader = await import(pathToFileURL(path.join(buildDirectory, "FreeCADWebCloudKernelProbe.js")).href);
const kernel = await loader.default({ wasmBinary: fs.readFileSync(path.join(buildDirectory, "FreeCADWebCloudKernelProbe.wasm")) });
const call = (name, type = "number", argTypes = [], args = []) => kernel.ccall(name, type, argTypes, args);
const run = (revision) => {
const result = { run: call("fc_web_cloud_python_api", "number", ["string"], [revision]), sourceRevision: call("fc_web_cloud_python_source_revision", "string"), summary: call("fc_web_cloud_python_summary", "string"), apiCount: call("fc_web_cloud_python_api_count"), callableCount: call("fc_web_cloud_python_callable_count"), moduleHandleAfterRelease: call("fc_web_cloud_python_module_handle_after_release"), documentsBefore: call("fc_web_cloud_python_document_count_before"), documentsAfter: call("fc_web_cloud_python_document_count_after") };
if (result.run !== 1) result.error = { code: call("fc_web_cloud_python_error_code", "string"), field: call("fc_web_cloud_python_error_field", "string"), message: call("fc_web_cloud_python_error_message", "string") };
return result;
};
const success = run(sourceRevision);
const invalid = run("wrong-revision");
const repeated = run(sourceRevision);
assert.equal(success.run, 1); assert.equal(success.apiCount, 8); assert.equal(success.callableCount, 8); assert.equal(success.moduleHandleAfterRelease, 0); assert.equal(success.documentsBefore, success.documentsAfter);
assert.equal(invalid.run, 0); assert.equal(invalid.error.code, "revision_mismatch"); assert.equal(invalid.error.field, "sourceRevision");
assert.deepEqual(repeated, success);
const report = { schema: "freecad-web-p6-cloud-action-03-kernel/v1", task_id: "FW-P6-CLD-ACT-03-C", module: "Cloud", action: "python-api", status: "pass", source_revision: sourceRevision, fixture: { ...fixture, input_sha256: crypto.createHash("sha256").update(JSON.stringify(fixture)).digest("hex") }, result: { success, invalid, repeated, result_sha256: crypto.createHash("sha256").update(JSON.stringify(success)).digest("hex") }, resources: { module_handle_after_release: success.moduleHandleAfterRelease, documents_unchanged: success.documentsBefore === success.documentsAfter }, commands: ["EM_CONFIG=$PWD/freecad-source/build-web/emscripten-config.py cmake --build freecad-source/build-web/cloud-configure-r2 --target FreeCADWebCloudKernelProbe -j 8", "node tools/run_p6_cloud_action03_kernel_smoke.mjs"], artifacts: { wasm: "freecad-source/build-web/cloud-configure-r2/bin/FreeCADWebCloudKernelProbe.wasm" }, boundaries: ["Only the eight Cloud App Python entry points are inspected; Save/Restore network transfer is not executed."] };
fs.writeFileSync(path.join(root, "docs/p6/cloud-action-03-kernel.json"), `${JSON.stringify(report, null, 2)}\n`);
fs.writeFileSync(path.join(root, "docs/freecad-p6-cloud-act03-c-kernel.log"), `${JSON.stringify({ result: report.status, apiCount: success.apiCount, invalidCode: invalid.error.code, resourcesReleased: true })}\n`);
console.log(JSON.stringify({ result: report.status, apiCount: success.apiCount, invalidCode: invalid.error.code }));