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