summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorGravatar Uko Kokņevičs2025-10-19 07:30:03 +0300
committerGravatar Uko Kokņevičs2025-10-19 07:30:03 +0300
commit09babc46d92c4a1b85d619a4935459f7d6125c03 (patch)
tree76d7e43c1ee27525af53453a3d6aa872ee2774ab /test
parentMigrate packages from :ukkoclot to :ukkoclot/src (diff)
downloadukkoclot-09babc46d92c4a1b85d619a4935459f7d6125c03.tar.gz
ukkoclot-09babc46d92c4a1b85d619a4935459f7d6125c03.tar.xz
ukkoclot-09babc46d92c4a1b85d619a4935459f7d6125c03.zip
Add a read-write lock & a testsuite
Diffstat (limited to 'test')
-rw-r--r--test/all.lisp28
-rw-r--r--test/rw-lock.lisp79
2 files changed, 107 insertions, 0 deletions
diff --git a/test/all.lisp b/test/all.lisp
new file mode 100644
index 0000000..b0a731b
--- /dev/null
+++ b/test/all.lisp
@@ -0,0 +1,28 @@
1;; SPDX-License-Identifier: EUPL-1.2
2;; SPDX-FileCopyrightText: 2025 Uko Kokņevičs <perkontevs@gmail.com>
3(defpackage :ukkoclot/test/all
4 (:documentation "Main test runner package.")
5 (:use :c2cl :fiveam
6 :ukkoclot/test/rw-lock)
7 (:import-from :bt2 :with-timeout)
8 (:import-from :uiop)
9 (:export #:*should-quit* #:run-tests))
10(in-package :ukkoclot/test/all)
11
12(defvar *should-quit* nil
13 "Bind as true if `run-tests' should exit the process with 0 or 1.
14
15Useful for CI.")
16
17;; TODO: Maybe I should signal on failure instead :thinking:
18(defun run-tests ()
19 "Run all tests"
20 (with-timeout (100)
21 (let ((status (run-all-tests)))
22 (when *should-quit*
23 (format t "~2&BTW Ignore the fatal ERROR condition below")
24 (cond
25 (status (format t "~&!GREAT SUCCESS!~2%")
26 (uiop:quit 0))
27 (t (format t "~&!!! TESTS R FUCKED MATE !!!~2%")
28 (uiop:quit 1)))))))
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)))))