diff --git a/src/adzerk/boot_test.clj b/src/adzerk/boot_test.clj
index 51451e3..00b8ef0 100644
--- a/src/adzerk/boot_test.clj
+++ b/src/adzerk/boot_test.clj
@@ -9,55 +9,64 @@
'[[org.clojure/tools.namespace "0.2.11" :exclusions [org.clojure/clojure]]
[pjstadig/humane-test-output "0.6.0" :exclusions [org.clojure/clojure]]])
+(def last-pod-id (atom (System/currentTimeMillis)))
+
(defn init [requires fresh-pod]
(dorun (map (partial pod/require-in fresh-pod) requires))
- (doto fresh-pod
- (pod/with-eval-in
- (require '[clojure.test :as t]
- '[clojure.java.io :as io]
- '[clojure.test.junit :as junit]
- '[pjstadig.humane-test-output :refer [activate!]]
- '[clojure.tools.namespace.find :refer [find-namespaces-in-dir]])
- (activate!)
-
- (defn all-ns* [& dirs]
- (distinct (mapcat #(find-namespaces-in-dir (io/file %)) dirs)))
-
- (defn junit-plus-default-report [old-report junit-out m]
- (old-report m)
- (binding [t/*test-out* junit-out
- ;; junit will inc the counters, but old-report is already doing that
- ;; so we pass a new counters ref that will be discarded to avoid
- ;; duplicate counters
- t/*report-counters* (ref {})]
- (junit/junit-report m)))
-
- (defn run-tests-with-junit-reporter [run-tests-fn output-to]
- (let [junit-out-filename output-to
- old-report t/report]
- (with-open [junit-out (io/writer junit-out-filename)]
- (binding [junit/*var-context* (list)
- junit/*depth* 1
- t/report (partial junit-plus-default-report old-report junit-out)]
- (binding [*out* junit-out]
- (println "")
- (println ""))
- (let [result (run-tests-fn)]
- (binding [*out* junit-out]
- (println ""))
- result)))))
-
- (defn test-ns* [pred junit-output-to ns]
- (binding [t/*report-counters* (ref t/*initial-report-counters*)]
- (let [ns-obj (the-ns ns)
- run-tests* (fn []
- (t/do-report {:type :begin-test-ns :ns ns-obj})
- (t/test-vars (filter pred (vals (ns-publics ns))))
- (t/do-report {:type :end-test-ns :ns ns-obj})
- @t/*report-counters*)]
- (if junit-output-to
- (run-tests-with-junit-reporter run-tests* (io/file junit-output-to (str (name ns) ".xml")))
- (run-tests*))))))))
+ (let [pod-id (swap! last-pod-id inc)]
+ (doto fresh-pod
+ (pod/with-eval-in
+ (require '[clojure.test :as t]
+ '[clojure.java.io :as io]
+ '[clojure.test.junit :as junit]
+ '[boot.pod :as pod]
+ '[pjstadig.humane-test-output :refer [activate!]]
+ '[clojure.tools.namespace.find :refer [find-namespaces-in-dir]])
+ (import '[java.util.concurrent ConcurrentLinkedQueue])
+ (when-not pod/pod-id
+ (pod/set-pod-id! ~pod-id))
+ (when-not @pod/shutdown-hooks
+ (reset! pod/shutdown-hooks (ConcurrentLinkedQueue.)))
+ (activate!)
+
+ (defn all-ns* [& dirs]
+ (distinct (mapcat #(find-namespaces-in-dir (io/file %)) dirs)))
+
+ (defn junit-plus-default-report [old-report junit-out m]
+ (old-report m)
+ (binding [t/*test-out* junit-out
+ ;; junit will inc the counters, but old-report is already doing that
+ ;; so we pass a new counters ref that will be discarded to avoid
+ ;; duplicate counters
+ t/*report-counters* (ref {})]
+ (junit/junit-report m)))
+
+ (defn run-tests-with-junit-reporter [run-tests-fn output-to]
+ (let [junit-out-filename output-to
+ old-report t/report]
+ (with-open [junit-out (io/writer junit-out-filename)]
+ (binding [junit/*var-context* (list)
+ junit/*depth* 1
+ t/report (partial junit-plus-default-report old-report junit-out)]
+ (binding [*out* junit-out]
+ (println "")
+ (println ""))
+ (let [result (run-tests-fn)]
+ (binding [*out* junit-out]
+ (println ""))
+ result)))))
+
+ (defn test-ns* [pred junit-output-to ns]
+ (binding [t/*report-counters* (ref t/*initial-report-counters*)]
+ (let [ns-obj (the-ns ns)
+ run-tests* (fn []
+ (t/do-report {:type :begin-test-ns :ns ns-obj})
+ (t/test-vars (filter pred (vals (ns-publics ns))))
+ (t/do-report {:type :end-test-ns :ns ns-obj})
+ @t/*report-counters*)]
+ (if junit-output-to
+ (run-tests-with-junit-reporter run-tests* (io/file junit-output-to (str (name ns) ".xml")))
+ (run-tests*)))))))))
;;; This prevents a name collision WARNING between the test task and
;;; clojure.core/test, a function that nobody really uses or cares