~bzr-pqm/bzr/bzr.dev

6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1
# Copyright (C) 2009, 2010, 2011, 2016 Canonical Ltd
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
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
16
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
17
"""Tests for bzrlib.inventory_delta.
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
18
19
See doc/developer/inventory.txt for more information.
20
"""
21
22
from cStringIO import StringIO
23
24
from bzrlib import (
25
    inventory,
26
    inventory_delta,
27
    )
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
28
from bzrlib.inventory_delta import InventoryDeltaError
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
29
from bzrlib.inventory import Inventory
30
from bzrlib.revision import NULL_REVISION
31
from bzrlib.tests import TestCase
32
33
### DO NOT REFLOW THESE TEXTS. NEW LINES ARE SIGNIFICANT. ###
34
empty_lines = """format: bzr inventory delta v1 (bzr 1.14)
35
parent: null:
36
version: null:
37
versioned_root: true
38
tree_references: true
39
"""
40
41
root_only_lines = """format: bzr inventory delta v1 (bzr 1.14)
42
parent: null:
43
version: entry-version
44
versioned_root: true
45
tree_references: true
4205.5.3 by Andrew Bennetts
Include oldpath in the the serialised delta
46
None\x00/\x00an-id\x00\x00a@e\xc3\xa5ample.com--2004\x00dir
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
47
"""
48
49
50
root_change_lines = """format: bzr inventory delta v1 (bzr 1.14)
51
parent: entry-version
52
version: changed-root
53
versioned_root: true
54
tree_references: true
55
/\x00an-id\x00\x00different-version\x00dir
56
"""
57
58
corrupt_parent_lines = """format: bzr inventory delta v1 (bzr 1.14)
59
parent: entry-version
60
version: changed-root
61
versioned_root: false
62
tree_references: false
63
/\x00an-id\x00\x00different-version\x00dir
64
"""
65
66
root_only_unversioned = """format: bzr inventory delta v1 (bzr 1.14)
67
parent: null:
68
version: entry-version
69
versioned_root: false
70
tree_references: false
4476.3.46 by Andrew Bennetts
Make actual non-rich-root inventories (which have implicit root entries with non-None revisions) roundtrip through inventory-deltas correctly.
71
None\x00/\x00TREE_ROOT\x00\x00entry-version\x00dir
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
72
"""
73
74
reference_lines = """format: bzr inventory delta v1 (bzr 1.14)
75
parent: null:
76
version: entry-version
77
versioned_root: true
78
tree_references: true
4205.5.3 by Andrew Bennetts
Include oldpath in the the serialised delta
79
None\x00/\x00TREE_ROOT\x00\x00a@e\xc3\xa5ample.com--2004\x00dir
80
None\x00/foo\x00id\x00TREE_ROOT\x00changed\x00tree\x00subtree-version
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
81
"""
82
83
change_tree_lines = """format: bzr inventory delta v1 (bzr 1.14)
84
parent: entry-version
85
version: change-tree
86
versioned_root: false
87
tree_references: false
88
/foo\x00id\x00TREE_ROOT\x00changed-twice\x00tree\x00subtree-version2
89
"""
90
91
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
92
class TestDeserialization(TestCase):
93
    """Test InventoryDeltaSerializer.parse_text_bytes."""
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
94
95
    def test_parse_no_bytes(self):
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
96
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
97
        err = self.assertRaises(
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
98
            InventoryDeltaError, deserializer.parse_text_bytes, '')
4476.3.26 by Andrew Bennetts
Stricter (de)serialization of leading slashes in paths in inventory deltas.
99
        self.assertContainsRe(str(err), 'last line not empty')
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
100
101
    def test_parse_bad_format(self):
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
102
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
103
        err = self.assertRaises(InventoryDeltaError,
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
104
            deserializer.parse_text_bytes, 'format: foo\n')
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
105
        self.assertContainsRe(str(err), 'unknown format')
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
106
107
    def test_parse_no_parent(self):
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
108
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
109
        err = self.assertRaises(InventoryDeltaError,
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
110
            deserializer.parse_text_bytes,
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
111
            'format: bzr inventory delta v1 (bzr 1.14)\n')
112
        self.assertContainsRe(str(err), 'missing parent: marker')
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
113
114
    def test_parse_no_version(self):
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
115
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
116
        err = self.assertRaises(InventoryDeltaError,
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
117
            deserializer.parse_text_bytes,
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
118
            'format: bzr inventory delta v1 (bzr 1.14)\n'
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
119
            'parent: null:\n')
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
120
        self.assertContainsRe(str(err), 'missing version: marker')
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
121
            
122
    def test_parse_duplicate_key_errors(self):
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
123
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
124
        double_root_lines = \
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
125
"""format: bzr inventory delta v1 (bzr 1.14)
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
126
parent: null:
127
version: null:
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
128
versioned_root: true
129
tree_references: true
130
None\x00/\x00an-id\x00\x00a@e\xc3\xa5ample.com--2004\x00dir\x00\x00
131
None\x00/\x00an-id\x00\x00a@e\xc3\xa5ample.com--2004\x00dir\x00\x00
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
132
"""
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
133
        err = self.assertRaises(InventoryDeltaError,
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
134
            deserializer.parse_text_bytes, double_root_lines)
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
135
        self.assertContainsRe(str(err), 'duplicate file id')
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
136
137
    def test_parse_versioned_root_only(self):
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
138
        deserializer = inventory_delta.InventoryDeltaDeserializer()
139
        parse_result = deserializer.parse_text_bytes(root_only_lines)
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
140
        expected_entry = inventory.make_entry(
141
            'directory', u'', None, 'an-id')
142
        expected_entry.revision = 'a@e\xc3\xa5ample.com--2004'
143
        self.assertEqual(
4476.3.26 by Andrew Bennetts
Stricter (de)serialization of leading slashes in paths in inventory deltas.
144
            ('null:', 'entry-version', True, True,
145
             [(None, '', 'an-id', expected_entry)]),
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
146
            parse_result)
147
148
    def test_parse_special_revid_not_valid_last_mod(self):
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
149
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
150
        root_only_lines = """format: bzr inventory delta v1 (bzr 1.14)
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
151
parent: null:
152
version: null:
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
153
versioned_root: false
154
tree_references: true
155
None\x00/\x00TREE_ROOT\x00\x00null:\x00dir\x00\x00
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
156
"""
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
157
        err = self.assertRaises(InventoryDeltaError,
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
158
            deserializer.parse_text_bytes, root_only_lines)
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
159
        self.assertContainsRe(str(err), 'special revisionid found')
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
160
161
    def test_parse_versioned_root_versioned_disabled(self):
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
162
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
163
        root_only_lines = """format: bzr inventory delta v1 (bzr 1.14)
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
164
parent: null:
165
version: null:
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
166
versioned_root: false
167
tree_references: true
168
None\x00/\x00TREE_ROOT\x00\x00a@e\xc3\xa5ample.com--2004\x00dir\x00\x00
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
169
"""
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
170
        err = self.assertRaises(InventoryDeltaError,
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
171
            deserializer.parse_text_bytes, root_only_lines)
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
172
        self.assertContainsRe(str(err), 'Versioned root found')
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
173
174
    def test_parse_unique_root_id_root_versioned_disabled(self):
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
175
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
176
        root_only_lines = """format: bzr inventory delta v1 (bzr 1.14)
4476.3.61 by Andrew Bennetts
Fix test_inventory_delta for actual rich root semantics.
177
parent: parent-id
178
version: a@e\xc3\xa5ample.com--2004
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
179
versioned_root: false
180
tree_references: true
4476.3.61 by Andrew Bennetts
Fix test_inventory_delta for actual rich root semantics.
181
None\x00/\x00an-id\x00\x00parent-id\x00dir\x00\x00
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
182
"""
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
183
        err = self.assertRaises(InventoryDeltaError,
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
184
            deserializer.parse_text_bytes, root_only_lines)
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
185
        self.assertContainsRe(str(err), 'Versioned root found')
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
186
187
    def test_parse_unversioned_root_versioning_enabled(self):
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
188
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4476.3.77 by Andrew Bennetts
Replace require_flags method with allow_versioned_root and allow_tree_references flags on InventoryDeltaSerializer.__init__, and shift some checking of delta compatibility from StreamSink to InventoryDeltaSerializer.
189
        parse_result = deserializer.parse_text_bytes(root_only_unversioned)
190
        expected_entry = inventory.make_entry(
191
            'directory', u'', None, 'TREE_ROOT')
192
        expected_entry.revision = 'entry-version'
193
        self.assertEqual(
194
            ('null:', 'entry-version', False, False,
195
             [(None, u'', 'TREE_ROOT', expected_entry)]),
196
            parse_result)
197
198
    def test_parse_versioned_root_when_disabled(self):
199
        deserializer = inventory_delta.InventoryDeltaDeserializer(
200
            allow_versioned_root=False)
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
201
        err = self.assertRaises(inventory_delta.IncompatibleInventoryDelta,
4476.3.77 by Andrew Bennetts
Replace require_flags method with allow_versioned_root and allow_tree_references flags on InventoryDeltaSerializer.__init__, and shift some checking of delta compatibility from StreamSink to InventoryDeltaSerializer.
202
            deserializer.parse_text_bytes, root_only_lines)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
203
        self.assertEqual("versioned_root not allowed", str(err))
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
204
205
    def test_parse_tree_when_disabled(self):
4476.3.77 by Andrew Bennetts
Replace require_flags method with allow_versioned_root and allow_tree_references flags on InventoryDeltaSerializer.__init__, and shift some checking of delta compatibility from StreamSink to InventoryDeltaSerializer.
206
        deserializer = inventory_delta.InventoryDeltaDeserializer(
207
            allow_tree_references=False)
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
208
        err = self.assertRaises(inventory_delta.IncompatibleInventoryDelta,
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
209
            deserializer.parse_text_bytes, reference_lines)
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
210
        self.assertEqual("Tree reference not allowed", str(err))
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
211
4476.3.4 by Andrew Bennetts
Network serialisation, and most tests passing with InterDifferingSerializer commented out.
212
    def test_parse_tree_when_header_disallows(self):
213
        # A deserializer that allows tree_references to be set or unset.
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
214
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4476.3.4 by Andrew Bennetts
Network serialisation, and most tests passing with InterDifferingSerializer commented out.
215
        # A serialised inventory delta with a header saying no tree refs, but
216
        # that has a tree ref in its content.
217
        lines = """format: bzr inventory delta v1 (bzr 1.14)
218
parent: null:
219
version: entry-version
220
versioned_root: false
221
tree_references: false
222
None\x00/foo\x00id\x00TREE_ROOT\x00changed\x00tree\x00subtree-version
223
"""
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
224
        err = self.assertRaises(InventoryDeltaError,
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
225
            deserializer.parse_text_bytes, lines)
4476.3.4 by Andrew Bennetts
Network serialisation, and most tests passing with InterDifferingSerializer commented out.
226
        self.assertContainsRe(str(err), 'Tree reference found')
227
228
    def test_parse_versioned_root_when_header_disallows(self):
229
        # A deserializer that allows tree_references to be set or unset.
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
230
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4476.3.4 by Andrew Bennetts
Network serialisation, and most tests passing with InterDifferingSerializer commented out.
231
        # A serialised inventory delta with a header saying no tree refs, but
232
        # that has a tree ref in its content.
233
        lines = """format: bzr inventory delta v1 (bzr 1.14)
234
parent: null:
235
version: entry-version
236
versioned_root: false
237
tree_references: false
238
None\x00/\x00TREE_ROOT\x00\x00a@e\xc3\xa5ample.com--2004\x00dir
239
"""
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
240
        err = self.assertRaises(InventoryDeltaError,
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
241
            deserializer.parse_text_bytes, lines)
4476.3.4 by Andrew Bennetts
Network serialisation, and most tests passing with InterDifferingSerializer commented out.
242
        self.assertContainsRe(str(err), 'Versioned root found')
243
4476.3.26 by Andrew Bennetts
Stricter (de)serialization of leading slashes in paths in inventory deltas.
244
    def test_parse_last_line_not_empty(self):
245
        """newpath must start with / if it is not None."""
246
        # Trim the trailing newline from a valid serialization
247
        lines = root_only_lines[:-1]
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
248
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
249
        err = self.assertRaises(InventoryDeltaError,
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
250
            deserializer.parse_text_bytes, lines)
4476.3.26 by Andrew Bennetts
Stricter (de)serialization of leading slashes in paths in inventory deltas.
251
        self.assertContainsRe(str(err), 'last line not empty')
252
253
    def test_parse_invalid_newpath(self):
254
        """newpath must start with / if it is not None."""
255
        lines = empty_lines
256
        lines += "None\x00bad\x00TREE_ROOT\x00\x00version\x00dir\n"
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
257
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
258
        err = self.assertRaises(InventoryDeltaError,
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
259
            deserializer.parse_text_bytes, lines)
4476.3.26 by Andrew Bennetts
Stricter (de)serialization of leading slashes in paths in inventory deltas.
260
        self.assertContainsRe(str(err), 'newpath invalid')
261
262
    def test_parse_invalid_oldpath(self):
263
        """oldpath must start with / if it is not None."""
264
        lines = root_only_lines
265
        lines += "bad\x00/new\x00file-id\x00\x00version\x00dir\n"
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
266
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
267
        err = self.assertRaises(InventoryDeltaError,
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
268
            deserializer.parse_text_bytes, lines)
4476.3.26 by Andrew Bennetts
Stricter (de)serialization of leading slashes in paths in inventory deltas.
269
        self.assertContainsRe(str(err), 'oldpath invalid')
4476.3.49 by Andrew Bennetts
Start reworking inventory-delta streaming to use a separate substream.
270
    
271
    def test_parse_new_file(self):
272
        """a new file is parsed correctly"""
273
        lines = root_only_lines
274
        fake_sha = "deadbeef" * 5
275
        lines += (
276
            "None\x00/new\x00file-id\x00an-id\x00version\x00file\x00123\x00" +
277
            "\x00" + fake_sha + "\n")
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
278
        deserializer = inventory_delta.InventoryDeltaDeserializer()
279
        parse_result = deserializer.parse_text_bytes(lines)
4476.3.49 by Andrew Bennetts
Start reworking inventory-delta streaming to use a separate substream.
280
        expected_entry = inventory.make_entry(
281
            'file', u'new', 'an-id', 'file-id')
282
        expected_entry.revision = 'version'
283
        expected_entry.text_size = 123
284
        expected_entry.text_sha1 = fake_sha
285
        delta = parse_result[4]
286
        self.assertEqual(
287
             (None, u'new', 'file-id', expected_entry), delta[-1])
4476.3.4 by Andrew Bennetts
Network serialisation, and most tests passing with InterDifferingSerializer commented out.
288
4476.3.60 by Andrew Bennetts
Add test for deserialization of deletes in inventory-deltas.
289
    def test_parse_delete(self):
290
        lines = root_only_lines
291
        lines += (
292
            "/old-file\x00None\x00deleted-id\x00\x00null:\x00deleted\x00\x00\n")
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
293
        deserializer = inventory_delta.InventoryDeltaDeserializer()
294
        parse_result = deserializer.parse_text_bytes(lines)
4476.3.60 by Andrew Bennetts
Add test for deserialization of deletes in inventory-deltas.
295
        delta = parse_result[4]
296
        self.assertEqual(
297
             (u'old-file', None, 'deleted-id', None), delta[-1])
298
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
299
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
300
class TestSerialization(TestCase):
4205.5.4 by Andrew Bennetts
Fix many tests in test_inventory_delta to actually test what they intended to test.
301
    """Tests for InventoryDeltaSerializer.delta_to_lines."""
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
302
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
303
    def test_empty_delta_to_lines(self):
304
        old_inv = Inventory(None)
305
        new_inv = Inventory(None)
306
        delta = new_inv._make_delta(old_inv)
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
307
        serializer = inventory_delta.InventoryDeltaSerializer(
308
            versioned_root=True, tree_references=True)
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
309
        self.assertEqual(StringIO(empty_lines).readlines(),
310
            serializer.delta_to_lines(NULL_REVISION, NULL_REVISION, delta))
311
312
    def test_root_only_to_lines(self):
313
        old_inv = Inventory(None)
314
        new_inv = Inventory(None)
315
        root = new_inv.make_entry('directory', '', None, 'an-id')
316
        root.revision = 'a@e\xc3\xa5ample.com--2004'
317
        new_inv.add(root)
318
        delta = new_inv._make_delta(old_inv)
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
319
        serializer = inventory_delta.InventoryDeltaSerializer(
320
            versioned_root=True, tree_references=True)
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
321
        self.assertEqual(StringIO(root_only_lines).readlines(),
322
            serializer.delta_to_lines(NULL_REVISION, 'entry-version', delta))
323
324
    def test_unversioned_root(self):
325
        old_inv = Inventory(None)
326
        new_inv = Inventory(None)
327
        root = new_inv.make_entry('directory', '', None, 'TREE_ROOT')
4476.3.46 by Andrew Bennetts
Make actual non-rich-root inventories (which have implicit root entries with non-None revisions) roundtrip through inventory-deltas correctly.
328
        # Implicit roots are considered modified in every revision.
329
        root.revision = 'entry-version'
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
330
        new_inv.add(root)
331
        delta = new_inv._make_delta(old_inv)
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
332
        serializer = inventory_delta.InventoryDeltaSerializer(
333
            versioned_root=False, tree_references=False)
4476.3.46 by Andrew Bennetts
Make actual non-rich-root inventories (which have implicit root entries with non-None revisions) roundtrip through inventory-deltas correctly.
334
        serialized_lines = serializer.delta_to_lines(
335
            NULL_REVISION, 'entry-version', delta)
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
336
        self.assertEqual(StringIO(root_only_unversioned).readlines(),
4476.3.46 by Andrew Bennetts
Make actual non-rich-root inventories (which have implicit root entries with non-None revisions) roundtrip through inventory-deltas correctly.
337
            serialized_lines)
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
338
        deserializer = inventory_delta.InventoryDeltaDeserializer()
4476.3.46 by Andrew Bennetts
Make actual non-rich-root inventories (which have implicit root entries with non-None revisions) roundtrip through inventory-deltas correctly.
339
        self.assertEqual(
340
            (NULL_REVISION, 'entry-version', False, False, delta),
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
341
            deserializer.parse_text_bytes(''.join(serialized_lines)))
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
342
343
    def test_unversioned_non_root_errors(self):
344
        old_inv = Inventory(None)
345
        new_inv = Inventory(None)
346
        root = new_inv.make_entry('directory', '', None, 'TREE_ROOT')
347
        root.revision = 'a@e\xc3\xa5ample.com--2004'
348
        new_inv.add(root)
349
        non_root = new_inv.make_entry('directory', 'foo', root.file_id, 'id')
350
        new_inv.add(non_root)
351
        delta = new_inv._make_delta(old_inv)
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
352
        serializer = inventory_delta.InventoryDeltaSerializer(
353
            versioned_root=True, tree_references=True)
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
354
        err = self.assertRaises(InventoryDeltaError,
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
355
            serializer.delta_to_lines, NULL_REVISION, 'entry-version', delta)
356
        self.assertEqual(str(err), 'no version for fileid id')
357
358
    def test_richroot_unversioned_root_errors(self):
359
        old_inv = Inventory(None)
360
        new_inv = Inventory(None)
361
        root = new_inv.make_entry('directory', '', None, 'TREE_ROOT')
362
        new_inv.add(root)
363
        delta = new_inv._make_delta(old_inv)
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
364
        serializer = inventory_delta.InventoryDeltaSerializer(
365
            versioned_root=True, tree_references=True)
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
366
        err = self.assertRaises(InventoryDeltaError,
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
367
            serializer.delta_to_lines, NULL_REVISION, 'entry-version', delta)
368
        self.assertEqual(str(err), 'no version for fileid TREE_ROOT')
369
370
    def test_nonrichroot_versioned_root_errors(self):
371
        old_inv = Inventory(None)
372
        new_inv = Inventory(None)
373
        root = new_inv.make_entry('directory', '', None, 'TREE_ROOT')
374
        root.revision = 'a@e\xc3\xa5ample.com--2004'
375
        new_inv.add(root)
376
        delta = new_inv._make_delta(old_inv)
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
377
        serializer = inventory_delta.InventoryDeltaSerializer(
378
            versioned_root=False, tree_references=True)
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
379
        err = self.assertRaises(InventoryDeltaError,
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
380
            serializer.delta_to_lines, NULL_REVISION, 'entry-version', delta)
4476.3.46 by Andrew Bennetts
Make actual non-rich-root inventories (which have implicit root entries with non-None revisions) roundtrip through inventory-deltas correctly.
381
        self.assertStartsWith(str(err), 'Version present for / in TREE_ROOT')
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
382
383
    def test_unknown_kind_errors(self):
384
        old_inv = Inventory(None)
385
        new_inv = Inventory(None)
386
        root = new_inv.make_entry('directory', '', None, 'my-rich-root-id')
387
        root.revision = 'changed'
388
        new_inv.add(root)
5365.2.1 by Andrew Bennetts
Reduce memory consumption of InventoryEntries by removing __slots__ entries for attributes that should never be set, e.g. symlink_target on files.
389
        class StrangeInventoryEntry(inventory.InventoryEntry):
390
            kind = 'strange'
391
        non_root = StrangeInventoryEntry('id', 'foo', root.file_id)
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
392
        non_root.revision = 'changed'
393
        new_inv.add(non_root)
394
        delta = new_inv._make_delta(old_inv)
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
395
        serializer = inventory_delta.InventoryDeltaSerializer(
396
            versioned_root=True, tree_references=True)
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
397
        # we expect keyerror because there is little value wrapping this.
398
        # This test aims to prove that it errors more than how it errors.
399
        err = self.assertRaises(KeyError,
400
            serializer.delta_to_lines, NULL_REVISION, 'entry-version', delta)
5365.2.1 by Andrew Bennetts
Reduce memory consumption of InventoryEntries by removing __slots__ entries for attributes that should never be set, e.g. symlink_target on files.
401
        self.assertEqual(('strange',), err.args)
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
402
403
    def test_tree_reference_disabled(self):
404
        old_inv = Inventory(None)
405
        new_inv = Inventory(None)
406
        root = new_inv.make_entry('directory', '', None, 'TREE_ROOT')
407
        root.revision = 'a@e\xc3\xa5ample.com--2004'
408
        new_inv.add(root)
409
        non_root = new_inv.make_entry(
410
            'tree-reference', 'foo', root.file_id, 'id')
411
        non_root.revision = 'changed'
412
        non_root.reference_revision = 'subtree-version'
413
        new_inv.add(non_root)
414
        delta = new_inv._make_delta(old_inv)
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
415
        serializer = inventory_delta.InventoryDeltaSerializer(
416
            versioned_root=True, tree_references=False)
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
417
        # we expect keyerror because there is little value wrapping this.
418
        # This test aims to prove that it errors more than how it errors.
419
        err = self.assertRaises(KeyError,
420
            serializer.delta_to_lines, NULL_REVISION, 'entry-version', delta)
421
        self.assertEqual(('tree-reference',), err.args)
422
423
    def test_tree_reference_enabled(self):
424
        old_inv = Inventory(None)
425
        new_inv = Inventory(None)
426
        root = new_inv.make_entry('directory', '', None, 'TREE_ROOT')
427
        root.revision = 'a@e\xc3\xa5ample.com--2004'
428
        new_inv.add(root)
429
        non_root = new_inv.make_entry(
430
            'tree-reference', 'foo', root.file_id, 'id')
431
        non_root.revision = 'changed'
432
        non_root.reference_revision = 'subtree-version'
433
        new_inv.add(non_root)
434
        delta = new_inv._make_delta(old_inv)
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
435
        serializer = inventory_delta.InventoryDeltaSerializer(
436
            versioned_root=True, tree_references=True)
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
437
        self.assertEqual(StringIO(reference_lines).readlines(),
438
            serializer.delta_to_lines(NULL_REVISION, 'entry-version', delta))
439
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
440
    def test_to_inventory_root_id_versioned_not_permitted(self):
4476.3.26 by Andrew Bennetts
Stricter (de)serialization of leading slashes in paths in inventory deltas.
441
        root_entry = inventory.make_entry('directory', '', None, 'TREE_ROOT')
442
        root_entry.revision = 'some-version'
443
        delta = [(None, '', 'TREE_ROOT', root_entry)]
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
444
        serializer = inventory_delta.InventoryDeltaSerializer(
445
            versioned_root=False, tree_references=True)
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
446
        self.assertRaises(
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
447
            InventoryDeltaError, serializer.delta_to_lines, 'old-version',
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
448
            'new-version', delta)
449
450
    def test_to_inventory_root_id_not_versioned(self):
4476.3.26 by Andrew Bennetts
Stricter (de)serialization of leading slashes in paths in inventory deltas.
451
        delta = [(None, '', 'an-id', inventory.make_entry(
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
452
            'directory', '', None, 'an-id'))]
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
453
        serializer = inventory_delta.InventoryDeltaSerializer(
454
            versioned_root=True, tree_references=True)
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
455
        self.assertRaises(
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
456
            InventoryDeltaError, serializer.delta_to_lines, 'old-version',
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
457
            'new-version', delta)
458
459
    def test_to_inventory_has_tree_not_meant_to(self):
460
        make_entry = inventory.make_entry
461
        tree_ref = make_entry('tree-reference', 'foo', 'changed-in', 'ref-id')
462
        tree_ref.reference_revision = 'ref-revision'
463
        delta = [
4476.3.26 by Andrew Bennetts
Stricter (de)serialization of leading slashes in paths in inventory deltas.
464
            (None, '', 'an-id',
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
465
             make_entry('directory', '', 'changed-in', 'an-id')),
4476.3.26 by Andrew Bennetts
Stricter (de)serialization of leading slashes in paths in inventory deltas.
466
            (None, 'foo', 'ref-id', tree_ref)
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
467
            # a file that followed the root move
468
            ]
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
469
        serializer = inventory_delta.InventoryDeltaSerializer(
470
            versioned_root=True, tree_references=True)
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
471
        self.assertRaises(InventoryDeltaError, serializer.delta_to_lines,
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
472
            'old-version', 'new-version', delta)
473
474
    def test_to_inventory_torture(self):
475
        def make_entry(kind, name, parent_id, file_id, **attrs):
476
            entry = inventory.make_entry(kind, name, parent_id, file_id)
477
            for name, value in attrs.items():
478
                setattr(entry, name, value)
479
            return entry
480
        # this delta is crafted to have all the following:
481
        # - deletes
482
        # - renamed roots
483
        # - deep dirs
484
        # - files moved after parent dir was renamed
485
        # - files with and without exec bit
486
        delta = [
487
            # new root:
488
            (None, '', 'new-root-id',
489
                make_entry('directory', '', None, 'new-root-id',
490
                    revision='changed-in')),
491
            # an old root:
492
            ('', 'old-root', 'TREE_ROOT',
493
                make_entry('directory', 'subdir-now', 'new-root-id',
494
                'TREE_ROOT', revision='moved-root')),
495
            # a file that followed the root move
496
            ('under-old-root', 'old-root/under-old-root', 'moved-id',
497
                make_entry('file', 'under-old-root', 'TREE_ROOT', 'moved-id',
498
                   revision='old-rev', executable=False, text_size=30,
499
                   text_sha1='some-sha')),
500
            # a deleted path
501
            ('old-file', None, 'deleted-id', None),
502
            # a tree reference moved to the new root
503
            ('ref', 'ref', 'ref-id',
504
                make_entry('tree-reference', 'ref', 'new-root-id', 'ref-id',
505
                    reference_revision='tree-reference-id',
506
                    revision='new-rev')),
507
            # a symlink now in a deep dir
508
            ('dir/link', 'old-root/dir/link', 'link-id',
509
                make_entry('symlink', 'link', 'deep-id', 'link-id',
510
                   symlink_target='target', revision='new-rev')),
511
            # a deep dir
512
            ('dir', 'old-root/dir', 'deep-id',
513
                make_entry('directory', 'dir', 'TREE_ROOT', 'deep-id',
514
                    revision='new-rev')),
515
            # a file with an exec bit set
516
            (None, 'configure', 'exec-id',
517
                make_entry('file', 'configure', 'new-root-id', 'exec-id',
518
                   executable=True, text_size=30, text_sha1='some-sha',
519
                   revision='old-rev')),
520
            ]
4476.3.76 by Andrew Bennetts
Split out InventoryDeltaDeserializer from InventoryDeltaSerializer.
521
        serializer = inventory_delta.InventoryDeltaSerializer(
522
            versioned_root=True, tree_references=True)
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
523
        lines = serializer.delta_to_lines(NULL_REVISION, 'something', delta)
524
        expected = """format: bzr inventory delta v1 (bzr 1.14)
525
parent: null:
526
version: something
527
versioned_root: true
528
tree_references: true
4205.5.3 by Andrew Bennetts
Include oldpath in the the serialised delta
529
/\x00/old-root\x00TREE_ROOT\x00new-root-id\x00moved-root\x00dir
530
/dir\x00/old-root/dir\x00deep-id\x00TREE_ROOT\x00new-rev\x00dir
531
/dir/link\x00/old-root/dir/link\x00link-id\x00deep-id\x00new-rev\x00link\x00target
532
/old-file\x00None\x00deleted-id\x00\x00null:\x00deleted\x00\x00
533
/ref\x00/ref\x00ref-id\x00new-root-id\x00new-rev\x00tree\x00tree-reference-id
534
/under-old-root\x00/old-root/under-old-root\x00moved-id\x00TREE_ROOT\x00old-rev\x00file\x0030\x00\x00some-sha
535
None\x00/\x00new-root-id\x00\x00changed-in\x00dir
536
None\x00/configure\x00exec-id\x00new-root-id\x00old-rev\x00file\x0030\x00Y\x00some-sha
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
537
"""
4205.5.7 by Andrew Bennetts
Fix nits in spelling and naming.
538
        serialized = ''.join(lines)
539
        self.assertIsInstance(serialized, str)
540
        self.assertEqual(expected, serialized)
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
541
542
543
class TestContent(TestCase):
4205.5.5 by Andrew Bennetts
Reorganise tests a little.
544
    """Test serialization of the content part of a line."""
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
545
546
    def test_dir(self):
547
        entry = inventory.make_entry('directory', 'a dir', None)
548
        self.assertEqual('dir', inventory_delta._directory_content(entry))
549
550
    def test_file_0_short_sha(self):
551
        file_entry = inventory.make_entry('file', 'a file', None, 'file-id')
552
        file_entry.text_sha1 = ''
553
        file_entry.text_size = 0
554
        self.assertEqual('file\x000\x00\x00',
555
            inventory_delta._file_content(file_entry))
556
557
    def test_file_10_foo(self):
558
        file_entry = inventory.make_entry('file', 'a file', None, 'file-id')
559
        file_entry.text_sha1 = 'foo'
560
        file_entry.text_size = 10
561
        self.assertEqual('file\x0010\x00\x00foo',
562
            inventory_delta._file_content(file_entry))
563
564
    def test_file_executable(self):
565
        file_entry = inventory.make_entry('file', 'a file', None, 'file-id')
566
        file_entry.executable = True
567
        file_entry.text_sha1 = 'foo'
568
        file_entry.text_size = 10
569
        self.assertEqual('file\x0010\x00Y\x00foo',
570
            inventory_delta._file_content(file_entry))
571
572
    def test_file_without_size(self):
573
        file_entry = inventory.make_entry('file', 'a file', None, 'file-id')
574
        file_entry.text_sha1 = 'foo'
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
575
        self.assertRaises(InventoryDeltaError,
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
576
            inventory_delta._file_content, file_entry)
577
578
    def test_file_without_sha1(self):
579
        file_entry = inventory.make_entry('file', 'a file', None, 'file-id')
580
        file_entry.text_size = 10
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
581
        self.assertRaises(InventoryDeltaError,
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
582
            inventory_delta._file_content, file_entry)
583
584
    def test_link_empty_target(self):
585
        entry = inventory.make_entry('symlink', 'a link', None)
586
        entry.symlink_target = ''
587
        self.assertEqual('link\x00',
588
            inventory_delta._link_content(entry))
589
590
    def test_link_unicode_target(self):
591
        entry = inventory.make_entry('symlink', 'a link', None)
592
        entry.symlink_target = ' \xc3\xa5'.decode('utf8')
593
        self.assertEqual('link\x00 \xc3\xa5',
594
            inventory_delta._link_content(entry))
595
596
    def test_link_space_target(self):
597
        entry = inventory.make_entry('symlink', 'a link', None)
598
        entry.symlink_target = ' '
599
        self.assertEqual('link\x00 ',
600
            inventory_delta._link_content(entry))
601
602
    def test_link_no_target(self):
603
        entry = inventory.make_entry('symlink', 'a link', None)
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
604
        self.assertRaises(InventoryDeltaError,
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
605
            inventory_delta._link_content, entry)
606
607
    def test_reference_null(self):
608
        entry = inventory.make_entry('tree-reference', 'a tree', None)
609
        entry.reference_revision = NULL_REVISION
610
        self.assertEqual('tree\x00null:',
611
            inventory_delta._reference_content(entry))
612
613
    def test_reference_revision(self):
614
        entry = inventory.make_entry('tree-reference', 'a tree', None)
615
        entry.reference_revision = 'foo@\xc3\xa5b-lah'
616
        self.assertEqual('tree\x00foo@\xc3\xa5b-lah',
617
            inventory_delta._reference_content(entry))
618
619
    def test_reference_no_reference(self):
620
        entry = inventory.make_entry('tree-reference', 'a tree', None)
4476.3.78 by Andrew Bennetts
Raise InventoryDeltaErrors, not generic BzrErrors, from inventory_delta.py.
621
        self.assertRaises(InventoryDeltaError,
4205.5.1 by Andrew Bennetts
Initial stab at adapting Robert's journalled_inventory serialisation into inventory_delta serialisation.
622
            inventory_delta._reference_content, entry)