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',
1557
'knit-ft', 'knit-delta', 'fulltext', 'knit-annotated-ft-gz',
1558
'knit-annotated-delta-gz', 'knit-ft-gz', 'knit-delta-gz'])
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],
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),
2162
2151
key = ('foo', 'bar',)
2163
2152
files.add_lines(key, (), [])
2164
2153
self.assertEqual(set([key]), set(files.keys()))
2167
class VirtualVersionedFilesTests(TestCase):
2168
"""Basic tests for the VirtualVersionedFiles implementations."""
2170
def _get_parent_map(self, keys):
2173
if k in self._parent_map:
2174
ret[k] = self._parent_map[k]
2178
TestCase.setUp(self)
2180
self._parent_map = {}
2181
self.texts = VirtualVersionedFiles(self._get_parent_map,
2184
def test_add_lines(self):
2185
self.assertRaises(NotImplementedError,
2186
self.texts.add_lines, "foo", [], [])
2188
def test_add_mpdiffs(self):
2189
self.assertRaises(NotImplementedError,
2190
self.texts.add_mpdiffs, [])
2192
def test_check(self):
2193
self.assertTrue(self.texts.check())
2195
def test_insert_record_stream(self):
2196
self.assertRaises(NotImplementedError, self.texts.insert_record_stream,
2199
def test_get_sha1s_nonexistent(self):
2200
self.assertEquals({}, self.texts.get_sha1s([("NONEXISTENT",)]))
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",)]))
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",)]))
2212
def test_get_record_stream(self):
2213
self._lines["A"] = ["FOO", "BAR"]
2214
it = self.texts.get_record_stream([("A",)], "unordered", True)
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"))
2220
def test_get_record_stream_absent(self):
2221
it = self.texts.get_record_stream([("A",)], "unordered", True)
2223
self.assertEquals("absent", record.storage_kind)
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")]),
2234
class TestOrderingVersionedFilesDecorator(TestCaseWithMemoryTransport):
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()
2247
self.addCleanup(b.unlock)
2248
vf = b.repository.inventories
2249
return versionedfile.OrderingVersionedFilesDecorator(vf, key_priority)
2251
def test_get_empty(self):
2252
vf = self.get_ordering_vf({})
2253
self.assertEqual([], vf.calls)
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',
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',
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',