150
145
'support_partial_insertion': True,
153
for test in iter_suite_tests(to_adapt):
154
result.addTests(len_one_adapter.adapt(test))
155
result.addTests(len_two_adapter.adapt(test))
148
scenarios = len_one_scenarios + len_two_scenarios
149
return multiply_tests(to_adapt, scenarios, result)
159
152
def get_diamond_vf(f, trailing_eol=True, left_only=False):
160
153
"""Get a diamond graph to exercise deltas and merges.
162
155
:param trailing_eol: If True end the last line with \n.
217
214
result = [prefix + suffix for suffix in suffix_list]
219
221
# we loop over each key because that spreads the inserts across prefixes,
220
222
# which is how commit operates.
221
223
for prefix in prefixes:
222
result.append(files.add_lines(prefix + ('origin',), (),
224
result.append(files.add_lines(prefix + get_key('origin'), (),
223
225
['origin' + last_char]))
224
226
for prefix in prefixes:
225
result.append(files.add_lines(prefix + ('base',),
227
result.append(files.add_lines(prefix + get_key('base'),
226
228
get_parents([('origin',)]), ['base' + last_char]))
227
229
for prefix in prefixes:
228
result.append(files.add_lines(prefix + ('left',),
230
result.append(files.add_lines(prefix + get_key('left'),
229
231
get_parents([('base',)]),
230
232
['base\n', 'left' + last_char]))
231
233
if not left_only:
232
234
for prefix in prefixes:
233
result.append(files.add_lines(prefix + ('right',),
235
result.append(files.add_lines(prefix + get_key('right'),
234
236
get_parents([('base',)]),
235
237
['base\n', 'right' + last_char]))
236
238
for prefix in prefixes:
237
result.append(files.add_lines(prefix + ('merged',),
239
result.append(files.add_lines(prefix + get_key('merged'),
238
240
get_parents([('left',), ('right',)]),
239
241
['base\n', 'left\n', 'right\n', 'merged' + last_char]))
751
753
self.assertEqual(expected, progress.updates)
753
755
lines = iter_with_versions(['child', 'otherchild'],
754
[('Walking content.', 0, 2),
755
('Walking content.', 1, 2),
756
('Walking content.', 2, 2)])
756
[('Walking content', 0, 2),
757
('Walking content', 1, 2),
758
('Walking content', 2, 2)])
757
759
# we must see child and otherchild
758
760
self.assertTrue(lines[('child\n', 'child')] > 0)
759
761
self.assertTrue(lines[('otherchild\n', 'otherchild')] > 0)
760
762
# we dont care if we got more than that.
763
lines = iter_with_versions(None, [('Walking content.', 0, 5),
764
('Walking content.', 1, 5),
765
('Walking content.', 2, 5),
766
('Walking content.', 3, 5),
767
('Walking content.', 4, 5),
768
('Walking content.', 5, 5)])
765
lines = iter_with_versions(None, [('Walking content', 0, 5),
766
('Walking content', 1, 5),
767
('Walking content', 2, 5),
768
('Walking content', 3, 5),
769
('Walking content', 4, 5),
770
('Walking content', 5, 5)])
769
771
# all lines must be seen at least once
770
772
self.assertTrue(lines[('base\n', 'base')] > 0)
771
773
self.assertTrue(lines[('lancestor\n', 'lancestor')] > 0)
1065
1067
self.doMerge(['aaa'],
1067
1069
['yyy', 'zzz'],
1068
['<<<<<<< ', 'xxx', '=======', 'yyy', 'zzz',
1070
['<<<<<<< ', 'xxx', '=======', 'yyy', 'zzz',
1071
1073
def testNonClashInsert1(self):
1072
1074
self.doMerge(['aaa'],
1073
1075
['xxx', 'aaa'],
1074
1076
['yyy', 'zzz'],
1075
['<<<<<<< ', 'xxx', 'aaa', '=======', 'yyy', 'zzz',
1077
['<<<<<<< ', 'xxx', 'aaa', '=======', 'yyy', 'zzz',
1078
1080
def testNonClashInsert2(self):
1493
1495
"""Each parameterised test can be constructed on a transport."""
1494
1496
files = self.get_versionedfiles()
1496
def get_diamond_files(self, files, trailing_eol=True, left_only=False):
1498
def get_diamond_files(self, files, trailing_eol=True, left_only=False,
1497
1500
return get_diamond_files(files, self.key_length,
1498
1501
trailing_eol=trailing_eol, nograph=not self.graph,
1499
left_only=left_only)
1502
left_only=left_only, nokeys=nokeys)
1504
def test_add_lines_nostoresha(self):
1505
"""When nostore_sha is supplied using old content raises."""
1506
vf = self.get_versionedfiles()
1507
empty_text = ('a', [])
1508
sample_text_nl = ('b', ["foo\n", "bar\n"])
1509
sample_text_no_nl = ('c', ["foo\n", "bar"])
1511
for version, lines in (empty_text, sample_text_nl, sample_text_no_nl):
1512
sha, _, _ = vf.add_lines(self.get_simple_key(version), [], lines)
1514
# we now have a copy of all the lines in the vf.
1515
for sha, (version, lines) in zip(
1516
shas, (empty_text, sample_text_nl, sample_text_no_nl)):
1517
new_key = self.get_simple_key(version + "2")
1518
self.assertRaises(errors.ExistingContent,
1519
vf.add_lines, new_key, [], lines,
1521
# and no new version should have been added.
1522
record = vf.get_record_stream([new_key], 'unordered', True).next()
1523
self.assertEqual('absent', record.storage_kind)
1501
1525
def test_add_lines_return(self):
1502
1526
files = self.get_versionedfiles()
1529
1553
('ed8bce375198ea62444dc71952b22cfc2b09226d', 23)],
1556
def test_add_lines_no_key_generates_chk_key(self):
1557
files = self.get_versionedfiles()
1558
# save code by using the stock data insertion helper.
1559
adds = self.get_diamond_files(files, nokeys=True)
1561
# We can only validate the first 2 elements returned from add_lines.
1563
self.assertEqual(3, len(add))
1564
results.append(add[:2])
1565
if self.key_length == 1:
1567
('00e364d235126be43292ab09cb4686cf703ddc17', 7),
1568
('51c64a6f4fc375daf0d24aafbabe4d91b6f4bb44', 5),
1569
('a8478686da38e370e32e42e8a0c220e33ee9132f', 10),
1570
('9ef09dfa9d86780bdec9219a22560c6ece8e0ef1', 11),
1571
('ed8bce375198ea62444dc71952b22cfc2b09226d', 23)],
1573
# Check the added items got CHK keys.
1574
self.assertEqual(set([
1575
('sha1:00e364d235126be43292ab09cb4686cf703ddc17',),
1576
('sha1:51c64a6f4fc375daf0d24aafbabe4d91b6f4bb44',),
1577
('sha1:9ef09dfa9d86780bdec9219a22560c6ece8e0ef1',),
1578
('sha1:a8478686da38e370e32e42e8a0c220e33ee9132f',),
1579
('sha1:ed8bce375198ea62444dc71952b22cfc2b09226d',),
1582
elif self.key_length == 2:
1584
('00e364d235126be43292ab09cb4686cf703ddc17', 7),
1585
('00e364d235126be43292ab09cb4686cf703ddc17', 7),
1586
('51c64a6f4fc375daf0d24aafbabe4d91b6f4bb44', 5),
1587
('51c64a6f4fc375daf0d24aafbabe4d91b6f4bb44', 5),
1588
('a8478686da38e370e32e42e8a0c220e33ee9132f', 10),
1589
('a8478686da38e370e32e42e8a0c220e33ee9132f', 10),
1590
('9ef09dfa9d86780bdec9219a22560c6ece8e0ef1', 11),
1591
('9ef09dfa9d86780bdec9219a22560c6ece8e0ef1', 11),
1592
('ed8bce375198ea62444dc71952b22cfc2b09226d', 23),
1593
('ed8bce375198ea62444dc71952b22cfc2b09226d', 23)],
1595
# Check the added items got CHK keys.
1596
self.assertEqual(set([
1597
('FileA', 'sha1:00e364d235126be43292ab09cb4686cf703ddc17'),
1598
('FileA', 'sha1:51c64a6f4fc375daf0d24aafbabe4d91b6f4bb44'),
1599
('FileA', 'sha1:9ef09dfa9d86780bdec9219a22560c6ece8e0ef1'),
1600
('FileA', 'sha1:a8478686da38e370e32e42e8a0c220e33ee9132f'),
1601
('FileA', 'sha1:ed8bce375198ea62444dc71952b22cfc2b09226d'),
1602
('FileB', 'sha1:00e364d235126be43292ab09cb4686cf703ddc17'),
1603
('FileB', 'sha1:51c64a6f4fc375daf0d24aafbabe4d91b6f4bb44'),
1604
('FileB', 'sha1:9ef09dfa9d86780bdec9219a22560c6ece8e0ef1'),
1605
('FileB', 'sha1:a8478686da38e370e32e42e8a0c220e33ee9132f'),
1606
('FileB', 'sha1:ed8bce375198ea62444dc71952b22cfc2b09226d'),
1532
1610
def test_empty_lines(self):
1533
1611
"""Empty files can be stored."""
1534
1612
f = self.get_versionedfiles()
1621
1700
return keys, sort_order
1702
def get_keys_and_groupcompress_sort_order(self):
1703
"""Get diamond test keys list, and their groupcompress sort ordering."""
1704
if self.key_length == 1:
1705
keys = [('merged',), ('left',), ('right',), ('base',)]
1706
sort_order = {('merged',):0, ('left',):1, ('right',):1, ('base',):2}
1709
('FileA', 'merged'), ('FileA', 'left'), ('FileA', 'right'),
1711
('FileB', 'merged'), ('FileB', 'left'), ('FileB', 'right'),
1715
('FileA', 'merged'):0, ('FileA', 'left'):1, ('FileA', 'right'):1,
1716
('FileA', 'base'):2,
1717
('FileB', 'merged'):3, ('FileB', 'left'):4, ('FileB', 'right'):4,
1718
('FileB', 'base'):5,
1720
return keys, sort_order
1623
1722
def test_get_record_stream_interface_ordered(self):
1624
1723
"""each item in a stream has to provide a regular interface."""
1625
1724
files = self.get_versionedfiles()
1654
1753
self.assertStreamOrder(sort_order, seen, keys)
1755
def test_get_record_stream_interface_groupcompress(self):
1756
"""each item in a stream has to provide a regular interface."""
1757
files = self.get_versionedfiles()
1758
self.get_diamond_files(files)
1759
keys, sort_order = self.get_keys_and_groupcompress_sort_order()
1760
parent_map = files.get_parent_map(keys)
1761
entries = files.get_record_stream(keys, 'groupcompress', False)
1763
self.capture_stream(files, entries, seen.append, parent_map)
1764
self.assertStreamOrder(sort_order, seen, keys)
1656
1766
def assertStreamOrder(self, sort_order, seen, keys):
1657
1767
self.assertEqual(len(set(seen)), len(keys))
1658
1768
if self.key_length == 1:
2258
2370
lines = iter_with_keys(
2259
2371
[self.get_simple_key('child'), self.get_simple_key('otherchild')],
2260
[('Walking content.', 0, 2),
2261
('Walking content.', 1, 2),
2262
('Walking content.', 2, 2)])
2372
[('Walking content', 0, 2),
2373
('Walking content', 1, 2),
2374
('Walking content', 2, 2)])
2263
2375
# we must see child and otherchild
2264
2376
self.assertTrue(lines[('child\n', self.get_simple_key('child'))] > 0)
2265
2377
self.assertTrue(
2266
2378
lines[('otherchild\n', self.get_simple_key('otherchild'))] > 0)
2267
2379
# we dont care if we got more than that.
2269
2381
# test all lines
2270
2382
lines = iter_with_keys(files.keys(),
2271
[('Walking content.', 0, 5),
2272
('Walking content.', 1, 5),
2273
('Walking content.', 2, 5),
2274
('Walking content.', 3, 5),
2275
('Walking content.', 4, 5),
2276
('Walking content.', 5, 5)])
2383
[('Walking content', 0, 5),
2384
('Walking content', 1, 5),
2385
('Walking content', 2, 5),
2386
('Walking content', 3, 5),
2387
('Walking content', 4, 5),
2388
('Walking content', 5, 5)])
2277
2389
# all lines must be seen at least once
2278
2390
self.assertTrue(lines[('base\n', self.get_simple_key('base'))] > 0)
2279
2391
self.assertTrue(
2404
2516
TestCase.setUp(self)
2405
2517
self._lines = {}
2406
2518
self._parent_map = {}
2407
self.texts = VirtualVersionedFiles(self._get_parent_map,
2519
self.texts = VirtualVersionedFiles(self._get_parent_map,
2408
2520
self._lines.get)
2410
2522
def test_add_lines(self):
2411
self.assertRaises(NotImplementedError,
2523
self.assertRaises(NotImplementedError,
2412
2524
self.texts.add_lines, "foo", [], [])
2414
2526
def test_add_mpdiffs(self):
2415
self.assertRaises(NotImplementedError,
2527
self.assertRaises(NotImplementedError,
2416
2528
self.texts.add_mpdiffs, [])
2418
2530
def test_check(self):
2433
2545
def test_get_parent_map(self):
2434
2546
self._parent_map = {"G": ("A", "B")}
2435
self.assertEquals({("G",): (("A",),("B",))},
2547
self.assertEquals({("G",): (("A",),("B",))},
2436
2548
self.texts.get_parent_map([("G",), ("L",)]))
2438
2550
def test_get_record_stream(self):
2453
2565
self._lines["B"] = ["HEY"]
2454
2566
self._lines["C"] = ["Alberta"]
2455
2567
it = self.texts.iter_lines_added_or_present_in_keys([("A",), ("B",)])
2456
self.assertEquals(sorted([("FOO", "A"), ("BAR", "A"), ("HEY", "B")]),
2568
self.assertEquals(sorted([("FOO", "A"), ("BAR", "A"), ("HEY", "B")]),
2457
2569
sorted(list(it)))