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}