summaryrefslogtreecommitdiff
path: root/bzrlib/tests/per_intertree/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'bzrlib/tests/per_intertree/__init__.py')
-rw-r--r--bzrlib/tests/per_intertree/__init__.py184
1 files changed, 184 insertions, 0 deletions
diff --git a/bzrlib/tests/per_intertree/__init__.py b/bzrlib/tests/per_intertree/__init__.py
new file mode 100644
index 0000000..012529a
--- /dev/null
+++ b/bzrlib/tests/per_intertree/__init__.py
@@ -0,0 +1,184 @@
+# Copyright (C) 2006-2010 Canonical Ltd
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+"""InterTree implementation tests for bzr.
+
+These test the conformance of all the InterTree variations to the expected API.
+Specific tests for individual variations are in other places such as:
+ - tests/test_workingtree.py
+"""
+
+import bzrlib
+from bzrlib import (
+ revisiontree,
+ tests,
+ )
+from bzrlib.transform import TransformPreview
+from bzrlib.tests import (
+ default_transport,
+ multiply_tests,
+ )
+from bzrlib.tests.per_tree import (
+ return_parameter,
+ revision_tree_from_workingtree,
+ TestCaseWithTree,
+ )
+from bzrlib.tree import InterTree
+from bzrlib.workingtree_3 import WorkingTreeFormat3
+from bzrlib.workingtree_4 import WorkingTreeFormat4
+
+
+def return_provided_trees(test_case, source, target):
+ """Return the source and target tree unaltered."""
+ return source, target
+
+
+class TestCaseWithTwoTrees(TestCaseWithTree):
+
+ def not_applicable_if_cannot_represent_unversioned(self, tree):
+ if isinstance(tree, revisiontree.RevisionTree):
+ # The locked test trees conversion could not preserve the
+ # unversioned file status. This is normal (e.g. InterDirstateTree
+ # falls back to InterTree if the basis is not a
+ # DirstateRevisionTree, and revision trees cannot have unversioned
+ # files.
+ raise tests.TestNotApplicable('cannot represent unversioned files')
+
+ def not_applicable_if_missing_in(self, relpath, tree):
+ if not tree.path2id(relpath):
+ # The locked test trees conversion could not preserve the missing
+ # file status. This is normal (e.g. InterDirstateTree falls back
+ # to InterTree if the basis is not a DirstateRevisionTree, and
+ # revision trees cannot have missing files.
+ raise tests.TestNotApplicable('cannot represent missing files')
+
+ def make_to_branch_and_tree(self, relpath):
+ """Make a to_workingtree_format branch and tree."""
+ made_control = self.make_bzrdir(relpath,
+ format=self.workingtree_format_to._matchingbzrdir)
+ made_control.create_repository()
+ made_control.create_branch()
+ return self.workingtree_format_to.initialize(made_control)
+
+
+def make_scenarios(transport_server, transport_readonly_server, formats):
+ """Transform the input formats to a list of scenarios.
+
+ :param formats: A list of tuples:.
+ (intertree_class,
+ workingtree_format,
+ workingtree_format_to,
+ mutable_trees_to_test_trees)
+ """
+ result = []
+ for (label, intertree_class,
+ workingtree_format,
+ workingtree_format_to,
+ mutable_trees_to_test_trees) in formats:
+ scenario = (label, {
+ "transport_server": transport_server,
+ "transport_readonly_server": transport_readonly_server,
+ "bzrdir_format":workingtree_format._matchingbzrdir,
+ "workingtree_format":workingtree_format,
+ "intertree_class":intertree_class,
+ "workingtree_format_to":workingtree_format_to,
+ # mutable_trees_to_test_trees takes two trees and converts them to,
+ # whatever relationship the optimiser under test requires.,
+ "mutable_trees_to_test_trees":mutable_trees_to_test_trees,
+ # workingtree_to_test_tree is set to disable changing individual,
+ # trees: instead the mutable_trees_to_test_trees helper is used.,
+ "_workingtree_to_test_tree": return_parameter,
+ })
+ result.append(scenario)
+ return result
+
+
+def mutable_trees_to_preview_trees(test_case, source, target):
+ preview = TransformPreview(target)
+ test_case.addCleanup(preview.finalize)
+ return source, preview.get_preview_tree()
+
+def mutable_trees_to_revision_trees(test_case, source, target):
+ """Convert both trees to repository based revision trees."""
+ return (revision_tree_from_workingtree(test_case, source),
+ revision_tree_from_workingtree(test_case, target))
+
+
+def load_tests(standard_tests, module, loader):
+ default_tree_format = WorkingTreeFormat3()
+ submod_tests = loader.loadTestsFromModuleNames([
+ 'bzrlib.tests.per_intertree.test_compare',
+ 'bzrlib.tests.per_intertree.test_file_content_matches',
+ ])
+ test_intertree_permutations = [
+ # test InterTree with two default-format working trees.
+ (InterTree.__name__, InterTree,
+ default_tree_format, default_tree_format,
+ return_provided_trees)]
+ for optimiser in InterTree._optimisers:
+ if optimiser is revisiontree.InterCHKRevisionTree:
+ # XXX: we shouldn't use an Intertree object to detect inventories
+ # -- vila 20090311
+ chk_tree_format = WorkingTreeFormat4()
+ chk_tree_format._get_matchingbzrdir = \
+ lambda:bzrlib.controldir.format_registry.make_bzrdir('2a')
+ test_intertree_permutations.append(
+ (InterTree.__name__ + "(CHKInventory)",
+ InterTree,
+ chk_tree_format,
+ chk_tree_format,
+ mutable_trees_to_revision_trees))
+ elif optimiser is bzrlib.workingtree_4.InterDirStateTree:
+ # Its a little ugly to be conditional here, but less so than having
+ # the optimiser listed twice.
+ # Add once, compiled version
+ test_intertree_permutations.append(
+ (optimiser.__name__ + "(C)",
+ optimiser,
+ optimiser._matching_from_tree_format,
+ optimiser._matching_to_tree_format,
+ optimiser.make_source_parent_tree_compiled_dirstate))
+ # python version
+ test_intertree_permutations.append(
+ (optimiser.__name__ + "(PY)",
+ optimiser,
+ optimiser._matching_from_tree_format,
+ optimiser._matching_to_tree_format,
+ optimiser.make_source_parent_tree_python_dirstate))
+ elif (optimiser._matching_from_tree_format is not None and
+ optimiser._matching_to_tree_format is not None):
+ test_intertree_permutations.append(
+ (optimiser.__name__,
+ optimiser,
+ optimiser._matching_from_tree_format,
+ optimiser._matching_to_tree_format,
+ optimiser._test_mutable_trees_to_test_trees))
+ # PreviewTree does not have an InterTree optimiser class.
+ test_intertree_permutations.append(
+ (InterTree.__name__ + "(PreviewTree)",
+ InterTree,
+ default_tree_format,
+ default_tree_format,
+ mutable_trees_to_preview_trees))
+ scenarios = make_scenarios(
+ default_transport,
+ # None here will cause a readonly decorator to be created
+ # by the TestCaseWithTransport.get_readonly_transport method.
+ None,
+ test_intertree_permutations)
+ # add the tests for the sub modules to the standard tests.
+ return multiply_tests(submod_tests, scenarios, standard_tests)