code wiki / _hdl_build / nx_robust_dl_gate.nx

nx_robust_dl_gate.nx source

↩ module page · 93 lines · 5051 B

1import "nx_gate_gn.nx" 2import "nx_gate_base.nx" 3// nx_robust_dl_gate.nx -- proves the robust-download core: TS integrity (reject truncated/garbage), fragment 4// retry (fail N then succeed / exhaust cleanly), INTEGRITY-REJECT-THEN-RETRY (a corrupt fragment is caught and 5// re-fetched, never stitched = no broken fragments), and resumable done-state (mark/query + file round-trip). 6// A fetch CALLBACK injects deterministic failures (rctx selects the scenario). license_tier: ORIGINAL expect_exit: 0 7import "nx_syscalls.nx" 8import "nx_robust_dl.nx" 9import "nx_gate_verdict.nx" 10 11func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw(" 12" as *u8); return ok } 13 14// fill `out` with npkts TS packets (188B each). valid=1 -> each packet starts with 0x47; valid=0 -> corrupt 15// (first byte 0x00, no sync). Returns byte count. 16func fill_ts(out: *u8, npkts: i64, valid: i64) -> i64 { 17 var i: i64 = 0 18 while i < (npkts * 188) { out[i] = 0 as u8; i = i + 1 } 19 if valid == 1 { var p: i64 = 0; while p < npkts { out[p * 188] = 0x47 as u8; p = p + 1 } } 20 return npkts * 188 21} 22// fetch callback: rctx selects the failure scenario. 23// 1 = network-fail attempts 0,1 then a GOOD fragment on attempt 2 24// 2 = always network-fail 25// 3 = a CORRUPT fragment on attempt 0 (passes network, fails integrity) then a GOOD one on attempt 1 26func gate_fetch(url: *u8, urllen: i64, attempt: i64, out: *u8, outcap: i64, rctx: i64) -> i64 { 27 if rctx == 1 { if attempt < 2 { return 0 } return fill_ts(out, 2, 1) } 28 if rctx == 2 { return 0 } 29 if rctx == 3 { if attempt == 0 { return fill_ts(out, 2, 0) } return fill_ts(out, 2, 1) } 30 return 0 31} 32 33func main() -> i64 { 34 gw("robust-dl SOVEREIGN gate (TS integrity + fragment retry + integrity-reject-retry + resume state)\n" as *u8) 35 var pass: i64 = 0 36 var ttl: i64 = 0 37 let buf: *u8 = sys_mmap(65536) 38 let url: *u8 = "https://cdn/seg.ts" as *u8 39 40 // --- integrity --- 41 fill_ts(buf, 3, 1) 42 ttl=ttl+1; pass=pass+grow("V1 valid 3-packet TS -> ok\x00" as *u8, rdl_verify_ts(buf, 3 * 188)) 43 fill_ts(buf, 2, 0) 44 ttl=ttl+1; pass=pass+grow("V2 corrupt TS (no 0x47) -> reject\x00" as *u8, (1 - rdl_verify_ts(buf, 2 * 188))) 45 fill_ts(buf, 2, 1) 46 ttl=ttl+1; pass=pass+grow("V3 truncated (not 188-aligned) -> reject\x00" as *u8, (1 - rdl_verify_ts(buf, 300))) 47 fill_ts(buf, 3, 1); buf[188] = 0x00 as u8 // break packet-2 boundary 48 ttl=ttl+1; pass=pass+grow("V4 broken mid-fragment sync -> reject\x00" as *u8, (1 - rdl_verify_ts(buf, 3 * 188))) 49 50 // --- retry --- 51 let r1: i64 = rdl_fetch_retry(url, 18, buf, 65536, RDL_TS, &gate_fetch, 1, 5, 0) 52 ttl=ttl+1; pass=pass+grow("R1 fail 2x then succeed -> 376 bytes\x00" as *u8, (r1 == 376) as i64) 53 let r2: i64 = rdl_fetch_retry(url, 18, buf, 65536, RDL_TS, &gate_fetch, 2, 5, 0) 54 ttl=ttl+1; pass=pass+grow("R2 always-fail -> -1 (exhausted, no hang)\x00" as *u8, (r2 == (0 - 1)) as i64) 55 // R3: attempt-0 fragment is CORRUPT (network-ok) -> rejected -> retried -> attempt-1 good. No broken stitch. 56 let r3: i64 = rdl_fetch_retry(url, 18, buf, 65536, RDL_TS, &gate_fetch, 3, 5, 0) 57 var r3ok: i64 = 1 58 if r3 != 376 { r3ok = 0 } 59 if rdl_verify_ts(buf, r3) == 0 { r3ok = 0 } // the returned fragment IS the good one 60 ttl=ttl+1; pass=pass+grow("R3 corrupt-then-good: rejects broken, returns whole 376\x00" as *u8, r3ok) 61 62 // --- resume state --- 63 let st: *u8 = sys_mmap(64) 64 var z: i64 = 0; while z < 64 { st[z] = 0 as u8; z = z + 1 } 65 rdl_state_mark(st, 0); rdl_state_mark(st, 2); rdl_state_mark(st, 4) 66 var s1: i64 = 1 67 if rdl_state_done(st, 0) != 1 { s1 = 0 } 68 if rdl_state_done(st, 1) != 0 { s1 = 0 } 69 if rdl_state_done(st, 2) != 1 { s1 = 0 } 70 if rdl_state_count(st, 64) != 3 { s1 = 0 } 71 ttl=ttl+1; pass=pass+grow("S1 mark 0,2,4 -> done+count correct\x00" as *u8, s1) 72 // S2: persist + reload (resume across a restart) 73 rdl_state_save("/tmp/rdl_test.state\x00" as *u8, st, 64) 74 let st2: *u8 = sys_mmap(64) 75 let rd: i64 = rdl_state_load("/tmp/rdl_test.state\x00" as *u8, st2, 64) 76 var s2: i64 = 1 77 if rd != 64 { s2 = 0 } 78 if rdl_state_done(st2, 4) != 1 { s2 = 0 } 79 if rdl_state_done(st2, 3) != 0 { s2 = 0 } 80 if rdl_state_count(st2, 64) != 3 { s2 = 0 } 81 ttl=ttl+1; pass=pass+grow("S2 save+reload -> resume state survives restart\x00" as *u8, s2) 82 83 gw("pass=" as *u8); gn(pass); gw("/" as *u8); gn(ttl); gw("\n" as *u8) 84 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 85 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 86 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 87 let ctr__dry: *i64 = gv_ctr() 88 ctr__dry[0] = pass 89 ctr__dry[1] = ttl 90 let rc__dry: i64 = gv_verdict("ROBUST-DL-GATE" as *u8, ctr__dry, "retry + integrity-reject + resume: no broken fragments, resumable)" as *u8) 91 sys_exit(rc__dry) 92 return rc__dry 93}