nx_elder_registry_test.nx source
↩ module page · 121 lines · 6709 B
1// nx_elder_registry_test.nx -- smoke for Elder AI service registry.
2
3import "nx_syscalls.nx"
4import "nx_elder_registry.nx"
5
6func main() -> i64 {
7 let r: *NxElderRegistry = nx_elder_registry_new(8)
8 if nx_elder_registry_is_valid(r) != 1 { return 1 }
9 if nx_elder_n_services(r) != 0 { return 2 }
10 if nx_elder_n_healthy(r) != 0 { return 3 }
11
12 // ----- Register svc-config (port 8423) -----
13 let name_cfg: *u8 = "svc-config" as *u8
14 let exec_py: *u8 = "python.exe" as *u8
15 let args_cfg: *u8 = "-m uvicorn app:app --host 127.0.0.1 --port 8423" as *u8
16 let hc_cfg: *u8 = "http://127.0.0.1:8423/health" as *u8
17 let slot0: i64 = nx_elder_register(r, 100, name_cfg, 10, 8423, exec_py, 10, args_cfg, 49, hc_cfg, 28)
18 if slot0 != 0 { return 4 }
19 if nx_elder_n_services(r) != 1 { return 5 }
20
21 // ----- Register svc-discovery (port 8424) -----
22 let name_disc: *u8 = "svc-discovery" as *u8
23 let args_disc: *u8 = "-m uvicorn app:app --host 127.0.0.1 --port 8424" as *u8
24 let hc_disc: *u8 = "http://127.0.0.1:8424/health" as *u8
25 let slot1: i64 = nx_elder_register(r, 101, name_disc, 13, 8424, exec_py, 10, args_disc, 49, hc_disc, 28)
26 if slot1 != 1 { return 6 }
27
28 // ----- Lookup by name -----
29 let s_cfg: *NxElderService = nx_elder_lookup_by_name(r, name_cfg, 10)
30 if nx_elder_service_is_valid(s_cfg) != 1 { return 7 }
31 if nx_elder_service_port(s_cfg) != 8423 { return 8 }
32 if nx_elder_service_id(s_cfg) != 100 { return 9 }
33 if nx_elder_service_state(s_cfg) != NX_ELDER_STATE_REGISTERED { return 10 }
34
35 // ----- Lookup by port -----
36 let s_disc: *NxElderService = nx_elder_lookup_by_port(r, 8424)
37 if nx_elder_service_id(s_disc) != 101 { return 11 }
38
39 // ----- Missing lookups return null -----
40 let miss_name: *u8 = "not-a-service" as *u8
41 if (nx_elder_lookup_by_name(r, miss_name, 13) as i64) != 0 { return 12 }
42 if (nx_elder_lookup_by_port(r, 9999) as i64) != 0 { return 13 }
43
44 // ----- Duplicate name rejected -----
45 if nx_elder_register(r, 999, name_cfg, 10, 9001, exec_py, 10, args_cfg, 49, hc_cfg, 28) != (0 - NX_ELDER_DUPLICATE_NAME) { return 14 }
46
47 // ----- Duplicate port rejected -----
48 let other_name: *u8 = "svc-other" as *u8
49 if nx_elder_register(r, 999, other_name, 9, 8423, exec_py, 10, args_cfg, 49, hc_cfg, 28) != (0 - NX_ELDER_DUPLICATE_PORT) { return 15 }
50
51 // ----- State transitions -----
52 if nx_elder_mark_state(r, name_cfg, 10, NX_ELDER_STATE_STARTING) != NX_ELDER_OK { return 16 }
53 if nx_elder_service_state(s_cfg) != NX_ELDER_STATE_STARTING { return 17 }
54 if nx_elder_mark_state(r, name_cfg, 10, NX_ELDER_STATE_HEALTHY) != NX_ELDER_OK { return 18 }
55 if nx_elder_service_state(s_cfg) != NX_ELDER_STATE_HEALTHY { return 19 }
56 if nx_elder_n_healthy(r) != 1 { return 20 }
57
58 // Simulate crash -> backoff. Restart count goes up.
59 if nx_elder_mark_state(r, name_cfg, 10, NX_ELDER_STATE_BACKING_OFF) != NX_ELDER_OK { return 21 }
60 if nx_elder_service_restart_count(s_cfg) != 1 { return 22 }
61 if nx_elder_mark_state(r, name_cfg, 10, NX_ELDER_STATE_BACKING_OFF) != NX_ELDER_OK { return 23 }
62 if nx_elder_service_restart_count(s_cfg) != 2 { return 24 }
63 // Back to HEALTHY resets count.
64 if nx_elder_mark_state(r, name_cfg, 10, NX_ELDER_STATE_HEALTHY) != NX_ELDER_OK { return 25 }
65 if nx_elder_service_restart_count(s_cfg) != 0 { return 26 }
66
67 // ----- Bad state value rejected -----
68 if nx_elder_mark_state(r, name_cfg, 10, -1) != (0 - NX_ELDER_BAD_STATE) { return 27 }
69 if nx_elder_mark_state(r, name_cfg, 10, NX_ELDER_STATE_N_STATES) != (0 - NX_ELDER_BAD_STATE) { return 28 }
70 // Unknown service rejected.
71 if nx_elder_mark_state(r, miss_name, 13, NX_ELDER_STATE_HEALTHY) != (0 - NX_ELDER_NOT_FOUND) { return 29 }
72
73 // ----- Bad inputs -----
74 let null_p: *u8 = (0 as i64) as *u8
75 if nx_elder_register(r, 1, null_p, 5, 8001, exec_py, 10, args_cfg, 49, hc_cfg, 28) != (0 - NX_ELDER_BAD_INPUT) { return 30 }
76 if nx_elder_register(r, 1, name_disc, 0, 8001, exec_py, 10, args_cfg, 49, hc_cfg, 28) != (0 - NX_ELDER_BAD_INPUT) { return 31 }
77 if nx_elder_register(r, 1, other_name, 9, 0, exec_py, 10, args_cfg, 49, hc_cfg, 28) != (0 - NX_ELDER_BAD_INPUT) { return 32 }
78 if nx_elder_register(r, 1, other_name, 9, 65536, exec_py, 10, args_cfg, 49, hc_cfg, 28) != (0 - NX_ELDER_BAD_INPUT) { return 33 }
79
80 // ----- Iteration via lookup_by_index -----
81 let s_idx0: *NxElderService = nx_elder_lookup_by_index(r, 0)
82 if nx_elder_service_id(s_idx0) != 100 { return 34 }
83 let s_idx1: *NxElderService = nx_elder_lookup_by_index(r, 1)
84 if nx_elder_service_id(s_idx1) != 101 { return 35 }
85 if (nx_elder_lookup_by_index(r, 99) as i64) != 0 { return 36 }
86 if (nx_elder_lookup_by_index(r, -1) as i64) != 0 { return 37 }
87
88 // ----- FULL -----
89 let r_small: *NxElderRegistry = nx_elder_registry_new(1)
90 nx_elder_register(r_small, 1, name_cfg, 10, 8001, exec_py, 10, args_cfg, 49, hc_cfg, 28)
91 let third_name: *u8 = "svc-third" as *u8
92 if nx_elder_register(r_small, 2, third_name, 9, 8002, exec_py, 10, args_cfg, 49, hc_cfg, 28) != (0 - NX_ELDER_FULL) { return 38 }
93
94 // ----- Bad new -----
95 if (nx_elder_registry_new(0) as i64) != 0 { return 39 }
96 if (nx_elder_registry_new(-1) as i64) != 0 { return 40 }
97 if (nx_elder_registry_new(NX_ELDER_MAX_SERVICES + 1) as i64) != 0 { return 41 }
98
99 // ----- Tamper -----
100 let tamper_r: *NxElderRegistry = nx_elder_registry_new(4)
101 tamper_r.canary_post = 0xDEADBEEF
102 if nx_elder_registry_is_valid(tamper_r) != 0 { return 42 }
103 if nx_elder_register(tamper_r, 1, name_cfg, 10, 8001, exec_py, 10, args_cfg, 49, hc_cfg, 28) != (0 - NX_ELDER_TAMPER) { return 43 }
104 if (nx_elder_lookup_by_name(tamper_r, name_cfg, 10) as i64) != 0 { return 44 }
105 if (nx_elder_lookup_by_port(tamper_r, 8001) as i64) != 0 { return 45 }
106 if nx_elder_n_services(tamper_r) != -1 { return 46 }
107 if nx_elder_n_healthy(tamper_r) != -1 { return 47 }
108 if nx_elder_mark_state(tamper_r, name_cfg, 10, NX_ELDER_STATE_HEALTHY) != (0 - NX_ELDER_TAMPER) { return 48 }
109
110 // ----- Sealed-enum gates -----
111 if nx_elder_state_is_valid(NX_ELDER_STATE_REGISTERED) != 1 { return 49 }
112 if nx_elder_state_is_valid(NX_ELDER_STATE_HEALTHY) != 1 { return 50 }
113 if nx_elder_state_is_valid(-1) != 0 { return 51 }
114 if nx_elder_state_is_valid(NX_ELDER_STATE_N_STATES) != 0 { return 52 }
115 if nx_elder_verdict_is_valid(NX_ELDER_OK) != 1 { return 53 }
116 if nx_elder_verdict_is_valid(NX_ELDER_TAMPER) != 1 { return 54 }
117 if nx_elder_verdict_is_valid(-1) != 0 { return 55 }
118 if nx_elder_verdict_is_valid(NX_ELDER_N_VERDICTS) != 0 { return 56 }
119
120 return 0
121}