AtlatestRepositorysigil-websocket
sigil-websocket / tree / test / integrationnative-binary-client.sgl
1
(import (sigil core)2
(sigil websocket))4
(define (expect-bytevector=? actual expected)5
(unless (and (bytevector? actual)6
(= (bytevector-length actual) (bytevector-length expected))7
(let loop ((i 0))8
(or (= i (bytevector-length expected))9
(and (= (bytevector-u8-ref actual i)10
(bytevector-u8-ref expected i))11
(loop (+ i 1))))))12
(error "native WebSocket binary payload was not byte-exact")))14
(define large (make-bytevector (+ (* 2 1024 1024) 37) #x5a))16
(define port17
(or (and (getenv "SIGIL_WS_TEST_PORT")18
(string->number (getenv "SIGIL_WS_TEST_PORT")))19
(error "native binary client requires a port")))20
(define conn (ws-connect (string-append "ws://127.0.0.1:" (number->string port) "/")))21
(unless conn (error "native ws-connect failed"))23
;; This frame deliberately includes bytes that cannot survive a UTF-8 string24
;; round trip. The server verifies the masked client frame byte-for-byte.25
(ws-send-binary conn (bytevector #x00 #x7f #x80 #xff #x41))27
;; Larger than a typical nonblocking socket send buffer: the server must see28
;; one complete masked message, never a prefix or separately remasked suffix.29
(ws-send-binary conn large)31
;; The server coalesces its first binary frame with the HTTP 101 response. It32
;; must remain in the connection buffer after handshake validation.33
(define first (ws-receive conn))34
(unless (and (ws-message? first) (eq? (ws-message-type first) 'binary))35
(error "coalesced server binary frame was lost"))36
(expect-bytevector=? (ws-message-data first) (bytevector #xff #x00 #x80 #x42))38
;; A later frame proves the ordinary native receive path remains byte-exact.39
(define second (ws-receive conn))40
(unless (and (ws-message? second) (eq? (ws-message-type second) 'binary))41
(error "later server binary frame was not returned"))42
(expect-bytevector=? (ws-message-data second) (bytevector #x10 #xfe #x20 #x80))44
(display "native-websocket-binary-ok")45
(newline)46
(ws-close conn)