code wiki / _hdl_build / nx_pm_review_log_test.nx

nx_pm_review_log_test.nx source

↩ module page · 49 lines · 2557 B

1// nx_pm_review_log_test.nx -- prove the PM review log: write a deliverable + a gap, read back, confirm 2// both structured lines landed on disk with the right kind/verdict. Exit 0 on 6/6. license_tier: ORIGINAL 3 4import "nx_pm_review_log.nx" 5import "nx_syscalls.nx" 6 7func qt_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 8func qt_num(v: i64) -> i64 { let bb: *u8 = sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;k=1}; while m>0{t[k]=48+(m%10);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 } 9 10// find substring `needle` (len nl) in buf (len n): 1 if present. 11func qt_has(buf: *u8, n: i64, needle: *u8, nl: i64) -> i64 { 12 var i: i64 = 0 13 while i <= n - nl { 14 var j: i64 = 0; var ok: i64 = 1 15 while j < nl { if buf[i+j] != needle[j] { ok = 0; j = nl } j = j + 1 } 16 if ok == 1 { return 1 } 17 i = i + 1 18 } 19 return 0 20} 21 22func main() -> i64 { 23 qt_puts("=== PM REVIEW LOG ===\n" as *u8) 24 let path: *u8 = "/tmp/_pm_review_test.log" as *u8 25 // truncate for a clean test 26 let tfd: i64 = sys_openat_wr(path, 0x1a4); sys_close(tfd) 27 let fd: i64 = pm_open(path) 28 pm_deliverable(fd, "retire-gcc/x86_64" as *u8, "sovereign assemble+link" as *u8, "nx_cc->nxasm_x86->run, no gcc" as *u8) 29 pm_gap(fd, "retire-gcc/x86_64" as *u8, "NEEDS-CAPABILITY" as *u8, "nxasm_x86 coverage" as *u8, "unencoded instruction in target .s" as *u8) 30 sys_close(fd) 31 32 let rfd: i64 = sys_openat_rd(path) 33 let buf: *u8 = sys_mmap(2048) 34 let got: i64 = sys_read(rfd, buf, 2047) 35 qt_puts(" log bytes=" as *u8); qt_num(got); qt_puts("\n" as *u8) 36 37 let r: *i64 = sys_mmap(8*8) as *i64 38 r[0]=0; if got > 40 { r[0]=1 } 39 r[1]=0; if qt_has(buf, got, "PMLOG kind=DELIVERABLE" as *u8, 22) == 1 { r[1]=1 } 40 r[2]=0; if qt_has(buf, got, "PMLOG kind=GAP" as *u8, 14) == 1 { r[2]=1 } 41 r[3]=0; if qt_has(buf, got, "verdict=NEEDS-CAPABILITY" as *u8, 24) == 1 { r[3]=1 } 42 r[4]=0; if qt_has(buf, got, "area=retire-gcc/x86_64" as *u8, 22) == 1 { r[4]=1 } 43 r[5]=0; if qt_has(buf, got, "verdict=OK" as *u8, 10) == 1 { r[5]=1 } 44 var pass: i64 = 0; var i: i64 = 0 45 while i < 6 { pass = pass + r[i]; i = i + 1 } 46 qt_puts(" passed " as *u8); qt_num(pass); qt_puts("/6\n" as *u8) 47 if pass == 6 { qt_puts(" PM review log works: the team can flag deliverables + gaps for our joint review.\n" as *u8); sys_exit(0); return 0 } 48 qt_puts(" FAIL\n" as *u8); sys_exit(1); return 1 49}