102
102
def test_parse_bad_format(self):
103
103
deserializer = inventory_delta.InventoryDeltaDeserializer()
104
104
err = self.assertRaises(InventoryDeltaError,
105
deserializer.parse_text_bytes, b'format: foo\n')
105
deserializer.parse_text_bytes, b'format: foo\n')
106
106
self.assertContainsRe(str(err), 'unknown format')
108
108
def test_parse_no_parent(self):
109
109
deserializer = inventory_delta.InventoryDeltaDeserializer()
110
110
err = self.assertRaises(InventoryDeltaError,
111
deserializer.parse_text_bytes,
112
b'format: bzr inventory delta v1 (bzr 1.14)\n')
111
deserializer.parse_text_bytes,
112
b'format: bzr inventory delta v1 (bzr 1.14)\n')
113
113
self.assertContainsRe(str(err), 'missing parent: marker')
115
115
def test_parse_no_version(self):
116
116
deserializer = inventory_delta.InventoryDeltaDeserializer()
117
117
err = self.assertRaises(InventoryDeltaError,
118
deserializer.parse_text_bytes,
119
b'format: bzr inventory delta v1 (bzr 1.14)\n'
118
deserializer.parse_text_bytes,
119
b'format: bzr inventory delta v1 (bzr 1.14)\n'
121
121
self.assertContainsRe(str(err), 'missing version: marker')
123
123
def test_parse_duplicate_key_errors(self):
124
124
deserializer = inventory_delta.InventoryDeltaDeserializer()
125
125
double_root_lines = \
126
b"""format: bzr inventory delta v1 (bzr 1.14)
126
b"""format: bzr inventory delta v1 (bzr 1.14)
129
129
versioned_root: true
200
200
deserializer = inventory_delta.InventoryDeltaDeserializer(
201
201
allow_versioned_root=False)
202
202
err = self.assertRaises(inventory_delta.IncompatibleInventoryDelta,
203
deserializer.parse_text_bytes, root_only_lines)
203
deserializer.parse_text_bytes, root_only_lines)
204
204
self.assertEqual("versioned_root not allowed", str(err))
206
206
def test_parse_tree_when_disabled(self):
207
207
deserializer = inventory_delta.InventoryDeltaDeserializer(
208
208
allow_tree_references=False)
209
209
err = self.assertRaises(inventory_delta.IncompatibleInventoryDelta,
210
deserializer.parse_text_bytes, reference_lines)
210
deserializer.parse_text_bytes, reference_lines)
211
211
self.assertEqual("Tree reference not allowed", str(err))
213
213
def test_parse_tree_when_header_disallows(self):
438
439
serializer = inventory_delta.InventoryDeltaSerializer(
439
440
versioned_root=True, tree_references=True)
440
441
self.assertEqual(BytesIO(reference_lines).readlines(),
441
serializer.delta_to_lines(NULL_REVISION, b'entry-version', delta))
442
serializer.delta_to_lines(NULL_REVISION, b'entry-version', delta))
443
444
def test_to_inventory_root_id_versioned_not_permitted(self):
444
445
root_entry = inventory.make_entry('directory', u'', None, b'TREE_ROOT')
473
474
serializer = inventory_delta.InventoryDeltaSerializer(
474
475
versioned_root=True, tree_references=True)
475
476
self.assertRaises(InventoryDeltaError, serializer.delta_to_lines,
476
b'old-version', b'new-version', delta)
477
b'old-version', b'new-version', delta)
478
479
def test_to_inventory_torture(self):
479
480
def make_entry(kind, name, parent_id, file_id, **attrs):
492
493
(None, u'', b'new-root-id',
493
494
make_entry('directory', u'', None, b'new-root-id',
494
revision=b'changed-in')),
495
revision=b'changed-in')),
496
497
(u'', u'old-root', b'TREE_ROOT',
497
498
make_entry('directory', u'subdir-now', b'new-root-id',
498
b'TREE_ROOT', revision=b'moved-root')),
499
b'TREE_ROOT', revision=b'moved-root')),
499
500
# a file that followed the root move
500
501
(u'under-old-root', u'old-root/under-old-root', b'moved-id',
501
502
make_entry('file', u'under-old-root', b'TREE_ROOT',
502
b'moved-id', revision=b'old-rev', executable=False,
503
text_size=30, text_sha1=b'some-sha')),
503
b'moved-id', revision=b'old-rev', executable=False,
504
text_size=30, text_sha1=b'some-sha')),
505
506
(u'old-file', None, b'deleted-id', None),
506
507
# a tree reference moved to the new root
507
508
(u'ref', u'ref', b'ref-id',
508
509
make_entry('tree-reference', u'ref', b'new-root-id', b'ref-id',
509
reference_revision=b'tree-reference-id',
510
revision=b'new-rev')),
510
reference_revision=b'tree-reference-id',
511
revision=b'new-rev')),
511
512
# a symlink now in a deep dir
512
513
(u'dir/link', u'old-root/dir/link', b'link-id',
513
514
make_entry('symlink', u'link', b'deep-id', b'link-id',
514
symlink_target=u'target', revision=b'new-rev')),
515
symlink_target=u'target', revision=b'new-rev')),
516
517
(u'dir', u'old-root/dir', b'deep-id',
517
518
make_entry('directory', u'dir', b'TREE_ROOT', b'deep-id',
518
revision=b'new-rev')),
519
revision=b'new-rev')),
519
520
# a file with an exec bit set
520
521
(None, u'configure', b'exec-id',
521
522
make_entry('file', u'configure', b'new-root-id', b'exec-id',
522
executable=True, text_size=30, text_sha1=b'some-sha',
523
revision=b'old-rev')),
523
executable=True, text_size=30, text_sha1=b'some-sha',
524
revision=b'old-rev')),
525
526
serializer = inventory_delta.InventoryDeltaSerializer(
526
527
versioned_root=True, tree_references=True)
556
557
file_entry.text_sha1 = b''
557
558
file_entry.text_size = 0
558
559
self.assertEqual(b'file\x000\x00\x00',
559
inventory_delta._file_content(file_entry))
560
inventory_delta._file_content(file_entry))
561
562
def test_file_10_foo(self):
562
563
file_entry = inventory.make_entry('file', u'a file', None, b'file-id')
563
564
file_entry.text_sha1 = b'foo'
564
565
file_entry.text_size = 10
565
566
self.assertEqual(b'file\x0010\x00\x00foo',
566
inventory_delta._file_content(file_entry))
567
inventory_delta._file_content(file_entry))
568
569
def test_file_executable(self):
569
570
file_entry = inventory.make_entry('file', u'a file', None, b'file-id')
571
572
file_entry.text_sha1 = b'foo'
572
573
file_entry.text_size = 10
573
574
self.assertEqual(b'file\x0010\x00Y\x00foo',
574
inventory_delta._file_content(file_entry))
575
inventory_delta._file_content(file_entry))
576
577
def test_file_without_size(self):
577
578
file_entry = inventory.make_entry('file', u'a file', None, b'file-id')
578
579
file_entry.text_sha1 = b'foo'
579
580
self.assertRaises(InventoryDeltaError,
580
inventory_delta._file_content, file_entry)
581
inventory_delta._file_content, file_entry)
582
583
def test_file_without_sha1(self):
583
584
file_entry = inventory.make_entry('file', u'a file', None, b'file-id')
584
585
file_entry.text_size = 10
585
586
self.assertRaises(InventoryDeltaError,
586
inventory_delta._file_content, file_entry)
587
inventory_delta._file_content, file_entry)
588
589
def test_link_empty_target(self):
589
590
entry = inventory.make_entry('symlink', u'a link', None)
590
591
entry.symlink_target = u''
591
592
self.assertEqual(b'link\x00',
592
inventory_delta._link_content(entry))
593
inventory_delta._link_content(entry))
594
595
def test_link_unicode_target(self):
595
596
entry = inventory.make_entry('symlink', u'a link', None)
596
597
entry.symlink_target = b' \xc3\xa5'.decode('utf8')
597
598
self.assertEqual(b'link\x00 \xc3\xa5',
598
inventory_delta._link_content(entry))
599
inventory_delta._link_content(entry))
600
601
def test_link_space_target(self):
601
602
entry = inventory.make_entry('symlink', u'a link', None)
602
603
entry.symlink_target = u' '
603
604
self.assertEqual(b'link\x00 ',
604
inventory_delta._link_content(entry))
605
inventory_delta._link_content(entry))
606
607
def test_link_no_target(self):
607
608
entry = inventory.make_entry('symlink', u'a link', None)
608
609
self.assertRaises(InventoryDeltaError,
609
inventory_delta._link_content, entry)
610
inventory_delta._link_content, entry)
611
612
def test_reference_null(self):
612
613
entry = inventory.make_entry('tree-reference', u'a tree', None)
613
614
entry.reference_revision = NULL_REVISION
614
615
self.assertEqual(b'tree\x00null:',
615
inventory_delta._reference_content(entry))
616
inventory_delta._reference_content(entry))
617
618
def test_reference_revision(self):
618
619
entry = inventory.make_entry('tree-reference', u'a tree', None)
619
620
entry.reference_revision = b'foo@\xc3\xa5b-lah'
620
621
self.assertEqual(b'tree\x00foo@\xc3\xa5b-lah',
621
inventory_delta._reference_content(entry))
622
inventory_delta._reference_content(entry))
623
624
def test_reference_no_reference(self):
624
625
entry = inventory.make_entry('tree-reference', u'a tree', None)
625
626
self.assertRaises(InventoryDeltaError,
626
inventory_delta._reference_content, entry)
627
inventory_delta._reference_content, entry)