add some initial session tests

This commit is contained in:
Gered 2016-05-11 15:36:29 -04:00
parent 3bdf0868cf
commit 548ff7825d

View file

@ -0,0 +1,135 @@
(ns net.thegeez.browserchannel.server.session-tests
(:import (net.thegeez.browserchannel.server ArrayBuffer Session))
(:use
clojure.test
net.thegeez.browserchannel.common
net.thegeez.browserchannel.server))
(def written-responses (atom []))
(def test-options
(merge
(select-keys
default-options
[:data-threshold
:session-timeout-interval])
{:heartbeat-interval (:keep-alive-interval default-options)}))
(defn mock-write
[response data]
(is (not (nil? response)))
(swap! written-responses conj [:write data]))
(defn mock-write-end
[response]
(is (not (nil? response)))
(swap! written-responses conj [:write-end]))
(defn mock-send-off
[& _])
(defn mock-session-fixture [f]
(with-redefs [write mock-write
write-end mock-write-end
send-off mock-send-off]
(f)
(reset! written-responses [])))
(use-fixtures :each mock-session-fixture)
(deftest basic-queue-test
(let [options test-options
back-channel {:respond {}
:chunk true
:bytes-sent 0}
session (-> (Session. "test-id"
options
back-channel
(ArrayBuffer. 0 0 (->queue) (->queue))
nil
nil)
(queue-string "\"one\"")
(queue-string "\"two\""))]
(is (= (type (:array-buffer session))
ArrayBuffer))
(is (= (first (to-flush (:array-buffer session)))
[[1 "\"one\""]
[2 "\"two\""]]))
(is (= (last-acknowledged-id (:array-buffer session))
0))
(is (= (outstanding-bytes (:array-buffer session))
10))))
(deftest basic-flush-test
(let [options test-options
back-channel {:respond {}
:chunk true
:bytes-sent 0}
session (-> (Session. "test-id"
options
back-channel
(ArrayBuffer. 0 0 (->queue) (->queue))
nil
nil)
(queue-string "\"one\"")
(queue-string "\"two\"")
(flush-buffer))]
(is (= (first (to-flush (:array-buffer session)))
nil))
(is (= @written-responses
[[:write "[[1,\"one\"]]"]
[:write "[[2,\"two\"]]"]]))
(is (= (get-in session [:back-channel :bytes-sent])
10))))
(deftest flush-without-back-channel-test
(let [options test-options
back-channel nil
session (-> (Session. "test-id"
options
back-channel
(ArrayBuffer. 0 0 (->queue) (->queue))
nil
nil)
(queue-string "\"one\"")
(queue-string "\"two\"")
(flush-buffer))]
(is (nil? (:back-channel session)))
(is (= (first (to-flush (:array-buffer session)))
[[1 "\"one\""]
[2 "\"two\""]]))
(is (= @written-responses
[]))))
(deftest flush-with-write-error-test
(with-redefs [write (fn [response data]
; simple way to intentionally trigger a failure when
; flush-buffer internally calls write
(if (.contains data "fail")
(throw (new Exception "intentional write failure"))
(mock-write response data)))]
(let [options test-options
back-channel {:respond {}
:chunk true
:bytes-sent 0}
session (-> (Session. "test-id"
options
back-channel
(ArrayBuffer. 0 0 (->queue) (->queue))
nil
nil)
(queue-string "\"one\"")
(queue-string "\"two\"")
(queue-string "\"fail\"")
(queue-string "\"three\"")
(flush-buffer))]
(is (= (first (to-flush (:array-buffer session)))
[[1 "\"one\""]
[2 "\"two\""]
[3 "\"fail\""]
[4 "\"three\""]]))
(is (= @written-responses
[[:write "[[1,\"one\"]]"]
[:write "[[2,\"two\"]]"]
[:write-end]]))
(is (nil? (:back-channel session))))))