source: trunk/src/unit_tests/threading_test.lisp

Last change on this file was 328, checked in by lgiessmann, 14 years ago

fixed ticket #75 --> changed license terms from LGPL to LLGPL in the trunk tree

File size: 4.5 KB
Line 
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))
Note: See TracBrowser for help on using the repository browser.