nx_mgmt_private_response_gate_t189.nx source
↩ module page · 51 lines · 3804 B
1import "nx_mgmt_private_response_candidate_t189.nx"
2import "nx_gate_verdict.nx"
3func p189_new()->*NxMgmtPrivateResponse{
4 let r:*NxMgmtPrivateResponse=sys_mmap(__size_of(NxMgmtPrivateResponse)) as *NxMgmtPrivateResponse;mpr_init(r);return r
5}
6func main()->i64{
7 let c:*i64=gv_ctr()
8 let dir:*u8="knowledge/gates/private-response-fixture-t189";let md:i64=sys_mkdir(dir,0x1c0)
9 gv_check("private fixture directory",md==0||md==FIO_EEXIST,c)
10 let path:*u8="knowledge/gates/private-response-fixture-t189/response.json"
11 let good:*u8="HTTP/1.1 200 OK\r\nContent-Length: 2\r\n\r\n{}"
12 let r:*NxMgmtPrivateResponse=p189_new()
13 gv_check("reserve private response before dispatch",mpr_begin(path,r)==0,c)
14 gv_check("temporary descriptor owner-only0600",sys_fstat_fd(r.fd,r.stat)==0&&sys_stat_permissions(r.stat)==MODE_0600,c)
15 let other:*NxMgmtPrivateResponse=p189_new()
16 gv_check("another invocation cannot take pending output",mpr_begin(path,other)==FIO_EEXIST,c);mpr_cleanup(other)
17 r.sent=1
18 gv_check("complete200 atomically published and synced",mpr_publish(good,mpr_len(good),mpr_len(good)+1,r)==0&&r.visible==1&&r.durable==1,c)
19 mpr_cleanup(r)
20 let n:*i64=sys_mmap(8) as *i64;let bytes:*u8=sys_read_file(path,n)
21 gv_check("only exact response body retained",*n==2&&bytes[0]==123 as u8&&bytes[1]==125 as u8,c)
22 let stat:*u8=sys_mmap(NX_STAT_X64_BYTES)
23 gv_check("published response remains0600",sys_fstatat(path,stat)==0&&sys_stat_permissions(stat)==MODE_0600,c)
24 gv_check("existing destination refused before request",mpr_begin(path,other)==FIO_EEXIST&&other.sent==0,c);mpr_cleanup(other)
25 gv_check("fixture response removal",fio_unlink(path)==0,c)
26 let denied:*u8="HTTP/1.1 429 Too Many Requests\r\nContent-Length: 4\r\n\r\nnope"
27 gv_check("reserve refusal fixture",mpr_begin(path,r)==0,c)
28 gv_check("upstream429 preserved without publishing body",mpr_publish(denied,mpr_len(denied),mpr_len(denied)+1,r)!=0&&r.status==429&&r.visible==0,c)
29 mpr_cleanup(r)
30 gv_check("refusal cleanup releases pending reservation",mpr_begin(path,other)==0,c);mpr_cleanup(other)
31 mpr_init(r)
32 let partial:*u8="HTTP/1.1 200 OK\r\nContent-Length: 3\r\n\r\n{}"
33 gv_check("incomplete body refused",mpr_body(partial,mpr_len(partial),mpr_len(partial)+1,r)<0,c)
34 let dup:*u8="HTTP/1.1 200 OK\r\nContent-Length: 2\r\ncontent-length: 2\r\n\r\n{}"
35 gv_check("duplicate length refused",mpr_body(dup,mpr_len(dup),mpr_len(dup)+1,r)<0,c)
36 let chunk:*u8="HTTP/1.1 200 OK\r\nTransfer-Encoding: chunked\r\nContent-Length: 2\r\n\r\n{}"
37 gv_check("unsupported transfer encoding refused",mpr_body(chunk,mpr_len(chunk),mpr_len(chunk)+1,r)<0,c)
38 gv_check("capture-full uncertainty refused",mpr_body(good,mpr_len(good),mpr_len(good),r)<0,c)
39 gv_check("short status line bounds refused",mpr_body("HTTP/1.1 200",12,13,r)<0,c)
40 let bad:*u8="HTTP/1.1 2x0 OK\r\nContent-Length: 2\r\n\r\n{}"
41 gv_check("malformed upstream status refused",mpr_body(bad,mpr_len(bad),mpr_len(bad)+1,r)<0,c)
42 gv_check("reserve write-refusal fixture",mpr_begin(path,r)==0,c)
43 sys_close(r.fd)
44 gv_check("write refusal stays invisible",mpr_publish(good,mpr_len(good),mpr_len(good)+1,r)!=0&&r.visible==0,c);mpr_cleanup(r)
45 gv_check("write failure cleanup allows retry",mpr_begin(path,r)==0,c)
46 sys_close(r.dirfd)
47 gv_check("directory-sync failure retains visible-not-durable state",mpr_publish(good,mpr_len(good),mpr_len(good)+1,r)!=0&&r.visible==1&&r.durable==0,c);mpr_cleanup(r)
48 gv_check("visible fixture remains available",mpr_absent(path)==FIO_EEXIST,c);fio_unlink(path)
49 gv_check("missing parent refused without dispatch",mpr_begin("knowledge/gates/private-response-no-parent-t189/response",r)<0&&r.sent==0,c);mpr_cleanup(r)
50 return gv_verdict("private-response",c,"Nonsecret fixtures, real filesystem errors, complete framing and private permissions; no upstream calls")
51}