1
# Copyright (C) 2006, 2007 Canonical Ltd
2
# Authors: Robert Collins <robert.collins@canonical.com>
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 2 of the License, or
8
# (at your option) any later version.
10
# This program is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
# GNU General Public License for more details.
15
# You should have received a copy of the GNU General Public License
16
# along with this program; if not, write to the Free Software
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
"""Branch implementation tests for bzr.
22
These test the conformance of all the branch variations to the expected API.
23
Specific tests for individual formats are in the tests/test_branch file
24
rather than in tests/branch_implementations/*.py.
31
from bzrlib.branch import (BranchFormat,
34
from bzrlib.remote import RemoteBranchFormat, RemoteBzrDirFormat
35
from bzrlib.smart.server import (
36
ReadonlySmartTCPServer_for_testing,
37
ReadonlySmartTCPServer_for_testing_v2_only,
38
SmartTCPServer_for_testing,
39
SmartTCPServer_for_testing_v2_only,
41
from bzrlib.tests.bzrdir_implementations.test_bzrdir import TestCaseWithBzrDir
42
from bzrlib.transport.memory import MemoryServer
45
class BranchTestProviderAdapter(tests.TestScenarioApplier):
46
"""A tool to generate a suite testing multiple branch formats at once.
48
This is done by copying the test once for each transport and injecting
49
the transport_server, transport_readonly_server, and branch_format
50
classes into each copy. Each copy is also given a new id() to make it
54
def __init__(self, transport_server, transport_readonly_server, formats,
55
vfs_transport_factory=None, name_suffix=''):
56
self._transport_server = transport_server
57
self._transport_readonly_server = transport_readonly_server
58
self._name_suffix = name_suffix
59
self.scenarios = self.formats_to_scenarios(formats)
61
def formats_to_scenarios(self, formats):
62
"""Transform the input formats to a list of scenarios.
64
:param formats: A list of (branch_format, bzrdir_format).
67
for branch_format, bzrdir_format in formats:
68
# some branches don't have separate format objects.
69
# so we have a conditional here to handle them.
70
scenario_name = getattr(branch_format, '__name__',
71
branch_format.__class__.__name__)
72
scenario_name += self._name_suffix
73
scenario = (scenario_name, {
74
"transport_server":self._transport_server,
75
"transport_readonly_server":self._transport_readonly_server,
76
"bzrdir_format":bzrdir_format,
77
"branch_format":branch_format,
79
result.append(scenario)
83
class TestCaseWithBranch(TestCaseWithBzrDir):
84
"""This helper will be adapted for each branch_implementation test."""
87
super(TestCaseWithBranch, self).setUp()
91
if self.branch is None:
92
self.branch = self.make_branch('')
95
def make_branch(self, relpath, format=None):
96
repo = self.make_repository(relpath, format=format)
97
# fixme RBC 20060210 this isnt necessarily a fixable thing,
98
# Skipped is the wrong exception to raise.
100
return self.branch_format.initialize(repo.bzrdir)
101
except errors.UninitializableFormat:
102
raise tests.TestSkipped('Uninitializable branch format')
104
def make_repository(self, relpath, shared=False, format=None):
105
made_control = self.make_bzrdir(relpath, format=format)
106
return made_control.create_repository(shared=shared)
108
def create_tree_with_merge(self):
109
"""Create a branch with a simple ancestry.
111
The graph should look like:
113
"rev-1" -> "rev-2" -> "rev-3";
114
"rev-1" -> "rev-1.1.1" -> "rev-3";
124
tree = self.make_branch_and_memory_tree('tree')
128
tree.commit('first', rev_id='rev-1')
129
tree.commit('second', rev_id='rev-1.1.1')
130
# Uncommit that last commit and switch to the other line
131
tree.branch.set_last_revision_info(1, 'rev-1')
132
tree.set_parent_ids(['rev-1'])
133
tree.commit('alt-second', rev_id='rev-2')
134
tree.set_parent_ids(['rev-2', 'rev-1.1.1'])
135
tree.commit('third', rev_id='rev-3')
142
def load_tests(basic_tests, module, loader):
143
result = loader.suiteClass()
144
# add the tests for this module
145
result.addTests(basic_tests)
147
test_branch_implementations = [
148
'bzrlib.tests.branch_implementations.test_bound_sftp',
149
'bzrlib.tests.branch_implementations.test_branch',
150
'bzrlib.tests.branch_implementations.test_break_lock',
151
'bzrlib.tests.branch_implementations.test_check',
152
'bzrlib.tests.branch_implementations.test_create_checkout',
153
'bzrlib.tests.branch_implementations.test_commit',
154
'bzrlib.tests.branch_implementations.test_get_revision_id_to_revno_map',
155
'bzrlib.tests.branch_implementations.test_hooks',
156
'bzrlib.tests.branch_implementations.test_http',
157
'bzrlib.tests.branch_implementations.test_last_revision_info',
158
'bzrlib.tests.branch_implementations.test_locking',
159
'bzrlib.tests.branch_implementations.test_parent',
160
'bzrlib.tests.branch_implementations.test_permissions',
161
'bzrlib.tests.branch_implementations.test_pull',
162
'bzrlib.tests.branch_implementations.test_push',
163
'bzrlib.tests.branch_implementations.test_reconcile',
164
'bzrlib.tests.branch_implementations.test_revision_history',
165
'bzrlib.tests.branch_implementations.test_revision_id_to_revno',
166
'bzrlib.tests.branch_implementations.test_sprout',
167
'bzrlib.tests.branch_implementations.test_stacking',
168
'bzrlib.tests.branch_implementations.test_tags',
169
'bzrlib.tests.branch_implementations.test_uncommit',
170
'bzrlib.tests.branch_implementations.test_update',
172
# Generate a list of branch formats and their associated bzrdir formats to
174
combinations = [(format, format._matchingbzrdir) for format in
175
BranchFormat._formats.values() + _legacy_formats]
176
adapter = BranchTestProviderAdapter(
177
# None here will cause the default vfs transport server to be used.
179
# None here will cause a readonly decorator to be created
180
# by the TestCaseWithTransport.get_readonly_transport method.
183
# add the tests for the sub modules
184
tests.adapt_modules(test_branch_implementations, adapter, loader, result)
186
# Add RemoteBranch tests, which need a special server.
187
adapt_to_smart_server = BranchTestProviderAdapter(
188
SmartTCPServer_for_testing,
189
ReadonlySmartTCPServer_for_testing,
190
[(RemoteBranchFormat(), RemoteBzrDirFormat())],
192
name_suffix='-default')
193
tests.adapt_modules(test_branch_implementations,
194
adapt_to_smart_server,
198
# Also add tests for RemoteBranch with HPSS protocol v2 (i.e. bzr <1.6)
200
adapt_to_smart_server = BranchTestProviderAdapter(
201
SmartTCPServer_for_testing_v2_only,
202
ReadonlySmartTCPServer_for_testing_v2_only,
203
[(RemoteBranchFormat(), RemoteBzrDirFormat())],
206
tests.adapt_modules(test_branch_implementations,
207
adapt_to_smart_server,