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