1
# Copyright (C) 2011, 2016 Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
"""Tests for the ControlDir facility.
19
For interface contract tests, see tests/per_control_dir.
28
from .scenarios import load_tests_apply_scenarios
31
load_tests = load_tests_apply_scenarios
34
class SampleComponentFormat(controldir.ControlComponentFormat):
36
def get_format_string(self):
37
return "Example component format."
40
class SampleExtraComponentFormat(controldir.ControlComponentFormat):
41
"""Extra format, no format string."""
44
class TestMetaComponentFormatRegistry(tests.TestCase):
47
super(TestMetaComponentFormatRegistry, self).setUp()
48
self.registry = controldir.ControlComponentFormatRegistry()
50
def test_register_unregister_format(self):
51
format = SampleComponentFormat()
52
self.registry.register(format)
53
self.assertEqual(format,
54
self.registry.get("Example component format."))
55
self.registry.remove(format)
56
self.assertRaises(KeyError, self.registry.get,
57
"Example component format.")
59
def test_get_all(self):
60
format = SampleComponentFormat()
61
self.assertEqual([], self.registry._get_all())
62
self.registry.register(format)
63
self.assertEqual([format], self.registry._get_all())
65
def test_get_all_modules(self):
66
format = SampleComponentFormat()
67
self.assertEqual(set(), self.registry._get_all_modules())
68
self.registry.register(format)
70
{"breezy.tests.test_controldir"},
71
self.registry._get_all_modules())
73
def test_register_extra(self):
74
format = SampleExtraComponentFormat()
75
self.assertEqual([], self.registry._get_all())
76
self.registry.register_extra(format)
77
self.assertEqual([format], self.registry._get_all())
79
def test_register_extra_lazy(self):
80
self.assertEqual([], self.registry._get_all())
81
self.registry.register_extra_lazy("breezy.tests.test_controldir",
82
"SampleExtraComponentFormat")
83
formats = self.registry._get_all()
84
self.assertEqual(1, len(formats))
85
self.assertIsInstance(formats[0], SampleExtraComponentFormat)
88
class TestProber(tests.TestCaseWithTransport):
89
"""Per-prober tests."""
92
(prober_cls.__name__, {'prober_cls': prober_cls})
93
for prober_cls in controldir.ControlDirFormat._probers]
96
super(TestProber, self).setUp()
97
self.prober = self.prober_cls()
99
def test_probe_transport_empty(self):
100
transport = self.get_transport(".")
101
self.assertRaises(errors.NotBranchError,
102
self.prober.probe_transport, transport)
104
def test_known_formats(self):
105
known_formats = self.prober_cls.known_formats()
106
self.assertIsInstance(known_formats, set)
107
for format in known_formats:
108
self.assertIsInstance(format, controldir.ControlDirFormat,
112
class NotBzrDir(controldir.ControlDir):
113
"""A non .bzr based control directory."""
115
def __init__(self, transport, format):
116
self._format = format
117
self.root_transport = transport
118
self.transport = transport.clone('.not')
121
class NotBzrDirFormat(controldir.ControlDirFormat):
122
"""A test class representing any non-.bzr based disk format."""
124
def initialize_on_transport(self, transport):
125
"""Initialize a new .not dir in the base directory of a Transport."""
126
transport.mkdir('.not')
127
return self.open(transport)
129
def open(self, transport):
130
"""Open this directory."""
131
return NotBzrDir(transport, self)
134
class NotBzrDirProber(controldir.Prober):
136
def probe_transport(self, transport):
137
"""Our format is present if the transport ends in '.not/'."""
138
if transport.has('.not'):
139
return NotBzrDirFormat()
142
def known_formats(cls):
143
return {NotBzrDirFormat()}
146
class TestNotBzrDir(tests.TestCaseWithTransport):
147
"""Tests for using the controldir api with a non .bzr based disk format.
149
If/when one of these is in the core, we can let the implementation tests
153
def test_create_and_find_format(self):
154
# create a .notbzr dir
155
format = NotBzrDirFormat()
156
dir = format.initialize(self.get_url())
157
self.assertIsInstance(dir, NotBzrDir)
159
controldir.ControlDirFormat.register_prober(NotBzrDirProber)
161
found = controldir.ControlDirFormat.find_format(self.get_transport())
162
self.assertIsInstance(found, NotBzrDirFormat)
164
controldir.ControlDirFormat.unregister_prober(NotBzrDirProber)
166
def test_included_in_known_formats(self):
167
controldir.ControlDirFormat.register_prober(NotBzrDirProber)
168
self.addCleanup(controldir.ControlDirFormat.unregister_prober, NotBzrDirProber)
169
formats = controldir.ControlDirFormat.known_formats()
170
self.assertIsInstance(formats, set)
171
for format in formats:
172
if isinstance(format, NotBzrDirFormat):
175
self.fail("No NotBzrDirFormat in %s" % formats)
178
class UnsupportedControlComponentFormat(controldir.ControlComponentFormat):
180
def is_supported(self):
184
class OldControlComponentFormat(controldir.ControlComponentFormat):
186
def get_format_description(self):
187
return "An old format that is slow"
189
upgrade_recommended = True
192
class DefaultControlComponentFormatTests(tests.TestCase):
193
"""Tests for default ControlComponentFormat implementation."""
195
def test_check_support_status_unsupported(self):
196
self.assertRaises(errors.UnsupportedFormatError,
197
UnsupportedControlComponentFormat().check_support_status,
198
allow_unsupported=False)
199
UnsupportedControlComponentFormat().check_support_status(
200
allow_unsupported=True)
202
def test_check_support_status_supported(self):
203
controldir.ControlComponentFormat().check_support_status(
204
allow_unsupported=False)
205
controldir.ControlComponentFormat().check_support_status(
206
allow_unsupported=True)
208
def test_recommend_upgrade_current_format(self):
209
ui.ui_factory = tests.TestUIFactory()
210
format = controldir.ControlComponentFormat()
211
format.check_support_status(allow_unsupported=False,
212
recommend_upgrade=True)
213
self.assertEqual("", ui.ui_factory.stderr.getvalue())
215
def test_recommend_upgrade_old_format(self):
216
ui.ui_factory = tests.TestUIFactory()
217
format = OldControlComponentFormat()
218
format.check_support_status(allow_unsupported=False,
219
recommend_upgrade=False)
220
self.assertEqual("", ui.ui_factory.stderr.getvalue())
221
format.check_support_status(allow_unsupported=False,
222
recommend_upgrade=True, basedir='apath')
224
'An old format that is slow is deprecated and a better format '
225
'is available.\nIt is recommended that you upgrade by running '
226
'the command\n brz upgrade apath\n',
227
ui.ui_factory.stderr.getvalue())
230
class IsControlFilenameTest(tests.TestCase):
232
def test_is_bzrdir(self):
233
self.assertTrue(controldir.is_control_filename('.bzr'))
235
def test_is_not_bzrdir(self):
236
self.assertFalse(controldir.is_control_filename('.git'))
237
self.assertFalse(controldir.is_control_filename('bla'))