code wiki / (root) / nx_metainfo_test.nx

nx_metainfo_test.nx source

↩ module page · 37 lines · 1338 B

1// nx_metainfo_test.nx -- KAT for the .torrent metainfo loader + info-hash. 2// Native sovereign lane; exit 0 = pass, N = assertion N failed. 3 4import "nx_str.nx" 5import "nx_sha1.nx" 6import "nx_metainfo.nx" 7 8func main() -> i64 { 9 // sanity: SHA-1("abc") = a9993e364706816aba3e25717850c26c9cd0d89d 10 let h: *u8 = sys_mmap(20) 11 sha1("abc", 3, h) 12 if (h[0] as i64) != 0xa9 { return 1 } 13 if (h[1] as i64) != 0x99 { return 2 } 14 if (h[19] as i64) != 0x9d { return 3 } 15 16 let mi: *u8 = "d8:announce17:http://tracker/x/4:infod4:name4:test12:piece lengthi16384e6:lengthi1024eee" 17 let n: i64 = nx_str_len(mi) 18 let m: *NxMetainfo = sys_mmap(NX_METAINFO_BYTES) as *NxMetainfo 19 let ih: *u8 = sys_mmap(20) 20 if nx_metainfo_parse(mi, n, m, ih) != NX_MI_OK { return 4 } 21 if m.piece_length != 16384 { return 5 } 22 if m.total_length != 1024 { return 6 } 23 if m.name_len != 4 { return 7 } 24 if m.announce_len != 17 { return 8 } 25 26 // info-hash deterministic + non-zero (computed over the raw info-dict bytes) 27 let ih2: *u8 = sys_mmap(20) 28 nx_metainfo_parse(mi, n, m, ih2) 29 var i: i64 = 0 30 while i < 20 { if (ih[i] as i64) != (ih2[i] as i64) { return 9 } i = i + 1 } 31 var nz: i64 = 0 32 i = 0 33 while i < 20 { if (ih[i] as i64) != 0 { nz = 1 } i = i + 1 } 34 if nz == 0 { return 10 } 35 36 return 0 37}