code wiki / (root) / nx_piece_manager_test.nx

nx_piece_manager_test.nx source

↩ module page · 43 lines · 1721 B

1// nx_piece_manager_test.nx -- KAT for the piece/block manager. 2// Native sovereign lane; exit 0 = pass, N = assertion N failed. 3 4import "nx_str.nx" 5import "nx_sha1.nx" 6import "nx_piece_manager.nx" 7 8func main() -> i64 { 9 // geometry: 1000 bytes, 256/piece -> 4 pieces; last = 1000-768 = 232 10 if nx_pm_num_pieces(1000, 256) != 4 { return 1 } 11 if nx_pm_piece_size(0, 1000, 256) != 256 { return 2 } 12 if nx_pm_piece_size(3, 1000, 256) != 232 { return 3 } 13 14 // blocks: 256-byte piece -> 1 block; 40000-byte piece -> 3 blocks, last 7232 15 if nx_pm_num_blocks(256) != 1 { return 4 } 16 if nx_pm_num_blocks(40000) != 3 { return 5 } 17 if nx_pm_block_size(0, 40000) != 16384 { return 6 } 18 if nx_pm_block_size(2, 40000) != 7232 { return 7 } 19 20 // verify: SHA-1 of the piece must match the expected hash 21 let data: *u8 = "abc" 22 let exp: *u8 = sys_mmap(20) 23 sha1(data, 3, exp) 24 if nx_pm_verify_piece(data, 3, exp) != 1 { return 8 } 25 exp[0] = (exp[0] as i64 + 1) & 0xff // corrupt the expected hash 26 if nx_pm_verify_piece(data, 3, exp) != 0 { return 9 } 27 28 // rarest-first: avail [3,1,2,0], have [0,0,0,1] -> needed {0,1,2}; rarest avail>0 = piece 1 29 let av: *i64 = sys_mmap(4 * 8) as *i64 30 let hv: *i64 = sys_mmap(4 * 8) as *i64 31 av[0]=3; av[1]=1; av[2]=2; av[3]=0 32 hv[0]=0; hv[1]=0; hv[2]=0; hv[3]=1 33 if nx_pm_rarest(av, hv, 4) != 1 { return 10 } 34 // tie at availability 2: [2,2,9,9] all needed -> lowest index 0 35 av[0]=2; av[1]=2; av[2]=9; av[3]=9 36 hv[3]=0 37 if nx_pm_rarest(av, hv, 4) != 0 { return 11 } 38 // nothing available -> -1 39 av[0]=0; av[1]=0; av[2]=0; av[3]=0 40 if nx_pm_rarest(av, hv, 4) != (0 - 1) { return 12 } 41 42 return 0 43}