52
62
from bzrlib.tests.test_http import TestWithTransport_pycurl
53
63
from bzrlib.transport import (
57
67
from bzrlib.transport.http._urllib import HttpTransport_urllib
58
68
from bzrlib.transport.nosmart import NoSmartTransportDecorator
59
69
from bzrlib.transport.readonly import ReadonlyTransportDecorator
60
from bzrlib.repofmt import knitrepo, weaverepo, pack_repo
70
from bzrlib.repofmt import knitrepo, knitpack_repo
63
73
class TestDefaultFormat(TestCase):
65
75
def test_get_set_default_format(self):
66
76
old_format = bzrdir.BzrDirFormat.get_default_format()
67
# default is BzrDirFormat6
68
self.failUnless(isinstance(old_format, bzrdir.BzrDirMetaFormat1))
69
bzrdir.BzrDirFormat._set_default_format(SampleBzrDirFormat())
77
# default is BzrDirMetaFormat1
78
self.assertIsInstance(old_format, bzrdir.BzrDirMetaFormat1)
79
controldir.ControlDirFormat._set_default_format(SampleBzrDirFormat())
70
80
# creating a bzr dir should now create an instrumented dir.
72
82
result = bzrdir.BzrDir.create('memory:///')
73
self.failUnless(isinstance(result, SampleBzrDir))
83
self.assertIsInstance(result, SampleBzrDir)
75
bzrdir.BzrDirFormat._set_default_format(old_format)
85
controldir.ControlDirFormat._set_default_format(old_format)
76
86
self.assertEqual(old_format, bzrdir.BzrDirFormat.get_default_format())
89
class DeprecatedBzrDirFormat(bzrdir.BzrDirFormat):
90
"""A deprecated bzr dir format."""
79
93
class TestFormatRegistry(TestCase):
81
95
def make_format_registry(self):
82
my_format_registry = bzrdir.BzrDirFormatRegistry()
83
my_format_registry.register('weave', bzrdir.BzrDirFormat6,
84
'Pre-0.8 format. Slower and does not support checkouts or shared'
85
' repositories', deprecated=True)
86
my_format_registry.register_lazy('lazy', 'bzrlib.bzrdir',
87
'BzrDirFormat6', 'Format registered lazily', deprecated=True)
88
my_format_registry.register_metadir('knit',
96
my_format_registry = controldir.ControlDirFormatRegistry()
97
my_format_registry.register('deprecated', DeprecatedBzrDirFormat,
98
'Some format. Slower and unawesome and deprecated.',
100
my_format_registry.register_lazy('lazy', 'bzrlib.tests.test_bzrdir',
101
'DeprecatedBzrDirFormat', 'Format registered lazily',
103
bzrdir.register_metadir(my_format_registry, 'knit',
89
104
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
90
105
'Format using knits',
92
107
my_format_registry.set_default('knit')
93
my_format_registry.register_metadir(
108
bzrdir.register_metadir(my_format_registry,
95
110
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
96
111
'Experimental successor to knit. Use at your own risk.',
97
112
branch_format='bzrlib.branch.BzrBranchFormat6',
98
113
experimental=True)
99
my_format_registry.register_metadir(
114
bzrdir.register_metadir(my_format_registry,
101
116
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
102
117
'Experimental successor to knit. Use at your own risk.',
103
118
branch_format='bzrlib.branch.BzrBranchFormat6', hidden=True)
104
my_format_registry.register('hiddenweave', bzrdir.BzrDirFormat6,
105
'Pre-0.8 format. Slower and does not support checkouts or shared'
106
' repositories', hidden=True)
107
my_format_registry.register_lazy('hiddenlazy', 'bzrlib.bzrdir',
108
'BzrDirFormat6', 'Format registered lazily', deprecated=True,
119
my_format_registry.register('hiddendeprecated', DeprecatedBzrDirFormat,
120
'Old format. Slower and does not support things. ', hidden=True)
121
my_format_registry.register_lazy('hiddenlazy', 'bzrlib.tests.test_bzrdir',
122
'DeprecatedBzrDirFormat', 'Format registered lazily',
123
deprecated=True, hidden=True)
110
124
return my_format_registry
112
126
def test_format_registry(self):
113
127
my_format_registry = self.make_format_registry()
114
128
my_bzrdir = my_format_registry.make_bzrdir('lazy')
115
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
116
my_bzrdir = my_format_registry.make_bzrdir('weave')
117
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
129
self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
130
my_bzrdir = my_format_registry.make_bzrdir('deprecated')
131
self.assertIsInstance(my_bzrdir, DeprecatedBzrDirFormat)
118
132
my_bzrdir = my_format_registry.make_bzrdir('default')
119
133
self.assertIsInstance(my_bzrdir.repository_format,
120
134
knitrepo.RepositoryFormatKnit1)
165
178
self.assertIs(bzrdir.format_registry.get('dirstate-with-subtree'),
166
179
bzrdir.format_registry.get('default'))
168
repository.RepositoryFormat.get_default_format().__class__,
181
repository.format_registry.get_default().__class__,
169
182
knitrepo.RepositoryFormatKnit3)
171
184
bzrdir.format_registry.set_default_repository(old_default)
173
186
def test_aliases(self):
174
a_registry = bzrdir.BzrDirFormatRegistry()
175
a_registry.register('weave', bzrdir.BzrDirFormat6,
176
'Pre-0.8 format. Slower and does not support checkouts or shared'
177
' repositories', deprecated=True)
178
a_registry.register('weavealias', bzrdir.BzrDirFormat6,
179
'Pre-0.8 format. Slower and does not support checkouts or shared'
180
' repositories', deprecated=True, alias=True)
181
self.assertEqual(frozenset(['weavealias']), a_registry.aliases())
187
a_registry = controldir.ControlDirFormatRegistry()
188
a_registry.register('deprecated', DeprecatedBzrDirFormat,
189
'Old format. Slower and does not support stuff',
191
a_registry.register('deprecatedalias', DeprecatedBzrDirFormat,
192
'Old format. Slower and does not support stuff',
193
deprecated=True, alias=True)
194
self.assertEqual(frozenset(['deprecatedalias']), a_registry.aliases())
184
197
class SampleBranch(bzrlib.branch.Branch):
245
278
def test_find_format(self):
246
279
# is the right format object found for a branch?
247
280
# create a branch with a few known format objects.
248
# this is not quite the same as
249
t = get_transport(self.get_url())
281
bzrdir.BzrProber.formats.register(BzrDirFormatTest1.get_format_string(),
283
self.addCleanup(bzrdir.BzrProber.formats.remove,
284
BzrDirFormatTest1.get_format_string())
285
bzrdir.BzrProber.formats.register(BzrDirFormatTest2.get_format_string(),
287
self.addCleanup(bzrdir.BzrProber.formats.remove,
288
BzrDirFormatTest2.get_format_string())
289
t = self.get_transport()
250
290
self.build_tree(["foo/", "bar/"], transport=t)
251
291
def check_format(format, url):
252
292
format.initialize(url)
253
t = get_transport(url)
293
t = _mod_transport.get_transport_from_path(url)
254
294
found_format = bzrdir.BzrDirFormat.find_format(t)
255
self.failUnless(isinstance(found_format, format.__class__))
256
check_format(bzrdir.BzrDirFormat5(), "foo")
257
check_format(bzrdir.BzrDirFormat6(), "bar")
295
self.assertIsInstance(found_format, format.__class__)
296
check_format(BzrDirFormatTest1(), "foo")
297
check_format(BzrDirFormatTest2(), "bar")
259
299
def test_find_format_nothing_there(self):
260
300
self.assertRaises(NotBranchError,
261
301
bzrdir.BzrDirFormat.find_format,
302
_mod_transport.get_transport_from_path('.'))
264
304
def test_find_format_unknown_format(self):
265
t = get_transport(self.get_url())
305
t = self.get_transport()
267
307
t.put_bytes('.bzr/branch-format', '')
268
308
self.assertRaises(UnknownFormatError,
269
309
bzrdir.BzrDirFormat.find_format,
310
_mod_transport.get_transport_from_path('.'))
272
312
def test_register_unregister_format(self):
273
313
format = SampleBzrDirFormat()
476
517
# Clone source into directory
477
518
target = source_bzrdir.clone(self.get_url('parent/target'))
520
def test_format_initialize_on_transport_ex_stacked_on(self):
521
# trunk is a stackable format. Note that its in the same server area
522
# which is what launchpad does, but not sufficient to exercise the
524
trunk = self.make_branch('trunk', format='1.9')
525
t = self.get_transport('stacked')
526
old_fmt = bzrdir.format_registry.make_bzrdir('pack-0.92')
527
repo_name = old_fmt.repository_format.network_name()
528
# Should end up with a 1.9 format (stackable)
529
repo, control, require_stacking, repo_policy = \
530
old_fmt.initialize_on_transport_ex(t,
531
repo_format_name=repo_name, stacked_on='../trunk',
534
# Repositories are open write-locked
535
self.assertTrue(repo.is_write_locked())
536
self.addCleanup(repo.unlock)
538
repo = control.open_repository()
539
self.assertIsInstance(control, bzrdir.BzrDir)
540
opened = bzrdir.BzrDir.open(t.base)
541
if not isinstance(old_fmt, remote.RemoteBzrDirFormat):
542
self.assertEqual(control._format.network_name(),
543
old_fmt.network_name())
544
self.assertEqual(control._format.network_name(),
545
opened._format.network_name())
546
self.assertEqual(control.__class__, opened.__class__)
547
self.assertLength(1, repo._fallback_repositories)
479
549
def test_sprout_obeys_stacking_policy(self):
480
550
child_branch, new_child_transport = self.prepare_default_stacking()
481
551
new_child = child_branch.bzrdir.sprout(new_child_transport.base)
672
742
self.assertEqual(relpath, 'baz')
674
744
def test_open_containing_from_transport(self):
675
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
676
get_transport(self.get_readonly_url('')))
677
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
678
get_transport(self.get_readonly_url('g/p/q')))
745
self.assertRaises(NotBranchError,
746
bzrdir.BzrDir.open_containing_from_transport,
747
_mod_transport.get_transport_from_url(self.get_readonly_url('')))
748
self.assertRaises(NotBranchError,
749
bzrdir.BzrDir.open_containing_from_transport,
750
_mod_transport.get_transport_from_url(
751
self.get_readonly_url('g/p/q')))
679
752
control = bzrdir.BzrDir.create(self.get_url())
680
753
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
681
get_transport(self.get_readonly_url('')))
754
_mod_transport.get_transport_from_url(
755
self.get_readonly_url('')))
682
756
self.assertEqual('', relpath)
683
757
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
684
get_transport(self.get_readonly_url('g/p/q')))
758
_mod_transport.get_transport_from_url(
759
self.get_readonly_url('g/p/q')))
685
760
self.assertEqual('g/p/q', relpath)
687
762
def test_open_containing_tree_or_branch(self):
783
856
self.build_tree(['tree1/subtree/file'])
784
857
sub_tree.add('file')
785
858
tree.commit('Initial commit')
859
# The following line force the orhaning to reveal bug #634470
860
tree.branch.get_config().set_user_option(
861
'bzr.transform.orphan_policy', 'move')
786
862
tree.bzrdir.destroy_workingtree()
863
# FIXME: subtree/.bzr is left here which allows the test to pass (or
864
# fail :-( ) -- vila 20100909
787
865
repo = self.make_repository('repo', shared=True,
788
866
format='dirstate-with-subtree')
789
867
repo.set_make_working_trees(False)
790
tree.bzrdir.sprout('repo/tree2')
791
self.failUnlessExists('repo/tree2/subtree')
792
self.failIfExists('repo/tree2/subtree/file')
868
# FIXME: we just deleted the workingtree and now we want to use it ????
869
# At a minimum, we should use tree.branch below (but this fails too
870
# currently) or stop calling this test 'treeless'. Specifically, I've
871
# turn the line below into an assertRaises when 'subtree/.bzr' is
872
# orphaned and sprout tries to access the branch there (which is left
873
# by bzrdir.BzrDirMeta1.destroy_workingtree when it ignores the
874
# [DeletingParent('Not deleting', u'subtree', None)] conflict). See bug
875
# #634470. -- vila 20100909
876
self.assertRaises(errors.NotBranchError,
877
tree.bzrdir.sprout, 'repo/tree2')
878
# self.assertPathExists('repo/tree2/subtree')
879
# self.assertPathDoesNotExist('repo/tree2/subtree/file')
794
881
def make_foo_bar_baz(self):
795
882
foo = bzrdir.BzrDir.create_branch_convenience('foo').bzrdir
800
887
def test_find_bzrdirs(self):
801
888
foo, bar, baz = self.make_foo_bar_baz()
802
transport = get_transport(self.get_url())
803
self.assertEqualBzrdirs([baz, foo, bar],
804
bzrdir.BzrDir.find_bzrdirs(transport))
889
t = self.get_transport()
890
self.assertEqualBzrdirs([baz, foo, bar], bzrdir.BzrDir.find_bzrdirs(t))
892
def make_fake_permission_denied_transport(self, transport, paths):
893
"""Create a transport that raises PermissionDenied for some paths."""
896
raise errors.PermissionDenied(path)
898
path_filter_server = pathfilter.PathFilteringServer(transport, filter)
899
path_filter_server.start_server()
900
self.addCleanup(path_filter_server.stop_server)
901
path_filter_transport = pathfilter.PathFilteringTransport(
902
path_filter_server, '.')
903
return (path_filter_server, path_filter_transport)
905
def assertBranchUrlsEndWith(self, expect_url_suffix, actual_bzrdirs):
906
"""Check that each branch url ends with the given suffix."""
907
for actual_bzrdir in actual_bzrdirs:
908
self.assertEndsWith(actual_bzrdir.user_url, expect_url_suffix)
910
def test_find_bzrdirs_permission_denied(self):
911
foo, bar, baz = self.make_foo_bar_baz()
912
t = self.get_transport()
913
path_filter_server, path_filter_transport = \
914
self.make_fake_permission_denied_transport(t, ['foo'])
916
self.assertBranchUrlsEndWith('/baz/',
917
bzrdir.BzrDir.find_bzrdirs(path_filter_transport))
919
smart_transport = self.make_smart_server('.',
920
backing_server=path_filter_server)
921
self.assertBranchUrlsEndWith('/baz/',
922
bzrdir.BzrDir.find_bzrdirs(smart_transport))
806
924
def test_find_bzrdirs_list_current(self):
807
925
def list_current(transport):
808
926
return [s for s in transport.list_dir('') if s != 'baz']
810
928
foo, bar, baz = self.make_foo_bar_baz()
811
transport = get_transport(self.get_url())
812
self.assertEqualBzrdirs([foo, bar],
813
bzrdir.BzrDir.find_bzrdirs(transport,
814
list_current=list_current))
929
t = self.get_transport()
930
self.assertEqualBzrdirs(
932
bzrdir.BzrDir.find_bzrdirs(t, list_current=list_current))
817
934
def test_find_bzrdirs_evaluate(self):
818
935
def evaluate(bzrdir):
820
937
repo = bzrdir.open_repository()
821
except NoRepositoryPresent:
938
except errors.NoRepositoryPresent:
822
939
return True, bzrdir.root_transport.base
824
941
return False, bzrdir.root_transport.base
826
943
foo, bar, baz = self.make_foo_bar_baz()
827
transport = get_transport(self.get_url())
944
t = self.get_transport()
828
945
self.assertEqual([baz.root_transport.base, foo.root_transport.base],
829
list(bzrdir.BzrDir.find_bzrdirs(transport,
946
list(bzrdir.BzrDir.find_bzrdirs(t, evaluate=evaluate)))
832
948
def assertEqualBzrdirs(self, first, second):
833
949
first = list(first)
840
956
root = self.make_repository('', shared=True)
841
957
foo, bar, baz = self.make_foo_bar_baz()
842
958
qux = self.make_bzrdir('foo/qux')
843
transport = get_transport(self.get_url())
844
branches = bzrdir.BzrDir.find_branches(transport)
959
t = self.get_transport()
960
branches = bzrdir.BzrDir.find_branches(t)
845
961
self.assertEqual(baz.root_transport.base, branches[0].base)
846
962
self.assertEqual(foo.root_transport.base, branches[1].base)
847
963
self.assertEqual(bar.root_transport.base, branches[2].base)
849
965
# ensure this works without a top-level repo
850
branches = bzrdir.BzrDir.find_branches(transport.clone('foo'))
966
branches = bzrdir.BzrDir.find_branches(t.clone('foo'))
851
967
self.assertEqual(foo.root_transport.base, branches[0].base)
852
968
self.assertEqual(bar.root_transport.base, branches[1].base)
971
class TestMissingRepoBranchesSkipped(TestCaseWithMemoryTransport):
973
def test_find_bzrdirs_missing_repo(self):
974
t = self.get_transport()
975
arepo = self.make_repository('arepo', shared=True)
976
abranch_url = arepo.user_url + '/abranch'
977
abranch = bzrdir.BzrDir.create(abranch_url).create_branch()
978
t.delete_tree('arepo/.bzr')
979
self.assertRaises(errors.NoRepositoryPresent,
980
branch.Branch.open, abranch_url)
981
self.make_branch('baz')
982
for actual_bzrdir in bzrdir.BzrDir.find_branches(t):
983
self.assertEndsWith(actual_bzrdir.user_url, '/baz/')
855
986
class TestMeta1DirFormat(TestCaseWithTransport):
856
987
"""Tests specific to the meta1 dir format."""
917
1060
self.assertEqual(2, rpc_count)
920
class TestFormat5(TestCaseWithTransport):
921
"""Tests specific to the version 5 bzrdir format."""
923
def test_same_lockfiles_between_tree_repo_branch(self):
924
# this checks that only a single lockfiles instance is created
925
# for format 5 objects
926
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
927
def check_dir_components_use_same_lock(dir):
928
ctrl_1 = dir.open_repository().control_files
929
ctrl_2 = dir.open_branch().control_files
930
ctrl_3 = dir.open_workingtree()._control_files
931
self.assertTrue(ctrl_1 is ctrl_2)
932
self.assertTrue(ctrl_2 is ctrl_3)
933
check_dir_components_use_same_lock(dir)
934
# and if we open it normally.
935
dir = bzrdir.BzrDir.open(self.get_url())
936
check_dir_components_use_same_lock(dir)
938
def test_can_convert(self):
939
# format 5 dirs are convertable
940
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
941
self.assertTrue(dir.can_convert_format())
943
def test_needs_conversion(self):
944
# format 5 dirs need a conversion if they are not the default,
946
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
947
# don't need to convert it to itself
948
self.assertFalse(dir.needs_format_conversion(bzrdir.BzrDirFormat5()))
949
# do need to convert it to the current default
950
self.assertTrue(dir.needs_format_conversion(
951
bzrdir.BzrDirFormat.get_default_format()))
954
class TestFormat6(TestCaseWithTransport):
955
"""Tests specific to the version 6 bzrdir format."""
957
def test_same_lockfiles_between_tree_repo_branch(self):
958
# this checks that only a single lockfiles instance is created
959
# for format 6 objects
960
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
961
def check_dir_components_use_same_lock(dir):
962
ctrl_1 = dir.open_repository().control_files
963
ctrl_2 = dir.open_branch().control_files
964
ctrl_3 = dir.open_workingtree()._control_files
965
self.assertTrue(ctrl_1 is ctrl_2)
966
self.assertTrue(ctrl_2 is ctrl_3)
967
check_dir_components_use_same_lock(dir)
968
# and if we open it normally.
969
dir = bzrdir.BzrDir.open(self.get_url())
970
check_dir_components_use_same_lock(dir)
972
def test_can_convert(self):
973
# format 6 dirs are convertable
974
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
975
self.assertTrue(dir.can_convert_format())
977
def test_needs_conversion(self):
978
# format 6 dirs need an conversion if they are not the default.
979
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
980
self.assertTrue(dir.needs_format_conversion(
981
bzrdir.BzrDirFormat.get_default_format()))
984
class NotBzrDir(bzrlib.bzrdir.BzrDir):
985
"""A non .bzr based control directory."""
987
def __init__(self, transport, format):
988
self._format = format
989
self.root_transport = transport
990
self.transport = transport.clone('.not')
993
class NotBzrDirFormat(bzrlib.bzrdir.BzrDirFormat):
994
"""A test class representing any non-.bzr based disk format."""
996
def initialize_on_transport(self, transport):
997
"""Initialize a new .not dir in the base directory of a Transport."""
998
transport.mkdir('.not')
999
return self.open(transport)
1001
def open(self, transport):
1002
"""Open this directory."""
1003
return NotBzrDir(transport, self)
1006
def _known_formats(self):
1007
return set([NotBzrDirFormat()])
1010
def probe_transport(self, transport):
1011
"""Our format is present if the transport ends in '.not/'."""
1012
if transport.has('.not'):
1013
return NotBzrDirFormat()
1016
class TestNotBzrDir(TestCaseWithTransport):
1017
"""Tests for using the bzrdir api with a non .bzr based disk format.
1019
If/when one of these is in the core, we can let the implementation tests
1023
def test_create_and_find_format(self):
1024
# create a .notbzr dir
1025
format = NotBzrDirFormat()
1026
dir = format.initialize(self.get_url())
1027
self.assertIsInstance(dir, NotBzrDir)
1029
bzrlib.bzrdir.BzrDirFormat.register_control_format(format)
1031
found = bzrlib.bzrdir.BzrDirFormat.find_format(
1032
get_transport(self.get_url()))
1033
self.assertIsInstance(found, NotBzrDirFormat)
1035
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(format)
1037
def test_included_in_known_formats(self):
1038
bzrlib.bzrdir.BzrDirFormat.register_control_format(NotBzrDirFormat)
1040
formats = bzrlib.bzrdir.BzrDirFormat.known_formats()
1041
for format in formats:
1042
if isinstance(format, NotBzrDirFormat):
1044
self.fail("No NotBzrDirFormat in %s" % formats)
1046
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(NotBzrDirFormat)
1049
1063
class NonLocalTests(TestCaseWithTransport):
1050
1064
"""Tests for bzrdir static behaviour on non local paths."""
1335
1365
url = transport.base
1336
1366
err = self.assertRaises(errors.BzrError, bzrdir.BzrDir.open, url)
1337
1367
self.assertEqual('fail', err._preformatted_string)
1369
def test_post_repo_init(self):
1370
from bzrlib.controldir import RepoInitHookParams
1372
bzrdir.BzrDir.hooks.install_named_hook('post_repo_init',
1374
self.make_repository('foo')
1375
self.assertLength(1, calls)
1377
self.assertIsInstance(params, RepoInitHookParams)
1378
self.assertTrue(hasattr(params, 'bzrdir'))
1379
self.assertTrue(hasattr(params, 'repository'))
1381
def test_post_repo_init_hook_repr(self):
1383
bzrdir.BzrDir.hooks.install_named_hook('post_repo_init',
1384
lambda params: param_reprs.append(repr(params)), None)
1385
self.make_repository('foo')
1386
self.assertLength(1, param_reprs)
1387
param_repr = param_reprs[0]
1388
self.assertStartsWith(param_repr, '<RepoInitHookParams for ')
1391
class TestGenerateBackupName(TestCaseWithMemoryTransport):
1392
# FIXME: This may need to be unified with test_osutils.TestBackupNames or
1393
# moved to per_bzrdir or per_transport for better coverage ?
1397
super(TestGenerateBackupName, self).setUp()
1398
self._transport = self.get_transport()
1399
bzrdir.BzrDir.create(self.get_url(),
1400
possible_transports=[self._transport])
1401
self._bzrdir = bzrdir.BzrDir.open_from_transport(self._transport)
1403
def test_deprecated_generate_backup_name(self):
1404
res = self.applyDeprecated(
1405
symbol_versioning.deprecated_in((2, 3, 0)),
1406
self._bzrdir.generate_backup_name, 'whatever')
1409
self.assertEqual("a.~1~", self._bzrdir._available_backup_name("a"))
1411
def test_exiting(self):
1412
self._transport.put_bytes("a.~1~", "some content")
1413
self.assertEqual("a.~2~", self._bzrdir._available_backup_name("a"))
1416
class TestMeta1DirColoFormat(TestCaseWithTransport):
1417
"""Tests specific to the meta1 dir with colocated branches format."""
1419
def test_supports_colo(self):
1420
format = bzrdir.BzrDirMetaFormat1Colo()
1421
self.assertTrue(format.colocated_branches)
1423
def test_upgrade_from_2a(self):
1424
tree = self.make_branch_and_tree('.', format='2a')
1425
format = bzrdir.BzrDirMetaFormat1Colo()
1426
self.assertTrue(tree.bzrdir.needs_format_conversion(format))
1427
converter = tree.bzrdir._format.get_converter(format)
1428
result = converter.convert(tree.bzrdir, None)
1429
self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1Colo)
1430
self.assertFalse(result.needs_format_conversion(format))
1432
def test_downgrade_to_2a(self):
1433
tree = self.make_branch_and_tree('.', format='development-colo')
1434
format = bzrdir.BzrDirMetaFormat1()
1435
self.assertTrue(tree.bzrdir.needs_format_conversion(format))
1436
converter = tree.bzrdir._format.get_converter(format)
1437
result = converter.convert(tree.bzrdir, None)
1438
self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
1439
self.assertFalse(result.needs_format_conversion(format))
1441
def test_downgrade_to_2a_too_many_branches(self):
1442
tree = self.make_branch_and_tree('.', format='development-colo')
1443
tree.bzrdir.create_branch(name="another-colocated-branch")
1444
converter = tree.bzrdir._format.get_converter(
1445
bzrdir.BzrDirMetaFormat1())
1446
self.assertRaises(errors.BzrError, converter.convert, tree.bzrdir,
1450
class SampleBzrFormat(bzrdir.BzrFormat):
1453
def get_format_string(cls):
1454
return "First line\n"
1457
class TestBzrFormat(TestCase):
1458
"""Tests for BzrFormat."""
1460
def test_as_string(self):
1461
format = SampleBzrFormat()
1462
format.features = {"foo": "required"}
1463
self.assertEquals(format.as_string(),
1466
format.features["another"] = "optional"
1467
self.assertEquals(format.as_string(),
1470
"optional another\n")
1472
def test_network_name(self):
1473
# The network string should include the feature info
1474
format = SampleBzrFormat()
1475
format.features = {"foo": "required"}
1477
"First line\nrequired foo\n",
1478
format.network_name())
1480
def test_from_string_no_features(self):
1482
format = SampleBzrFormat.from_string(
1484
self.assertEquals({}, format.features)
1486
def test_from_string_with_feature(self):
1488
format = SampleBzrFormat.from_string(
1489
"First line\nrequired foo\n")
1490
self.assertEquals("required", format.features.get("foo"))
1492
def test_from_string_format_string_mismatch(self):
1493
# The first line has to match the format string
1494
self.assertRaises(AssertionError, SampleBzrFormat.from_string,
1495
"Second line\nrequired foo\n")
1497
def test_from_string_missing_space(self):
1498
# At least one space is required in the feature lines
1499
self.assertRaises(errors.ParseFormatError, SampleBzrFormat.from_string,
1500
"First line\nfoo\n")
1502
def test_from_string_with_spaces(self):
1503
# Feature with spaces (in case we add stuff like this in the future)
1504
format = SampleBzrFormat.from_string(
1505
"First line\nrequired foo with spaces\n")
1506
self.assertEquals("required", format.features.get("foo with spaces"))
1509
format1 = SampleBzrFormat()
1510
format1.features = {"nested-trees": "optional"}
1511
format2 = SampleBzrFormat()
1512
format2.features = {"nested-trees": "optional"}
1513
self.assertEquals(format1, format1)
1514
self.assertEquals(format1, format2)
1515
format3 = SampleBzrFormat()
1516
self.assertNotEquals(format1, format3)
1518
def test_check_support_status_optional(self):
1519
# Optional, so silently ignore
1520
format = SampleBzrFormat()
1521
format.features = {"nested-trees": "optional"}
1522
format.check_support_status(True)
1523
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1524
SampleBzrFormat.register_feature("nested-trees")
1525
format.check_support_status(True)
1527
def test_check_support_status_required(self):
1528
# Optional, so trigger an exception
1529
format = SampleBzrFormat()
1530
format.features = {"nested-trees": "required"}
1531
self.assertRaises(errors.MissingFeature, format.check_support_status,
1533
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1534
SampleBzrFormat.register_feature("nested-trees")
1535
format.check_support_status(True)
1537
def test_check_support_status_unknown(self):
1538
# treat unknown necessity as required
1539
format = SampleBzrFormat()
1540
format.features = {"nested-trees": "unknown"}
1541
self.assertRaises(errors.MissingFeature, format.check_support_status,
1543
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1544
SampleBzrFormat.register_feature("nested-trees")
1545
format.check_support_status(True)
1547
def test_feature_already_registered(self):
1548
# a feature can only be registered once
1549
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1550
SampleBzrFormat.register_feature("nested-trees")
1551
self.assertRaises(errors.FeatureAlreadyRegistered,
1552
SampleBzrFormat.register_feature, "nested-trees")
1554
def test_feature_with_space(self):
1555
# spaces are not allowed in feature names
1556
self.assertRaises(ValueError, SampleBzrFormat.register_feature,