1
# Copyright (C) 2005 by 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
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
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.
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
17
17
from cStringIO import StringIO
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
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" />
60
_revision_v5_utc = """\
61
<revision committer="Martin Pool <mbp@sourcefrog.net>"
62
inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41"
63
revision_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9"
64
timestamp="1125907235.212"
66
<message>- start splitting code for xml (de)serialization away from objects
67
preparatory to supporting multiple formats by a single library
70
<revision_ref revision_id="mbp@sourcefrog.net-20050905063503-43948f59fa127d92"/>
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"/>
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"
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"/>
104
# DO NOT REFLOW THIS. Its the exact revision we want.
105
_expected_rev_v5 = """<revision committer="Martin Pool <mbp@sourcefrog.net>" 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
110
<revision_ref revision_id="mbp@sourcefrog.net-20050905063503-43948f59fa127d92" />
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" />
125
_expected_inv_v5_root = """<inventory file_id="f<" format="5" revision_id="mother!">
126
<file file_id="bar-20050901064931-73b4b1138abc9cd2" name="bar" parent_id="f<" revision="mbp@foo-123123" />
127
<directory file_id="foo-20050801201819-4139aa4a272f4250" name="subdir" parent_id="f<" revision="mbp@foo-00" />
128
<file executable="yes" file_id="bar-20050824000535-6bc48cfad47ed134" name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" revision="mbp@foo-00" />
74
133
class TestSerializer(TestCase):
75
134
"""Test XML serialization"""
76
135
def test_canned_inventory(self):
105
164
eq(rev.parent_ids[0],
106
165
"mbp@sourcefrog.net-20050905063503-43948f59fa127d92")
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
172
"Martin Pool <mbp@sourcefrog.net>")
173
eq(len(rev.parent_ids), 1)
175
eq(rev.parent_ids[0],
176
"mbp@sourcefrog.net-20050905063503-43948f59fa127d92")
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
181
inv = bzrlib.xml5.serializer_v5.read_inventory(inp)
182
eq = self.assertEqual
184
ie = inv['bar-20050824000535-6bc48cfad47ed134']
186
eq(ie.revision, 'mbp@foo-00')
188
eq(inv[ie.parent_id].kind, 'directory')
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
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')
120
203
def test_repack_inventory_5(self):
121
204
inp = StringIO(_committed_inv_v5)
122
inv = serializer_v5.read_inventory(inp)
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)
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)
212
def assertRoundTrips(self, xml_string):
213
inp = StringIO(xml_string)
214
inv = bzrlib.xml5.serializer_v5.read_inventory(inp)
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)
221
def tests_serialize_inventory_v5_with_root(self):
222
self.assertRoundTrips(_expected_inv_v5_root)
224
def check_repack_revision(self, txt):
225
"""Check that repacking a revision yields the same information"""
227
rev = bzrlib.xml5.serializer_v5.read_revision(inp)
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)
128
234
def test_repack_revision_5(self):
129
inp = StringIO(_revision_v5)
130
rev = serializer_v5.read_revision(inp)
132
serializer_v5.write_revision(rev, outp)
133
rev2 = serializer_v5.read_revision(StringIO(outp.getvalue()))
134
self.assertEqual(rev, rev2)
235
"""Round-trip revision to XML v5"""
236
self.check_repack_revision(_revision_v5)
238
def test_repack_revision_5_utc(self):
239
self.check_repack_revision(_revision_v5_utc)
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)
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)
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)
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)