~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_xml.py

  • Committer: Alexander Belchenko
  • Date: 2007-01-28 18:15:53 UTC
  • mto: This revision was merged to the branch mainline in revision 2260.
  • Revision ID: bialix@ukr.net-20070128181553-rtyivph5j4xn1yle
test_external_diff_binary: run external diff with --binary flag

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
 
from bzrlib.xml import serializer_v4, serializer_v5
 
21
from bzrlib.xml4 import serializer_v4
 
22
import bzrlib.xml5
22
23
 
23
24
_working_inventory_v4 = """<inventory file_id="TREE_ROOT">
24
25
<entry file_id="bar-20050901064931-73b4b1138abc9cd2" kind="file" name="bar" parent_id="TREE_ROOT" />
31
32
    inventory_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9"
32
33
    inventory_sha1="e79c31c1deb64c163cf660fdedd476dd579ffd41"
33
34
    revision_id="mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9"
34
 
    timestamp="1125907235.211783886"
 
35
    timestamp="1125907235.212"
35
36
    timezone="36000">
36
37
<message>- start splitting code for xml (de)serialization away from objects
37
38
  preparatory to supporting multiple formats by a single library
43
44
"""
44
45
 
45
46
_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
 
    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" 
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"/>
 
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"/>
69
97
<file file_id="bar-20050824000535-6bc48cfad47ed134" 
70
98
      name="bar" parent_id="foo-20050801201819-4139aa4a272f4250" 
71
 
      entry_version="mbp@foo-00"
72
 
      text_version="mbp@foo-123123"/>
73
 
</inventory>
74
 
"""
 
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.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
 
75
132
 
76
133
class TestSerializer(TestCase):
77
134
    """Test XML serialization"""
91
148
           "Martin Pool <mbp@sourcefrog.net>")
92
149
        eq(rev.inventory_id,
93
150
           "mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9")
94
 
        eq(len(rev.parents), 1)
95
 
        eq(rev.parents[0].revision_id,
 
151
        eq(len(rev.parent_ids), 1)
 
152
        eq(rev.parent_ids[0],
96
153
           "mbp@sourcefrog.net-20050905063503-43948f59fa127d92")
97
154
 
98
155
    def test_unpack_revision_5(self):
99
156
        """Test unpacking a canned revision v5"""
100
157
        inp = StringIO(_revision_v5)
101
 
        rev = serializer_v5.read_revision(inp)
 
158
        rev = bzrlib.xml5.serializer_v5.read_revision(inp)
102
159
        eq = self.assertEqual
103
160
        eq(rev.committer,
104
161
           "Martin Pool <mbp@sourcefrog.net>")
105
 
        eq(rev.inventory_id,
106
 
           "mbp@sourcefrog.net-20050905080035-e0439293f8b6b9f9")
107
 
        eq(len(rev.parents), 1)
 
162
        eq(len(rev.parent_ids), 1)
108
163
        eq(rev.timezone, 36000)
109
 
        eq(rev.parents[0].revision_id,
 
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],
110
176
           "mbp@sourcefrog.net-20050905063503-43948f59fa127d92")
111
177
 
112
178
    def test_unpack_inventory_5(self):
113
179
        """Unpack canned new-style inventory"""
114
180
        inp = StringIO(_committed_inv_v5)
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')
 
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')
122
200
        eq(ie.name, 'bar')
123
201
        eq(inv[ie.parent_id].kind, 'directory')
124
202
 
125
203
    def test_repack_inventory_5(self):
126
204
        inp = StringIO(_committed_inv_v5)
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)
 
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)
132
233
 
133
234
    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()))
139
 
        self.assertEqual(rev, rev2)
140
 
 
 
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)