nx_pollinate_test.nx source
↩ module page · 100 lines · 3626 B
1// nx_pollinate_test.nx -- smoke for nx_pollinate.
2
3import "nx_syscalls.nx"
4import "nx_evict_journal.nx"
5import "nx_pollinate.nx"
6
7func main() -> i64 {
8 // 1: kind enum sealed
9 if NX_PK_N_KINDS != 5 { return 1 }
10 if nx_pk_is_valid(NX_PK_ANTIBODY) != 1 { return 2 }
11 if nx_pk_is_valid(NX_PK_RECLAIM_REPORT) != 1 { return 3 }
12 if nx_pk_is_valid(-1) != 0 { return 4 }
13 if nx_pk_is_valid(5) != 0 { return 5 }
14
15 // 2: construction with consent_required=1
16 let j: *NxEvictJournal = nx_evict_journal_new(16)
17 let p: *NxPollinator = nx_pollinator_new(4, 8, 1, j)
18 if p.peer_capacity != 4 { return 6 }
19 if p.outbox_capacity != 8 { return 7 }
20 if p.consent_required != 1 { return 8 }
21 if p.n_peers != 0 { return 9 }
22 if p.n_outbox != 0 { return 10 }
23
24 // 3: add 3 peer relations
25 // peer_id=1000, initial_trust_q10=614
26 if nx_pollinate_add_peer(p, 1000, 614) != 0 { return 11 }
27 if nx_pollinate_add_peer(p, 2000, 819) != 1 { return 12 }
28 if nx_pollinate_add_peer(p, 3000, 410) != 2 { return 13 }
29 if p.n_peers != 3 { return 14 }
30
31 // 4: duplicate peer rejected
32 if nx_pollinate_add_peer(p, 1000, 614) != -1 { return 15 }
33
34 // 5: propose a payload
35 let body: *u8 = (sys_mmap(32)) as *u8
36 body[0] = 65 as u8
37 let sig: *u8 = (sys_mmap(96)) as *u8
38 sig[0] = 1 as u8
39 let pl: *NxPollinationPayload = (sys_mmap(64)) as *NxPollinationPayload
40 pl.kind = NX_PK_ANTIBODY
41 pl.originator_id = 7
42 pl.content_hash = 0xcafe
43 pl.body_ptr = body
44 pl.body_len = 32
45 pl.sig_ptr = sig
46 pl.sig_len = 96
47 pl.ts_us = 1000
48
49 let rc1: nx_int = nx_pollinate_propose(p, pl)
50 if rc1 != NX_PL_OK { return 16 }
51 if nx_pollinate_outbox_count(p) != 1 { return 17 }
52
53 // 6: bad kind rejected
54 pl.kind = 99
55 if nx_pollinate_propose(p, pl) != NX_PL_ERR_BAD_KIND { return 18 }
56 pl.kind = NX_PK_ANTIBODY
57
58 // 7: null sig rejected
59 let null_sig: *u8 = (0 as i64) as *u8
60 pl.sig_ptr = null_sig
61 if nx_pollinate_propose(p, pl) != NX_PL_ERR_BAD_SIG { return 19 }
62 pl.sig_ptr = sig
63 pl.sig_len = 0
64 if nx_pollinate_propose(p, pl) != NX_PL_ERR_BAD_SIG { return 20 }
65 pl.sig_len = 96
66
67 // 8: consent gating -- send refused when consent_required=1
68 if nx_pollinate_send(p, 1000, pl, 2000) != NX_PL_ERR_CONSENT_REQUIRED { return 21 }
69
70 // 9: operator consents on outbox slot 0
71 if nx_pollinate_consent(p, 0, 2100) != NX_PL_OK { return 22 }
72 // journal should have one entry
73 if j.count != 1 { return 23 }
74
75 // 10: pollinator with consent_required=0 (auto-share) -- send OK
76 let p2: *NxPollinator = nx_pollinator_new(4, 8, 0, j)
77 nx_pollinate_add_peer(p2, 9000, 819)
78 let rc_send: nx_int = nx_pollinate_send(p2, 9000, pl, 3000)
79 if rc_send != NX_PL_OK { return 24 }
80 if nx_pollinate_peer_share_count(p2, 9000) != 1 { return 25 }
81
82 // 11: send to unknown peer refused
83 if nx_pollinate_send(p2, 5555, pl, 3000) != NX_PL_REFUSED_BY_POLICY { return 26 }
84
85 // 12: receive from known peer increments receive_count
86 let rc_recv: nx_int = nx_pollinate_receive(p2, 9000, pl, 4000)
87 if rc_recv != NX_PL_OK { return 27 }
88 if nx_pollinate_peer_receive_count(p2, 9000) != 1 { return 28 }
89
90 // 13: receive from unknown peer refused
91 if nx_pollinate_receive(p2, 5555, pl, 4000) != NX_PL_REFUSED_BY_POLICY { return 29 }
92
93 // 14: outbox QUEUE_FULL after exhausting capacity
94 let p3: *NxPollinator = nx_pollinator_new(2, 2, 0, j)
95 nx_pollinate_propose(p3, pl)
96 nx_pollinate_propose(p3, pl)
97 if nx_pollinate_propose(p3, pl) != NX_PL_QUEUE_FULL { return 30 }
98
99 return 0
100}