1
# Copyright (C) 2005-2011 Canonical Ltd
1
# Copyright (C) 2005 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
from cStringIO import StringIO
19
19
from bzrlib import (
27
26
from bzrlib.tests import TestCase
28
from bzrlib.inventory import Inventory
27
from bzrlib.inventory import Inventory, InventoryEntry
29
28
from bzrlib.xml4 import serializer_v4
83
82
_committed_inv_v5 = """<inventory>
84
<file file_id="bar-20050901064931-73b4b1138abc9cd2"
85
name="bar" parent_id="TREE_ROOT"
83
<file file_id="bar-20050901064931-73b4b1138abc9cd2"
84
name="bar" parent_id="TREE_ROOT"
86
85
revision="mbp@foo-123123"
87
86
text_sha1="A" text_size="1"/>
88
87
<directory name="subdir"
89
88
file_id="foo-20050801201819-4139aa4a272f4250"
91
90
revision="mbp@foo-00"/>
92
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134"
93
name="bar" parent_id="foo-20050801201819-4139aa4a272f4250"
91
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134"
92
name="bar" parent_id="foo-20050801201819-4139aa4a272f4250"
94
93
revision="mbp@foo-00"
95
94
text_sha1="B" text_size="0"/>
99
98
_basis_inv_v5 = """<inventory revision_id="mbp@sourcefrog.net-20050905063503-43948f59fa127d92">
100
<file file_id="bar-20050901064931-73b4b1138abc9cd2"
101
name="bar" parent_id="TREE_ROOT"
99
<file file_id="bar-20050901064931-73b4b1138abc9cd2"
100
name="bar" parent_id="TREE_ROOT"
102
101
revision="mbp@foo-123123"/>
103
102
<directory name="subdir"
104
103
file_id="foo-20050801201819-4139aa4a272f4250"
105
parent_id="TREE_ROOT"
104
parent_id="TREE_ROOT"
106
105
revision="mbp@foo-00"/>
107
<file file_id="bar-20050824000535-6bc48cfad47ed134"
108
name="bar" parent_id="foo-20050801201819-4139aa4a272f4250"
106
<file file_id="bar-20050824000535-6bc48cfad47ed134"
107
name="bar" parent_id="foo-20050801201819-4139aa4a272f4250"
109
108
revision="mbp@foo-00"/>
143
_expected_inv_v6 = """<inventory format="6" revision_id="rev_outer">
144
<directory file_id="tree-root-321" name="" revision="rev_outer" />
145
<directory file_id="dir-id" name="dir" parent_id="tree-root-321" revision="rev_outer" />
146
<file file_id="file-id" name="file" parent_id="tree-root-321" revision="rev_outer" text_sha1="A" text_size="1" />
147
<symlink file_id="link-id" name="link" parent_id="tree-root-321" revision="rev_outer" symlink_target="a" />
151
142
_expected_inv_v7 = """<inventory format="7" revision_id="rev_outer">
152
143
<directory file_id="tree-root-321" name="" revision="rev_outer" />
153
144
<directory file_id="dir-id" name="dir" parent_id="tree-root-321" revision="rev_outer" />
290
281
_inventory_v5a, revision_id='test-rev-id')
291
282
self.assertEqual('test-rev-id', inv.root.revision)
293
def test_unpack_inventory_5a_cache_and_copy(self):
294
# Passing an entry_cache should get populated with the objects
295
# But the returned objects should be copies if return_from_cache is
297
entry_cache = fifo_cache.FIFOCache()
298
inv = bzrlib.xml5.serializer_v5.read_inventory_from_string(
299
_inventory_v5a, revision_id='test-rev-id',
300
entry_cache=entry_cache, return_from_cache=False)
301
for entry in inv.iter_just_entries():
302
key = (entry.file_id, entry.revision)
303
if entry.file_id is inv.root.file_id:
304
# The root id is inferred for xml v5
305
self.assertFalse(key in entry_cache)
307
self.assertIsNot(entry, entry_cache[key])
309
def test_unpack_inventory_5a_cache_no_copy(self):
310
# Passing an entry_cache should get populated with the objects
311
# The returned objects should be exact if return_from_cache is
313
entry_cache = fifo_cache.FIFOCache()
314
inv = bzrlib.xml5.serializer_v5.read_inventory_from_string(
315
_inventory_v5a, revision_id='test-rev-id',
316
entry_cache=entry_cache, return_from_cache=True)
317
for entry in inv.iter_just_entries():
318
key = (entry.file_id, entry.revision)
319
if entry.file_id is inv.root.file_id:
320
# The root id is inferred for xml v5
321
self.assertFalse(key in entry_cache)
323
self.assertIs(entry, entry_cache[key])
325
284
def test_unpack_inventory_5b(self):
326
285
inv = bzrlib.xml5.serializer_v5.read_inventory_from_string(
327
286
_inventory_v5b, revision_id='test-rev-id')
335
294
self.assertEqualDiff(_expected_inv_v5, outp.getvalue())
336
295
inv2 = bzrlib.xml5.serializer_v5.read_inventory(StringIO(outp.getvalue()))
337
296
self.assertEqual(inv, inv2)
339
298
def assertRoundTrips(self, xml_string):
340
299
inp = StringIO(xml_string)
341
300
inv = bzrlib.xml5.serializer_v5.read_inventory(inp)
393
352
def get_sample_inventory(self):
394
353
inv = Inventory('tree-root-321', revision_id='rev_outer')
395
354
inv.add(inventory.InventoryFile('file-id', 'file', 'tree-root-321'))
396
inv.add(inventory.InventoryDirectory('dir-id', 'dir',
355
inv.add(inventory.InventoryDirectory('dir-id', 'dir',
397
356
'tree-root-321'))
398
357
inv.add(inventory.InventoryLink('link-id', 'link', 'tree-root-321'))
399
358
inv['tree-root-321'].revision = 'rev_outer'
418
377
for path, ie in inv.iter_entries():
419
378
self.assertEqual(ie, inv2[ie.file_id])
421
def test_roundtrip_inventory_v6(self):
422
inv = self.get_sample_inventory()
423
txt = xml6.serializer_v6.write_inventory_to_string(inv)
424
lines = xml6.serializer_v6.write_inventory_to_lines(inv)
425
self.assertEqual(bzrlib.osutils.split_lines(txt), lines)
426
self.assertEqualDiff(_expected_inv_v6, txt)
427
inv2 = xml6.serializer_v6.read_inventory_from_string(txt)
428
self.assertEqual(4, len(inv2))
429
for path, ie in inv.iter_entries():
430
self.assertEqual(ie, inv2[ie.file_id])
432
380
def test_wrong_format_v7(self):
433
381
"""Can't accidentally open a file with wrong serializer"""
434
382
s_v6 = bzrlib.xml6.serializer_v6
435
383
s_v7 = xml7.serializer_v7
436
self.assertRaises(errors.UnexpectedInventoryFormat,
384
self.assertRaises(errors.UnexpectedInventoryFormat,
437
385
s_v7.read_inventory_from_string, _expected_inv_v5)
438
self.assertRaises(errors.UnexpectedInventoryFormat,
386
self.assertRaises(errors.UnexpectedInventoryFormat,
439
387
s_v6.read_inventory_from_string, _expected_inv_v7)
441
389
def test_tree_reference(self):
457
405
self.assertEqual('tree-root-321', inv2['nested-id'].parent_id)
458
406
self.assertEqual('rev-outer', inv2['nested-id'].revision)
459
407
self.assertEqual('rev-inner', inv2['nested-id'].reference_revision)
460
self.assertRaises(errors.UnsupportedInventoryKind,
408
self.assertRaises(errors.UnsupportedInventoryKind,
461
409
s_v6.read_inventory_from_string,
462
410
txt.replace('format="7"', 'format="6"'))
463
self.assertRaises(errors.UnsupportedInventoryKind,
411
self.assertRaises(errors.UnsupportedInventoryKind,
464
412
s_v5.read_inventory_from_string,
465
413
txt.replace('format="7"', 'format="5"'))
545
493
self.assertEqual(len(expected), len(actual))
495
def test_registry(self):
496
self.assertIs(serializer_v4,
497
xml_serializer.format_registry.get('4'))
498
self.assertIs(bzrlib.xml5.serializer_v5,
499
xml_serializer.format_registry.get('5'))
500
self.assertIs(bzrlib.xml6.serializer_v6,
501
xml_serializer.format_registry.get('6'))
502
self.assertIs(bzrlib.xml7.serializer_v7,
503
xml_serializer.format_registry.get('7'))
504
self.assertIs(bzrlib.xml8.serializer_v8,
505
xml_serializer.format_registry.get('8'))
548
508
class TestEncodeAndEscape(TestCase):
549
509
"""Whitebox testing of the _encode_and_escape function."""
553
512
# Keep the cache clear before and after the test
554
513
bzrlib.xml8._ensure_utf8_re()
555
514
bzrlib.xml8._clear_cache()