~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_versionedfile.py

  • Committer: John Arbash Meinel
  • Date: 2008-07-11 21:41:24 UTC
  • mto: This revision was merged to the branch mainline in revision 3543.
  • Revision ID: john@arbash-meinel.com-20080711214124-qi09irlj7pd5cuzg
Shortcut the case when one revision is in the ancestry of the other.

At the cost of a heads() check, when one parent supersedes, we don't have to extract
the text for the other. Changes merge time from 3m37s => 3m21s. Using a
CachingParentsProvider would drop the time down to 3m11s.

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
    )
46
46
from bzrlib.symbol_versioning import one_four, one_five
47
47
from bzrlib.tests import (
48
 
    TestCase,
49
48
    TestCaseWithMemoryTransport,
50
49
    TestScenarioApplier,
51
50
    TestSkipped,
64
63
    ConstantMapper,
65
64
    HashEscapedPrefixMapper,
66
65
    PrefixMapper,
67
 
    VirtualVersionedFiles,
68
66
    make_versioned_files_factory,
69
67
    )
70
68
from bzrlib.weave import WeaveFile
503
501
        for version in multiparent.topo_iter(vf):
504
502
            mpdiff = vf.make_mpdiffs([version])[0]
505
503
            new_vf.add_mpdiffs([(version, vf.get_parent_map([version])[version],
506
 
                                 vf.get_sha1s([version])[version], mpdiff)])
 
504
                                 vf.get_sha1s([version])[0], mpdiff)])
507
505
            self.assertEqualDiff(vf.get_text(version),
508
506
                                 new_vf.get_text(version))
509
507
 
842
840
        vf.add_lines('b', ['a'], ['a\n'])
843
841
        # a file differing only in last newline.
844
842
        vf.add_lines('c', [], ['a'])
845
 
        self.assertEqual({
846
 
            'a': '3f786850e387550fdab836ed7e6dc881de23001b',
847
 
            'c': '86f7e437faa5a7fce15d1ddcb9eaeaea377667b8',
848
 
            'b': '3f786850e387550fdab836ed7e6dc881de23001b',
849
 
            },
850
 
            vf.get_sha1s(['a', 'c', 'b']))
 
843
        self.assertEqual(['3f786850e387550fdab836ed7e6dc881de23001b',
 
844
                          '86f7e437faa5a7fce15d1ddcb9eaeaea377667b8',
 
845
                          '3f786850e387550fdab836ed7e6dc881de23001b'],
 
846
                          vf.get_sha1s(['a', 'c', 'b']))
851
847
        
852
848
 
853
849
class TestWeave(TestCaseWithMemoryTransport, VersionedFileTestMixIn):
1558
1554
        """Assert that storage_kind is a valid storage_kind."""
1559
1555
        self.assertSubset([storage_kind],
1560
1556
            ['mpdiff', 'knit-annotated-ft', 'knit-annotated-delta',
1561
 
             'knit-ft', 'knit-delta', 'chunked', 'fulltext',
1562
 
             'knit-annotated-ft-gz', 'knit-annotated-delta-gz', 'knit-ft-gz',
1563
 
             'knit-delta-gz'])
 
1557
             'knit-ft', 'knit-delta', 'fulltext', 'knit-annotated-ft-gz',
 
1558
             'knit-annotated-delta-gz', 'knit-ft-gz', 'knit-delta-gz'])
1564
1559
 
1565
1560
    def capture_stream(self, f, entries, on_seen, parents):
1566
1561
        """Capture a stream for testing."""
1567
1562
        for factory in entries:
1568
1563
            on_seen(factory.key)
1569
1564
            self.assertValidStorageKind(factory.storage_kind)
1570
 
            self.assertEqual(f.get_sha1s([factory.key])[factory.key],
1571
 
                factory.sha1)
 
1565
            self.assertEqual(f.get_sha1s([factory.key])[0], factory.sha1)
1572
1566
            self.assertEqual(parents[factory.key], factory.parents)
1573
1567
            self.assertIsInstance(factory.get_bytes_as(factory.storage_kind),
1574
1568
                str)
1633
1627
        for factory in entries:
1634
1628
            seen.append(factory.key)
1635
1629
            self.assertValidStorageKind(factory.storage_kind)
1636
 
            self.assertSubset([factory.sha1],
1637
 
                [None, files.get_sha1s([factory.key])[factory.key]])
 
1630
            self.assertSubset([factory.sha1], [None, files.get_sha1s([factory.key])[0]])
1638
1631
            self.assertEqual(parent_map[factory.key], factory.parents)
1639
1632
            # self.assertEqual(files.get_text(factory.key),
1640
 
            ft_bytes = factory.get_bytes_as('fulltext')
1641
 
            self.assertIsInstance(ft_bytes, str)
1642
 
            chunked_bytes = factory.get_bytes_as('chunked')
1643
 
            self.assertEqualDiff(ft_bytes, ''.join(chunked_bytes))
1644
 
 
 
1633
            self.assertIsInstance(factory.get_bytes_as('fulltext'), str)
 
1634
            self.assertIsInstance(factory.get_bytes_as(factory.storage_kind),
 
1635
                str)
1645
1636
        self.assertStreamOrder(sort_order, seen, keys)
1646
1637
 
1647
1638
    def assertStreamOrder(self, sort_order, seen, keys):
1680
1671
        for factory in entries:
1681
1672
            seen.add(factory.key)
1682
1673
            self.assertValidStorageKind(factory.storage_kind)
1683
 
            self.assertEqual(files.get_sha1s([factory.key])[factory.key],
1684
 
                factory.sha1)
 
1674
            self.assertEqual(files.get_sha1s([factory.key])[0], factory.sha1)
1685
1675
            self.assertEqual(parent_map[factory.key], factory.parents)
1686
1676
            # currently no stream emits mpdiff
1687
1677
            self.assertRaises(errors.UnavailableRepresentation,
1720
1710
                self.assertEqual(None, factory.parents)
1721
1711
            else:
1722
1712
                self.assertValidStorageKind(factory.storage_kind)
1723
 
                self.assertEqual(files.get_sha1s([factory.key])[factory.key],
1724
 
                    factory.sha1)
 
1713
                self.assertEqual(files.get_sha1s([factory.key])[0], factory.sha1)
1725
1714
                self.assertEqual(parents[factory.key], factory.parents)
1726
1715
                self.assertIsInstance(factory.get_bytes_as(factory.storage_kind),
1727
1716
                    str)
1809
1798
                ('FileA', 'base'), ('FileB', 'origin'), ('FileA', 'left'),
1810
1799
                ('FileA', 'merged'), ('FileB', 'right'),
1811
1800
                ]
1812
 
        self.assertEqual({
1813
 
            keys[0]: '51c64a6f4fc375daf0d24aafbabe4d91b6f4bb44',
1814
 
            keys[1]: '00e364d235126be43292ab09cb4686cf703ddc17',
1815
 
            keys[2]: 'a8478686da38e370e32e42e8a0c220e33ee9132f',
1816
 
            keys[3]: 'ed8bce375198ea62444dc71952b22cfc2b09226d',
1817
 
            keys[4]: '9ef09dfa9d86780bdec9219a22560c6ece8e0ef1',
1818
 
            },
 
1801
        self.assertEqual([
 
1802
            '51c64a6f4fc375daf0d24aafbabe4d91b6f4bb44',
 
1803
            '00e364d235126be43292ab09cb4686cf703ddc17',
 
1804
            'a8478686da38e370e32e42e8a0c220e33ee9132f',
 
1805
            'ed8bce375198ea62444dc71952b22cfc2b09226d',
 
1806
            '9ef09dfa9d86780bdec9219a22560c6ece8e0ef1',
 
1807
            ],
1819
1808
            files.get_sha1s(keys))
1820
1809
        
1821
1810
    def test_insert_record_stream_empty(self):
2143
2132
            mpdiff = files.make_mpdiffs([key])[0]
2144
2133
            parents = files.get_parent_map([key])[key] or []
2145
2134
            target.add_mpdiffs(
2146
 
                [(key, parents, files.get_sha1s([key])[key], mpdiff)])
 
2135
                [(key, parents, files.get_sha1s([key])[0], mpdiff)])
2147
2136
            self.assertEqualDiff(
2148
2137
                files.get_record_stream([key], 'unordered',
2149
2138
                    True).next().get_bytes_as('fulltext'),
2162
2151
            key = ('foo', 'bar',)
2163
2152
        files.add_lines(key, (), [])
2164
2153
        self.assertEqual(set([key]), set(files.keys()))
2165
 
 
2166
 
 
2167
 
class VirtualVersionedFilesTests(TestCase):
2168
 
    """Basic tests for the VirtualVersionedFiles implementations."""
2169
 
 
2170
 
    def _get_parent_map(self, keys):
2171
 
        ret = {}
2172
 
        for k in keys:
2173
 
            if k in self._parent_map:
2174
 
                ret[k] = self._parent_map[k]
2175
 
        return ret
2176
 
 
2177
 
    def setUp(self):
2178
 
        TestCase.setUp(self)
2179
 
        self._lines = {}
2180
 
        self._parent_map = {}
2181
 
        self.texts = VirtualVersionedFiles(self._get_parent_map, 
2182
 
                                           self._lines.get)
2183
 
 
2184
 
    def test_add_lines(self):
2185
 
        self.assertRaises(NotImplementedError, 
2186
 
                self.texts.add_lines, "foo", [], [])
2187
 
 
2188
 
    def test_add_mpdiffs(self):
2189
 
        self.assertRaises(NotImplementedError, 
2190
 
                self.texts.add_mpdiffs, [])
2191
 
 
2192
 
    def test_check(self):
2193
 
        self.assertTrue(self.texts.check())
2194
 
 
2195
 
    def test_insert_record_stream(self):
2196
 
        self.assertRaises(NotImplementedError, self.texts.insert_record_stream,
2197
 
                          [])
2198
 
 
2199
 
    def test_get_sha1s_nonexistent(self):
2200
 
        self.assertEquals({}, self.texts.get_sha1s([("NONEXISTENT",)]))
2201
 
 
2202
 
    def test_get_sha1s(self):
2203
 
        self._lines["key"] = ["dataline1", "dataline2"]
2204
 
        self.assertEquals({("key",): osutils.sha_strings(self._lines["key"])},
2205
 
                           self.texts.get_sha1s([("key",)]))
2206
 
 
2207
 
    def test_get_parent_map(self):
2208
 
        self._parent_map = {"G": ("A", "B")}
2209
 
        self.assertEquals({("G",): (("A",),("B",))}, 
2210
 
                          self.texts.get_parent_map([("G",), ("L",)]))
2211
 
 
2212
 
    def test_get_record_stream(self):
2213
 
        self._lines["A"] = ["FOO", "BAR"]
2214
 
        it = self.texts.get_record_stream([("A",)], "unordered", True)
2215
 
        record = it.next()
2216
 
        self.assertEquals("chunked", record.storage_kind)
2217
 
        self.assertEquals("FOOBAR", record.get_bytes_as("fulltext"))
2218
 
        self.assertEquals(["FOO", "BAR"], record.get_bytes_as("chunked"))
2219
 
 
2220
 
    def test_get_record_stream_absent(self):
2221
 
        it = self.texts.get_record_stream([("A",)], "unordered", True)
2222
 
        record = it.next()
2223
 
        self.assertEquals("absent", record.storage_kind)
2224
 
 
2225
 
    def test_iter_lines_added_or_present_in_keys(self):
2226
 
        self._lines["A"] = ["FOO", "BAR"]
2227
 
        self._lines["B"] = ["HEY"]
2228
 
        self._lines["C"] = ["Alberta"]
2229
 
        it = self.texts.iter_lines_added_or_present_in_keys([("A",), ("B",)])
2230
 
        self.assertEquals(sorted([("FOO", "A"), ("BAR", "A"), ("HEY", "B")]), 
2231
 
            sorted(list(it)))
2232
 
 
2233
 
 
2234
 
class TestOrderingVersionedFilesDecorator(TestCaseWithMemoryTransport):
2235
 
 
2236
 
    def get_ordering_vf(self, key_priority):
2237
 
        builder = self.make_branch_builder('test')
2238
 
        builder.start_series()
2239
 
        builder.build_snapshot('A', None, [
2240
 
            ('add', ('', 'TREE_ROOT', 'directory', None))])
2241
 
        builder.build_snapshot('B', ['A'], [])
2242
 
        builder.build_snapshot('C', ['B'], [])
2243
 
        builder.build_snapshot('D', ['C'], [])
2244
 
        builder.finish_series()
2245
 
        b = builder.get_branch()
2246
 
        b.lock_read()
2247
 
        self.addCleanup(b.unlock)
2248
 
        vf = b.repository.inventories
2249
 
        return versionedfile.OrderingVersionedFilesDecorator(vf, key_priority)
2250
 
 
2251
 
    def test_get_empty(self):
2252
 
        vf = self.get_ordering_vf({})
2253
 
        self.assertEqual([], vf.calls)
2254
 
 
2255
 
    def test_get_record_stream_topological(self):
2256
 
        vf = self.get_ordering_vf({('A',): 3, ('B',): 2, ('C',): 4, ('D',): 1})
2257
 
        request_keys = [('B',), ('C',), ('D',), ('A',)]
2258
 
        keys = [r.key for r in vf.get_record_stream(request_keys,
2259
 
                                    'topological', False)]
2260
 
        # We should have gotten the keys in topological order
2261
 
        self.assertEqual([('A',), ('B',), ('C',), ('D',)], keys)
2262
 
        # And recorded that the request was made
2263
 
        self.assertEqual([('get_record_stream', request_keys, 'topological',
2264
 
                           False)], vf.calls)
2265
 
 
2266
 
    def test_get_record_stream_ordered(self):
2267
 
        vf = self.get_ordering_vf({('A',): 3, ('B',): 2, ('C',): 4, ('D',): 1})
2268
 
        request_keys = [('B',), ('C',), ('D',), ('A',)]
2269
 
        keys = [r.key for r in vf.get_record_stream(request_keys,
2270
 
                                   'unordered', False)]
2271
 
        # They should be returned based on their priority
2272
 
        self.assertEqual([('D',), ('B',), ('A',), ('C',)], keys)
2273
 
        # And the request recorded
2274
 
        self.assertEqual([('get_record_stream', request_keys, 'unordered',
2275
 
                           False)], vf.calls)
2276
 
 
2277
 
    def test_get_record_stream_implicit_order(self):
2278
 
        vf = self.get_ordering_vf({('B',): 2, ('D',): 1})
2279
 
        request_keys = [('B',), ('C',), ('D',), ('A',)]
2280
 
        keys = [r.key for r in vf.get_record_stream(request_keys,
2281
 
                                   'unordered', False)]
2282
 
        # A and C are not in the map, so they get sorted to the front. A comes
2283
 
        # before C alphabetically, so it comes back first
2284
 
        self.assertEqual([('A',), ('C',), ('D',), ('B',)], keys)
2285
 
        # And the request recorded
2286
 
        self.assertEqual([('get_record_stream', request_keys, 'unordered',
2287
 
                           False)], vf.calls)