1 | ;;+----------------------------------------------------------------------------- |
---|
2 | ;;+ Isidorus |
---|
3 | ;;+ (c) 2008-2010 Marc Kuester, Christoph Ludwig, Lukas Georgieff |
---|
4 | ;;+ |
---|
5 | ;;+ Isidorus is freely distributable under the LLGPL license. |
---|
6 | ;;+ You can find a detailed description in trunk/docs/LLGPL-LICENSE.txt and |
---|
7 | ;;+ trunk/docs/LGPL-LICENSE.txt. |
---|
8 | ;;+----------------------------------------------------------------------------- |
---|
9 | |
---|
10 | (defpackage :threading-test |
---|
11 | (:use :cl |
---|
12 | :it.bese.FiveAM |
---|
13 | :isidorus-threading |
---|
14 | :bordeaux-threads) |
---|
15 | (:export :run-threading-tests |
---|
16 | :test-helpers |
---|
17 | :test-with-reader-lock |
---|
18 | :test-with-writer-lock |
---|
19 | :threading-test)) |
---|
20 | |
---|
21 | |
---|
22 | (in-package :threading-test) |
---|
23 | |
---|
24 | |
---|
25 | (def-suite threading-test |
---|
26 | :description "tests various key functions of the threading module") |
---|
27 | |
---|
28 | (in-suite threading-test) |
---|
29 | |
---|
30 | (test test-helpers |
---|
31 | "Tests the helper functions current-readers, add-thread-to-reader-list |
---|
32 | and remove-thread-from-reader-list" |
---|
33 | (is-true isidorus-threading::*readerlist-lock*) |
---|
34 | (is-true isidorus-threading::*writer-lock*) |
---|
35 | (is-false isidorus-threading::*current-readers*) |
---|
36 | (is-false (progn |
---|
37 | (isidorus-threading::remove-thread-from-reader-list) |
---|
38 | (current-readers))) |
---|
39 | (is (= 1 (length (progn |
---|
40 | (isidorus-threading::add-thread-to-reader-list) |
---|
41 | (current-readers))))) |
---|
42 | (is (eql (first (current-readers)) (current-thread))) |
---|
43 | (is (= 1 (length isidorus-threading::*current-readers*))) |
---|
44 | (is-true (let ((copy-of-readers |
---|
45 | (current-readers))) |
---|
46 | (setf copy-of-readers nil) |
---|
47 | isidorus-threading::*current-readers*)) |
---|
48 | (setf isidorus-threading::*current-readers* nil) |
---|
49 | (is-false (current-readers)) |
---|
50 | (is (= 2 (length (progn |
---|
51 | (isidorus-threading::add-thread-to-reader-list) |
---|
52 | (isidorus-threading::add-thread-to-reader-list) |
---|
53 | (isidorus-threading::current-readers))))) |
---|
54 | (is (= 1 (progn |
---|
55 | (isidorus-threading::remove-thread-from-reader-list) |
---|
56 | (push t isidorus-threading::*current-readers*) |
---|
57 | (length (current-readers))))) |
---|
58 | (setf isidorus-threading::*current-readers* nil)) |
---|
59 | |
---|
60 | |
---|
61 | (test test-with-reader-lock |
---|
62 | "Tests the macro with-reader-lock" |
---|
63 | (is-true isidorus-threading::*readerlist-lock*) |
---|
64 | (is-true isidorus-threading::*writer-lock*) |
---|
65 | (is-false isidorus-threading::*current-readers*) |
---|
66 | (let ((thread-1 |
---|
67 | (make-thread #'(lambda() |
---|
68 | (with-reader-lock (sleep 3))))) |
---|
69 | (thread-2 |
---|
70 | (make-thread #'(lambda() |
---|
71 | (with-reader-lock (sleep 3))))) |
---|
72 | (thread-3 |
---|
73 | (make-thread #'(lambda() |
---|
74 | (with-reader-lock (sleep 3)))))) |
---|
75 | (is (= 3 (length (current-readers)))) |
---|
76 | (is-true (find thread-1 (current-readers))) |
---|
77 | (is-true (find thread-2 (current-readers))) |
---|
78 | (is-true (find thread-3 (current-readers))) |
---|
79 | (sleep 4) |
---|
80 | (is-false (current-readers))) |
---|
81 | (setf isidorus-threading::*current-readers* nil) |
---|
82 | (make-thread #'(lambda() |
---|
83 | (with-lock-held (isidorus-threading::*readerlist-lock*) |
---|
84 | (sleep 3)))) |
---|
85 | (let ((start-time |
---|
86 | (get-universal-time))) |
---|
87 | (isidorus-threading::add-thread-to-reader-list) |
---|
88 | (is (<= (+ 2 start-time) (get-universal-time)))) |
---|
89 | (setf isidorus-threading::*current-readers* nil) |
---|
90 | (let ((start-time |
---|
91 | (get-universal-time))) |
---|
92 | (make-thread #'(lambda() (with-reader-lock (sleep 3)))) |
---|
93 | (make-thread #'(lambda() (with-reader-lock (sleep 3)))) |
---|
94 | (is (> (+ start-time 3) (get-universal-time))) |
---|
95 | (is (= 2 (length (current-readers)))) |
---|
96 | (sleep 4)) |
---|
97 | (is-false (current-readers))) |
---|
98 | |
---|
99 | |
---|
100 | (test test-with-writer-lock |
---|
101 | "Tests the macro with-writer-lock" |
---|
102 | (is-true isidorus-threading::*readerlist-lock*) |
---|
103 | (is-true isidorus-threading::*writer-lock*) |
---|
104 | (is-false isidorus-threading::*current-readers*) |
---|
105 | (let ((start-time |
---|
106 | (get-universal-time))) |
---|
107 | (with-writer-lock nil) |
---|
108 | (is (>= (+ 1 start-time) (get-universal-time)))) |
---|
109 | (make-thread #'(lambda() |
---|
110 | (with-reader-lock #'(lambda() |
---|
111 | (sleep 3))))) |
---|
112 | (let ((start-time |
---|
113 | (get-universal-time))) |
---|
114 | (make-thread #'(lambda() (with-writer-lock (sleep 3)))) |
---|
115 | (make-thread #'(lambda() (with-reader-lock (sleep 3)))) |
---|
116 | (is-false (current-readers)) |
---|
117 | (with-writer-lock nil) |
---|
118 | (is (<= (+ 3 start-time) (get-universal-time)))) |
---|
119 | (let ((start-time |
---|
120 | (get-universal-time))) |
---|
121 | (make-thread #'(lambda() (with-reader-lock (sleep 3)))) |
---|
122 | (make-thread #'(lambda() (with-reader-lock (sleep 3)))) |
---|
123 | (make-thread #'(lambda() (with-reader-lock (sleep 3)))) |
---|
124 | (with-writer-lock nil) |
---|
125 | (is (<= (+ start-time 3) (get-universal-time))))) |
---|
126 | |
---|
127 | |
---|
128 | (defun run-threading-tests () |
---|
129 | "Runs all defined tests in this package" |
---|
130 | (it.bese.fiveam:run! 'test-helpers) |
---|
131 | (it.bese.fiveam:run! 'test-with-reader-lock) |
---|
132 | (it.bese.fiveam:run! 'test-with-writer-lock)) |
---|