266
306
def test_add_node_bad_key(self):
267
builder = GraphIndexBuilder()
307
builder = _mod_index.GraphIndexBuilder()
268
308
for bad_char in '\t\n\x0b\x0c\r\x00 ':
269
self.assertRaises(errors.BadIndexKey, builder.add_node,
309
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
270
310
('a%skey' % bad_char, ), 'data')
271
self.assertRaises(errors.BadIndexKey, builder.add_node,
311
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
273
self.assertRaises(errors.BadIndexKey, builder.add_node,
313
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
274
314
'not-a-tuple', 'data')
275
315
# not enough length
276
self.assertRaises(errors.BadIndexKey, builder.add_node,
316
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
279
self.assertRaises(errors.BadIndexKey, builder.add_node,
319
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
280
320
('primary', 'secondary'), 'data')
281
321
# secondary key elements get checked too:
282
builder = GraphIndexBuilder(key_elements=2)
322
builder = _mod_index.GraphIndexBuilder(key_elements=2)
283
323
for bad_char in '\t\n\x0b\x0c\r\x00 ':
284
self.assertRaises(errors.BadIndexKey, builder.add_node,
324
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
285
325
('prefix', 'a%skey' % bad_char), 'data')
287
327
def test_add_node_bad_data(self):
288
builder = GraphIndexBuilder()
289
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
328
builder = _mod_index.GraphIndexBuilder()
329
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
291
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
331
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
294
334
def test_add_node_bad_mismatched_ref_lists_length(self):
295
builder = GraphIndexBuilder()
296
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
335
builder = _mod_index.GraphIndexBuilder()
336
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
297
337
'data aa', ([], ))
298
builder = GraphIndexBuilder(reference_lists=1)
299
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
338
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
339
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
301
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
341
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
303
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
343
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
304
344
'data aa', ([], []))
305
builder = GraphIndexBuilder(reference_lists=2)
306
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
345
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
346
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
308
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
348
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
309
349
'data aa', ([], ))
310
self.assertRaises(errors.BadIndexValue, builder.add_node, ('akey', ),
350
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
311
351
'data aa', ([], [], []))
313
353
def test_add_node_bad_key_in_reference_lists(self):
314
354
# first list, first key - trivial
315
builder = GraphIndexBuilder(reference_lists=1)
316
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ),
355
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
356
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
317
357
'data aa', ([('a key', )], ))
318
358
# references keys must be tuples too
319
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ),
359
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
320
360
'data aa', (['not-a-tuple'], ))
321
361
# not enough length
322
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ),
362
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
323
363
'data aa', ([()], ))
325
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ),
365
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
326
366
'data aa', ([('primary', 'secondary')], ))
327
367
# need to check more than the first key in the list
328
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ),
368
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
329
369
'data aa', ([('agoodkey', ), ('that is a bad key', )], ))
330
370
# and if there is more than one list it should be getting checked
332
builder = GraphIndexBuilder(reference_lists=2)
333
self.assertRaises(errors.BadIndexKey, builder.add_node, ('akey', ),
372
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
373
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
334
374
'data aa', ([], ['a bad key']))
336
376
def test_add_duplicate_key(self):
337
builder = GraphIndexBuilder()
377
builder = _mod_index.GraphIndexBuilder()
338
378
builder.add_node(('key', ), 'data')
339
self.assertRaises(errors.BadIndexDuplicateKey, builder.add_node, ('key', ),
379
self.assertRaises(_mod_index.BadIndexDuplicateKey,
380
builder.add_node, ('key', ), 'data')
342
382
def test_add_duplicate_key_2_elements(self):
343
builder = GraphIndexBuilder(key_elements=2)
383
builder = _mod_index.GraphIndexBuilder(key_elements=2)
344
384
builder.add_node(('key', 'key'), 'data')
345
self.assertRaises(errors.BadIndexDuplicateKey, builder.add_node,
385
self.assertRaises(_mod_index.BadIndexDuplicateKey, builder.add_node,
346
386
('key', 'key'), 'data')
348
388
def test_add_key_after_referencing_key(self):
349
builder = GraphIndexBuilder(reference_lists=1)
389
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
350
390
builder.add_node(('key', ), 'data', ([('reference', )], ))
351
391
builder.add_node(('reference', ), 'data', ([],))
353
393
def test_add_key_after_referencing_key_2_elements(self):
354
builder = GraphIndexBuilder(reference_lists=1, key_elements=2)
394
builder = _mod_index.GraphIndexBuilder(reference_lists=1, key_elements=2)
355
395
builder.add_node(('k', 'ey'), 'data', ([('reference', 'tokey')], ))
356
396
builder.add_node(('reference', 'tokey'), 'data', ([],))
358
398
def test_set_optimize(self):
359
builder = GraphIndexBuilder(reference_lists=1, key_elements=2)
399
builder = _mod_index.GraphIndexBuilder(reference_lists=1, key_elements=2)
360
400
builder.set_optimize(for_size=True)
361
401
self.assertTrue(builder._optimize_for_size)
362
402
builder.set_optimize(for_size=False)
363
403
self.assertFalse(builder._optimize_for_size)
366
class TestGraphIndex(TestCaseWithMemoryTransport):
406
class TestGraphIndex(tests.TestCaseWithMemoryTransport):
368
408
def make_key(self, number):
369
409
return (str(number) + 'X'*100,)
783
823
index = self.make_index(1, nodes=[
784
824
(('name', ), 'data', ([('ref', ), ('ref', )], )),
785
825
(('ref', ), 'refdata', ([], ))])
786
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),('ref',)),)),
787
(index, ('ref', ), 'refdata', ((), ))]),
826
self.assertEqual({(index, ('name', ), 'data', ((('ref',), ('ref',)),)),
827
(index, ('ref', ), 'refdata', ((), ))},
788
828
set(index.iter_entries([('name',), ('ref',)])))
790
830
def test_iter_entries_references_2_refs_resolved(self):
791
831
index = self.make_index(2, nodes=[
792
832
(('name', ), 'data', ([('ref', )], [('ref', )])),
793
833
(('ref', ), 'refdata', ([], []))])
794
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),), (('ref',),))),
795
(index, ('ref', ), 'refdata', ((), ()))]),
834
self.assertEqual({(index, ('name', ), 'data', ((('ref',),), (('ref',),))),
835
(index, ('ref', ), 'refdata', ((), ()))},
796
836
set(index.iter_entries([('name',), ('ref',)])))
798
838
def test_iteration_absent_skipped(self):
799
839
index = self.make_index(1, nodes=[
800
840
(('name', ), 'data', ([('ref', )], ))])
801
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),),))]),
841
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
802
842
set(index.iter_all_entries()))
803
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),),))]),
843
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
804
844
set(index.iter_entries([('name', )])))
805
845
self.assertEqual([], list(index.iter_entries([('ref', )])))
807
847
def test_iteration_absent_skipped_2_element_keys(self):
808
848
index = self.make_index(1, key_elements=2, nodes=[
809
849
(('name', 'fin'), 'data', ([('ref', 'erence')], ))])
810
self.assertEqual(set([(index, ('name', 'fin'), 'data', ((('ref', 'erence'),),))]),
850
self.assertEqual({(index, ('name', 'fin'), 'data', ((('ref', 'erence'),),))},
811
851
set(index.iter_all_entries()))
812
self.assertEqual(set([(index, ('name', 'fin'), 'data', ((('ref', 'erence'),),))]),
852
self.assertEqual({(index, ('name', 'fin'), 'data', ((('ref', 'erence'),),))},
813
853
set(index.iter_entries([('name', 'fin')])))
814
854
self.assertEqual([], list(index.iter_entries([('ref', 'erence')])))
830
870
self.assertEqual([], list(index.iter_entries([('a', )])))
832
872
def test_iter_missing_entry_empty_no_size(self):
833
index = self.make_index()
834
index = GraphIndex(index._transport, 'index', None)
835
self.assertEqual([], list(index.iter_entries([('a', )])))
873
idx = self.make_index()
874
idx = _mod_index.GraphIndex(idx._transport, 'index', None)
875
self.assertEqual([], list(idx.iter_entries([('a', )])))
837
877
def test_iter_key_prefix_1_element_key_None(self):
838
878
index = self.make_index()
839
self.assertRaises(errors.BadIndexKey, list,
879
self.assertRaises(_mod_index.BadIndexKey, list,
840
880
index.iter_entries_prefix([(None, )]))
842
882
def test_iter_key_prefix_wrong_length(self):
843
883
index = self.make_index()
844
self.assertRaises(errors.BadIndexKey, list,
884
self.assertRaises(_mod_index.BadIndexKey, list,
845
885
index.iter_entries_prefix([('foo', None)]))
846
886
index = self.make_index(key_elements=2)
847
self.assertRaises(errors.BadIndexKey, list,
887
self.assertRaises(_mod_index.BadIndexKey, list,
848
888
index.iter_entries_prefix([('foo', )]))
849
self.assertRaises(errors.BadIndexKey, list,
889
self.assertRaises(_mod_index.BadIndexKey, list,
850
890
index.iter_entries_prefix([('foo', None, None)]))
852
892
def test_iter_key_prefix_1_key_element_no_refs(self):
853
893
index = self.make_index( nodes=[
854
894
(('name', ), 'data', ()),
855
895
(('ref', ), 'refdata', ())])
856
self.assertEqual(set([(index, ('name', ), 'data'),
857
(index, ('ref', ), 'refdata')]),
896
self.assertEqual({(index, ('name', ), 'data'),
897
(index, ('ref', ), 'refdata')},
858
898
set(index.iter_entries_prefix([('name', ), ('ref', )])))
860
900
def test_iter_key_prefix_1_key_element_refs(self):
861
901
index = self.make_index(1, nodes=[
862
902
(('name', ), 'data', ([('ref', )], )),
863
903
(('ref', ), 'refdata', ([], ))])
864
self.assertEqual(set([(index, ('name', ), 'data', ((('ref',),),)),
865
(index, ('ref', ), 'refdata', ((), ))]),
904
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),)),
905
(index, ('ref', ), 'refdata', ((), ))},
866
906
set(index.iter_entries_prefix([('name', ), ('ref', )])))
868
908
def test_iter_key_prefix_2_key_element_no_refs(self):
1128
1169
log.append(self._index)
1129
1170
return self._index.clear_cache()
1131
index = CombinedGraphIndex([])
1132
index1 = self.make_index('name', 0, nodes=[(('key', ), '', ())])
1133
index.insert_index(0, ClearCacheProxy(index1))
1134
index2 = self.make_index('name', 0, nodes=[(('key', ), '', ())])
1135
index.insert_index(1, ClearCacheProxy(index2))
1172
idx = _mod_index.CombinedGraphIndex([])
1173
idx1 = self.make_index('name', 0, nodes=[(('key', ), '', ())])
1174
idx.insert_index(0, ClearCacheProxy(idx1))
1175
idx2 = self.make_index('name', 0, nodes=[(('key', ), '', ())])
1176
idx.insert_index(1, ClearCacheProxy(idx2))
1136
1177
# CombinedGraphIndex should call 'clear_cache()' on all children
1138
self.assertEqual(sorted([index1, index2]), sorted(log))
1179
self.assertEqual(sorted([idx1, idx2]), sorted(log))
1140
1181
def test_iter_all_entries_empty(self):
1141
index = CombinedGraphIndex([])
1142
self.assertEqual([], list(index.iter_all_entries()))
1182
idx = _mod_index.CombinedGraphIndex([])
1183
self.assertEqual([], list(idx.iter_all_entries()))
1144
1185
def test_iter_all_entries_children_empty(self):
1145
index1 = self.make_index('name')
1146
index = CombinedGraphIndex([index1])
1147
self.assertEqual([], list(index.iter_all_entries()))
1186
idx1 = self.make_index('name')
1187
idx = _mod_index.CombinedGraphIndex([idx1])
1188
self.assertEqual([], list(idx.iter_all_entries()))
1149
1190
def test_iter_all_entries_simple(self):
1150
index1 = self.make_index('name', nodes=[(('name', ), 'data', ())])
1151
index = CombinedGraphIndex([index1])
1152
self.assertEqual([(index1, ('name', ), 'data')],
1153
list(index.iter_all_entries()))
1191
idx1 = self.make_index('name', nodes=[(('name', ), 'data', ())])
1192
idx = _mod_index.CombinedGraphIndex([idx1])
1193
self.assertEqual([(idx1, ('name', ), 'data')],
1194
list(idx.iter_all_entries()))
1155
1196
def test_iter_all_entries_two_indices(self):
1156
index1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1157
index2 = self.make_index('name2', nodes=[(('2', ), '', ())])
1158
index = CombinedGraphIndex([index1, index2])
1159
self.assertEqual([(index1, ('name', ), 'data'),
1160
(index2, ('2', ), '')],
1161
list(index.iter_all_entries()))
1197
idx1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1198
idx2 = self.make_index('name2', nodes=[(('2', ), '', ())])
1199
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1200
self.assertEqual([(idx1, ('name', ), 'data'),
1201
(idx2, ('2', ), '')],
1202
list(idx.iter_all_entries()))
1163
1204
def test_iter_entries_two_indices_dup_key(self):
1164
index1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1165
index2 = self.make_index('name2', nodes=[(('name', ), 'data', ())])
1166
index = CombinedGraphIndex([index1, index2])
1167
self.assertEqual([(index1, ('name', ), 'data')],
1168
list(index.iter_entries([('name', )])))
1205
idx1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1206
idx2 = self.make_index('name2', nodes=[(('name', ), 'data', ())])
1207
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1208
self.assertEqual([(idx1, ('name', ), 'data')],
1209
list(idx.iter_entries([('name', )])))
1170
1211
def test_iter_all_entries_two_indices_dup_key(self):
1171
index1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1172
index2 = self.make_index('name2', nodes=[(('name', ), 'data', ())])
1173
index = CombinedGraphIndex([index1, index2])
1174
self.assertEqual([(index1, ('name', ), 'data')],
1175
list(index.iter_all_entries()))
1212
idx1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1213
idx2 = self.make_index('name2', nodes=[(('name', ), 'data', ())])
1214
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1215
self.assertEqual([(idx1, ('name', ), 'data')],
1216
list(idx.iter_all_entries()))
1177
1218
def test_iter_key_prefix_2_key_element_refs(self):
1178
index1 = self.make_index('1', 1, key_elements=2, nodes=[
1179
(('name', 'fin1'), 'data', ([('ref', 'erence')], ))])
1180
index2 = self.make_index('2', 1, key_elements=2, nodes=[
1181
(('name', 'fin2'), 'beta', ([], )),
1182
(('ref', 'erence'), 'refdata', ([], ))])
1183
index = CombinedGraphIndex([index1, index2])
1184
self.assertEqual(set([(index1, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
1185
(index2, ('ref', 'erence'), 'refdata', ((), ))]),
1186
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
1187
self.assertEqual(set([(index1, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
1188
(index2, ('name', 'fin2'), 'beta', ((), ))]),
1189
set(index.iter_entries_prefix([('name', None)])))
1219
idx1 = self.make_index('1', 1, key_elements=2, nodes=[
1220
(('name', 'fin1'), 'data', ([('ref', 'erence')], ))])
1221
idx2 = self.make_index('2', 1, key_elements=2, nodes=[
1222
(('name', 'fin2'), 'beta', ([], )),
1223
(('ref', 'erence'), 'refdata', ([], ))])
1224
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1225
self.assertEqual({(idx1, ('name', 'fin1'), 'data',
1226
((('ref', 'erence'),),)),
1227
(idx2, ('ref', 'erence'), 'refdata', ((), ))},
1228
set(idx.iter_entries_prefix([('name', 'fin1'),
1229
('ref', 'erence')])))
1230
self.assertEqual({(idx1, ('name', 'fin1'), 'data',
1231
((('ref', 'erence'),),)),
1232
(idx2, ('name', 'fin2'), 'beta', ((), ))},
1233
set(idx.iter_entries_prefix([('name', None)])))
1191
1235
def test_iter_nothing_empty(self):
1192
index = CombinedGraphIndex([])
1193
self.assertEqual([], list(index.iter_entries([])))
1236
idx = _mod_index.CombinedGraphIndex([])
1237
self.assertEqual([], list(idx.iter_entries([])))
1195
1239
def test_iter_nothing_children_empty(self):
1196
index1 = self.make_index('name')
1197
index = CombinedGraphIndex([index1])
1198
self.assertEqual([], list(index.iter_entries([])))
1240
idx1 = self.make_index('name')
1241
idx = _mod_index.CombinedGraphIndex([idx1])
1242
self.assertEqual([], list(idx.iter_entries([])))
1200
1244
def test_iter_all_keys(self):
1201
index1 = self.make_index('1', 1, nodes=[
1202
(('name', ), 'data', ([('ref', )], ))])
1203
index2 = self.make_index('2', 1, nodes=[
1204
(('ref', ), 'refdata', ((), ))])
1205
index = CombinedGraphIndex([index1, index2])
1206
self.assertEqual(set([(index1, ('name', ), 'data', ((('ref', ), ), )),
1207
(index2, ('ref', ), 'refdata', ((), ))]),
1208
set(index.iter_entries([('name', ), ('ref', )])))
1245
idx1 = self.make_index('1', 1, nodes=[(('name', ), 'data',
1247
idx2 = self.make_index('2', 1, nodes=[(('ref', ), 'refdata', ((), ))])
1248
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1249
self.assertEqual({(idx1, ('name', ), 'data', ((('ref', ), ), )),
1250
(idx2, ('ref', ), 'refdata', ((), ))},
1251
set(idx.iter_entries([('name', ), ('ref', )])))
1210
1253
def test_iter_all_keys_dup_entry(self):
1211
index1 = self.make_index('1', 1, nodes=[
1212
(('name', ), 'data', ([('ref', )], )),
1213
(('ref', ), 'refdata', ([], ))])
1214
index2 = self.make_index('2', 1, nodes=[
1215
(('ref', ), 'refdata', ([], ))])
1216
index = CombinedGraphIndex([index1, index2])
1217
self.assertEqual(set([(index1, ('name', ), 'data', ((('ref',),),)),
1218
(index1, ('ref', ), 'refdata', ((), ))]),
1219
set(index.iter_entries([('name', ), ('ref', )])))
1254
idx1 = self.make_index('1', 1, nodes=[(('name', ), 'data',
1256
(('ref', ), 'refdata', ([], ))])
1257
idx2 = self.make_index('2', 1, nodes=[(('ref', ), 'refdata', ([], ))])
1258
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1259
self.assertEqual({(idx1, ('name', ), 'data', ((('ref',),),)),
1260
(idx1, ('ref', ), 'refdata', ((), ))},
1261
set(idx.iter_entries([('name', ), ('ref', )])))
1221
1263
def test_iter_missing_entry_empty(self):
1222
index = CombinedGraphIndex([])
1223
self.assertEqual([], list(index.iter_entries([('a', )])))
1264
idx = _mod_index.CombinedGraphIndex([])
1265
self.assertEqual([], list(idx.iter_entries([('a', )])))
1225
1267
def test_iter_missing_entry_one_index(self):
1226
index1 = self.make_index('1')
1227
index = CombinedGraphIndex([index1])
1228
self.assertEqual([], list(index.iter_entries([('a', )])))
1268
idx1 = self.make_index('1')
1269
idx = _mod_index.CombinedGraphIndex([idx1])
1270
self.assertEqual([], list(idx.iter_entries([('a', )])))
1230
1272
def test_iter_missing_entry_two_index(self):
1231
index1 = self.make_index('1')
1232
index2 = self.make_index('2')
1233
index = CombinedGraphIndex([index1, index2])
1234
self.assertEqual([], list(index.iter_entries([('a', )])))
1273
idx1 = self.make_index('1')
1274
idx2 = self.make_index('2')
1275
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1276
self.assertEqual([], list(idx.iter_entries([('a', )])))
1236
1278
def test_iter_entry_present_one_index_only(self):
1237
index1 = self.make_index('1', nodes=[(('key', ), '', ())])
1238
index2 = self.make_index('2', nodes=[])
1239
index = CombinedGraphIndex([index1, index2])
1240
self.assertEqual([(index1, ('key', ), '')],
1241
list(index.iter_entries([('key', )])))
1279
idx1 = self.make_index('1', nodes=[(('key', ), '', ())])
1280
idx2 = self.make_index('2', nodes=[])
1281
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1282
self.assertEqual([(idx1, ('key', ), '')],
1283
list(idx.iter_entries([('key', )])))
1242
1284
# and in the other direction
1243
index = CombinedGraphIndex([index2, index1])
1244
self.assertEqual([(index1, ('key', ), '')],
1245
list(index.iter_entries([('key', )])))
1285
idx = _mod_index.CombinedGraphIndex([idx2, idx1])
1286
self.assertEqual([(idx1, ('key', ), '')],
1287
list(idx.iter_entries([('key', )])))
1247
1289
def test_key_count_empty(self):
1248
index1 = self.make_index('1', nodes=[])
1249
index2 = self.make_index('2', nodes=[])
1250
index = CombinedGraphIndex([index1, index2])
1251
self.assertEqual(0, index.key_count())
1290
idx1 = self.make_index('1', nodes=[])
1291
idx2 = self.make_index('2', nodes=[])
1292
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1293
self.assertEqual(0, idx.key_count())
1253
1295
def test_key_count_sums_index_keys(self):
1254
index1 = self.make_index('1', nodes=[
1296
idx1 = self.make_index('1', nodes=[
1255
1297
(('1',), '', ()),
1256
1298
(('2',), '', ())])
1257
index2 = self.make_index('2', nodes=[(('1',), '', ())])
1258
index = CombinedGraphIndex([index1, index2])
1259
self.assertEqual(3, index.key_count())
1299
idx2 = self.make_index('2', nodes=[(('1',), '', ())])
1300
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1301
self.assertEqual(3, idx.key_count())
1261
1303
def test_validate_bad_child_index_errors(self):
1262
1304
trans = self.get_transport()
1263
1305
trans.put_bytes('name', "not an index\n")
1264
index1 = GraphIndex(trans, 'name', 13)
1265
index = CombinedGraphIndex([index1])
1266
self.assertRaises(errors.BadIndexFormatSignature, index.validate)
1306
idx1 = _mod_index.GraphIndex(trans, 'name', 13)
1307
idx = _mod_index.CombinedGraphIndex([idx1])
1308
self.assertRaises(_mod_index.BadIndexFormatSignature, idx.validate)
1268
1310
def test_validate_empty(self):
1269
index = CombinedGraphIndex([])
1311
idx = _mod_index.CombinedGraphIndex([])
1272
1314
def test_key_count_reloads(self):
1273
index, reload_counter = self.make_combined_index_with_missing()
1274
self.assertEqual(2, index.key_count())
1315
idx, reload_counter = self.make_combined_index_with_missing()
1316
self.assertEqual(2, idx.key_count())
1275
1317
self.assertEqual([1, 1, 0], reload_counter)
1277
1319
def test_key_count_no_reload(self):
1278
index, reload_counter = self.make_combined_index_with_missing()
1279
index._reload_func = None
1320
idx, reload_counter = self.make_combined_index_with_missing()
1321
idx._reload_func = None
1280
1322
# Without a _reload_func we just raise the exception
1281
self.assertRaises(errors.NoSuchFile, index.key_count)
1323
self.assertRaises(errors.NoSuchFile, idx.key_count)
1283
1325
def test_key_count_reloads_and_fails(self):
1284
1326
# We have deleted all underlying indexes, so we will try to reload, but
1285
1327
# still fail. This is mostly to test we don't get stuck in an infinite
1286
1328
# loop trying to reload
1287
index, reload_counter = self.make_combined_index_with_missing(
1289
self.assertRaises(errors.NoSuchFile, index.key_count)
1329
idx, reload_counter = self.make_combined_index_with_missing(
1331
self.assertRaises(errors.NoSuchFile, idx.key_count)
1290
1332
self.assertEqual([2, 1, 1], reload_counter)
1292
1334
def test_iter_entries_reloads(self):