code wiki / _hdl_build / nx_doctor_queue_gate.nx
nx_doctor_queue_gate.nx source
↩ module page · 59 lines · 3683 B
1// nx_doctor_queue_gate.nx -- SOVEREIGN gate for the Doctor's serialized fix intake (doc_pump).
2// T1 pump processes both PENDING fixes (count=2)
3// T2 the APPLICABLE fix is applied (target rewritten)
4// T3 the queue lines are flipped: APPLIED for fix1, CONFLICT for fix2 (region absent -> refused, no clobber)
5// T4 idempotent: a second pump processes 0 (no PENDING left)
6// license_tier: ORIGINAL
7import "nx_syscalls.nx"
8import "nx_doctor_apply.nx" // da_read / da_slen / DA_CAP
9import "nx_doctor_queue.nx" // doc_pump
10
11const GQ_TGT: *u8 = "/tmp/dq_tgt"
12const GQ_Q: *u8 = "/tmp/dq_queue"
13const GQ_LED: *u8 = "/tmp/dq_ledger"
14
15func gq_uw(s: *u8) -> i64 { sys_write(1, s, da_slen(s)); return 0 }
16func gq_wn(v: i64) -> i64 { let b: *u8=sys_mmap(24); var m: i64=v; var k: i64=0; if m==0{b[0]=48 as u8;k=1} let t: *u8=sys_mmap(24); while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var o: *u8=sys_mmap(24); var w: i64=0; var q: i64=k-1; while q>=0{o[w]=t[q];w=w+1;q=q-1} sys_write(1,o,w); return 0 }
17func gq_write(path: *u8, s: *u8, len: i64) -> i64 { let fd: i64=sys_openat_wr(path, 0x1a4); if fd<0 {return 0-1} sys_write(fd, s, len); sys_close(fd); return 0 }
18func gq_contains(path: *u8, needle: *u8) -> i64 {
19 let buf: *u8 = sys_mmap(DA_CAP); let n: i64 = da_read(path, buf, DA_CAP); let nn: i64 = da_slen(needle)
20 if nn == 0 { return 1 } if n < nn { return 0 }
21 var i: i64 = 0
22 while i + nn <= n { var j: i64=0; var ok: i64=1; while j<nn { if buf[i+j]!=needle[j] {ok=0;j=nn} else {j=j+1} } if ok==1 {return 1} i=i+1 }
23 return 0
24}
25func gq_file_eq(path: *u8, exp: *u8) -> i64 {
26 let buf: *u8 = sys_mmap(DA_CAP); let n: i64 = da_read(path, buf, DA_CAP); let e: i64 = da_slen(exp)
27 if n != e { return 0 } var i: i64=0; while i<e { if buf[i]!=exp[i] {return 0} i=i+1 } return 1
28}
29
30func main(argc: i64, argv: *i64) -> i64 {
31 var pass: i64 = 0; var total: i64 = 0
32
33 // fixtures: target + two patch pairs (fix1 applicable, fix2 will-conflict)
34 gq_write(GQ_TGT, "alpha FOO omega" as *u8, 15)
35 gq_write("/tmp/dq_old1" as *u8, "FOO" as *u8, 3); gq_write("/tmp/dq_new1" as *u8, "BAR" as *u8, 3)
36 gq_write("/tmp/dq_old2" as *u8, "ZZZ" as *u8, 3); gq_write("/tmp/dq_new2" as *u8, "YYY" as *u8, 3)
37 // a 2-line PENDING queue (hand-written = same shape doc_submit appends)
38 gq_write(GQ_Q, "PENDING\t100\twsX\t/tmp/dq_tgt\t/tmp/dq_old1\t/tmp/dq_new1\nPENDING\t101\twsY\t/tmp/dq_tgt\t/tmp/dq_old2\t/tmp/dq_new2\n" as *u8, 110)
39 gq_write(GQ_LED, "" as *u8, 0)
40
41 let p1: i64 = doc_pump(GQ_Q, GQ_LED)
42 total=total+1; if p1==2 { pass=pass+1; gq_uw("[PASS] " as *u8) } else { gq_uw("[FAIL] " as *u8) }
43 gq_uw("T1 pump processed=" as *u8); gq_wn(p1); gq_uw(" (want 2)\n" as *u8)
44
45 total=total+1; if gq_file_eq(GQ_TGT, "alpha BAR omega" as *u8)==1 { pass=pass+1; gq_uw("[PASS] " as *u8) } else { gq_uw("[FAIL] " as *u8) }
46 gq_uw("T2 applicable fix applied -> 'alpha BAR omega'\n" as *u8)
47
48 var t3: i64=0; if gq_contains(GQ_Q, "APPLIED\t100" as *u8)==1 { if gq_contains(GQ_Q, "CONFLICT\t101" as *u8)==1 { t3=1 } }
49 total=total+1; if t3==1 { pass=pass+1; gq_uw("[PASS] " as *u8) } else { gq_uw("[FAIL] " as *u8) }
50 gq_uw("T3 queue flipped: fix1 APPLIED, fix2 CONFLICT (region absent -> refused)\n" as *u8)
51
52 let p2: i64 = doc_pump(GQ_Q, GQ_LED)
53 total=total+1; if p2==0 { pass=pass+1; gq_uw("[PASS] " as *u8) } else { gq_uw("[FAIL] " as *u8) }
54 gq_uw("T4 idempotent re-pump=" as *u8); gq_wn(p2); gq_uw(" (want 0)\n" as *u8)
55
56 gq_uw("=== nx_doctor_queue_gate " as *u8); gq_wn(pass); gq_uw("/" as *u8); gq_wn(total)
57 if pass==total { gq_uw(" GREEN\n" as *u8); return 0 }
58 gq_uw(" RED\n" as *u8); return 1
59}