124 lines
4.4 KiB
Clojure
124 lines
4.4 KiB
Clojure
(ns cemerick.bandalore-test
|
|
(:use cemerick.bandalore
|
|
clojure.test
|
|
clojure.contrib.core)
|
|
(:refer-clojure :exclude (send)))
|
|
|
|
#_(do
|
|
(System/setProperty "aws.id" "")
|
|
(System/setProperty "aws.secret-key" ""))
|
|
|
|
; kill the verbose aws logging
|
|
(.setLevel (java.util.logging.Logger/getLogger "com.amazonaws")
|
|
java.util.logging.Level/WARNING)
|
|
|
|
(def client
|
|
(let [id (System/getProperty "aws.id")
|
|
secret-key (System/getProperty "aws.secret-key")]
|
|
(assert (and id secret-key))
|
|
(create-client id secret-key)))
|
|
|
|
(def *test-queue-url* nil)
|
|
|
|
(defn- uuid
|
|
[]
|
|
(str (java.util.UUID/randomUUID)))
|
|
|
|
(def test-queue-name-prefix "bandalore-test-")
|
|
|
|
(defn- test-queue-name
|
|
[]
|
|
(str test-queue-name-prefix (uuid)))
|
|
|
|
(defn- verify-queue-cleanup
|
|
[f]
|
|
(f)
|
|
(doseq [q (filter #(.contains % test-queue-name-prefix) (list-queues client))]
|
|
(delete-queue client q)))
|
|
|
|
(use-fixtures :once verify-queue-cleanup)
|
|
|
|
(defn- wait-for-condition
|
|
[f desc]
|
|
(let [wait-condition (loop [waiting 0]
|
|
(cond
|
|
(f) true
|
|
(>= waiting 120) false
|
|
:else (do
|
|
(Thread/sleep 1000)
|
|
(recur (inc waiting)))))]
|
|
(when-not (is wait-condition desc)
|
|
(throw (IllegalStateException. desc)))
|
|
wait-condition))
|
|
|
|
(defmacro defsqstest
|
|
[name & body]
|
|
`(deftest ~name
|
|
(println '~name) ; lots of sleeping in these tests, give some indication of life
|
|
(binding [*test-queue-url* (create-queue client (test-queue-name))]
|
|
(try
|
|
(is *test-queue-url*)
|
|
~@body
|
|
(finally
|
|
(delete-queue client *test-queue-url*))))))
|
|
|
|
(defsqstest test-list-queues
|
|
(let [msg (uuid)]
|
|
; sending a msg seems to "force" the queue's existence in listings
|
|
(send client *test-queue-url* msg)
|
|
(wait-for-condition #((set (list-queues client)) *test-queue-url*)
|
|
"Created queue not visible in result of list-queues")))
|
|
|
|
(defsqstest test-queue-attrs
|
|
(let [{:strs [VisibilityTimeout MaximumMessageSize] :as base-attrs} (queue-attrs client *test-queue-url*)
|
|
expected {"VisibilityTimeout" "117" "MaximumMessageSize" "1535"}]
|
|
(is (and VisibilityTimeout MaximumMessageSize))
|
|
(queue-attrs client *test-queue-url* expected)
|
|
(wait-for-condition #(= expected
|
|
(->> (queue-attrs client *test-queue-url*)
|
|
(filter (comp (set (keys expected)) first))
|
|
(into {})))
|
|
"Queue attribute test failed after waiting for test condition")))
|
|
|
|
(defn- wait-for-full-queue
|
|
[q min-cnt queue-name]
|
|
(wait-for-condition #(-> (queue-attrs client q)
|
|
(get "ApproximateNumberOfMessages")
|
|
Integer/parseInt
|
|
(> min-cnt))
|
|
(str queue-name " queue never filled up")))
|
|
|
|
(defsqstest test-polling-receive
|
|
(let [data (range 100)
|
|
q *test-queue-url*]
|
|
; we want to be testing polling-receive's ability to wait when there's nothing available
|
|
(future (doseq [x data]
|
|
(send client q (str x))))
|
|
(wait-for-full-queue *test-queue-url* 50 "polling-receive")
|
|
(is (== (apply + data)
|
|
(->>
|
|
(polling-receive client *test-queue-url* :max-wait 10000)
|
|
(map (deleting-consumer client (comp read-string :body)))
|
|
(apply +))))))
|
|
|
|
(defsqstest receive-limit+attrs
|
|
(doseq [x (range 100)]
|
|
(send client *test-queue-url* (str x)))
|
|
(wait-for-full-queue *test-queue-url* 50 "limit+attrs")
|
|
(let [[{:keys [attributes]} :as msgs] (receive client *test-queue-url*)]
|
|
(is (== 1 (count msgs)))
|
|
(is (empty? attributes)))
|
|
(wait-for-condition #(let [msgs (receive client *test-queue-url* :limit 10 :attributes #{"All"})]
|
|
(is (->> msgs
|
|
(map (comp count :attributes))
|
|
(every? pos?)))
|
|
(< 1 (count msgs)))
|
|
"limit+attrs queue never produced > 1 message on a receive"))
|
|
|
|
(defsqstest receive-visibility
|
|
(doseq [x (range 10)]
|
|
(send client *test-queue-url* (str x)))
|
|
(wait-for-full-queue *test-queue-url* 5 "recieve-visibility")
|
|
(let [v (-> (receive client *test-queue-url* :visibility 5) first :body read-string)]
|
|
(is (some #(= v (-> % :body read-string)) (polling-receive client *test-queue-url* :max-wait 10000)))))
|
|
|