1 ;;; websocket-functional-test.el --- Simple functional testing
3 ;; Copyright (c) 2013, 2016 Free Software Foundation, Inc.
5 ;; This program is free software; you can redistribute it and/or
6 ;; modify it under the terms of the GNU General Public License as
7 ;; published by the Free Software Foundation; either version 3 of the
8 ;; License, or (at your option) any later version.
10 ;; This program is distributed in the hope that it will be useful, but
11 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
12 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 ;; General Public License for more details.
15 ;; You should have received a copy of the GNU General Public License
16 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
20 ;; Usage: emacs -batch -Q -L . -l websocket-functional-test.el
22 ;; Note: this functional tests requires that you have python with the
23 ;; Tornado web server. See http://www.tornadoweb.org/en/stable/ for
24 ;; information on aquiring.
26 (require 'tls) ;; tests a particular bug we had on emacs 23
27 (setq debug-on-error t)
29 (eval-when-compile (require 'cl))
31 ;;;;;;;;;;;;;;;;;;;;;;;
32 ;; Local server test ;;
33 ;;;;;;;;;;;;;;;;;;;;;;;
35 (message "Testing with local server")
37 (setq websocket-debug t)
39 (defvar wstest-server-buffer (get-buffer-create "*wstest-server*"))
40 (defvar wstest-server-name "wstest-server")
41 (defvar wstest-server-proc
42 (start-process wstest-server-name wstest-server-buffer
43 "python" "testserver.py" "--log_to_stderr" "--logging=debug"))
46 (defvar wstest-msgs nil)
47 (defvar wstest-closed nil)
49 (message "Opening the websocket")
54 :on-message (lambda (_websocket frame)
55 (push (websocket-frame-text frame) wstest-msgs)
56 (message "ws frame: %S" (websocket-frame-text frame))
57 (error "Test error (expected)"))
58 :on-close (lambda (_websocket) (setq wstest-closed t))))
60 (defun wstest-pop-to-debug ()
61 "Open websocket log buffer. Not used in testing. Just for debugging."
63 (pop-to-buffer (websocket-get-debug-buffer-create wstest-ws)))
66 (assert (websocket-openp wstest-ws))
68 (assert (null wstest-msgs))
70 (websocket-send-text wstest-ws "你好")
73 (assert (equal (car wstest-msgs) "You said: 你好"))
74 (setf (websocket-on-error wstest-ws) (lambda (_ws _type _err)))
75 (websocket-send-text wstest-ws "Hi after error!")
77 (assert (equal (car wstest-msgs) "You said: Hi after error!"))
79 (websocket-close wstest-ws)
80 (assert (null (websocket-openp wstest-ws)))
82 (if (not (eq system-type 'windows-nt))
83 ; Windows doesn't have support for the SIGSTP signal, so we'll just kill
85 (stop-process wstest-server-proc))
86 (kill-process wstest-server-proc)
88 ;; Make sure the processes are closed. This happens asynchronously,
89 ;; so let's wait for it.
91 (assert (null (process-list)) t)
93 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
94 ;; Remote server test, with wss ;;
95 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
97 ;; echo.websocket.org has an untrusted certificate, for the test to
98 ;; proceed, we need to disable trust checking.
99 (setq tls-checktrust nil)
101 (when (>= (string-to-number (substring emacs-version 0 2)) 24)
102 (message "Testing with wss://echo.websocket.org")
103 (when (eq system-type 'windows-nt)
104 (message "Windows users must have gnutls DLLs in the emacs bin directory."))
107 "wss://echo.websocket.org"
108 :on-open (lambda (_websocket)
109 (message "Websocket opened"))
110 :on-message (lambda (_websocket frame)
111 (push (websocket-frame-text frame) wstest-msgs)
112 (message "ws frame: %S" (websocket-frame-text frame)))
113 :on-close (lambda (_websocket)
114 (message "Websocket closed")
115 (setq wstest-closed t)))
118 (assert (websocket-openp wstest-ws))
119 (assert (eq 'open (websocket-ready-state wstest-ws)))
120 (assert (null wstest-msgs))
121 (websocket-send-text wstest-ws "Hi!")
123 (assert (equal (car wstest-msgs) "Hi!"))
124 (websocket-close wstest-ws))
126 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
127 ;; Local client and server ;;
128 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
130 (message "Testing with emacs websocket server.")
131 (message "If this does not pass, make sure your firewall allows the connection.")
132 (setq wstest-closed nil)
133 (let ((server-conn (websocket-server
136 :on-message (lambda (ws frame)
137 (message "Server received text!")
139 ws (websocket-frame-text frame)))
140 :on-open (lambda (_websocket) "Client connection opened!")
141 :on-close (lambda (_websocket)
142 (setq wstest-closed t)))))
143 (setq wstest-msgs nil
146 "ws://localhost:9998"
147 :on-message (lambda (_websocket frame)
148 (message "ws frame: %S" (websocket-frame-text frame))
150 (websocket-frame-text frame) wstest-msgs))))
152 (assert (websocket-openp wstest-ws))
153 (websocket-send-text wstest-ws "你好")
155 (assert (equal (car wstest-msgs) "你好"))
156 (websocket-server-close server-conn))
157 (assert wstest-closed)
158 (websocket-close wstest-ws)
161 (assert (null (process-list)) t)
162 (message "\nAll tests passed!\n")