~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_xml.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-03-28 06:58:22 UTC
  • mfrom: (2379.2.3 hpss-chroot)
  • Revision ID: pqm@pqm.ubuntu.com-20070328065822-999550a858a3ced3
(robertc) Fix chroot urls to not expose the url of the transport they are protecting, allowing regular url operations to work on them. (Robert Collins, Andrew Bennetts)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2011 Canonical Ltd
 
1
# Copyright (C) 2005 Canonical Ltd
2
2
#
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
12
12
#
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
16
16
 
17
17
from cStringIO import StringIO
18
18
 
19
19
from bzrlib import (
20
 
    errors,
21
 
    fifo_cache,
22
 
    inventory,
23
 
    xml6,
 
20
    errors, 
 
21
    inventory, 
24
22
    xml7,
25
 
    xml8,
26
23
    )
27
24
from bzrlib.tests import TestCase
28
 
from bzrlib.inventory import Inventory
 
25
from bzrlib.inventory import Inventory, InventoryEntry
 
26
from bzrlib.xml4 import serializer_v4
29
27
import bzrlib.xml5
30
28
 
 
29
_working_inventory_v4 = """<inventory file_id="TREE_ROOT">
 
30
<entry file_id="bar-20050901064931-73b4b1138abc9cd2" kind="file" name="bar" parent_id="TREE_ROOT" />
 
31
<entry file_id="foo-20050801201819-4139aa4a272f4250" kind="directory" name="foo" parent_id="TREE_ROOT" />
 
32
<entry file_id="bar-20050824000535-6bc48cfad47ed134" kind="file" name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" />
 
33
</inventory>"""
 
34
 
 
35
 
 
36
_revision_v4 = """<revision committer="Martin Pool &lt;mbp@sourcefrog.net&gt;"
 
37
    inventory_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9"
 
38
    inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41"
 
39
    revision_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9"
 
40
    timestamp="1125907235.212"
 
41
    timezone="36000">
 
42
<message>- start splitting code for xml (de)serialization away from objects
 
43
  preparatory to supporting multiple formats by a single library
 
44
</message>
 
45
<parents>
 
46
<revision_ref revision_id="mbp@sourcefrog.net-20050905063503-43948f59fa127d92" revision_sha1="7bdf4cc8c5bdac739f8cf9b10b78cf4b68f915ff" />
 
47
</parents>
 
48
</revision>
 
49
"""
 
50
 
31
51
_revision_v5 = """<revision committer="Martin Pool &lt;mbp@sourcefrog.net&gt;"
32
52
    inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41"
33
53
    revision_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9"
58
78
"""
59
79
 
60
80
_committed_inv_v5 = """<inventory>
61
 
<file file_id="bar-20050901064931-73b4b1138abc9cd2"
62
 
      name="bar" parent_id="TREE_ROOT"
63
 
      revision="mbp@foo-123123"
64
 
      text_sha1="A" text_size="1"/>
 
81
<file file_id="bar-20050901064931-73b4b1138abc9cd2" 
 
82
      name="bar" parent_id="TREE_ROOT" 
 
83
      revision="mbp@foo-123123"/>
65
84
<directory name="subdir"
66
85
           file_id="foo-20050801201819-4139aa4a272f4250"
67
 
           parent_id="TREE_ROOT"
 
86
           parent_id="TREE_ROOT" 
68
87
           revision="mbp@foo-00"/>
69
 
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134"
70
 
      name="bar" parent_id="foo-20050801201819-4139aa4a272f4250"
71
 
      revision="mbp@foo-00"
72
 
      text_sha1="B" text_size="0"/>
 
88
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134" 
 
89
      name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" 
 
90
      revision="mbp@foo-00"/>
73
91
</inventory>
74
92
"""
75
93
 
76
94
_basis_inv_v5 = """<inventory revision_id="mbp@sourcefrog.net-20050905063503-43948f59fa127d92">
77
 
<file file_id="bar-20050901064931-73b4b1138abc9cd2"
78
 
      name="bar" parent_id="TREE_ROOT"
 
95
<file file_id="bar-20050901064931-73b4b1138abc9cd2" 
 
96
      name="bar" parent_id="TREE_ROOT" 
79
97
      revision="mbp@foo-123123"/>
80
98
<directory name="subdir"
81
99
           file_id="foo-20050801201819-4139aa4a272f4250"
82
 
           parent_id="TREE_ROOT"
 
100
           parent_id="TREE_ROOT" 
83
101
           revision="mbp@foo-00"/>
84
 
<file file_id="bar-20050824000535-6bc48cfad47ed134"
85
 
      name="bar" parent_id="foo-20050801201819-4139aa4a272f4250"
 
102
<file file_id="bar-20050824000535-6bc48cfad47ed134" 
 
103
      name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" 
86
104
      revision="mbp@foo-00"/>
87
105
</inventory>
88
106
"""
102
120
 
103
121
# DO NOT REFLOW THIS. Its the exact inventory we want.
104
122
_expected_inv_v5 = """<inventory format="5">
105
 
<file file_id="bar-20050901064931-73b4b1138abc9cd2" name="bar" revision="mbp@foo-123123" text_sha1="A" text_size="1" />
 
123
<file file_id="bar-20050901064931-73b4b1138abc9cd2" name="bar" revision="mbp@foo-123123" />
106
124
<directory file_id="foo-20050801201819-4139aa4a272f4250" name="subdir" revision="mbp@foo-00" />
107
 
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134" name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" revision="mbp@foo-00" text_sha1="B" text_size="0" />
 
125
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134" name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" revision="mbp@foo-00" />
108
126
</inventory>
109
127
"""
110
128
 
111
129
 
112
130
_expected_inv_v5_root = """<inventory file_id="f&lt;" format="5" revision_id="mother!">
113
 
<file file_id="bar-20050901064931-73b4b1138abc9cd2" name="bar" parent_id="f&lt;" revision="mbp@foo-123123" text_sha1="A" text_size="1" />
 
131
<file file_id="bar-20050901064931-73b4b1138abc9cd2" name="bar" parent_id="f&lt;" revision="mbp@foo-123123" />
114
132
<directory file_id="foo-20050801201819-4139aa4a272f4250" name="subdir" parent_id="f&lt;" revision="mbp@foo-00" />
115
 
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134" name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" revision="mbp@foo-00" text_sha1="B" text_size="0" />
116
 
<symlink file_id="link-1" name="link" parent_id="foo-20050801201819-4139aa4a272f4250" revision="mbp@foo-00" symlink_target="a" />
117
 
</inventory>
118
 
"""
119
 
 
120
 
_expected_inv_v6 = """<inventory format="6" revision_id="rev_outer">
121
 
<directory file_id="tree-root-321" name="" revision="rev_outer" />
122
 
<directory file_id="dir-id" name="dir" parent_id="tree-root-321" revision="rev_outer" />
123
 
<file file_id="file-id" name="file" parent_id="tree-root-321" revision="rev_outer" text_sha1="A" text_size="1" />
124
 
<symlink file_id="link-id" name="link" parent_id="tree-root-321" revision="rev_outer" symlink_target="a" />
 
133
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134" name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" revision="mbp@foo-00" />
125
134
</inventory>
126
135
"""
127
136
 
128
137
_expected_inv_v7 = """<inventory format="7" revision_id="rev_outer">
129
138
<directory file_id="tree-root-321" name="" revision="rev_outer" />
130
139
<directory file_id="dir-id" name="dir" parent_id="tree-root-321" revision="rev_outer" />
131
 
<file file_id="file-id" name="file" parent_id="tree-root-321" revision="rev_outer" text_sha1="A" text_size="1" />
132
 
<symlink file_id="link-id" name="link" parent_id="tree-root-321" revision="rev_outer" symlink_target="a" />
 
140
<file file_id="file-id" name="file" parent_id="tree-root-321" revision="rev_outer" />
 
141
<symlink file_id="link-id" name="link" parent_id="tree-root-321" revision="rev_outer" />
133
142
<tree-reference file_id="nested-id" name="nested" parent_id="tree-root-321" revision="rev_outer" reference_revision="rev_inner" />
134
143
</inventory>
135
144
"""
136
145
 
137
 
_expected_rev_v8 = """<revision committer="Martin Pool &lt;mbp@sourcefrog.net&gt;" format="8" inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41" revision_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9" timestamp="1125907235.212" timezone="36000">
138
 
<message>- start splitting code for xml (de)serialization away from objects
139
 
  preparatory to supporting multiple formats by a single library
140
 
</message>
141
 
<parents>
142
 
<revision_ref revision_id="mbp@sourcefrog.net-20050905063503-43948f59fa127d92" />
143
 
</parents>
144
 
</revision>
145
 
"""
146
 
 
147
 
_expected_inv_v8 = """<inventory format="8" revision_id="rev_outer">
148
 
<directory file_id="tree-root-321" name="" revision="rev_outer" />
149
 
<directory file_id="dir-id" name="dir" parent_id="tree-root-321" revision="rev_outer" />
150
 
<file file_id="file-id" name="file" parent_id="tree-root-321" revision="rev_outer" text_sha1="A" text_size="1" />
151
 
<symlink file_id="link-id" name="link" parent_id="tree-root-321" revision="rev_outer" symlink_target="a" />
152
 
</inventory>
153
 
"""
154
 
 
155
146
_revision_utf8_v5 = """<revision committer="Erik B&#229;gfors &lt;erik@foo.net&gt;"
156
147
    inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41"
157
148
    revision_id="erik@b&#229;gfors-02"
180
171
</inventory>
181
172
"""
182
173
 
183
 
# Before revision_id was always stored as an attribute
184
 
_inventory_v5a = """<inventory format="5">
185
 
</inventory>
186
 
"""
187
 
 
188
 
# Before revision_id was always stored as an attribute
189
 
_inventory_v5b = """<inventory format="5" revision_id="a-rev-id">
190
 
</inventory>
191
 
"""
192
 
 
193
174
 
194
175
class TestSerializer(TestCase):
195
176
    """Test XML serialization"""
 
177
    def test_canned_inventory(self):
 
178
        """Test unpacked a canned inventory v4 file."""
 
179
        inp = StringIO(_working_inventory_v4)
 
180
        inv = serializer_v4.read_inventory(inp)
 
181
        self.assertEqual(len(inv), 4)
 
182
        self.assert_('bar-20050901064931-73b4b1138abc9cd2' in inv)
 
183
 
 
184
    def test_unpack_revision(self):
 
185
        """Test unpacking a canned revision v4"""
 
186
        inp = StringIO(_revision_v4)
 
187
        rev = serializer_v4.read_revision(inp)
 
188
        eq = self.assertEqual
 
189
        eq(rev.committer,
 
190
           "Martin Pool <mbp@sourcefrog.net>")
 
191
        eq(rev.inventory_id,
 
192
           "mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9")
 
193
        eq(len(rev.parent_ids), 1)
 
194
        eq(rev.parent_ids[0],
 
195
           "mbp@sourcefrog.net-20050905063503-43948f59fa127d92")
196
196
 
197
197
    def test_unpack_revision_5(self):
198
198
        """Test unpacking a canned revision v5"""
242
242
        eq(ie.name, 'bar')
243
243
        eq(inv[ie.parent_id].kind, 'directory')
244
244
 
245
 
    def test_unpack_inventory_5a(self):
246
 
        inv = bzrlib.xml5.serializer_v5.read_inventory_from_string(
247
 
                _inventory_v5a, revision_id='test-rev-id')
248
 
        self.assertEqual('test-rev-id', inv.root.revision)
249
 
 
250
 
    def test_unpack_inventory_5a_cache_and_copy(self):
251
 
        # Passing an entry_cache should get populated with the objects
252
 
        # But the returned objects should be copies if return_from_cache is
253
 
        # False
254
 
        entry_cache = fifo_cache.FIFOCache()
255
 
        inv = bzrlib.xml5.serializer_v5.read_inventory_from_string(
256
 
            _inventory_v5a, revision_id='test-rev-id',
257
 
            entry_cache=entry_cache, return_from_cache=False)
258
 
        for entry in inv.iter_just_entries():
259
 
            key = (entry.file_id, entry.revision)
260
 
            if entry.file_id is inv.root.file_id:
261
 
                # The root id is inferred for xml v5
262
 
                self.assertFalse(key in entry_cache)
263
 
            else:
264
 
                self.assertIsNot(entry, entry_cache[key])
265
 
 
266
 
    def test_unpack_inventory_5a_cache_no_copy(self):
267
 
        # Passing an entry_cache should get populated with the objects
268
 
        # The returned objects should be exact if return_from_cache is
269
 
        # True
270
 
        entry_cache = fifo_cache.FIFOCache()
271
 
        inv = bzrlib.xml5.serializer_v5.read_inventory_from_string(
272
 
            _inventory_v5a, revision_id='test-rev-id',
273
 
            entry_cache=entry_cache, return_from_cache=True)
274
 
        for entry in inv.iter_just_entries():
275
 
            key = (entry.file_id, entry.revision)
276
 
            if entry.file_id is inv.root.file_id:
277
 
                # The root id is inferred for xml v5
278
 
                self.assertFalse(key in entry_cache)
279
 
            else:
280
 
                self.assertIs(entry, entry_cache[key])
281
 
 
282
 
    def test_unpack_inventory_5b(self):
283
 
        inv = bzrlib.xml5.serializer_v5.read_inventory_from_string(
284
 
                _inventory_v5b, revision_id='test-rev-id')
285
 
        self.assertEqual('a-rev-id', inv.root.revision)
286
 
 
287
245
    def test_repack_inventory_5(self):
288
246
        inp = StringIO(_committed_inv_v5)
289
247
        inv = bzrlib.xml5.serializer_v5.read_inventory(inp)
292
250
        self.assertEqualDiff(_expected_inv_v5, outp.getvalue())
293
251
        inv2 = bzrlib.xml5.serializer_v5.read_inventory(StringIO(outp.getvalue()))
294
252
        self.assertEqual(inv, inv2)
295
 
 
 
253
    
296
254
    def assertRoundTrips(self, xml_string):
297
255
        inp = StringIO(xml_string)
298
256
        inv = bzrlib.xml5.serializer_v5.read_inventory(inp)
299
257
        outp = StringIO()
300
258
        bzrlib.xml5.serializer_v5.write_inventory(inv, outp)
301
259
        self.assertEqualDiff(xml_string, outp.getvalue())
302
 
        lines = bzrlib.xml5.serializer_v5.write_inventory_to_lines(inv)
303
 
        outp.seek(0)
304
 
        self.assertEqual(outp.readlines(), lines)
305
260
        inv2 = bzrlib.xml5.serializer_v5.read_inventory(StringIO(outp.getvalue()))
306
261
        self.assertEqual(inv, inv2)
307
262
 
347
302
        new_rev = s_v5.read_revision_from_string(txt)
348
303
        self.assertEqual(props, new_rev.properties)
349
304
 
350
 
    def get_sample_inventory(self):
 
305
    def test_roundtrip_inventory_v7(self):
351
306
        inv = Inventory('tree-root-321', revision_id='rev_outer')
 
307
        inv.add(inventory.TreeReference('nested-id', 'nested', 'tree-root-321',
 
308
                                        'rev_outer', 'rev_inner'))
352
309
        inv.add(inventory.InventoryFile('file-id', 'file', 'tree-root-321'))
353
 
        inv.add(inventory.InventoryDirectory('dir-id', 'dir',
 
310
        inv.add(inventory.InventoryDirectory('dir-id', 'dir', 
354
311
                                             'tree-root-321'))
355
312
        inv.add(inventory.InventoryLink('link-id', 'link', 'tree-root-321'))
356
313
        inv['tree-root-321'].revision = 'rev_outer'
357
314
        inv['dir-id'].revision = 'rev_outer'
358
315
        inv['file-id'].revision = 'rev_outer'
359
 
        inv['file-id'].text_sha1 = 'A'
360
 
        inv['file-id'].text_size = 1
361
316
        inv['link-id'].revision = 'rev_outer'
362
 
        inv['link-id'].symlink_target = 'a'
363
 
        return inv
364
 
 
365
 
    def test_roundtrip_inventory_v7(self):
366
 
        inv = self.get_sample_inventory()
367
 
        inv.add(inventory.TreeReference('nested-id', 'nested', 'tree-root-321',
368
 
                                        'rev_outer', 'rev_inner'))
369
317
        txt = xml7.serializer_v7.write_inventory_to_string(inv)
370
 
        lines = xml7.serializer_v7.write_inventory_to_lines(inv)
371
 
        self.assertEqual(bzrlib.osutils.split_lines(txt), lines)
372
318
        self.assertEqualDiff(_expected_inv_v7, txt)
373
319
        inv2 = xml7.serializer_v7.read_inventory_from_string(txt)
374
320
        self.assertEqual(5, len(inv2))
375
321
        for path, ie in inv.iter_entries():
376
322
            self.assertEqual(ie, inv2[ie.file_id])
377
323
 
378
 
    def test_roundtrip_inventory_v6(self):
379
 
        inv = self.get_sample_inventory()
380
 
        txt = xml6.serializer_v6.write_inventory_to_string(inv)
381
 
        lines = xml6.serializer_v6.write_inventory_to_lines(inv)
382
 
        self.assertEqual(bzrlib.osutils.split_lines(txt), lines)
383
 
        self.assertEqualDiff(_expected_inv_v6, txt)
384
 
        inv2 = xml6.serializer_v6.read_inventory_from_string(txt)
385
 
        self.assertEqual(4, len(inv2))
386
 
        for path, ie in inv.iter_entries():
387
 
            self.assertEqual(ie, inv2[ie.file_id])
388
 
 
389
324
    def test_wrong_format_v7(self):
390
325
        """Can't accidentally open a file with wrong serializer"""
391
326
        s_v6 = bzrlib.xml6.serializer_v6
392
327
        s_v7 = xml7.serializer_v7
393
 
        self.assertRaises(errors.UnexpectedInventoryFormat,
 
328
        self.assertRaises(errors.UnexpectedInventoryFormat, 
394
329
                          s_v7.read_inventory_from_string, _expected_inv_v5)
395
 
        self.assertRaises(errors.UnexpectedInventoryFormat,
 
330
        self.assertRaises(errors.UnexpectedInventoryFormat, 
396
331
                          s_v6.read_inventory_from_string, _expected_inv_v7)
397
332
 
398
333
    def test_tree_reference(self):
399
334
        s_v5 = bzrlib.xml5.serializer_v5
400
335
        s_v6 = bzrlib.xml6.serializer_v6
401
336
        s_v7 = xml7.serializer_v7
402
 
        inv = Inventory('tree-root-321', revision_id='rev-outer')
403
 
        inv.root.revision = 'root-rev'
 
337
        inv = Inventory('tree-root-321')
404
338
        inv.add(inventory.TreeReference('nested-id', 'nested', 'tree-root-321',
405
339
                                        'rev-outer', 'rev-inner'))
406
 
        self.assertRaises(errors.UnsupportedInventoryKind,
 
340
        self.assertRaises(errors.UnsupportedInventoryKind, 
407
341
                          s_v5.write_inventory_to_string, inv)
408
 
        self.assertRaises(errors.UnsupportedInventoryKind,
 
342
        self.assertRaises(errors.UnsupportedInventoryKind, 
409
343
                          s_v6.write_inventory_to_string, inv)
410
344
        txt = s_v7.write_inventory_to_string(inv)
411
 
        lines = s_v7.write_inventory_to_lines(inv)
412
 
        self.assertEqual(bzrlib.osutils.split_lines(txt), lines)
413
345
        inv2 = s_v7.read_inventory_from_string(txt)
414
346
        self.assertEqual('tree-root-321', inv2['nested-id'].parent_id)
415
347
        self.assertEqual('rev-outer', inv2['nested-id'].revision)
416
348
        self.assertEqual('rev-inner', inv2['nested-id'].reference_revision)
417
 
 
418
 
    def test_roundtrip_inventory_v8(self):
419
 
        inv = self.get_sample_inventory()
420
 
        txt = xml8.serializer_v8.write_inventory_to_string(inv)
421
 
        inv2 = xml8.serializer_v8.read_inventory_from_string(txt)
422
 
        self.assertEqual(4, len(inv2))
423
 
        for path, ie in inv.iter_entries():
424
 
            self.assertEqual(ie, inv2[ie.file_id])
425
 
 
426
 
    def test_inventory_text_v8(self):
427
 
        inv = self.get_sample_inventory()
428
 
        txt = xml8.serializer_v8.write_inventory_to_string(inv)
429
 
        lines = xml8.serializer_v8.write_inventory_to_lines(inv)
430
 
        self.assertEqual(bzrlib.osutils.split_lines(txt), lines)
431
 
        self.assertEqualDiff(_expected_inv_v8, txt)
432
 
 
433
 
    def test_revision_text_v6(self):
434
 
        """Pack revision to XML v6"""
435
 
        rev = bzrlib.xml6.serializer_v6.read_revision_from_string(
436
 
            _expected_rev_v5)
437
 
        serialized = bzrlib.xml6.serializer_v6.write_revision_to_string(rev)
438
 
        self.assertEqualDiff(serialized, _expected_rev_v5)
439
 
 
440
 
    def test_revision_text_v7(self):
441
 
        """Pack revision to XML v7"""
442
 
        rev = bzrlib.xml7.serializer_v7.read_revision_from_string(
443
 
            _expected_rev_v5)
444
 
        serialized = bzrlib.xml7.serializer_v7.write_revision_to_string(rev)
445
 
        self.assertEqualDiff(serialized, _expected_rev_v5)
446
 
 
447
 
    def test_revision_text_v8(self):
448
 
        """Pack revision to XML v8"""
449
 
        rev = bzrlib.xml8.serializer_v8.read_revision_from_string(
450
 
            _expected_rev_v8)
451
 
        serialized = bzrlib.xml8.serializer_v8.write_revision_to_string(rev)
452
 
        self.assertEqualDiff(serialized, _expected_rev_v8)
 
349
        self.assertRaises(errors.UnsupportedInventoryKind, 
 
350
                          s_v6.read_inventory_from_string,
 
351
                          txt.replace('format="7"', 'format="6"'))
 
352
        self.assertRaises(errors.UnsupportedInventoryKind, 
 
353
                          s_v5.read_inventory_from_string,
 
354
                          txt.replace('format="7"', 'format="5"'))
453
355
 
454
356
    def test_revision_ids_are_utf8(self):
455
357
        """Parsed revision_ids should all be utf-8 strings, not unicode."""
471
373
        fid_bar1 = u'b\xe5r-01'.encode('utf8')
472
374
        fid_sub = u's\xb5bdir-01'.encode('utf8')
473
375
        fid_bar2 = u'b\xe5r-02'.encode('utf8')
474
 
        expected = [(u'', fid_root, None, rev_id_2),
 
376
        expected = [(u'', fid_root, None, None),
475
377
                    (u'b\xe5r', fid_bar1, fid_root, rev_id_1),
476
378
                    (u's\xb5bdir', fid_sub, fid_root, rev_id_1),
477
379
                    (u's\xb5bdir/b\xe5r', fid_bar2, fid_sub, rev_id_2),
500
402
    """Whitebox testing of the _encode_and_escape function."""
501
403
 
502
404
    def setUp(self):
503
 
        super(TestEncodeAndEscape, self).setUp()
504
405
        # Keep the cache clear before and after the test
505
 
        bzrlib.xml_serializer._clear_cache()
506
 
        self.addCleanup(bzrlib.xml_serializer._clear_cache)
 
406
        bzrlib.xml5._ensure_utf8_re()
 
407
        bzrlib.xml5._clear_cache()
 
408
        self.addCleanup(bzrlib.xml5._clear_cache)
507
409
 
508
410
    def test_simple_ascii(self):
509
411
        # _encode_and_escape always appends a final ", because these parameters
510
412
        # are being used in xml attributes, and by returning it now, we have to
511
413
        # do fewer string operations later.
512
 
        val = bzrlib.xml_serializer.encode_and_escape('foo bar')
 
414
        val = bzrlib.xml5._encode_and_escape('foo bar')
513
415
        self.assertEqual('foo bar"', val)
514
416
        # The second time should be cached
515
 
        val2 = bzrlib.xml_serializer.encode_and_escape('foo bar')
 
417
        val2 = bzrlib.xml5._encode_and_escape('foo bar')
516
418
        self.assertIs(val2, val)
517
419
 
518
420
    def test_ascii_with_xml(self):
519
421
        self.assertEqual('&amp;&apos;&quot;&lt;&gt;"',
520
 
                         bzrlib.xml_serializer.encode_and_escape('&\'"<>'))
 
422
                         bzrlib.xml5._encode_and_escape('&\'"<>'))
521
423
 
522
424
    def test_utf8_with_xml(self):
523
425
        # u'\xb5\xe5&\u062c'
524
426
        utf8_str = '\xc2\xb5\xc3\xa5&\xd8\xac'
525
427
        self.assertEqual('&#181;&#229;&amp;&#1580;"',
526
 
                         bzrlib.xml_serializer.encode_and_escape(utf8_str))
 
428
                         bzrlib.xml5._encode_and_escape(utf8_str))
527
429
 
528
430
    def test_unicode(self):
529
431
        uni_str = u'\xb5\xe5&\u062c'
530
432
        self.assertEqual('&#181;&#229;&amp;&#1580;"',
531
 
                         bzrlib.xml_serializer.encode_and_escape(uni_str))
532
 
 
533
 
 
534
 
class TestMisc(TestCase):
535
 
 
536
 
    def test_unescape_xml(self):
537
 
        """We get some kind of error when malformed entities are passed"""
538
 
        self.assertRaises(KeyError, bzrlib.xml8._unescape_xml, 'foo&bar;')
 
433
                         bzrlib.xml5._encode_and_escape(uni_str))