proper set of tests

This commit is contained in:
Chas Emerick 2011-02-23 07:09:15 -05:00
parent 744b458faa
commit 3dda6bc11a
2 changed files with 96 additions and 6 deletions

View file

@ -250,7 +250,14 @@ Have maven. From the command line:
$ mvn clean install
----
The tests are all live, so you either need to add your AWS credentials to your
*The tests are all live*, so:
1. They create and delete queues (though with unique queue names).
2. They aren't written to be particularly efficient w.r.t. SQS usage. If you do decide to run the tests, the associated fees should be trivial (or nonexistent if your account is under the SQS free usage cap).
In any case, you are so warned. Make a new AWS account dedicated to testing if you're concerned on either count.
Since the tests are live, you either need to add your AWS credentials to your
`~/.m2/settings.xml` file as properties, or specify them on the command line
using `-D` switches:
@ -258,7 +265,7 @@ using `-D` switches:
$ mvn -Daws.id=XXXXXXX -Daws.secret-key=YYYYYYY clean install
----
Or, you can skip the tests entirely if you're brave:
Or, you can skip the tests entirely:
----
$ mvn -Dmaven.test.skip=true clean install

View file

@ -4,6 +4,10 @@
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)
@ -20,13 +24,37 @@
[]
(str (java.util.UUID/randomUUID)))
(def test-queue-name-prefix "bandalore-test-")
(defn- test-queue-name
[]
(str "bandalore-test-" (uuid)))
(str test-queue-name-prefix (uuid)))
(defmacro defqueuetest
(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*)
@ -34,8 +62,63 @@
(finally
(delete-queue client *test-queue-url*))))))
(defqueuetest listing-queues
(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)
(is ((set (list-queues client)) *test-queue-url*))))
(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)))))