code wiki / (root) / nx_toner_liberate_test.nx

nx_toner_liberate_test.nx source

↩ module page · 70 lines · 3286 B

1// nx_toner_liberate_test.nx -- gate for the toner-liberation classifier. Unique exit codes per invariant: 2// 1x idle + accepting + toner-low-warning (the REAL Brother) -> PRINTS_NOW, toner_flag=1 3// 2x stopped + toner-empty-error -> NEEDS_CONTINUE, toner_flag=1 4// 3x idle + NOT accepting + marker-supply-low-warning -> NEEDS_RESET, toner_flag=1 5// 4x healthy idle + accepting + none -> PRINTS_NOW, toner_flag=0 6// 5x malformed response -> UNKNOWN 7// expect_exit: 0 license_tier: ORIGINAL 8 9import "nx_syscalls.nx" 10import "nx_ipp_codec.nx" 11import "nx_toner_liberate.nx" 12 13func t_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 14 15func base(buf: *u8, state: i64, accepting: i64) -> i64 { 16 var o: i64 = nx_ipp_begin(buf, 1, 1, NX_IPP_STATUS_OK, 1) 17 o = nx_ipp_group(buf, o, NX_IPP_GRP_PRINTER) 18 o = nx_ipp_attr_int(buf, o, NX_IPP_VT_ENUM, "printer-state", 13, state) 19 o = nx_ipp_attr_bool(buf, o, "printer-is-accepting-jobs", 25, accepting) 20 return o 21} 22 23func main() -> i64 { 24 let sc: *i64 = sys_mmap(128) as *i64 25 let tf: *i64 = sys_mmap(16) as *i64 26 27 // KAT 1: the real Brother -- idle, accepting, toner-low-warning 28 let a: *u8 = sys_mmap(2048) 29 var oa: i64 = base(a, NX_IPP_PSTATE_IDLE, 1) 30 oa = nx_ipp_attr(a, oa, NX_IPP_VT_KEYWORD, "printer-state-reasons", 21, "toner-low-warning", 17) 31 oa = nx_ipp_end(a, oa) 32 if nx_toner_liberate(a, oa, sc, tf) != NX_TL_PRINTS_NOW { return 1 } 33 if tf[0] != 1 { return 2 } 34 35 // KAT 2: stopped + toner-empty-error -> NEEDS_CONTINUE 36 let b: *u8 = sys_mmap(2048) 37 var ob: i64 = base(b, NX_IPP_PSTATE_STOPPED, 1) 38 ob = nx_ipp_attr(b, ob, NX_IPP_VT_KEYWORD, "printer-state-reasons", 21, "toner-empty-error", 17) 39 ob = nx_ipp_end(b, ob) 40 if nx_toner_liberate(b, ob, sc, tf) != NX_TL_NEEDS_CONTINUE { return 10 } 41 if tf[0] != 1 { return 11 } 42 43 // KAT 3: idle + NOT accepting + marker-supply-low-warning -> NEEDS_RESET 44 let c: *u8 = sys_mmap(2048) 45 var oc: i64 = base(c, NX_IPP_PSTATE_IDLE, 0) 46 oc = nx_ipp_attr(c, oc, NX_IPP_VT_KEYWORD, "printer-state-reasons", 21, "marker-supply-low-warning", 25) 47 oc = nx_ipp_end(c, oc) 48 if nx_toner_liberate(c, oc, sc, tf) != NX_TL_NEEDS_RESET { return 20 } 49 50 // KAT 4: healthy -> PRINTS_NOW, no toner flag 51 let d: *u8 = sys_mmap(2048) 52 var od: i64 = base(d, NX_IPP_PSTATE_IDLE, 1) 53 od = nx_ipp_attr(d, od, NX_IPP_VT_KEYWORD, "printer-state-reasons", 21, "none", 4) 54 od = nx_ipp_end(d, od) 55 if nx_toner_liberate(d, od, sc, tf) != NX_TL_PRINTS_NOW { return 30 } 56 if tf[0] != 0 { return 31 } 57 58 // KAT 5: malformed (value-length overrun) -> UNKNOWN 59 let e: *u8 = sys_mmap(2048) 60 var oe: i64 = base(e, NX_IPP_PSTATE_IDLE, 1) 61 e[oe] = NX_IPP_VT_ENUM as u8 62 oe = oe + 1 63 oe = nx_ipp_put_u16(e, oe, 13) 64 oe = nx_ipp_memcpy(e, oe, "printer-state", 13) 65 oe = nx_ipp_put_u16(e, oe, 0x7fff) // lying length 66 if nx_toner_liberate(e, oe, sc, tf) != NX_TL_UNKNOWN { return 40 } 67 68 t_puts("nx_toner_liberate: 5/5 KAT groups PASS (prints-now + needs-continue + needs-reset + healthy + malformed->unknown)\n") 69 return 0 70}