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}