Rev 4539: Lots of tests which expose bug #393366 and bug #399884 in http://bazaar.launchpad.net/~jameinel/bzr/1.18-stack-and-annotate-393366

John Arbash Meinel john at arbash-meinel.com
Wed Jul 15 19:22:43 BST 2009


At http://bazaar.launchpad.net/~jameinel/bzr/1.18-stack-and-annotate-393366

------------------------------------------------------------
revno: 4539
revision-id: john at arbash-meinel.com-20090715182238-qvq1klzj1o2tpkcq
parent: john at arbash-meinel.com-20090715175140-qlawjpy5w97ulg8j
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 1.18-stack-and-annotate-393366
timestamp: Wed 2009-07-15 13:22:38 -0500
message:
  Lots of tests which expose bug #393366 and bug #399884
-------------- next part --------------
=== modified file 'bzrlib/tests/per_repository_reference/test_get_record_stream.py'
--- a/bzrlib/tests/per_repository_reference/test_get_record_stream.py	2009-07-15 17:51:40 +0000
+++ b/bzrlib/tests/per_repository_reference/test_get_record_stream.py	2009-07-15 18:22:38 +0000
@@ -16,7 +16,10 @@
 
 """Tests that get_record_stream() behaves itself properly when stacked."""
 
-from bzrlib import errors
+from bzrlib import (
+    errors,
+    knit,
+    )
 from bzrlib.tests.per_repository_reference import (
     TestCaseWithExternalReferenceRepository,
     )
@@ -81,22 +84,118 @@
         self.base_repo = self.make_repository('base')
         self.stacked_repo = self.make_referring('referring', 'base')
 
-    def make_stacked_hold_f(self):
+    def make_simple_split(self):
         """Set up the repositories so that everything is in base except F"""
         self.base_repo.fetch(self.all_repo, revision_id='G')
         self.stacked_repo.fetch(self.all_repo, revision_id='F')
 
-    def test_unordered_fetch(self):
-        self.make_stacked_hold_f()
-        keys = [('f-id', r) for r in ['A', 'B', 'C', 'D', 'F']]
-        self.stacked_repo.lock_read()
-        self.addCleanup(self.stacked_repo.unlock)
-        stream = self.stacked_repo.texts.get_record_stream(
-            keys, 'unordered', False)
-        record_keys = set()
-        for record in stream:
-            if record.storage_kind == 'absent':
-                raise ValueError('absent record: %s' % (record.key,))
-            record_keys.add(record.key)
-        # everything should be present, we don't care about the order
-        self.assertEqual(keys, sorted(record_keys))
+    def make_complex_split(self):
+        """intermix the revisions so that base holds left stacked holds right.
+
+        base will hold
+            A B D F (and C because it is a parent of D)
+        referring will hold
+            C E G (only)
+        """
+        self.base_repo.fetch(self.all_repo, revision_id='B')
+        self.stacked_repo.fetch(self.all_repo, revision_id='C')
+        self.base_repo.fetch(self.all_repo, revision_id='F')
+        self.stacked_repo.fetch(self.all_repo, revision_id='G')
+
+    def test_unordered_fetch_simple_split(self):
+        self.make_simple_split()
+        keys = [('f-id', r) for r in 'ABCDF']
+        self.stacked_repo.lock_read()
+        self.addCleanup(self.stacked_repo.unlock)
+        stream = self.stacked_repo.texts.get_record_stream(
+            keys, 'unordered', False)
+        record_keys = set()
+        for record in stream:
+            if record.storage_kind == 'absent':
+                raise ValueError('absent record: %s' % (record.key,))
+            record_keys.add(record.key)
+        # everything should be present, we don't care about the order
+        self.assertEqual(keys, sorted(record_keys))
+
+    def test_unordered_fetch_complex_split(self):
+        self.make_complex_split()
+        keys = [('f-id', r) for r in 'ABCDEG']
+        self.stacked_repo.lock_read()
+        self.addCleanup(self.stacked_repo.unlock)
+        stream = self.stacked_repo.texts.get_record_stream(
+            keys, 'unordered', False)
+        record_keys = set()
+        for record in stream:
+            if record.storage_kind == 'absent':
+                raise ValueError('absent record: %s' % (record.key,))
+            record_keys.add(record.key)
+        # everything should be present, we don't care about the order
+        self.assertEqual(keys, sorted(record_keys))
+
+    def test_ordered_no_closure(self):
+        self.make_complex_split()
+        # Topological ordering allows B & C and D & E to be returned with
+        # either one first, so the required ordering is:
+        # [A (B C) (D E) G]
+        keys = [('f-id', r) for r in 'ABCDEG']
+        alt_1 = [('f-id', r) for r in 'ACBDEG']
+        alt_2 = [('f-id', r) for r in 'ABCEDG']
+        alt_3 = [('f-id', r) for r in 'ACBEDG']
+        self.stacked_repo.lock_read()
+        self.addCleanup(self.stacked_repo.unlock)
+        stream = self.stacked_repo.texts.get_record_stream(
+            keys, 'topological', False)
+        record_keys = []
+        for record in stream:
+            if record.storage_kind == 'absent':
+                raise ValueError('absent record: %s' % (record.key,))
+            record_keys.append(record.key)
+        self.assertTrue(record_keys in (keys, alt_1, alt_2, alt_3))
+
+    def test_ordered_fulltext_simple(self):
+        self.make_simple_split()
+        # This is a common case in asking to annotate a file that exists on a
+        # stacked branch.
+        # See https://bugs.launchpad.net/bzr/+bug/393366
+        # Topological ordering allows B & C and D & E to be returned with
+        # either one first, so the required ordering is:
+        # [A (B C) D F]
+        keys = [('f-id', r) for r in 'ABCDF']
+        alt_1 = [('f-id', r) for r in 'ACBDF']
+        self.stacked_repo.lock_read()
+        self.addCleanup(self.stacked_repo.unlock)
+        stream = self.stacked_repo.texts.get_record_stream(
+            keys, 'topological', True)
+        record_keys = []
+        for record in stream:
+            if record.storage_kind == 'absent':
+                raise ValueError('absent record: %s' % (record.key,))
+            record_keys.append(record.key)
+        self.assertTrue(record_keys in (keys, alt_1))
+
+    def test_ordered_fulltext_complex(self):
+        self.make_complex_split()
+        # Topological ordering allows B & C and D & E to be returned with
+        # either one first, so the required ordering is:
+        # [A (B C) (D E) G]
+        keys = [('f-id', r) for r in 'ABCDEG']
+        alt_1 = [('f-id', r) for r in 'ACBDEG']
+        alt_2 = [('f-id', r) for r in 'ABCEDG']
+        alt_3 = [('f-id', r) for r in 'ACBEDG']
+        self.stacked_repo.lock_read()
+        self.addCleanup(self.stacked_repo.unlock)
+        stream = self.stacked_repo.texts.get_record_stream(
+            keys, 'topological', True)
+        record_keys = []
+        for record in stream:
+            if record.storage_kind == 'absent':
+                raise ValueError('absent record: %s' % (record.key,))
+            record_keys.append(record.key)
+        # Note that currently --2a format repositories do this correctly, but
+        # KnitPack format repositories do not.
+        if isinstance(self.stacked_repo.texts, knit.KnitVersionedFiles):
+            # See https://bugs.launchpad.net/bzr/+bug/399884
+            self.expectFailure('KVF does not weave fulltexts from fallback'
+                ' repositories to preserve perfect order',
+                self.assertTrue, record_keys in (keys, alt_1, alt_2, alt_3))
+        self.assertTrue(record_keys in (keys, alt_1, alt_2, alt_3))



More information about the bazaar-commits mailing list