/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
1
# Copyright (C) 2006, 2007 Canonical Ltd
1852.6.7 by Robert Collins
Fix up new tree_implementations __init__.py header.
2
#
1852.6.1 by Robert Collins
Start tree implementation tests.
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.
1852.6.7 by Robert Collins
Fix up new tree_implementations __init__.py header.
7
#
1852.6.1 by Robert Collins
Start tree implementation tests.
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.
1852.6.7 by Robert Collins
Fix up new tree_implementations __init__.py header.
12
#
1852.6.1 by Robert Collins
Start tree implementation tests.
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
18
"""Tree implementation tests for bzr.
19
20
These test the conformance of all the tree variations to the expected API.
21
Specific tests for individual variations are in other places such as:
22
 - tests/test_tree.py
23
 - tests/test_revision.py
24
 - tests/test_workingtree.py
25
 - tests/workingtree_implementations/*.py.
26
"""
27
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
28
from bzrlib import (
29
    errors,
2309.4.10 by John Arbash Meinel
(fixed) Fix the last few tests that were explicitly passing around unicode ids
30
    osutils,
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
31
    tests,
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
32
    transform,
33
    )
1852.6.1 by Robert Collins
Start tree implementation tests.
34
from bzrlib.transport import get_transport
35
from bzrlib.tests import (
36
                          adapt_modules,
37
                          default_transport,
38
                          TestCaseWithTransport,
39
                          TestLoader,
2321.1.2 by Robert Collins
Skip new tests that depend on unicode file paths.
40
                          TestSkipped,
1852.6.1 by Robert Collins
Start tree implementation tests.
41
                          TestSuite,
42
                          )
43
from bzrlib.tests.bzrdir_implementations.test_bzrdir import TestCaseWithBzrDir
2553.2.10 by Robert Collins
And overhaul WorkingTreeTestProviderAdapter too.
44
from bzrlib.tests.workingtree_implementations import (
45
    WorkingTreeTestProviderAdapter,
46
    )
2079.1.1 by John Arbash Meinel
Create a deprecated bzrlib.tree.RevisionTree() in favor of bzrlib.revisiontree.RevisionTree()
47
from bzrlib.revisiontree import RevisionTree
2255.2.164 by Martin Pool
Change the default format for some tests from AB1 back to WorkingTreeFormat3
48
from bzrlib.workingtree import (
49
    WorkingTreeFormat,
50
    WorkingTreeFormat3,
51
    _legacy_formats,
52
    )
2255.2.64 by John Arbash Meinel
Add the DirStateRevisionTree to the list of 'tree_implementations'
53
from bzrlib.workingtree_4 import (
54
    DirStateRevisionTree,
55
    WorkingTreeFormat4,
56
    )
1852.6.1 by Robert Collins
Start tree implementation tests.
57
58
59
def return_parameter(something):
60
    """A trivial thunk to return its input."""
61
    return something
62
63
64
def revision_tree_from_workingtree(tree):
65
    """Create a revision tree from a working tree."""
2100.3.36 by Aaron Bentley
avoid subtree commit when converting a work tree into a revision tree
66
    revid = tree.commit('save tree', allow_pointless=True, recursive=None)
1852.6.1 by Robert Collins
Start tree implementation tests.
67
    return tree.branch.repository.revision_tree(revid)
68
69
2255.2.64 by John Arbash Meinel
Add the DirStateRevisionTree to the list of 'tree_implementations'
70
def _dirstate_tree_from_workingtree(tree):
71
    revid = tree.commit('save tree', allow_pointless=True)
72
    return tree.basis_tree()
73
74
1852.6.1 by Robert Collins
Start tree implementation tests.
75
class TestTreeImplementationSupport(TestCaseWithTransport):
76
77
    def test_revision_tree_from_workingtree(self):
78
        tree = self.make_branch_and_tree('.')
79
        tree = revision_tree_from_workingtree(tree)
80
        self.assertIsInstance(tree, RevisionTree)
81
82
83
class TestCaseWithTree(TestCaseWithBzrDir):
84
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
85
    def make_branch_and_tree(self, relpath):
86
        made_control = self.make_bzrdir(relpath, format=
87
            self.workingtree_format._matchingbzrdir)
1852.6.1 by Robert Collins
Start tree implementation tests.
88
        made_control.create_repository()
89
        made_control.create_branch()
90
        return self.workingtree_format.initialize(made_control)
91
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
92
    def _convert_tree(self, tree, converter=None):
93
        """helper to convert using the converter or a supplied one."""
94
        # convert that to the final shape
95
        if converter is None:
96
            converter = self.workingtree_to_test_tree
97
        return converter(tree)
98
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
99
    def get_tree_no_parents_no_content(self, empty_tree, converter=None):
100
        """Make a tree with no parents and no contents from empty_tree.
101
        
102
        :param empty_tree: A working tree with no content and no parents to
103
            modify.
104
        """
1731.1.33 by Aaron Bentley
Revert no-special-root changes
105
        empty_tree.set_root_id('empty-root-id')
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
106
        return self._convert_tree(empty_tree, converter)
1852.6.1 by Robert Collins
Start tree implementation tests.
107
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
108
    def _make_abc_tree(self, tree):
109
        """setup an abc content tree."""
110
        files = ['a', 'b/', 'b/c']
2255.2.15 by Robert Collins
Dirstate - truncate state file fixing bug in saving a smaller file, get more tree_implementation tests passing.
111
        self.build_tree(files, line_endings='binary',
1982.1.4 by Alexander Belchenko
tree_implementations tests: build_tree with binary (LF) line-endings
112
                        transport=tree.bzrdir.root_transport)
1731.1.33 by Aaron Bentley
Revert no-special-root changes
113
        tree.set_root_id('root-id')
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
114
        tree.add(files, ['a-id', 'b-id', 'c-id'])
115
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
116
    def get_tree_no_parents_abc_content(self, tree, converter=None):
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
117
        """return a test tree with a, b/, b/c contents."""
118
        self._make_abc_tree(tree)
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
119
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
120
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
121
    def get_tree_no_parents_abc_content_2(self, tree, converter=None):
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
122
        """return a test tree with a, b/, b/c contents.
123
        
124
        This variation changes the content of 'a' to foobar\n.
125
        """
126
        self._make_abc_tree(tree)
127
        f = open(tree.basedir + '/a', 'wb')
128
        try:
129
            f.write('foobar\n')
130
        finally:
131
            f.close()
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
132
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
133
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
134
    def get_tree_no_parents_abc_content_3(self, tree, converter=None):
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
135
        """return a test tree with a, b/, b/c contents.
136
        
137
        This variation changes the executable flag of b/c to True.
138
        """
139
        self._make_abc_tree(tree)
140
        tt = transform.TreeTransform(tree)
141
        trans_id = tt.trans_id_tree_path('b/c')
142
        tt.set_executability(True, trans_id)
143
        tt.apply()
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
144
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
145
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
146
    def get_tree_no_parents_abc_content_4(self, tree, converter=None):
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
147
        """return a test tree with d, b/, b/c contents.
148
        
149
        This variation renames a to d.
150
        """
151
        self._make_abc_tree(tree)
152
        tree.rename_one('a', 'd')
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
153
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
154
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
155
    def get_tree_no_parents_abc_content_5(self, tree, converter=None):
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
156
        """return a test tree with d, b/, b/c contents.
157
        
158
        This variation renames a to d and alters its content to 'bar\n'.
159
        """
160
        self._make_abc_tree(tree)
161
        tree.rename_one('a', 'd')
162
        f = open(tree.basedir + '/d', 'wb')
163
        try:
164
            f.write('bar\n')
165
        finally:
166
            f.close()
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
167
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
168
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
169
    def get_tree_no_parents_abc_content_6(self, tree, converter=None):
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
170
        """return a test tree with a, b/, e contents.
171
        
172
        This variation renames b/c to e, and makes it executable.
173
        """
174
        self._make_abc_tree(tree)
175
        tt = transform.TreeTransform(tree)
176
        trans_id = tt.trans_id_tree_path('b/c')
177
        parent_trans_id = tt.trans_id_tree_path('')
178
        tt.adjust_path('e', parent_trans_id, trans_id)
179
        tt.set_executability(True, trans_id)
180
        tt.apply()
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
181
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
182
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
183
    def get_tree_with_subdirs_and_all_content_types(self):
184
        """Return a test tree with subdirs and all content types.
2408.1.3 by Alexander Belchenko
tree_implementations: make usage of symlinks optional
185
        See get_tree_with_subdirs_and_all_supported_content_types for details.
186
        """
2408.1.8 by Alexander Belchenko
forget to return tree
187
        return self.get_tree_with_subdirs_and_all_supported_content_types(True)
2408.1.3 by Alexander Belchenko
tree_implementations: make usage of symlinks optional
188
189
    def get_tree_with_subdirs_and_all_supported_content_types(self, symlinks):
190
        """Return a test tree with subdirs and all supported content types.
191
        Some content types may not be created on some platforms
192
        (like symlinks on native win32)
193
194
        :param  symlinks:   control is symlink should be created in the tree.
195
                            Note: if you wish to automatically set this
196
                            parameters depending on underlying system,
197
                            please use value returned
198
                            by bzrlib.osutils.has_symlinks() function.
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
199
200
        The returned tree has the following inventory:
201
            [('', inventory.ROOT_ID),
202
             ('0file', '2file'),
203
             ('1top-dir', '1top-dir'),
204
             (u'2utf\u1234file', u'0utf\u1234file'),
2408.1.3 by Alexander Belchenko
tree_implementations: make usage of symlinks optional
205
             ('symlink', 'symlink'),            # only if symlinks arg is True
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
206
             ('1top-dir/0file-in-1topdir', '1file-in-1topdir'),
207
             ('1top-dir/1dir-in-1topdir', '0dir-in-1topdir')]
2408.1.3 by Alexander Belchenko
tree_implementations: make usage of symlinks optional
208
        where each component has the type of its name -
209
        i.e. '1file..' is afile.
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
210
211
        note that the order of the paths and fileids is deliberately 
212
        mismatched to ensure that the result order is path based.
213
        """
214
        tree = self.make_branch_and_tree('.')
215
        paths = ['0file',
216
            '1top-dir/',
217
            u'2utf\u1234file',
218
            '1top-dir/0file-in-1topdir',
219
            '1top-dir/1dir-in-1topdir/'
220
            ]
221
        ids = [
222
            '2file',
223
            '1top-dir',
2255.2.107 by John Arbash Meinel
(working), fix dirstate to use utf8 file ids.
224
            u'0utf\u1234file'.encode('utf8'),
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
225
            '1file-in-1topdir',
226
            '0dir-in-1topdir'
227
            ]
2321.1.2 by Robert Collins
Skip new tests that depend on unicode file paths.
228
        try:
229
            self.build_tree(paths)
230
        except UnicodeError:
231
            raise TestSkipped(
232
                'This platform does not support unicode file paths.')
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
233
        tree.add(paths, ids)
234
        tt = transform.TreeTransform(tree)
2408.1.3 by Alexander Belchenko
tree_implementations: make usage of symlinks optional
235
        if symlinks:
236
            root_transaction_id = tt.trans_id_tree_path('')
237
            tt.new_symlink('symlink',
238
                root_transaction_id, 'link-target', 'symlink')
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
239
        tt.apply()
240
        return self.workingtree_to_test_tree(tree)
241
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
242
    def get_tree_with_utf8(self, tree):
243
        """Generate a tree with a utf8 revision and unicode paths."""
2294.1.2 by John Arbash Meinel
Track down and add tests that all tree.commit() can handle
244
        self._create_tree_with_utf8(tree)
245
        return self.workingtree_to_test_tree(tree)
246
247
    def _create_tree_with_utf8(self, tree):
248
        """Generate a tree with a utf8 revision and unicode paths."""
2294.1.3 by John Arbash Meinel
Make sure the inventory enrtries returned are properly formed.
249
        paths = [u'',
250
                 u'f\xf6',
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
251
                 u'b\xe5r/',
252
                 u'b\xe5r/b\xe1z',
253
                ]
254
        # bzr itself does not create unicode file ids, but we want them for
255
        # testing.
2309.4.10 by John Arbash Meinel
(fixed) Fix the last few tests that were explicitly passing around unicode ids
256
        file_ids = ['TREE_ROOT',
257
                    'f\xc3\xb6-id',
258
                    'b\xc3\xa5r-id',
259
                    'b\xc3\xa1z-id',
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
260
                   ]
261
        try:
2294.1.3 by John Arbash Meinel
Make sure the inventory enrtries returned are properly formed.
262
            self.build_tree(paths[1:])
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
263
        except UnicodeError:
264
            raise tests.TestSkipped('filesystem does not support unicode.')
2255.2.107 by John Arbash Meinel
(working), fix dirstate to use utf8 file ids.
265
        if tree.path2id('') is None:
266
            # Some trees do not have a root yet.
267
            tree.add(paths, file_ids)
268
        else:
269
            # Some trees will already have a root
270
            tree.set_root_id(file_ids[0])
271
            tree.add(paths[1:], file_ids[1:])
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
272
        try:
273
            tree.commit(u'in\xedtial', rev_id=u'r\xe9v-1'.encode('utf8'))
274
        except errors.NonAsciiRevisionId:
275
            raise tests.TestSkipped('non-ascii revision ids not supported')
2294.1.2 by John Arbash Meinel
Track down and add tests that all tree.commit() can handle
276
277
    def get_tree_with_merged_utf8(self, tree):
278
        """Generate a tree with utf8 ancestors."""
279
        self._create_tree_with_utf8(tree)
280
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
281
        self.build_tree([u'tree2/b\xe5r/z\xf7z'])
2309.4.10 by John Arbash Meinel
(fixed) Fix the last few tests that were explicitly passing around unicode ids
282
        self.callDeprecated([osutils._file_id_warning],
283
                            tree2.add, [u'b\xe5r/z\xf7z'], [u'z\xf7z-id'])
2294.1.2 by John Arbash Meinel
Track down and add tests that all tree.commit() can handle
284
        tree2.commit(u'to m\xe9rge', rev_id=u'r\xe9v-2'.encode('utf8'))
285
286
        tree.merge_from_branch(tree2.branch)
287
        tree.commit(u'm\xe9rge', rev_id=u'r\xe9v-3'.encode('utf8'))
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
288
        return self.workingtree_to_test_tree(tree)
289
1852.6.1 by Robert Collins
Start tree implementation tests.
290
291
class TreeTestProviderAdapter(WorkingTreeTestProviderAdapter):
292
    """Generate test suites for each Tree implementation in bzrlib.
293
2553.2.10 by Robert Collins
And overhaul WorkingTreeTestProviderAdapter too.
294
    Currently this covers all working tree formats, and RevisionTree and
295
    DirStateRevisionTree by committing a working tree to create the revision
296
    tree.
1852.6.1 by Robert Collins
Start tree implementation tests.
297
    """
298
2553.2.10 by Robert Collins
And overhaul WorkingTreeTestProviderAdapter too.
299
    def __init__(self, transport_server, transport_readonly_server, formats):
300
        super(TreeTestProviderAdapter, self).__init__(transport_server,
301
            transport_readonly_server, formats)
302
        # now adjust the scenarios and add the non-working-tree tree scenarios.
303
        for scenario in self.scenarios:
1852.6.1 by Robert Collins
Start tree implementation tests.
304
            # for working tree adapted tests, preserve the tree
2553.2.10 by Robert Collins
And overhaul WorkingTreeTestProviderAdapter too.
305
            scenario[1]["workingtree_to_test_tree"] = return_parameter
306
        # add RevisionTree scenario
307
        # this is the 'default format' in that it's used to test the generic InterTree
2255.2.164 by Martin Pool
Change the default format for some tests from AB1 back to WorkingTreeFormat3
308
        # code.
309
        default_format = WorkingTreeFormat3()
2553.2.10 by Robert Collins
And overhaul WorkingTreeTestProviderAdapter too.
310
        self.scenarios.append(self.formats_to_scenarios([
311
            (default_format, default_format._matchingbzrdir)])[0])
312
        self.scenarios[-1] = (RevisionTree.__name__, self.scenarios[-1][1])
313
        self.scenarios[-1][1]["workingtree_to_test_tree"] = revision_tree_from_workingtree
314
315
        # also test WorkingTree4's RevisionTree implementation which is specialised.
2255.2.64 by John Arbash Meinel
Add the DirStateRevisionTree to the list of 'tree_implementations'
316
        dirstate_format = WorkingTreeFormat4()
2553.2.10 by Robert Collins
And overhaul WorkingTreeTestProviderAdapter too.
317
        self.scenarios.append(self.formats_to_scenarios([
318
            (dirstate_format, dirstate_format._matchingbzrdir)])[0])
319
        self.scenarios[-1] = (DirStateRevisionTree.__name__, self.scenarios[-1][1])
320
        self.scenarios[-1][1]["workingtree_to_test_tree"] = _dirstate_tree_from_workingtree
1852.6.1 by Robert Collins
Start tree implementation tests.
321
322
323
def test_suite():
324
    result = TestSuite()
325
    test_tree_implementations = [
2255.7.36 by John Arbash Meinel
All trees should implement get_file_mtime()
326
        'bzrlib.tests.tree_implementations.test_get_file_mtime',
2255.2.134 by John Arbash Meinel
Add a tree-test for get_symlink_target
327
        'bzrlib.tests.tree_implementations.test_get_symlink_target',
2338.4.6 by Marien Zwart
Move some tests that do not need a working tree from workingtree_implementations to tree_implementations.
328
        'bzrlib.tests.tree_implementations.test_inv',
2255.2.71 by John Arbash Meinel
Add a test for list_files, and implement it for DirStateRevisionTree
329
        'bzrlib.tests.tree_implementations.test_list_files',
1908.11.5 by John Arbash Meinel
[merge] bzr.dev 2240
330
        'bzrlib.tests.tree_implementations.test_revision_tree',
1852.6.1 by Robert Collins
Start tree implementation tests.
331
        'bzrlib.tests.tree_implementations.test_test_trees',
1551.9.16 by Aaron Bentley
Implement Tree.annotate_iter for RevisionTree and WorkingTree
332
        'bzrlib.tests.tree_implementations.test_tree',
1852.15.3 by Robert Collins
Add a first-cut Tree.walkdirs method.
333
        'bzrlib.tests.tree_implementations.test_walkdirs',
1852.6.1 by Robert Collins
Start tree implementation tests.
334
        ]
335
    adapter = TreeTestProviderAdapter(
336
        default_transport,
337
        # None here will cause a readonly decorator to be created
338
        # by the TestCaseWithTransport.get_readonly_transport method.
339
        None,
340
        [(format, format._matchingbzrdir) for format in 
341
         WorkingTreeFormat._formats.values() + _legacy_formats])
342
    loader = TestLoader()
343
    adapt_modules(test_tree_implementations, adapter, loader, result)
344
    result.addTests(loader.loadTestsFromModuleNames(['bzrlib.tests.tree_implementations']))
345
    return result