Skip to content

Commit

Permalink
Added test using Jersey's SSE client lib [IMMUTANT-439]
Browse files Browse the repository at this point in the history
The test isn't complete as it should fail when the 'closed' promise
hasn't been satisfied. Need to nail down the server's expected behavior
when the client calls EventSource.close()
  • Loading branch information
jcrossley3 committed Jan 27, 2015
1 parent 5eaa80b commit f42862a
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 18 deletions.
3 changes: 2 additions & 1 deletion web/project.clj
Expand Up @@ -27,6 +27,7 @@
[stylefruits/gniazdo _]
[ring/ring-devel _]
[compojure _]
[clj-http "0.9.1"]]}}
[clj-http "0.9.1"]
[org.glassfish.jersey.media/jersey-media-sse "2.15"]]}}

:test-paths ["test" "test-integration"])
2 changes: 2 additions & 0 deletions web/src/immutant/web/sse.clj
Expand Up @@ -25,6 +25,8 @@
(event->str [x] "Formats event according to SSE spec"))

(extend-protocol Event
nil
(event->str [_] "data:\n")
Object
(event->str [o] (str "data:" o "\n"))
java.util.Collection
Expand Down
72 changes: 55 additions & 17 deletions web/test/immutant/web/sse_test.clj
Expand Up @@ -15,24 +15,62 @@
(ns immutant.web.sse-test
(:require [clojure.test :refer :all]
[immutant.web.sse :refer :all]
[clojure.string :refer (split-lines)]))
[immutant.web :refer (run stop)]
[clojure.string :refer (split-lines)])
(:import [org.glassfish.jersey.media.sse EventSource EventListener SseFeature]
[javax.ws.rs.client ClientBuilder]))

(deftest format-string
(is (= "data:foo\n"
(event->str "foo"))))
(deftest event-formatting
(testing "string"
(is (= "data:foo\n"
(event->str "foo"))))
(testing "collection"
(is (= "data:0\ndata:1\ndata:2\n"
(event->str [0 1 2])
(event->str (range 3))
(event->str '("0" "1" "2")))))
(testing "map"
(let [result (event->str {:data "foo", :event "bar", :id 42, :retry 1000})
sorted (sort (split-lines result))]
(is (.endsWith result "\n"))
(is (= ["data:foo" "event:bar" "id:42" "retry:1000"] sorted))))
(testing "collection-in-map"
(is (= "data:0\ndata:1\ndata:2\n"
(event->str {:data (range 3)})))))

(deftest format-collection
(is (= "data:0\ndata:1\ndata:2\n"
(event->str [0 1 2])
(event->str (range 3))
(event->str '("0" "1" "2")))))
(defn event-source
[url]
(-> (EventSource/target
(-> (ClientBuilder/newBuilder)
(.register SseFeature)
.build
(.target url)))
.build))

(deftest format-map
(let [result (event->str {:data "foo", :event "bar", :id 42, :retry 1000})
sorted (sort (split-lines result))]
(is (.endsWith result "\n"))
(is (= ["data:foo" "event:bar" "id:42" "retry:1000"] sorted))))
(deftest sse
(let [closed (promise)
result (atom [])
app (fn [req]
(as-sse-channel req
:on-open (fn [ch]
(doseq [x (range 5 0 -1)]
(send! ch x))
(send! ch {:event "close", :data "bye!"})),
:on-close (fn [ch _] (deliver closed :success))))
server (run app)
client (event-source "http://localhost:8080")]
(.register client (reify EventListener
(onEvent [_ e]
(swap! result conj (.readData e))
(when (= "close" (.getName e))
(.close client)))))
(.open client)

(deftest format-collection-in-map
(is (= "data:0\ndata:1\ndata:2\n"
(event->str {:data (range 3)}))))
;; TODO: this...
;; (is (= :success (deref closed 5000 :fail)))
;; not this...
(deref closed 5000 :fail)

(is (not (.isOpen client)))
(is (= ["5" "4" "3" "2" "1" "bye!"] @result))
(stop server)))

0 comments on commit f42862a

Please sign in to comment.