import assert from 'node:assert/strict'; import {readFileSync,writeFileSync,mkdtempSync} from 'node:fs'; import {join,dirname,relative} from 'node:path'; import {inspectRunqueueGuestServicesHost} from './runqueue-guest-services-host-report.mjs'; import {hashAt} from './boot-contract-report.mjs'; const root=process.cwd();assert.equal(process.argv.length,3);const path=process.argv[2],original=JSON.parse(readFileSync(join(root,path),'utf8'));inspectRunqueueGuestServicesHost(original,root); const directory=mkdtempSync(join(dirname(join(root,path)),'damaged-host-controls-'));let count=0; const reject=(name,edit)=>{const r=structuredClone(original);edit(r);assert.throws(()=>inspectRunqueueGuestServicesHost(r,root),name);count++;}; reject('false-guest',r=>r.guestAccepted=true);reject('false-kernel-elf',r=>r.kernelElfBound=true);reject('false-hardware-scope',r=>r.measurementScope='ACTUAL_CPU');reject('wrong-tests',r=>r.hostTests++);reject('ARM-rlib',r=>r.arm64Status='RLIB_BUILT');reject('pending-omitted',r=>r.pending=[]);reject('local-numeric',r=>r.localMoves=[1045]);reject('stale-input',r=>r.inputsBefore[0].sha256='0'.repeat(64));reject('input-omitted',r=>r.inputsBefore.pop());reject('source-omitted',r=>r.sources.pop());reject('source-order',r=>r.sources.reverse());reject('mutant-omitted',r=>r.mutants.pop());reject('mutant-unbound-source',r=>r.mutants[0].source=r.sources[0]);reject('mutant-unrelated-manifest',r=>r.mutants[0].sources=r.mutants[1].sources);reject('mutant-zero-exit',r=>r.mutants[0].exitCode=0);reject('wrong-selected-test',r=>r.mutants[0].argv[r.mutants[0].argv.length-4]='unrelated');reject('compile-failure-log',r=>r.mutants[0].log=r.commands[1].log);reject('format-bypass',r=>r.commands[2].argv=[]);reject('clippy-target-bypass',r=>r.commands[3].argv=[]);reject('command-omitted',r=>r.commands.pop()); const result={schema:'turkos-runqueue-guest-services-host-controls/v1',status:'ALL_REJECTED',parent:{path,sha256:hashAt(root,path)},damagedControls:count,guestAccepted:false};const out=join(directory,'report.json');writeFileSync(out,JSON.stringify(result,null,2)+'\n');console.log('RUNQUEUE SERVICES '+count+' REJECTED '+relative(root,out));