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}