code wiki / _hdl_build / nx_robust_dl_gate.nx

nx_robust_dl_gate.nx source

↩ module page · 85 lines · 4671 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" 9 10func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw(" 11" as *u8); return ok } 12 13// fill `out` with npkts TS packets (188B each). valid=1 -> each packet starts with 0x47; valid=0 -> corrupt 14// (first byte 0x00, no sync). Returns byte count. 15func fill_ts(out: *u8, npkts: i64, valid: i64) -> i64 { 16 var i: i64 = 0 17 while i < (npkts * 188) { out[i] = 0 as u8; i = i + 1 } 18 if valid == 1 { var p: i64 = 0; while p < npkts { out[p * 188] = 0x47 as u8; p = p + 1 } } 19 return npkts * 188 20} 21// fetch callback: rctx selects the failure scenario. 22// 1 = network-fail attempts 0,1 then a GOOD fragment on attempt 2 23// 2 = always network-fail 24// 3 = a CORRUPT fragment on attempt 0 (passes network, fails integrity) then a GOOD one on attempt 1 25func gate_fetch(url: *u8, urllen: i64, attempt: i64, out: *u8, outcap: i64, rctx: i64) -> i64 { 26 if rctx == 1 { if attempt < 2 { return 0 } return fill_ts(out, 2, 1) } 27 if rctx == 2 { return 0 } 28 if rctx == 3 { if attempt == 0 { return fill_ts(out, 2, 0) } return fill_ts(out, 2, 1) } 29 return 0 30} 31 32func main() -> i64 { 33 gw("robust-dl SOVEREIGN gate (TS integrity + fragment retry + integrity-reject-retry + resume state)\n" as *u8) 34 var pass: i64 = 0 35 var ttl: i64 = 0 36 let buf: *u8 = sys_mmap(65536) 37 let url: *u8 = "https://cdn/seg.ts" as *u8 38 39 // --- integrity --- 40 fill_ts(buf, 3, 1) 41 ttl=ttl+1; pass=pass+grow("V1 valid 3-packet TS -> ok\x00" as *u8, rdl_verify_ts(buf, 3 * 188)) 42 fill_ts(buf, 2, 0) 43 ttl=ttl+1; pass=pass+grow("V2 corrupt TS (no 0x47) -> reject\x00" as *u8, (1 - rdl_verify_ts(buf, 2 * 188))) 44 fill_ts(buf, 2, 1) 45 ttl=ttl+1; pass=pass+grow("V3 truncated (not 188-aligned) -> reject\x00" as *u8, (1 - rdl_verify_ts(buf, 300))) 46 fill_ts(buf, 3, 1); buf[188] = 0x00 as u8 // break packet-2 boundary 47 ttl=ttl+1; pass=pass+grow("V4 broken mid-fragment sync -> reject\x00" as *u8, (1 - rdl_verify_ts(buf, 3 * 188))) 48 49 // --- retry --- 50 let r1: i64 = rdl_fetch_retry(url, 18, buf, 65536, RDL_TS, &gate_fetch, 1, 5, 0) 51 ttl=ttl+1; pass=pass+grow("R1 fail 2x then succeed -> 376 bytes\x00" as *u8, (r1 == 376) as i64) 52 let r2: i64 = rdl_fetch_retry(url, 18, buf, 65536, RDL_TS, &gate_fetch, 2, 5, 0) 53 ttl=ttl+1; pass=pass+grow("R2 always-fail -> -1 (exhausted, no hang)\x00" as *u8, (r2 == (0 - 1)) as i64) 54 // R3: attempt-0 fragment is CORRUPT (network-ok) -> rejected -> retried -> attempt-1 good. No broken stitch. 55 let r3: i64 = rdl_fetch_retry(url, 18, buf, 65536, RDL_TS, &gate_fetch, 3, 5, 0) 56 var r3ok: i64 = 1 57 if r3 != 376 { r3ok = 0 } 58 if rdl_verify_ts(buf, r3) == 0 { r3ok = 0 } // the returned fragment IS the good one 59 ttl=ttl+1; pass=pass+grow("R3 corrupt-then-good: rejects broken, returns whole 376\x00" as *u8, r3ok) 60 61 // --- resume state --- 62 let st: *u8 = sys_mmap(64) 63 var z: i64 = 0; while z < 64 { st[z] = 0 as u8; z = z + 1 } 64 rdl_state_mark(st, 0); rdl_state_mark(st, 2); rdl_state_mark(st, 4) 65 var s1: i64 = 1 66 if rdl_state_done(st, 0) != 1 { s1 = 0 } 67 if rdl_state_done(st, 1) != 0 { s1 = 0 } 68 if rdl_state_done(st, 2) != 1 { s1 = 0 } 69 if rdl_state_count(st, 64) != 3 { s1 = 0 } 70 ttl=ttl+1; pass=pass+grow("S1 mark 0,2,4 -> done+count correct\x00" as *u8, s1) 71 // S2: persist + reload (resume across a restart) 72 rdl_state_save("/tmp/rdl_test.state\x00" as *u8, st, 64) 73 let st2: *u8 = sys_mmap(64) 74 let rd: i64 = rdl_state_load("/tmp/rdl_test.state\x00" as *u8, st2, 64) 75 var s2: i64 = 1 76 if rd != 64 { s2 = 0 } 77 if rdl_state_done(st2, 4) != 1 { s2 = 0 } 78 if rdl_state_done(st2, 3) != 0 { s2 = 0 } 79 if rdl_state_count(st2, 64) != 3 { s2 = 0 } 80 ttl=ttl+1; pass=pass+grow("S2 save+reload -> resume state survives restart\x00" as *u8, s2) 81 82 gw("pass=" as *u8); gn(pass); gw("/" as *u8); gn(ttl); gw("\n" as *u8) 83 if pass == ttl { gw("verdict=GREEN (retry + integrity-reject + resume: no broken fragments, resumable)\n" as *u8); sys_exit(0); return 0 } 84 gw("verdict=RED\n" as *u8); sys_exit(1); return 1 85}