~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/test_xml.py

  • Committer: John Arbash Meinel
  • Date: 2005-09-16 14:57:59 UTC
  • mto: (1393.2.1)
  • mto: This revision was merged to the branch mainline in revision 1396.
  • Revision ID: john@arbash-meinel.com-20050916145758-ad06c9ae86840f17
Merged up-to-date against mainline, still broken.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 Canonical Ltd
2
 
#
 
1
# Copyright (C) 2005 by 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.tests import TestCase
 
19
from bzrlib.selftest import TestCase
20
20
from bzrlib.inventory import Inventory, InventoryEntry
21
 
from bzrlib.xml4 import serializer_v4
22
 
import bzrlib.xml5
 
21
from bzrlib.xml import serializer_v4, serializer_v5
23
22
 
24
23
_working_inventory_v4 = """<inventory file_id="TREE_ROOT">
25
24
<entry file_id="bar-20050901064931-73b4b1138abc9cd2" kind="file" name="bar" parent_id="TREE_ROOT" />
44
43
"""
45
44
 
46
45
_revision_v5 = """<revision committer="Martin Pool &lt;mbp@sourcefrog.net&gt;"
 
46
    inventory_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9"
47
47
    inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41"
48
48
    revision_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9"
49
49
    timestamp="1125907235.211783886"
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.211783886"
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
 
 
75
60
_committed_inv_v5 = """<inventory>
76
61
<file file_id="bar-20050901064931-73b4b1138abc9cd2" 
77
62
      name="bar" parent_id="TREE_ROOT" 
78
 
      revision="mbp@foo-123123"/>
79
 
<directory name="subdir"
80
 
           file_id="foo-20050801201819-4139aa4a272f4250"
81
 
           parent_id="TREE_ROOT" 
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"/>
 
63
      text_version="mbp@foo-123123" entry_version="mbp@foo-123123"
 
64
      />
 
65
<directory name="subdir"
 
66
           file_id="foo-20050801201819-4139aa4a272f4250"
 
67
           parent_id="TREE_ROOT" 
 
68
           entry_version="mbp@foo-00"/>
97
69
<file file_id="bar-20050824000535-6bc48cfad47ed134" 
98
70
      name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" 
99
 
      revision="mbp@foo-00"/>
100
 
</inventory>
101
 
"""
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.211783886" 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
 
 
 
71
      entry_version="mbp@foo-00"
 
72
      text_version="mbp@foo-123123"/>
 
73
</inventory>
 
74
"""
132
75
 
133
76
class TestSerializer(TestCase):
134
77
    """Test XML serialization"""
148
91
           "Martin Pool <mbp@sourcefrog.net>")
149
92
        eq(rev.inventory_id,
150
93
           "mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9")
151
 
        eq(len(rev.parent_ids), 1)
152
 
        eq(rev.parent_ids[0],
 
94
        eq(len(rev.parents), 1)
 
95
        eq(rev.parents[0].revision_id,
153
96
           "mbp@sourcefrog.net-20050905063503-43948f59fa127d92")
154
97
 
155
98
    def test_unpack_revision_5(self):
156
99
        """Test unpacking a canned revision v5"""
157
100
        inp = StringIO(_revision_v5)
158
 
        rev = bzrlib.xml5.serializer_v5.read_revision(inp)
 
101
        rev = serializer_v5.read_revision(inp)
159
102
        eq = self.assertEqual
160
103
        eq(rev.committer,
161
104
           "Martin Pool <mbp@sourcefrog.net>")
162
 
        eq(len(rev.parent_ids), 1)
 
105
        eq(rev.inventory_id,
 
106
           "mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9")
 
107
        eq(len(rev.parents), 1)
163
108
        eq(rev.timezone, 36000)
164
 
        eq(rev.parent_ids[0],
165
 
           "mbp@sourcefrog.net-20050905063503-43948f59fa127d92")
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],
 
109
        eq(rev.parents[0].revision_id,
176
110
           "mbp@sourcefrog.net-20050905063503-43948f59fa127d92")
177
111
 
178
112
    def test_unpack_inventory_5(self):
179
113
        """Unpack canned new-style inventory"""
180
114
        inp = StringIO(_committed_inv_v5)
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')
197
 
        ie = inv['bar-20050824000535-6bc48cfad47ed134']
198
 
        eq(ie.kind, 'file')
199
 
        eq(ie.revision, 'mbp@foo-00')
 
115
        inv = serializer_v5.read_inventory(inp)
 
116
        eq = self.assertEqual
 
117
        eq(len(inv), 4)
 
118
        ie = inv['bar-20050824000535-6bc48cfad47ed134']
 
119
        eq(ie.kind, 'file')
 
120
        eq(ie.text_version, 'mbp@foo-123123')
 
121
        eq(ie.entry_version, 'mbp@foo-00')
200
122
        eq(ie.name, 'bar')
201
123
        eq(inv[ie.parent_id].kind, 'directory')
202
124
 
203
125
    def test_repack_inventory_5(self):
204
126
        inp = StringIO(_committed_inv_v5)
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))
 
127
        inv = serializer_v5.read_inventory(inp)
 
128
        outp = StringIO()
 
129
        serializer_v5.write_inventory(inv, outp)
 
130
        inv2 = serializer_v5.read_inventory(StringIO(outp.getvalue()))
 
131
        self.assertEqual(inv, inv2)
 
132
 
 
133
    def test_repack_revision_5(self):
 
134
        inp = StringIO(_revision_v5)
 
135
        rev = serializer_v5.read_revision(inp)
 
136
        outp = StringIO()
 
137
        serializer_v5.write_revision(rev, outp)
 
138
        rev2 = serializer_v5.read_revision(StringIO(outp.getvalue()))
232
139
        self.assertEqual(rev, rev2)
233
140
 
234
 
    def test_repack_revision_5(self):
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)