nx_netscope_verdict_test.nx source
↩ module page · 73 lines · 3593 B
1// nx_netscope_verdict_test.nx -- 1:1 KAT for the easy-for-anyone verdict
2// layer (nx_netscope_verdict.nx). Builds synthetic probe matrices (no
3// network) and asserts the COMPUTED category + severity + process exit
4// code for each failure class, then RENDERS the real human-facing output
5// for the split-DNS-race and all-clear cases so the gate can grep that the
6// headline is plain language ("PROBLEM FOUND" / "ALL CLEAR") with a FIX
7// attached -- not raw RCODEs.
8//
9// expect_exit: 0
10// license_tier: ORIGINAL
11
12import "nx_netscope_verdict.nx"
13
14func vset(cells: *ProbeCell, idx: i64, verdict: i64, ipv4: i64, rfc1918: i64) -> i64 {
15 let c: *ProbeCell = ((cells as i64) + idx * NXNS_PROBECELL_BYTES) as *ProbeCell
16 c.server_ip = 0; c.host_idx = 0; c.verdict = verdict; c.rcode = 0
17 c.ancount = 0; c.ipv4_packed = ipv4; c.latency_ms = 3; c.is_rfc1918 = rfc1918
18 return 0
19}
20
21func main() -> i64 {
22 let lan: i64 = (192 << 24) | (168 << 16) | (8 << 8) | 240 // 192.168.8.240
23 let pub: i64 = (75 << 24) | (28 << 16) | (18 << 8) | 94 // public
24 let cells: *ProbeCell = sys_mmap(4 * NXNS_PROBECELL_BYTES) as *ProbeCell
25 let servers: *i64 = sys_mmap(2 * 8) as *i64
26 servers[0] = (192 << 24) | (168 << 16) | (8 << 8) | 1 // local
27 servers[1] = (192 << 24) | (168 << 16) | (1 << 8) | 254 // local-ish (192.x)
28
29 // ---- T1: SPLIT-DNS race -> category SPLIT_DNS, severity ERROR ----
30 vset(cells, 0, NXNS_OK_A, lan, 1) // server0 has the answer
31 vset(cells, 1, NXNS_NXDOMAIN, 0, 0) // server1 says it does not exist
32 if nxv_host_category(cells, 2, 1, 0) != NXV_CAT_SPLIT_DNS { return 1 }
33 if nxv_cat_severity(nxv_host_category(cells, 2, 1, 0)) != NXV_ERROR { return 2 }
34 if nx_netscope_verdict_all(cells, 2, 1, servers, servers, servers) != 2 { return 3 } // exit 2
35
36 // ---- T2: ALL CLEAR -> category OK, severity OK, exit 0 ----
37 vset(cells, 0, NXNS_OK_A, lan, 1)
38 vset(cells, 1, NXNS_OK_A, lan, 1)
39 if nxv_host_category(cells, 2, 1, 0) != NXV_CAT_OK { return 4 }
40 if nxv_cat_severity(nxv_host_category(cells, 2, 1, 0)) != NXV_OK { return 5 }
41
42 // ---- T3: CANNOT RESOLVE (all timeout) -> RESOLVE_FAIL, ERROR ----
43 vset(cells, 0, NXNS_TIMEOUT, 0, 0)
44 vset(cells, 1, NXNS_TIMEOUT, 0, 0)
45 if nxv_host_category(cells, 2, 1, 0) != NXV_CAT_RESOLVE_FAIL { return 6 }
46 if nxv_cat_severity(nxv_host_category(cells, 2, 1, 0)) != NXV_ERROR { return 7 }
47
48 // ---- T4: HAIRPIN (all OK but public) -> HAIRPIN, WARN ----
49 vset(cells, 0, NXNS_OK_A, pub, 0)
50 vset(cells, 1, NXNS_OK_A, pub, 0)
51 if nxv_host_category(cells, 2, 1, 0) != NXV_CAT_HAIRPIN { return 8 }
52 if nxv_cat_severity(nxv_host_category(cells, 2, 1, 0)) != NXV_WARN { return 9 }
53
54 sys_write(1, "T1-T4 verdict logic OK (SPLIT_DNS/ERROR, OK, RESOLVE_FAIL/ERROR, HAIRPIN/WARN)\n", 78)
55
56 // ---- render the REAL human output (gate greps these) ----
57 sys_write(1, "\n=== rendered: split-DNS race ===\n", 34)
58 let h: *i64 = sys_mmap(8) as *i64
59 let hl: *i64 = sys_mmap(8) as *i64
60 let name: *u8 = "nishifamily.com" as *u8
61 h[0] = name as i64; hl[0] = 15
62 vset(cells, 0, NXNS_OK_A, lan, 1)
63 vset(cells, 1, NXNS_NXDOMAIN, 0, 0)
64 nx_netscope_verdict_host(cells, 2, 1, 0, name, 15, servers)
65
66 sys_write(1, "\n=== rendered: all clear ===\n", 29)
67 vset(cells, 0, NXNS_OK_A, lan, 1)
68 vset(cells, 1, NXNS_OK_A, lan, 1)
69 nx_netscope_verdict_host(cells, 2, 1, 0, name, 15, servers)
70
71 sys_write(1, "\nNETSCOPE VERDICT KAT PASS (plain-language verdict + fix; easy-for-anyone)\n", 74)
72 return 0
73}