summaryrefslogtreecommitdiff
path: root/test/dumpfm/millstone.clj
blob: e59bb61136f857e66db02867a521001194385b50 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
(ns dumpfm.millstone
  (:use clojure.contrib.def
	clojure.contrib.seq-utils
	clojure-http.client))

(def *spec*)
(def *cookies*)

(def printer (agent nil))

(defn log [& args]
  (send printer (fn [_] (apply println args))))

(defmacro with-timing [e]
  `(let [s# (System/nanoTime)
         r# ~e
         f# (System/nanoTime)]
     [(float (/ (- f# s#) 1e6)) r#]))

(defn do-base-request [server path method cookies params]
  (let [method (.toUpperCase method)
	url    (str server path)]
    (if (= method "GET")
      (request (add-query-params url params) method nil cookies)
      (request url method nil cookies params))))

(defnk do-setup-request! [path
			  :params nil
			  :method "GET"]
  (let [res (do-base-request (:server *spec*) path method *cookies* params)]
    (if (:cookies res)
      (set! *cookies* (merge *cookies* (:cookies res))))
    res))

(defnk do-request! [path
		    :params nil
		    :method :GET]
  (let [[time res] (with-timing
		     (do-base-request (:server *spec*)
				      path
				      method
				      *cookies*
				      params))]
    (log (format "%s - %sms [%s %s]" path time (:code res) (:msg res)))
    (if (:cookies res)
      (log "should set cookies" (:cookies res)))
    res))

(defn build-client! [spec client-id]
  (binding [*cookies*   {}]
    (if (:setup-func spec)
      ((:setup-func spec)))
    {:client-id client-id
     :cookies   *cookies*}))

(defn print-run-results [spec elapsed]
  (log (format "\nFinished\n--------\n%s runs in %s s (%s r/s)\n%s clients"
	       (:requests spec)
	       (/ elapsed 1000)
	       (/ (:requests spec) elapsed 1000)
	       (:clients spec))))

(defn build-func-list [routes]
  (flatten (for [[n f] routes]
	     (repeat n f))))

(defn grind! [spec]
  (binding [*spec* spec]
    (let [clients (doall
		   (for [id (range (:clients spec))]
		     (build-client! spec id)))
	  funcs     (build-func-list (:funcs spec))
	  results   (atom [])
	  counter   (atom (:requests spec))
	  threads (doall
		   (for [c clients]
		     (Thread.
		      (fn []
			(log "starting thread" (:client-id c))
			(binding [*spec* spec
				  *cookies* (:cookies c)]
			  (loop []
			    (if (> (swap! counter dec) 0)
			      (let [f (rand-elt funcs)]
				(f)
				(recur))))
			  (log "finishing thread" (:client-id c)))))))]
      (println "Finished setup")
      (let [[elapsed _] (with-timing
			  (do
			    (doseq [t threads]
			      (.start t))
			    (doseq [t threads]
			      (.join t))))]
	(print-run-results spec elapsed)))))