code wiki / _hdl_build / nx_proxy_route_gate.nx

nx_proxy_route_gate.nx source

↩ module page · 100 lines · 5109 B

1// nx_proxy_route_gate.nx -- sovereign gate for the data-driven proxy route table (nx_proxy_route.nx). 2// Negative-control-armed: proves the boundary guard (/gen != /generated), longest-prefix wins, 3// exact-host beats '*', wildcard fallback, mode parsing, and that unknown host/path return MISS (0). 4// No fabricated greens: each NEG case asserts a 0/absent result. expect_exit: 0 license_tier: ORIGINAL 5import "nx_syscalls.nx" 6import "nx_gate_emit_lib.nx" 7import "nx_proxy_route.nx" 8 9func g_putn(v: i64) -> i64 { 10 if v == 0 { sys_write(1, "0" as *u8, 1); return 0 } 11 var m: i64 = v 12 if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m } 13 let d: *u8 = sys_mmap(24); var k: i64 = 0 14 while m > 0 { d[k] = ((48 + (m - (m / 10) * 10)) as u8); m = m / 10; k = k + 1 } 15 var j: i64 = k - 1 16 while j >= 0 { sys_write(1, ((d as i64)+j) as *u8, 1); j = j - 1 } 17 return 0 18} 19// ASSERT-EQUALS. This gate was written against a 3-arg g_check(label, got, want) that exists 20// nowhere -- nx_gate_emit_lib.nx exports g_check(name, cond) -- so it had never compiled once. 21// Defined locally under a distinct name so it cannot shadow the imported 2-arg helper, and it 22// PRINTS got vs want: a gate that reports FAIL without the two numbers makes you re-run it to 23// learn anything, which is most of the value of a gate gone. 24func g_check_eq(label: *u8, got: i64, want: i64) -> i64 { 25 if got == want { g_puts(" PASS " as *u8); g_puts(label); g_puts(" 26" as *u8); return 1 } 27 g_puts(" FAIL " as *u8) 28 g_puts(label) 29 g_puts(" got=" as *u8) 30 g_putn(got) 31 g_puts(" want=" as *u8) 32 g_putn(want) 33 g_puts(" 34" as *u8) 35 return 0 36} 37 38func g_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 39func main() -> i64 { 40 let cfg: *u8 = "# proxy route fixture\nnishifamily.com /gallery 18190 stream\nnishifamily.com /gen 18794 buffered\nnishifamily.com /torrent 18793 stream\nnishifamily.com /api 9000 buffered\nnishifamily.com /api/v2 9002 gated\n* /shared 8000 buffered\nnishifamily.com /shared 8001 buffered\n" as *u8 41 let cfgn: i64 = g_len(cfg) 42 let port: *i64 = (sys_mmap(8)) as *i64 43 let mode: *i64 = (sys_mmap(8)) as *i64 44 var ok: i64 = 0 45 var tot: i64 = 0 46 let nf: *u8 = "nishifamily.com" as *u8 47 let nfl: i64 = g_len(nf) 48 var r: i64 = 0 49 50 // T1 exact gallery -> stream 51 r = pr_lookup(cfg, cfgn, nf, nfl, "/gallery" as *u8, g_len("/gallery" as *u8), port, mode) 52 tot = tot + 1; ok = ok + g_check_eq("T1 gallery hit", r, 1) 53 tot = tot + 1; ok = ok + g_check_eq("T1 gallery port", port[0], 18190) 54 tot = tot + 1; ok = ok + g_check_eq("T1 gallery mode=stream", mode[0], 1) 55 56 // T2 /gen subpath resolves to /gen row 57 r = pr_lookup(cfg, cfgn, nf, nfl, "/gen/api/generate" as *u8, g_len("/gen/api/generate" as *u8), port, mode) 58 tot = tot + 1; ok = ok + g_check_eq("T2 gen subpath hit", r, 1) 59 tot = tot + 1; ok = ok + g_check_eq("T2 gen subpath port", port[0], 18794) 60 61 // T3 NEG boundary: /generated must NOT match /gen 62 r = pr_lookup(cfg, cfgn, nf, nfl, "/generated" as *u8, g_len("/generated" as *u8), port, mode) 63 tot = tot + 1; ok = ok + g_check_eq("T3 NEG /generated!=/gen", r, 0) 64 65 // T4 longest prefix wins: /api/v2/x -> /api/v2 (gated) 66 r = pr_lookup(cfg, cfgn, nf, nfl, "/api/v2/x" as *u8, g_len("/api/v2/x" as *u8), port, mode) 67 tot = tot + 1; ok = ok + g_check_eq("T4 longest port", port[0], 9002) 68 tot = tot + 1; ok = ok + g_check_eq("T4 longest mode=gated", mode[0], 2) 69 70 // T5 /api/foo -> /api (not /api/v2) 71 r = pr_lookup(cfg, cfgn, nf, nfl, "/api/foo" as *u8, g_len("/api/foo" as *u8), port, mode) 72 tot = tot + 1; ok = ok + g_check_eq("T5 /api port", port[0], 9000) 73 74 // T6 exact host beats wildcard at equal prefix 75 r = pr_lookup(cfg, cfgn, nf, nfl, "/shared" as *u8, g_len("/shared" as *u8), port, mode) 76 tot = tot + 1; ok = ok + g_check_eq("T6 exact>wild port", port[0], 8001) 77 78 // T7 wildcard fallback for a different host 79 let oc: *u8 = "other.com" as *u8 80 r = pr_lookup(cfg, cfgn, oc, g_len(oc), "/shared" as *u8, g_len("/shared" as *u8), port, mode) 81 tot = tot + 1; ok = ok + g_check_eq("T7 wildcard port", port[0], 8000) 82 83 // T8 NEG wrong host, no wildcard for /gallery 84 let ev: *u8 = "evil.com" as *u8 85 r = pr_lookup(cfg, cfgn, ev, g_len(ev), "/gallery" as *u8, g_len("/gallery" as *u8), port, mode) 86 tot = tot + 1; ok = ok + g_check_eq("T8 NEG evil.com/gallery", r, 0) 87 88 // T9 NEG unknown path 89 r = pr_lookup(cfg, cfgn, nf, nfl, "/nothere" as *u8, g_len("/nothere" as *u8), port, mode) 90 tot = tot + 1; ok = ok + g_check_eq("T9 NEG unknown path", r, 0) 91 92 // T10 torrent stream 93 r = pr_lookup(cfg, cfgn, nf, nfl, "/torrent" as *u8, g_len("/torrent" as *u8), port, mode) 94 tot = tot + 1; ok = ok + g_check_eq("T10 torrent port", port[0], 18793) 95 tot = tot + 1; ok = ok + g_check_eq("T10 torrent mode=stream", mode[0], 1) 96 97 g_puts("\nPROXY-ROUTE-GATE pass="); g_putn(ok); g_puts("/"); g_putn(tot) 98 if ok == tot { g_puts(" verdict=GREEN\n"); return 0 } 99 g_puts(" verdict=RED\n"); return 1 100}