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}