diff options
Diffstat (limited to 'tests/util/test_lock.py')
-rw-r--r-- | tests/util/test_lock.py | 94 |
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 |