AtlatestRepositorysigil-websocket
sigil-websocket / tree / testtest-websocket.sgl
1
(import (sigil test)2
(sigil websocket frame))4
;; ============================================================5
;; Frame opcodes6
;; ============================================================8
(test-group "frame opcodes"9
(test "opcode values"10
(assert-equal #x0 opcode-continuation)11
(assert-equal #x1 opcode-text)12
(assert-equal #x2 opcode-binary)13
(assert-equal #x8 opcode-close)14
(assert-equal #x9 opcode-ping)15
(assert-equal #xA opcode-pong))17
(test "opcode-control? identifies control frames"18
(assert-false (opcode-control? opcode-text))19
(assert-false (opcode-control? opcode-binary))20
(assert-true (opcode-control? opcode-close))21
(assert-true (opcode-control? opcode-ping))22
(assert-true (opcode-control? opcode-pong))))24
;; ============================================================25
;; Frame encoding26
;; ============================================================28
(test-group "frame encoding"29
(test "encode-text-frame produces bytevector"30
(let ((frame (encode-text-frame "hello")))31
(assert-true (bytevector? frame))32
(assert-true (> (bytevector-length frame) 5))))34
(test "encode-ping-frame produces bytevector"35
(let ((frame (encode-ping-frame)))36
(assert-true (bytevector? frame))))38
(test "encode-close-frame produces bytevector"39
(let ((frame (encode-close-frame)))40
(assert-true (bytevector? frame)))))42
;; ============================================================43
;; Frame encode/decode roundtrip44
;; ============================================================46
(test-group "frame roundtrip"47
(test "decode from encode-text-frame"48
;; encode-text-frame generates a masked frame for client use49
(let* ((encoded (encode-text-frame "hello"))50
(result (decode-frame encoded)))51
(assert-true (frame-decode-result? result))52
(let ((frame (frame-decode-result-frame result)))53
(when frame54
(assert-equal opcode-text (ws-frame-opcode frame)))))))56
;; ============================================================57
;; Masking58
;; ============================================================60
(test-group "masking"61
(test "generate-mask-key returns 4 bytes"62
(let ((key (generate-mask-key)))63
(assert-true (bytevector? key))64
(assert-equal 4 (bytevector-length key))))66
(test "apply-mask is reversible"67
(let* ((key (generate-mask-key))68
(data (make-bytevector 5))69
(masked (apply-mask data key))70
(unmasked (apply-mask masked key)))71
(assert-equal data unmasked)))73
(test "masking changes data"74
(let* ((key (generate-mask-key))75
(data (make-bytevector 16))76
(masked (apply-mask data key)))77
;; Masked should differ (unless mask key is all zeros, extremely unlikely)78
(assert-false (equal? data masked)))))80
(run-tests)