]> code.delx.au - gnu-emacs-elpa/blob - packages/websocket/websocket-functional-test.el
Update packages/yasnippet by subtree-merging from its github-based upstream
[gnu-emacs-elpa] / packages / websocket / websocket-functional-test.el
1 ;;; websocket-functional-test.el --- Simple functional testing
2
3 ;; Copyright (c) 2013 Free Software Foundation, Inc.
4
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.
9 ;;
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.
14 ;;
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/>.
17
18 ;;; Commentary:
19
20 ;; Usage: emacs -batch -Q -L . -l websocket-functional-test.el
21 ;;
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.
25
26 (require 'tls) ;; tests a particular bug we had on emacs 23
27 (setq debug-on-error t)
28 (require 'websocket)
29 (eval-when-compile (require 'cl))
30
31 ;;;;;;;;;;;;;;;;;;;;;;;
32 ;; Local server test ;;
33 ;;;;;;;;;;;;;;;;;;;;;;;
34
35 (message "Testing with local server")
36
37 (setq websocket-debug t)
38
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"))
44 (sleep-for 1)
45
46 (defvar wstest-msgs nil)
47 (defvar wstest-closed nil)
48
49 (message "Opening the websocket")
50
51 (defvar wstest-ws
52 (websocket-open
53 "ws://127.0.0.1:9999"
54 :on-message (lambda (websocket frame)
55 (push (websocket-frame-payload frame) wstest-msgs)
56 (message "ws frame: %S" (websocket-frame-payload frame))
57 (error "Test error (expected)"))
58 :on-close (lambda (websocket) (setq wstest-closed t))))
59
60 (defun wstest-pop-to-debug ()
61 "Open websocket log buffer. Not used in testing. Just for debugging."
62 (interactive)
63 (pop-to-buffer (websocket-get-debug-buffer-create wstest-ws)))
64
65 (sleep-for 0.1)
66 (assert (websocket-openp wstest-ws))
67
68 (assert (null wstest-msgs))
69
70 (websocket-send-text wstest-ws "Hi!")
71
72 (sleep-for 0.1)
73 (assert (equal (car wstest-msgs) "You said: Hi!"))
74 (setf (websocket-on-error wstest-ws) (lambda (ws type err)))
75 (websocket-send-text wstest-ws "Hi after error!")
76 (sleep-for 0.1)
77 (assert (equal (car wstest-msgs) "You said: Hi after error!"))
78
79 (websocket-close wstest-ws)
80 (assert (null (websocket-openp wstest-ws)))
81
82 (stop-process wstest-server-proc)
83 (kill-process wstest-server-proc)
84
85 ;; Make sure the processes are closed. This happens asynchronously,
86 ;; so let's wait for it.
87 (sleep-for 1)
88 (assert (null (process-list)) t)
89
90 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
91 ;; Remote server test, with wss ;;
92 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
93
94 (when (>= (string-to-int (substring emacs-version 0 2)) 24)
95 (message "Testing with wss://echo.websocket.org")
96 (setq wstest-ws
97 (websocket-open
98 "wss://echo.websocket.org"
99 :on-open (lambda (websocket)
100 (message "Websocket opened"))
101 :on-message (lambda (websocket frame)
102 (push (websocket-frame-payload frame) wstest-msgs)
103 (message "ws frame: %S" (websocket-frame-payload frame)))
104 :on-close (lambda (websocket)
105 (message "Websocket closed")
106 (setq wstest-closed t)))
107 wstest-msgs nil)
108 (sleep-for 0.3)
109 (assert (websocket-openp wstest-ws))
110 (assert (eq 'open (websocket-ready-state wstest-ws)))
111 (assert (null wstest-msgs))
112 (websocket-send-text wstest-ws "Hi!")
113 (sleep-for 1)
114 (assert (equal (car wstest-msgs) "Hi!"))
115 (websocket-close wstest-ws))
116
117 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
118 ;; Local client and server ;;
119 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
120
121 (message "Testing with emacs websocket server.")
122 (message "If this does not pass, make sure your firewall allows the connection.")
123 (setq wstest-closed nil)
124 (setq server-conn (websocket-server
125 9998
126 :on-message (lambda (ws frame)
127 (message "Server received text!")
128 (websocket-send-text ws
129 (websocket-frame-payload frame)))
130 :on-open (lambda (websocket) "Client connection opened!")
131 :on-close (lambda (websocket)
132 (setq wstest-closed t))))
133
134 (setq wstest-msgs nil
135 wstest-ws
136 (websocket-open
137 "ws://localhost:9998"
138 :on-message (lambda (websocket frame)
139 (push (websocket-frame-payload frame) wstest-msgs)
140 (message "ws frame: %S" (websocket-frame-payload frame)))))
141
142 (assert (websocket-openp wstest-ws))
143 (websocket-send-text wstest-ws "Hi to self!")
144 (sleep-for 0.3)
145 (assert (equal (car wstest-msgs) "Hi to self!"))
146 (websocket-server-close server-conn)
147 (assert wstest-closed)
148 (websocket-close wstest-ws)
149
150 (sleep-for 1)
151 (assert (null (process-list)) t)
152 (message "\nAll tests passed!\n")