~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-01-25 05:18:17 UTC
  • mfrom: (2241.1.3 repoformats)
  • Revision ID: pqm@pqm.ubuntu.com-20070125051817-53a80525dbdf87b4
(mbp) Change RepositoryFormat to use a registry (r=john)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 by Canonical Ltd
2
 
 
 
1
# Copyright (C) 2005 Canonical Ltd
 
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
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
7
 
 
 
7
#
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
11
# GNU General Public License for more details.
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
from cStringIO import StringIO
18
18
 
19
 
from bzrlib.selftest import TestCase
 
19
from bzrlib.tests import TestCase
20
20
from bzrlib.inventory import Inventory, InventoryEntry
21
21
from bzrlib.xml4 import serializer_v4
22
 
from bzrlib.xml5 import serializer_v5
 
22
import bzrlib.xml5
23
23
 
24
24
_working_inventory_v4 = """<inventory file_id="TREE_ROOT">
25
25
<entry file_id="bar-20050901064931-73b4b1138abc9cd2" kind="file" name="bar" parent_id="TREE_ROOT" />
32
32
    inventory_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9"
33
33
    inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41"
34
34
    revision_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9"
35
 
    timestamp="1125907235.211783886"
 
35
    timestamp="1125907235.212"
36
36
    timezone="36000">
37
37
<message>- start splitting code for xml (de)serialization away from objects
38
38
  preparatory to supporting multiple formats by a single library
46
46
_revision_v5 = """<revision committer="Martin Pool &lt;mbp@sourcefrog.net&gt;"
47
47
    inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41"
48
48
    revision_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9"
49
 
    timestamp="1125907235.211783886"
 
49
    timestamp="1125907235.212"
50
50
    timezone="36000">
51
51
<message>- start splitting code for xml (de)serialization away from objects
52
52
  preparatory to supporting multiple formats by a single library
57
57
</revision>
58
58
"""
59
59
 
 
60
_revision_v5_utc = """\
 
61
<revision committer="Martin Pool &lt;mbp@sourcefrog.net&gt;"
 
62
    inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41"
 
63
    revision_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9"
 
64
    timestamp="1125907235.212"
 
65
    timezone="0">
 
66
<message>- start splitting code for xml (de)serialization away from objects
 
67
  preparatory to supporting multiple formats by a single library
 
68
</message>
 
69
<parents>
 
70
<revision_ref revision_id="mbp@sourcefrog.net-20050905063503-43948f59fa127d92"/>
 
71
</parents>
 
72
</revision>
 
73
"""
 
74
 
60
75
_committed_inv_v5 = """<inventory>
61
76
<file file_id="bar-20050901064931-73b4b1138abc9cd2" 
62
77
      name="bar" parent_id="TREE_ROOT" 
65
80
           file_id="foo-20050801201819-4139aa4a272f4250"
66
81
           parent_id="TREE_ROOT" 
67
82
           revision="mbp@foo-00"/>
 
83
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134" 
 
84
      name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" 
 
85
      revision="mbp@foo-00"/>
 
86
</inventory>
 
87
"""
 
88
 
 
89
_basis_inv_v5 = """<inventory revision_id="mbp@sourcefrog.net-20050905063503-43948f59fa127d92">
 
90
<file file_id="bar-20050901064931-73b4b1138abc9cd2" 
 
91
      name="bar" parent_id="TREE_ROOT" 
 
92
      revision="mbp@foo-123123"/>
 
93
<directory name="subdir"
 
94
           file_id="foo-20050801201819-4139aa4a272f4250"
 
95
           parent_id="TREE_ROOT" 
 
96
           revision="mbp@foo-00"/>
68
97
<file file_id="bar-20050824000535-6bc48cfad47ed134" 
69
98
      name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" 
70
99
      revision="mbp@foo-00"/>
71
100
</inventory>
72
101
"""
73
102
 
 
103
 
 
104
# DO NOT REFLOW THIS. Its the exact revision we want.
 
105
_expected_rev_v5 = """<revision committer="Martin Pool &lt;mbp@sourcefrog.net&gt;" format="5" inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41" revision_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9" timestamp="1125907235.212" timezone="36000">
 
106
<message>- start splitting code for xml (de)serialization away from objects
 
107
  preparatory to supporting multiple formats by a single library
 
108
</message>
 
109
<parents>
 
110
<revision_ref revision_id="mbp@sourcefrog.net-20050905063503-43948f59fa127d92" />
 
111
</parents>
 
112
</revision>
 
113
"""
 
114
 
 
115
 
 
116
# DO NOT REFLOW THIS. Its the exact inventory we want.
 
117
_expected_inv_v5 = """<inventory format="5">
 
118
<file file_id="bar-20050901064931-73b4b1138abc9cd2" name="bar" revision="mbp@foo-123123" />
 
119
<directory file_id="foo-20050801201819-4139aa4a272f4250" name="subdir" revision="mbp@foo-00" />
 
120
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134" name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" revision="mbp@foo-00" />
 
121
</inventory>
 
122
"""
 
123
 
 
124
 
 
125
_expected_inv_v5_root = """<inventory file_id="f&lt;" format="5" revision_id="mother!">
 
126
<file file_id="bar-20050901064931-73b4b1138abc9cd2" name="bar" parent_id="f&lt;" revision="mbp@foo-123123" />
 
127
<directory file_id="foo-20050801201819-4139aa4a272f4250" name="subdir" parent_id="f&lt;" revision="mbp@foo-00" />
 
128
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134" name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" revision="mbp@foo-00" />
 
129
</inventory>
 
130
"""
 
131
 
 
132
 
74
133
class TestSerializer(TestCase):
75
134
    """Test XML serialization"""
76
135
    def test_canned_inventory(self):
96
155
    def test_unpack_revision_5(self):
97
156
        """Test unpacking a canned revision v5"""
98
157
        inp = StringIO(_revision_v5)
99
 
        rev = serializer_v5.read_revision(inp)
 
158
        rev = bzrlib.xml5.serializer_v5.read_revision(inp)
100
159
        eq = self.assertEqual
101
160
        eq(rev.committer,
102
161
           "Martin Pool <mbp@sourcefrog.net>")
105
164
        eq(rev.parent_ids[0],
106
165
           "mbp@sourcefrog.net-20050905063503-43948f59fa127d92")
107
166
 
 
167
    def test_unpack_revision_5_utc(self):
 
168
        inp = StringIO(_revision_v5_utc)
 
169
        rev = bzrlib.xml5.serializer_v5.read_revision(inp)
 
170
        eq = self.assertEqual
 
171
        eq(rev.committer,
 
172
           "Martin Pool <mbp@sourcefrog.net>")
 
173
        eq(len(rev.parent_ids), 1)
 
174
        eq(rev.timezone, 0)
 
175
        eq(rev.parent_ids[0],
 
176
           "mbp@sourcefrog.net-20050905063503-43948f59fa127d92")
 
177
 
108
178
    def test_unpack_inventory_5(self):
109
179
        """Unpack canned new-style inventory"""
110
180
        inp = StringIO(_committed_inv_v5)
111
 
        inv = serializer_v5.read_inventory(inp)
112
 
        eq = self.assertEqual
113
 
        eq(len(inv), 4)
 
181
        inv = bzrlib.xml5.serializer_v5.read_inventory(inp)
 
182
        eq = self.assertEqual
 
183
        eq(len(inv), 4)
 
184
        ie = inv['bar-20050824000535-6bc48cfad47ed134']
 
185
        eq(ie.kind, 'file')
 
186
        eq(ie.revision, 'mbp@foo-00')
 
187
        eq(ie.name, 'bar')
 
188
        eq(inv[ie.parent_id].kind, 'directory')
 
189
 
 
190
    def test_unpack_basis_inventory_5(self):
 
191
        """Unpack canned new-style inventory"""
 
192
        inp = StringIO(_basis_inv_v5)
 
193
        inv = bzrlib.xml5.serializer_v5.read_inventory(inp)
 
194
        eq = self.assertEqual
 
195
        eq(len(inv), 4)
 
196
        eq(inv.revision_id, 'mbp@sourcefrog.net-20050905063503-43948f59fa127d92')
114
197
        ie = inv['bar-20050824000535-6bc48cfad47ed134']
115
198
        eq(ie.kind, 'file')
116
199
        eq(ie.revision, 'mbp@foo-00')
119
202
 
120
203
    def test_repack_inventory_5(self):
121
204
        inp = StringIO(_committed_inv_v5)
122
 
        inv = serializer_v5.read_inventory(inp)
123
 
        outp = StringIO()
124
 
        serializer_v5.write_inventory(inv, outp)
125
 
        inv2 = serializer_v5.read_inventory(StringIO(outp.getvalue()))
126
 
        self.assertEqual(inv, inv2)
 
205
        inv = bzrlib.xml5.serializer_v5.read_inventory(inp)
 
206
        outp = StringIO()
 
207
        bzrlib.xml5.serializer_v5.write_inventory(inv, outp)
 
208
        self.assertEqualDiff(_expected_inv_v5, outp.getvalue())
 
209
        inv2 = bzrlib.xml5.serializer_v5.read_inventory(StringIO(outp.getvalue()))
 
210
        self.assertEqual(inv, inv2)
 
211
    
 
212
    def assertRoundTrips(self, xml_string):
 
213
        inp = StringIO(xml_string)
 
214
        inv = bzrlib.xml5.serializer_v5.read_inventory(inp)
 
215
        outp = StringIO()
 
216
        bzrlib.xml5.serializer_v5.write_inventory(inv, outp)
 
217
        self.assertEqualDiff(xml_string, outp.getvalue())
 
218
        inv2 = bzrlib.xml5.serializer_v5.read_inventory(StringIO(outp.getvalue()))
 
219
        self.assertEqual(inv, inv2)
 
220
 
 
221
    def tests_serialize_inventory_v5_with_root(self):
 
222
        self.assertRoundTrips(_expected_inv_v5_root)
 
223
 
 
224
    def check_repack_revision(self, txt):
 
225
        """Check that repacking a revision yields the same information"""
 
226
        inp = StringIO(txt)
 
227
        rev = bzrlib.xml5.serializer_v5.read_revision(inp)
 
228
        outp = StringIO()
 
229
        bzrlib.xml5.serializer_v5.write_revision(rev, outp)
 
230
        outfile_contents = outp.getvalue()
 
231
        rev2 = bzrlib.xml5.serializer_v5.read_revision(StringIO(outfile_contents))
 
232
        self.assertEqual(rev, rev2)
127
233
 
128
234
    def test_repack_revision_5(self):
129
 
        inp = StringIO(_revision_v5)
130
 
        rev = serializer_v5.read_revision(inp)
131
 
        outp = StringIO()
132
 
        serializer_v5.write_revision(rev, outp)
133
 
        rev2 = serializer_v5.read_revision(StringIO(outp.getvalue()))
134
 
        self.assertEqual(rev, rev2)
135
 
 
 
235
        """Round-trip revision to XML v5"""
 
236
        self.check_repack_revision(_revision_v5)
 
237
 
 
238
    def test_repack_revision_5_utc(self):
 
239
        self.check_repack_revision(_revision_v5_utc)
 
240
 
 
241
    def test_pack_revision_5(self):
 
242
        """Pack revision to XML v5"""
 
243
        # fixed 20051025, revisions should have final newline
 
244
        rev = bzrlib.xml5.serializer_v5.read_revision_from_string(_revision_v5)
 
245
        outp = StringIO()
 
246
        bzrlib.xml5.serializer_v5.write_revision(rev, outp)
 
247
        outfile_contents = outp.getvalue()
 
248
        self.assertEqual(outfile_contents[-1], '\n')
 
249
        self.assertEqualDiff(outfile_contents, bzrlib.xml5.serializer_v5.write_revision_to_string(rev))
 
250
        self.assertEqualDiff(outfile_contents, _expected_rev_v5)
 
251
 
 
252
    def test_empty_property_value(self):
 
253
        """Create an empty property value check that it serializes correctly"""
 
254
        s_v5 = bzrlib.xml5.serializer_v5
 
255
        rev = s_v5.read_revision_from_string(_revision_v5)
 
256
        outp = StringIO()
 
257
        props = {'empty':'', 'one':'one'}
 
258
        rev.properties = props
 
259
        txt = s_v5.write_revision_to_string(rev)
 
260
        new_rev = s_v5.read_revision_from_string(txt)
 
261
        self.assertEqual(props, new_rev.properties)