]> code.delx.au - gnu-emacs-elpa/blob - emacs-web-server-test.el
21d7d5e6bf0f0dc93dd45776b202c0fca9eda99d
[gnu-emacs-elpa] / emacs-web-server-test.el
1 ;;; emacs-web-server-test.el --- Test the Emacs Web Server
2
3 ;; Copyright (C) 2013 Eric Schulte <schulte.eric@gmail.com>
4
5 ;; Author: Eric Schulte <schulte.eric@gmail.com>
6 ;; License: GPLV3 (see the COPYING file in this directory)
7
8 ;; TODO: Allow running all tests at once, or just run tests in two
9 ;; different Emacs instances.
10
11 ;;; Code:
12 (require 'emacs-web-server)
13 (require 'cl-lib)
14 (eval-when-compile (require 'cl))
15 (require 'ert)
16
17 (defun ews-test-run-asynch (continuation program &rest program-args)
18 (let* ((buffer (generate-new-buffer "*ews-test-run-asynch*"))
19 (proc (apply #'start-process "ews-test" buffer program program-args)))
20 (set-process-sentinel proc
21 (lexical-let ((cont continuation)
22 (buf buffer))
23 (lambda (proc signal)
24 (when (memq (process-status proc) '(exit signal))
25 (funcall cont (prog1 (with-current-buffer buf
26 (buffer-string))
27 (kill-buffer buf)))))))))
28
29 (defvar ews-test-port 8999)
30
31 (ert-deftest ews/keyword-style-handler ()
32 "Ensure that a simple keyword-style handler matches correctly."
33 (let ((handler (mapcar (lambda (letter)
34 `((:GET . ,letter) .
35 (lambda (proc request)
36 (ews-response-header proc 200
37 '("Content-type" . "text/plain"))
38 (process-send-string proc
39 (concat "returned:" ,letter)))))
40 '("a" "b"))))
41 (lexical-let ((server (ews-start handler ews-test-port)))
42 (ews-test-run-asynch
43 (lambda (response)
44 (should (string= response "returned:a"))
45 (ews-stop server))
46 "curl" "-s" (format "localhost:%d/a" ews-test-port)))))
47
48 (ert-deftest ews/function-style-handler ()
49 "Test that a simple hello-world server responds."
50 (lexical-let
51 ((server
52 (ews-start
53 '(((lambda (_) t) .
54 (lambda (proc request)
55 (ews-response-header proc 200 '("Content-type" . "text/plain"))
56 (process-send-string proc "hello world")
57 :finished)))
58 ews-test-port)))
59 (ews-test-run-asynch
60 (lambda (response)
61 (should (string= response "hello world"))
62 (ews-stop server))
63 "curl" "-s" (format "localhost:%d" ews-test-port))))
64
65 (ert-deftest ews/removed-from-ews-servers-after-stop ()
66 (let ((start-length (length ews-servers)))
67 (let ((server (ews-start nil ews-test-port)))
68 (should (= (length ews-servers) (+ 1 start-length)))
69 (ews-stop server)
70 (should (= (length ews-servers) start-length)))))
71
72 (ert-deftest ews/parse-many-headers ()
73 "Test that a number of headers parse successfully."
74 (let ((server (ews-start nil ews-test-port))
75 (client (make-instance 'ews-client))
76 (header-string "GET / HTTP/1.1
77 Host: localhost:7777
78 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0
79 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
80 Accept-Language: en-US,en;q=0.5
81 Accept-Encoding: gzip, deflate
82 DNT: 1
83 Cookie: __utma=111872281.1462392269.1345929539.1345929539.1345929539.1
84 Connection: keep-alive
85
86 "))
87 (unwind-protect
88 (progn
89 (ews-parse-request (process server) client header-string)
90 (let ((headers (cdr (headers client))))
91 (should (string= (cdr (assoc :ACCEPT-ENCODING headers))
92 "gzip, deflate"))
93 (should (string= (cdr (assoc :GET headers)) "/"))
94 (should (string= (cdr (assoc :CONNECTION headers)) "keep-alive"))))
95 (ews-stop server))))
96
97 (ert-deftest ews/parse-post-data ()
98 (let ((server (ews-start nil ews-test-port))
99 (client (make-instance 'ews-client))
100 (header-string "POST / HTTP/1.1
101 User-Agent: curl/7.33.0
102 Host: localhost:8080
103 Accept: */*
104 Content-Length: 273
105 Expect: 100-continue
106 Content-Type: multipart/form-data; boundary=----------------f1270d0deb77af03
107
108 ------------------f1270d0deb77af03
109 Content-Disposition: form-data; name=\"date\"
110
111 Wed Dec 18 00:55:39 MST 2013
112
113 ------------------f1270d0deb77af03
114 Content-Disposition: form-data; name=\"name\"
115
116 \"schulte\"
117 ------------------f1270d0deb77af03--
118 "))
119 (unwind-protect
120 (progn
121 (ews-parse-request (process server) client header-string)
122 (let ((headers (cdr (headers client))))
123 (should (string= (cdr (assoc "name" headers))
124 "\"schulte\""))
125 (should (string= (cdr (assoc "date" headers))
126 "Wed Dec 18 00:55:39 MST 2013"))))
127 (ews-stop server))))
128
129 (ert-deftest ews/parse-another-post-data ()
130 "This one from an AJAX request."
131 (let ((server (ews-start nil ews-test-port))
132 (client (make-instance 'ews-client))
133 (header-string "POST /complex.org HTTP/1.1
134 Host: localhost:4444
135 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:26.0) Gecko/20100101 Firefox/26.0
136 Accept: */*
137 Accept-Language: en-US,en;q=0.5
138 Accept-Encoding: gzip, deflate
139 DNT: 1
140 Content-Type: application/x-www-form-urlencoded; charset=UTF-8
141 X-Requested-With: XMLHttpRequest
142 Referer: http://localhost:4444/complex.org
143 Content-Length: 78
144 Cookie: __utma=111872281.1462392269.1345929539.1345929539.1345929539.1
145 Connection: keep-alive
146 Pragma: no-cache
147 Cache-Control: no-cache
148
149 org=-+one%0A-+two%0A-+three%0A-+four%0A%0A&beg=646&end=667&path=%2Fcomplex.org"))
150 (unwind-protect
151 (progn
152 (ews-parse-request (process server) client header-string)
153 (let ((headers (cdr (headers client))))
154 (message "headers:%S" headers)
155 (should (string= (cdr (assoc "path" headers)) "/complex.org"))
156 (should (string= (cdr (assoc "beg" headers)) "646"))
157 (should (string= (cdr (assoc "end" headers)) "667"))
158 (should (string= (cdr (assoc "org" headers))
159 "- one
160 - two
161 - three
162 - four
163
164 "))))
165 (ews-stop server))))