code wiki / _hdl_build / nx_pub_recover_pulsed_gate.nx
nx_pub_recover_pulsed_gate.nx source
↩ module page · 64 lines · 3641 B
1// nx_pub_recover_pulsed_gate.nx -- gate the CADENCE daemon: pulsed_run loops N cycles, each running a real
2// pulse_pass, and heals a real wedged mock within the cycles. Proves the runnable service form. license_tier: ORIGINAL
3import "nx_syscalls.nx"
4import "nx_pub_recover_pulsed.nx" // pulsed_run + (transitively) proc_alive_by_name / pr_n / pr_s
5
6const QG_MET: *u8 = "/tmp/pd_test_metrics.tsv"
7const QG_Q: *u8 = "/tmp/pd_test_queue.tsv"
8const QG_LED: *u8 = "/tmp/pd_test_ledger.tsv"
9const QG_MAP: *u8 = "/tmp/pd_test_map.tsv"
10const QG_MOCK: *u8 = "/tmp/nx_pr_mock.sov.elf"
11const QG_NEEDLE: *u8 = "nx_pr_mock"
12
13func qg_uw(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
14func qg_wn(v: i64) -> i64 { let b: *u8=sys_mmap(24); let e: i64=pr_n(b,0,v); sys_write(1,b,e); return 0 }
15func qg_sleep_ms(ms: i64) -> i64 { let ts: *i64=sys_mmap(16) as *i64; ts[0]=ms/1000; ts[1]=(ms-(ms/1000)*1000)*1000000; __syscall(35, ts as i64, 0,0,0,0,0); return 0 }
16func qg_write(path: *u8, buf: *u8, len: i64) -> i64 { let fd: i64=sys_openat_wr(path, 0x1a4); if fd<0 {return 0-1} if len>0 { sys_write(fd, buf, len) } sys_close(fd); return 0 }
17func qg_row(buf: *u8, off: i64, url: *u8, maxv: i64) -> i64 {
18 var o: i64 = off
19 o = pr_n(buf,o,1782008888); buf[o]=9 as u8; o=o+1
20 o = pr_s(buf,o,"lbl" as *u8); buf[o]=9 as u8; o=o+1
21 o = pr_s(buf,o,url); buf[o]=9 as u8; o=o+1
22 o = pr_s(buf,o,"1" as *u8); buf[o]=9 as u8; o=o+1
23 o = pr_s(buf,o,"1" as *u8); buf[o]=9 as u8; o=o+1
24 o = pr_s(buf,o,"1" as *u8); buf[o]=9 as u8; o=o+1
25 o = pr_n(buf,o,maxv); buf[o]=9 as u8; o=o+1
26 o = pr_n(buf,o,maxv); buf[o]=9 as u8; o=o+1
27 o = pr_n(buf,o,maxv); buf[o]=9 as u8; o=o+1
28 o = pr_n(buf,o,maxv); buf[o]=9 as u8; o=o+1
29 o = pr_s(buf,o,"0" as *u8); buf[o]=9 as u8; o=o+1
30 o = pr_s(buf,o,"0" as *u8); buf[o]=9 as u8; o=o+1
31 o = pr_s(buf,o,"0" as *u8); buf[o]=10 as u8; o=o+1
32 return o
33}
34
35func main(argc: i64, argv: *i64) -> i64 {
36 var pass: i64 = 0; var total: i64 = 0
37 let pid: i64 = sys_fork()
38 if pid == 0 {
39 let av: *i64 = sys_mmap(16) as *i64; av[0]=QG_MOCK as i64; av[1]=0
40 let ev: *i64 = sys_mmap(8) as *i64; ev[0]=0
41 sys_execve(QG_MOCK, av, ev); sys_exit(127)
42 }
43 qg_sleep_ms(500)
44 let mp: *u8 = sys_mmap(128); var mo: i64 = 0
45 mo = pr_s(mp, mo, "/__t__" as *u8); mp[mo]=9 as u8; mo=mo+1; mo = pr_s(mp, mo, QG_NEEDLE); mp[mo]=10 as u8; mo=mo+1
46 qg_write(QG_MAP, mp, mo)
47 let m: *u8 = sys_mmap(1024); var o: i64 = qg_row(m, 0, "https://x/__t__" as *u8, 20000)
48 qg_write(QG_MET, m, o); qg_write(QG_Q, "" as *u8, 0); qg_write(QG_LED, "" as *u8, 0)
49
50 let a0: i64 = proc_alive_by_name(QG_NEEDLE)
51 total = total + 1; if a0 == 1 { pass = pass + 1; qg_uw("[PASS] T0 mock ALIVE\n" as *u8) } else { qg_uw("[FAIL] T0 mock not alive\n" as *u8) }
52
53 let cyc: i64 = pulsed_run(0, 2, "" as *u8, QG_MET, QG_Q, QG_LED, QG_MAP)
54 total = total + 1; if cyc == 2 { pass = pass + 1; qg_uw("[PASS] T1 cadence ran 2 cycles\n" as *u8) } else { qg_uw("[FAIL] T1 expected 2 cycles got " as *u8); qg_wn(cyc); qg_uw("\n" as *u8) }
55 qg_sleep_ms(400)
56
57 let a1: i64 = proc_alive_by_name(QG_NEEDLE)
58 total = total + 1; if a1 == 0 { pass = pass + 1; qg_uw("[PASS] T2 mock HEALED (killed) within the cadence\n" as *u8) } else { qg_uw("[FAIL] T2 mock still alive\n" as *u8) }
59 let st: *i64 = sys_mmap(16) as *i64; sys_wait4(pid, st, 0)
60
61 qg_uw("=== nx_pub_recover_pulsed_gate " as *u8); qg_wn(pass); qg_uw("/" as *u8); qg_wn(total)
62 if pass == total { qg_uw(" GREEN\n" as *u8); return 0 }
63 qg_uw(" RED\n" as *u8); return 1
64}