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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
20
"""InterRepository implementation tests for bzr.
22
22
These test the conformance of all the interrepository variations to the
23
23
expected API including generally applicable corner cases.
24
Specific tests for individual formats are in the tests/test_repository.py file
25
rather than in tests/per_interrepository/*.py.
24
Specific tests for individual formats are in the tests/test_repository.py file
25
rather than in tests/interrepository_implementations/*.py.
33
29
from bzrlib.errors import (
35
31
UninitializableFormat,
38
34
from bzrlib.repository import (
42
40
from bzrlib.tests import (
47
from bzrlib.tests.per_controldir.test_controldir import TestCaseWithControlDir
48
from bzrlib.vf_repository import (
49
InterDifferingSerializer,
53
def make_scenarios(transport_server, transport_readonly_server, formats):
54
"""Transform the input formats to a list of scenarios.
56
:param formats: A list of tuples:
57
(label, repository_format, repository_format_to).
45
from bzrlib.tests.bzrdir_implementations.test_bzrdir import TestCaseWithBzrDir
46
from bzrlib.transport import get_transport
49
class InterRepositoryTestProviderAdapter(TestScenarioApplier):
50
"""A tool to generate a suite testing multiple inter repository formats.
52
This is done by copying the test once for each interrepo provider and injecting
53
the transport_server, transport_readonly_server, repository_format and
54
repository_to_format classes into each copy.
55
Each copy is also given a new id() to make it easy to identify.
60
for label, repository_format, repository_format_to, extra_setup in formats:
61
id = '%s,%s,%s' % (label, repository_format.__class__.__name__,
62
repository_format_to.__class__.__name__)
64
{"transport_server": transport_server,
65
"transport_readonly_server": transport_readonly_server,
66
"repository_format": repository_format,
67
"repository_format_to": repository_format_to,
68
"extra_setup": extra_setup,
70
result.append(scenario)
74
def default_test_list():
75
"""Generate the default list of interrepo permutations to test."""
76
from bzrlib.repofmt import (
82
def add_combo(interrepo_cls, from_format, to_format, extra_setup=None,
85
label = interrepo_cls.__name__
86
result.append((label, from_format, to_format, extra_setup))
87
# test the default InterRepository between format 6 and the current
89
# XXX: robertc 20060220 reinstate this when there are two supported
90
# formats which do not have an optimal code path between them.
91
#result.append((InterRepository,
92
# RepositoryFormat6(),
93
# RepositoryFormatKnit1()))
94
for optimiser_class in InterRepository._optimisers:
95
format_to_test = optimiser_class._get_repo_format_to_test()
96
if format_to_test is not None:
97
add_combo(optimiser_class, format_to_test, format_to_test)
98
# if there are specific combinations we want to use, we can add them
99
# here. We want to test rich root upgrading.
100
# XXX: although we attach InterRepository class names to these scenarios,
101
# there's nothing asserting that these labels correspond to what is
103
def force_known_graph(testcase):
104
from bzrlib.fetch import Inter1and2Helper
105
testcase.overrideAttr(Inter1and2Helper, 'known_graph_threshold', -1)
106
# Gather extra scenarios from the repository implementations,
107
# as InterRepositories can be used by Repository implementations
108
# they aren't aware of.
109
for module_name in format_registry._get_all_modules():
110
module = pyutils.get_named_object(module_name)
112
get_extra_interrepo_test_combinations = getattr(
114
"get_extra_interrepo_test_combinations")
115
except AttributeError:
117
for (interrepo_cls, from_format, to_format) in (
118
get_extra_interrepo_test_combinations()):
119
add_combo(interrepo_cls, from_format, to_format)
120
add_combo(InterRepository,
121
knitrepo.RepositoryFormatKnit1(),
122
knitrepo.RepositoryFormatKnit3())
123
add_combo(knitrepo.InterKnitRepo,
124
knitrepo.RepositoryFormatKnit1(),
125
knitpack_repo.RepositoryFormatKnitPack1())
126
add_combo(knitrepo.InterKnitRepo,
127
knitpack_repo.RepositoryFormatKnitPack1(),
128
knitrepo.RepositoryFormatKnit1())
129
add_combo(knitrepo.InterKnitRepo,
130
knitrepo.RepositoryFormatKnit3(),
131
knitpack_repo.RepositoryFormatKnitPack3())
132
add_combo(knitrepo.InterKnitRepo,
133
knitpack_repo.RepositoryFormatKnitPack3(),
134
knitrepo.RepositoryFormatKnit3())
135
add_combo(knitrepo.InterKnitRepo,
136
knitpack_repo.RepositoryFormatKnitPack3(),
137
knitpack_repo.RepositoryFormatKnitPack4())
138
add_combo(InterDifferingSerializer,
139
knitpack_repo.RepositoryFormatKnitPack1(),
140
knitpack_repo.RepositoryFormatKnitPack6RichRoot())
141
add_combo(InterDifferingSerializer,
142
knitpack_repo.RepositoryFormatKnitPack1(),
143
knitpack_repo.RepositoryFormatKnitPack6RichRoot(),
145
label='InterDifferingSerializer+get_known_graph_ancestry')
146
add_combo(InterDifferingSerializer,
147
knitpack_repo.RepositoryFormatKnitPack6RichRoot(),
148
groupcompress_repo.RepositoryFormat2a())
149
add_combo(InterDifferingSerializer,
150
groupcompress_repo.RepositoryFormat2a(),
151
knitpack_repo.RepositoryFormatKnitPack6RichRoot())
155
class TestCaseWithInterRepository(TestCaseWithControlDir):
58
def __init__(self, transport_server, transport_readonly_server, formats):
59
TestScenarioApplier.__init__(self)
60
self._transport_server = transport_server
61
self._transport_readonly_server = transport_readonly_server
62
self.scenarios = self.formats_to_scenarios(formats)
64
def formats_to_scenarios(self, formats):
65
"""Transform the input formats to a list of scenarios.
67
:param formats: A list of tuples:
68
(interrepo_class, repository_format, repository_format_to).
71
for interrepo_class, repository_format, repository_format_to in formats:
72
id = '%s,%s,%s' % (interrepo_class.__name__,
73
repository_format.__class__.__name__,
74
repository_format_to.__class__.__name__)
76
{"transport_server":self._transport_server,
77
"transport_readonly_server":self._transport_readonly_server,
78
"repository_format":repository_format,
79
"interrepo_class":interrepo_class,
80
"repository_format_to":repository_format_to,
82
result.append(scenario)
86
def default_test_list():
87
"""Generate the default list of interrepo permutations to test."""
88
from bzrlib.repofmt import knitrepo, pack_repo, weaverepo
90
# test the default InterRepository between format 6 and the current
92
# XXX: robertc 20060220 reinstate this when there are two supported
93
# formats which do not have an optimal code path between them.
94
#result.append((InterRepository,
95
# RepositoryFormat6(),
96
# RepositoryFormatKnit1()))
97
for optimiser_class in InterRepository._optimisers:
98
format_to_test = optimiser_class._get_repo_format_to_test()
99
if format_to_test is not None:
100
result.append((optimiser_class,
101
format_to_test, format_to_test))
102
# if there are specific combinations we want to use, we can add them
104
result.append((InterModel1and2,
105
weaverepo.RepositoryFormat5(),
106
knitrepo.RepositoryFormatKnit3()))
107
result.append((InterModel1and2,
108
knitrepo.RepositoryFormatKnit1(),
109
knitrepo.RepositoryFormatKnit3()))
110
result.append((InterKnit1and2,
111
knitrepo.RepositoryFormatKnit1(),
112
knitrepo.RepositoryFormatKnit3()))
113
result.append((InterKnitRepo,
114
knitrepo.RepositoryFormatKnit1(),
115
pack_repo.RepositoryFormatKnitPack1()))
116
result.append((InterKnitRepo,
117
pack_repo.RepositoryFormatKnitPack1(),
118
knitrepo.RepositoryFormatKnit1()))
119
result.append((InterKnitRepo,
120
knitrepo.RepositoryFormatKnit3(),
121
pack_repo.RepositoryFormatKnitPack3()))
122
result.append((InterKnitRepo,
123
pack_repo.RepositoryFormatKnitPack3(),
124
knitrepo.RepositoryFormatKnit3()))
128
class TestCaseWithInterRepository(TestCaseWithBzrDir):
158
131
super(TestCaseWithInterRepository, self).setUp()
160
self.extra_setup(self)
162
def get_default_format(self):
164
self.repository_format._matchingbzrdir.repository_format,
165
self.repository_format)
166
return self.repository_format._matchingbzrdir
168
133
def make_branch(self, relpath, format=None):
169
134
repo = self.make_repository(relpath, format=format)