1
# Copyright (C) 2006 Canonical Ltd
2
# Authors: Robert Collins <robert.collins@canonical.com>
3
# -*- coding: utf-8 -*-
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
"""BzrDir implementation tests for bzr.
22
These test the conformance of all the bzrdir variations to the expected API.
23
Specific tests for individual formats are in the tests/test_bzrdir.py file
24
rather than in tests/branch_implementations/*.py.
27
from bzrlib.bzrdir import BzrDirFormat
28
from bzrlib.tests import (
31
TestCaseWithTransport,
34
from bzrlib.transport.memory import MemoryServer
37
class BzrDirTestProviderAdapter(TestScenarioApplier):
38
"""A tool to generate a suite testing multiple bzrdir formats at once.
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
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)
78
class TestCaseWithBzrDir(TestCaseWithTransport):
81
super(TestCaseWithBzrDir, self).setUp()
85
if self.bzrdir is None:
86
self.bzrdir = self.make_bzrdir(None)
89
def make_bzrdir(self, relpath, format=None):
91
format = self.bzrdir_format
92
return super(TestCaseWithBzrDir, self).make_bzrdir(
93
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',
104
formats = BzrDirFormat.known_formats()
105
adapter = BzrDirTestProviderAdapter(
108
# None here will cause a readonly decorator to be created
109
# 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'.
117
from bzrlib.smart.server import (
118
ReadonlySmartTCPServer_for_testing,
119
ReadonlySmartTCPServer_for_testing_v2_only,
120
SmartTCPServer_for_testing,
121
SmartTCPServer_for_testing_v2_only,
123
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(
129
SmartTCPServer_for_testing,
130
ReadonlySmartTCPServer_for_testing,
131
[(RemoteBzrDirFormat())],
132
name_suffix='-default')
133
adapt_modules(test_bzrdir_implementations,
134
adapt_to_smart_server,
137
adapt_to_smart_server = BzrDirTestProviderAdapter(
139
SmartTCPServer_for_testing_v2_only,
140
ReadonlySmartTCPServer_for_testing_v2_only,
141
[(RemoteBzrDirFormat())],
143
adapt_modules(test_bzrdir_implementations,
144
adapt_to_smart_server,
147
result.addTests(smart_server_suite)