41
41
contents = stream.read()
42
42
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=2\n\n", contents)
44
def test_build_index_one_node(self):
45
builder = GraphIndexBuilder()
46
builder.add_node('akey', (), 'data')
44
def test_build_index_one_node_no_refs(self):
45
builder = GraphIndexBuilder()
46
builder.add_node('akey', 'data')
47
stream = builder.finish()
48
contents = stream.read()
49
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\n"
50
"akey\x00\x00\x00data\n\n", contents)
52
def test_build_index_one_node_no_refs_accepts_empty_reflist(self):
53
builder = GraphIndexBuilder()
54
builder.add_node('akey', 'data', ())
47
55
stream = builder.finish()
48
56
contents = stream.read()
49
57
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\n"
106
114
def test_node_references_are_cr_delimited(self):
107
115
builder = GraphIndexBuilder(reference_lists=1)
108
builder.add_node('reference', ([], ), 'data')
109
builder.add_node('reference2', ([], ), 'data')
110
builder.add_node('key', (['reference', 'reference2'], ), 'data')
116
builder.add_node('reference', 'data', ([], ))
117
builder.add_node('reference2', 'data', ([], ))
118
builder.add_node('key', 'data', (['reference', 'reference2'], ))
111
119
stream = builder.finish()
112
120
contents = stream.read()
113
121
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\n"
175
183
builder = GraphIndexBuilder()
176
184
for bad_char in '\t\n\x0b\x0c\r\x00 ':
177
185
self.assertRaises(errors.BadIndexKey, builder.add_node,
178
'a%skey' % bad_char, (), 'data')
186
'a%skey' % bad_char, 'data')
179
187
self.assertRaises(errors.BadIndexKey, builder.add_node,
182
190
def test_add_node_bad_data(self):
183
191
builder = GraphIndexBuilder()
184
192
self.assertRaises(errors.BadIndexValue, builder.add_node, 'akey',
186
194
self.assertRaises(errors.BadIndexValue, builder.add_node, 'akey',
189
197
def test_add_node_bad_mismatched_ref_lists_length(self):
190
198
builder = GraphIndexBuilder()
191
199
self.assertRaises(errors.BadIndexValue, builder.add_node, 'akey',
193
201
builder = GraphIndexBuilder(reference_lists=1)
194
202
self.assertRaises(errors.BadIndexValue, builder.add_node, 'akey',
196
self.assertRaises(errors.BadIndexValue, builder.add_node, 'akey',
204
self.assertRaises(errors.BadIndexValue, builder.add_node, 'akey',
206
self.assertRaises(errors.BadIndexValue, builder.add_node, 'akey',
198
208
builder = GraphIndexBuilder(reference_lists=2)
199
209
self.assertRaises(errors.BadIndexValue, builder.add_node, 'akey',
201
self.assertRaises(errors.BadIndexValue, builder.add_node, 'akey',
203
self.assertRaises(errors.BadIndexValue, builder.add_node, 'akey',
204
([], [], []), 'data aa')
211
self.assertRaises(errors.BadIndexValue, builder.add_node, 'akey',
213
self.assertRaises(errors.BadIndexValue, builder.add_node, 'akey',
214
'data aa', ([], [], []))
206
216
def test_add_node_bad_key_in_reference_lists(self):
207
217
# first list, first key - trivial
208
218
builder = GraphIndexBuilder(reference_lists=1)
209
219
self.assertRaises(errors.BadIndexKey, builder.add_node, 'akey',
210
(['a key'], ), 'data aa')
220
'data aa', (['a key'], ))
211
221
# need to check more than the first key in the list
212
222
self.assertRaises(errors.BadIndexKey, builder.add_node, 'akey',
213
(['agoodkey', 'this is a bad key'], ), 'data aa')
223
'data aa', (['agoodkey', 'this is a bad key'], ))
214
224
# and if there is more than one list it should be getting checked
216
226
builder = GraphIndexBuilder(reference_lists=2)
217
227
self.assertRaises(errors.BadIndexKey, builder.add_node, 'akey',
218
([], ['a bad key']), 'data aa')
228
'data aa', ([], ['a bad key']))
220
230
def test_add_duplicate_key(self):
221
231
builder = GraphIndexBuilder()
222
builder.add_node('key', (), 'data')
232
builder.add_node('key', 'data')
223
233
self.assertRaises(errors.BadIndexDuplicateKey, builder.add_node, 'key',
226
236
def test_add_key_after_referencing_key(self):
227
237
builder = GraphIndexBuilder(reference_lists=1)
228
builder.add_node('key', (['reference'], ), 'data')
229
builder.add_node('reference', ([],), 'data')
238
builder.add_node('key', 'data', (['reference'], ))
239
builder.add_node('reference', 'data', ([],))
232
242
class TestGraphIndex(TestCaseWithMemoryTransport):
234
244
def make_index(self, ref_lists=0, nodes=[]):
235
245
builder = GraphIndexBuilder(ref_lists)
236
for node, references, value in nodes:
237
builder.add_node(node, references, value)
246
for node, value, references in nodes:
247
builder.add_node(node, value, references)
238
248
stream = builder.finish()
239
249
trans = self.get_transport()
240
250
trans.put_file('index', stream)
250
260
self.assertEqual([], list(index.iter_all_entries()))
252
262
def test_iter_all_entries_simple(self):
253
index = self.make_index(nodes=[('name', (), 'data')])
254
self.assertEqual([('name', (), 'data')],
263
index = self.make_index(nodes=[('name', 'data', ())])
264
self.assertEqual([('name', 'data')],
255
265
list(index.iter_all_entries()))
257
267
def test_iter_all_entries_references_resolved(self):
258
268
index = self.make_index(1, nodes=[
259
('name', (['ref'], ), 'data'),
260
('ref', ([], ), 'refdata')])
261
self.assertEqual(set([('name', (('ref',),), 'data'),
262
('ref', ((), ), 'refdata')]),
269
('name', 'data', (['ref'], )),
270
('ref', 'refdata', ([], ))])
271
self.assertEqual(set([('name', 'data', (('ref',),)),
272
('ref', 'refdata', ((), ))]),
263
273
set(index.iter_all_entries()))
265
275
def test_iteration_absent_skipped(self):
266
276
index = self.make_index(1, nodes=[
267
('name', (['ref'], ), 'data')])
268
self.assertEqual(set([('name', (('ref',),), 'data')]),
277
('name', 'data', (['ref'], ))])
278
self.assertEqual(set([('name', 'data', (('ref',),))]),
269
279
set(index.iter_all_entries()))
270
self.assertEqual(set([('name', (('ref',),), 'data')]),
280
self.assertEqual(set([('name', 'data', (('ref',),))]),
271
281
set(index.iter_entries(['name'])))
272
282
self.assertEqual([], list(index.iter_entries(['ref'])))
274
284
def test_iter_all_keys(self):
275
285
index = self.make_index(1, nodes=[
276
('name', (['ref'], ), 'data'),
277
('ref', ([], ), 'refdata')])
278
self.assertEqual(set([('name', (('ref',),), 'data'),
279
('ref', ((), ), 'refdata')]),
286
('name', 'data', (['ref'], )),
287
('ref', 'refdata', ([], ))])
288
self.assertEqual(set([('name', 'data', (('ref',),)),
289
('ref', 'refdata', ((), ))]),
280
290
set(index.iter_entries(['name', 'ref'])))
282
292
def test_iter_nothing_empty(self):
359
369
self.assertEqual([], list(index.iter_all_entries()))
361
371
def test_iter_all_entries_simple(self):
362
index1 = self.make_index('name', nodes=[('name', (), 'data')])
372
index1 = self.make_index('name', nodes=[('name', 'data', ())])
363
373
index = CombinedGraphIndex([index1])
364
self.assertEqual([('name', (), 'data')],
374
self.assertEqual([('name', 'data')],
365
375
list(index.iter_all_entries()))
367
377
def test_iter_all_entries_two_indices(self):
368
index1 = self.make_index('name1', nodes=[('name', (), 'data')])
369
index2 = self.make_index('name2', nodes=[('2', (), '')])
378
index1 = self.make_index('name1', nodes=[('name', 'data', ())])
379
index2 = self.make_index('name2', nodes=[('2', '', ())])
370
380
index = CombinedGraphIndex([index1, index2])
371
self.assertEqual([('name', (), 'data'),
381
self.assertEqual([('name', 'data'),
373
383
list(index.iter_all_entries()))
375
385
def test_iter_entries_two_indices_dup_key(self):
376
index1 = self.make_index('name1', nodes=[('name', (), 'data')])
377
index2 = self.make_index('name2', nodes=[('name', (), 'data')])
386
index1 = self.make_index('name1', nodes=[('name', 'data', ())])
387
index2 = self.make_index('name2', nodes=[('name', 'data', ())])
378
388
index = CombinedGraphIndex([index1, index2])
379
self.assertEqual([('name', (), 'data')],
389
self.assertEqual([('name', 'data')],
380
390
list(index.iter_entries(['name'])))
382
392
def test_iter_all_entries_two_indices_dup_key(self):
383
index1 = self.make_index('name1', nodes=[('name', (), 'data')])
384
index2 = self.make_index('name2', nodes=[('name', (), 'data')])
393
index1 = self.make_index('name1', nodes=[('name', 'data', ())])
394
index2 = self.make_index('name2', nodes=[('name', 'data', ())])
385
395
index = CombinedGraphIndex([index1, index2])
386
self.assertEqual([('name', (), 'data')],
396
self.assertEqual([('name', 'data')],
387
397
list(index.iter_all_entries()))
389
399
def test_iter_nothing_empty(self):
398
408
def test_iter_all_keys(self):
399
409
index1 = self.make_index('1', 1, nodes=[
400
('name', (['ref'], ), 'data')])
410
('name', 'data', (['ref'], ))])
401
411
index2 = self.make_index('2', 1, nodes=[
402
('ref', ([], ), 'refdata')])
412
('ref', 'refdata', ((), ))])
403
413
index = CombinedGraphIndex([index1, index2])
404
self.assertEqual(set([('name', (('ref',),), 'data'),
405
('ref', ((), ), 'refdata')]),
414
self.assertEqual(set([('name', 'data', (('ref', ), )),
415
('ref', 'refdata', ((), ))]),
406
416
set(index.iter_entries(['name', 'ref'])))
408
418
def test_iter_all_keys_dup_entry(self):
409
419
index1 = self.make_index('1', 1, nodes=[
410
('name', (['ref'], ), 'data'),
411
('ref', ([], ), 'refdata')])
420
('name', 'data', (['ref'], )),
421
('ref', 'refdata', ([], ))])
412
422
index2 = self.make_index('2', 1, nodes=[
413
('ref', ([], ), 'refdata')])
423
('ref', 'refdata', ([], ))])
414
424
index = CombinedGraphIndex([index1, index2])
415
self.assertEqual(set([('name', (('ref',),), 'data'),
416
('ref', ((), ), 'refdata')]),
425
self.assertEqual(set([('name', 'data', (('ref',),)),
426
('ref', 'refdata', ((), ))]),
417
427
set(index.iter_entries(['name', 'ref'])))
419
429
def test_iter_missing_entry_empty(self):
432
442
self.assertEqual([], list(index.iter_entries(['a'])))
434
444
def test_iter_entry_present_one_index_only(self):
435
index1 = self.make_index('1', nodes=[('key', (), '')])
445
index1 = self.make_index('1', nodes=[('key', '', ())])
436
446
index2 = self.make_index('2', nodes=[])
437
447
index = CombinedGraphIndex([index1, index2])
438
self.assertEqual([('key', (), '')],
448
self.assertEqual([('key', '')],
439
449
list(index.iter_entries(['key'])))
440
450
# and in the other direction
441
451
index = CombinedGraphIndex([index2, index1])
442
self.assertEqual([('key', (), '')],
452
self.assertEqual([('key', '')],
443
453
list(index.iter_entries(['key'])))
445
455
def test_validate_bad_child_index_errors(self):
464
474
def test_add_nodes(self):
465
475
index = self.make_index(1)
466
index.add_nodes([('name', ([],), 'data')])
467
index.add_nodes([('name2', ([],), ''), ('name3', (['r'],), '')])
476
index.add_nodes([('name', 'data', ([],))])
477
index.add_nodes([('name2', '', ([],)), ('name3', '', (['r'],))])
468
478
self.assertEqual(set([
469
('name', ((),), 'data'),
470
('name2', ((),), ''),
471
('name3', (('r',),), ''),
479
('name', 'data', ((),)),
480
('name2', '', ((),)),
481
('name3', '', (('r',),)),
472
482
]), set(index.iter_all_entries()))
474
484
def test_iter_all_entries_empty(self):
476
486
self.assertEqual([], list(index.iter_all_entries()))
478
488
def test_iter_all_entries_simple(self):
479
index = self.make_index(nodes=[('name', (), 'data')])
480
self.assertEqual([('name', (), 'data')],
489
index = self.make_index(nodes=[('name', 'data', ())])
490
self.assertEqual([('name', 'data')],
481
491
list(index.iter_all_entries()))
483
493
def test_iter_all_entries_references(self):
484
494
index = self.make_index(1, nodes=[
485
('name', (['ref'], ), 'data'),
486
('ref', ([], ), 'refdata')])
487
self.assertEqual(set([('name', (('ref',),), 'data'),
488
('ref', ((), ), 'refdata')]),
495
('name', 'data', (['ref'], )),
496
('ref', 'refdata', ([], ))])
497
self.assertEqual(set([('name', 'data', (('ref',),)),
498
('ref', 'refdata', ((), ))]),
489
499
set(index.iter_all_entries()))
491
501
def test_iteration_absent_skipped(self):
492
502
index = self.make_index(1, nodes=[
493
('name', (['ref'], ), 'data')])
494
self.assertEqual(set([('name', (('ref',),), 'data')]),
503
('name', 'data', (['ref'], ))])
504
self.assertEqual(set([('name', 'data', (('ref',),))]),
495
505
set(index.iter_all_entries()))
496
self.assertEqual(set([('name', (('ref',),), 'data')]),
506
self.assertEqual(set([('name', 'data', (('ref',),))]),
497
507
set(index.iter_entries(['name'])))
498
508
self.assertEqual([], list(index.iter_entries(['ref'])))
500
510
def test_iter_all_keys(self):
501
511
index = self.make_index(1, nodes=[
502
('name', (['ref'], ), 'data'),
503
('ref', ([], ), 'refdata')])
504
self.assertEqual(set([('name', (('ref',),), 'data'),
505
('ref', ((), ), 'refdata')]),
512
('name', 'data', (['ref'], )),
513
('ref', 'refdata', ([], ))])
514
self.assertEqual(set([('name', 'data', (('ref',),)),
515
('ref', 'refdata', ((), ))]),
506
516
set(index.iter_entries(['name', 'ref'])))
508
518
def test_iter_nothing_empty(self):