Skip to content

Commit 5939679

Browse files
committed
Use randomized ports in tests
This yields an overall cleaner pattern, avoiding a defonce, possible interference with other processes, etc.
1 parent 0920783 commit 5939679

File tree

2 files changed

+64
-66
lines changed

2 files changed

+64
-66
lines changed

test/clj_http/test/client.clj

+7-11
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,22 @@
11
(ns clj-http.test.client
2-
(:use [clojure.test]
3-
[clj-http.test.core :only [run-server]])
42
(:require [clj-http.lite.client :as client]
5-
[clj-http.lite.util :as util])
3+
[clj-http.test.core :refer [base-req current-port with-server]]
4+
[clj-http.lite.util :as util]
5+
[clojure.test :refer [deftest is testing use-fixtures]])
66
(:import (java.net UnknownHostException)
77
(java.util Arrays)))
88

9-
(def base-req
10-
{:scheme :http
11-
:server-name "localhost"
12-
:server-port 18080})
9+
(use-fixtures :each with-server)
1310

1411
(deftest ^{:integration true} roundtrip
15-
(run-server)
16-
(Thread/sleep 1000)
1712
;; roundtrip with scheme as a keyword
18-
(let [resp (client/request (merge base-req {:uri "/get" :method :get}))]
13+
(let [resp (client/request (merge (base-req) {:uri "/get" :method :get}))]
1914
(is (= 200 (:status resp)))
2015
#_(is (= "close" (get-in resp [:headers "connection"])))
2116
(is (= "get" (:body resp))))
2217
;; roundtrip with scheme as a string
23-
(let [resp (client/request (merge base-req {:uri "/get" :method :get
18+
(let [resp (client/request (merge (base-req) {:uri "/get"
19+
:method :get
2420
:scheme "http"}))]
2521
(is (= 200 (:status resp)))
2622
#_(is (= "close" (get-in resp [:headers "connection"])))

test/clj_http/test/core.clj

+57-55
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
(ns clj-http.test.core
2-
(:use [clojure.test]
3-
[clojure.java.io :only [file]])
4-
(:require [clojure.pprint :as pp]
5-
[clj-http.lite.core :as core]
2+
(:require [clj-http.lite.core :as core]
63
[clj-http.lite.util :as util]
4+
[clojure.pprint :as pp]
5+
[clojure.java.io :refer [file]]
6+
[clojure.test :refer [deftest is use-fixtures]]
77
[ring.adapter.jetty :as ring])
8-
(:import (java.io ByteArrayInputStream)))
8+
(:import (java.io ByteArrayInputStream)
9+
(org.eclipse.jetty.server Server)
10+
(org.eclipse.jetty.server.nio SelectChannelConnector)))
911

1012
(defn handler [req]
11-
;;(pp/pprint req)
12-
;;(println) (println)
1313
(condp = [(:request-method req) (:uri req)]
1414
[:get "/get"]
1515
{:status 200 :body "get"}
@@ -33,94 +33,96 @@
3333
[:post "/multipart"]
3434
{:status 200 :body (:body req)}))
3535

36-
(defn run-server
37-
[]
38-
(defonce server
39-
(do
40-
(future
41-
(ring/run-jetty handler {:port 18080}))
42-
(Thread/sleep 1000))))
36+
(defn make-server ^Server []
37+
(ring/run-jetty handler {:port 0 ;; Use a free port
38+
:join? false}))
39+
40+
(def ^:dynamic *server* nil)
41+
42+
(defn current-port []
43+
(let [^Server s *server*]
44+
(-> s .getConnectors ^SelectChannelConnector (first) .getLocalPort)))
45+
46+
(defn with-server [t]
47+
(let [s (make-server)]
48+
(try
49+
(binding [*server* s]
50+
(t))
51+
(finally
52+
(-> s .stop)))))
4353

44-
(def base-req
45-
{:scheme :http
46-
:server-name "localhost"
47-
:server-port 18080})
54+
(use-fixtures :each with-server)
55+
56+
(defn base-req []
57+
{:scheme :http
58+
:server-name (str "localhost:" (current-port))
59+
:port (current-port)})
4860

4961
(defn request [req]
50-
(core/request (merge base-req req)))
62+
(core/request (merge (base-req) req)))
5163

5264
(defn slurp-body [req]
5365
(slurp (:body req)))
5466

5567
(deftest ^{:integration true} makes-get-request
56-
(run-server)
68+
(current-port)
5769
(let [resp (request {:request-method :get :uri "/get"})]
5870
(is (= 200 (:status resp)))
5971
(is (= "get" (slurp-body resp)))))
6072

6173
(deftest ^{:integration true} makes-head-request
62-
(run-server)
6374
(let [resp (request {:request-method :head :uri "/head"})]
6475
(is (= 200 (:status resp)))
6576
(is (nil? (:body resp)))))
6677

6778
(deftest ^{:integration true} sets-content-type-with-charset
68-
(run-server)
69-
(let [resp (request {:request-method :get :uri "/content-type"
70-
:content-type "text/plain" :character-encoding "UTF-8"})]
79+
(let [resp (request {:request-method :get :uri "/content-type"
80+
:content-type "text/plain" :character-encoding "UTF-8"})]
7181
(is (= "text/plain; charset=UTF-8" (slurp-body resp)))))
7282

7383
(deftest ^{:integration true} sets-content-type-without-charset
74-
(run-server)
7584
(let [resp (request {:request-method :get :uri "/content-type"
76-
:content-type "text/plain"})]
85+
:content-type "text/plain"})]
7786
(is (= "text/plain" (slurp-body resp)))))
7887

7988
(deftest ^{:integration true} sets-arbitrary-headers
80-
(run-server)
8189
(let [resp (request {:request-method :get :uri "/header"
82-
:headers {"X-My-Header" "header-val"}})]
90+
:headers {"X-My-Header" "header-val"}})]
8391
(is (= "header-val" (slurp-body resp)))))
8492

8593
(deftest ^{:integration true} sends-and-returns-byte-array-body
86-
(run-server)
8794
(let [resp (request {:request-method :post :uri "/post"
88-
:body (util/utf8-bytes "contents")})]
95+
:body (util/utf8-bytes "contents")})]
8996
(is (= 200 (:status resp)))
9097
(is (= "contents" (slurp-body resp)))))
9198

9299
(deftest ^{:integration true} returns-arbitrary-headers
93-
(run-server)
94100
(let [resp (request {:request-method :get :uri "/get"})]
95101
(is (string? (get-in resp [:headers "date"])))))
96102

97103
(deftest ^{:integration true} returns-status-on-exceptional-responses
98-
(run-server)
99104
(let [resp (request {:request-method :get :uri "/error"})]
100105
(is (= 500 (:status resp)))))
101106

102107
(deftest ^{:integration true} returns-status-on-redirect
103-
(run-server)
104108
(let [resp (request {:request-method :get :uri "/redirect" :follow-redirects false})]
105109
(is (= 302 (:status resp)))))
106110

107111
(deftest ^{:integration true} auto-follows-on-redirect
108-
(run-server)
109112
(let [resp (request {:request-method :get :uri "/redirect"})]
110113
(is (= 200 (:status resp)))
111114
(is (= "get" (slurp-body resp)))))
112115

113116
(deftest ^{:integration true} sets-conn-timeout
114-
; indirect way of testing if a connection timeout will fail by passing in an
115-
; invalid argument
117+
;; indirect way of testing if a connection timeout will fail by passing in an
118+
;; invalid argument
116119
(try
117120
(request {:request-method :get :uri "/timeout" :conn-timeout -1})
118121
(throw (Exception. "Shouldn't get here."))
119122
(catch Exception e
120123
(is (= IllegalArgumentException (class e))))))
121124

122125
(deftest ^{:integration true} sets-socket-timeout
123-
(run-server)
124126
(try
125127
(request {:request-method :get :uri "/timeout" :socket-timeout 1})
126128
(throw (Exception. "Shouldn't get here."))
@@ -137,20 +139,20 @@
137139

138140
(deftest ^{:integration true} self-signed-ssl-get
139141
(let [t (doto (Thread. #(ring/run-jetty handler
140-
{:port 8081 :ssl-port 18082 :ssl? true
141-
:keystore "test-resources/keystore"
142+
{:ssl? true
143+
:keystore "test-resources/keystore"
142144
:key-password "keykey"})) .start)]
143145
(Thread/sleep 1000)
144146
(try
145147
(is (thrown? javax.net.ssl.SSLException
146148
(request {:request-method :get :uri "/get"
147-
:server-port 18082 :scheme :https})))
148-
#_(let [resp (request {:request-method :get :uri "/get" :server-port 18082
149-
:scheme :https :insecure? true})]
150-
(is (= 200 (:status resp)))
151-
(is (= "get" (slurp-body resp))))
149+
:scheme :https})))
150+
#_(let [resp (request {:request-method :get :uri "/get" :server-port 18082
151+
:scheme :https :insecure? true})]
152+
(is (= 200 (:status resp)))
153+
(is (= "get" (slurp-body resp))))
152154
(finally
153-
(.stop t)))))
155+
(.stop t)))))
154156

155157
;; (deftest ^{:integration true} multipart-form-uploads
156158
;; (run-server)
@@ -170,18 +172,19 @@
170172
;; (is (re-find #"name=\"d\"" resp-body))))
171173

172174
(deftest ^{:integration true} t-save-request-obj
173-
(run-server)
174175
(let [resp (request {:request-method :post :uri "/post"
175-
:body (.getBytes "foo bar")
176-
:save-request? true})]
176+
:body (.getBytes "foo bar")
177+
:save-request? true})]
177178
(is (= 200 (:status resp)))
178-
(is (= {:scheme :http
179-
:http-url "http://localhost:18080/post"
179+
(is (= {:scheme :http
180+
:http-url (str "http://localhost:" (current-port) "/post")
180181
:request-method :post
181-
:uri "/post"
182-
:server-name "localhost"
183-
:server-port 18080}
184-
(dissoc (:request resp) :body)))))
182+
:uri "/post"
183+
:server-name (str "localhost:" (current-port))
184+
:port (current-port)}
185+
(-> resp
186+
:request
187+
(dissoc :body))))))
185188

186189
;; (deftest parse-headers
187190
;; (are [headers expected]
@@ -211,7 +214,6 @@
211214
;; "server" "some-server"}))
212215

213216
(deftest ^{:integration true} t-streaming-response
214-
(run-server)
215217
(let [stream (:body (request {:request-method :get :uri "/get" :as :stream}))
216218
body (slurp stream)]
217219
(is (= "get" body))))

0 commit comments

Comments
 (0)