code wiki / (root) / nx_message_test.nx

nx_message_test.nx source

↩ module page · 152 lines · 7143 B

1// nx_message_test.nx -- smoke for nx_message. 2 3import "nx_syscalls.nx" 4import "nx_message.nx" 5 6func main() -> i64 { 7 let now: nx_size = 1000000 8 9 // 1: enum validity 10 if nx_ms_kind_is_valid(NX_MS_KIND_LLM_TOKEN) != 1 { return 1 } 11 if nx_ms_kind_is_valid(NX_MS_KIND_ERROR_REPORT) != 1 { return 2 } 12 if nx_ms_kind_is_valid(-1) != 0 { return 3 } 13 if nx_ms_kind_is_valid(11) != 0 { return 4 } 14 if NX_MS_KIND_N != 11 { return 5 } 15 16 if nx_ms_mode_is_valid(NX_MS_MODE_UNICAST) != 1 { return 6 } 17 if nx_ms_mode_is_valid(NX_MS_MODE_BROADCAST) != 1 { return 7 } 18 if nx_ms_mode_is_valid(3) != 0 { return 8 } 19 20 if nx_ms_v_is_valid(NX_MS_V_DELIVERED) != 1 { return 9 } 21 if nx_ms_v_is_valid(NX_MS_V_DROPPED_NO_ROUTE) != 1 { return 10 } 22 23 // 2: bus construction 24 let b: *NxMessageBus = nx_ms_bus_new(8, 16, 4) 25 if b.mb_capacity != 8 { return 11 } 26 if b.sub_capacity != 16 { return 12 } 27 if b.per_mailbox_capacity != 4 { return 13 } 28 if b.next_message_id != 1 { return 14 } 29 30 if nx_ms_bus_new(0, 16, 4) != (0 as *NxMessageBus) { return 15 } 31 if nx_ms_bus_new(8, 0, 4) != (0 as *NxMessageBus) { return 16 } 32 if nx_ms_bus_new(8, 16, 0) != (0 as *NxMessageBus) { return 17 } 33 34 // 3: register mailboxes for 3 actors 35 if nx_ms_register(b, 1001) != NX_MS_V_DELIVERED { return 18 } // LLM 36 if nx_ms_register(b, 1002) != NX_MS_V_DELIVERED { return 19 } // AUDIO_TTS 37 if nx_ms_register(b, 1003) != NX_MS_V_DELIVERED { return 20 } // TEXT_RENDERER 38 if nx_ms_register(b, 0) != NX_MS_V_INVALID { return 21 } 39 40 // 4: find mailboxes 41 let mb1: *NxMailbox = nx_ms_find_mailbox(b, 1001) 42 if mb1.actor_id != 1001 { return 22 } 43 if mb1.n_pending != 0 { return 23 } 44 45 if (nx_ms_find_mailbox(b, 9999) as i64) != 0 { return 24 } 46 47 // 5: unicast send -- LLM sends token to AUDIO_TTS 48 if nx_ms_send_unicast(b, 1001, 1002, NX_MS_KIND_LLM_TOKEN, 0xCAFE, 8, now) != NX_MS_V_DELIVERED { return 25 } 49 if nx_ms_pending(b, 1002) != 1 { return 26 } 50 if nx_ms_pending(b, 1003) != 0 { return 27 } 51 52 // 6: receive on AUDIO_TTS 53 let msg1: *NxMessage = nx_ms_receive(b, 1002) 54 if msg1.sender_actor_id != 1001 { return 28 } 55 if msg1.recipient_actor_id != 1002 { return 29 } 56 if msg1.kind != NX_MS_KIND_LLM_TOKEN { return 30 } 57 if msg1.payload_handle != 0xCAFE { return 31 } 58 if msg1.payload_bytes != 8 { return 32 } 59 if nx_ms_pending(b, 1002) != 0 { return 33 } 60 61 // 7: receive empty mailbox returns null 62 if (nx_ms_receive(b, 1002) as i64) != 0 { return 34 } 63 64 // 8: unicast to non-existent recipient -> DROPPED_NO_ROUTE 65 if nx_ms_send_unicast(b, 1001, 9999, NX_MS_KIND_LLM_TOKEN, 0xCAFE, 8, now) != NX_MS_V_DROPPED_NO_ROUTE { return 35 } 66 67 // 9: subscribe AUDIO_TTS + TEXT_RENDERER to LLM_TOKEN 68 if nx_ms_subscribe(b, 1002, NX_MS_KIND_LLM_TOKEN) != NX_MS_V_DELIVERED { return 36 } 69 if nx_ms_subscribe(b, 1003, NX_MS_KIND_LLM_TOKEN) != NX_MS_V_DELIVERED { return 37 } 70 if nx_ms_subscription_count(b, NX_MS_KIND_LLM_TOKEN) != 2 { return 38 } 71 72 if nx_ms_subscribe(b, 0, NX_MS_KIND_LLM_TOKEN) != NX_MS_V_INVALID { return 39 } 73 if nx_ms_subscribe(b, 1001, 99) != NX_MS_V_INVALID { return 40 } 74 75 // 10: fanout LLM token reaches both subscribers 76 if nx_ms_send_fanout(b, 1001, NX_MS_KIND_LLM_TOKEN, 0xBEEF, 4, now + 10) != NX_MS_V_DELIVERED { return 41 } 77 if nx_ms_pending(b, 1002) != 1 { return 42 } 78 if nx_ms_pending(b, 1003) != 1 { return 43 } 79 if nx_ms_pending(b, 1001) != 0 { return 44 } 80 81 // 11: fanout for kind with no subscribers -> DROPPED_NO_ROUTE 82 if nx_ms_send_fanout(b, 1001, NX_MS_KIND_AUDIO_FRAME, 0, 0, now) != NX_MS_V_DROPPED_NO_ROUTE { return 45 } 83 84 // 12: broadcast LLM_DONE to all (excluding sender) 85 if nx_ms_send_broadcast(b, 1001, NX_MS_KIND_LLM_DONE, 0xFADE, 1, now + 20) != NX_MS_V_DELIVERED { return 46 } 86 // Sender (1001) does NOT receive its own broadcast 87 if nx_ms_pending(b, 1001) != 0 { return 47 } 88 if nx_ms_pending(b, 1002) != 2 { return 48 } 89 if nx_ms_pending(b, 1003) != 2 { return 49 } 90 91 // 13: mailbox full triggers drops 92 let b2: *NxMessageBus = nx_ms_bus_new(2, 4, 2) // per-mailbox cap = 2 93 nx_ms_register(b2, 1) 94 nx_ms_register(b2, 2) 95 nx_ms_send_unicast(b2, 2, 1, NX_MS_KIND_LLM_TOKEN, 0x1, 1, now) 96 nx_ms_send_unicast(b2, 2, 1, NX_MS_KIND_LLM_TOKEN, 0x2, 1, now) 97 // third send -> DROPPED_FULL 98 if nx_ms_send_unicast(b2, 2, 1, NX_MS_KIND_LLM_TOKEN, 0x3, 1, now) != NX_MS_V_DROPPED_FULL { return 50 } 99 if nx_ms_dropped_total(b2, 1) != 1 { return 51 } 100 if nx_ms_delivered_total(b2, 1) != 2 { return 52 } 101 102 // 14: receive in FIFO order 103 let m_first: *NxMessage = nx_ms_receive(b2, 1) 104 if m_first.payload_handle != 0x1 { return 53 } 105 let m_second: *NxMessage = nx_ms_receive(b2, 1) 106 if m_second.payload_handle != 0x2 { return 54 } 107 108 // 15: ring wraparound -- send 2 more after both consumed 109 nx_ms_send_unicast(b2, 2, 1, NX_MS_KIND_LLM_TOKEN, 0x4, 1, now) 110 nx_ms_send_unicast(b2, 2, 1, NX_MS_KIND_LLM_TOKEN, 0x5, 1, now) 111 let m_4: *NxMessage = nx_ms_receive(b2, 1) 112 if m_4.payload_handle != 0x4 { return 55 } 113 let m_5: *NxMessage = nx_ms_receive(b2, 1) 114 if m_5.payload_handle != 0x5 { return 56 } 115 116 // 16: capacity exceeded on register 117 let b3: *NxMessageBus = nx_ms_bus_new(2, 4, 2) 118 nx_ms_register(b3, 1) 119 nx_ms_register(b3, 2) 120 if nx_ms_register(b3, 3) != NX_MS_V_INVALID { return 57 } 121 122 // 17: sub_capacity exceeded 123 let b4: *NxMessageBus = nx_ms_bus_new(2, 1, 2) 124 nx_ms_register(b4, 1) 125 nx_ms_subscribe(b4, 1, NX_MS_KIND_LLM_TOKEN) 126 if nx_ms_subscribe(b4, 1, NX_MS_KIND_AUDIO_FRAME) != NX_MS_V_INVALID { return 58 } 127 128 // 18: invalid kind in send funcs 129 if nx_ms_send_unicast(b, 1001, 1002, 99, 0, 0, now) != NX_MS_V_INVALID { return 59 } 130 if nx_ms_send_fanout(b, 1001, 99, 0, 0, now) != NX_MS_V_INVALID { return 60 } 131 if nx_ms_send_broadcast(b, 1001, 99, 0, 0, now) != NX_MS_V_INVALID { return 61 } 132 133 // 19: broadcast to empty bus -> DROPPED_NO_ROUTE 134 let b5: *NxMessageBus = nx_ms_bus_new(4, 4, 4) 135 if nx_ms_send_broadcast(b5, 1, NX_MS_KIND_LLM_TOKEN, 0, 0, now) != NX_MS_V_DROPPED_NO_ROUTE { return 62 } 136 137 // 20: null handling 138 let null_b: *NxMessageBus = (0 as i64) as *NxMessageBus 139 if nx_ms_register(null_b, 1) != NX_MS_V_NULL { return 63 } 140 if (nx_ms_find_mailbox(null_b, 1) as i64) != 0 { return 64 } 141 if nx_ms_subscribe(null_b, 1, NX_MS_KIND_LLM_TOKEN) != NX_MS_V_NULL { return 65 } 142 if nx_ms_send_unicast(null_b, 1, 2, NX_MS_KIND_LLM_TOKEN, 0, 0, now) != NX_MS_V_NULL { return 66 } 143 if nx_ms_send_fanout(null_b, 1, NX_MS_KIND_LLM_TOKEN, 0, 0, now) != NX_MS_V_NULL { return 67 } 144 if nx_ms_send_broadcast(null_b, 1, NX_MS_KIND_LLM_TOKEN, 0, 0, now) != NX_MS_V_NULL { return 68 } 145 if (nx_ms_receive(null_b, 1) as i64) != 0 { return 69 } 146 if nx_ms_pending(null_b, 1) != 0 { return 70 } 147 if nx_ms_delivered_total(null_b, 1) != 0 { return 71 } 148 if nx_ms_dropped_total(null_b, 1) != 0 { return 72 } 149 if nx_ms_subscription_count(null_b, NX_MS_KIND_LLM_TOKEN) != 0 { return 73 } 150 151 return 0 152}