code wiki / (root) / nx_bench_tsv_persist_test.nx

nx_bench_tsv_persist_test.nx source

↩ module page · 141 lines · 6798 B

1// nx_bench_tsv_persist_test.nx -- smoke: write rows + read back + verify. 2// 3// Substrate-honest persistence test: write 2 sample TSV rows to a 4// real file in /tmp, reopen for read, slurp bytes back, assert 5// content matches what was written. This is the loop the s-class 6// comparison campaign needs: write -> read -> compare. 7 8import "nx_syscalls.nx" 9import "nx_tier.nx" 10import "nx_bench_tsv_persist.nx" 11 12func main() -> i64 { 13 // 1: verdict enum validity 14 if nx_bcps_v_is_valid(NX_BCPS_OK) != 1 { return 1 } 15 if nx_bcps_v_is_valid(NX_BCPS_OPEN_FAIL) != 1 { return 2 } 16 if nx_bcps_v_is_valid(NX_BCPS_INVALID) != 1 { return 3 } 17 if nx_bcps_v_is_valid(NX_BCPS_N) != 0 { return 4 } 18 if nx_bcps_v_is_valid(-1) != 0 { return 5 } 19 20 // 2: path "/tmp/nx_bench_persist_smoke.tsv" 21 // bytes: 47 74 6d 70 2f 6e 78 5f 62 65 6e 63 68 5f 70 65 22 // 72 73 69 73 74 5f 73 6d 6f 6b 65 2e 74 73 76 23 // length = 31 24 let path: *u8 = sys_mmap(40) 25 path[0]=0x2F as u8; path[1]=0x74 as u8; path[2]=0x6D as u8; path[3]=0x70 as u8 26 path[4]=0x2F as u8; path[5]=0x6E as u8; path[6]=0x78 as u8; path[7]=0x5F as u8 27 path[8]=0x62 as u8; path[9]=0x65 as u8; path[10]=0x6E as u8; path[11]=0x63 as u8 28 path[12]=0x68 as u8; path[13]=0x5F as u8; path[14]=0x70 as u8; path[15]=0x65 as u8 29 path[16]=0x72 as u8; path[17]=0x73 as u8; path[18]=0x69 as u8; path[19]=0x73 as u8 30 path[20]=0x74 as u8; path[21]=0x5F as u8; path[22]=0x73 as u8; path[23]=0x6D as u8 31 path[24]=0x6F as u8; path[25]=0x6B as u8; path[26]=0x65 as u8; path[27]=0x2E as u8 32 path[28]=0x74 as u8; path[29]=0x73 as u8; path[30]=0x76 as u8 33 let path_len: nx_int = 31 34 35 // 3: first call -- truncate to empty via O_TRUNC opener, then write 36 let pz: *u8 = sys_mmap(path_len + 1) 37 var i: nx_int = 0 38 while i < path_len { pz[i] = path[i]; i = i + 1 } 39 pz[path_len] = 0 as u8 40 let fd_trunc: i64 = sys_openat_wr(pz, 420) 41 if fd_trunc < 0 { return 6 } 42 sys_close(fd_trunc) 43 44 // 4: write a sample row "row_a\tvalue_a\n" (13 bytes) 45 let row_a: *u8 = sys_mmap(13) 46 row_a[0]=0x72 as u8; row_a[1]=0x6F as u8; row_a[2]=0x77 as u8 47 row_a[3]=0x5F as u8; row_a[4]=0x61 as u8; row_a[5]=0x09 as u8 48 row_a[6]=0x76 as u8; row_a[7]=0x61 as u8; row_a[8]=0x6C as u8 49 row_a[9]=0x75 as u8; row_a[10]=0x65 as u8; row_a[11]=0x5F as u8 50 row_a[12]=0x61 as u8 51 let nl: *u8 = sys_mmap(1); nl[0] = 0x0A as u8 52 53 // Write row_a + "\n" via one-shot wrapper 54 let row_a_buf: *u8 = sys_mmap(14) 55 var k: nx_int = 0 56 while k < 13 { row_a_buf[k] = row_a[k]; k = k + 1 } 57 row_a_buf[13] = 0x0A as u8 58 let n1: i64 = nx_bc_persist_row(path, path_len, row_a_buf, 14) 59 if n1 != 14 { return 7 } 60 61 // 5: append second row "row_b\tvalue_b\n" (13 bytes + \n = 14) 62 let row_b_buf: *u8 = sys_mmap(14) 63 row_b_buf[0]=0x72 as u8; row_b_buf[1]=0x6F as u8; row_b_buf[2]=0x77 as u8 64 row_b_buf[3]=0x5F as u8; row_b_buf[4]=0x62 as u8; row_b_buf[5]=0x09 as u8 65 row_b_buf[6]=0x76 as u8; row_b_buf[7]=0x61 as u8; row_b_buf[8]=0x6C as u8 66 row_b_buf[9]=0x75 as u8; row_b_buf[10]=0x65 as u8; row_b_buf[11]=0x5F as u8 67 row_b_buf[12]=0x62 as u8; row_b_buf[13]=0x0A as u8 68 let n2: i64 = nx_bc_persist_row(path, path_len, row_b_buf, 14) 69 if n2 != 14 { return 8 } 70 71 // 6: read back the file -- expect 28 bytes "row_a\tvalue_a\nrow_b\tvalue_b\n" 72 let fd_r: i64 = sys_openat_rd(pz) 73 if fd_r < 0 { return 9 } 74 let read_buf: *u8 = sys_mmap(64) 75 let n_read: i64 = sys_read(fd_r, read_buf, 64) 76 sys_close(fd_r) 77 if n_read != 28 { return 10 } 78 79 // 7: verify byte-exact content 80 if read_buf[0] != (0x72 as u8) { return 11 } // 'r' 81 if read_buf[4] != (0x61 as u8) { return 12 } // 'a' 82 if read_buf[5] != (0x09 as u8) { return 13 } // \t 83 if read_buf[13] != (0x0A as u8) { return 14 } // \n 84 if read_buf[14] != (0x72 as u8) { return 15 } // start of row 2 85 if read_buf[18] != (0x62 as u8) { return 16 } // 'b' 86 if read_buf[27] != (0x0A as u8) { return 17 } // trailing \n 87 88 // 8: low-level path -- open + write + close manually 89 let fd2: i64 = nx_bc_persist_open_append(path, path_len) 90 if fd2 < 0 { return 18 } 91 let row_c_buf: *u8 = sys_mmap(14) 92 row_c_buf[0]=0x72 as u8; row_c_buf[1]=0x6F as u8; row_c_buf[2]=0x77 as u8 93 row_c_buf[3]=0x5F as u8; row_c_buf[4]=0x63 as u8; row_c_buf[5]=0x09 as u8 94 row_c_buf[6]=0x76 as u8; row_c_buf[7]=0x61 as u8; row_c_buf[8]=0x6C as u8 95 row_c_buf[9]=0x75 as u8; row_c_buf[10]=0x65 as u8; row_c_buf[11]=0x5F as u8 96 row_c_buf[12]=0x63 as u8; row_c_buf[13]=0x0A as u8 97 let wn: i64 = nx_bc_persist_write(fd2, row_c_buf, 14) 98 if wn != 14 { return 19 } 99 if nx_bc_persist_close(fd2) != NX_BCPS_OK { return 20 } 100 101 // File should now be 42 bytes (28 + 14) 102 let fd_r2: i64 = sys_openat_rd(pz) 103 if fd_r2 < 0 { return 21 } 104 let read_buf2: *u8 = sys_mmap(64) 105 let n_read2: i64 = sys_read(fd_r2, read_buf2, 64) 106 sys_close(fd_r2) 107 if n_read2 != 42 { return 22 } 108 // Last row begins at offset 28: "row_c\tvalue_c\n" 109 if read_buf2[28] != (0x72 as u8) { return 23 } 110 if read_buf2[32] != (0x63 as u8) { return 24 } // 'c' 111 if read_buf2[41] != (0x0A as u8) { return 25 } // trailing \n 112 113 // 9: null guards 114 let null_buf: *u8 = (0 as i64) as *u8 115 if nx_bc_persist_row(null_buf, 10, row_a_buf, 14) >= 0 { return 26 } 116 if nx_bc_persist_row(path, path_len, null_buf, 14) >= 0 { return 27 } 117 if nx_bc_persist_row(path, 0, row_a_buf, 14) >= 0 { return 28 } 118 if nx_bc_persist_row(path, -1, row_a_buf, 14) >= 0 { return 29 } 119 if nx_bc_persist_row(path, path_len, row_a_buf, 0) >= 0 { return 30 } 120 if nx_bc_persist_row(path, path_len, row_a_buf, -5) >= 0 { return 31 } 121 122 // 10: open with invalid path -- expect negative verdict 123 let bad_path: *u8 = sys_mmap(40) 124 // "/tmp/no/such/dir/file.tsv" ~ 25 bytes 125 bad_path[0]=0x2F as u8; bad_path[1]=0x74 as u8; bad_path[2]=0x6D as u8 126 bad_path[3]=0x70 as u8; bad_path[4]=0x2F as u8; bad_path[5]=0x6E as u8 127 bad_path[6]=0x6F as u8; bad_path[7]=0x2F as u8; bad_path[8]=0x73 as u8 128 bad_path[9]=0x75 as u8; bad_path[10]=0x63 as u8; bad_path[11]=0x68 as u8 129 bad_path[12]=0x2F as u8; bad_path[13]=0x64 as u8; bad_path[14]=0x69 as u8 130 bad_path[15]=0x72 as u8; bad_path[16]=0x2F as u8; bad_path[17]=0x66 as u8 131 bad_path[18]=0x69 as u8; bad_path[19]=0x6C as u8; bad_path[20]=0x65 as u8 132 bad_path[21]=0x2E as u8; bad_path[22]=0x74 as u8; bad_path[23]=0x73 as u8 133 bad_path[24]=0x76 as u8 134 if nx_bc_persist_row(bad_path, 25, row_a_buf, 14) >= 0 { return 32 } 135 136 // 11: low-level close with invalid fd 137 if nx_bc_persist_close(-1) != NX_BCPS_INVALID { return 33 } 138 if nx_bc_persist_write(-1, row_a_buf, 14) >= 0 { return 34 } 139 140 return 0 141}