import assert from 'node:assert/strict'; import {readFileSync} from 'node:fs'; import {join} from 'node:path'; import {waitServicesSources,waitServicesInputs} from './wait-guest-services-host-report.mjs'; import {hashAt} from './boot-contract-report.mjs'; const read=(root,path)=>readFileSync(join(root,path),'utf8'); const own=['main-tests.rs','main-fixture.mjs','main-host.mjs','main-host-report.mjs','main-mutants.mjs','main-test-report.mjs']; export const k1080WaitMainInputs=root=>[...waitServicesInputs(root),...['bridge-main.rs','core-main.rs',...own].map(n=>({path:'scripts/os-acceptance/k1080-wait-'+n,sha256:hashAt(root,'scripts/os-acceptance/k1080-wait-'+n)}))].sort((a,b)=>a.path.localeCompare(b.path)); export function k1080WaitMainSources(root,edit=null) { const map=new Map();for(const[p,b]of waitServicesSources(root)) { if(p.startsWith('os-wait-guest-services/')) { map.set(p.replace('os-wait-guest-services/','os-k1080-wait-main/'),Buffer.from(b.toString().replaceAll('turkos_os_wait_guest_services','turkos_os_k1080_wait_main').replaceAll('turkos-os-wait-guest-services','turkos-os-k1080-wait-main'))); } else {map.set(p,b);} } const helper=n=>{let s=read(root,'scripts/os-acceptance/k1080-wait-'+n);if(edit)for(const item of[edit,...(edit.extra??[])])if(item.path==='scripts/os-acceptance/k1080-wait-'+n){assert.equal(s.split(item.needle).length,(item.all??1)+1,edit.id);s=item.all?s.replaceAll(item.needle,item.replacement):s.replace(item.needle,item.replacement);}return s;}; for(const p of['src/context.rs','src/runqueue.rs','src/bridge.rs','src/backend.rs','src/ingress.rs']) { const at='os-k1080-wait-main/'+p;map.set(at,Buffer.from(map.get(at).toString().replaceAll('turkos_os_thread_wait::thread_wait','crate::wait_core'))); } let bridge=map.get('os-k1080-wait-main/src/bridge.rs').toString()+'\n'+helper('bridge-main.rs').replaceAll('q.os_k1080_retire_withdrawn','q.os_k1060_retire_withdrawn'); map.set('os-k1080-wait-main/src/bridge.rs',Buffer.from(bridge)); map.set('os-k1080-wait-main/src/wait_core.rs',Buffer.from(read(root,'os-thread-wait/src/thread_wait.rs')+'\n'+helper('core-main.rs'))); const lib=map.get('os-k1080-wait-main/src/lib.rs').toString()+'\npub mod wait_core;\npub mod runtime { pub use crate::{context as wait_context,runqueue as wait_queue,bridge as wait_bridge}; pub use turkos_os_threads::threads as wait_threads;}\n'; map.set('os-k1080-wait-main/src/lib.rs',Buffer.from(lib)); // The ingress and test backend use the same exact copied frozen WaitSet. for(const p of['tests/backend-under-test.rs','tests/services.rs']) { const at='os-k1080-wait-main/'+p;map.set(at,Buffer.from(map.get(at).toString().replaceAll('turkos_os_thread_wait::thread_wait','turkos_os_k1080_wait_main::wait_core'))); } const test='os-k1080-wait-main/tests/services.rs';map.set(test,Buffer.from(map.get(test).toString()+'\n'+helper('main-tests.rs'))); const model='os-k1080-wait-main/tests/context-model.rs';let s=map.get(model).toString(); assert.equal(s.split('pub(crate) logical_departed:bool,').length,2); map.set(model,Buffer.from(s.replace('pub(crate) logical_departed:bool,','pub(crate) logical_departed:bool,\n pub(crate) main_wire_drift:u8,'))); // Keep the frozen dependency lock identities and replace only the NEW crate. const lock='os-k1080-wait-main/Cargo.lock';map.set(lock,Buffer.from(map.get(lock).toString().replaceAll('turkos-os-wait-guest-services','turkos-os-k1080-wait-main'))); for(const r of k1080WaitMainInputs(root)) map.set('bound-inputs/'+r.path,Buffer.from(edit&&[edit,...(edit.extra??[])].some(e=>e.path===r.path)?helper(r.path.split('k1080-wait-')[1]):readFileSync(join(root,r.path)))); return new Map([...map].sort(([a],[b])=>a.localeCompare(b))); }