summaryrefslogtreecommitdiff
path: root/test/rw-lock.lisp
diff options
context:
space:
mode:
Diffstat (limited to 'test/rw-lock.lisp')
-rw-r--r--test/rw-lock.lisp79
1 files changed, 79 insertions, 0 deletions
diff --git a/test/rw-lock.lisp b/test/rw-lock.lisp
new file mode 100644
index 0000000..4460398
--- /dev/null
+++ b/test/rw-lock.lisp
@@ -0,0 +1,79 @@
1;; SPDX-License-Identifier: EUPL-1.2
2;; SPDX-FileCopyrightText: 2025 Uko Kokņevičs <perkontevs@gmail.com>
3(defpackage :ukkoclot/test/rw-lock
4 (:documentation "Test-suite for :ukkoclot/src/rw-lock.")
5 (:use :c2cl :fiveam :ukkoclot/src/rw-lock)
6 (:import-from :bt2 :with-timeout))
7(in-package :ukkoclot/test/rw-lock)
8
9(def-suite :ukkoclot/rw-lock)
10(in-suite :ukkoclot/rw-lock)
11
12(test rw-lock.typep
13 (is (typep (make-rw-lock) 'rw-lock)))
14
15(test rw-lock-p
16 (is (rw-lock-p (make-rw-lock))))
17
18(test acquire-read-lock.no-contention
19 (with-timeout (5)
20 (let ((lock (make-rw-lock)))
21 (is-true (acquire-read-lock lock :wait t))
22 (is (rw-lock-p (release-read-lock lock)))
23 (is-true (acquire-read-lock lock :wait nil))
24 (is (rw-lock-p (release-read-lock lock))))))
25
26(test acquire-read-lock.multiple
27 (with-timeout (5)
28 (let ((lock (make-rw-lock)))
29 (is-true (acquire-read-lock lock :wait t))
30 (is-true (acquire-read-lock lock :wait nil))
31 (is-true (acquire-read-lock lock :wait t))
32 (is (rw-lock-p (release-read-lock lock)))
33 (is (rw-lock-p (release-read-lock lock)))
34 (is (rw-lock-p (release-read-lock lock))))))
35
36(test acquire-write-lock.no-contention
37 (let ((lock (make-rw-lock)))
38 (is-true (acquire-write-lock lock :wait nil))
39 (is (rw-lock-p (release-write-lock lock)))
40 (is-true (acquire-write-lock lock :wait nil))
41 (is (rw-lock-p (release-write-lock lock)))))
42
43(test acquire-write-lock.contention
44 (let ((lock (make-rw-lock)))
45 (is-true (acquire-write-lock lock :wait nil))
46 (is-false (acquire-write-lock lock :wait nil))
47 (is (rw-lock-p (release-write-lock lock)))))
48
49(test acquire-read&write-lock.contention
50 (let ((lock (make-rw-lock)))
51 (is-true (acquire-read-lock lock :wait nil))
52 (is-true (acquire-read-lock lock :wait nil))
53 (is-false (acquire-write-lock lock :wait nil))
54 (is (rw-lock-p (release-read-lock lock)))
55 (is (rw-lock-p (release-read-lock lock)))
56 (is-true (acquire-write-lock lock :wait nil))
57 (is-false (acquire-read-lock lock :wait nil))
58 (is (rw-lock-p (release-write-lock lock)))))
59
60(test with-read-lock.simple
61 (let ((lock (make-rw-lock)))
62 (with-read-lock (lock)
63 (is-true (acquire-read-lock lock :wait nil))
64 (is (rw-lock-p (release-read-lock lock)))
65 (is-false (acquire-write-lock lock :wait nil)))
66 (is-true (acquire-read-lock lock :wait nil))
67 (is (rw-lock-p (release-read-lock lock)))
68 (is-true (acquire-write-lock lock :wait nil))
69 (is (rw-lock-p (release-write-lock lock)))))
70
71(test with-write-lock.simple
72 (let ((lock (make-rw-lock)))
73 (with-write-lock (lock)
74 (is-false (acquire-read-lock lock :wait nil))
75 (is-false (acquire-write-lock lock :wait nil)))
76 (is-true (acquire-read-lock lock :wait nil))
77 (is (rw-lock-p (release-read-lock lock)))
78 (is-true (acquire-write-lock lock :wait nil))
79 (is (rw-lock-p (release-write-lock lock)))))