243
245
:return: An inventory resulting from the application.
245
247
format = self.format()
246
control = self.make_bzrdir('tree', format=format._matchingbzrdir)
248
control = self.make_controldir('tree', format=format._matchingcontroldir)
247
249
repo = format.initialize(control)
250
repo.start_write_group()
252
rev = revision.Revision('basis', timestamp=0, timezone=None,
253
message="", committer="foo@example.com")
254
basis.revision_id = 'basis'
255
create_texts_for_inv(repo, basis)
256
repo.add_revision('basis', rev, basis)
257
repo.commit_write_group()
259
repo.abort_write_group()
265
repo.start_write_group()
267
inv_sha1 = repo.add_inventory_by_delta('basis', delta,
270
repo.abort_write_group()
273
repo.commit_write_group()
250
with repo.lock_write(), repository.WriteGroup(repo):
251
rev = revision.Revision(
252
b'basis', timestamp=0, timezone=None, message="",
253
committer="foo@example.com")
254
basis.revision_id = b'basis'
255
create_texts_for_inv(repo, basis)
256
repo.add_revision(b'basis', rev, basis)
257
with repo.lock_write(), repository.WriteGroup(repo):
258
inv_sha1 = repo.add_inventory_by_delta(
259
b'basis', delta, b'result', [b'basis'])
276
260
# Fresh lock, reads disk again.
277
repo = repo.bzrdir.open_repository()
261
repo = repo.controldir.open_repository()
279
263
self.addCleanup(repo.unlock)
280
return repo.get_inventory('result')
264
return repo.get_inventory(b'result')
283
267
class TestInventoryUpdates(TestCase):
285
269
def test_creation_from_root_id(self):
286
270
# iff a root id is passed to the constructor, a root directory is made
287
inv = inventory.Inventory(root_id='tree-root')
271
inv = inventory.Inventory(root_id=b'tree-root')
288
272
self.assertNotEqual(None, inv.root)
289
self.assertEqual('tree-root', inv.root.file_id)
273
self.assertEqual(b'tree-root', inv.root.file_id)
291
275
def test_add_path_of_root(self):
292
276
# if no root id is given at creation time, there is no root directory
293
277
inv = inventory.Inventory(root_id=None)
294
278
self.assertIs(None, inv.root)
295
279
# add a root entry by adding its path
296
ie = inv.add_path("", "directory", "my-root")
297
ie.revision = 'test-rev'
298
self.assertEqual("my-root", ie.file_id)
280
ie = inv.add_path(u"", "directory", b"my-root")
281
ie.revision = b'test-rev'
282
self.assertEqual(b"my-root", ie.file_id)
299
283
self.assertIs(ie, inv.root)
301
285
def test_add_path(self):
302
inv = inventory.Inventory(root_id='tree_root')
303
ie = inv.add_path('hello', 'file', 'hello-id')
304
self.assertEqual('hello-id', ie.file_id)
286
inv = inventory.Inventory(root_id=b'tree_root')
287
ie = inv.add_path(u'hello', 'file', b'hello-id')
288
self.assertEqual(b'hello-id', ie.file_id)
305
289
self.assertEqual('file', ie.kind)
307
291
def test_copy(self):
308
292
"""Make sure copy() works and creates a deep copy."""
309
inv = inventory.Inventory(root_id='some-tree-root')
310
ie = inv.add_path('hello', 'file', 'hello-id')
293
inv = inventory.Inventory(root_id=b'some-tree-root')
294
ie = inv.add_path(u'hello', 'file', b'hello-id')
311
295
inv2 = inv.copy()
312
inv.root.file_id = 'some-new-root'
314
self.assertEqual('some-tree-root', inv2.root.file_id)
315
self.assertEqual('hello', inv2['hello-id'].name)
296
inv.root.file_id = b'some-new-root'
298
self.assertEqual(b'some-tree-root', inv2.root.file_id)
299
self.assertEqual(u'hello', inv2.get_entry(b'hello-id').name)
317
301
def test_copy_empty(self):
318
302
"""Make sure an empty inventory can be copied."""
390
374
def test_None_file_id(self):
391
375
inv = self.get_empty_inventory()
392
dir1 = inventory.InventoryDirectory(None, 'dir1', inv.root.file_id)
393
dir1.revision = 'result'
376
dir1 = inventory.InventoryDirectory(b'dirid', 'dir1', inv.root.file_id)
378
dir1.revision = b'result'
394
379
delta = [(None, u'dir1', None, dir1)]
395
380
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
398
383
def test_unicode_file_id(self):
399
384
inv = self.get_empty_inventory()
400
dir1 = inventory.InventoryDirectory(u'dirid', 'dir1', inv.root.file_id)
401
dir1.revision = 'result'
385
dir1 = inventory.InventoryDirectory(b'dirid', 'dir1', inv.root.file_id)
386
dir1.file_id = u'dirid'
387
dir1.revision = b'result'
402
388
delta = [(None, u'dir1', dir1.file_id, dir1)]
403
389
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
406
392
def test_repeated_file_id(self):
407
393
inv = self.get_empty_inventory()
408
file1 = inventory.InventoryFile('id', 'path1', inv.root.file_id)
409
file1.revision = 'result'
394
file1 = inventory.InventoryFile(b'id', 'path1', inv.root.file_id)
395
file1.revision = b'result'
410
396
file1.text_size = 0
397
file1.text_sha1 = b""
412
398
file2 = file1.copy()
413
399
file2.name = 'path2'
414
delta = [(None, u'path1', 'id', file1), (None, u'path2', 'id', file2)]
400
delta = [(None, u'path1', b'id', file1),
401
(None, u'path2', b'id', file2)]
415
402
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
418
405
def test_repeated_new_path(self):
419
406
inv = self.get_empty_inventory()
420
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
421
file1.revision = 'result'
407
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
408
file1.revision = b'result'
422
409
file1.text_size = 0
410
file1.text_sha1 = b""
424
411
file2 = file1.copy()
425
file2.file_id = 'id2'
426
delta = [(None, u'path', 'id1', file1), (None, u'path', 'id2', file2)]
412
file2.file_id = b'id2'
413
delta = [(None, u'path', b'id1', file1),
414
(None, u'path', b'id2', file2)]
427
415
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
430
418
def test_repeated_old_path(self):
431
419
inv = self.get_empty_inventory()
432
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
433
file1.revision = 'result'
420
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
421
file1.revision = b'result'
434
422
file1.text_size = 0
423
file1.text_sha1 = b""
436
424
# We can't *create* a source inventory with the same path, but
437
425
# a badly generated partial delta might claim the same source twice.
438
426
# This would be buggy in two ways: the path is repeated in the delta,
439
427
# And the path for one of the file ids doesn't match the source
440
428
# location. Alternatively, we could have a repeated fileid, but that
441
429
# is separately checked for.
442
file2 = inventory.InventoryFile('id2', 'path2', inv.root.file_id)
443
file2.revision = 'result'
430
file2 = inventory.InventoryFile(b'id2', 'path2', inv.root.file_id)
431
file2.revision = b'result'
444
432
file2.text_size = 0
433
file2.text_sha1 = b""
448
delta = [(u'path', None, 'id1', None), (u'path', None, 'id2', None)]
436
delta = [(u'path', None, b'id1', None), (u'path', None, b'id2', None)]
449
437
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
452
440
def test_mismatched_id_entry_id(self):
453
441
inv = self.get_empty_inventory()
454
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
455
file1.revision = 'result'
442
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
443
file1.revision = b'result'
456
444
file1.text_size = 0
458
delta = [(None, u'path', 'id', file1)]
445
file1.text_sha1 = b""
446
delta = [(None, u'path', b'id', file1)]
459
447
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
462
450
def test_mismatched_new_path_entry_None(self):
463
451
inv = self.get_empty_inventory()
464
delta = [(None, u'path', 'id', None)]
452
delta = [(None, u'path', b'id', None)]
465
453
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
468
456
def test_mismatched_new_path_None_entry(self):
469
457
inv = self.get_empty_inventory()
470
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
471
file1.revision = 'result'
458
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
459
file1.revision = b'result'
472
460
file1.text_size = 0
474
delta = [(u"path", None, 'id1', file1)]
461
file1.text_sha1 = b""
462
delta = [(u"path", None, b'id1', file1)]
475
463
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
478
466
def test_parent_is_not_directory(self):
479
467
inv = self.get_empty_inventory()
480
file1 = inventory.InventoryFile('id1', 'path', inv.root.file_id)
481
file1.revision = 'result'
468
file1 = inventory.InventoryFile(b'id1', 'path', inv.root.file_id)
469
file1.revision = b'result'
482
470
file1.text_size = 0
484
file2 = inventory.InventoryFile('id2', 'path2', 'id1')
485
file2.revision = 'result'
471
file1.text_sha1 = b""
472
file2 = inventory.InventoryFile(b'id2', 'path2', b'id1')
473
file2.revision = b'result'
486
474
file2.text_size = 0
475
file2.text_sha1 = b""
489
delta = [(None, u'path/path2', 'id2', file2)]
477
delta = [(None, u'path/path2', b'id2', file2)]
490
478
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
493
481
def test_parent_is_missing(self):
494
482
inv = self.get_empty_inventory()
495
file2 = inventory.InventoryFile('id2', 'path2', 'missingparent')
496
file2.revision = 'result'
483
file2 = inventory.InventoryFile(b'id2', 'path2', b'missingparent')
484
file2.revision = b'result'
497
485
file2.text_size = 0
499
delta = [(None, u'path/path2', 'id2', file2)]
486
file2.text_sha1 = b""
487
delta = [(None, u'path/path2', b'id2', file2)]
500
488
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
503
491
def test_new_parent_path_has_wrong_id(self):
504
492
inv = self.get_empty_inventory()
505
parent1 = inventory.InventoryDirectory('p-1', 'dir', inv.root.file_id)
506
parent1.revision = 'result'
507
parent2 = inventory.InventoryDirectory('p-2', 'dir2', inv.root.file_id)
508
parent2.revision = 'result'
509
file1 = inventory.InventoryFile('id', 'path', 'p-2')
510
file1.revision = 'result'
493
parent1 = inventory.InventoryDirectory(b'p-1', 'dir', inv.root.file_id)
494
parent1.revision = b'result'
495
parent2 = inventory.InventoryDirectory(
496
b'p-2', 'dir2', inv.root.file_id)
497
parent2.revision = b'result'
498
file1 = inventory.InventoryFile(b'id', 'path', b'p-2')
499
file1.revision = b'result'
511
500
file1.text_size = 0
501
file1.text_sha1 = b""
515
504
# This delta claims that file1 is at dir/path, but actually its at
516
505
# dir2/path if you follow the inventory parent structure.
517
delta = [(None, u'dir/path', 'id', file1)]
506
delta = [(None, u'dir/path', b'id', file1)]
518
507
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
521
510
def test_old_parent_path_is_wrong(self):
522
511
inv = self.get_empty_inventory()
523
parent1 = inventory.InventoryDirectory('p-1', 'dir', inv.root.file_id)
524
parent1.revision = 'result'
525
parent2 = inventory.InventoryDirectory('p-2', 'dir2', inv.root.file_id)
526
parent2.revision = 'result'
527
file1 = inventory.InventoryFile('id', 'path', 'p-2')
528
file1.revision = 'result'
512
parent1 = inventory.InventoryDirectory(b'p-1', 'dir', inv.root.file_id)
513
parent1.revision = b'result'
514
parent2 = inventory.InventoryDirectory(
515
b'p-2', 'dir2', inv.root.file_id)
516
parent2.revision = b'result'
517
file1 = inventory.InventoryFile(b'id', 'path', b'p-2')
518
file1.revision = b'result'
529
519
file1.text_size = 0
520
file1.text_sha1 = b""
534
524
# This delta claims that file1 was at dir/path, but actually it was at
535
525
# dir2/path if you follow the inventory parent structure.
536
delta = [(u'dir/path', None, 'id', None)]
526
delta = [(u'dir/path', None, b'id', None)]
537
527
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
540
530
def test_old_parent_path_is_for_other_id(self):
541
531
inv = self.get_empty_inventory()
542
parent1 = inventory.InventoryDirectory('p-1', 'dir', inv.root.file_id)
543
parent1.revision = 'result'
544
parent2 = inventory.InventoryDirectory('p-2', 'dir2', inv.root.file_id)
545
parent2.revision = 'result'
546
file1 = inventory.InventoryFile('id', 'path', 'p-2')
547
file1.revision = 'result'
532
parent1 = inventory.InventoryDirectory(b'p-1', 'dir', inv.root.file_id)
533
parent1.revision = b'result'
534
parent2 = inventory.InventoryDirectory(
535
b'p-2', 'dir2', inv.root.file_id)
536
parent2.revision = b'result'
537
file1 = inventory.InventoryFile(b'id', 'path', b'p-2')
538
file1.revision = b'result'
548
539
file1.text_size = 0
550
file2 = inventory.InventoryFile('id2', 'path', 'p-1')
551
file2.revision = 'result'
540
file1.text_sha1 = b""
541
file2 = inventory.InventoryFile(b'id2', 'path', b'p-1')
542
file2.revision = b'result'
552
543
file2.text_size = 0
544
file2.text_sha1 = b""
558
549
# This delta claims that file1 was at dir/path, but actually it was at
559
550
# dir2/path if you follow the inventory parent structure. At dir/path
560
551
# is another entry we should not delete.
561
delta = [(u'dir/path', None, 'id', None)]
552
delta = [(u'dir/path', None, b'id', None)]
562
553
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
565
556
def test_add_existing_id_new_path(self):
566
557
inv = self.get_empty_inventory()
567
parent1 = inventory.InventoryDirectory('p-1', 'dir1', inv.root.file_id)
568
parent1.revision = 'result'
569
parent2 = inventory.InventoryDirectory('p-1', 'dir2', inv.root.file_id)
570
parent2.revision = 'result'
558
parent1 = inventory.InventoryDirectory(
559
b'p-1', 'dir1', inv.root.file_id)
560
parent1.revision = b'result'
561
parent2 = inventory.InventoryDirectory(
562
b'p-1', 'dir2', inv.root.file_id)
563
parent2.revision = b'result'
572
delta = [(None, u'dir2', 'p-1', parent2)]
565
delta = [(None, u'dir2', b'p-1', parent2)]
573
566
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
576
569
def test_add_new_id_existing_path(self):
577
570
inv = self.get_empty_inventory()
578
parent1 = inventory.InventoryDirectory('p-1', 'dir1', inv.root.file_id)
579
parent1.revision = 'result'
580
parent2 = inventory.InventoryDirectory('p-2', 'dir1', inv.root.file_id)
581
parent2.revision = 'result'
571
parent1 = inventory.InventoryDirectory(
572
b'p-1', 'dir1', inv.root.file_id)
573
parent1.revision = b'result'
574
parent2 = inventory.InventoryDirectory(
575
b'p-2', 'dir1', inv.root.file_id)
576
parent2.revision = b'result'
583
delta = [(None, u'dir1', 'p-2', parent2)]
578
delta = [(None, u'dir1', b'p-2', parent2)]
584
579
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
587
582
def test_remove_dir_leaving_dangling_child(self):
588
583
inv = self.get_empty_inventory()
589
dir1 = inventory.InventoryDirectory('p-1', 'dir1', inv.root.file_id)
590
dir1.revision = 'result'
591
dir2 = inventory.InventoryDirectory('p-2', 'child1', 'p-1')
592
dir2.revision = 'result'
593
dir3 = inventory.InventoryDirectory('p-3', 'child2', 'p-1')
594
dir3.revision = 'result'
584
dir1 = inventory.InventoryDirectory(b'p-1', 'dir1', inv.root.file_id)
585
dir1.revision = b'result'
586
dir2 = inventory.InventoryDirectory(b'p-2', 'child1', b'p-1')
587
dir2.revision = b'result'
588
dir3 = inventory.InventoryDirectory(b'p-3', 'child2', b'p-1')
589
dir3.revision = b'result'
598
delta = [(u'dir1', None, 'p-1', None),
599
(u'dir1/child2', None, 'p-3', None)]
593
delta = [(u'dir1', None, b'p-1', None),
594
(u'dir1/child2', None, b'p-3', None)]
600
595
self.assertRaises(errors.InconsistentDelta, self.apply_delta, self,
603
598
def test_add_file(self):
604
599
inv = self.get_empty_inventory()
605
file1 = inventory.InventoryFile('file-id', 'path', inv.root.file_id)
606
file1.revision = 'result'
600
file1 = inventory.InventoryFile(b'file-id', 'path', inv.root.file_id)
601
file1.revision = b'result'
607
602
file1.text_size = 0
609
delta = [(None, u'path', 'file-id', file1)]
603
file1.text_sha1 = b''
604
delta = [(None, u'path', b'file-id', file1)]
610
605
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
611
self.assertEqual('file-id', res_inv['file-id'].file_id)
606
self.assertEqual(b'file-id', res_inv.get_entry(b'file-id').file_id)
613
608
def test_remove_file(self):
614
609
inv = self.get_empty_inventory()
615
file1 = inventory.InventoryFile('file-id', 'path', inv.root.file_id)
616
file1.revision = 'result'
610
file1 = inventory.InventoryFile(b'file-id', 'path', inv.root.file_id)
611
file1.revision = b'result'
617
612
file1.text_size = 0
613
file1.text_sha1 = b''
620
delta = [(u'path', None, 'file-id', None)]
615
delta = [(u'path', None, b'file-id', None)]
621
616
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
622
617
self.assertEqual(None, res_inv.path2id('path'))
623
self.assertRaises(errors.NoSuchId, res_inv.id2path, 'file-id')
618
self.assertRaises(errors.NoSuchId, res_inv.id2path, b'file-id')
625
620
def test_rename_file(self):
626
621
inv = self.get_empty_inventory()
627
622
file1 = self.make_file_ie(name='path', parent_id=inv.root.file_id)
629
624
file2 = self.make_file_ie(name='path2', parent_id=inv.root.file_id)
630
delta = [(u'path', 'path2', 'file-id', file2)]
625
delta = [(u'path', 'path2', b'file-id', file2)]
631
626
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
632
627
self.assertEqual(None, res_inv.path2id('path'))
633
self.assertEqual('file-id', res_inv.path2id('path2'))
628
self.assertEqual(b'file-id', res_inv.path2id('path2'))
635
630
def test_replaced_at_new_path(self):
636
631
inv = self.get_empty_inventory()
637
file1 = self.make_file_ie(file_id='id1', parent_id=inv.root.file_id)
632
file1 = self.make_file_ie(file_id=b'id1', parent_id=inv.root.file_id)
639
file2 = self.make_file_ie(file_id='id2', parent_id=inv.root.file_id)
640
delta = [(u'name', None, 'id1', None),
641
(None, u'name', 'id2', file2)]
634
file2 = self.make_file_ie(file_id=b'id2', parent_id=inv.root.file_id)
635
delta = [(u'name', None, b'id1', None),
636
(None, u'name', b'id2', file2)]
642
637
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
643
self.assertEqual('id2', res_inv.path2id('name'))
638
self.assertEqual(b'id2', res_inv.path2id('name'))
645
640
def test_rename_dir(self):
646
641
inv = self.get_empty_inventory()
647
dir1 = inventory.InventoryDirectory('dir-id', 'dir1', inv.root.file_id)
648
dir1.revision = 'basis'
649
file1 = self.make_file_ie(parent_id='dir-id')
642
dir1 = inventory.InventoryDirectory(
643
b'dir-id', 'dir1', inv.root.file_id)
644
dir1.revision = b'basis'
645
file1 = self.make_file_ie(parent_id=b'dir-id')
652
dir2 = inventory.InventoryDirectory('dir-id', 'dir2', inv.root.file_id)
653
dir2.revision = 'result'
654
delta = [('dir1', 'dir2', 'dir-id', dir2)]
648
dir2 = inventory.InventoryDirectory(
649
b'dir-id', 'dir2', inv.root.file_id)
650
dir2.revision = b'result'
651
delta = [('dir1', 'dir2', b'dir-id', dir2)]
655
652
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
656
653
# The file should be accessible under the new path
657
self.assertEqual('file-id', res_inv.path2id('dir2/name'))
654
self.assertEqual(b'file-id', res_inv.path2id('dir2/name'))
659
656
def test_renamed_dir_with_renamed_child(self):
660
657
inv = self.get_empty_inventory()
661
dir1 = inventory.InventoryDirectory('dir-id', 'dir1', inv.root.file_id)
662
dir1.revision = 'basis'
663
file1 = self.make_file_ie('file-id-1', 'name1', parent_id='dir-id')
664
file2 = self.make_file_ie('file-id-2', 'name2', parent_id='dir-id')
658
dir1 = inventory.InventoryDirectory(
659
b'dir-id', 'dir1', inv.root.file_id)
660
dir1.revision = b'basis'
661
file1 = self.make_file_ie(b'file-id-1', 'name1', parent_id=b'dir-id')
662
file2 = self.make_file_ie(b'file-id-2', 'name2', parent_id=b'dir-id')
668
dir2 = inventory.InventoryDirectory('dir-id', 'dir2', inv.root.file_id)
669
dir2.revision = 'result'
670
file2b = self.make_file_ie('file-id-2', 'name2', inv.root.file_id)
671
delta = [('dir1', 'dir2', 'dir-id', dir2),
672
('dir1/name2', 'name2', 'file-id-2', file2b)]
666
dir2 = inventory.InventoryDirectory(
667
b'dir-id', 'dir2', inv.root.file_id)
668
dir2.revision = b'result'
669
file2b = self.make_file_ie(b'file-id-2', 'name2', inv.root.file_id)
670
delta = [('dir1', 'dir2', b'dir-id', dir2),
671
('dir1/name2', 'name2', b'file-id-2', file2b)]
673
672
res_inv = self.apply_delta(self, inv, delta, invalid_delta=False)
674
673
# The file should be accessible under the new path
675
self.assertEqual('file-id-1', res_inv.path2id('dir2/name1'))
674
self.assertEqual(b'file-id-1', res_inv.path2id('dir2/name1'))
676
675
self.assertEqual(None, res_inv.path2id('dir2/name2'))
677
self.assertEqual('file-id-2', res_inv.path2id('name2'))
676
self.assertEqual(b'file-id-2', res_inv.path2id('name2'))
679
678
def test_is_root(self):
680
679
"""Ensure our root-checking code is accurate."""
681
inv = inventory.Inventory('TREE_ROOT')
682
self.assertTrue(inv.is_root('TREE_ROOT'))
683
self.assertFalse(inv.is_root('booga'))
684
inv.root.file_id = 'booga'
685
self.assertFalse(inv.is_root('TREE_ROOT'))
686
self.assertTrue(inv.is_root('booga'))
680
inv = inventory.Inventory(b'TREE_ROOT')
681
self.assertTrue(inv.is_root(b'TREE_ROOT'))
682
self.assertFalse(inv.is_root(b'booga'))
683
inv.root.file_id = b'booga'
684
self.assertFalse(inv.is_root(b'TREE_ROOT'))
685
self.assertTrue(inv.is_root(b'booga'))
687
686
# works properly even if no root is set
689
self.assertFalse(inv.is_root('TREE_ROOT'))
690
self.assertFalse(inv.is_root('booga'))
688
self.assertFalse(inv.is_root(b'TREE_ROOT'))
689
self.assertFalse(inv.is_root(b'booga'))
692
691
def test_entries_for_empty_inventory(self):
693
692
"""Test that entries() will not fail for an empty inventory"""
844
855
def read_bytes(self, chk_bytes, key):
845
856
stream = chk_bytes.get_record_stream([key], 'unordered', True)
846
return stream.next().get_bytes_as("fulltext")
857
return next(stream).get_bytes_as("fulltext")
848
859
def test_deserialise_gives_CHKInventory(self):
849
860
inv = Inventory()
850
inv.revision_id = "revid"
851
inv.root.revision = "rootrev"
861
inv.revision_id = b"revid"
862
inv.root.revision = b"rootrev"
852
863
chk_bytes = self.get_chk_bytes()
853
864
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
854
bytes = ''.join(chk_inv.to_lines())
855
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
856
self.assertEqual("revid", new_inv.revision_id)
865
lines = chk_inv.to_lines()
866
new_inv = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
867
self.assertEqual(b"revid", new_inv.revision_id)
857
868
self.assertEqual("directory", new_inv.root.kind)
858
869
self.assertEqual(inv.root.file_id, new_inv.root.file_id)
859
870
self.assertEqual(inv.root.parent_id, new_inv.root.parent_id)
860
871
self.assertEqual(inv.root.name, new_inv.root.name)
861
self.assertEqual("rootrev", new_inv.root.revision)
862
self.assertEqual('plain', new_inv._search_key_name)
872
self.assertEqual(b"rootrev", new_inv.root.revision)
873
self.assertEqual(b'plain', new_inv._search_key_name)
864
875
def test_deserialise_wrong_revid(self):
865
876
inv = Inventory()
866
inv.revision_id = "revid"
867
inv.root.revision = "rootrev"
877
inv.revision_id = b"revid"
878
inv.root.revision = b"rootrev"
868
879
chk_bytes = self.get_chk_bytes()
869
880
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
870
bytes = ''.join(chk_inv.to_lines())
881
lines = chk_inv.to_lines()
871
882
self.assertRaises(ValueError, CHKInventory.deserialise, chk_bytes,
874
885
def test_captures_rev_root_byid(self):
875
886
inv = Inventory()
876
inv.revision_id = "foo"
877
inv.root.revision = "bar"
887
inv.revision_id = b"foo"
888
inv.root.revision = b"bar"
878
889
chk_bytes = self.get_chk_bytes()
879
890
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
880
891
lines = chk_inv.to_lines()
881
892
self.assertEqual([
883
'revision_id: foo\n',
884
'root_id: TREE_ROOT\n',
885
'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
886
'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
894
b'revision_id: foo\n',
895
b'root_id: TREE_ROOT\n',
896
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
897
b'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
888
chk_inv = CHKInventory.deserialise(chk_bytes, ''.join(lines), ('foo',))
889
self.assertEqual('plain', chk_inv._search_key_name)
899
chk_inv = CHKInventory.deserialise(
900
chk_bytes, lines, (b'foo',))
901
self.assertEqual(b'plain', chk_inv._search_key_name)
891
903
def test_captures_parent_id_basename_index(self):
892
904
inv = Inventory()
893
inv.revision_id = "foo"
894
inv.root.revision = "bar"
905
inv.revision_id = b"foo"
906
inv.root.revision = b"bar"
895
907
chk_bytes = self.get_chk_bytes()
896
908
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
897
909
lines = chk_inv.to_lines()
898
910
self.assertEqual([
900
'revision_id: foo\n',
901
'root_id: TREE_ROOT\n',
902
'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
903
'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
912
b'revision_id: foo\n',
913
b'root_id: TREE_ROOT\n',
914
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
915
b'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
905
chk_inv = CHKInventory.deserialise(chk_bytes, ''.join(lines), ('foo',))
906
self.assertEqual('plain', chk_inv._search_key_name)
917
chk_inv = CHKInventory.deserialise(
918
chk_bytes, lines, (b'foo',))
919
self.assertEqual(b'plain', chk_inv._search_key_name)
908
921
def test_captures_search_key_name(self):
909
922
inv = Inventory()
910
inv.revision_id = "foo"
911
inv.root.revision = "bar"
923
inv.revision_id = b"foo"
924
inv.root.revision = b"bar"
912
925
chk_bytes = self.get_chk_bytes()
913
926
chk_inv = CHKInventory.from_inventory(chk_bytes, inv,
914
search_key_name='hash-16-way')
927
search_key_name=b'hash-16-way')
915
928
lines = chk_inv.to_lines()
916
929
self.assertEqual([
918
'search_key_name: hash-16-way\n',
919
'root_id: TREE_ROOT\n',
920
'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
921
'revision_id: foo\n',
922
'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
931
b'search_key_name: hash-16-way\n',
932
b'root_id: TREE_ROOT\n',
933
b'parent_id_basename_to_file_id: sha1:eb23f0ad4b07f48e88c76d4c94292be57fb2785f\n',
934
b'revision_id: foo\n',
935
b'id_to_entry: sha1:debfe920f1f10e7929260f0534ac9a24d7aabbb4\n',
924
chk_inv = CHKInventory.deserialise(chk_bytes, ''.join(lines), ('foo',))
925
self.assertEqual('hash-16-way', chk_inv._search_key_name)
937
chk_inv = CHKInventory.deserialise(
938
chk_bytes, lines, (b'foo',))
939
self.assertEqual(b'hash-16-way', chk_inv._search_key_name)
927
941
def test_directory_children_on_demand(self):
928
942
inv = Inventory()
929
inv.revision_id = "revid"
930
inv.root.revision = "rootrev"
931
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
932
inv["fileid"].revision = "filerev"
933
inv["fileid"].executable = True
934
inv["fileid"].text_sha1 = "ffff"
935
inv["fileid"].text_size = 1
943
inv.revision_id = b"revid"
944
inv.root.revision = b"rootrev"
945
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
946
inv.get_entry(b"fileid").revision = b"filerev"
947
inv.get_entry(b"fileid").executable = True
948
inv.get_entry(b"fileid").text_sha1 = b"ffff"
949
inv.get_entry(b"fileid").text_size = 1
936
950
chk_bytes = self.get_chk_bytes()
937
951
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
938
bytes = ''.join(chk_inv.to_lines())
939
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
940
root_entry = new_inv[inv.root.file_id]
952
lines = chk_inv.to_lines()
953
new_inv = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
954
root_entry = new_inv.get_entry(inv.root.file_id)
941
955
self.assertEqual(None, root_entry._children)
942
self.assertEqual(['file'], root_entry.children.keys())
943
file_direct = new_inv["fileid"]
956
self.assertEqual({'file'}, set(root_entry.children))
957
file_direct = new_inv.get_entry(b"fileid")
944
958
file_found = root_entry.children['file']
945
959
self.assertEqual(file_direct.kind, file_found.kind)
946
960
self.assertEqual(file_direct.file_id, file_found.file_id)
966
980
self.assertEqual(120, p_id_basename._root_node.maximum_size)
967
981
self.assertEqual(2, p_id_basename._root_node._key_width)
969
def test___iter__(self):
983
def test_iter_all_ids(self):
970
984
inv = Inventory()
971
inv.revision_id = "revid"
972
inv.root.revision = "rootrev"
973
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
974
inv["fileid"].revision = "filerev"
975
inv["fileid"].executable = True
976
inv["fileid"].text_sha1 = "ffff"
977
inv["fileid"].text_size = 1
985
inv.revision_id = b"revid"
986
inv.root.revision = b"rootrev"
987
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
988
inv.get_entry(b"fileid").revision = b"filerev"
989
inv.get_entry(b"fileid").executable = True
990
inv.get_entry(b"fileid").text_sha1 = b"ffff"
991
inv.get_entry(b"fileid").text_size = 1
978
992
chk_bytes = self.get_chk_bytes()
979
993
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
980
bytes = ''.join(chk_inv.to_lines())
981
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
982
fileids = list(new_inv.__iter__())
984
self.assertEqual([inv.root.file_id, "fileid"], fileids)
994
lines = chk_inv.to_lines()
995
new_inv = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
996
fileids = sorted(new_inv.iter_all_ids())
997
self.assertEqual([inv.root.file_id, b"fileid"], fileids)
986
999
def test__len__(self):
987
1000
inv = Inventory()
988
inv.revision_id = "revid"
989
inv.root.revision = "rootrev"
990
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
991
inv["fileid"].revision = "filerev"
992
inv["fileid"].executable = True
993
inv["fileid"].text_sha1 = "ffff"
994
inv["fileid"].text_size = 1
1001
inv.revision_id = b"revid"
1002
inv.root.revision = b"rootrev"
1003
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1004
inv.get_entry(b"fileid").revision = b"filerev"
1005
inv.get_entry(b"fileid").executable = True
1006
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1007
inv.get_entry(b"fileid").text_size = 1
995
1008
chk_bytes = self.get_chk_bytes()
996
1009
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
997
1010
self.assertEqual(2, len(chk_inv))
999
def test___getitem__(self):
1012
def test_get_entry(self):
1000
1013
inv = Inventory()
1001
inv.revision_id = "revid"
1002
inv.root.revision = "rootrev"
1003
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
1004
inv["fileid"].revision = "filerev"
1005
inv["fileid"].executable = True
1006
inv["fileid"].text_sha1 = "ffff"
1007
inv["fileid"].text_size = 1
1014
inv.revision_id = b"revid"
1015
inv.root.revision = b"rootrev"
1016
inv.add(InventoryFile(b"fileid", u"file", inv.root.file_id))
1017
inv.get_entry(b"fileid").revision = b"filerev"
1018
inv.get_entry(b"fileid").executable = True
1019
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1020
inv.get_entry(b"fileid").text_size = 1
1008
1021
chk_bytes = self.get_chk_bytes()
1009
1022
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1010
bytes = ''.join(chk_inv.to_lines())
1011
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1012
root_entry = new_inv[inv.root.file_id]
1013
file_entry = new_inv["fileid"]
1023
lines = chk_inv.to_lines()
1024
new_inv = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
1025
root_entry = new_inv.get_entry(inv.root.file_id)
1026
file_entry = new_inv.get_entry(b"fileid")
1014
1027
self.assertEqual("directory", root_entry.kind)
1015
1028
self.assertEqual(inv.root.file_id, root_entry.file_id)
1016
1029
self.assertEqual(inv.root.parent_id, root_entry.parent_id)
1017
1030
self.assertEqual(inv.root.name, root_entry.name)
1018
self.assertEqual("rootrev", root_entry.revision)
1031
self.assertEqual(b"rootrev", root_entry.revision)
1019
1032
self.assertEqual("file", file_entry.kind)
1020
self.assertEqual("fileid", file_entry.file_id)
1033
self.assertEqual(b"fileid", file_entry.file_id)
1021
1034
self.assertEqual(inv.root.file_id, file_entry.parent_id)
1022
self.assertEqual("file", file_entry.name)
1023
self.assertEqual("filerev", file_entry.revision)
1024
self.assertEqual("ffff", file_entry.text_sha1)
1035
self.assertEqual(u"file", file_entry.name)
1036
self.assertEqual(b"filerev", file_entry.revision)
1037
self.assertEqual(b"ffff", file_entry.text_sha1)
1025
1038
self.assertEqual(1, file_entry.text_size)
1026
1039
self.assertEqual(True, file_entry.executable)
1027
self.assertRaises(errors.NoSuchId, new_inv.__getitem__, 'missing')
1040
self.assertRaises(errors.NoSuchId, new_inv.get_entry, 'missing')
1029
1042
def test_has_id_true(self):
1030
1043
inv = Inventory()
1031
inv.revision_id = "revid"
1032
inv.root.revision = "rootrev"
1033
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
1034
inv["fileid"].revision = "filerev"
1035
inv["fileid"].executable = True
1036
inv["fileid"].text_sha1 = "ffff"
1037
inv["fileid"].text_size = 1
1044
inv.revision_id = b"revid"
1045
inv.root.revision = b"rootrev"
1046
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1047
inv.get_entry(b"fileid").revision = b"filerev"
1048
inv.get_entry(b"fileid").executable = True
1049
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1050
inv.get_entry(b"fileid").text_size = 1
1038
1051
chk_bytes = self.get_chk_bytes()
1039
1052
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1040
self.assertTrue(chk_inv.has_id('fileid'))
1053
self.assertTrue(chk_inv.has_id(b'fileid'))
1041
1054
self.assertTrue(chk_inv.has_id(inv.root.file_id))
1043
1056
def test_has_id_not(self):
1044
1057
inv = Inventory()
1045
inv.revision_id = "revid"
1046
inv.root.revision = "rootrev"
1058
inv.revision_id = b"revid"
1059
inv.root.revision = b"rootrev"
1047
1060
chk_bytes = self.get_chk_bytes()
1048
1061
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1049
self.assertFalse(chk_inv.has_id('fileid'))
1062
self.assertFalse(chk_inv.has_id(b'fileid'))
1051
1064
def test_id2path(self):
1052
1065
inv = Inventory()
1053
inv.revision_id = "revid"
1054
inv.root.revision = "rootrev"
1055
direntry = InventoryDirectory("dirid", "dir", inv.root.file_id)
1056
fileentry = InventoryFile("fileid", "file", "dirid")
1066
inv.revision_id = b"revid"
1067
inv.root.revision = b"rootrev"
1068
direntry = InventoryDirectory(b"dirid", "dir", inv.root.file_id)
1069
fileentry = InventoryFile(b"fileid", "file", b"dirid")
1057
1070
inv.add(direntry)
1058
1071
inv.add(fileentry)
1059
inv["fileid"].revision = "filerev"
1060
inv["fileid"].executable = True
1061
inv["fileid"].text_sha1 = "ffff"
1062
inv["fileid"].text_size = 1
1063
inv["dirid"].revision = "filerev"
1072
inv.get_entry(b"fileid").revision = b"filerev"
1073
inv.get_entry(b"fileid").executable = True
1074
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1075
inv.get_entry(b"fileid").text_size = 1
1076
inv.get_entry(b"dirid").revision = b"filerev"
1064
1077
chk_bytes = self.get_chk_bytes()
1065
1078
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1066
bytes = ''.join(chk_inv.to_lines())
1067
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1079
lines = chk_inv.to_lines()
1080
new_inv = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
1068
1081
self.assertEqual('', new_inv.id2path(inv.root.file_id))
1069
self.assertEqual('dir', new_inv.id2path('dirid'))
1070
self.assertEqual('dir/file', new_inv.id2path('fileid'))
1082
self.assertEqual('dir', new_inv.id2path(b'dirid'))
1083
self.assertEqual('dir/file', new_inv.id2path(b'fileid'))
1072
1085
def test_path2id(self):
1073
1086
inv = Inventory()
1074
inv.revision_id = "revid"
1075
inv.root.revision = "rootrev"
1076
direntry = InventoryDirectory("dirid", "dir", inv.root.file_id)
1077
fileentry = InventoryFile("fileid", "file", "dirid")
1087
inv.revision_id = b"revid"
1088
inv.root.revision = b"rootrev"
1089
direntry = InventoryDirectory(b"dirid", "dir", inv.root.file_id)
1090
fileentry = InventoryFile(b"fileid", "file", b"dirid")
1078
1091
inv.add(direntry)
1079
1092
inv.add(fileentry)
1080
inv["fileid"].revision = "filerev"
1081
inv["fileid"].executable = True
1082
inv["fileid"].text_sha1 = "ffff"
1083
inv["fileid"].text_size = 1
1084
inv["dirid"].revision = "filerev"
1093
inv.get_entry(b"fileid").revision = b"filerev"
1094
inv.get_entry(b"fileid").executable = True
1095
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1096
inv.get_entry(b"fileid").text_size = 1
1097
inv.get_entry(b"dirid").revision = b"filerev"
1085
1098
chk_bytes = self.get_chk_bytes()
1086
1099
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1087
bytes = ''.join(chk_inv.to_lines())
1088
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1100
lines = chk_inv.to_lines()
1101
new_inv = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
1089
1102
self.assertEqual(inv.root.file_id, new_inv.path2id(''))
1090
self.assertEqual('dirid', new_inv.path2id('dir'))
1091
self.assertEqual('fileid', new_inv.path2id('dir/file'))
1103
self.assertEqual(b'dirid', new_inv.path2id('dir'))
1104
self.assertEqual(b'fileid', new_inv.path2id('dir/file'))
1093
1106
def test_create_by_apply_delta_sets_root(self):
1094
1107
inv = Inventory()
1095
inv.revision_id = "revid"
1108
inv.root.revision = b"myrootrev"
1109
inv.revision_id = b"revid"
1096
1110
chk_bytes = self.get_chk_bytes()
1097
1111
base_inv = CHKInventory.from_inventory(chk_bytes, inv)
1098
inv.add_path("", "directory", "myrootid", None)
1099
inv.revision_id = "expectedid"
1112
inv.add_path("", "directory", b"myrootid", None)
1113
inv.revision_id = b"expectedid"
1114
inv.root.revision = b"myrootrev"
1100
1115
reference_inv = CHKInventory.from_inventory(chk_bytes, inv)
1101
1116
delta = [("", None, base_inv.root.file_id, None),
1102
(None, "", "myrootid", inv.root)]
1103
new_inv = base_inv.create_by_apply_delta(delta, "expectedid")
1104
self.assertEquals(reference_inv.root, new_inv.root)
1117
(None, "", b"myrootid", inv.root)]
1118
new_inv = base_inv.create_by_apply_delta(delta, b"expectedid")
1119
self.assertEqual(reference_inv.root, new_inv.root)
1106
1121
def test_create_by_apply_delta_empty_add_child(self):
1107
1122
inv = Inventory()
1108
inv.revision_id = "revid"
1109
inv.root.revision = "rootrev"
1123
inv.revision_id = b"revid"
1124
inv.root.revision = b"rootrev"
1110
1125
chk_bytes = self.get_chk_bytes()
1111
1126
base_inv = CHKInventory.from_inventory(chk_bytes, inv)
1112
a_entry = InventoryFile("A-id", "A", inv.root.file_id)
1113
a_entry.revision = "filerev"
1127
a_entry = InventoryFile(b"A-id", "A", inv.root.file_id)
1128
a_entry.revision = b"filerev"
1114
1129
a_entry.executable = True
1115
a_entry.text_sha1 = "ffff"
1130
a_entry.text_sha1 = b"ffff"
1116
1131
a_entry.text_size = 1
1117
1132
inv.add(a_entry)
1118
inv.revision_id = "expectedid"
1133
inv.revision_id = b"expectedid"
1119
1134
reference_inv = CHKInventory.from_inventory(chk_bytes, inv)
1120
delta = [(None, "A", "A-id", a_entry)]
1121
new_inv = base_inv.create_by_apply_delta(delta, "expectedid")
1135
delta = [(None, "A", b"A-id", a_entry)]
1136
new_inv = base_inv.create_by_apply_delta(delta, b"expectedid")
1122
1137
# new_inv should be the same as reference_inv.
1123
1138
self.assertEqual(reference_inv.revision_id, new_inv.revision_id)
1124
1139
self.assertEqual(reference_inv.root_id, new_inv.root_id)
1125
1140
reference_inv.id_to_entry._ensure_root()
1126
1141
new_inv.id_to_entry._ensure_root()
1127
1142
self.assertEqual(reference_inv.id_to_entry._root_node._key,
1128
new_inv.id_to_entry._root_node._key)
1143
new_inv.id_to_entry._root_node._key)
1130
1145
def test_create_by_apply_delta_empty_add_child_updates_parent_id(self):
1131
1146
inv = Inventory()
1132
inv.revision_id = "revid"
1133
inv.root.revision = "rootrev"
1147
inv.revision_id = b"revid"
1148
inv.root.revision = b"rootrev"
1134
1149
chk_bytes = self.get_chk_bytes()
1135
1150
base_inv = CHKInventory.from_inventory(chk_bytes, inv)
1136
a_entry = InventoryFile("A-id", "A", inv.root.file_id)
1137
a_entry.revision = "filerev"
1151
a_entry = InventoryFile(b"A-id", "A", inv.root.file_id)
1152
a_entry.revision = b"filerev"
1138
1153
a_entry.executable = True
1139
a_entry.text_sha1 = "ffff"
1154
a_entry.text_sha1 = b"ffff"
1140
1155
a_entry.text_size = 1
1141
1156
inv.add(a_entry)
1142
inv.revision_id = "expectedid"
1157
inv.revision_id = b"expectedid"
1143
1158
reference_inv = CHKInventory.from_inventory(chk_bytes, inv)
1144
delta = [(None, "A", "A-id", a_entry)]
1145
new_inv = base_inv.create_by_apply_delta(delta, "expectedid")
1159
delta = [(None, "A", b"A-id", a_entry)]
1160
new_inv = base_inv.create_by_apply_delta(delta, b"expectedid")
1146
1161
reference_inv.id_to_entry._ensure_root()
1147
1162
reference_inv.parent_id_basename_to_file_id._ensure_root()
1148
1163
new_inv.id_to_entry._ensure_root()
1151
1166
self.assertEqual(reference_inv.revision_id, new_inv.revision_id)
1152
1167
self.assertEqual(reference_inv.root_id, new_inv.root_id)
1153
1168
self.assertEqual(reference_inv.id_to_entry._root_node._key,
1154
new_inv.id_to_entry._root_node._key)
1169
new_inv.id_to_entry._root_node._key)
1155
1170
self.assertEqual(reference_inv.parent_id_basename_to_file_id._root_node._key,
1156
new_inv.parent_id_basename_to_file_id._root_node._key)
1171
new_inv.parent_id_basename_to_file_id._root_node._key)
1158
1173
def test_iter_changes(self):
1159
1174
# Low level bootstrapping smoke test; comprehensive generic tests via
1160
1175
# InterTree are coming.
1161
1176
inv = Inventory()
1162
inv.revision_id = "revid"
1163
inv.root.revision = "rootrev"
1164
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
1165
inv["fileid"].revision = "filerev"
1166
inv["fileid"].executable = True
1167
inv["fileid"].text_sha1 = "ffff"
1168
inv["fileid"].text_size = 1
1177
inv.revision_id = b"revid"
1178
inv.root.revision = b"rootrev"
1179
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1180
inv.get_entry(b"fileid").revision = b"filerev"
1181
inv.get_entry(b"fileid").executable = True
1182
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1183
inv.get_entry(b"fileid").text_size = 1
1169
1184
inv2 = Inventory()
1170
inv2.revision_id = "revid2"
1171
inv2.root.revision = "rootrev"
1172
inv2.add(InventoryFile("fileid", "file", inv.root.file_id))
1173
inv2["fileid"].revision = "filerev2"
1174
inv2["fileid"].executable = False
1175
inv2["fileid"].text_sha1 = "bbbb"
1176
inv2["fileid"].text_size = 2
1185
inv2.revision_id = b"revid2"
1186
inv2.root.revision = b"rootrev"
1187
inv2.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1188
inv2.get_entry(b"fileid").revision = b"filerev2"
1189
inv2.get_entry(b"fileid").executable = False
1190
inv2.get_entry(b"fileid").text_sha1 = b"bbbb"
1191
inv2.get_entry(b"fileid").text_size = 2
1177
1192
# get fresh objects.
1178
1193
chk_bytes = self.get_chk_bytes()
1179
1194
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1180
bytes = ''.join(chk_inv.to_lines())
1181
inv_1 = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1195
lines = chk_inv.to_lines()
1196
inv_1 = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
1182
1197
chk_inv2 = CHKInventory.from_inventory(chk_bytes, inv2)
1183
bytes = ''.join(chk_inv2.to_lines())
1184
inv_2 = CHKInventory.deserialise(chk_bytes, bytes, ("revid2",))
1185
self.assertEqual([('fileid', (u'file', u'file'), True, (True, True),
1186
('TREE_ROOT', 'TREE_ROOT'), (u'file', u'file'), ('file', 'file'),
1188
list(inv_1.iter_changes(inv_2)))
1198
lines = chk_inv2.to_lines()
1199
inv_2 = CHKInventory.deserialise(chk_bytes, lines, (b"revid2",))
1200
self.assertEqual([(b'fileid', (u'file', u'file'), True, (True, True),
1201
(b'TREE_ROOT', b'TREE_ROOT'), (u'file',
1202
u'file'), ('file', 'file'),
1204
list(inv_1.iter_changes(inv_2)))
1190
1206
def test_parent_id_basename_to_file_id_index_enabled(self):
1191
1207
inv = Inventory()
1192
inv.revision_id = "revid"
1193
inv.root.revision = "rootrev"
1194
inv.add(InventoryFile("fileid", "file", inv.root.file_id))
1195
inv["fileid"].revision = "filerev"
1196
inv["fileid"].executable = True
1197
inv["fileid"].text_sha1 = "ffff"
1198
inv["fileid"].text_size = 1
1208
inv.revision_id = b"revid"
1209
inv.root.revision = b"rootrev"
1210
inv.add(InventoryFile(b"fileid", "file", inv.root.file_id))
1211
inv.get_entry(b"fileid").revision = b"filerev"
1212
inv.get_entry(b"fileid").executable = True
1213
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1214
inv.get_entry(b"fileid").text_size = 1
1199
1215
# get fresh objects.
1200
1216
chk_bytes = self.get_chk_bytes()
1201
1217
tmp_inv = CHKInventory.from_inventory(chk_bytes, inv)
1202
bytes = ''.join(tmp_inv.to_lines())
1203
chk_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1204
self.assertIsInstance(chk_inv.parent_id_basename_to_file_id, chk_map.CHKMap)
1218
lines = tmp_inv.to_lines()
1219
chk_inv = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
1220
self.assertIsInstance(
1221
chk_inv.parent_id_basename_to_file_id, chk_map.CHKMap)
1205
1222
self.assertEqual(
1206
{('', ''): 'TREE_ROOT', ('TREE_ROOT', 'file'): 'fileid'},
1223
{(b'', b''): b'TREE_ROOT', (b'TREE_ROOT', b'file'): b'fileid'},
1207
1224
dict(chk_inv.parent_id_basename_to_file_id.iteritems()))
1209
1226
def test_file_entry_to_bytes(self):
1210
1227
inv = CHKInventory(None)
1211
ie = inventory.InventoryFile('file-id', 'filename', 'parent-id')
1228
ie = inventory.InventoryFile(b'file-id', 'filename', b'parent-id')
1212
1229
ie.executable = True
1213
ie.revision = 'file-rev-id'
1214
ie.text_sha1 = 'abcdefgh'
1230
ie.revision = b'file-rev-id'
1231
ie.text_sha1 = b'abcdefgh'
1215
1232
ie.text_size = 100
1216
1233
bytes = inv._entry_to_bytes(ie)
1217
self.assertEqual('file: file-id\nparent-id\nfilename\n'
1218
'file-rev-id\nabcdefgh\n100\nY', bytes)
1234
self.assertEqual(b'file: file-id\nparent-id\nfilename\n'
1235
b'file-rev-id\nabcdefgh\n100\nY', bytes)
1219
1236
ie2 = inv._bytes_to_entry(bytes)
1220
1237
self.assertEqual(ie, ie2)
1221
self.assertIsInstance(ie2.name, unicode)
1222
self.assertEqual(('filename', 'file-id', 'file-rev-id'),
1238
self.assertIsInstance(ie2.name, str)
1239
self.assertEqual((b'filename', b'file-id', b'file-rev-id'),
1223
1240
inv._bytes_to_utf8name_key(bytes))
1225
1242
def test_file2_entry_to_bytes(self):
1226
1243
inv = CHKInventory(None)
1227
1244
# \u30a9 == 'omega'
1228
ie = inventory.InventoryFile('file-id', u'\u03a9name', 'parent-id')
1245
ie = inventory.InventoryFile(b'file-id', u'\u03a9name', b'parent-id')
1229
1246
ie.executable = False
1230
ie.revision = 'file-rev-id'
1231
ie.text_sha1 = '123456'
1247
ie.revision = b'file-rev-id'
1248
ie.text_sha1 = b'123456'
1232
1249
ie.text_size = 25
1233
1250
bytes = inv._entry_to_bytes(ie)
1234
self.assertEqual('file: file-id\nparent-id\n\xce\xa9name\n'
1235
'file-rev-id\n123456\n25\nN', bytes)
1251
self.assertEqual(b'file: file-id\nparent-id\n\xce\xa9name\n'
1252
b'file-rev-id\n123456\n25\nN', bytes)
1236
1253
ie2 = inv._bytes_to_entry(bytes)
1237
1254
self.assertEqual(ie, ie2)
1238
self.assertIsInstance(ie2.name, unicode)
1239
self.assertEqual(('\xce\xa9name', 'file-id', 'file-rev-id'),
1255
self.assertIsInstance(ie2.name, str)
1256
self.assertEqual((b'\xce\xa9name', b'file-id', b'file-rev-id'),
1240
1257
inv._bytes_to_utf8name_key(bytes))
1242
1259
def test_dir_entry_to_bytes(self):
1243
1260
inv = CHKInventory(None)
1244
ie = inventory.InventoryDirectory('dir-id', 'dirname', 'parent-id')
1245
ie.revision = 'dir-rev-id'
1261
ie = inventory.InventoryDirectory(b'dir-id', 'dirname', b'parent-id')
1262
ie.revision = b'dir-rev-id'
1246
1263
bytes = inv._entry_to_bytes(ie)
1247
self.assertEqual('dir: dir-id\nparent-id\ndirname\ndir-rev-id', bytes)
1264
self.assertEqual(b'dir: dir-id\nparent-id\ndirname\ndir-rev-id', bytes)
1248
1265
ie2 = inv._bytes_to_entry(bytes)
1249
1266
self.assertEqual(ie, ie2)
1250
self.assertIsInstance(ie2.name, unicode)
1251
self.assertEqual(('dirname', 'dir-id', 'dir-rev-id'),
1267
self.assertIsInstance(ie2.name, str)
1268
self.assertEqual((b'dirname', b'dir-id', b'dir-rev-id'),
1252
1269
inv._bytes_to_utf8name_key(bytes))
1254
1271
def test_dir2_entry_to_bytes(self):
1255
1272
inv = CHKInventory(None)
1256
ie = inventory.InventoryDirectory('dir-id', u'dir\u03a9name',
1273
ie = inventory.InventoryDirectory(b'dir-id', u'dir\u03a9name',
1258
ie.revision = 'dir-rev-id'
1275
ie.revision = b'dir-rev-id'
1259
1276
bytes = inv._entry_to_bytes(ie)
1260
self.assertEqual('dir: dir-id\n\ndir\xce\xa9name\n'
1261
'dir-rev-id', bytes)
1277
self.assertEqual(b'dir: dir-id\n\ndir\xce\xa9name\n'
1278
b'dir-rev-id', bytes)
1262
1279
ie2 = inv._bytes_to_entry(bytes)
1263
1280
self.assertEqual(ie, ie2)
1264
self.assertIsInstance(ie2.name, unicode)
1281
self.assertIsInstance(ie2.name, str)
1265
1282
self.assertIs(ie2.parent_id, None)
1266
self.assertEqual(('dir\xce\xa9name', 'dir-id', 'dir-rev-id'),
1283
self.assertEqual((b'dir\xce\xa9name', b'dir-id', b'dir-rev-id'),
1267
1284
inv._bytes_to_utf8name_key(bytes))
1269
1286
def test_symlink_entry_to_bytes(self):
1270
1287
inv = CHKInventory(None)
1271
ie = inventory.InventoryLink('link-id', 'linkname', 'parent-id')
1272
ie.revision = 'link-rev-id'
1288
ie = inventory.InventoryLink(b'link-id', 'linkname', b'parent-id')
1289
ie.revision = b'link-rev-id'
1273
1290
ie.symlink_target = u'target/path'
1274
1291
bytes = inv._entry_to_bytes(ie)
1275
self.assertEqual('symlink: link-id\nparent-id\nlinkname\n'
1276
'link-rev-id\ntarget/path', bytes)
1292
self.assertEqual(b'symlink: link-id\nparent-id\nlinkname\n'
1293
b'link-rev-id\ntarget/path', bytes)
1277
1294
ie2 = inv._bytes_to_entry(bytes)
1278
1295
self.assertEqual(ie, ie2)
1279
self.assertIsInstance(ie2.name, unicode)
1280
self.assertIsInstance(ie2.symlink_target, unicode)
1281
self.assertEqual(('linkname', 'link-id', 'link-rev-id'),
1296
self.assertIsInstance(ie2.name, str)
1297
self.assertIsInstance(ie2.symlink_target, str)
1298
self.assertEqual((b'linkname', b'link-id', b'link-rev-id'),
1282
1299
inv._bytes_to_utf8name_key(bytes))
1284
1301
def test_symlink2_entry_to_bytes(self):
1285
1302
inv = CHKInventory(None)
1286
ie = inventory.InventoryLink('link-id', u'link\u03a9name', 'parent-id')
1287
ie.revision = 'link-rev-id'
1303
ie = inventory.InventoryLink(
1304
b'link-id', u'link\u03a9name', b'parent-id')
1305
ie.revision = b'link-rev-id'
1288
1306
ie.symlink_target = u'target/\u03a9path'
1289
1307
bytes = inv._entry_to_bytes(ie)
1290
self.assertEqual('symlink: link-id\nparent-id\nlink\xce\xa9name\n'
1291
'link-rev-id\ntarget/\xce\xa9path', bytes)
1308
self.assertEqual(b'symlink: link-id\nparent-id\nlink\xce\xa9name\n'
1309
b'link-rev-id\ntarget/\xce\xa9path', bytes)
1292
1310
ie2 = inv._bytes_to_entry(bytes)
1293
1311
self.assertEqual(ie, ie2)
1294
self.assertIsInstance(ie2.name, unicode)
1295
self.assertIsInstance(ie2.symlink_target, unicode)
1296
self.assertEqual(('link\xce\xa9name', 'link-id', 'link-rev-id'),
1312
self.assertIsInstance(ie2.name, str)
1313
self.assertIsInstance(ie2.symlink_target, str)
1314
self.assertEqual((b'link\xce\xa9name', b'link-id', b'link-rev-id'),
1297
1315
inv._bytes_to_utf8name_key(bytes))
1299
1317
def test_tree_reference_entry_to_bytes(self):
1300
1318
inv = CHKInventory(None)
1301
ie = inventory.TreeReference('tree-root-id', u'tree\u03a9name',
1303
ie.revision = 'tree-rev-id'
1304
ie.reference_revision = 'ref-rev-id'
1319
ie = inventory.TreeReference(b'tree-root-id', u'tree\u03a9name',
1321
ie.revision = b'tree-rev-id'
1322
ie.reference_revision = b'ref-rev-id'
1305
1323
bytes = inv._entry_to_bytes(ie)
1306
self.assertEqual('tree: tree-root-id\nparent-id\ntree\xce\xa9name\n'
1307
'tree-rev-id\nref-rev-id', bytes)
1324
self.assertEqual(b'tree: tree-root-id\nparent-id\ntree\xce\xa9name\n'
1325
b'tree-rev-id\nref-rev-id', bytes)
1308
1326
ie2 = inv._bytes_to_entry(bytes)
1309
1327
self.assertEqual(ie, ie2)
1310
self.assertIsInstance(ie2.name, unicode)
1311
self.assertEqual(('tree\xce\xa9name', 'tree-root-id', 'tree-rev-id'),
1328
self.assertIsInstance(ie2.name, str)
1329
self.assertEqual((b'tree\xce\xa9name', b'tree-root-id', b'tree-rev-id'),
1312
1330
inv._bytes_to_utf8name_key(bytes))
1314
1332
def make_basic_utf8_inventory(self):
1315
1333
inv = Inventory()
1316
inv.revision_id = "revid"
1317
inv.root.revision = "rootrev"
1334
inv.revision_id = b"revid"
1335
inv.root.revision = b"rootrev"
1318
1336
root_id = inv.root.file_id
1319
inv.add(InventoryFile("fileid", u'f\xefle', root_id))
1320
inv["fileid"].revision = "filerev"
1321
inv["fileid"].text_sha1 = "ffff"
1322
inv["fileid"].text_size = 0
1323
inv.add(InventoryDirectory("dirid", u'dir-\N{EURO SIGN}', root_id))
1324
inv.add(InventoryFile("childid", u'ch\xefld', "dirid"))
1325
inv["childid"].revision = "filerev"
1326
inv["childid"].text_sha1 = "ffff"
1327
inv["childid"].text_size = 0
1337
inv.add(InventoryFile(b"fileid", u'f\xefle', root_id))
1338
inv.get_entry(b"fileid").revision = b"filerev"
1339
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1340
inv.get_entry(b"fileid").text_size = 0
1341
inv.add(InventoryDirectory(b"dirid", u'dir-\N{EURO SIGN}', root_id))
1342
inv.get_entry(b"dirid").revision = b"dirrev"
1343
inv.add(InventoryFile(b"childid", u'ch\xefld', b"dirid"))
1344
inv.get_entry(b"childid").revision = b"filerev"
1345
inv.get_entry(b"childid").text_sha1 = b"ffff"
1346
inv.get_entry(b"childid").text_size = 0
1328
1347
chk_bytes = self.get_chk_bytes()
1329
1348
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1330
bytes = ''.join(chk_inv.to_lines())
1331
return CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1349
lines = chk_inv.to_lines()
1350
return CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
1333
1352
def test__preload_handles_utf8(self):
1334
1353
new_inv = self.make_basic_utf8_inventory()
1336
1355
self.assertFalse(new_inv._fully_cached)
1337
1356
new_inv._preload_cache()
1338
1357
self.assertEqual(
1339
sorted([new_inv.root_id, "fileid", "dirid", "childid"]),
1358
sorted([new_inv.root_id, b"fileid", b"dirid", b"childid"]),
1340
1359
sorted(new_inv._fileid_to_entry_cache.keys()))
1341
1360
ie_root = new_inv._fileid_to_entry_cache[new_inv.root_id]
1342
1361
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1343
1362
sorted(ie_root._children.keys()))
1344
ie_dir = new_inv._fileid_to_entry_cache['dirid']
1363
ie_dir = new_inv._fileid_to_entry_cache[b'dirid']
1345
1364
self.assertEqual([u'ch\xefld'], sorted(ie_dir._children.keys()))
1347
1366
def test__preload_populates_cache(self):
1348
1367
inv = Inventory()
1349
inv.revision_id = "revid"
1350
inv.root.revision = "rootrev"
1368
inv.revision_id = b"revid"
1369
inv.root.revision = b"rootrev"
1351
1370
root_id = inv.root.file_id
1352
inv.add(InventoryFile("fileid", "file", root_id))
1353
inv["fileid"].revision = "filerev"
1354
inv["fileid"].executable = True
1355
inv["fileid"].text_sha1 = "ffff"
1356
inv["fileid"].text_size = 1
1357
inv.add(InventoryDirectory("dirid", "dir", root_id))
1358
inv.add(InventoryFile("childid", "child", "dirid"))
1359
inv["childid"].revision = "filerev"
1360
inv["childid"].executable = False
1361
inv["childid"].text_sha1 = "dddd"
1362
inv["childid"].text_size = 1
1371
inv.add(InventoryFile(b"fileid", "file", root_id))
1372
inv.get_entry(b"fileid").revision = b"filerev"
1373
inv.get_entry(b"fileid").executable = True
1374
inv.get_entry(b"fileid").text_sha1 = b"ffff"
1375
inv.get_entry(b"fileid").text_size = 1
1376
inv.add(InventoryDirectory(b"dirid", "dir", root_id))
1377
inv.get_entry(b"dirid").revision = b"dirrev"
1378
inv.add(InventoryFile(b"childid", "child", b"dirid"))
1379
inv.get_entry(b"childid").revision = b"filerev"
1380
inv.get_entry(b"childid").executable = False
1381
inv.get_entry(b"childid").text_sha1 = b"dddd"
1382
inv.get_entry(b"childid").text_size = 1
1363
1383
chk_bytes = self.get_chk_bytes()
1364
1384
chk_inv = CHKInventory.from_inventory(chk_bytes, inv)
1365
bytes = ''.join(chk_inv.to_lines())
1366
new_inv = CHKInventory.deserialise(chk_bytes, bytes, ("revid",))
1385
lines = chk_inv.to_lines()
1386
new_inv = CHKInventory.deserialise(chk_bytes, lines, (b"revid",))
1367
1387
self.assertEqual({}, new_inv._fileid_to_entry_cache)
1368
1388
self.assertFalse(new_inv._fully_cached)
1369
1389
new_inv._preload_cache()
1370
1390
self.assertEqual(
1371
sorted([root_id, "fileid", "dirid", "childid"]),
1391
sorted([root_id, b"fileid", b"dirid", b"childid"]),
1372
1392
sorted(new_inv._fileid_to_entry_cache.keys()))
1373
1393
self.assertTrue(new_inv._fully_cached)
1374
1394
ie_root = new_inv._fileid_to_entry_cache[root_id]
1375
1395
self.assertEqual(['dir', 'file'], sorted(ie_root._children.keys()))
1376
ie_dir = new_inv._fileid_to_entry_cache['dirid']
1396
ie_dir = new_inv._fileid_to_entry_cache[b'dirid']
1377
1397
self.assertEqual(['child'], sorted(ie_dir._children.keys()))
1379
1399
def test__preload_handles_partially_evaluated_inventory(self):
1380
1400
new_inv = self.make_basic_utf8_inventory()
1381
ie = new_inv[new_inv.root_id]
1401
ie = new_inv.get_entry(new_inv.root_id)
1382
1402
self.assertIs(None, ie._children)
1383
1403
self.assertEqual([u'dir-\N{EURO SIGN}', u'f\xefle'],
1384
1404
sorted(ie.children.keys()))
1484
1514
for path, entry in inv.iter_entries_by_dir():
1485
1515
layout.append((path, entry.file_id))
1486
1516
self.assertEqual([
1488
('dir1', 'dir1-id'),
1489
('dir2', 'dir2-id'),
1491
('dir1/sub-dir1', 'sub-dir1-id'),
1492
('dir1/sub-file1', 'sub-file1-id'),
1493
('dir1/sub-file2', 'sub-file2-id'),
1494
('dir1/sub-dir1/subsub-file1', 'subsub-file1-id'),
1495
('dir2/sub2-file1', 'sub2-file1-id'),
1518
('dir1', b'dir1-id'),
1519
('dir2', b'dir2-id'),
1521
('dir1/sub-dir1', b'sub-dir1-id'),
1522
('dir1/sub-file1', b'sub-file1-id'),
1523
('dir1/sub-file2', b'sub-file2-id'),
1524
('dir1/sub-dir1/subsub-file1', b'subsub-file1-id'),
1525
('dir2/sub2-file1', b'sub2-file1-id'),
1498
1528
def test__getitems(self):
1499
1529
inv = self.make_simple_inventory()
1500
1530
# Reading from disk
1501
self.assert_Getitems(['dir1-id'], inv, ['dir1-id'])
1502
self.assertTrue('dir1-id' in inv._fileid_to_entry_cache)
1503
self.assertFalse('sub-file2-id' in inv._fileid_to_entry_cache)
1531
self.assert_Getitems([b'dir1-id'], inv, [b'dir1-id'])
1532
self.assertTrue(b'dir1-id' in inv._fileid_to_entry_cache)
1533
self.assertFalse(b'sub-file2-id' in inv._fileid_to_entry_cache)
1505
self.assert_Getitems(['dir1-id'], inv, ['dir1-id'])
1535
self.assert_Getitems([b'dir1-id'], inv, [b'dir1-id'])
1507
self.assert_Getitems(['dir1-id', 'sub-file2-id'], inv,
1508
['dir1-id', 'sub-file2-id'])
1509
self.assertTrue('dir1-id' in inv._fileid_to_entry_cache)
1510
self.assertTrue('sub-file2-id' in inv._fileid_to_entry_cache)
1537
self.assert_Getitems([b'dir1-id', b'sub-file2-id'], inv,
1538
[b'dir1-id', b'sub-file2-id'])
1539
self.assertTrue(b'dir1-id' in inv._fileid_to_entry_cache)
1540
self.assertTrue(b'sub-file2-id' in inv._fileid_to_entry_cache)
1512
1542
def test_single_file(self):
1513
1543
inv = self.make_simple_inventory()
1514
self.assertExpand(['TREE_ROOT', 'top-id'], inv, ['top-id'])
1544
self.assertExpand([b'TREE_ROOT', b'top-id'], inv, [b'top-id'])
1516
1546
def test_get_all_parents(self):
1517
1547
inv = self.make_simple_inventory()
1518
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id',
1520
], inv, ['subsub-file1-id'])
1548
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1550
], inv, [b'subsub-file1-id'])
1522
1552
def test_get_children(self):
1523
1553
inv = self.make_simple_inventory()
1524
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id',
1525
'sub-file1-id', 'sub-file2-id', 'subsub-file1-id',
1526
], inv, ['dir1-id'])
1554
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1555
b'sub-file1-id', b'sub-file2-id', b'subsub-file1-id',
1556
], inv, [b'dir1-id'])
1528
1558
def test_from_root(self):
1529
1559
inv = self.make_simple_inventory()
1530
self.assertExpand(['TREE_ROOT', 'dir1-id', 'dir2-id', 'sub-dir1-id',
1531
'sub-file1-id', 'sub-file2-id', 'sub2-file1-id',
1532
'subsub-file1-id', 'top-id'], inv, ['TREE_ROOT'])
1560
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'dir2-id', b'sub-dir1-id',
1561
b'sub-file1-id', b'sub-file2-id', b'sub2-file1-id',
1562
b'subsub-file1-id', b'top-id'], inv, [b'TREE_ROOT'])
1534
1564
def test_top_level_file(self):
1535
1565
inv = self.make_simple_inventory()
1536
self.assertExpand(['TREE_ROOT', 'top-id'], inv, ['top-id'])
1566
self.assertExpand([b'TREE_ROOT', b'top-id'], inv, [b'top-id'])
1538
1568
def test_subsub_file(self):
1539
1569
inv = self.make_simple_inventory()
1540
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id',
1541
'subsub-file1-id'], inv, ['subsub-file1-id'])
1570
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id',
1571
b'subsub-file1-id'], inv, [b'subsub-file1-id'])
1543
1573
def test_sub_and_root(self):
1544
1574
inv = self.make_simple_inventory()
1545
self.assertExpand(['TREE_ROOT', 'dir1-id', 'sub-dir1-id', 'top-id',
1546
'subsub-file1-id'], inv, ['top-id', 'subsub-file1-id'])
1575
self.assertExpand([b'TREE_ROOT', b'dir1-id', b'sub-dir1-id', b'top-id',
1576
b'subsub-file1-id'], inv, [b'top-id', b'subsub-file1-id'])
1549
1579
class TestMutableInventoryFromTree(TestCaseWithTransport):