15
15
# You should have received a copy of the GNU General Public License
16
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
17
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
20
"""BzrDir implementation tests for bzr.
22
22
These test the conformance of all the bzrdir variations to the expected API.
23
23
Specific tests for individual formats are in the tests/test_bzrdir.py file
24
rather than in tests/branch_implementations/*.py.
24
rather than in tests/per_branch/*.py.
27
27
from bzrlib.bzrdir import BzrDirFormat
28
28
from bzrlib.tests import (
31
31
TestCaseWithTransport,
34
33
from bzrlib.transport.memory import MemoryServer
37
class BzrDirTestProviderAdapter(TestScenarioApplier):
38
"""A tool to generate a suite testing multiple bzrdir formats at once.
36
def make_scenarios(vfs_factory, transport_server, transport_readonly_server,
37
formats, name_suffix=''):
38
"""Transform the input to a list of scenarios.
40
This is done by copying the test once for each transport and injecting
41
the transport_server, transport_readonly_server, and bzrdir_format
42
classes into each copy. Each copy is also given a new id() to make it
40
:param formats: A list of bzrdir_format objects.
41
:param vfs_server: A factory to create a Transport Server which has
42
all the VFS methods working, and is writable.
46
def __init__(self, vfs_factory, transport_server, transport_readonly_server,
47
formats, name_suffix=''):
48
"""Create an object to adapt tests.
50
:param vfs_server: A factory to create a Transport Server which has
51
all the VFS methods working, and is writable.
53
self._vfs_factory = vfs_factory
54
self._transport_server = transport_server
55
self._transport_readonly_server = transport_readonly_server
56
self._name_suffix = name_suffix
57
self.scenarios = self.formats_to_scenarios(formats)
59
def formats_to_scenarios(self, formats):
60
"""Transform the input formats to a list of scenarios.
62
:param formats: A list of bzrdir_format objects.
65
for format in formats:
66
scenario_name = format.__class__.__name__
67
scenario_name += self._name_suffix
68
scenario = (scenario_name, {
69
"vfs_transport_factory":self._vfs_factory,
70
"transport_server":self._transport_server,
71
"transport_readonly_server":self._transport_readonly_server,
72
"bzrdir_format":format,
74
result.append(scenario)
45
for format in formats:
46
scenario_name = format.__class__.__name__
47
scenario_name += name_suffix
48
scenario = (scenario_name, {
49
"vfs_transport_factory": vfs_factory,
50
"transport_server": transport_server,
51
"transport_readonly_server": transport_readonly_server,
52
"bzrdir_format": format,
54
result.append(scenario)
78
58
class TestCaseWithBzrDir(TestCaseWithTransport):
93
73
relpath, format=format)
96
def load_tests(basic_tests, module, loader):
97
result = loader.suiteClass()
98
# add the tests for this module
99
result.addTests(basic_tests)
101
test_bzrdir_implementations = [
102
'bzrlib.tests.bzrdir_implementations.test_bzrdir',
76
def load_tests(standard_tests, module, loader):
78
'bzrlib.tests.per_bzrdir.test_bzrdir',
79
'bzrlib.tests.per_bzrdir.test_push',
81
submod_tests = loader.loadTestsFromModuleNames(test_per_bzrdir)
104
82
formats = BzrDirFormat.known_formats()
105
adapter = BzrDirTestProviderAdapter(
83
scenarios = make_scenarios(
106
84
default_transport,
108
86
# None here will cause a readonly decorator to be created
109
87
# by the TestCaseWithTransport.get_readonly_transport method.
112
# add the tests for the sub modules
113
adapt_modules(test_bzrdir_implementations, adapter, loader, result)
115
# This will always add the tests for smart server transport, regardless of
116
# the --transport option the user specified to 'bzr selftest'.
90
# This will always add scenarios using the smart server.
117
91
from bzrlib.smart.server import (
118
92
ReadonlySmartTCPServer_for_testing,
119
93
ReadonlySmartTCPServer_for_testing_v2_only,
121
95
SmartTCPServer_for_testing_v2_only,
123
97
from bzrlib.remote import RemoteBzrDirFormat
125
# test the remote server behaviour using a MemoryTransport
126
smart_server_suite = loader.suiteClass()
127
adapt_to_smart_server = BzrDirTestProviderAdapter(
98
# test the remote server behaviour when backed with a MemoryTransport
99
# Once for the current version
100
scenarios.extend(make_scenarios(
129
102
SmartTCPServer_for_testing,
130
103
ReadonlySmartTCPServer_for_testing,
131
104
[(RemoteBzrDirFormat())],
132
name_suffix='-default')
133
adapt_modules(test_bzrdir_implementations,
134
adapt_to_smart_server,
137
adapt_to_smart_server = BzrDirTestProviderAdapter(
105
name_suffix='-default'))
106
# And once with < 1.6 - the 'v2' protocol.
107
scenarios.extend(make_scenarios(
139
109
SmartTCPServer_for_testing_v2_only,
140
110
ReadonlySmartTCPServer_for_testing_v2_only,
141
111
[(RemoteBzrDirFormat())],
143
adapt_modules(test_bzrdir_implementations,
144
adapt_to_smart_server,
147
result.addTests(smart_server_suite)
113
# add the tests for the sub modules
114
return multiply_tests(submod_tests, scenarios, standard_tests)