562
564
self.assertEqual(self.branch_format,
563
565
branch.BranchFormat.find_format(opened_control))
568
class TestBranchLocking(TestCaseWithBranch):
570
def get_instrumented_branch(self):
571
"""Get a Branch object which has been instrumented"""
572
# TODO: jam 20060630 It may be that not all formats have a
573
# 'control_files' member. So we should fail gracefully if
574
# not there. But assuming it has them lets us test the exact
577
b = LockWrapper(self.locks, self.get_branch(), 'b')
578
b.repository = LockWrapper(self.locks, b.repository, 'r')
579
bcf = b.control_files
580
rcf = b.repository.control_files
582
# Look out for branch types that reuse their control files
583
self.combined_control = bcf is rcf
585
b.control_files = LockWrapper(self.locks, b.control_files, 'bc')
586
b.repository.control_files = \
587
LockWrapper(self.locks, b.repository.control_files, 'rc')
590
def test_01_lock_read(self):
591
# Test that locking occurs in the correct order
592
b = self.get_instrumented_branch()
594
self.assertFalse(b.is_locked())
595
self.assertFalse(b.repository.is_locked())
598
self.assertTrue(b.is_locked())
599
self.assertTrue(b.repository.is_locked())
602
self.assertFalse(b.is_locked())
603
self.assertFalse(b.repository.is_locked())
605
self.assertEqual([('b', 'lr', True), ('bc', 'lr', True),
606
('r', 'lr', True), ('rc', 'lr', True),
607
('b', 'ul', True), ('r', 'ul', True),
608
('rc', 'ul', True), ('bc', 'ul', True),
611
def test_02_lock_write(self):
612
# Test that locking occurs in the correct order
613
b = self.get_instrumented_branch()
615
self.assertFalse(b.is_locked())
616
self.assertFalse(b.repository.is_locked())
619
self.assertTrue(b.is_locked())
620
self.assertTrue(b.repository.is_locked())
623
self.assertFalse(b.is_locked())
624
self.assertFalse(b.repository.is_locked())
626
self.assertEqual([('b', 'lw', True), ('bc', 'lw', True),
627
('r', 'lw', True), ('rc', 'lw', True),
628
('b', 'ul', True), ('r', 'ul', True),
629
('rc', 'ul', True), ('bc', 'ul', True),
632
def test_03_lock_fail_unlock_repo(self):
633
# Make sure branch.unlock() is called, even if there is a
634
# failure while unlocking the repository.
635
b = self.get_instrumented_branch()
636
b.repository.disable_unlock()
638
self.assertFalse(b.is_locked())
639
self.assertFalse(b.repository.is_locked())
642
self.assertTrue(b.is_locked())
643
self.assertTrue(b.repository.is_locked())
644
self.assertRaises(TestPreventLocking, b.unlock)
645
if self.combined_control:
646
self.assertTrue(b.is_locked())
648
self.assertFalse(b.is_locked())
649
self.assertTrue(b.repository.is_locked())
651
# We unlock the branch control files, even if
652
# we fail to unlock the repository
653
self.assertEqual([('b', 'lw', True), ('bc', 'lw', True),
654
('r', 'lw', True), ('rc', 'lw', True),
655
('b', 'ul', True), ('r', 'ul', False),
660
# For cleanup purposes, make sure we are unlocked
661
b.repository._other.unlock()
663
def test_04_lock_read_fail_repo(self):
664
# Test that the branch is unlocked if it cannot lock the repository
665
b = self.get_instrumented_branch()
666
b.repository.disable_lock_read()
668
self.assertRaises(TestPreventLocking, b.lock_read)
669
self.assertFalse(b.is_locked())
670
self.assertFalse(b.repository.is_locked())
672
self.assertEqual([('b', 'lr', True), ('bc', 'lr', True),
677
def test_05_lock_write_fail_repo(self):
678
# Test that the branch is unlocked if it cannot lock the repository
679
b = self.get_instrumented_branch()
680
b.repository.disable_lock_write()
682
self.assertRaises(TestPreventLocking, b.lock_write)
683
self.assertFalse(b.is_locked())
684
self.assertFalse(b.repository.is_locked())
686
self.assertEqual([('b', 'lw', True), ('bc', 'lw', True),
691
def test_06_lock_read_fail_control(self):
692
# We shouldn't try to lock the repo if we can't lock the branch
693
b = self.get_instrumented_branch()
694
b.control_files.disable_lock_read()
696
self.assertRaises(TestPreventLocking, b.lock_read)
697
self.assertFalse(b.is_locked())
698
self.assertFalse(b.repository.is_locked())
700
self.assertEqual([('b', 'lr', True), ('bc', 'lr', False),
703
def test_07_lock_write_fail_control(self):
704
# We shouldn't try to lock the repo if we can't lock the branch
705
b = self.get_instrumented_branch()
706
b.control_files.disable_lock_write()
708
self.assertRaises(TestPreventLocking, b.lock_write)
709
self.assertFalse(b.is_locked())
710
self.assertFalse(b.repository.is_locked())
712
self.assertEqual([('b', 'lw', True), ('bc', 'lw', False),