Rev 4329: Introduce a new lock_broken hook. in file:///home/vila/src/bzr/experimental/failing-lock-tests/

Vincent Ladeuil v.ladeuil+lp at free.fr
Fri May 8 16:39:12 BST 2009


At file:///home/vila/src/bzr/experimental/failing-lock-tests/

------------------------------------------------------------
revno: 4329
revision-id: v.ladeuil+lp at free.fr-20090508153911-pkdvtiyj4567fgqq
parent: v.ladeuil+lp at free.fr-20090505112801-6ijinkqgaymoofxq
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: failing-lock-tests
timestamp: Fri 2009-05-08 17:39:11 +0200
message:
  Introduce a new lock_broken hook.
  
  * tests/test_lockdir.py:
  (TestLockDirHooks): Separate hook related tests from other lock
  tests.
  (TestLockDirHooks.test_LockDir_broken_success,
  TestLockDirHooks.test_LockDir_broken_failure): Add tests for the
  new lock_broken hook.
  
  * lockdir.py:
  (LockDir.force_break): Fire lock_broken hook.
  
  * lock.py:
  (LockHooks.__init__): Add lock_broken hook.
-------------- next part --------------
=== modified file 'NEWS'
--- a/NEWS	2009-05-04 07:54:22 +0000
+++ b/NEWS	2009-05-08 15:39:11 +0000
@@ -107,6 +107,10 @@
   via ~/.bazaar/authentication.conf fails. (Jelmer Vernooij, 
   Vincent Ladeuil, #321918)
 
+* New hook ``Lock.lock_broken`` which runs when a lock is
+  broken. This is mainly for testing that lock/unlock are
+  balanced in tests. (Vincent Ladeuil)
+
 * New smart server verb ``BzrDir.initialize_ex`` which implements a
   refactoring to the core of clone allowing less round trips on new
   branches. (Robert Collins)

=== modified file 'bzrlib/lock.py'
--- a/bzrlib/lock.py	2009-05-05 11:28:01 +0000
+++ b/bzrlib/lock.py	2009-05-08 15:39:11 +0000
@@ -55,6 +55,9 @@
         self.create_hook(HookPoint('lock_released',
             "Called with a bzrlib.lock.LockResult when a physical lock is "
             "released.", (1, 8), None))
+        self.create_hook(HookPoint('lock_broken',
+            "Called with a bzrlib.lock.LockResult when a physical lock is "
+            "broken.", (1, 15), None))
 
 
 class Lock(object):

=== modified file 'bzrlib/lockdir.py'
--- a/bzrlib/lockdir.py	2009-03-23 14:59:43 +0000
+++ b/bzrlib/lockdir.py	2009-05-08 15:39:11 +0000
@@ -325,7 +325,7 @@
             self._trace("... unlock succeeded after %dms",
                     (time.time() - start_time) * 1000)
             result = lock.LockResult(self.transport.abspath(self.path),
-                old_nonce)
+                                     old_nonce)
             for hook in self.hooks['lock_released']:
                 hook(result)
 
@@ -379,6 +379,10 @@
             raise LockBreakMismatch(self, broken_info, dead_holder_info)
         self.transport.delete(broken_info_path)
         self.transport.rmdir(tmpname)
+        result = lock.LockResult(self.transport.abspath(self.path),
+                                 current_info.get('nonce'))
+        for hook in self.hooks['lock_broken']:
+            hook(result)
 
     def _check_not_locked(self):
         """If the lock is held by this instance, raise an error."""

=== modified file 'bzrlib/tests/test_lockdir.py'
--- a/bzrlib/tests/test_lockdir.py	2009-05-05 11:28:01 +0000
+++ b/bzrlib/tests/test_lockdir.py	2009-05-08 15:39:11 +0000
@@ -670,23 +670,29 @@
         # no kibble
         check_dir(['held'])
 
+
+class TestLockDirHooks(TestCaseWithTransport):
+
+    def setUp(self):
+        super(TestLockDirHooks, self).setUp()
+        self._calls = []
+        self._old_hooks = lock.Lock.hooks
+
+        def restore():
+            lock.Lock.hooks = self._old_hooks
+        self.addCleanup(restore)
+        lock.Lock.hooks = lock.LockHooks()
+
+    def get_lock(self):
+        return LockDir(self.get_transport(), 'test_lock')
+
     def record_hook(self, result):
         self._calls.append(result)
 
-    def reset_hooks(self):
-        self._old_hooks = lock.Lock.hooks
-        self.addCleanup(self.restore_hooks)
-        lock.Lock.hooks = lock.LockHooks()
-
-    def restore_hooks(self):
-        lock.Lock.hooks = self._old_hooks
-
     def test_LockDir_acquired_success(self):
         # the LockDir.lock_acquired hook fires when a lock is acquired.
-        self._calls = []
-        self.reset_hooks()
         LockDir.hooks.install_named_hook('lock_acquired',
-            self.record_hook, 'record_hook')
+                                         self.record_hook, 'record_hook')
         ld = self.get_lock()
         ld.create()
         self.assertEqual([], self._calls)
@@ -698,15 +704,13 @@
 
     def test_LockDir_acquired_fail(self):
         # the LockDir.lock_acquired hook does not fire on failure.
-        self._calls = []
-        self.reset_hooks()
         ld = self.get_lock()
         ld.create()
         ld2 = self.get_lock()
         ld2.attempt_lock()
         # install a lock hook now, when the disk lock is locked
         LockDir.hooks.install_named_hook('lock_acquired',
-            self.record_hook, 'record_hook')
+                                         self.record_hook, 'record_hook')
         self.assertRaises(errors.LockContention, ld.attempt_lock)
         self.assertEqual([], self._calls)
         ld2.unlock()
@@ -714,10 +718,8 @@
 
     def test_LockDir_released_success(self):
         # the LockDir.lock_released hook fires when a lock is acquired.
-        self._calls = []
-        self.reset_hooks()
         LockDir.hooks.install_named_hook('lock_released',
-            self.record_hook, 'record_hook')
+                                         self.record_hook, 'record_hook')
         ld = self.get_lock()
         ld.create()
         self.assertEqual([], self._calls)
@@ -729,14 +731,39 @@
 
     def test_LockDir_released_fail(self):
         # the LockDir.lock_released hook does not fire on failure.
-        self._calls = []
-        self.reset_hooks()
         ld = self.get_lock()
         ld.create()
         ld2 = self.get_lock()
         ld.attempt_lock()
         ld2.force_break(ld2.peek())
         LockDir.hooks.install_named_hook('lock_released',
-            self.record_hook, 'record_hook')
+                                         self.record_hook, 'record_hook')
         self.assertRaises(LockBroken, ld.unlock)
         self.assertEqual([], self._calls)
+
+    def test_LockDir_broken_success(self):
+        # the LockDir.lock_broken hook fires when a lock is broken.
+        ld = self.get_lock()
+        ld.create()
+        ld2 = self.get_lock()
+        result = ld.attempt_lock()
+        LockDir.hooks.install_named_hook('lock_broken',
+                                         self.record_hook, 'record_hook')
+        ld2.force_break(ld2.peek())
+        lock_path = ld.transport.abspath(ld.path)
+        self.assertEqual([lock.LockResult(lock_path, result)], self._calls)
+
+    def test_LockDir_broken_failure(self):
+        # the LockDir.lock_broken hook does not fires when a lock is already
+        # released.
+        ld = self.get_lock()
+        ld.create()
+        ld2 = self.get_lock()
+        result = ld.attempt_lock()
+        holder_info = ld2.peek()
+        ld.unlock()
+        LockDir.hooks.install_named_hook('lock_broken',
+                                         self.record_hook, 'record_hook')
+        ld2.force_break(holder_info)
+        lock_path = ld.transport.abspath(ld.path)
+        self.assertEqual([], self._calls)



More information about the bazaar-commits mailing list