Rev 4525: Some more tests about lock behavior. in http://bazaar.launchpad.net/~jameinel/bzr/1.18-lock-warnings

John Arbash Meinel john at arbash-meinel.com
Fri Jul 10 19:00:54 BST 2009


At http://bazaar.launchpad.net/~jameinel/bzr/1.18-lock-warnings

------------------------------------------------------------
revno: 4525
revision-id: john at arbash-meinel.com-20090710180043-mxzzfl69nh2biwvf
parent: john at arbash-meinel.com-20090710175054-u0mp3mc7pbjd8xgl
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 1.18-lock-warnings
timestamp: Fri 2009-07-10 13:00:43 -0500
message:
  Some more tests about lock behavior.
-------------- next part --------------
=== modified file 'bzrlib/tests/test_lock.py'
--- a/bzrlib/tests/test_lock.py	2009-07-10 17:50:54 +0000
+++ b/bzrlib/tests/test_lock.py	2009-07-10 18:00:43 +0000
@@ -42,21 +42,73 @@
     read_lock = None
     write_lock = None
 
+    def setUp(self):
+        super(TestOSLock, self).setUp()
+        self.build_tree(['a-lock-file'])
+
     def test_create_read_lock(self):
-        self.build_tree(['a-lock-file'])
-        lock = self.read_lock('a-lock-file')
-        lock.unlock()
+        r_lock = self.read_lock('a-lock-file')
+        r_lock.unlock()
 
     def test_create_write_lock(self):
-        self.build_tree(['a-lock-file'])
-        lock = self.write_lock('a-lock-file')
-        lock.unlock()
+        w_lock = self.write_lock('a-lock-file')
+        w_lock.unlock()
+
+    def test_read_locks_share(self):
+        r_lock = self.read_lock('a-lock-file')
+        try:
+            lock2 = self.read_lock('a-lock-file')
+            lock2.unlock()
+        finally:
+            r_lock.unlock()
 
     def test_write_locks_are_exclusive(self):
-        self.build_tree(['a-lock-file'])
-        lock = self.write_lock('a-lock-file')
-        try:
-            self.assertRaises(errors.LockContention,
-                              self.write_lock, 'a-lock-file')
-        finally:
-            lock.unlock()
+        w_lock = self.write_lock('a-lock-file')
+        try:
+            self.assertRaises(errors.LockContention,
+                              self.write_lock, 'a-lock-file')
+        finally:
+            w_lock.unlock()
+
+    def test_read_locks_block_write_locks(self):
+        r_lock = self.read_lock('a-lock-file')
+        try:
+            self.assertRaises(errors.LockContention,
+                              self.write_lock, 'a-lock-file')
+        finally:
+            r_lock.unlock()
+
+    def test_temporary_write_lock(self):
+        r_lock = self.read_lock('a-lock-file')
+        try:
+            status, w_lock = r_lock.temporary_write_lock()
+            self.assertTrue(status)
+            # This should block another write lock
+            try:
+                self.assertRaises(errors.LockContention,
+                                  self.write_lock, 'a-lock-file')
+            finally:
+                r_lock = w_lock.restore_read_lock()
+            # We should be able to take a read lock now
+            r_lock2 = self.read_lock('a-lock-file')
+            r_lock2.unlock()
+        finally:
+            r_lock.unlock()
+
+    def test_temporary_write_lock_fails(self):
+        r_lock = self.read_lock('a-lock-file')
+        try:
+            r_lock2 = self.read_lock('a-lock-file')
+            try:
+                status, w_lock = r_lock.temporary_write_lock()
+                self.assertFalse(status)
+                # Taking out the lock requires unlocking and locking again, so
+                # we have to replace the original object
+                r_lock = w_lock
+            finally:
+                r_lock2.unlock()
+            # We should be able to take a read lock now
+            r_lock2 = self.read_lock('a-lock-file')
+            r_lock2.unlock()
+        finally:
+            r_lock.unlock()



More information about the bazaar-commits mailing list