Reference Matrix Home Server
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
|