Rev 3017: Make test_bzrdir work with packs - which always change the pack value during clone. in http://people.ubuntu.com/~robertc/baz2.0/pack.read-locks

Robert Collins robertc at robertcollins.net
Mon Nov 26 01:18:21 GMT 2007


At http://people.ubuntu.com/~robertc/baz2.0/pack.read-locks

------------------------------------------------------------
revno: 3017
revision-id:robertc at robertcollins.net-20071126011805-y12x1dtg7kc4k2vq
parent: robertc at robertcollins.net-20071125221339-u715g0yylii6g7ue
committer: Robert Collins <robertc at robertcollins.net>
branch nick: pack.read-locks
timestamp: Mon 2007-11-26 12:18:05 +1100
message:
  Make test_bzrdir work with packs - which always change the pack value during clone.
modified:
  bzrlib/tests/bzrdir_implementations/test_bzrdir.py test_bzrdir.py-20060131065642-0ebeca5e30e30866
=== modified file 'bzrlib/tests/bzrdir_implementations/test_bzrdir.py'
--- a/bzrlib/tests/bzrdir_implementations/test_bzrdir.py	2007-11-14 18:18:59 +0000
+++ b/bzrlib/tests/bzrdir_implementations/test_bzrdir.py	2007-11-26 01:18:05 +0000
@@ -18,6 +18,7 @@
 
 from cStringIO import StringIO
 import errno
+from itertools import izip
 import os
 from stat import S_ISDIR
 import sys
@@ -80,6 +81,10 @@
         reading it again, which leads to changed timestamps. This is ok though,
         because the inventory.kndx file is not ignored, and the integrity of
         knit joins is tested by test_knit and test_versionedfile.
+
+        :seealso: Additionally, assertRepositoryHasSameItems provides value
+            rather than representation checking of repositories for
+            equivalence.
         """
         files = []
         directories = ['.']
@@ -101,6 +106,63 @@
                                          target.get(path).read(),
                                          "text for file %r differs:\n" % path)
 
+    def assertRepositoryHasSameItems(self, left_repo, right_repo):
+        """require left_repo and right_repo to have the same value."""
+        # XXX: TODO: Doesn't work yet, because we need to be able to compare
+        # local repositories to remote ones...  but this is an as-yet unsolved
+        # aspect of format management and the Remote protocols...
+        # self.assertEqual(left_repo._format.__class__,
+        #     right_repo._format.__class__)
+        left_repo.lock_read()
+        try:
+            right_repo.lock_read()
+            try:
+                # revs
+                all_revs = left_repo.all_revision_ids()
+                self.assertEqual(left_repo.all_revision_ids(),
+                    right_repo.all_revision_ids())
+                for rev_id in left_repo.all_revision_ids():
+                    self.assertEqual(left_repo.get_revision(rev_id),
+                        right_repo.get_revision(rev_id))
+                # inventories
+                left_inv_weave = left_repo.get_inventory_weave()
+                right_inv_weave = right_repo.get_inventory_weave()
+                self.assertEqual(set(left_inv_weave.versions()),
+                    set(right_inv_weave.versions()))
+                # XXX: currently this does not handle indirectly referenced
+                # inventories (e.g. where the inventory is a delta basis for
+                # one that is fully present but that the revid for that
+                # inventory is not yet present.)
+                self.assertEqual(set(left_inv_weave.versions()), set(all_revs))
+                left_trees = left_repo.revision_trees(all_revs)
+                right_trees = right_repo.revision_trees(all_revs)
+                for left_tree, right_tree in izip(left_trees, right_trees):
+                    self.assertEqual(left_tree.inventory, right_tree.inventory)
+                # texts
+                text_index = left_repo._generate_text_key_index()
+                self.assertEqual(text_index,
+                    right_repo._generate_text_key_index())
+                for file_id, revision_id in text_index.iterkeys():
+                    left_weave = left_repo.weave_store.get_weave(
+                        file_id, left_repo.get_transaction())
+                    right_weave = right_repo.weave_store.get_weave(
+                        file_id, right_repo.get_transaction())
+                    self.assertEqual(
+                        left_weave.get_text(revision_id),
+                        right_weave.get_text(revision_id))
+                # signatures
+                for rev_id in all_revs:
+                    try:
+                        left_text = left_repo.get_signature_text(rev_id)
+                    except NoSuchRevision:
+                        continue
+                    right_text = right_repo.get_signature_text(rev_id)
+                    self.assertEqual(left_text, right_text)
+            finally:
+                right_repo.unlock()
+        finally:
+            left_repo.unlock()
+
     def skipIfNoWorkingTree(self, a_bzrdir):
         """Raises TestSkipped if a_bzrdir doesn't have a working tree.
         
@@ -229,9 +291,9 @@
         self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
                                     [
                                      './.bzr/merge-hashes',
-                                     './.bzr/repository/inventory.knit',
+                                     './.bzr/repository',
                                      ])
-
+        self.assertRepositoryHasSameItems(tree.branch.repository, repo)
 
     def test_clone_bzrdir_repository_under_shared(self):
         tree = self.make_branch_and_tree('commit_tree')
@@ -324,8 +386,9 @@
         target = dir.clone(self.get_url('target/child'), force_new_repo=True)
         self.assertNotEqual(dir.transport.base, target.transport.base)
         self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
-                                    ['./.bzr/repository/inventory.knit',
+                                    ['./.bzr/repository',
                                      ])
+        self.assertRepositoryHasSameItems(tree.branch.repository, repo)
 
     def test_clone_bzrdir_repository_revision(self):
         # test for revision limiting, [smoke test, not corner case checks].
@@ -361,9 +424,11 @@
                                      './.bzr/basis-inventory-cache',
                                      './.bzr/checkout/stat-cache',
                                      './.bzr/merge-hashes',
-                                     './.bzr/repository/inventory.knit',
+                                     './.bzr/repository',
                                      './.bzr/stat-cache',
                                     ])
+        self.assertRepositoryHasSameItems(
+            tree.branch.repository, target.open_repository())
 
     def test_clone_bzrdir_branch_and_repo_into_shared_repo(self):
         # by default cloning into a shared repo uses the shared repo.
@@ -401,10 +466,11 @@
         dir = source.bzrdir
         target = dir.clone(self.get_url('target/child'), force_new_repo=True)
         self.assertNotEqual(dir.transport.base, target.transport.base)
-        target.open_repository()
+        repo = target.open_repository()
         self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
-                                    ['./.bzr/repository/inventory.knit',
+                                    ['./.bzr/repository',
                                      ])
+        self.assertRepositoryHasSameItems(tree.branch.repository, repo)
 
     def test_clone_bzrdir_branch_reference(self):
         # cloning should preserve the reference status of the branch in a bzrdir
@@ -418,9 +484,7 @@
             return
         target = dir.clone(self.get_url('target'))
         self.assertNotEqual(dir.transport.base, target.transport.base)
-        self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
-                                    ['./.bzr/repository/inventory.knit',
-                                     ])
+        self.assertDirectoriesEqual(dir.root_transport, target.root_transport)
 
     def test_clone_bzrdir_branch_revision(self):
         # test for revision limiting, [smoke test, not corner case checks].
@@ -454,9 +518,10 @@
                                      './.bzr/checkout/stat-cache',
                                      './.bzr/checkout/merge-hashes',
                                      './.bzr/merge-hashes',
-                                     './.bzr/repository/inventory.knit',
+                                     './.bzr/repository',
                                      ])
-
+        self.assertRepositoryHasSameItems(tree.branch.repository,
+            target.open_repository())
         target.open_workingtree().revert()
 
     def test_revert_inventory(self):
@@ -473,8 +538,10 @@
                                      './.bzr/checkout/stat-cache',
                                      './.bzr/checkout/merge-hashes',
                                      './.bzr/merge-hashes',
-                                     './.bzr/repository/inventory.knit',
+                                     './.bzr/repository',
                                      ])
+        self.assertRepositoryHasSameItems(tree.branch.repository,
+            target.open_repository())
 
         target.open_workingtree().revert()
         self.assertDirectoriesEqual(dir.root_transport, target.root_transport,
@@ -483,8 +550,10 @@
                                      './.bzr/checkout/stat-cache',
                                      './.bzr/checkout/merge-hashes',
                                      './.bzr/merge-hashes',
-                                     './.bzr/repository/inventory.knit',
+                                     './.bzr/repository',
                                      ])
+        self.assertRepositoryHasSameItems(tree.branch.repository,
+            target.open_repository())
 
     def test_clone_bzrdir_tree_branch_reference(self):
         # a tree with a branch reference (aka a checkout) 
@@ -923,9 +992,11 @@
                                      './.bzr/checkout/inventory',
                                      './.bzr/inventory',
                                      './.bzr/parent',
-                                     './.bzr/repository/inventory.knit',
+                                     './.bzr/repository',
                                      './.bzr/stat-cache',
                                      ])
+        self.assertRepositoryHasSameItems(
+            tree.branch.repository, target.open_repository())
 
     def test_sprout_bzrdir_tree_branch_reference(self):
         # sprouting should create a repository if needed and a sprouted branch.
@@ -1427,6 +1498,13 @@
         # break lock with just a repo should unlock the repo.
         repo = self.make_repository('.')
         repo.lock_write()
+        lock_repo = repo.bzrdir.open_repository()
+        if not lock_repo.get_physical_lock_status():
+            # This bzrdir's default repository does not physically lock things
+            # and thus this interaction cannot be tested at the interface
+            # level.
+            repo.unlock()
+            return
         # only one yes needed here: it should only be unlocking
         # the repo
         bzrlib.ui.ui_factory.stdin = StringIO("y\n")
@@ -1436,7 +1514,6 @@
             # this bzrdir does not implement break_lock - so we cant test it.
             repo.unlock()
             return
-        lock_repo = repo.bzrdir.open_repository()
         lock_repo.lock_write()
         lock_repo.unlock()
         self.assertRaises(errors.LockBroken, repo.unlock)
@@ -1462,23 +1539,31 @@
             # dir is inappropriately accessed, 3 will be needed, and
             # we'll see that because the stream will be fully consumed
             bzrlib.ui.ui_factory.stdin = StringIO("y\ny\ny\n")
+            # determine if the repository will have been locked;
+            this_repo_locked = \
+                thisdir.open_repository().get_physical_lock_status()
             master.bzrdir.break_lock()
-            # only two ys should have been read
-            self.assertEqual("y\n", bzrlib.ui.ui_factory.stdin.read())
+            if this_repo_locked:
+                # only two ys should have been read
+                self.assertEqual("y\n", bzrlib.ui.ui_factory.stdin.read())
+            else:
+                # only one y should have been read
+                self.assertEqual("y\ny\n", bzrlib.ui.ui_factory.stdin.read())
             # we should be able to lock a newly opened branch now
             branch = master.bzrdir.open_branch()
             branch.lock_write()
             branch.unlock()
-            # we should not be able to lock the repository in thisdir as its still
-            # held by the explicit lock we took, and the break lock should not have
-            # touched it.
-            repo = thisdir.open_repository()
-            orig_default = lockdir._DEFAULT_TIMEOUT_SECONDS
-            try:
-                lockdir._DEFAULT_TIMEOUT_SECONDS = 1
-                self.assertRaises(errors.LockContention, repo.lock_write)
-            finally:
-                lockdir._DEFAULT_TIMEOUT_SECONDS = orig_default
+            if this_repo_locked:
+                # we should not be able to lock the repository in thisdir as
+                # its still held by the explicit lock we took, and the break
+                # lock should not have touched it.
+                repo = thisdir.open_repository()
+                orig_default = lockdir._DEFAULT_TIMEOUT_SECONDS
+                try:
+                    lockdir._DEFAULT_TIMEOUT_SECONDS = 1
+                    self.assertRaises(errors.LockContention, repo.lock_write)
+                finally:
+                    lockdir._DEFAULT_TIMEOUT_SECONDS = orig_default
         finally:
             unused_repo.unlock()
         self.assertRaises(errors.LockBroken, master.unlock)



More information about the bazaar-commits mailing list