nx_promote_test.nx source
↩ module page · 90 lines · 3403 B
1// nx_promote_test.nx -- smoke for nx_promote.
2
3import "nx_syscalls.nx"
4import "nx_evict_journal.nx"
5import "nx_methyl.nx"
6import "nx_chromatin.nx"
7import "nx_promote.nx"
8
9func main() -> i64 {
10 let sig: *u8 = (sys_mmap(96)) as *u8
11 sig[0] = 1 as u8
12 let snap: *u8 = (sys_mmap(64)) as *u8
13 var i: nx_size = 0
14 while i < 32 {
15 snap[i] = (65 + i) as u8
16 i = i + 1
17 }
18
19 // 1: trigger enum sealed
20 if NX_PR_TRG_N_TRIGGERS != 7 { return 1 }
21 if nx_pr_trigger_is_valid(NX_PR_TRG_RANSOMWARE) != 1 { return 2 }
22 if nx_pr_trigger_is_valid(7) != 0 { return 3 }
23
24 // 2: build contract with backup chromatin
25 let mark_b: *NxMethylMark = nx_methyl_new(20, 0xbbbb, 1000, sig, 96)
26 let ch_b: *NxChromatin = nx_chromatin_capture(20, 0xb001, 1000,
27 snap, 32, mark_b, 1)
28 let contract: *NxFailoverContract = nx_failover_contract_new(
29 100, 10, 20, ch_b)
30 if contract.primary_cell_id != 10 { return 4 }
31 if contract.backup_cell_id != 20 { return 5 }
32 if contract.n_swaps != 0 { return 6 }
33
34 // 3: is_primary check
35 if nx_promote_is_primary(contract, 10) != 1 { return 7 }
36 if nx_promote_is_primary(contract, 20) != 0 { return 8 }
37
38 // 4: update chromatin -- newer-seq replaces
39 let ch_b2: *NxChromatin = nx_chromatin_capture(20, 0xb002, 2000,
40 snap, 32, mark_b, 5)
41 if nx_promote_update_chromatin(contract, ch_b2) != NX_PROMOTE_OK { return 9 }
42
43 // 5: update with stale chromatin refused
44 let ch_old: *NxChromatin = nx_chromatin_capture(20, 0xb000, 500,
45 snap, 32, mark_b, 1)
46 if nx_promote_update_chromatin(contract, ch_old) != NX_PROMOTE_ERR_BACKUP_STALE { return 10 }
47
48 // 6: execute promote -- backup becomes primary
49 let dst: *u8 = (sys_mmap(64)) as *u8
50 let j: *NxEvictJournal = nx_evict_journal_new(8)
51 let rc: nx_int = nx_promote_execute(contract,
52 NX_PR_TRG_RANSOMWARE, dst, 64, 3000, 10000, j)
53 if rc != NX_PROMOTE_OK { return 11 }
54 if contract.primary_cell_id != 20 { return 12 }
55 if contract.backup_cell_id != 10 { return 13 }
56 if contract.n_swaps != 1 { return 14 }
57 if contract.last_trigger != NX_PR_TRG_RANSOMWARE { return 15 }
58 if j.count != 1 { return 16 }
59
60 // 7: dst contains restored snapshot
61 var k: nx_size = 0
62 while k < 32 {
63 if dst[k] != snap[k] { return 17 }
64 k = k + 1
65 }
66
67 // 8: bad trigger rejected
68 if nx_promote_execute(contract, 99, dst, 64, 4000, 10000, j) != NX_PROMOTE_ERR_BAD_TRIGGER { return 18 }
69
70 // 9: NULL chromatin (after we corrupt the contract) -> NO_CHROMATIN
71 let c2: *NxFailoverContract = nx_failover_contract_new(
72 200, 30, 40, (0 as i64) as *NxChromatin)
73 if nx_promote_execute(c2, NX_PR_TRG_OPERATOR_DRILL,
74 dst, 64, 4000, 10000, j) != NX_PROMOTE_ERR_NO_CHROMATIN { return 19 }
75
76 // 10: flap_count
77 if nx_promote_flap_count(contract) != 1 { return 20 }
78
79 // 11: second promote brings it back -- flap_count increments
80 nx_promote_update_chromatin(contract,
81 nx_chromatin_capture(10, 0xa003, 5000, snap, 32,
82 nx_methyl_new(10, 0xaaaa, 5000, sig, 96), 7))
83 let rc2: nx_int = nx_promote_execute(contract,
84 NX_PR_TRG_OPERATOR_DRILL, dst, 64, 6000, 10000, j)
85 if rc2 != NX_PROMOTE_OK { return 21 }
86 if contract.primary_cell_id != 10 { return 22 }
87 if nx_promote_flap_count(contract) != 2 { return 23 }
88
89 return 0
90}