AtlatestRepositorysigil-websocket

sigil-websocket / tree / test / integrationnative-binary-client.sgl

1(import (sigil core)
2 (sigil websocket))
3
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 port
17 (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 string
24;; 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 see
28;; 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. It
32;; 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)