code wiki / _hdl_build / nx_browser_doc_gate.nx

nx_browser_doc_gate.nx source

↩ module page · 184 lines · 9764 B

1// nx_browser_doc_gate.nx -- gate for the BROWSER-NATIVE document omnitool: nx_browser's load_page diverts a 2// registered document extension (.md/.csv/.docx via knowledge/doc_viewers.conf) through the nx_doc_view dispatch 3// and paints the renderer's HTML inline. E2E and headless: a fixture HTTP server (nx_browser_view_serve, docroot 4// _offc, :8099) serves real files; the REAL browser (SITETEST mode) navigates to them over its own HTTP stack. 5// Rows: 1 instruments 2 neg-html-untouched(+renders) 3 md-converted 4 csv-converted 5 docx-converted 6// 6 all-laid-out-in-browser 7 outputs-sovereign-0js 7// Stale-proofing: expected artifacts are OVERWRITTEN with STALE sentinels before run B (no unlink syscall), 8// so every marker found was written by THIS run. license_tier: ORIGINAL 9import "nx_syscalls.nx" 10 11func bg_slen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8) { n=n+1 } return n } 12func bg_p(s: *u8) -> i64 { sys_write(1, s, bg_slen(s)); return 0 } 13func bg_cat(dst: *u8, off: i64, s: *u8) -> i64 { var i: i64=0; while s[i]!=(0 as u8) { dst[off+i]=s[i]; i=i+1 } return off+i } 14func bg_catn(dst: *u8, off: i64, v: i64) -> i64 { 15 var o: i64=off; var m: i64=v; if m<0 { dst[o]=45 as u8; o=o+1; m=0-m } 16 let t: *u8=sys_mmap(28); var k: i64=0; if m==0 { t[0]=48 as u8; k=1 } 17 while m>0 { t[k]=(48+(m%10)) as u8; m=m/10; k=k+1 } 18 var i: i64=0; while i<k { dst[o+i]=t[k-1-i]; i=i+1 } return o+k 19} 20func bg_write(path: *u8, content: *u8) -> i64 { 21 let fd: i64=sys_openat_wr(path, 0x1a4); if fd<0 { return 0-1 } 22 sys_write(fd, content, bg_slen(content)); sys_close(fd); return 0 23} 24func bg_readall(path: *u8, szout: *i64) -> *u8 { 25 let fd: i64=sys_openat_rd(path); if fd<0 { szout[0]=0-1; return 0 as *u8 } 26 let buf: *u8=sys_mmap(8388608); var got: i64=0; var n: i64=1 27 while n>0 { n=sys_read(fd,(buf as i64+got) as *u8,131072); if n>0 { got=got+n } } 28 sys_close(fd); szout[0]=got; return buf 29} 30func bg_exists(path: *u8) -> i64 { 31 let fd: i64=sys_openat_rd(path); if fd<0 { return 0 } sys_close(fd); return 1 32} 33func bg_copy(src: *u8, dst: *u8) -> i64 { 34 let lp: *i64=sys_mmap(16) as *i64 35 let b: *u8=sys_read_file(src, lp) 36 if lp[0]<=0 { return 0-1 } 37 let fd: i64=sys_openat_wr(dst, 0x1a4); if fd<0 { return 0-1 } 38 sys_write(fd, b, lp[0]); sys_close(fd); return 0 39} 40func bg_sleep(ms: i64) -> i64 { let b: *u8=sys_mmap(8); sys_poll(b, 0, ms); return 0 } 41func bg_kill(pid: i64) -> i64 { return __syscall(129, pid, 9, 0, 0, 0, 0) } // kill(2), SIGKILL. rv64 kill=129; raw x86 62 is an RV64 KEY translated to lseek(8) -- the kill never happened (debt idx 2277) 42 43// fork+exec elf (argv = {elf, args...}) with stdout+stderr -> outpath; WAIT; return exit code. 44func bg_runv(elf: *u8, args: *i64, outpath: *u8) -> i64 { 45 let pid: i64=sys_fork() 46 if pid==0 { 47 if (outpath as i64)!=0 { let ofd: i64=sys_openat_wr(outpath,0x1a4); if ofd>=0 { sys_dup3(ofd,1,0); sys_dup3(ofd,2,0) } } 48 let argv: *i64=sys_mmap(128) as *i64 49 argv[0]=elf as i64; var i: i64=0; var go: i64=1 50 while go==1 { if args[i]==0 { go=0 } else { argv[i+1]=args[i]; i=i+1 } } 51 argv[i+1]=0 52 let envp: *i64=sys_mmap(16) as *i64; envp[0]=0 53 sys_execve(elf, argv, envp); sys_exit(127) 54 } 55 let st: *i64=sys_mmap(16) as *i64; sys_wait4(pid, st, 0) 56 let sig: i64=st[0]&0x7f; if sig!=0 { return 128+sig } 57 return (st[0]>>8)&0xff 58} 59 60// fork+exec elf detached (stdout -> logpath); NO wait; return child pid. 61func bg_spawn(elf: *u8, logpath: *u8) -> i64 { 62 let pid: i64=sys_fork() 63 if pid==0 { 64 let ofd: i64=sys_openat_wr(logpath,0x1a4); if ofd>=0 { sys_dup3(ofd,1,0); sys_dup3(ofd,2,0) } 65 let argv: *i64=sys_mmap(32) as *i64 66 argv[0]=elf as i64; argv[1]=0 67 let envp: *i64=sys_mmap(16) as *i64; envp[0]=0 68 sys_execve(elf, argv, envp); sys_exit(127) 69 } 70 return pid 71} 72 73func bg_has(path: *u8, needle: *u8) -> i64 { 74 let szp: *i64=sys_mmap(16) as *i64; let b: *u8=bg_readall(path, szp); let sz: i64=szp[0] 75 let n: i64=bg_slen(needle); if sz<n { return 0 } 76 var i: i64=0 77 while i+n<=sz { var ok: i64=1; var j: i64=0; while j<n { if b[i+j]!=needle[j] { ok=0; j=n } else { j=j+1 } } if ok==1 { return 1 } i=i+1 } 78 return 0 79} 80func bg_args2(a1: *u8, a2: *u8) -> *i64 { 81 let a: *i64=sys_mmap(32) as *i64; a[0]=a1 as i64; a[1]=a2 as i64; a[2]=0; return a 82} 83func bg_args0() -> *i64 { let a: *i64=sys_mmap(16) as *i64; a[0]=0; return a } 84func bg_row(name: *u8, pass: i64) -> i64 { 85 bg_p("ROW " as *u8); bg_p(name); if pass==1 { bg_p(" PASS\n" as *u8) } else { bg_p(" FAIL\n" as *u8) } return pass 86} 87 88func main(argc: i64, argv: *i64) -> i64 { 89 bg_p("=== BROWSER DOC-OMNITOOL GATE: nx_browser natively opens .md/.csv/.docx it navigates to (E2E, headless) ===\n" as *u8) 90 91 // instruments: browser + fixture server staged in /tmp (rebuild if missing), renderers blessed in _offc 92 if bg_exists("/tmp/nx_browser.sov.elf" as *u8)==0 { 93 bg_p(" building nx_browser (large)...\n" as *u8) 94 bg_runv("_offc/nx_sov_build_run.elf" as *u8, bg_args2("nx_browser" as *u8, "--build-only" as *u8), "/tmp/bdg_bb.log" as *u8) 95 } 96 if bg_exists("/tmp/nx_browser_view_serve.sov.elf" as *u8)==0 { 97 bg_runv("_offc/nx_sov_build_run.elf" as *u8, bg_args2("nx_browser_view_serve" as *u8, "--build-only" as *u8), "/tmp/bdg_bs.log" as *u8) 98 } 99 var pass: i64=0; var r: i64=0 100 r=1 101 if bg_exists("/tmp/nx_browser.sov.elf" as *u8)==0 { r=0 } 102 if bg_exists("/tmp/nx_browser_view_serve.sov.elf" as *u8)==0 { r=0 } 103 if bg_exists("_offc/nx_doc_view.elf" as *u8)==0 { r=0 } 104 if bg_exists("_offc/nx_md.elf" as *u8)==0 { r=0 } 105 if bg_exists("_offc/nx_csv.elf" as *u8)==0 { r=0 } 106 if bg_exists("_offc/nx_docx.elf" as *u8)==0 { r=0 } 107 pass=pass+bg_row("instruments" as *u8, r) 108 109 // fixtures into the server docroot (_offc) 110 bg_write("_offc/bdg_neg.html" as *u8, "<!DOCTYPE html><html><head><title>neg</title></head><body><h1>Plain page</h1><p>normal html pipeline</p></body></html>\n" as *u8) 111 bg_write("_offc/bdg_t.md" as *u8, "# Title\n\nHello **world** from the browser.\n\n- one\n- two\n" as *u8) 112 bg_write("_offc/bdg_t.csv" as *u8, "Name,Role,City\nAlice,Lead,Denver\nBob,Eng,Provo\n" as *u8) 113 bg_copy("web_assets/vizsla_agreement_demo.docx" as *u8, "_offc/bdg_t.docx" as *u8) 114 if bg_exists("_url.txt" as *u8)==0 { bg_write("_url.txt" as *u8, "http://127.0.0.1:8099/bdg_neg.html\n" as *u8) } 115 116 // fixture server up (or already up -- same docroot either way) 117 let srvpid: i64=bg_spawn("/tmp/nx_browser_view_serve.sov.elf" as *u8, "/tmp/bdg_srv.log" as *u8) 118 bg_sleep(700) 119 120 // RUN A (negative): plain .html must take the normal pipeline -- no doc staging file appears 121 bg_write("/tmp/nxsites" as *u8, "http://127.0.0.1:8099/bdg_neg.html\n" as *u8) 122 bg_runv("/tmp/nx_browser.sov.elf" as *u8, bg_args0(), "/tmp/bdg_runA.txt" as *u8) 123 r=0 124 if bg_has("/tmp/bdg_runA.txt" as *u8, "boxes=" as *u8)==1 { 125 if bg_has("/tmp/bdg_runA.txt" as *u8, "FETCH-FAIL" as *u8)==0 { 126 if bg_exists("/tmp/nx_bdoc_in.html" as *u8)==0 { r=1 } 127 } 128 } 129 pass=pass+bg_row("neg-html-normal-pipeline" as *u8, r) 130 131 // stale-proof the expected artifacts, then RUN B: the browser navigates to md + csv + docx 132 bg_write("/tmp/nx_bdoc_md.html" as *u8, "STALE\n" as *u8) 133 bg_write("/tmp/nx_bdoc_csv.html" as *u8, "STALE\n" as *u8) 134 bg_write("/tmp/nx_bdoc_docx.html" as *u8, "STALE\n" as *u8) 135 bg_write("/tmp/nxsites" as *u8, "http://127.0.0.1:8099/bdg_t.md\nhttp://127.0.0.1:8099/bdg_t.csv\nhttp://127.0.0.1:8099/bdg_t.docx\n" as *u8) 136 bg_runv("/tmp/nx_browser.sov.elf" as *u8, bg_args0(), "/tmp/bdg_runB.txt" as *u8) 137 138 r=0 139 if bg_has("/tmp/nx_bdoc_md.html" as *u8, "<h1>Title</h1>" as *u8)==1 { if bg_has("/tmp/nx_bdoc_md.html" as *u8, "<b>world</b>" as *u8)==1 { r=1 } } 140 pass=pass+bg_row("md-converted-in-browser" as *u8, r) 141 142 r=0 143 if bg_has("/tmp/nx_bdoc_csv.html" as *u8, "<th>Name</th>" as *u8)==1 { if bg_has("/tmp/nx_bdoc_csv.html" as *u8, "<td>Denver</td>" as *u8)==1 { r=1 } } 144 pass=pass+bg_row("csv-converted-in-browser" as *u8, r) 145 146 r=0 147 if bg_has("/tmp/nx_bdoc_docx.html" as *u8, "<h2>Venue Booking Agreement</h2>" as *u8)==1 { r=1 } 148 pass=pass+bg_row("docx-converted-in-browser" as *u8, r) 149 150 r=0 151 if bg_has("/tmp/bdg_runB.txt" as *u8, "SITETEST n=3" as *u8)==1 { 152 if bg_has("/tmp/bdg_runB.txt" as *u8, "FETCH-FAIL" as *u8)==0 { 153 if bg_has("/tmp/bdg_runB.txt" as *u8, "doc omnitool rendered" as *u8)==1 { r=1 } 154 } 155 } 156 pass=pass+bg_row("all-laid-out-in-browser" as *u8, r) 157 158 r=1 159 if bg_has("/tmp/nx_bdoc_md.html" as *u8, "<script" as *u8)==1 { r=0 } 160 if bg_has("/tmp/nx_bdoc_csv.html" as *u8, "<script" as *u8)==1 { r=0 } 161 if bg_has("/tmp/nx_bdoc_docx.html" as *u8, "<script" as *u8)==1 { r=0 } 162 pass=pass+bg_row("outputs-sovereign-0js" as *u8, r) 163 164 bg_kill(srvpid) 165 166 let permil: i64=(pass*1000)/7 167 let logfd: i64=sys_openat_append("knowledge/status/vizsla_gate.log" as *u8, 0x1a4) 168 var fdi: i64=0 169 while fdi<2 { 170 var fd: i64=1; if fdi==1 { fd=logfd } 171 if fd>0 { 172 let line: *u8=sys_mmap(256); var o: i64=0 173 o=bg_cat(line,o,"BROWSER-DOC-GATE epoch=" as *u8); o=bg_catn(line,o,sys_now_realtime_sec()) 174 o=bg_cat(line,o," rows=7 pass=" as *u8); o=bg_catn(line,o,pass) 175 o=bg_cat(line,o," permil=" as *u8); o=bg_catn(line,o,permil) 176 if pass==7 { o=bg_cat(line,o," verdict=GREEN\n" as *u8) } else { o=bg_cat(line,o," verdict=RED\n" as *u8) } 177 sys_write(fd, line, o) 178 } 179 fdi=fdi+1 180 } 181 if logfd>0 { sys_close(logfd) } 182 if pass==7 { return 0 } 183 return 1 184}