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}