code wiki / (root) / nx_promote_test.nx

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}