156
156
# use three values of each key element, to have a good chance of
157
157
# glitching dictionary hash lookups etc. Insert in randomish order that
158
158
# is not correct and not the reverse of the correct order.
159
builder.add_node((b'2002', b'2002'), b'data')
160
builder.add_node((b'2002', b'2000'), b'data')
161
builder.add_node((b'2002', b'2001'), b'data')
162
builder.add_node((b'2000', b'2002'), b'data')
163
builder.add_node((b'2000', b'2000'), b'data')
164
builder.add_node((b'2000', b'2001'), b'data')
165
builder.add_node((b'2001', b'2002'), b'data')
166
builder.add_node((b'2001', b'2000'), b'data')
167
builder.add_node((b'2001', b'2001'), b'data')
159
builder.add_node(('2002', '2002'), 'data')
160
builder.add_node(('2002', '2000'), 'data')
161
builder.add_node(('2002', '2001'), 'data')
162
builder.add_node(('2000', '2002'), 'data')
163
builder.add_node(('2000', '2000'), 'data')
164
builder.add_node(('2000', '2001'), 'data')
165
builder.add_node(('2001', '2002'), 'data')
166
builder.add_node(('2001', '2000'), 'data')
167
builder.add_node(('2001', '2001'), 'data')
168
168
stream = builder.finish()
169
169
contents = stream.read()
170
170
self.assertEqual(
171
b"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\nlen=9\n"
172
b"2000\x002000\x00\x00\x00data\n"
173
b"2000\x002001\x00\x00\x00data\n"
174
b"2000\x002002\x00\x00\x00data\n"
175
b"2001\x002000\x00\x00\x00data\n"
176
b"2001\x002001\x00\x00\x00data\n"
177
b"2001\x002002\x00\x00\x00data\n"
178
b"2002\x002000\x00\x00\x00data\n"
179
b"2002\x002001\x00\x00\x00data\n"
180
b"2002\x002002\x00\x00\x00data\n"
171
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\nlen=9\n"
172
"2000\x002000\x00\x00\x00data\n"
173
"2000\x002001\x00\x00\x00data\n"
174
"2000\x002002\x00\x00\x00data\n"
175
"2001\x002000\x00\x00\x00data\n"
176
"2001\x002001\x00\x00\x00data\n"
177
"2001\x002002\x00\x00\x00data\n"
178
"2002\x002000\x00\x00\x00data\n"
179
"2002\x002001\x00\x00\x00data\n"
180
"2002\x002002\x00\x00\x00data\n"
183
183
def test_build_index_reference_lists_are_included_one(self):
184
184
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
185
builder.add_node((b'key', ), b'data', ([], ))
185
builder.add_node(('key', ), 'data', ([], ))
186
186
stream = builder.finish()
187
187
contents = stream.read()
188
188
self.assertEqual(
189
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
190
b"key\x00\x00\x00data\n"
189
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
190
"key\x00\x00\x00data\n"
193
193
def test_build_index_reference_lists_with_2_element_keys(self):
194
builder = _mod_index.GraphIndexBuilder(
195
reference_lists=1, key_elements=2)
196
builder.add_node((b'key', b'key2'), b'data', ([], ))
194
builder = _mod_index.GraphIndexBuilder(reference_lists=1, key_elements=2)
195
builder.add_node(('key', 'key2'), 'data', ([], ))
197
196
stream = builder.finish()
198
197
contents = stream.read()
199
198
self.assertEqual(
200
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=2\nlen=1\n"
201
b"key\x00key2\x00\x00\x00data\n"
199
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=2\nlen=1\n"
200
"key\x00key2\x00\x00\x00data\n"
204
203
def test_build_index_reference_lists_are_included_two(self):
205
204
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
206
builder.add_node((b'key', ), b'data', ([], []))
205
builder.add_node(('key', ), 'data', ([], []))
207
206
stream = builder.finish()
208
207
contents = stream.read()
209
208
self.assertEqual(
210
b"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=1\n"
211
b"key\x00\x00\t\x00data\n"
209
"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=1\n"
210
"key\x00\x00\t\x00data\n"
214
213
def test_clear_cache(self):
215
214
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
219
218
def test_node_references_are_byte_offsets(self):
220
219
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
221
builder.add_node((b'reference', ), b'data', ([], ))
222
builder.add_node((b'key', ), b'data', ([(b'reference', )], ))
220
builder.add_node(('reference', ), 'data', ([], ))
221
builder.add_node(('key', ), 'data', ([('reference', )], ))
223
222
stream = builder.finish()
224
223
contents = stream.read()
225
224
self.assertEqual(
226
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=2\n"
227
b"key\x00\x0072\x00data\n"
228
b"reference\x00\x00\x00data\n"
225
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=2\n"
226
"key\x00\x0072\x00data\n"
227
"reference\x00\x00\x00data\n"
231
230
def test_node_references_are_cr_delimited(self):
232
231
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
233
builder.add_node((b'reference', ), b'data', ([], ))
234
builder.add_node((b'reference2', ), b'data', ([], ))
235
builder.add_node((b'key', ), b'data',
236
([(b'reference', ), (b'reference2', )], ))
232
builder.add_node(('reference', ), 'data', ([], ))
233
builder.add_node(('reference2', ), 'data', ([], ))
234
builder.add_node(('key', ), 'data',
235
([('reference', ), ('reference2', )], ))
237
236
stream = builder.finish()
238
237
contents = stream.read()
239
238
self.assertEqual(
240
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=3\n"
241
b"key\x00\x00077\r094\x00data\n"
242
b"reference\x00\x00\x00data\n"
243
b"reference2\x00\x00\x00data\n"
239
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=3\n"
240
"key\x00\x00077\r094\x00data\n"
241
"reference\x00\x00\x00data\n"
242
"reference2\x00\x00\x00data\n"
246
245
def test_multiple_reference_lists_are_tab_delimited(self):
247
246
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
248
builder.add_node((b'keference', ), b'data', ([], []))
249
builder.add_node((b'rey', ), b'data',
250
([(b'keference', )], [(b'keference', )]))
247
builder.add_node(('keference', ), 'data', ([], []))
248
builder.add_node(('rey', ), 'data',
249
([('keference', )], [('keference', )]))
251
250
stream = builder.finish()
252
251
contents = stream.read()
253
252
self.assertEqual(
254
b"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=2\n"
255
b"keference\x00\x00\t\x00data\n"
256
b"rey\x00\x0059\t59\x00data\n"
253
"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=2\n"
254
"keference\x00\x00\t\x00data\n"
255
"rey\x00\x0059\t59\x00data\n"
259
258
def test_add_node_referencing_missing_key_makes_absent(self):
260
259
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
261
builder.add_node((b'rey', ), b'data',
262
([(b'beference', ), (b'aeference2', )], ))
260
builder.add_node(('rey', ), 'data',
261
([('beference', ), ('aeference2', )], ))
263
262
stream = builder.finish()
264
263
contents = stream.read()
265
264
self.assertEqual(
266
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
267
b"aeference2\x00a\x00\x00\n"
268
b"beference\x00a\x00\x00\n"
269
b"rey\x00\x00074\r059\x00data\n"
265
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
266
"aeference2\x00a\x00\x00\n"
267
"beference\x00a\x00\x00\n"
268
"rey\x00\x00074\r059\x00data\n"
272
271
def test_node_references_three_digits(self):
273
272
# test the node digit expands as needed.
274
273
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
275
references = [((b"%d" % val), ) for val in range(8, -1, -1)]
276
builder.add_node((b'2-key', ), b'', (references, ))
274
references = [(str(val), ) for val in range(8, -1, -1)]
275
builder.add_node(('2-key', ), '', (references, ))
277
276
stream = builder.finish()
278
277
contents = stream.read()
279
278
self.assertEqualDiff(
280
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
284
b"2-key\x00\x00151\r145\r139\r133\r127\r121\r071\r065\r059\x00\n"
279
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
283
"2-key\x00\x00151\r145\r139\r133\r127\r121\r071\r065\r059\x00\n"
293
292
def test_absent_has_no_reference_overhead(self):
294
293
# the offsets after an absent record should be correct when there are
295
294
# >1 reference lists.
296
295
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
297
builder.add_node((b'parent', ), b'', ([(b'aail', ), (b'zther', )], []))
296
builder.add_node(('parent', ), '', ([('aail', ), ('zther', )], []))
298
297
stream = builder.finish()
299
298
contents = stream.read()
300
299
self.assertEqual(
301
b"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=1\n"
302
b"aail\x00a\x00\x00\n"
303
b"parent\x00\x0059\r84\t\x00\n"
304
b"zther\x00a\x00\x00\n"
300
"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=1\n"
301
"aail\x00a\x00\x00\n"
302
"parent\x00\x0059\r84\t\x00\n"
303
"zther\x00a\x00\x00\n"
307
306
def test_add_node_bad_key(self):
308
307
builder = _mod_index.GraphIndexBuilder()
309
for bad_char in bytearray(b'\t\n\x0b\x0c\r\x00 '):
308
for bad_char in '\t\n\x0b\x0c\r\x00 ':
310
309
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
311
(b'a%skey' % bytes([bad_char]), ), b'data')
312
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
314
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
315
b'not-a-tuple', b'data')
310
('a%skey' % bad_char, ), 'data')
311
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
313
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
314
'not-a-tuple', 'data')
316
315
# not enough length
317
316
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
320
319
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
321
(b'primary', b'secondary'), b'data')
320
('primary', 'secondary'), 'data')
322
321
# secondary key elements get checked too:
323
322
builder = _mod_index.GraphIndexBuilder(key_elements=2)
324
for bad_char in bytearray(b'\t\n\x0b\x0c\r\x00 '):
323
for bad_char in '\t\n\x0b\x0c\r\x00 ':
325
324
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
326
(b'prefix', b'a%skey' % bytes([bad_char])), b'data')
325
('prefix', 'a%skey' % bad_char), 'data')
328
327
def test_add_node_bad_data(self):
329
328
builder = _mod_index.GraphIndexBuilder()
330
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
332
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
329
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
331
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
335
334
def test_add_node_bad_mismatched_ref_lists_length(self):
336
335
builder = _mod_index.GraphIndexBuilder()
337
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
336
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
339
338
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
340
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
342
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
344
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
345
b'data aa', ([], []))
339
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
341
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
343
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
346
345
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
347
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
349
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
351
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
352
b'data aa', ([], [], []))
346
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
348
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
350
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
351
'data aa', ([], [], []))
354
353
def test_add_node_bad_key_in_reference_lists(self):
355
354
# first list, first key - trivial
356
355
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
357
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
358
b'data aa', ([(b'a key', )], ))
356
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
357
'data aa', ([('a key', )], ))
359
358
# references keys must be tuples too
360
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
361
b'data aa', (['not-a-tuple'], ))
359
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
360
'data aa', (['not-a-tuple'], ))
362
361
# not enough length
363
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
364
b'data aa', ([()], ))
362
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
366
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
367
b'data aa', ([(b'primary', b'secondary')], ))
365
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
366
'data aa', ([('primary', 'secondary')], ))
368
367
# need to check more than the first key in the list
369
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
370
b'data aa', ([(b'agoodkey', ), (b'that is a bad key', )], ))
368
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
369
'data aa', ([('agoodkey', ), ('that is a bad key', )], ))
371
370
# and if there is more than one list it should be getting checked
373
372
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
374
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
375
b'data aa', ([], ['a bad key']))
373
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
374
'data aa', ([], ['a bad key']))
377
376
def test_add_duplicate_key(self):
378
377
builder = _mod_index.GraphIndexBuilder()
379
builder.add_node((b'key', ), b'data')
378
builder.add_node(('key', ), 'data')
380
379
self.assertRaises(_mod_index.BadIndexDuplicateKey,
381
builder.add_node, (b'key', ), b'data')
380
builder.add_node, ('key', ), 'data')
383
382
def test_add_duplicate_key_2_elements(self):
384
383
builder = _mod_index.GraphIndexBuilder(key_elements=2)
385
builder.add_node((b'key', b'key'), b'data')
384
builder.add_node(('key', 'key'), 'data')
386
385
self.assertRaises(_mod_index.BadIndexDuplicateKey, builder.add_node,
387
(b'key', b'key'), b'data')
386
('key', 'key'), 'data')
389
388
def test_add_key_after_referencing_key(self):
390
389
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
391
builder.add_node((b'key', ), b'data', ([(b'reference', )], ))
392
builder.add_node((b'reference', ), b'data', ([],))
390
builder.add_node(('key', ), 'data', ([('reference', )], ))
391
builder.add_node(('reference', ), 'data', ([],))
394
393
def test_add_key_after_referencing_key_2_elements(self):
395
builder = _mod_index.GraphIndexBuilder(
396
reference_lists=1, key_elements=2)
397
builder.add_node((b'k', b'ey'), b'data',
398
([(b'reference', b'tokey')], ))
399
builder.add_node((b'reference', b'tokey'), b'data', ([],))
394
builder = _mod_index.GraphIndexBuilder(reference_lists=1, key_elements=2)
395
builder.add_node(('k', 'ey'), 'data', ([('reference', 'tokey')], ))
396
builder.add_node(('reference', 'tokey'), 'data', ([],))
401
398
def test_set_optimize(self):
402
builder = _mod_index.GraphIndexBuilder(
403
reference_lists=1, key_elements=2)
399
builder = _mod_index.GraphIndexBuilder(reference_lists=1, key_elements=2)
404
400
builder.set_optimize(for_size=True)
405
401
self.assertTrue(builder._optimize_for_size)
406
402
builder.set_optimize(for_size=False)
829
822
def test_iter_entries_references_resolved(self):
830
823
index = self.make_index(1, nodes=[
831
((b'name', ), b'data', ([(b'ref', ), (b'ref', )], )),
832
((b'ref', ), b'refdata', ([], ))])
833
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',), (b'ref',)),)),
834
(index, (b'ref', ), b'refdata', ((), ))},
835
set(index.iter_entries([(b'name',), (b'ref',)])))
824
(('name', ), 'data', ([('ref', ), ('ref', )], )),
825
(('ref', ), 'refdata', ([], ))])
826
self.assertEqual({(index, ('name', ), 'data', ((('ref',), ('ref',)),)),
827
(index, ('ref', ), 'refdata', ((), ))},
828
set(index.iter_entries([('name',), ('ref',)])))
837
830
def test_iter_entries_references_2_refs_resolved(self):
838
831
index = self.make_index(2, nodes=[
839
((b'name', ), b'data', ([(b'ref', )], [(b'ref', )])),
840
((b'ref', ), b'refdata', ([], []))])
841
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),), ((b'ref',),))),
842
(index, (b'ref', ), b'refdata', ((), ()))},
843
set(index.iter_entries([(b'name',), (b'ref',)])))
832
(('name', ), 'data', ([('ref', )], [('ref', )])),
833
(('ref', ), 'refdata', ([], []))])
834
self.assertEqual({(index, ('name', ), 'data', ((('ref',),), (('ref',),))),
835
(index, ('ref', ), 'refdata', ((), ()))},
836
set(index.iter_entries([('name',), ('ref',)])))
845
838
def test_iteration_absent_skipped(self):
846
839
index = self.make_index(1, nodes=[
847
((b'name', ), b'data', ([(b'ref', )], ))])
848
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
849
set(index.iter_all_entries()))
850
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
851
set(index.iter_entries([(b'name', )])))
852
self.assertEqual([], list(index.iter_entries([(b'ref', )])))
840
(('name', ), 'data', ([('ref', )], ))])
841
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
842
set(index.iter_all_entries()))
843
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
844
set(index.iter_entries([('name', )])))
845
self.assertEqual([], list(index.iter_entries([('ref', )])))
854
847
def test_iteration_absent_skipped_2_element_keys(self):
855
848
index = self.make_index(1, key_elements=2, nodes=[
856
((b'name', b'fin'), b'data', ([(b'ref', b'erence')], ))])
857
self.assertEqual([(index, (b'name', b'fin'), b'data', (((b'ref', b'erence'),),))],
858
list(index.iter_all_entries()))
859
self.assertEqual([(index, (b'name', b'fin'), b'data', (((b'ref', b'erence'),),))],
860
list(index.iter_entries([(b'name', b'fin')])))
861
self.assertEqual([], list(index.iter_entries([(b'ref', b'erence')])))
849
(('name', 'fin'), 'data', ([('ref', 'erence')], ))])
850
self.assertEqual({(index, ('name', 'fin'), 'data', ((('ref', 'erence'),),))},
851
set(index.iter_all_entries()))
852
self.assertEqual({(index, ('name', 'fin'), 'data', ((('ref', 'erence'),),))},
853
set(index.iter_entries([('name', 'fin')])))
854
self.assertEqual([], list(index.iter_entries([('ref', 'erence')])))
863
856
def test_iter_all_keys(self):
864
857
index = self.make_index(1, nodes=[
865
((b'name', ), b'data', ([(b'ref', )], )),
866
((b'ref', ), b'refdata', ([], ))])
867
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
868
(index, (b'ref', ), b'refdata', ((), ))},
869
set(index.iter_entries([(b'name', ), (b'ref', )])))
858
(('name', ), 'data', ([('ref', )], )),
859
(('ref', ), 'refdata', ([], ))])
860
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),)),
861
(index, ('ref', ), 'refdata', ((), ))},
862
set(index.iter_entries([('name', ), ('ref', )])))
871
864
def test_iter_nothing_empty(self):
872
865
index = self.make_index()
875
868
def test_iter_missing_entry_empty(self):
876
869
index = self.make_index()
877
self.assertEqual([], list(index.iter_entries([(b'a', )])))
870
self.assertEqual([], list(index.iter_entries([('a', )])))
879
872
def test_iter_missing_entry_empty_no_size(self):
880
873
idx = self.make_index()
881
874
idx = _mod_index.GraphIndex(idx._transport, 'index', None)
882
self.assertEqual([], list(idx.iter_entries([(b'a', )])))
875
self.assertEqual([], list(idx.iter_entries([('a', )])))
884
877
def test_iter_key_prefix_1_element_key_None(self):
885
878
index = self.make_index()
886
879
self.assertRaises(_mod_index.BadIndexKey, list,
887
index.iter_entries_prefix([(None, )]))
880
index.iter_entries_prefix([(None, )]))
889
882
def test_iter_key_prefix_wrong_length(self):
890
883
index = self.make_index()
891
884
self.assertRaises(_mod_index.BadIndexKey, list,
892
index.iter_entries_prefix([(b'foo', None)]))
885
index.iter_entries_prefix([('foo', None)]))
893
886
index = self.make_index(key_elements=2)
894
887
self.assertRaises(_mod_index.BadIndexKey, list,
895
index.iter_entries_prefix([(b'foo', )]))
888
index.iter_entries_prefix([('foo', )]))
896
889
self.assertRaises(_mod_index.BadIndexKey, list,
897
index.iter_entries_prefix([(b'foo', None, None)]))
890
index.iter_entries_prefix([('foo', None, None)]))
899
892
def test_iter_key_prefix_1_key_element_no_refs(self):
900
index = self.make_index(nodes=[
901
((b'name', ), b'data', ()),
902
((b'ref', ), b'refdata', ())])
903
self.assertEqual({(index, (b'name', ), b'data'),
904
(index, (b'ref', ), b'refdata')},
905
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
893
index = self.make_index( nodes=[
894
(('name', ), 'data', ()),
895
(('ref', ), 'refdata', ())])
896
self.assertEqual({(index, ('name', ), 'data'),
897
(index, ('ref', ), 'refdata')},
898
set(index.iter_entries_prefix([('name', ), ('ref', )])))
907
900
def test_iter_key_prefix_1_key_element_refs(self):
908
901
index = self.make_index(1, nodes=[
909
((b'name', ), b'data', ([(b'ref', )], )),
910
((b'ref', ), b'refdata', ([], ))])
911
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
912
(index, (b'ref', ), b'refdata', ((), ))},
913
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
902
(('name', ), 'data', ([('ref', )], )),
903
(('ref', ), 'refdata', ([], ))])
904
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),)),
905
(index, ('ref', ), 'refdata', ((), ))},
906
set(index.iter_entries_prefix([('name', ), ('ref', )])))
915
908
def test_iter_key_prefix_2_key_element_no_refs(self):
916
909
index = self.make_index(key_elements=2, nodes=[
917
((b'name', b'fin1'), b'data', ()),
918
((b'name', b'fin2'), b'beta', ()),
919
((b'ref', b'erence'), b'refdata', ())])
920
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
921
(index, (b'ref', b'erence'), b'refdata')},
922
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
923
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
924
(index, (b'name', b'fin2'), b'beta')},
925
set(index.iter_entries_prefix([(b'name', None)])))
910
(('name', 'fin1'), 'data', ()),
911
(('name', 'fin2'), 'beta', ()),
912
(('ref', 'erence'), 'refdata', ())])
913
self.assertEqual({(index, ('name', 'fin1'), 'data'),
914
(index, ('ref', 'erence'), 'refdata')},
915
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
916
self.assertEqual({(index, ('name', 'fin1'), 'data'),
917
(index, ('name', 'fin2'), 'beta')},
918
set(index.iter_entries_prefix([('name', None)])))
927
920
def test_iter_key_prefix_2_key_element_refs(self):
928
921
index = self.make_index(1, key_elements=2, nodes=[
929
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], )),
930
((b'name', b'fin2'), b'beta', ([], )),
931
((b'ref', b'erence'), b'refdata', ([], ))])
932
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
933
(index, (b'ref', b'erence'), b'refdata', ((), ))},
934
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
935
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
936
(index, (b'name', b'fin2'), b'beta', ((), ))},
937
set(index.iter_entries_prefix([(b'name', None)])))
922
(('name', 'fin1'), 'data', ([('ref', 'erence')], )),
923
(('name', 'fin2'), 'beta', ([], )),
924
(('ref', 'erence'), 'refdata', ([], ))])
925
self.assertEqual({(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
926
(index, ('ref', 'erence'), 'refdata', ((), ))},
927
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
928
self.assertEqual({(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
929
(index, ('name', 'fin2'), 'beta', ((), ))},
930
set(index.iter_entries_prefix([('name', None)])))
939
932
def test_key_count_empty(self):
940
933
index = self.make_index()
941
934
self.assertEqual(0, index.key_count())
943
936
def test_key_count_one(self):
944
index = self.make_index(nodes=[((b'name', ), b'', ())])
937
index = self.make_index(nodes=[(('name', ), '', ())])
945
938
self.assertEqual(1, index.key_count())
947
940
def test_key_count_two(self):
948
941
index = self.make_index(nodes=[
949
((b'name', ), b'', ()), ((b'foo', ), b'', ())])
942
(('name', ), '', ()), (('foo', ), '', ())])
950
943
self.assertEqual(2, index.key_count())
952
945
def test_read_and_parse_tracks_real_read_value(self):
1020
1013
def test_external_references_no_results(self):
1021
1014
index = self.make_index(ref_lists=1, nodes=[
1022
((b'key',), b'value', ([],))])
1015
(('key',), 'value', ([],))])
1023
1016
self.assertEqual(set(), index.external_references(0))
1025
1018
def test_external_references_missing_ref(self):
1026
missing_key = (b'missing',)
1019
missing_key = ('missing',)
1027
1020
index = self.make_index(ref_lists=1, nodes=[
1028
((b'key',), b'value', ([missing_key],))])
1021
(('key',), 'value', ([missing_key],))])
1029
1022
self.assertEqual({missing_key}, index.external_references(0))
1031
1024
def test_external_references_multiple_ref_lists(self):
1032
missing_key = (b'missing',)
1025
missing_key = ('missing',)
1033
1026
index = self.make_index(ref_lists=2, nodes=[
1034
((b'key',), b'value', ([], [missing_key]))])
1027
(('key',), 'value', ([], [missing_key]))])
1035
1028
self.assertEqual(set([]), index.external_references(0))
1036
1029
self.assertEqual({missing_key}, index.external_references(1))
1038
1031
def test_external_references_two_records(self):
1039
1032
index = self.make_index(ref_lists=1, nodes=[
1040
((b'key-1',), b'value', ([(b'key-2',)],)),
1041
((b'key-2',), b'value', ([],)),
1033
(('key-1',), 'value', ([('key-2',)],)),
1034
(('key-2',), 'value', ([],)),
1043
1036
self.assertEqual(set([]), index.external_references(0))
1045
1038
def test__find_ancestors(self):
1048
1041
index = self.make_index(ref_lists=1, key_elements=1, nodes=[
1049
(key1, b'value', ([key2],)),
1050
(key2, b'value', ([],)),
1042
(key1, 'value', ([key2],)),
1043
(key2, 'value', ([],)),
1052
1045
parent_map = {}
1053
1046
missing_keys = set()
1054
search_keys = index._find_ancestors(
1055
[key1], 0, parent_map, missing_keys)
1047
search_keys = index._find_ancestors([key1], 0, parent_map, missing_keys)
1056
1048
self.assertEqual({key1: (key2,)}, parent_map)
1057
1049
self.assertEqual(set(), missing_keys)
1058
1050
self.assertEqual({key2}, search_keys)
1198
1188
self.assertEqual([], list(idx.iter_all_entries()))
1200
1190
def test_iter_all_entries_simple(self):
1201
idx1 = self.make_index('name', nodes=[((b'name', ), b'data', ())])
1191
idx1 = self.make_index('name', nodes=[(('name', ), 'data', ())])
1202
1192
idx = _mod_index.CombinedGraphIndex([idx1])
1203
self.assertEqual([(idx1, (b'name', ), b'data')],
1204
list(idx.iter_all_entries()))
1193
self.assertEqual([(idx1, ('name', ), 'data')],
1194
list(idx.iter_all_entries()))
1206
1196
def test_iter_all_entries_two_indices(self):
1207
idx1 = self.make_index('name1', nodes=[((b'name', ), b'data', ())])
1208
idx2 = self.make_index('name2', nodes=[((b'2', ), b'', ())])
1197
idx1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1198
idx2 = self.make_index('name2', nodes=[(('2', ), '', ())])
1209
1199
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1210
self.assertEqual([(idx1, (b'name', ), b'data'),
1211
(idx2, (b'2', ), b'')],
1200
self.assertEqual([(idx1, ('name', ), 'data'),
1201
(idx2, ('2', ), '')],
1212
1202
list(idx.iter_all_entries()))
1214
1204
def test_iter_entries_two_indices_dup_key(self):
1215
idx1 = self.make_index('name1', nodes=[((b'name', ), b'data', ())])
1216
idx2 = self.make_index('name2', nodes=[((b'name', ), b'data', ())])
1205
idx1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1206
idx2 = self.make_index('name2', nodes=[(('name', ), 'data', ())])
1217
1207
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1218
self.assertEqual([(idx1, (b'name', ), b'data')],
1219
list(idx.iter_entries([(b'name', )])))
1208
self.assertEqual([(idx1, ('name', ), 'data')],
1209
list(idx.iter_entries([('name', )])))
1221
1211
def test_iter_all_entries_two_indices_dup_key(self):
1222
idx1 = self.make_index('name1', nodes=[((b'name', ), b'data', ())])
1223
idx2 = self.make_index('name2', nodes=[((b'name', ), b'data', ())])
1212
idx1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1213
idx2 = self.make_index('name2', nodes=[(('name', ), 'data', ())])
1224
1214
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1225
self.assertEqual([(idx1, (b'name', ), b'data')],
1215
self.assertEqual([(idx1, ('name', ), 'data')],
1226
1216
list(idx.iter_all_entries()))
1228
1218
def test_iter_key_prefix_2_key_element_refs(self):
1229
1219
idx1 = self.make_index('1', 1, key_elements=2, nodes=[
1230
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], ))])
1220
(('name', 'fin1'), 'data', ([('ref', 'erence')], ))])
1231
1221
idx2 = self.make_index('2', 1, key_elements=2, nodes=[
1232
((b'name', b'fin2'), b'beta', ([], )),
1233
((b'ref', b'erence'), b'refdata', ([], ))])
1222
(('name', 'fin2'), 'beta', ([], )),
1223
(('ref', 'erence'), 'refdata', ([], ))])
1234
1224
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1235
self.assertEqual({(idx1, (b'name', b'fin1'), b'data',
1236
(((b'ref', b'erence'),),)),
1237
(idx2, (b'ref', b'erence'), b'refdata', ((), ))},
1238
set(idx.iter_entries_prefix([(b'name', b'fin1'),
1239
(b'ref', b'erence')])))
1240
self.assertEqual({(idx1, (b'name', b'fin1'), b'data',
1241
(((b'ref', b'erence'),),)),
1242
(idx2, (b'name', b'fin2'), b'beta', ((), ))},
1243
set(idx.iter_entries_prefix([(b'name', None)])))
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)])))
1245
1235
def test_iter_nothing_empty(self):
1246
1236
idx = _mod_index.CombinedGraphIndex([])
1252
1242
self.assertEqual([], list(idx.iter_entries([])))
1254
1244
def test_iter_all_keys(self):
1255
idx1 = self.make_index('1', 1, nodes=[((b'name', ), b'data',
1257
idx2 = self.make_index(
1258
'2', 1, nodes=[((b'ref', ), b'refdata', ((), ))])
1245
idx1 = self.make_index('1', 1, nodes=[(('name', ), 'data',
1247
idx2 = self.make_index('2', 1, nodes=[(('ref', ), 'refdata', ((), ))])
1259
1248
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1260
self.assertEqual({(idx1, (b'name', ), b'data', (((b'ref', ), ), )),
1261
(idx2, (b'ref', ), b'refdata', ((), ))},
1262
set(idx.iter_entries([(b'name', ), (b'ref', )])))
1249
self.assertEqual({(idx1, ('name', ), 'data', ((('ref', ), ), )),
1250
(idx2, ('ref', ), 'refdata', ((), ))},
1251
set(idx.iter_entries([('name', ), ('ref', )])))
1264
1253
def test_iter_all_keys_dup_entry(self):
1265
idx1 = self.make_index('1', 1, nodes=[((b'name', ), b'data',
1267
((b'ref', ), b'refdata', ([], ))])
1268
idx2 = self.make_index(
1269
'2', 1, nodes=[((b'ref', ), b'refdata', ([], ))])
1254
idx1 = self.make_index('1', 1, nodes=[(('name', ), 'data',
1256
(('ref', ), 'refdata', ([], ))])
1257
idx2 = self.make_index('2', 1, nodes=[(('ref', ), 'refdata', ([], ))])
1270
1258
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1271
self.assertEqual({(idx1, (b'name', ), b'data', (((b'ref',),),)),
1272
(idx1, (b'ref', ), b'refdata', ((), ))},
1273
set(idx.iter_entries([(b'name', ), (b'ref', )])))
1259
self.assertEqual({(idx1, ('name', ), 'data', ((('ref',),),)),
1260
(idx1, ('ref', ), 'refdata', ((), ))},
1261
set(idx.iter_entries([('name', ), ('ref', )])))
1275
1263
def test_iter_missing_entry_empty(self):
1276
1264
idx = _mod_index.CombinedGraphIndex([])
1570
1559
idx = self.make_index('test', ref_lists=1, key_elements=1, nodes=[])
1571
1560
parent_map = {}
1572
1561
missing_keys = set()
1573
search_keys = idx._find_ancestors([(b'one',), (b'two',)], 0, parent_map,
1562
search_keys = idx._find_ancestors([('one',), ('two',)], 0, parent_map,
1575
1564
self.assertEqual(set(), search_keys)
1576
1565
self.assertEqual({}, parent_map)
1577
self.assertEqual({(b'one',), (b'two',)}, missing_keys)
1566
self.assertEqual({('one',), ('two',)}, missing_keys)
1580
1569
class TestInMemoryGraphIndex(tests.TestCaseWithMemoryTransport):
1582
1571
def make_index(self, ref_lists=0, key_elements=1, nodes=[]):
1583
result = _mod_index.InMemoryGraphIndex(
1584
ref_lists, key_elements=key_elements)
1572
result = _mod_index.InMemoryGraphIndex(ref_lists, key_elements=key_elements)
1585
1573
result.add_nodes(nodes)
1588
1576
def test_add_nodes_no_refs(self):
1589
1577
index = self.make_index(0)
1590
index.add_nodes([((b'name', ), b'data')])
1591
index.add_nodes([((b'name2', ), b''), ((b'name3', ), b'')])
1578
index.add_nodes([(('name', ), 'data')])
1579
index.add_nodes([(('name2', ), ''), (('name3', ), '')])
1592
1580
self.assertEqual({
1593
(index, (b'name', ), b'data'),
1594
(index, (b'name2', ), b''),
1595
(index, (b'name3', ), b''),
1581
(index, ('name', ), 'data'),
1582
(index, ('name2', ), ''),
1583
(index, ('name3', ), ''),
1596
1584
}, set(index.iter_all_entries()))
1598
1586
def test_add_nodes(self):
1599
1587
index = self.make_index(1)
1600
index.add_nodes([((b'name', ), b'data', ([],))])
1601
index.add_nodes([((b'name2', ), b'', ([],)),
1602
((b'name3', ), b'', ([(b'r', )],))])
1588
index.add_nodes([(('name', ), 'data', ([],))])
1589
index.add_nodes([(('name2', ), '', ([],)), (('name3', ), '', ([('r', )],))])
1603
1590
self.assertEqual({
1604
(index, (b'name', ), b'data', ((),)),
1605
(index, (b'name2', ), b'', ((),)),
1606
(index, (b'name3', ), b'', (((b'r', ), ), )),
1591
(index, ('name', ), 'data', ((),)),
1592
(index, ('name2', ), '', ((),)),
1593
(index, ('name3', ), '', ((('r', ), ), )),
1607
1594
}, set(index.iter_all_entries()))
1609
1596
def test_iter_all_entries_empty(self):
1611
1598
self.assertEqual([], list(index.iter_all_entries()))
1613
1600
def test_iter_all_entries_simple(self):
1614
index = self.make_index(nodes=[((b'name', ), b'data')])
1615
self.assertEqual([(index, (b'name', ), b'data')],
1616
list(index.iter_all_entries()))
1601
index = self.make_index(nodes=[(('name', ), 'data')])
1602
self.assertEqual([(index, ('name', ), 'data')],
1603
list(index.iter_all_entries()))
1618
1605
def test_iter_all_entries_references(self):
1619
1606
index = self.make_index(1, nodes=[
1620
((b'name', ), b'data', ([(b'ref', )], )),
1621
((b'ref', ), b'refdata', ([], ))])
1622
self.assertEqual({(index, (b'name', ), b'data', (((b'ref', ),),)),
1623
(index, (b'ref', ), b'refdata', ((), ))},
1624
set(index.iter_all_entries()))
1607
(('name', ), 'data', ([('ref', )], )),
1608
(('ref', ), 'refdata', ([], ))])
1609
self.assertEqual({(index, ('name', ), 'data', ((('ref', ),),)),
1610
(index, ('ref', ), 'refdata', ((), ))},
1611
set(index.iter_all_entries()))
1626
1613
def test_iteration_absent_skipped(self):
1627
1614
index = self.make_index(1, nodes=[
1628
((b'name', ), b'data', ([(b'ref', )], ))])
1629
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
1630
set(index.iter_all_entries()))
1631
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
1632
set(index.iter_entries([(b'name', )])))
1633
self.assertEqual([], list(index.iter_entries([(b'ref', )])))
1615
(('name', ), 'data', ([('ref', )], ))])
1616
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
1617
set(index.iter_all_entries()))
1618
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
1619
set(index.iter_entries([('name', )])))
1620
self.assertEqual([], list(index.iter_entries([('ref', )])))
1635
1622
def test_iter_all_keys(self):
1636
1623
index = self.make_index(1, nodes=[
1637
((b'name', ), b'data', ([(b'ref', )], )),
1638
((b'ref', ), b'refdata', ([], ))])
1639
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
1640
(index, (b'ref', ), b'refdata', ((), ))},
1641
set(index.iter_entries([(b'name', ), (b'ref', )])))
1624
(('name', ), 'data', ([('ref', )], )),
1625
(('ref', ), 'refdata', ([], ))])
1626
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),)),
1627
(index, ('ref', ), 'refdata', ((), ))},
1628
set(index.iter_entries([('name', ), ('ref', )])))
1643
1630
def test_iter_key_prefix_1_key_element_no_refs(self):
1644
index = self.make_index(nodes=[
1645
((b'name', ), b'data'),
1646
((b'ref', ), b'refdata')])
1647
self.assertEqual({(index, (b'name', ), b'data'),
1648
(index, (b'ref', ), b'refdata')},
1649
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
1631
index = self.make_index( nodes=[
1632
(('name', ), 'data'),
1633
(('ref', ), 'refdata')])
1634
self.assertEqual({(index, ('name', ), 'data'),
1635
(index, ('ref', ), 'refdata')},
1636
set(index.iter_entries_prefix([('name', ), ('ref', )])))
1651
1638
def test_iter_key_prefix_1_key_element_refs(self):
1652
1639
index = self.make_index(1, nodes=[
1653
((b'name', ), b'data', ([(b'ref', )], )),
1654
((b'ref', ), b'refdata', ([], ))])
1655
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
1656
(index, (b'ref', ), b'refdata', ((), ))},
1657
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
1640
(('name', ), 'data', ([('ref', )], )),
1641
(('ref', ), 'refdata', ([], ))])
1642
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),)),
1643
(index, ('ref', ), 'refdata', ((), ))},
1644
set(index.iter_entries_prefix([('name', ), ('ref', )])))
1659
1646
def test_iter_key_prefix_2_key_element_no_refs(self):
1660
1647
index = self.make_index(key_elements=2, nodes=[
1661
((b'name', b'fin1'), b'data'),
1662
((b'name', b'fin2'), b'beta'),
1663
((b'ref', b'erence'), b'refdata')])
1664
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
1665
(index, (b'ref', b'erence'), b'refdata')},
1666
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
1667
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
1668
(index, (b'name', b'fin2'), b'beta')},
1669
set(index.iter_entries_prefix([(b'name', None)])))
1648
(('name', 'fin1'), 'data'),
1649
(('name', 'fin2'), 'beta'),
1650
(('ref', 'erence'), 'refdata')])
1651
self.assertEqual({(index, ('name', 'fin1'), 'data'),
1652
(index, ('ref', 'erence'), 'refdata')},
1653
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
1654
self.assertEqual({(index, ('name', 'fin1'), 'data'),
1655
(index, ('name', 'fin2'), 'beta')},
1656
set(index.iter_entries_prefix([('name', None)])))
1671
1658
def test_iter_key_prefix_2_key_element_refs(self):
1672
1659
index = self.make_index(1, key_elements=2, nodes=[
1673
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], )),
1674
((b'name', b'fin2'), b'beta', ([], )),
1675
((b'ref', b'erence'), b'refdata', ([], ))])
1676
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
1677
(index, (b'ref', b'erence'), b'refdata', ((), ))},
1678
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
1679
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
1680
(index, (b'name', b'fin2'), b'beta', ((), ))},
1681
set(index.iter_entries_prefix([(b'name', None)])))
1660
(('name', 'fin1'), 'data', ([('ref', 'erence')], )),
1661
(('name', 'fin2'), 'beta', ([], )),
1662
(('ref', 'erence'), 'refdata', ([], ))])
1663
self.assertEqual({(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
1664
(index, ('ref', 'erence'), 'refdata', ((), ))},
1665
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
1666
self.assertEqual({(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
1667
(index, ('name', 'fin2'), 'beta', ((), ))},
1668
set(index.iter_entries_prefix([('name', None)])))
1683
1670
def test_iter_nothing_empty(self):
1684
1671
index = self.make_index()
1714
1701
def make_index(self, ref_lists=1, key_elements=2, nodes=[],
1715
1702
add_callback=False):
1716
result = _mod_index.InMemoryGraphIndex(
1717
ref_lists, key_elements=key_elements)
1703
result = _mod_index.InMemoryGraphIndex(ref_lists, key_elements=key_elements)
1718
1704
result.add_nodes(nodes)
1719
1705
if add_callback:
1720
1706
add_nodes_callback = result.add_nodes
1722
1708
add_nodes_callback = None
1723
1709
adapter = _mod_index.GraphIndexPrefixAdapter(
1724
result, (b'prefix', ), key_elements - 1,
1710
result, ('prefix', ), key_elements - 1,
1725
1711
add_nodes_callback=add_nodes_callback)
1726
1712
return result, adapter
1728
1714
def test_add_node(self):
1729
1715
index, adapter = self.make_index(add_callback=True)
1730
adapter.add_node((b'key',), b'value', (((b'ref',),),))
1731
self.assertEqual({(index, (b'prefix', b'key'), b'value',
1732
(((b'prefix', b'ref'),),))},
1733
set(index.iter_all_entries()))
1716
adapter.add_node(('key',), 'value', ((('ref',),),))
1717
self.assertEqual({(index, ('prefix', 'key'), 'value',
1718
((('prefix', 'ref'),),))},
1719
set(index.iter_all_entries()))
1735
1721
def test_add_nodes(self):
1736
1722
index, adapter = self.make_index(add_callback=True)
1737
1723
adapter.add_nodes((
1738
((b'key',), b'value', (((b'ref',),),)),
1739
((b'key2',), b'value2', ((),)),
1724
(('key',), 'value', ((('ref',),),)),
1725
(('key2',), 'value2', ((),)),
1741
1727
self.assertEqual({
1742
(index, (b'prefix', b'key2'), b'value2', ((),)),
1743
(index, (b'prefix', b'key'), b'value', (((b'prefix', b'ref'),),))
1728
(index, ('prefix', 'key2'), 'value2', ((),)),
1729
(index, ('prefix', 'key'), 'value', ((('prefix', 'ref'),),))
1745
1731
set(index.iter_all_entries()))
1747
1733
def test_construct(self):
1748
1734
idx = _mod_index.InMemoryGraphIndex()
1749
adapter = _mod_index.GraphIndexPrefixAdapter(idx, (b'prefix', ), 1)
1735
adapter = _mod_index.GraphIndexPrefixAdapter(idx, ('prefix', ), 1)
1751
1737
def test_construct_with_callback(self):
1752
1738
idx = _mod_index.InMemoryGraphIndex()
1753
adapter = _mod_index.GraphIndexPrefixAdapter(idx, (b'prefix', ), 1,
1739
adapter = _mod_index.GraphIndexPrefixAdapter(idx, ('prefix', ), 1,
1756
1742
def test_iter_all_entries_cross_prefix_map_errors(self):
1757
1743
index, adapter = self.make_index(nodes=[
1758
((b'prefix', b'key1'), b'data1', (((b'prefixaltered', b'key2'),),))])
1759
self.assertRaises(_mod_index.BadIndexData, list,
1760
adapter.iter_all_entries())
1744
(('prefix', 'key1'), 'data1', ((('prefixaltered', 'key2'),),))])
1745
self.assertRaises(_mod_index.BadIndexData, list, adapter.iter_all_entries())
1762
1747
def test_iter_all_entries(self):
1763
1748
index, adapter = self.make_index(nodes=[
1764
((b'notprefix', b'key1'), b'data', ((), )),
1765
((b'prefix', b'key1'), b'data1', ((), )),
1766
((b'prefix', b'key2'), b'data2', (((b'prefix', b'key1'),),))])
1767
self.assertEqual({(index, (b'key1', ), b'data1', ((),)),
1768
(index, (b'key2', ), b'data2', (((b'key1',),),))},
1769
set(adapter.iter_all_entries()))
1749
(('notprefix', 'key1'), 'data', ((), )),
1750
(('prefix', 'key1'), 'data1', ((), )),
1751
(('prefix', 'key2'), 'data2', ((('prefix', 'key1'),),))])
1752
self.assertEqual({(index, ('key1', ), 'data1', ((),)),
1753
(index, ('key2', ), 'data2', ((('key1',),),))},
1754
set(adapter.iter_all_entries()))
1771
1756
def test_iter_entries(self):
1772
1757
index, adapter = self.make_index(nodes=[
1773
((b'notprefix', b'key1'), b'data', ((), )),
1774
((b'prefix', b'key1'), b'data1', ((), )),
1775
((b'prefix', b'key2'), b'data2', (((b'prefix', b'key1'),),))])
1758
(('notprefix', 'key1'), 'data', ((), )),
1759
(('prefix', 'key1'), 'data1', ((), )),
1760
(('prefix', 'key2'), 'data2', ((('prefix', 'key1'),),))])
1776
1761
# ask for many - get all
1777
self.assertEqual({(index, (b'key1', ), b'data1', ((),)),
1778
(index, (b'key2', ), b'data2', (((b'key1', ),),))},
1779
set(adapter.iter_entries([(b'key1', ), (b'key2', )])))
1762
self.assertEqual({(index, ('key1', ), 'data1', ((),)),
1763
(index, ('key2', ), 'data2', ((('key1', ),),))},
1764
set(adapter.iter_entries([('key1', ), ('key2', )])))
1780
1765
# ask for one, get one
1781
self.assertEqual({(index, (b'key1', ), b'data1', ((),))},
1782
set(adapter.iter_entries([(b'key1', )])))
1766
self.assertEqual({(index, ('key1', ), 'data1', ((),))},
1767
set(adapter.iter_entries([('key1', )])))
1783
1768
# ask for missing, get none
1784
1769
self.assertEqual(set(),
1785
set(adapter.iter_entries([(b'key3', )])))
1770
set(adapter.iter_entries([('key3', )])))
1787
1772
def test_iter_entries_prefix(self):
1788
1773
index, adapter = self.make_index(key_elements=3, nodes=[
1789
((b'notprefix', b'foo', b'key1'), b'data', ((), )),
1790
((b'prefix', b'prefix2', b'key1'), b'data1', ((), )),
1791
((b'prefix', b'prefix2', b'key2'), b'data2', (((b'prefix', b'prefix2', b'key1'),),))])
1774
(('notprefix', 'foo', 'key1'), 'data', ((), )),
1775
(('prefix', 'prefix2', 'key1'), 'data1', ((), )),
1776
(('prefix', 'prefix2', 'key2'), 'data2', ((('prefix', 'prefix2', 'key1'),),))])
1792
1777
# ask for a prefix, get the results for just that prefix, adjusted.
1793
self.assertEqual({(index, (b'prefix2', b'key1', ), b'data1', ((),)),
1794
(index, (b'prefix2', b'key2', ), b'data2', (((b'prefix2', b'key1', ),),))},
1795
set(adapter.iter_entries_prefix([(b'prefix2', None)])))
1778
self.assertEqual({(index, ('prefix2', 'key1', ), 'data1', ((),)),
1779
(index, ('prefix2', 'key2', ), 'data2', ((('prefix2', 'key1', ),),))},
1780
set(adapter.iter_entries_prefix([('prefix2', None)])))
1797
1782
def test_key_count_no_matching_keys(self):
1798
1783
index, adapter = self.make_index(nodes=[
1799
((b'notprefix', b'key1'), b'data', ((), ))])
1784
(('notprefix', 'key1'), 'data', ((), ))])
1800
1785
self.assertEqual(0, adapter.key_count())
1802
1787
def test_key_count_some_keys(self):
1803
1788
index, adapter = self.make_index(nodes=[
1804
((b'notprefix', b'key1'), b'data', ((), )),
1805
((b'prefix', b'key1'), b'data1', ((), )),
1806
((b'prefix', b'key2'), b'data2', (((b'prefix', b'key1'),),))])
1789
(('notprefix', 'key1'), 'data', ((), )),
1790
(('prefix', 'key1'), 'data1', ((), )),
1791
(('prefix', 'key2'), 'data2', ((('prefix', 'key1'),),))])
1807
1792
self.assertEqual(2, adapter.key_count())
1809
1794
def test_validate(self):
1810
1795
index, adapter = self.make_index()
1813
1797
def validate():
1814
1798
calls.append('called')
1815
1799
index.validate = validate