code wiki / (root) / nx_elder_registry_test.nx

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}