import assert from 'node:assert/strict'; import {readFileSync} from 'node:fs'; import {join} from 'node:path'; import {hashAt,frozenSnapshot} from './boot-contract-report.mjs'; import {filesIn} from './entry-extension.mjs'; import {runqueueGuestServicesInputs} from './runqueue-guest-services-sources.mjs'; import {runqueueGuestServicesTestSources} from './runqueue-guest-services-fixture.mjs'; export const servicesTests=['actual_return_abort_preserves_fifo_epoch_and_retained_members','actual_three_members_cycle_fifo_without_duplicating_an_owner','after_depart_quarantines_real_prepared_and_three_stack_owners','before_depart_preserves_real_lookup_and_all_owner_bytes','completion_publishes_only_after_real_dead_and_bootstrap_landing','constructor_refusal_returns_the_same_three_real_owners','failed_abort_keeps_the_actual_prepared_token_inside_owned_backend','failed_finish_retains_real_completion_prepared_and_old_queue_active','failed_tick_is_retained_before_bounded_park','finish_exit_refuses_an_unobserved_real_completion_token','issuer_ordinal_and_actual_handle_are_private_and_checked','narrow_retirement_consumes_only_the_actual_withdrawn_member','narrow_retirement_context_refusal_returns_the_exact_live_member','real_sleeping_member_stays_off_fifo_with_actual_wait_retained','retirement_failure_returns_actual_member_and_never_returns_stack_pages','service_gate_precedes_every_actual_table_or_stack_observation','successful_release_context_drift_quarantines_logical_member_without_fake_binding','tick_observer_refuses_foreign_issuer_and_consumes_one_actual_receipt']; const backend='scripts/os-acceptance/k1060-runqueue-backend.rs',bridge='scripts/os-acceptance/k1060-runqueue-context-services.rs'; export const servicesMutants=[ {id:'private-issuer-skipped',path:backend,needle:'if member.identity != self.identity',replacement:'if false',test:'issuer_ordinal_and_actual_handle_are_private_and_checked'}, {id:'private-ordinal-skipped',path:backend,needle:'|| self.members[member.ordinal] != Some(member.context)',replacement:'|| false',test:'issuer_ordinal_and_actual_handle_are_private_and_checked'}, {id:'same-handle-issued-twice',path:backend,needle:'|| self.members.contains(&Some(handle))',replacement:'|| false',test:'issuer_ordinal_and_actual_handle_are_private_and_checked'}, {id:'constructor-cpu-skipped',path:backend,needle:'if e.cpu != 0',replacement:'if false',test:'constructor_refusal_returns_the_same_three_real_owners'}, {id:'bridge-gate-skipped',path:bridge,needle:'if e.cpu != bank.cpu\n || e.daif & IRQ == 0\n || e.daif & !0x3c0 != 0\n || e.in_irq\n || !e.fp_enabled\n || e.critical_depth != 0\n || !e.safe_point',replacement:'if false',test:'service_gate_precedes_every_actual_table_or_stack_observation'}, {id:'before-token-discarded',path:backend,needle:'Err(os_k1060_context::HandoffFailure::Before(_, t)) => {\n p.handoff = Some(t);',replacement:'Err(os_k1060_context::HandoffFailure::Before(_, t)) => {\n let _discarded=t;',all:3,test:'before_depart_preserves_real_lookup_and_all_owner_bytes'}, {id:'after-phase-relabeled-before',path:backend,needle:'phase: os_k1060_context::FailurePhase::AfterSwitch,',replacement:'phase: os_k1060_context::FailurePhase::BeforeSwitch,',all:2,test:'after_depart_quarantines_real_prepared_and_three_stack_owners'}, {id:'failed-tick-discarded',path:backend,needle:'self.failed_tick = Some(actual);',replacement:'let _discarded=actual;',test:'failed_tick_is_retained_before_bounded_park'}, {id:'unobserved-return-finish',path:backend,needle:'if !p.observed {',replacement:'if false {',test:'finish_exit_refuses_an_unobserved_real_completion_token'}, {id:'retired-member-not-cleared',path:backend,needle:'self.members[m.ordinal] = None;',replacement:'let _still_issued=m.ordinal;',test:'narrow_retirement_consumes_only_the_actual_withdrawn_member'}, {id:'full-postrelease-observation-skipped',path:backend,needle:'if after != before {',replacement:'if false {',test:'successful_release_context_drift_quarantines_logical_member_without_fake_binding'}, {id:'postrelease-backend-quarantine-skipped',path:backend,needle:'self.retirement_quarantined = true;',replacement:'self.retirement_quarantined = false;',test:'successful_release_context_drift_quarantines_logical_member_without_fake_binding'}, {id:'retired-logical-marker-skipped',path:backend,needle:'m.retired = true;',replacement:'m.retired = false;',test:'successful_release_context_drift_quarantines_logical_member_without_fake_binding'}, {id:'postrelease-queue-quarantine-skipped',path:'scripts/os-acceptance/k1060-runqueue-retirement.rs',needle:'self.faulted = true;',replacement:'self.faulted = false;',all:2,test:'successful_release_context_drift_quarantines_logical_member_without_fake_binding'}, ]; const scripts=['runqueue-guest-services-release.rs','runqueue-guest-services-fixture.mjs','runqueue-guest-services-tests.rs','runqueue-guest-services-host-report.mjs','runqueue-guest-services-host.mjs','runqueue-guest-services-test-host-report.mjs']; const extra=['os-runqueue-return/tests/context-model.rs','os-context-switch/tests/support/mod.rs']; export const servicesInputs=root=>[...new Set([...runqueueGuestServicesInputs(root).map(r=>r.path),...extra,...scripts.map(p=>'scripts/os-acceptance/'+p)])].sort().map(path=>({path,sha256:hashAt(root,path)})); const lock='# This file is automatically @generated by Cargo.\n# It is not intended for manual editing.\nversion = 4\n\n[[package]]\nname = "turkos-os-exceptions"\nversion = "0.1.0"\n\n[[package]]\nname = "turkos-os-runqueue-guest-services"\nversion = "0.1.0"\ndependencies = [\n "turkos-os-exceptions",\n "turkos-os-threads",\n]\n\n[[package]]\nname = "turkos-os-threads"\nversion = "0.1.0"\n'; export const servicesBoundary='HOST_PREPARED actual frozen Table<_,3>/ContextBank<_,3>/AsyncBank<_,3>/CompletionBank<_,3>/Queue APIs with three independently owned host stack byte arrays. CPU, DAIF, roots, timer delivery and register landings remain MODELED_ONLY. Eighteen tests execute the NEW actual generic backend, gated services and narrow withdrawn-member retirement; source-bound fixtures adapt only capacities/imports, immutable timer receipt fields and a preflighted actual Table.reap adapter. No kernel Image/ELF, VM, physical central ownership or numeric1045/1050/1055/1060 acceptance is claimed. Whole backend/Prepared/member/tick ownership is retained on refusal or quarantine. Clippy targets the own library and actual integration test explicitly; obsolete incompatible private fixture namespaces embedded in frozen prefixes are not newly claimed.'; export function servicesSources(root,spec=null){const read=p=>readFileSync(join(root,p),'utf8'),overrides=new Map();if(spec){let s=read(spec.path);assert.equal(s.split(spec.needle).length,(spec.all??1)+1,spec.id);overrides.set(spec.path,spec.all?s.replaceAll(spec.needle,spec.replacement):s.replace(spec.needle,spec.replacement));}const map=new Map();for(const[p,s]of runqueueGuestServicesTestSources(root,overrides))map.set('os-runqueue-guest-services/'+p,Buffer.from(s));map.set('os-runqueue-guest-services/Cargo.lock',Buffer.from(lock));for(const dep of['os-threads','os-exceptions'])for(const p of filesIn(root,dep))map.set(p,readFileSync(join(root,p)));map.set('.cargo/config.toml',readFileSync(join(root,'.cargo/config.toml')));for(const r of servicesInputs(root))map.set('bound-inputs/'+r.path,Buffer.from(overrides.get(r.path)??readFileSync(join(root,r.path))));return new Map([...map].sort(([a],[b])=>a.localeCompare(b)));} export function inspectRunqueueGuestServicesHost(report,root){ assert.equal(report.schema,'turkos-runqueue-guest-services-host/v1');assert.equal(report.status,'HOST_PREPARED');assert.equal(report.measurementScope,'MODELED_ONLY');assert.equal(report.guestAccepted,false);assert.equal(report.kernelElfBound,false);assert.equal(report.arm64Status,'CHECK_ONLY');assert.equal(report.hostTests,18);assert.equal(report.boundary,servicesBoundary);assert.deepEqual(report.localMoves,[]);assert.deepEqual(report.pending,[1045,1050,1055,1060]);assert.match(report.runDirectory,/^reports\/os-implementation\/K1060-services-preparation-[A-Za-z0-9_-]+$/);assert.deepEqual(report.inputsBefore,servicesInputs(root));assert.deepEqual(report.inputsAfter,report.inputsBefore);assert.deepEqual(report.protectedBefore,frozenSnapshot(root));assert.deepEqual(report.protectedAfter,report.protectedBefore); const read=a=>{assert.ok(a.path.startsWith(report.runDirectory+'/')&&!a.path.split('/').some(p=>['.','..',''].includes(p)));assert.equal(hashAt(root,a.path),a.sha256);return readFileSync(join(root,a.path));}; const source=(actual,expected,prefix)=>{assert.deepEqual(actual.map(a=>a.originalPath),[...expected.keys()]);assert.deepEqual(filesIn(root,prefix).sort(),actual.map(a=>a.path).sort());for(const a of actual){assert.equal(a.path,prefix+'/'+a.originalPath);assert.deepEqual(read(a),expected.get(a.originalPath));}}; source(report.sources,servicesSources(root),report.runDirectory+'/sources');assert.deepEqual(report.commands.map(c=>c.id),['tests','arm64','format','clippy']); const args=prefix=>['--manifest-path',`/${prefix}/os-runqueue-guest-services/Cargo.toml`,'--locked','--offline']; const format=['k1060-runqueue-context-services.rs','k1060-runqueue-backend.rs','k1060-runqueue-retirement.rs','runqueue-guest-services-tests.rs','runqueue-guest-services-release.rs']; const expected=[['test',...args(report.runDirectory+'/sources'),'--test','services','--target','aarch64-apple-darwin','--','--test-threads=1'],['check',...args(report.runDirectory+'/sources'),'--lib','--target','aarch64-unknown-none'],['--config','skip_children=true','--edition','2024','--check',...format.map(p=>`/${report.runDirectory}/sources/bound-inputs/scripts/os-acceptance/${p}`)],['clippy',...args(report.runDirectory+'/sources'),'--lib','--test','services','--target','aarch64-apple-darwin','--','-D','warnings']]; for(const[i,c]of report.commands.entries()){assert.equal(c.exitCode,0);assert.equal(c.executable,i===2?'rustfmt':'cargo');assert.equal(c.targetDirectory,`/${report.runDirectory}/target`);assert.deepEqual(c.argv,expected[i]);const log=read(c.log).toString();assert.doesNotMatch(log,/error\[E\d+\]|could not compile/);if(i===0){assert.match(log,/running 18 tests/);assert.match(log,/test result: ok\. 18 passed; 0 failed/);for(const n of servicesTests)assert.ok(log.includes(`test ${n} ... ok`),n);}else if(i!==2)assert.match(log,/Finished `dev` profile/);} assert.equal(report.mutants.length,servicesMutants.length);for(const[i,m]of report.mutants.entries()){const spec=servicesMutants[i];for(const[k,v]of Object.entries(spec))assert.deepEqual(m[k],v);const prefix=report.runDirectory+'/mutant-'+spec.id+'/sources';source(m.sources,servicesSources(root,spec),prefix);assert.equal(m.source.path,prefix+'/bound-inputs/'+spec.path);assert.deepEqual(read(m.source),servicesSources(root,spec).get('bound-inputs/'+spec.path));assert.equal(m.exitCode,101);assert.equal(m.executable,'cargo');assert.equal(m.targetDirectory,`/${report.runDirectory}/target`);assert.deepEqual(m.argv,['test',...args(prefix),'--test','services','--target','aarch64-apple-darwin',spec.test,'--','--exact','--test-threads=1']);const log=read(m.log).toString();assert.doesNotMatch(log,/error\[E\d+\]|could not compile|signal: \d/);assert.match(log,/running 1 test/);assert.match(log,/test result: FAILED\. 0 passed; 1 failed/);assert.ok(log.includes(`test ${spec.test} ... FAILED`));assert.ok(log.includes('panicked at'));} return{hostTests:18,compiledKilledMutants:servicesMutants.length,guestAccepted:false,measurementScope:'MODELED_ONLY',kernelElfBound:false,pending:report.pending}; }