~bzr-pqm/bzr/bzr.dev

3363.2.7 by Aaron Bentley
Implement alterntative-to-inventory tests
1
# Copyright (C) 2006, 2007, 2008 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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1852.6.1 by Robert Collins
Start tree implementation tests.
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,
3363.2.17 by Aaron Bentley
Start implementing post-change PreviewTree functionality
31
    progress,
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
32
    tests,
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
33
    transform,
34
    )
1852.6.1 by Robert Collins
Start tree implementation tests.
35
from bzrlib.tests.bzrdir_implementations.test_bzrdir import TestCaseWithBzrDir
2553.2.10 by Robert Collins
And overhaul WorkingTreeTestProviderAdapter too.
36
from bzrlib.tests.workingtree_implementations import (
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
37
    make_scenarios as wt_make_scenarios,
38
    make_scenario as wt_make_scenario,
2553.2.10 by Robert Collins
And overhaul WorkingTreeTestProviderAdapter too.
39
    )
3363.10.2 by Aaron Bentley
Fake merge of removal of PreviewTreePost scenarios
40
from bzrlib.revision import NULL_REVISION
2079.1.1 by John Arbash Meinel
Create a deprecated bzrlib.tree.RevisionTree() in favor of bzrlib.revisiontree.RevisionTree()
41
from bzrlib.revisiontree import RevisionTree
3363.2.2 by Aaron Bentley
Add PreviewTree pre scenarios
42
from bzrlib.transform import TransformPreview
2255.2.164 by Martin Pool
Change the default format for some tests from AB1 back to WorkingTreeFormat3
43
from bzrlib.workingtree import (
44
    WorkingTreeFormat,
45
    WorkingTreeFormat3,
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,
3907.2.3 by Ian Clatworthy
DirStateWorkingTree and DirStateWorkingTreeFormat base classes introduced
51
    WorkingTreeFormat5,
2255.2.64 by John Arbash Meinel
Add the DirStateRevisionTree to the list of 'tree_implementations'
52
    )
1852.6.1 by Robert Collins
Start tree implementation tests.
53
54
3363.1.2 by Aaron Bentley
Add TestCase as converter param
55
def return_parameter(testcase, something):
1852.6.1 by Robert Collins
Start tree implementation tests.
56
    """A trivial thunk to return its input."""
57
    return something
58
59
3363.1.2 by Aaron Bentley
Add TestCase as converter param
60
def revision_tree_from_workingtree(testcase, tree):
1852.6.1 by Robert Collins
Start tree implementation tests.
61
    """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
62
    revid = tree.commit('save tree', allow_pointless=True, recursive=None)
1852.6.1 by Robert Collins
Start tree implementation tests.
63
    return tree.branch.repository.revision_tree(revid)
64
65
3363.1.2 by Aaron Bentley
Add TestCase as converter param
66
def _dirstate_tree_from_workingtree(testcase, tree):
3504.2.1 by John Arbash Meinel
Shortcut iter_references when we know references aren't supported.
67
    revid = tree.commit('save tree', allow_pointless=True, recursive=None)
2255.2.64 by John Arbash Meinel
Add the DirStateRevisionTree to the list of 'tree_implementations'
68
    return tree.basis_tree()
69
70
3363.2.2 by Aaron Bentley
Add PreviewTree pre scenarios
71
def preview_tree_pre(testcase, tree):
72
    tt = TransformPreview(tree)
73
    testcase.addCleanup(tt.finalize)
3363.9.7 by Aaron Bentley
Fix up to use set_parent_ids
74
    preview_tree = tt.get_preview_tree()
75
    preview_tree.set_parent_ids(tree.get_parent_ids())
76
    return preview_tree
3363.2.2 by Aaron Bentley
Add PreviewTree pre scenarios
77
78
3363.10.2 by Aaron Bentley
Fake merge of removal of PreviewTreePost scenarios
79
def preview_tree_post(testcase, tree):
3363.10.13 by Aaron Bentley
Preserve past commits when converting to a PreviewTreePost
80
    basis = tree.basis_tree()
81
    tt = TransformPreview(basis)
3363.10.2 by Aaron Bentley
Fake merge of removal of PreviewTreePost scenarios
82
    testcase.addCleanup(tt.finalize)
83
    pp = progress.ProgressPhase('', 1, progress.DummyProgress())
3363.10.5 by Aaron Bentley
Fix locking issue
84
    tree.lock_read()
85
    testcase.addCleanup(tree.unlock)
3363.10.13 by Aaron Bentley
Preserve past commits when converting to a PreviewTreePost
86
    transform._prepare_revert_transform(basis, tree, tt, None, False, pp,
87
                                        basis, {})
3363.10.22 by Aaron Bentley
Fix support for plan_file_merge in PreviewTreePost
88
    preview_tree = tt.get_preview_tree()
89
    preview_tree.set_parent_ids(tree.get_parent_ids())
90
    return preview_tree
3363.10.2 by Aaron Bentley
Fake merge of removal of PreviewTreePost scenarios
91
92
4285.2.1 by Vincent Ladeuil
Cleanup test imports and use features to better track skipped tests.
93
class TestTreeImplementationSupport(tests.TestCaseWithTransport):
1852.6.1 by Robert Collins
Start tree implementation tests.
94
95
    def test_revision_tree_from_workingtree(self):
96
        tree = self.make_branch_and_tree('.')
3363.1.3 by Aaron Bentley
Hide workingtree_to_test_tree behind a method, to get bound self
97
        tree = revision_tree_from_workingtree(self, tree)
1852.6.1 by Robert Collins
Start tree implementation tests.
98
        self.assertIsInstance(tree, RevisionTree)
99
100
101
class TestCaseWithTree(TestCaseWithBzrDir):
102
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
103
    def make_branch_and_tree(self, relpath):
104
        made_control = self.make_bzrdir(relpath, format=
105
            self.workingtree_format._matchingbzrdir)
1852.6.1 by Robert Collins
Start tree implementation tests.
106
        made_control.create_repository()
107
        made_control.create_branch()
108
        return self.workingtree_format.initialize(made_control)
109
3363.1.3 by Aaron Bentley
Hide workingtree_to_test_tree behind a method, to get bound self
110
    def workingtree_to_test_tree(self, tree):
111
        return self._workingtree_to_test_tree(self, tree)
112
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
113
    def _convert_tree(self, tree, converter=None):
114
        """helper to convert using the converter or a supplied one."""
115
        # convert that to the final shape
116
        if converter is None:
117
            converter = self.workingtree_to_test_tree
3363.1.3 by Aaron Bentley
Hide workingtree_to_test_tree behind a method, to get bound self
118
        return converter(tree)
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
119
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
120
    def get_tree_no_parents_no_content(self, empty_tree, converter=None):
121
        """Make a tree with no parents and no contents from empty_tree.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
122
1852.8.3 by Robert Collins
Implement an InterTreeTestProvider and a trivial test_compare test case.
123
        :param empty_tree: A working tree with no content and no parents to
124
            modify.
125
        """
1731.1.33 by Aaron Bentley
Revert no-special-root changes
126
        empty_tree.set_root_id('empty-root-id')
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
127
        return self._convert_tree(empty_tree, converter)
1852.6.1 by Robert Collins
Start tree implementation tests.
128
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
129
    def _make_abc_tree(self, tree):
130
        """setup an abc content tree."""
131
        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.
132
        self.build_tree(files, line_endings='binary',
1982.1.4 by Alexander Belchenko
tree_implementations tests: build_tree with binary (LF) line-endings
133
                        transport=tree.bzrdir.root_transport)
1731.1.33 by Aaron Bentley
Revert no-special-root changes
134
        tree.set_root_id('root-id')
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
135
        tree.add(files, ['a-id', 'b-id', 'c-id'])
136
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
137
    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.
138
        """return a test tree with a, b/, b/c contents."""
139
        self._make_abc_tree(tree)
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
140
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
141
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
142
    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.
143
        """return a test tree with a, b/, b/c contents.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
144
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
145
        This variation changes the content of 'a' to foobar\n.
146
        """
147
        self._make_abc_tree(tree)
148
        f = open(tree.basedir + '/a', 'wb')
149
        try:
150
            f.write('foobar\n')
151
        finally:
152
            f.close()
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_3(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 a, b/, b/c contents.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
157
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
158
        This variation changes the executable flag of b/c to True.
159
        """
160
        self._make_abc_tree(tree)
161
        tt = transform.TreeTransform(tree)
162
        trans_id = tt.trans_id_tree_path('b/c')
163
        tt.set_executability(True, trans_id)
164
        tt.apply()
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
165
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
166
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
167
    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.
168
        """return a test tree with d, b/, b/c contents.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
169
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
170
        This variation renames a to d.
171
        """
172
        self._make_abc_tree(tree)
173
        tree.rename_one('a', 'd')
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
174
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
175
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
176
    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.
177
        """return a test tree with d, b/, b/c contents.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
178
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
179
        This variation renames a to d and alters its content to 'bar\n'.
180
        """
181
        self._make_abc_tree(tree)
182
        tree.rename_one('a', 'd')
183
        f = open(tree.basedir + '/d', 'wb')
184
        try:
185
            f.write('bar\n')
186
        finally:
187
            f.close()
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
188
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
189
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
190
    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.
191
        """return a test tree with a, b/, e contents.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
192
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
193
        This variation renames b/c to e, and makes it executable.
194
        """
195
        self._make_abc_tree(tree)
196
        tt = transform.TreeTransform(tree)
197
        trans_id = tt.trans_id_tree_path('b/c')
198
        parent_trans_id = tt.trans_id_tree_path('')
199
        tt.adjust_path('e', parent_trans_id, trans_id)
200
        tt.set_executability(True, trans_id)
201
        tt.apply()
1852.8.7 by Robert Collins
Update tree_implementation test tree factories to be intertree ready.
202
        return self._convert_tree(tree, converter)
1852.6.9 by Robert Collins
Add more test trees to the tree-implementations tests.
203
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
204
    def get_tree_with_subdirs_and_all_content_types(self):
205
        """Return a test tree with subdirs and all content types.
2408.1.3 by Alexander Belchenko
tree_implementations: make usage of symlinks optional
206
        See get_tree_with_subdirs_and_all_supported_content_types for details.
207
        """
2408.1.8 by Alexander Belchenko
forget to return tree
208
        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
209
210
    def get_tree_with_subdirs_and_all_supported_content_types(self, symlinks):
211
        """Return a test tree with subdirs and all supported content types.
212
        Some content types may not be created on some platforms
213
        (like symlinks on native win32)
214
215
        :param  symlinks:   control is symlink should be created in the tree.
216
                            Note: if you wish to automatically set this
217
                            parameters depending on underlying system,
218
                            please use value returned
219
                            by bzrlib.osutils.has_symlinks() function.
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
220
221
        The returned tree has the following inventory:
222
            [('', inventory.ROOT_ID),
223
             ('0file', '2file'),
224
             ('1top-dir', '1top-dir'),
225
             (u'2utf\u1234file', u'0utf\u1234file'),
2408.1.3 by Alexander Belchenko
tree_implementations: make usage of symlinks optional
226
             ('symlink', 'symlink'),            # only if symlinks arg is True
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
227
             ('1top-dir/0file-in-1topdir', '1file-in-1topdir'),
228
             ('1top-dir/1dir-in-1topdir', '0dir-in-1topdir')]
2408.1.3 by Alexander Belchenko
tree_implementations: make usage of symlinks optional
229
        where each component has the type of its name -
230
        i.e. '1file..' is afile.
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
231
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
232
        note that the order of the paths and fileids is deliberately
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
233
        mismatched to ensure that the result order is path based.
234
        """
4285.2.1 by Vincent Ladeuil
Cleanup test imports and use features to better track skipped tests.
235
        self.requireFeature(tests.UnicodeFilenameFeature)
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
236
        tree = self.make_branch_and_tree('.')
237
        paths = ['0file',
238
            '1top-dir/',
239
            u'2utf\u1234file',
240
            '1top-dir/0file-in-1topdir',
241
            '1top-dir/1dir-in-1topdir/'
242
            ]
243
        ids = [
244
            '2file',
245
            '1top-dir',
2255.2.107 by John Arbash Meinel
(working), fix dirstate to use utf8 file ids.
246
            u'0utf\u1234file'.encode('utf8'),
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
247
            '1file-in-1topdir',
248
            '0dir-in-1topdir'
249
            ]
4285.2.1 by Vincent Ladeuil
Cleanup test imports and use features to better track skipped tests.
250
        self.build_tree(paths)
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
251
        tree.add(paths, ids)
252
        tt = transform.TreeTransform(tree)
2408.1.3 by Alexander Belchenko
tree_implementations: make usage of symlinks optional
253
        if symlinks:
254
            root_transaction_id = tt.trans_id_tree_path('')
255
            tt.new_symlink('symlink',
256
                root_transaction_id, 'link-target', 'symlink')
1852.15.1 by Robert Collins
Add a complex test tree for use with Tree.walkdirs.
257
        tt.apply()
258
        return self.workingtree_to_test_tree(tree)
259
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
260
    def get_tree_with_utf8(self, tree):
261
        """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
262
        self._create_tree_with_utf8(tree)
263
        return self.workingtree_to_test_tree(tree)
264
265
    def _create_tree_with_utf8(self, tree):
266
        """Generate a tree with a utf8 revision and unicode paths."""
4285.2.1 by Vincent Ladeuil
Cleanup test imports and use features to better track skipped tests.
267
        self.requireFeature(tests.UnicodeFilenameFeature)
3638.3.11 by Vincent Ladeuil
Fix failing tests by avoiding unicode combinig encodings (we test
268
        # We avoid combining characters in file names here, normalization
269
        # checks (as performed by some file systems (OSX) are outside the scope
270
        # of these tests).  We use the euro sign \N{Euro Sign} or \u20ac in
271
        # unicode strings or '\xe2\x82\ac' (its utf-8 encoding) in raw strings.
2294.1.3 by John Arbash Meinel
Make sure the inventory enrtries returned are properly formed.
272
        paths = [u'',
3638.3.11 by Vincent Ladeuil
Fix failing tests by avoiding unicode combinig encodings (we test
273
                 u'fo\N{Euro Sign}o',
274
                 u'ba\N{Euro Sign}r/',
275
                 u'ba\N{Euro Sign}r/ba\N{Euro Sign}z',
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
276
                ]
277
        # bzr itself does not create unicode file ids, but we want them for
278
        # testing.
2309.4.10 by John Arbash Meinel
(fixed) Fix the last few tests that were explicitly passing around unicode ids
279
        file_ids = ['TREE_ROOT',
3638.3.11 by Vincent Ladeuil
Fix failing tests by avoiding unicode combinig encodings (we test
280
                    'fo\xe2\x82\xaco-id',
281
                    'ba\xe2\x82\xacr-id',
282
                    'ba\xe2\x82\xacz-id',
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
283
                   ]
4285.2.1 by Vincent Ladeuil
Cleanup test imports and use features to better track skipped tests.
284
        self.build_tree(paths[1:])
2946.3.3 by John Arbash Meinel
Prefer tree.get_root_id() as more explicit than tree.path2id('')
285
        if tree.get_root_id() is None:
2255.2.107 by John Arbash Meinel
(working), fix dirstate to use utf8 file ids.
286
            # Some trees do not have a root yet.
287
            tree.add(paths, file_ids)
288
        else:
289
            # Some trees will already have a root
290
            tree.set_root_id(file_ids[0])
291
            tree.add(paths[1:], file_ids[1:])
2294.1.1 by John Arbash Meinel
Track down some non-ascii deficiencies in commit logic.
292
        try:
293
            tree.commit(u'in\xedtial', rev_id=u'r\xe9v-1'.encode('utf8'))
294
        except errors.NonAsciiRevisionId:
295
            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
296
297
    def get_tree_with_merged_utf8(self, tree):
298
        """Generate a tree with utf8 ancestors."""
299
        self._create_tree_with_utf8(tree)
300
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
3638.3.11 by Vincent Ladeuil
Fix failing tests by avoiding unicode combinig encodings (we test
301
        self.build_tree([u'tree2/ba\N{Euro Sign}r/qu\N{Euro Sign}x'])
302
        tree2.add([u'ba\N{Euro Sign}r/qu\N{Euro Sign}x'],
303
                  [u'qu\N{Euro Sign}x-id'.encode('utf-8')])
2294.1.2 by John Arbash Meinel
Track down and add tests that all tree.commit() can handle
304
        tree2.commit(u'to m\xe9rge', rev_id=u'r\xe9v-2'.encode('utf8'))
305
306
        tree.merge_from_branch(tree2.branch)
307
        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.
308
        return self.workingtree_to_test_tree(tree)
309
1852.6.1 by Robert Collins
Start tree implementation tests.
310
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
311
def make_scenarios(transport_server, transport_readonly_server, formats):
1852.6.1 by Robert Collins
Start tree implementation tests.
312
    """Generate test suites for each Tree implementation in bzrlib.
313
2553.2.10 by Robert Collins
And overhaul WorkingTreeTestProviderAdapter too.
314
    Currently this covers all working tree formats, and RevisionTree and
315
    DirStateRevisionTree by committing a working tree to create the revision
316
    tree.
1852.6.1 by Robert Collins
Start tree implementation tests.
317
    """
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
318
    scenarios = wt_make_scenarios(transport_server, transport_readonly_server,
319
        formats)
320
    # now adjust the scenarios and add the non-working-tree tree scenarios.
321
    for scenario in scenarios:
322
        # for working tree format tests, preserve the tree
323
        scenario[1]["_workingtree_to_test_tree"] = return_parameter
4285.2.1 by Vincent Ladeuil
Cleanup test imports and use features to better track skipped tests.
324
    # add RevisionTree scenario
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
325
    workingtree_format = WorkingTreeFormat._default_format
326
    scenarios.append((RevisionTree.__name__,
327
        create_tree_scenario(transport_server, transport_readonly_server,
328
        workingtree_format, revision_tree_from_workingtree,)))
329
330
    # also test WorkingTree4/5's RevisionTree implementation which is
331
    # specialised.
332
    # XXX: Ask igc if WT5 revision tree actually is different.
333
    scenarios.append((DirStateRevisionTree.__name__ + ",WT4",
334
        create_tree_scenario(transport_server, transport_readonly_server,
335
        WorkingTreeFormat4(), _dirstate_tree_from_workingtree)))
336
    scenarios.append((DirStateRevisionTree.__name__ + ",WT5",
337
        create_tree_scenario(transport_server, transport_readonly_server,
338
        WorkingTreeFormat5(), _dirstate_tree_from_workingtree)))
339
    scenarios.append(("PreviewTree", create_tree_scenario(transport_server,
340
        transport_readonly_server, workingtree_format, preview_tree_pre)))
341
    scenarios.append(("PreviewTreePost", create_tree_scenario(transport_server,
342
        transport_readonly_server, workingtree_format, preview_tree_post)))
343
    return scenarios
344
345
346
def create_tree_scenario(transport_server, transport_readonly_server,
347
    workingtree_format, converter):
348
    """Create a scenario for the specified converter
349
350
    :param converter: A function that converts a workingtree into the
351
        desired format.
352
    :param workingtree_format: The particular workingtree format to
353
        convert from.
354
    :return: a (name, options) tuple, where options is a dict of values
355
        to be used as members of the TestCase.
356
    """
4285.2.1 by Vincent Ladeuil
Cleanup test imports and use features to better track skipped tests.
357
    scenario_options = wt_make_scenario(transport_server,
358
                                        transport_readonly_server,
359
                                        workingtree_format)
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
360
    scenario_options["_workingtree_to_test_tree"] = converter
361
    return scenario_options
362
363
364
def load_tests(standard_tests, module, loader):
365
    submod_tests = loader.loadTestsFromModuleNames([
3224.1.28 by John Arbash Meinel
Add some direct tests for Tree.annotate_iter
366
        'bzrlib.tests.tree_implementations.test_annotate_iter',
2255.7.36 by John Arbash Meinel
All trees should implement get_file_mtime()
367
        'bzrlib.tests.tree_implementations.test_get_file_mtime',
4354.4.7 by Aaron Bentley
Move MutableTree.get_file_with_stat to Tree.get_file_with_stat.
368
        'bzrlib.tests.tree_implementations.test_get_file_with_stat',
2946.3.2 by John Arbash Meinel
Add tree implementation tests for Tree.get_root_id()
369
        'bzrlib.tests.tree_implementations.test_get_root_id',
2255.2.134 by John Arbash Meinel
Add a tree-test for get_symlink_target
370
        '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.
371
        'bzrlib.tests.tree_implementations.test_inv',
3398.1.24 by Ian Clatworthy
make iter_search_rules a tree method
372
        'bzrlib.tests.tree_implementations.test_iter_search_rules',
2255.2.71 by John Arbash Meinel
Add a test for list_files, and implement it for DirStateRevisionTree
373
        'bzrlib.tests.tree_implementations.test_list_files',
2776.1.7 by Robert Collins
* New method on ``bzrlib.tree.Tree`` ``path_content_summary`` provides a
374
        'bzrlib.tests.tree_implementations.test_path_content_summary',
1908.11.5 by John Arbash Meinel
[merge] bzr.dev 2240
375
        'bzrlib.tests.tree_implementations.test_revision_tree',
1852.6.1 by Robert Collins
Start tree implementation tests.
376
        'bzrlib.tests.tree_implementations.test_test_trees',
1551.9.16 by Aaron Bentley
Implement Tree.annotate_iter for RevisionTree and WorkingTree
377
        'bzrlib.tests.tree_implementations.test_tree',
1852.15.3 by Robert Collins
Add a first-cut Tree.walkdirs method.
378
        'bzrlib.tests.tree_implementations.test_walkdirs',
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
379
        ])
380
    scenarios = make_scenarios(
4285.2.1 by Vincent Ladeuil
Cleanup test imports and use features to better track skipped tests.
381
        tests.default_transport,
1852.6.1 by Robert Collins
Start tree implementation tests.
382
        # None here will cause a readonly decorator to be created
383
        # by the TestCaseWithTransport.get_readonly_transport method.
384
        None,
3543.1.1 by Michael Hudson
change the scenario multiplication to get the bzrdir format from the tree and
385
        WorkingTreeFormat._formats.values() + _legacy_formats)
3302.9.27 by Vincent Ladeuil
Fixed as per Ian's review.
386
    # add the tests for the sub modules
4285.2.1 by Vincent Ladeuil
Cleanup test imports and use features to better track skipped tests.
387
    return tests.multiply_tests(submod_tests, scenarios, standard_tests)