nx_session_summary_test.nx source
↩ module page · 67 lines · 2680 B
1// nx_session_summary_test.nx -- smoke for nx_session_summary.
2
3import "nx_syscalls.nx"
4import "nx_session_summary.nx"
5
6func main() -> i64 {
7 if NX_SV_N_VERDICTS != 4 { return 1 }
8 if nx_sv_is_valid(NX_SV_VALID) != 1 { return 2 }
9 if nx_sv_is_valid(4) != 0 { return 3 }
10
11 // Build a session at t=1000
12 let s: *NxSessionSummary = nx_session_summary_new(1000)
13 if s.started_us != 1000 { return 4 }
14 if s.verdict != NX_SV_NON_SESSION { return 5 }
15
16 // Pre-finalize, hunt + gather both zero -> verdict stays NON_SESSION
17 nx_session_summary_finalize(s, 2000, 0)
18 if s.verdict != NX_SV_NON_SESSION { return 6 }
19
20 // Now set hunt only (no gather): NON_SESSION
21 let s2: *NxSessionSummary = nx_session_summary_new(1000)
22 nx_session_summary_set_hunt(s2, 3, 0)
23 nx_session_summary_set_imbalance(s2, 512)
24 nx_session_summary_finalize(s2, 2000, 0)
25 if s2.verdict != NX_SV_NON_SESSION { return 7 }
26
27 // Both set, balanced, no alert -> VALID
28 let s3: *NxSessionSummary = nx_session_summary_new(1000)
29 nx_session_summary_set_hunt(s3, 3, 0)
30 nx_session_summary_set_gather(s3, 5, 1000)
31 nx_session_summary_set_imbalance(s3, 512)
32 nx_session_summary_finalize(s3, 5000, 0)
33 if s3.verdict != NX_SV_VALID { return 8 }
34 if nx_session_summary_is_valid(s3) != 1 { return 9 }
35 if nx_session_summary_duration_us(s3) != 4000 { return 10 }
36
37 // Imbalanced (mostly hunt, ratio > 853) -> IMBALANCED
38 let s4: *NxSessionSummary = nx_session_summary_new(1000)
39 nx_session_summary_set_hunt(s4, 10, 0)
40 nx_session_summary_set_gather(s4, 1, 0)
41 nx_session_summary_set_imbalance(s4, 930)
42 nx_session_summary_finalize(s4, 2000, 0)
43 if s4.verdict != NX_SV_IMBALANCED { return 11 }
44
45 // Imbalanced (mostly gather, ratio < 171)
46 let s5: *NxSessionSummary = nx_session_summary_new(1000)
47 nx_session_summary_set_hunt(s5, 1, 0)
48 nx_session_summary_set_gather(s5, 20, 5000)
49 nx_session_summary_set_imbalance(s5, 100)
50 nx_session_summary_finalize(s5, 2000, 0)
51 if s5.verdict != NX_SV_IMBALANCED { return 12 }
52
53 // Compromised takes precedence even when balanced
54 let s6: *NxSessionSummary = nx_session_summary_new(1000)
55 nx_session_summary_set_hunt(s6, 3, 0)
56 nx_session_summary_set_gather(s6, 5, 1000)
57 nx_session_summary_set_imbalance(s6, 512)
58 nx_session_summary_set_book(s6, 8, 2)
59 nx_session_summary_finalize(s6, 2000, 1) // any_compromised_alert=1
60 if s6.verdict != NX_SV_COMPROMISED { return 13 }
61
62 // Verdict getter
63 if nx_session_summary_verdict(s3) != NX_SV_VALID { return 14 }
64 if nx_session_summary_verdict(s6) != NX_SV_COMPROMISED { return 15 }
65
66 return 0
67}