954
954
self.assertEqual(set([]), index.external_references(0))
956
def test__find_ancestors(self):
959
index = self.make_index(ref_lists=1, key_elements=1, nodes=[
960
(key1, 'value', ([key2],)),
961
(key2, 'value', ([],)),
965
search_keys = index._find_ancestors([key1], 0, parent_map, missing_keys)
966
self.assertEqual({key1: (key2,)}, parent_map)
967
self.assertEqual(set(), missing_keys)
968
self.assertEqual(set([key2]), search_keys)
969
search_keys = index._find_ancestors(search_keys, 0, parent_map,
971
self.assertEqual({key1: (key2,), key2: ()}, parent_map)
972
self.assertEqual(set(), missing_keys)
973
self.assertEqual(set(), search_keys)
975
def test__find_ancestors_w_missing(self):
979
index = self.make_index(ref_lists=1, key_elements=1, nodes=[
980
(key1, 'value', ([key2],)),
981
(key2, 'value', ([],)),
985
search_keys = index._find_ancestors([key2, key3], 0, parent_map,
987
self.assertEqual({key2: ()}, parent_map)
988
self.assertEqual(set([key3]), missing_keys)
989
self.assertEqual(set(), search_keys)
991
def test__find_ancestors_dont_search_known(self):
995
index = self.make_index(ref_lists=1, key_elements=1, nodes=[
996
(key1, 'value', ([key2],)),
997
(key2, 'value', ([key3],)),
998
(key3, 'value', ([],)),
1000
# We already know about key2, so we won't try to search for key3
1001
parent_map = {key2: (key3,)}
1002
missing_keys = set()
1003
search_keys = index._find_ancestors([key1], 0, parent_map,
1005
self.assertEqual({key1: (key2,), key2: (key3,)}, parent_map)
1006
self.assertEqual(set(), missing_keys)
1007
self.assertEqual(set(), search_keys)
957
1010
class TestCombinedGraphIndex(TestCaseWithMemoryTransport):
1271
1324
['1', '2', '3'])
1272
1325
self.assertRaises(errors.NoSuchFile, index.validate)
1327
def test_find_ancestors_across_indexes(self):
1332
index1 = self.make_index('12', ref_lists=1, nodes=[
1333
(key1, 'value', ([],)),
1334
(key2, 'value', ([key1],)),
1336
index2 = self.make_index('34', ref_lists=1, nodes=[
1337
(key3, 'value', ([key2],)),
1338
(key4, 'value', ([key3],)),
1340
c_index = CombinedGraphIndex([index1, index2])
1341
parent_map, missing_keys = c_index.find_ancestry([key1], 0)
1342
self.assertEqual({key1: ()}, parent_map)
1343
self.assertEqual(set(), missing_keys)
1344
# Now look for a key from index2 which requires us to find the key in
1345
# the second index, and then continue searching for parents in the
1347
parent_map, missing_keys = c_index.find_ancestry([key3], 0)
1348
self.assertEqual({key1: (), key2: (key1,), key3: (key2,)}, parent_map)
1349
self.assertEqual(set(), missing_keys)
1351
def test_find_ancestors_missing_keys(self):
1356
index1 = self.make_index('12', ref_lists=1, nodes=[
1357
(key1, 'value', ([],)),
1358
(key2, 'value', ([key1],)),
1360
index2 = self.make_index('34', ref_lists=1, nodes=[
1361
(key3, 'value', ([key2],)),
1363
c_index = CombinedGraphIndex([index1, index2])
1364
# Searching for a key which is actually not present at all should
1365
# eventually converge
1366
parent_map, missing_keys = c_index.find_ancestry([key4], 0)
1367
self.assertEqual({}, parent_map)
1368
self.assertEqual(set([key4]), missing_keys)
1370
def test_find_ancestors_no_indexes(self):
1371
c_index = CombinedGraphIndex([])
1373
parent_map, missing_keys = c_index.find_ancestry([key1], 0)
1374
self.assertEqual({}, parent_map)
1375
self.assertEqual(set([key1]), missing_keys)
1377
def test_find_ancestors_ghost_parent(self):
1382
index1 = self.make_index('12', ref_lists=1, nodes=[
1383
(key1, 'value', ([],)),
1384
(key2, 'value', ([key1],)),
1386
index2 = self.make_index('34', ref_lists=1, nodes=[
1387
(key4, 'value', ([key2, key3],)),
1389
c_index = CombinedGraphIndex([index1, index2])
1390
# Searching for a key which is actually not present at all should
1391
# eventually converge
1392
parent_map, missing_keys = c_index.find_ancestry([key4], 0)
1393
self.assertEqual({key4: (key2, key3), key2: (key1,), key1: ()},
1395
self.assertEqual(set([key3]), missing_keys)
1397
def test__find_ancestors_empty_index(self):
1398
index = self.make_index('test', ref_lists=1, key_elements=1, nodes=[])
1400
missing_keys = set()
1401
search_keys = index._find_ancestors([('one',), ('two',)], 0, parent_map,
1403
self.assertEqual(set(), search_keys)
1404
self.assertEqual({}, parent_map)
1405
self.assertEqual(set([('one',), ('two',)]), missing_keys)
1275
1408
class TestInMemoryGraphIndex(TestCaseWithMemoryTransport):