nx_id_handler_gate_t190c.nx source
↩ module page · 53 lines · 3749 B
1import "nx_tools_api_idem_candidate_t190.nx"
2import "nx_gate_verdict.nx"
3func eg_put(path:*u8,body:*u8,n:i64)->i64{
4 let fd:i64=sys_openat_wr(path,MODE_0600);if fd<0{return fd}
5 let w:i64=sys_write(fd,body,n);let c:i64=sys_close(fd)
6 if w!=n||c!=0{return 0-1};return 0
7}
8func eg_call(req:*u8,rn:i64,out:*u8)->i64{
9 return ta_handle_pfx("knowledge/fixture-",req,rn,out)
10}
11func main()->i64{
12 let c:*i64=gv_ctr()
13 if sys_mkdir("knowledge/gates/idem-handler-t190c",0x1c0)!=0{return 2}
14 if sys_chdir("knowledge/gates/idem-handler-t190c")!=0{return 2}
15 if sys_mkdir("knowledge",0x1c0)!=0{return 2}
16 if sys_mkdir("knowledge/status",0x1c0)!=0{return 2}
17 if sys_mkdir("_jobs",0x1c0)!=0{return 2}
18 let secret:*u8="isolated-test-key-not-a-live-credential"
19 gv_check("isolated provisioned test key",eg_put(TA_CAP_KEYFILE,secret,ta_slen(secret))==0,c)
20 let cap:*u8=sys_mmap(1024)
21 let cn:i64=capt_issue(secret,ta_slen(secret),"argecho",7,sys_now_realtime_sec()+3600,190,cap,1024)
22 gv_check("scoped nonsecret fixture capability",cn>0,c)
23 if cn<=0{return 3}
24 let req:*u8=sys_mmap(4096)
25 var rn:i64=ta_cat(req,0,"POST /mcp HTTP/1.1\r\nHost: fixture\r\nX-Nishi-Cap: ")
26 rn=ta_catb(req,rn,cap,cn)
27 rn=ta_cat(req,rn,"\r\n\r\n{\"jsonrpc\":\"2.0\",\"id\":190,\"method\":\"tools/call\",\"params\":{\"name\":\"argecho\",\"arguments\":{\"argv\":[]},\"_idem\":\"request190\"}}")
28 let out:*u8=sys_mmap(TA_MAGIC_1048576)
29 let n:i64=eg_call(req,rn,out)
30 gv_check("actual authorized MCP refuses absent evidence",ta_indexof(out,n,"EVIDENCE_UNAVAILABLE")>=0,c)
31 gv_check("actual MCP declares undispatched",ta_indexof(out,n,"\"dispatched\":false")>=0,c)
32 let hex:*u8=sys_mmap(TI_HEX_CH+8);ti_key_hex("request190",10,hex)
33 let claim:*u8=sys_mmap(TI_PATH_CAP);ti_claim_path(TI_DIR,hex,claim)
34 let st:*u8=sys_mmap(NX_STAT_X64_BYTES)
35 gv_check("missing evidence creates no execution claim",sys_fstatat(claim,st)==0-2,c)
36 gv_check("explicit empty ledger initialization",eg_put(TI_LEDGER,"",0)==0,c)
37 let row:*u8=sys_mmap(128)
38 gv_check("empty ledger allows one reservation",ti_classify(TI_LEDGER,TI_DIR,"new190",6,hex,row,128,sys_now_realtime_sec())==TI_NEW,c)
39 gv_check("same reservation is in flight",ti_classify(TI_LEDGER,TI_DIR,"new190",6,hex,row,128,sys_now_realtime_sec())==TI_INFLIGHT,c)
40 gv_check("retained result append",ti_record(TI_LEDGER,"new190",6,"lane=async tool=argecho job=190",ta_slen("lane=async tool=argecho job=190"))==1,c)
41 gv_check("same key replays retained result",ti_classify(TI_LEDGER,TI_DIR,"new190",6,hex,row,128,sys_now_realtime_sec())==TI_REPLAY,c)
42 gv_check("short caller buffer refuses as evidence error",ti_classify(TI_LEDGER,TI_DIR,"new190",6,hex,row,4,sys_now_realtime_sec())==TI_EVIDENCE_ERROR,c)
43 gv_check("malformed fixture retained",eg_put(TI_LEDGER,"broken",6)==0,c)
44 let bad:i64=eg_call(req,rn,out)
45 gv_check("actual MCP refuses corrupt ledger before execution",ta_indexof(out,bad,"EVIDENCE_UNAVAILABLE")>=0&&ta_indexof(out,bad,"\"dispatched\":false")>=0,c)
46 gv_check("corrupt evidence creates no execution claim",sys_fstatat(claim,st)==0-2,c)
47 row[0]=85 as u8
48 gv_check("zero capacity refuses without touching sentinel",ti_classify(TI_LEDGER,TI_DIR,"z",1,hex,row,0,0)==TI_EVIDENCE_ERROR&&row[0]==85 as u8,c)
49 gv_check("null row pointer refuses",ti_classify(TI_LEDGER,TI_DIR,"z",1,hex,0 as *u8,128,0)==TI_EVIDENCE_ERROR,c)
50 gv_check("null digest pointer refuses without touching row",ti_classify(TI_LEDGER,TI_DIR,"z",1,0 as *u8,row,128,0)==TI_EVIDENCE_ERROR&&row[0]==85 as u8,c)
51 gv_check("new error has explicit state name",ta_streq_n(ti_state_name(TI_EVIDENCE_ERROR),20,"EVIDENCE_UNAVAILABLE")==1,c)
52 return gv_verdict("idempotency-handler",c,"Isolated real filesystem and authenticated MCP handler; no live credentials or provider calls")
53}