code wiki / (root) / nx_websocket_handshake_test.nx

nx_websocket_handshake_test.nx source

↩ module page · 50 lines · 1666 B

1// nx_websocket_handshake_test.nx -- KAT for ws_accept (RFC 6455 §1.3 + §4.2.2). 2// 3// Promotes the inline main() invariant in nx_websocket_handshake.nx 4// to a formal regression gate. Adds extra cases to cover the 5// invariants documented at WH1 + WH2. 6// 7// Canonical RFC 6455 §1.3 worked example: 8// Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== 9// Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 10// 11// expect_exit: 0 12// license_tier: ORIGINAL 13 14import "nx_syscalls.nx" 15import "nx_websocket_handshake.nx" 16 17func _bytes_eq(a: *u8, b: *u8, n: i64) -> i64 { 18 var i: i64 = 0 19 while i < n { 20 if a[i] != b[i] { return 0 } 21 i = i + 1 22 } 23 return 1 24} 25 26func main() -> i64 { 27 // ---- T1: RFC 6455 §1.3 canonical example ---- 28 let out: *u8 = sys_mmap(64) 29 let n: i64 = ws_accept("dGhlIHNhbXBsZSBub25jZQ==" as *u8, 24, out) 30 if n != WS_ACCEPT_LEN { return 1 } 31 if WS_ACCEPT_LEN != 28 { return 2 } // WH2: output must be 28 chars 32 let expected: *u8 = "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=" as *u8 33 if _bytes_eq(out, expected, 28) != 1 { return 3 } 34 35 // ---- T2: different key produces different accept ---- 36 let out2: *u8 = sys_mmap(64) 37 ws_accept("AbCdEfGhIjKlMnOpQrStUv==" as *u8, 24, out2) 38 if _bytes_eq(out, out2, 28) == 1 { return 4 } // must differ 39 40 // ---- T3: deterministic -- same input twice yields same output ---- 41 let out3: *u8 = sys_mmap(64) 42 ws_accept("dGhlIHNhbXBsZSBub25jZQ==" as *u8, 24, out3) 43 if _bytes_eq(out, out3, 28) != 1 { return 5 } 44 45 // "PASS\n" 46 let ok: *u8 = sys_mmap(8) 47 ok[0]=80; ok[1]=65; ok[2]=83; ok[3]=83; ok[4]=10 48 sys_write(1, ok, 5) 49 return 0 50}