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}