bandalore/src/test/clojure/cemerick/bandalore_test.clj
2011-02-23 07:09:15 -05:00

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)))))