142
142
lf1 = LockDir(t, 'test_lock')
144
144
lf1.attempt_lock()
145
self.addCleanup(lf1.unlock)
145
146
# lock is held, should get some info on it
146
147
info1 = lf1.peek()
147
148
self.assertEqual(set(info1.keys()),
161
162
lf2 = LockDir(self.get_readonly_transport(), 'test_lock')
162
163
self.assertEqual(lf2.peek(), None)
163
164
lf1.attempt_lock()
165
self.addCleanup(lf1.unlock)
164
166
info2 = lf2.peek()
165
167
self.assertTrue(info2)
166
168
self.assertEqual(info2['nonce'], lf1.nonce)
468
471
lf1.attempt_lock()
469
472
t.move('test_lock', 'lock_gone_now')
470
473
self.assertRaises(LockBroken, lf1.confirm)
475
t.move('lock_gone_now', 'test_lock')
472
478
def test_43_break(self):
473
479
"""Break a lock whose caller has forgotten it"""
621
629
def test_lock_by_token(self):
622
630
ld1 = self.get_lock()
623
631
token = ld1.lock_write()
632
self.addCleanup(ld1.unlock)
624
633
self.assertNotEqual(None, token)
625
634
ld2 = self.get_lock()
626
635
t2 = ld2.lock_write(token)
636
self.addCleanup(ld2.unlock)
627
637
self.assertEqual(token, t2)
629
639
def test_lock_with_buggy_rename(self):
655
665
# when held, that's all we see
656
666
ld1.attempt_lock()
667
self.addCleanup(ld1.unlock)
657
668
check_dir(['held'])
658
669
# second guy should fail
659
670
self.assertRaises(errors.LockContention, ld2.attempt_lock)
661
672
check_dir(['held'])
675
class TestLockDirHooks(TestCaseWithTransport):
678
super(TestLockDirHooks, self).setUp()
682
return LockDir(self.get_transport(), 'test_lock')
663
684
def record_hook(self, result):
664
685
self._calls.append(result)
666
def reset_hooks(self):
667
self._old_hooks = lock.Lock.hooks
668
self.addCleanup(self.restore_hooks)
669
lock.Lock.hooks = lock.LockHooks()
671
def restore_hooks(self):
672
lock.Lock.hooks = self._old_hooks
674
687
def test_LockDir_acquired_success(self):
675
688
# the LockDir.lock_acquired hook fires when a lock is acquired.
678
689
LockDir.hooks.install_named_hook('lock_acquired',
679
self.record_hook, 'record_hook')
690
self.record_hook, 'record_hook')
680
691
ld = self.get_lock()
682
693
self.assertEqual([], self._calls)
689
700
def test_LockDir_acquired_fail(self):
690
701
# the LockDir.lock_acquired hook does not fire on failure.
693
702
ld = self.get_lock()
695
704
ld2 = self.get_lock()
696
705
ld2.attempt_lock()
697
706
# install a lock hook now, when the disk lock is locked
698
707
LockDir.hooks.install_named_hook('lock_acquired',
699
self.record_hook, 'record_hook')
708
self.record_hook, 'record_hook')
700
709
self.assertRaises(errors.LockContention, ld.attempt_lock)
701
710
self.assertEqual([], self._calls)
705
714
def test_LockDir_released_success(self):
706
715
# the LockDir.lock_released hook fires when a lock is acquired.
709
716
LockDir.hooks.install_named_hook('lock_released',
710
self.record_hook, 'record_hook')
717
self.record_hook, 'record_hook')
711
718
ld = self.get_lock()
713
720
self.assertEqual([], self._calls)
720
727
def test_LockDir_released_fail(self):
721
728
# the LockDir.lock_released hook does not fire on failure.
724
729
ld = self.get_lock()
726
731
ld2 = self.get_lock()
727
732
ld.attempt_lock()
728
733
ld2.force_break(ld2.peek())
729
734
LockDir.hooks.install_named_hook('lock_released',
730
self.record_hook, 'record_hook')
735
self.record_hook, 'record_hook')
731
736
self.assertRaises(LockBroken, ld.unlock)
732
737
self.assertEqual([], self._calls)
739
def test_LockDir_broken_success(self):
740
# the LockDir.lock_broken hook fires when a lock is broken.
743
ld2 = self.get_lock()
744
result = ld.attempt_lock()
745
LockDir.hooks.install_named_hook('lock_broken',
746
self.record_hook, 'record_hook')
747
ld2.force_break(ld2.peek())
748
lock_path = ld.transport.abspath(ld.path)
749
self.assertEqual([lock.LockResult(lock_path, result)], self._calls)
751
def test_LockDir_broken_failure(self):
752
# the LockDir.lock_broken hook does not fires when a lock is already
756
ld2 = self.get_lock()
757
result = ld.attempt_lock()
758
holder_info = ld2.peek()
760
LockDir.hooks.install_named_hook('lock_broken',
761
self.record_hook, 'record_hook')
762
ld2.force_break(holder_info)
763
lock_path = ld.transport.abspath(ld.path)
764
self.assertEqual([], self._calls)