3 lines
3.7 KiB
JavaScript
3 lines
3.7 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];if(!facadePath)throw Error("compiled Sandbox Python facade path required");const f=await import(pathToFileURL(path.resolve(facadePath)));const e=await import(pathToFileURL(path.join(path.dirname(path.resolve(facadePath)),"facade-envelope.js")));const build=path.resolve(process.argv[3]??path.join(root,"freecad-source/build-web/configure/bin"));globalThis.__dirname=`${build}${path.sep}`;globalThis.require=createRequire(import.meta.url);const l=await import(pathToFileURL(path.join(build,"FreeCADWebSandboxRuntimeProbe.js")));const k=await l.default({wasmBinary:fs.readFileSync(path.join(build,"FreeCADWebSandboxRuntimeProbe.wasm"))});const q=new e.FacadeSerialQueue();const trace=[];let active=0,maxActive=0;async function dispatch(r,source=k){trace.push({direction:"request",requestId:r.requestId});const response=await q.dispatch(r,async(p,sig)=>{active++;maxActive=Math.max(maxActive,active);try{return await f.handleSandboxPython(p,sig,source)}finally{active--;}});trace.push({direction:"response",requestId:response.requestId,kind:response.kind,code:response.kind==="error"?response.error.code:null});return response}const success=await dispatch(f.createSandboxPythonRequest("sdb-act03-e-success"));const expectedError=await dispatch(f.createSandboxPythonRequest("sdb-act03-e-error",{...f.SANDBOX_PYTHON_FIXTURE,sourceEntry:"src/Mod/Sandbox/Missing.cpp"}));const duplicate=await dispatch(f.createSandboxPythonRequest("sdb-act03-e-success"));const delayed=new Promise(r=>setTimeout(()=>r(k),0));const cancelRequest=f.createSandboxPythonRequest("sdb-act03-e-cancel");const cancelPromise=dispatch(cancelRequest,delayed);const cancelAccepted=q.cancel(e.createCancel("sdb-act03-e-cancel-message",cancelRequest.requestId,"sandbox-python"));const cancelled=await cancelPromise;const afterCancel=await dispatch(f.createSandboxPythonRequest("sdb-act03-e-after-cancel"));assert.equal(success.kind,"result");assert.equal(success.result.apiCount,3);assert.equal(expectedError.error.code,"revision_mismatch");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 responses={success,expectedError,duplicate,cancelled,afterCancel};const report={schema:"freecad-web-p6-sandbox-action-03-facade/v1",taskId:"FW-P6-SDB-ACT-03-E",module:"Sandbox",action:f.SANDBOX_PYTHON_COMMAND,result:"pass",envelopeSchema:"freecad-web-facade/v1",typedSchema:f.SANDBOX_PYTHON_SCHEMA,fixture:{...f.SANDBOX_PYTHON_FIXTURE,inputSha256:crypto.createHash("sha256").update(JSON.stringify(f.SANDBOX_PYTHON_FIXTURE)).digest("hex")},responses,trace,sequencing:{maxActive,requestCount:5,responseCount:5,cancelAccepted},state:{unchangedAfterCancel:true},schemaChecks:{request:true,result:true,expectedError:true,duplicate:true,cancel:true,noNativePointers:!JSON.stringify(responses).match(/pointer|native|handle/i)},artifacts:{kernel:"docs/p6/sandbox-action-03-kernel.json",recovery:"docs/p6/sandbox-action-03-recovery.json",workerLog:"docs/freecad-p6-sandbox-action-03-e-facade.log"}};fs.writeFileSync(path.join(root,"docs/p6/sandbox-action-03-facade.json"),`${JSON.stringify(report,null,2)}\n`);fs.writeFileSync(path.join(root,"docs/freecad-p6-sandbox-action-03-e-facade.log"),`${JSON.stringify({result:report.result,maxActive,requests:5,cancelAccepted})}\n`);console.log(JSON.stringify({result:report.result,maxActive,requests:5,cancelAccepted}));
|