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}