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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
"""InterRepository implementation tests for bzr.
22
These test the conformance of all the interrepository variations to the
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.
29
from bzrlib.errors import (
31
UninitializableFormat,
34
from bzrlib.repository import (
37
from bzrlib.tests import (
41
from bzrlib.tests.per_bzrdir.test_bzrdir import TestCaseWithBzrDir
42
from bzrlib.transport import get_transport
45
def make_scenarios(transport_server, transport_readonly_server, formats):
46
"""Transform the input formats to a list of scenarios.
48
:param formats: A list of tuples:
49
(label, repository_format, repository_format_to).
52
for label, repository_format, repository_format_to in formats:
53
id = '%s,%s,%s' % (label, repository_format.__class__.__name__,
54
repository_format_to.__class__.__name__)
56
{"transport_server": transport_server,
57
"transport_readonly_server": transport_readonly_server,
58
"repository_format": repository_format,
59
"repository_format_to": repository_format_to,
61
result.append(scenario)
65
def default_test_list():
66
"""Generate the default list of interrepo permutations to test."""
67
from bzrlib.repofmt import (
74
def add_combo(label, from_format, to_format):
75
result.append((label, from_format, to_format))
76
# test the default InterRepository between format 6 and the current
78
# XXX: robertc 20060220 reinstate this when there are two supported
79
# formats which do not have an optimal code path between them.
80
#result.append((InterRepository,
81
# RepositoryFormat6(),
82
# RepositoryFormatKnit1()))
83
for optimiser_class in InterRepository._optimisers:
84
format_to_test = optimiser_class._get_repo_format_to_test()
85
if format_to_test is not None:
86
add_combo(optimiser_class.__name__, format_to_test, format_to_test)
87
# if there are specific combinations we want to use, we can add them
88
# here. We want to test rich root upgrading.
89
# XXX: although we attach InterRepository class names to these scenarios,
90
# there's nothing asserting that these labels correspond to what is
92
add_combo('InterRepository',
93
weaverepo.RepositoryFormat5(),
94
knitrepo.RepositoryFormatKnit3())
95
add_combo('InterRepository',
96
knitrepo.RepositoryFormatKnit1(),
97
knitrepo.RepositoryFormatKnit3())
98
add_combo('InterKnitRepo',
99
knitrepo.RepositoryFormatKnit1(),
100
pack_repo.RepositoryFormatKnitPack1())
101
add_combo('InterKnitRepo',
102
pack_repo.RepositoryFormatKnitPack1(),
103
knitrepo.RepositoryFormatKnit1())
104
add_combo('InterKnitRepo',
105
knitrepo.RepositoryFormatKnit3(),
106
pack_repo.RepositoryFormatKnitPack3())
107
add_combo('InterKnitRepo',
108
pack_repo.RepositoryFormatKnitPack3(),
109
knitrepo.RepositoryFormatKnit3())
110
add_combo('InterKnitRepo',
111
pack_repo.RepositoryFormatKnitPack3(),
112
pack_repo.RepositoryFormatKnitPack4())
113
add_combo('InterDifferingSerializer',
114
pack_repo.RepositoryFormatKnitPack1(),
115
pack_repo.RepositoryFormatKnitPack6RichRoot())
116
add_combo('InterDifferingSerializer',
117
pack_repo.RepositoryFormatKnitPack6RichRoot(),
118
groupcompress_repo.RepositoryFormat2a())
119
add_combo('InterDifferingSerializer',
120
groupcompress_repo.RepositoryFormat2a(),
121
pack_repo.RepositoryFormatKnitPack6RichRoot())
122
add_combo('InterRepository',
123
groupcompress_repo.RepositoryFormatCHK2(),
124
groupcompress_repo.RepositoryFormat2a())
125
add_combo('InterDifferingSerializer',
126
groupcompress_repo.RepositoryFormatCHK1(),
127
groupcompress_repo.RepositoryFormat2a())
131
class TestCaseWithInterRepository(TestCaseWithBzrDir):
134
super(TestCaseWithInterRepository, self).setUp()
136
def make_branch(self, relpath, format=None):
137
repo = self.make_repository(relpath, format=format)
138
return repo.bzrdir.create_branch()
140
def make_bzrdir(self, relpath, format=None):
142
url = self.get_url(relpath)
143
segments = url.split('/')
144
if segments and segments[-1] not in ('', '.'):
145
parent = '/'.join(segments[:-1])
146
t = get_transport(parent)
148
t.mkdir(segments[-1])
152
format = self.repository_format._matchingbzrdir
153
return format.initialize(url)
154
except UninitializableFormat:
155
raise TestSkipped("Format %s is not initializable." % format)
157
def make_repository(self, relpath, format=None):
158
made_control = self.make_bzrdir(relpath, format=format)
159
return self.repository_format.initialize(made_control)
161
def make_to_repository(self, relpath):
162
made_control = self.make_bzrdir(relpath,
163
self.repository_format_to._matchingbzrdir)
164
return self.repository_format_to.initialize(made_control)
167
def load_tests(standard_tests, module, loader):
168
submod_tests = loader.loadTestsFromModuleNames([
169
'bzrlib.tests.per_interrepository.test_fetch',
170
'bzrlib.tests.per_interrepository.test_interrepository',
172
scenarios = make_scenarios(
174
# None here will cause a readonly decorator to be created
175
# by the TestCaseWithTransport.get_readonly_transport method.
179
return multiply_tests(submod_tests, scenarios, standard_tests)