code wiki / _hdl_build / nx_apistack_problem_gate.nx
nx_apistack_problem_gate.nx source
↩ module page · 41 lines · 2743 B
1import "nx_gate_gn.nx"
2import "nx_gate_base.nx"
3// nx_apistack_problem_gate.nx -- hermetic gate for CAP-API-PROBLEM (RFC7807). Proves the stable machine-readable
4// error shape (type/title/status/detail), JSON escaping, and well-formedness. expect_exit: 0
5import "nx_syscalls.nx"
6import "nx_apistack_problem.nx"
7
8func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw("
9" as *u8); return ok }
10func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
11func g_contains(hay: *u8, hlen: i64, needle: *u8) -> i64 {
12 let nl: i64 = g_slen(needle); var i: i64 = 0
13 while i + nl <= hlen { var j: i64=0; var m: i64=1; while j<nl { if hay[i+j]!=needle[j] { m=0; j=nl } else { j=j+1 } } if m==1 { return 1 } i=i+1 }
14 return 0
15}
16
17func main(argc: i64, argv: *i64) -> i64 {
18 gp("=== nx_apistack_problem_gate (RFC7807 application/problem+json) ===\n" as *u8)
19 let out: *u8 = sys_mmap(4096)
20 let n: i64 = pr_build_json(out, "https://nishifamily.com/errors/forbidden" as *u8, "Forbidden" as *u8, 403, "operator level required for this action" as *u8)
21 gp(" BODY: " as *u8); sys_write(1, out, n); gp("\n" as *u8)
22 var pass: i64 = 0; var fail: i64 = 0
23
24 if g_contains(out, n, "\"type\":\"https://nishifamily.com/errors/forbidden\"" as *u8) == 1 { pass=pass+1; gp(" T1 stable type URI PASS\n" as *u8) } else { fail=fail+1; gp(" T1 FAIL\n" as *u8) }
25 if g_contains(out, n, "\"status\":403" as *u8) == 1 { pass=pass+1; gp(" T2 status 403 PASS\n" as *u8) } else { fail=fail+1; gp(" T2 FAIL\n" as *u8) }
26 if g_contains(out, n, "\"title\":\"Forbidden\"" as *u8) == 1 { pass=pass+1; gp(" T3 title PASS\n" as *u8) } else { fail=fail+1; gp(" T3 FAIL\n" as *u8) }
27 if g_contains(out, n, "\"detail\":\"operator level required for this action\"" as *u8) == 1 { pass=pass+1; gp(" T4 detail PASS\n" as *u8) } else { fail=fail+1; gp(" T4 FAIL\n" as *u8) }
28
29 // T5 JSON escaping of an embedded quote
30 let out2: *u8 = sys_mmap(4096)
31 let n2: i64 = pr_build_json(out2, "t" as *u8, "T" as *u8, 400, "he said \"hi\"" as *u8)
32 if g_contains(out2, n2, "\\\"hi\\\"" as *u8) == 1 { pass=pass+1; gp(" T5 embedded quotes JSON-escaped PASS\n" as *u8) } else { fail=fail+1; gp(" T5 FAIL\n" as *u8) }
33
34 // T6 well-formed
35 var wf: i64 = 0; if out[0]==(123 as u8) { if out[n-1]==(125 as u8) { wf=1 } }
36 if wf == 1 { pass=pass+1; gp(" T6 well-formed ({...}) PASS\n" as *u8) } else { fail=fail+1; gp(" T6 FAIL\n" as *u8) }
37
38 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
39 if fail == 0 { gp(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 }
40 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1
41}