summary refs log tree commit diff
path: root/tests/util/test_lock.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/util/test_lock.py')
-rw-r--r--tests/util/test_lock.py94
1 files changed, 94 insertions, 0 deletions
diff --git a/tests/util/test_lock.py b/tests/util/test_lock.py
new file mode 100644
index 0000000000..b7b8779fd3
--- /dev/null
+++ b/tests/util/test_lock.py
@@ -0,0 +1,94 @@
+# -*- coding: utf-8 -*-
+
+from twisted.internet import defer
+from twisted.trial import unittest
+
+from synapse.util.lockutils import LockManager
+
+
+class LockManagerTestCase(unittest.TestCase):
+
+    def setUp(self):
+        self.lock_manager = LockManager()
+
+    @defer.inlineCallbacks
+    def test_one_lock(self):
+        key = "test"
+        deferred_lock1 = self.lock_manager.lock(key)
+
+        self.assertTrue(deferred_lock1.called)
+
+        lock1 = yield deferred_lock1
+
+        self.assertFalse(lock1.released)
+
+        lock1.release()
+
+        self.assertTrue(lock1.released)
+
+    @defer.inlineCallbacks
+    def test_concurrent_locks(self):
+        key = "test"
+        deferred_lock1 = self.lock_manager.lock(key)
+        deferred_lock2 = self.lock_manager.lock(key)
+
+        self.assertTrue(deferred_lock1.called)
+        self.assertFalse(deferred_lock2.called)
+
+        lock1 = yield deferred_lock1
+
+        self.assertFalse(lock1.released)
+        self.assertFalse(deferred_lock2.called)
+
+        lock1.release()
+
+        self.assertTrue(lock1.released)
+        self.assertTrue(deferred_lock2.called)
+
+        lock2 = yield deferred_lock2
+
+        lock2.release()
+
+    @defer.inlineCallbacks
+    def test_sequential_locks(self):
+        key = "test"
+        deferred_lock1 = self.lock_manager.lock(key)
+
+        self.assertTrue(deferred_lock1.called)
+
+        lock1 = yield deferred_lock1
+
+        self.assertFalse(lock1.released)
+
+        lock1.release()
+
+        self.assertTrue(lock1.released)
+
+        deferred_lock2 = self.lock_manager.lock(key)
+
+        self.assertTrue(deferred_lock2.called)
+
+        lock2 = yield deferred_lock2
+
+        self.assertFalse(lock2.released)
+
+        lock2.release()
+
+        self.assertTrue(lock2.released)
+
+    @defer.inlineCallbacks
+    def test_with_statement(self):
+        key = "test"
+        with (yield self.lock_manager.lock(key)) as lock:
+            self.assertFalse(lock.released)
+
+        self.assertTrue(lock.released)
+
+    @defer.inlineCallbacks
+    def test_two_with_statement(self):
+        key = "test"
+        with (yield self.lock_manager.lock(key)):
+            pass
+
+        with (yield self.lock_manager.lock(key)):
+            pass
\ No newline at end of file