35 lines
4.2 KiB
JavaScript
35 lines
4.2 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 facadePath = process.argv[2];
|
|
const build = path.resolve(process.argv[3] ?? path.join(root, "freecad-source/build-web/configure/bin"));
|
|
const facade = await import(pathToFileURL(path.resolve(facadePath)));
|
|
const envelope = await import(pathToFileURL(path.join(path.dirname(path.resolve(facadePath)), "facade-envelope.js")));
|
|
globalThis.__dirname = `${build}${path.sep}`;
|
|
globalThis.require = createRequire(import.meta.url);
|
|
const loader = await import(pathToFileURL(path.join(build, "FreeCADWebJtReaderRuntimeProbe.js")));
|
|
const kernel = await loader.default({ wasmBinary: fs.readFileSync(path.join(build, "FreeCADWebJtReaderRuntimeProbe.wasm")) });
|
|
const queue = new envelope.FacadeSerialQueue();
|
|
const trace = [];
|
|
let active = 0; let maxActive = 0;
|
|
async function dispatch(request, source = kernel) {
|
|
trace.push({ direction: "request", requestId: request.requestId });
|
|
const response = await queue.dispatch(request, async (payload, signal) => { active += 1; maxActive = Math.max(maxActive, active); try { return await facade.handleJtReaderCreateRecompute(payload, signal, source); } finally { active -= 1; } });
|
|
trace.push({ direction: "response", requestId: response.requestId, kind: response.kind }); return response;
|
|
}
|
|
const success = await dispatch(facade.createJtReaderRequest("jtreader-e-success"));
|
|
const expectedError = await dispatch(facade.createJtReaderRequest("jtreader-e-error", { ...facade.JTREADER_FIXTURE, fixtureId: "wrong" }));
|
|
const duplicate = await dispatch(facade.createJtReaderRequest("jtreader-e-success"));
|
|
const delayed = new Promise((resolve) => setTimeout(() => resolve(kernel), 0));
|
|
const cancelRequest = facade.createJtReaderRequest("jtreader-e-cancel"); const cancelPromise = dispatch(cancelRequest, delayed); const cancelAccepted = queue.cancel(envelope.createCancel("jtreader-e-cancel-msg", cancelRequest.requestId, "jtreader-doc")); const cancelled = await cancelPromise;
|
|
const afterCancel = await dispatch(facade.createJtReaderRequest("jtreader-e-after-cancel"));
|
|
assert.equal(facade.isJtReaderRequest(facade.createJtReaderRequest("schema")), true); assert.equal(success.kind, "result"); assert.equal(success.result.document.objectCount, 1); assert.equal(expectedError.error.code, "invalid_fixture"); assert.equal(duplicate.error.code, "duplicate_request"); assert.equal(cancelAccepted, true); assert.equal(cancelled.error.code, "cancelled"); assert.deepEqual(afterCancel.result, success.result); assert.equal(maxActive, 1);
|
|
const report = { schema: "freecad-web-p6-jtreader-facade/v1", taskId: "FW-P6-JTR-E", module: "JtReader", action: facade.JTREADER_COMMAND, result: "pass", envelopeSchema: "freecad-web-facade/v1", typedSchema: facade.JTREADER_ACTION_SCHEMA, fixture: { ...facade.JTREADER_FIXTURE, inputSha256: crypto.createHash("sha256").update(JSON.stringify(facade.JTREADER_FIXTURE)).digest("hex") }, responses: { success, expectedError, duplicate, cancelled, afterCancel }, trace, sequencing: { maxActive, requestCount: 5, responseCount: 5, cancelAccepted }, schemaChecks: { request: true, result: true, expectedError: true, duplicate: true, cancel: true, noNativePointers: !JSON.stringify(trace).match(/pointer|native/i) }, artifacts: { workerLog: "docs/freecad-p6-jtreader-e-facade.log" }, commands: ["npx tsc --target ES2022 --module ESNext --moduleResolution Bundler --strict --skipLibCheck --outDir <tmp> --declaration false --noEmit false src/facade-envelope.ts src/jtreader-facade.ts", "node tools/run_p6_jtreader_facade_smoke.mjs <tmp>/jtreader-facade.js freecad-source/build-web/configure/bin"] };
|
|
fs.writeFileSync(path.join(root, "docs/p6/jtreader-facade.json"), `${JSON.stringify(report, null, 2)}\n`); fs.writeFileSync(path.join(root, "docs/freecad-p6-jtreader-e-facade.log"), `${JSON.stringify({ result: report.result, maxActive, requests: 5, cancelAccepted })}\n`); console.log(JSON.stringify({ result: report.result, maxActive, requests: 5, cancelAccepted }));
|