summaryrefslogtreecommitdiff
path: root/websocket-test.el
diff options
context:
space:
mode:
Diffstat (limited to 'websocket-test.el')
-rw-r--r--websocket-test.el174
1 files changed, 95 insertions, 79 deletions
diff --git a/websocket-test.el b/websocket-test.el
index 35589dd..d9d6976 100644
--- a/websocket-test.el
+++ b/websocket-test.el
@@ -24,11 +24,11 @@
(require 'ert)
(require 'websocket)
-(require 's)
-(eval-when-compile (require 'cl))
+;; (require 's)
+(eval-when-compile (require 'cl-lib))
(ert-deftest websocket-genbytes-length ()
- (loop repeat 100
+ (cl-loop repeat 100
do (should (= (string-bytes (websocket-genbytes 16)) 16))))
(ert-deftest websocket-calculate-accept ()
@@ -38,18 +38,21 @@
(websocket-calculate-accept "dGhlIHNhbXBsZSBub25jZQ=="))))
(defconst websocket-test-hello "\x81\x05\x48\x65\x6c\x6c\x6f"
- "'Hello' string example, taken from the RFC.")
+ "\"Hello\" string example, taken from the RFC.")
(defconst websocket-test-masked-hello
"\x81\x85\x37\xfa\x21\x3d\x7f\x9f\x4d\x51\x58"
- "'Hello' masked string example, taken from the RFC.")
+ "\"Hello\" masked string example, taken from the RFC.")
(ert-deftest websocket-get-bytes ()
(should (equal #x5 (websocket-get-bytes "\x5" 1)))
(should (equal #x101 (websocket-get-bytes "\x1\x1" 2)))
(should (equal #xffffff
(websocket-get-bytes "\x0\x0\x0\x0\x0\xFF\xFF\xFF" 8)))
- (should-error (websocket-get-bytes "\x0\x0\x0\x1\x0\x0\x0\x1" 8)
+ (unless (fboundp 'bindat-type)
+ (should-error (websocket-get-bytes "\x0\x0\x0\x1\x0\x0\x0\x1" 8)
+ :type 'websocket-unparseable-frame))
+ (should-error (websocket-get-bytes "\x80\x0\x0\x0\x0\x0\x0\x0" 8)
:type 'websocket-unparseable-frame)
(should-error (websocket-get-bytes "\x0\x0\x0" 3))
(should-error (websocket-get-bytes "\x0" 2) :type 'websocket-unparseable-frame))
@@ -107,7 +110,7 @@
(- (length websocket-test-masked-hello) (+ i 1)))))))
(defun websocket-test-header-with-lines (&rest lines)
- (mapconcat 'identity (append lines '("\r\n")) "\r\n"))
+ (mapconcat #'identity (append lines '("\r\n")) "\r\n"))
(ert-deftest websocket-verify-response-code ()
(should (websocket-verify-response-code "HTTP/1.1 101"))
@@ -226,7 +229,7 @@
"Sec-WebSocket-Key: key\r\n"
"Sec-WebSocket-Version: 13\r\n")))
(cl-letf (((symbol-function 'url-cookie-generate-header-lines)
- (lambda (host localpart secure) "")))
+ (lambda (_host _localpart _secure) "")))
(should (equal (concat base-headers "\r\n")
(websocket-create-headers "ws://www.example.com/path"
"key" nil nil nil)))
@@ -266,20 +269,21 @@
(websocket-create-headers "ws://www.example.com:123/path" "key" nil nil nil)))))
(ert-deftest websocket-process-headers ()
- (cl-flet ((url-cookie-handle-set-cookie
- (text)
- (should (equal text "foo=bar;"))
- ;; test that we have set the implicit buffer variable needed
- ;; by url-cookie-handle-set-cookie
- (should (equal url-current-object
- (url-generic-parse-url "ws://example.com/path")))))
+ (cl-letf (((symbol-function 'url-cookie-handle-set-cookie)
+ (lambda (text)
+ (should (equal text "foo=bar;"))
+ ;; test that we have set the implicit buffer variable needed
+ ;; by url-cookie-handle-set-cookie
+ (should (equal url-current-object
+ (url-generic-parse-url "ws://example.com/path"))))))
(websocket-process-headers "ws://example.com/path"
(concat
"HTTP/1.1 101 Switching Protocols\r\n"
"Upgrade: websocket\r\n"
"Connection: Upgrade\r\n"
"Set-Cookie: foo=bar;\r\n\r\n")))
- (cl-flet ((url-cookie-handle-set-cookie (text) (should nil)))
+ (cl-letf (((symbol-function 'url-cookie-handle-set-cookie)
+ (lambda (_text) (should nil))))
(websocket-process-headers "ws://example.com/path"
"HTTP/1.1 101 Switching Protocols\r\n")))
@@ -289,7 +293,7 @@
(deleted)
(websocket (websocket-inner-create
:conn t :url t
- :on-message (lambda (websocket frame)
+ :on-message (lambda (_websocket frame)
(setq
processed
(websocket-frame-payload frame)))
@@ -305,7 +309,7 @@
processed))))
(setq sent nil)
(cl-letf (((symbol-function 'websocket-send)
- (lambda (websocket content) (setq sent content))))
+ (lambda (_websocket content) (setq sent content))))
(should (equal
(make-websocket-frame :opcode 'pong :payload "data" :completep t)
(progn
@@ -314,7 +318,7 @@
:payload "data")))
sent))))
(cl-letf (((symbol-function 'delete-process)
- (lambda (conn) (setq deleted t))))
+ (lambda (_conn) (setq deleted t))))
(should (progn
(funcall
(websocket-process-frame websocket
@@ -325,10 +329,10 @@
(let* ((error-called)
(websocket (websocket-inner-create
:conn t :url t :accept-string t
- :on-message (lambda (websocket frame)
+ :on-message (lambda (_websocket _frame)
(message "In on-message")
(error "err"))
- :on-error (lambda (ws type err)
+ :on-error (lambda (_ws type _err)
(should (eq 'on-message type))
(setq error-called t)))))
(funcall (websocket-process-frame websocket
@@ -344,9 +348,12 @@
(should (equal 70000 (websocket-get-bytes (websocket-to-bytes 70000 8) 8)))
;; Only run if the number we're testing with is not more than the system can
;; handle.
- (if (equal "1" (calc-eval (format "536870912 < %d" most-positive-fixnum)))
+ (if (and (not (fboundp 'bindat-type))
+ (equal "1" (calc-eval (format "536870912 < %d" most-positive-fixnum))))
(should-error (websocket-to-bytes 536870912 8)
:type 'websocket-frame-too-large))
+ (should-error (websocket-to-bytes (expt 2 63) 8)
+ :type 'websocket-frame-too-large)
(should-error (websocket-to-bytes 30 3))
(should-error (websocket-to-bytes 300 1))
;; I'd like to test the error for 32-byte systems on 8-byte lengths,
@@ -368,19 +375,22 @@
(websocket-read-frame
(websocket-encode-frame
(make-websocket-frame :opcode 'text
- :payload long-string) t)))))))
+ :payload long-string)
+ t)))))))
(cl-letf (((symbol-function 'websocket-genbytes)
- (lambda (n) (substring websocket-test-masked-hello 2 6))))
+ (lambda (_n) (substring websocket-test-masked-hello 2 6))))
(should (equal websocket-test-masked-hello
(websocket-encode-frame
(make-websocket-frame :opcode 'text :payload "Hello"
- :completep t) t))))
+ :completep t)
+ t))))
(should-not
(websocket-frame-completep
(websocket-read-frame
(websocket-encode-frame (make-websocket-frame :opcode 'text
:payload "Hello"
- :completep nil) t))))
+ :completep nil)
+ t))))
(should (equal 'close (websocket-frame-opcode
(websocket-read-frame
(websocket-encode-frame
@@ -422,10 +432,10 @@
(let ((sent-frames)
(processes-deleted))
(cl-letf (((symbol-function 'websocket-send)
- (lambda (websocket frame) (push frame sent-frames)))
+ (lambda (_websocket frame) (push frame sent-frames)))
((symbol-function 'websocket-openp)
- (lambda (websocket) t))
- ((symbol-function 'kill-buffer) (lambda (buffer) t))
+ (lambda (_websocket) t))
+ ((symbol-function 'kill-buffer) (lambda (_buffer) t))
((symbol-function 'delete-process)
(lambda (proc) (add-to-list 'processes-deleted proc))))
(websocket-close (websocket-inner-create
@@ -447,7 +457,7 @@
'open))
(setq open-callback-called t)
(error "Ignore me!"))
- :on-error (lambda (ws type err))))
+ :on-error (lambda (_ws _type _err) nil)))
(processed-frames)
(frame1 (make-websocket-frame :opcode 'text :payload "foo" :completep t
:length 9))
@@ -458,12 +468,11 @@
(websocket-encode-frame frame1 t)
(websocket-encode-frame frame2 t))))
(cl-letf (((symbol-function 'websocket-process-frame)
- (lambda (websocket frame)
- (lexical-let ((frame frame))
- (lambda () (push frame processed-frames)))))
+ (lambda (_websocket frame)
+ (lambda () (push frame processed-frames))))
((symbol-function 'websocket-verify-headers)
- (lambda (websocket output) t))
- ((symbol-function 'websocket-close) (lambda (websocket) t)))
+ (lambda (_websocket _output) t))
+ ((symbol-function 'websocket-close) (lambda (_websocket) t)))
(websocket-outer-filter fake-ws "HTTP/1.1 101 Switching Protocols\r\n")
(websocket-outer-filter fake-ws "Sec-")
(should (eq (websocket-ready-state fake-ws) 'connecting))
@@ -477,10 +486,10 @@
(websocket-outer-filter fake-ws (substring websocket-frames 2))
(should (equal (list frame2 frame1) processed-frames))
(should-not (websocket-inflight-input fake-ws)))
- (cl-letf (((symbol-function 'websocket-close) (lambda (websocket) t)))
+ (cl-letf (((symbol-function 'websocket-close) (lambda (_websocket) t)))
(let ((on-error-called))
(setf (websocket-ready-state fake-ws) 'connecting)
- (setf (websocket-on-open fake-ws) (lambda (ws &rest _) t))
+ (setf (websocket-on-open fake-ws) (lambda (_ws &rest _) t))
(setf (websocket-on-error fake-ws)
(lambda (_ type err)
(should (eq type 'on-open))
@@ -494,15 +503,15 @@
(websocket-closed-calledp)
(fake-ws (websocket-inner-create
:conn t :url t :accept-string t
- :on-open (lambda (websocket)
+ :on-open (lambda (_websocket)
(setq on-open-calledp t)))))
(cl-letf (((symbol-function 'websocket-verify-response-code)
- (lambda (output) t))
+ (lambda (_output) t))
((symbol-function 'websocket-verify-headers)
- (lambda (websocket output) (error "Bad headers!")))
+ (lambda (_websocket _output) (error "Bad headers!")))
((symbol-function 'websocket-close)
- (lambda (websocket) (setq websocket-closed-calledp t))))
- (condition-case err
+ (lambda (_websocket) (setq websocket-closed-calledp t))))
+ (condition-case nil
(progn (websocket-outer-filter fake-ws "HTTP/1.1 101\r\n\r\n")
(error "Should have thrown an error!"))
(error
@@ -510,14 +519,15 @@
(should websocket-closed-calledp))))))
(ert-deftest websocket-outer-filter-fragmented-header ()
- (let* ((on-open-calledp)
- (websocket-closed-calledp)
+ (let* (;; (on-open-calledp)
+ ;; (websocket-closed-calledp)
(fake-ws (websocket-inner-create
:protocols '("websocket")
:conn t :url t :accept-string "17hG/VoPPd14L9xPSI7LtEr7PQc="
- :on-open (lambda (websocket)
- (setq on-open-calledp t)))))
- (cl-letf (((symbol-function 'websocket-close) (lambda (websocket) t)))
+ :on-open (lambda (_websocket)
+ ;; (setq on-open-calledp t)
+ t))))
+ (cl-letf (((symbol-function 'websocket-close) (lambda (_websocket) t)))
(websocket-outer-filter fake-ws "HTTP/1.1 101 Web Socket Protocol Handsh")
(websocket-outer-filter fake-ws "ake\r\nConnection: Upgrade\r\n")
(websocket-outer-filter fake-ws "Upgrade: websocket\r\n")
@@ -526,7 +536,7 @@
(ert-deftest websocket-send-text ()
(cl-letf (((symbol-function 'websocket-send)
- (lambda (ws frame)
+ (lambda (_ws frame)
(should (equal
(websocket-frame-payload frame)
"\344\275\240\345\245\275")))))
@@ -534,9 +544,9 @@
(ert-deftest websocket-send ()
(let ((ws (websocket-inner-create :conn t :url t :accept-string t)))
- (cl-letf (((symbol-function 'websocket-ensure-connected) (lambda (websocket) t))
- ((symbol-function 'websocket-openp) (lambda (websocket) t))
- ((symbol-function 'process-send-string) (lambda (conn string) t)))
+ (cl-letf (((symbol-function 'websocket-ensure-connected) (lambda (_websocket) t))
+ ((symbol-function 'websocket-openp) (lambda (_websocket) t))
+ ((symbol-function 'process-send-string) (lambda (_conn _string) t)))
;; Just make sure there is no error.
(websocket-send ws (make-websocket-frame :opcode 'ping
:completep t)))
@@ -554,17 +564,17 @@
(ert-deftest websocket-ensure-handshake ()
(let ((sent-string nil))
(cl-letf (((symbol-function 'process-send-string)
- (lambda (proc string) (setq sent-string string)))
+ (lambda (_proc string) (setq sent-string string)))
((symbol-function 'process-get)
- (lambda (proc sym)
+ (lambda (_proc _sym)
(websocket-inner-create
:conn t :url t :accept-string "key")))
((symbol-function 'process-status)
- (lambda (proc) 'run)))
+ (lambda (_proc) 'run)))
(websocket-ensure-handshake "ws://example.com?query=1"
'conn 'key nil
nil nil nil)
- (should (s-starts-with-p "GET /?query=1 HTTP/1.1\r\n" sent-string)))))
+ (should (string-prefix-p "GET /?query=1 HTTP/1.1\r\n" sent-string)))))
(ert-deftest websocket-verify-client-headers ()
(let* ((http "HTTP/1.1")
@@ -580,20 +590,22 @@
(should (equal
'(:key "key" :protocols ("protocol") :extensions ("foo" "bar; baz=2"))
(websocket-verify-client-headers
- (mapconcat 'identity (append (list http "" protocol extensions1 extensions2)
- all-required-headers) "\r\n"))))
+ (mapconcat #'identity (append (list http "" protocol extensions1 extensions2)
+ all-required-headers)
+ "\r\n"))))
(should (websocket-verify-client-headers
- (mapconcat 'identity
- (mapcar 'upcase
+ (mapconcat #'identity
+ (mapcar #'upcase
(append (list http "" protocol extensions1 extensions2)
- all-required-headers)) "\r\n")))
+ all-required-headers))
+ "\r\n")))
(dolist (header all-required-headers)
(should-not (websocket-verify-client-headers
- (mapconcat 'identity (append (list http "")
+ (mapconcat #'identity (append (list http "")
(remove header all-required-headers))
"\r\n"))))
(should-not (websocket-verify-client-headers
- (mapconcat 'identity (append (list "HTTP/1.0" "") all-required-headers)
+ (mapconcat #'identity (append (list "HTTP/1.0" "") all-required-headers)
"\r\n")))))
(ert-deftest websocket-intersect ()
@@ -627,18 +639,20 @@
(should (string-match "Sec-Websocket-Extensions: seb\r\n" output)))))
(ert-deftest websocket-server-filter ()
- (let ((on-open-called)
+ (let (;; (on-open-called)
(ws (websocket-inner-create :conn t :url t :accept-string "key"
- :on-open (lambda (ws) (setq on-open-called t))))
+ :on-open (lambda (_ws)
+ ;; (setq on-open-called t)
+ t)))
(closed)
(response)
(processed))
- (cl-letf (((symbol-function 'process-send-string) (lambda (p text) (setq response text)))
- ((symbol-function 'websocket-close) (lambda (ws) (setq closed t)))
- ((symbol-function 'process-get) (lambda (process sym) ws)))
+ (cl-letf (((symbol-function 'process-send-string) (lambda (_p text) (setq response text)))
+ ((symbol-function 'websocket-close) (lambda (_ws) (setq closed t)))
+ ((symbol-function 'process-get) (lambda (_process _sym) ws)))
;; Bad request, in two parts
(cl-letf (((symbol-function 'websocket-verify-client-headers)
- (lambda (text) nil)))
+ (lambda (_text) nil)))
(websocket-server-filter nil "HTTP/1.0 GET /foo \r\n")
(should-not closed)
(websocket-server-filter nil "\r\n")
@@ -649,12 +663,12 @@
response nil)
(setf (websocket-inflight-input ws) nil)
(cl-letf (((symbol-function 'websocket-verify-client-headers)
- (lambda (text) t))
+ (lambda (_text) t))
((symbol-function 'websocket-get-server-response)
- (lambda (ws protocols extensions)
+ (lambda (_ws _protocols _extensions)
"response"))
((symbol-function 'websocket-process-input-on-open-ws)
- (lambda (ws text)
+ (lambda (_ws text)
(setq processed t)
(should
(equal text websocket-test-hello)))))
@@ -725,16 +739,18 @@
(should (eq 'conn-a (websocket-conn (car websocket-server-websockets))))))
(ert-deftest websocket-default-error-handler ()
- (cl-letf (((symbol-function 'try-error)
- (lambda (callback-type err expected-message)
- (cl-flet ((display-warning
- (type message &optional level buffer-name)
+ ;; `cl-flet' creates a function definition for the current lexical
+ ;; scope, whereas `cl-letf' overrides a global binding, like
+ ;; a dynamically-scoped definition.
+ (cl-flet ((try-error (callback-type err expected-message)
+ (cl-letf (((symbol-function 'display-warning)
+ (lambda (type message &optional level _buffer-name)
(should (eq type 'websocket))
(should (eq level :error))
- (should (string= message expected-message))))
- (websocket-default-error-handler nil
- callback-type
- err)))))
+ (should (string= message expected-message)))))
+ (websocket-default-error-handler nil
+ callback-type
+ err))))
(try-error
'on-message
'(end-of-buffer)