/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,
40
                          TestSuite,
41
                          )
42
from bzrlib.tests.bzrdir_implementations.test_bzrdir import TestCaseWithBzrDir
2079.1.1 by John Arbash Meinel
Create a deprecated bzrlib.tree.RevisionTree() in favor of bzrlib.revisiontree.RevisionTree()
43
from bzrlib.revisiontree import RevisionTree
2255.2.164 by Martin Pool
Change the default format for some tests from AB1 back to WorkingTreeFormat3
44
from bzrlib.workingtree import (
45
    WorkingTreeFormat,
46
    WorkingTreeFormat3,
47
    WorkingTreeTestProviderAdapter,
48
    _legacy_formats,
49
    )
2255.2.64 by John Arbash Meinel
Add the DirStateRevisionTree to the list of 'tree_implementations'
50
from bzrlib.workingtree_4 import (
51
    DirStateRevisionTree,
52
    WorkingTreeFormat4,
53
    )
1852.6.1 by Robert Collins
Start tree implementation tests.
54
55
56
def return_parameter(something):
57
    """A trivial thunk to return its input."""
58
    return something
59
60
61
def revision_tree_from_workingtree(tree):
62
    """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
63
    revid = tree.commit('save tree', allow_pointless=True, recursive=None)
1852.6.1 by Robert Collins
Start tree implementation tests.
64
    return tree.branch.repository.revision_tree(revid)
65
66
2255.2.64 by John Arbash Meinel
Add the DirStateRevisionTree to the list of 'tree_implementations'
67
def _dirstate_tree_from_workingtree(tree):
68
    revid = tree.commit('save tree', allow_pointless=True)
69
    return tree.basis_tree()
70
71
1852.6.1 by Robert Collins
Start tree implementation tests.
72
class TestTreeImplementationSupport(TestCaseWithTransport):
73
74
    def test_revision_tree_from_workingtree(self):
75
        tree = self.make_branch_and_tree('.')
76
        tree = revision_tree_from_workingtree(tree)
77
        self.assertIsInstance(tree, RevisionTree)
78
79
80
class TestCaseWithTree(TestCaseWithBzrDir):
81
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
82
    def make_branch_and_tree(self, relpath):
83
        made_control = self.make_bzrdir(relpath, format=
84
            self.workingtree_format._matchingbzrdir)
1852.6.1 by Robert Collins
Start tree implementation tests.
85
        made_control.create_repository()
86
        made_control.create_branch()
87
        return self.workingtree_format.initialize(made_control)
88
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
89
    def _convert_tree(self, tree, converter=None):
90
        """helper to convert using the converter or a supplied one."""
91
        # convert that to the final shape
92
        if converter is None:
93
            converter = self.workingtree_to_test_tree
94
        return converter(tree)
95
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
96
    def get_tree_no_parents_no_content(self, empty_tree, converter=None):
97
        """Make a tree with no parents and no contents from empty_tree.
98
        
99
        :param empty_tree: A working tree with no content and no parents to
100
            modify.
101
        """
1731.1.33 by Aaron Bentley
Revert no-special-root changes
102
        empty_tree.set_root_id('empty-root-id')
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
103
        return self._convert_tree(empty_tree, converter)
1852.6.1 by Robert Collins
Start tree implementation tests.
104
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
105
    def _make_abc_tree(self, tree):
106
        """setup an abc content tree."""
107
        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.
108
        self.build_tree(files, line_endings='binary',
1982.1.4 by Alexander Belchenko
tree_implementations tests: build_tree with binary (LF) line-endings
109
                        transport=tree.bzrdir.root_transport)
1731.1.33 by Aaron Bentley
Revert no-special-root changes
110
        tree.set_root_id('root-id')
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
111
        tree.add(files, ['a-id', 'b-id', 'c-id'])
112
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
113
    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.
114
        """return a test tree with a, b/, b/c contents."""
115
        self._make_abc_tree(tree)
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
116
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
117
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
118
    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.
119
        """return a test tree with a, b/, b/c contents.
120
        
121
        This variation changes the content of 'a' to foobar\n.
122
        """
123
        self._make_abc_tree(tree)
124
        f = open(tree.basedir + '/a', 'wb')
125
        try:
126
            f.write('foobar\n')
127
        finally:
128
            f.close()
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
129
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
130
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
131
    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.
132
        """return a test tree with a, b/, b/c contents.
133
        
134
        This variation changes the executable flag of b/c to True.
135
        """
136
        self._make_abc_tree(tree)
137
        tt = transform.TreeTransform(tree)
138
        trans_id = tt.trans_id_tree_path('b/c')
139
        tt.set_executability(True, trans_id)
140
        tt.apply()
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
141
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
142
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
143
    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.
144
        """return a test tree with d, b/, b/c contents.
145
        
146
        This variation renames a to d.
147
        """
148
        self._make_abc_tree(tree)
149
        tree.rename_one('a', 'd')
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
150
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
151
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
152
    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.
153
        """return a test tree with d, b/, b/c contents.
154
        
155
        This variation renames a to d and alters its content to 'bar\n'.
156
        """
157
        self._make_abc_tree(tree)
158
        tree.rename_one('a', 'd')
159
        f = open(tree.basedir + '/d', 'wb')
160
        try:
161
            f.write('bar\n')
162
        finally:
163
            f.close()
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
164
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
165
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
166
    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.
167
        """return a test tree with a, b/, e contents.
168
        
169
        This variation renames b/c to e, and makes it executable.
170
        """
171
        self._make_abc_tree(tree)
172
        tt = transform.TreeTransform(tree)
173
        trans_id = tt.trans_id_tree_path('b/c')
174
        parent_trans_id = tt.trans_id_tree_path('')
175
        tt.adjust_path('e', parent_trans_id, trans_id)
176
        tt.set_executability(True, trans_id)
177
        tt.apply()
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
178
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
179
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
180
    def get_tree_with_subdirs_and_all_content_types(self):
181
        """Return a test tree with subdirs and all content types.
182
183
        The returned tree has the following inventory:
184
            [('', inventory.ROOT_ID),
185
             ('0file', '2file'),
186
             ('1top-dir', '1top-dir'),
187
             (u'2utf\u1234file', u'0utf\u1234file'),
188
             ('symlink', 'symlink'),
189
             ('1top-dir/0file-in-1topdir', '1file-in-1topdir'),
190
             ('1top-dir/1dir-in-1topdir', '0dir-in-1topdir')]
191
        where each component has the type of its name - i.e. '1file..' is afile.
192
193
        note that the order of the paths and fileids is deliberately 
194
        mismatched to ensure that the result order is path based.
195
        """
196
        tree = self.make_branch_and_tree('.')
197
        paths = ['0file',
198
            '1top-dir/',
199
            u'2utf\u1234file',
200
            '1top-dir/0file-in-1topdir',
201
            '1top-dir/1dir-in-1topdir/'
202
            ]
203
        ids = [
204
            '2file',
205
            '1top-dir',
2255.2.107 by John Arbash Meinel
(working), fix dirstate to use utf8 file ids.
206
            u'0utf\u1234file'.encode('utf8'),
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
207
            '1file-in-1topdir',
208
            '0dir-in-1topdir'
209
            ]
210
        self.build_tree(paths)
211
        tree.add(paths, ids)
212
        tt = transform.TreeTransform(tree)
213
        root_transaction_id = tt.trans_id_tree_path('')
214
        tt.new_symlink('symlink',
215
            root_transaction_id, 'link-target', 'symlink')
216
        tt.apply()
217
        return self.workingtree_to_test_tree(tree)
218
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
219
    def get_tree_with_utf8(self, tree):
220
        """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
221
        self._create_tree_with_utf8(tree)
222
        return self.workingtree_to_test_tree(tree)
223
224
    def _create_tree_with_utf8(self, tree):
225
        """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.
226
        paths = [u'',
227
                 u'f\xf6',
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
228
                 u'b\xe5r/',
229
                 u'b\xe5r/b\xe1z',
230
                ]
231
        # bzr itself does not create unicode file ids, but we want them for
232
        # testing.
2309.4.10 by John Arbash Meinel
(fixed) Fix the last few tests that were explicitly passing around unicode ids
233
        file_ids = ['TREE_ROOT',
234
                    'f\xc3\xb6-id',
235
                    'b\xc3\xa5r-id',
236
                    'b\xc3\xa1z-id',
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
237
                   ]
238
        try:
2294.1.3 by John Arbash Meinel
Make sure the inventory enrtries returned are properly formed.
239
            self.build_tree(paths[1:])
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
240
        except UnicodeError:
241
            raise tests.TestSkipped('filesystem does not support unicode.')
2255.2.107 by John Arbash Meinel
(working), fix dirstate to use utf8 file ids.
242
        if tree.path2id('') is None:
243
            # Some trees do not have a root yet.
244
            tree.add(paths, file_ids)
245
        else:
246
            # Some trees will already have a root
247
            tree.set_root_id(file_ids[0])
248
            tree.add(paths[1:], file_ids[1:])
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
249
        try:
250
            tree.commit(u'in\xedtial', rev_id=u'r\xe9v-1'.encode('utf8'))
251
        except errors.NonAsciiRevisionId:
252
            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
253
254
    def get_tree_with_merged_utf8(self, tree):
255
        """Generate a tree with utf8 ancestors."""
256
        self._create_tree_with_utf8(tree)
257
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
258
        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
259
        self.callDeprecated([osutils._file_id_warning],
260
                            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
261
        tree2.commit(u'to m\xe9rge', rev_id=u'r\xe9v-2'.encode('utf8'))
262
263
        tree.merge_from_branch(tree2.branch)
264
        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.
265
        return self.workingtree_to_test_tree(tree)
266
1852.6.1 by Robert Collins
Start tree implementation tests.
267
268
class TreeTestProviderAdapter(WorkingTreeTestProviderAdapter):
269
    """Generate test suites for each Tree implementation in bzrlib.
270
271
    Currently this covers all working tree formats, and RevisionTree by 
272
    committing a working tree to create the revision tree.
273
    """
274
275
    def adapt(self, test):
276
        result = super(TreeTestProviderAdapter, self).adapt(test)
277
        for adapted_test in result:
278
            # for working tree adapted tests, preserve the tree
279
            adapted_test.workingtree_to_test_tree = return_parameter
2255.2.164 by Martin Pool
Change the default format for some tests from AB1 back to WorkingTreeFormat3
280
        # this is the default in that it's used to test the generic InterTree
281
        # code.
282
        default_format = WorkingTreeFormat3()
1852.6.1 by Robert Collins
Start tree implementation tests.
283
        revision_tree_test = self._clone_test(
284
            test,
285
            default_format._matchingbzrdir, 
286
            default_format,
287
            RevisionTree.__name__)
288
        revision_tree_test.workingtree_to_test_tree = revision_tree_from_workingtree
289
        result.addTest(revision_tree_test)
2255.2.164 by Martin Pool
Change the default format for some tests from AB1 back to WorkingTreeFormat3
290
        # also explicity test WorkingTree4 against everything
2255.2.64 by John Arbash Meinel
Add the DirStateRevisionTree to the list of 'tree_implementations'
291
        dirstate_format = WorkingTreeFormat4()
292
        dirstate_revision_tree_test = self._clone_test(
293
            test,
294
            dirstate_format._matchingbzrdir,
295
            dirstate_format,
296
            DirStateRevisionTree.__name__)
297
        dirstate_revision_tree_test.workingtree_to_test_tree = _dirstate_tree_from_workingtree
298
        result.addTest(dirstate_revision_tree_test)
1852.6.1 by Robert Collins
Start tree implementation tests.
299
        return result
300
301
302
def test_suite():
303
    result = TestSuite()
304
    test_tree_implementations = [
2255.7.36 by John Arbash Meinel
All trees should implement get_file_mtime()
305
        'bzrlib.tests.tree_implementations.test_get_file_mtime',
2255.2.134 by John Arbash Meinel
Add a tree-test for get_symlink_target
306
        'bzrlib.tests.tree_implementations.test_get_symlink_target',
2255.2.71 by John Arbash Meinel
Add a test for list_files, and implement it for DirStateRevisionTree
307
        'bzrlib.tests.tree_implementations.test_list_files',
1908.11.5 by John Arbash Meinel
[merge] bzr.dev 2240
308
        'bzrlib.tests.tree_implementations.test_revision_tree',
1852.6.1 by Robert Collins
Start tree implementation tests.
309
        'bzrlib.tests.tree_implementations.test_test_trees',
1551.9.16 by Aaron Bentley
Implement Tree.annotate_iter for RevisionTree and WorkingTree
310
        'bzrlib.tests.tree_implementations.test_tree',
1852.15.3 by Robert Collins
Add a first-cut Tree.walkdirs method.
311
        'bzrlib.tests.tree_implementations.test_walkdirs',
1852.6.1 by Robert Collins
Start tree implementation tests.
312
        ]
313
    adapter = TreeTestProviderAdapter(
314
        default_transport,
315
        # None here will cause a readonly decorator to be created
316
        # by the TestCaseWithTransport.get_readonly_transport method.
317
        None,
318
        [(format, format._matchingbzrdir) for format in 
319
         WorkingTreeFormat._formats.values() + _legacy_formats])
320
    loader = TestLoader()
321
    adapt_modules(test_tree_implementations, adapter, loader, result)
322
    result.addTests(loader.loadTestsFromModuleNames(['bzrlib.tests.tree_implementations']))
323
    return result