53
62
from bzrlib.tests.test_http import TestWithTransport_pycurl
54
63
from bzrlib.transport import (
58
67
from bzrlib.transport.http._urllib import HttpTransport_urllib
59
68
from bzrlib.transport.nosmart import NoSmartTransportDecorator
60
69
from bzrlib.transport.readonly import ReadonlyTransportDecorator
61
from bzrlib.repofmt import knitrepo, weaverepo, pack_repo
70
from bzrlib.repofmt import knitrepo, knitpack_repo
64
73
class TestDefaultFormat(TestCase):
66
75
def test_get_set_default_format(self):
67
76
old_format = bzrdir.BzrDirFormat.get_default_format()
68
# default is BzrDirFormat6
69
self.failUnless(isinstance(old_format, bzrdir.BzrDirMetaFormat1))
70
bzrdir.BzrDirFormat._set_default_format(SampleBzrDirFormat())
77
# default is BzrDirMetaFormat1
78
self.assertIsInstance(old_format, bzrdir.BzrDirMetaFormat1)
79
controldir.ControlDirFormat._set_default_format(SampleBzrDirFormat())
71
80
# creating a bzr dir should now create an instrumented dir.
73
82
result = bzrdir.BzrDir.create('memory:///')
74
self.failUnless(isinstance(result, SampleBzrDir))
83
self.assertIsInstance(result, SampleBzrDir)
76
bzrdir.BzrDirFormat._set_default_format(old_format)
85
controldir.ControlDirFormat._set_default_format(old_format)
77
86
self.assertEqual(old_format, bzrdir.BzrDirFormat.get_default_format())
89
class DeprecatedBzrDirFormat(bzrdir.BzrDirFormat):
90
"""A deprecated bzr dir format."""
80
93
class TestFormatRegistry(TestCase):
82
95
def make_format_registry(self):
83
my_format_registry = bzrdir.BzrDirFormatRegistry()
84
my_format_registry.register('weave', bzrdir.BzrDirFormat6,
85
'Pre-0.8 format. Slower and does not support checkouts or shared'
86
' repositories', deprecated=True)
87
my_format_registry.register_lazy('lazy', 'bzrlib.bzrdir',
88
'BzrDirFormat6', 'Format registered lazily', deprecated=True)
89
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',
90
104
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit1',
91
105
'Format using knits',
93
107
my_format_registry.set_default('knit')
94
my_format_registry.register_metadir(
108
bzrdir.register_metadir(my_format_registry,
96
110
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
97
111
'Experimental successor to knit. Use at your own risk.',
98
112
branch_format='bzrlib.branch.BzrBranchFormat6',
99
113
experimental=True)
100
my_format_registry.register_metadir(
114
bzrdir.register_metadir(my_format_registry,
102
116
'bzrlib.repofmt.knitrepo.RepositoryFormatKnit3',
103
117
'Experimental successor to knit. Use at your own risk.',
104
118
branch_format='bzrlib.branch.BzrBranchFormat6', hidden=True)
105
my_format_registry.register('hiddenweave', bzrdir.BzrDirFormat6,
106
'Pre-0.8 format. Slower and does not support checkouts or shared'
107
' repositories', hidden=True)
108
my_format_registry.register_lazy('hiddenlazy', 'bzrlib.bzrdir',
109
'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)
111
124
return my_format_registry
113
126
def test_format_registry(self):
114
127
my_format_registry = self.make_format_registry()
115
128
my_bzrdir = my_format_registry.make_bzrdir('lazy')
116
self.assertIsInstance(my_bzrdir, bzrdir.BzrDirFormat6)
117
my_bzrdir = my_format_registry.make_bzrdir('weave')
118
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)
119
132
my_bzrdir = my_format_registry.make_bzrdir('default')
120
133
self.assertIsInstance(my_bzrdir.repository_format,
121
134
knitrepo.RepositoryFormatKnit1)
166
178
self.assertIs(bzrdir.format_registry.get('dirstate-with-subtree'),
167
179
bzrdir.format_registry.get('default'))
169
repository.RepositoryFormat.get_default_format().__class__,
181
repository.format_registry.get_default().__class__,
170
182
knitrepo.RepositoryFormatKnit3)
172
184
bzrdir.format_registry.set_default_repository(old_default)
174
186
def test_aliases(self):
175
a_registry = bzrdir.BzrDirFormatRegistry()
176
a_registry.register('weave', bzrdir.BzrDirFormat6,
177
'Pre-0.8 format. Slower and does not support checkouts or shared'
178
' repositories', deprecated=True)
179
a_registry.register('weavealias', bzrdir.BzrDirFormat6,
180
'Pre-0.8 format. Slower and does not support checkouts or shared'
181
' repositories', deprecated=True, alias=True)
182
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())
185
197
class SampleBranch(bzrlib.branch.Branch):
248
278
def test_find_format(self):
249
279
# is the right format object found for a branch?
250
280
# create a branch with a few known format objects.
251
# this is not quite the same as
252
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()
253
290
self.build_tree(["foo/", "bar/"], transport=t)
254
291
def check_format(format, url):
255
292
format.initialize(url)
256
t = get_transport(url)
293
t = _mod_transport.get_transport_from_path(url)
257
294
found_format = bzrdir.BzrDirFormat.find_format(t)
258
self.failUnless(isinstance(found_format, format.__class__))
259
check_format(bzrdir.BzrDirFormat5(), "foo")
260
check_format(bzrdir.BzrDirFormat6(), "bar")
295
self.assertIsInstance(found_format, format.__class__)
296
check_format(BzrDirFormatTest1(), "foo")
297
check_format(BzrDirFormatTest2(), "bar")
262
299
def test_find_format_nothing_there(self):
263
300
self.assertRaises(NotBranchError,
264
301
bzrdir.BzrDirFormat.find_format,
302
_mod_transport.get_transport_from_path('.'))
267
304
def test_find_format_unknown_format(self):
268
t = get_transport(self.get_url())
305
t = self.get_transport()
270
307
t.put_bytes('.bzr/branch-format', '')
271
308
self.assertRaises(UnknownFormatError,
272
309
bzrdir.BzrDirFormat.find_format,
310
_mod_transport.get_transport_from_path('.'))
275
312
def test_register_unregister_format(self):
276
313
format = SampleBzrDirFormat()
479
517
# Clone source into directory
480
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)
482
549
def test_sprout_obeys_stacking_policy(self):
483
550
child_branch, new_child_transport = self.prepare_default_stacking()
484
551
new_child = child_branch.bzrdir.sprout(new_child_transport.base)
675
742
self.assertEqual(relpath, 'baz')
677
744
def test_open_containing_from_transport(self):
678
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
679
get_transport(self.get_readonly_url('')))
680
self.assertRaises(NotBranchError, bzrdir.BzrDir.open_containing_from_transport,
681
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')))
682
752
control = bzrdir.BzrDir.create(self.get_url())
683
753
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
684
get_transport(self.get_readonly_url('')))
754
_mod_transport.get_transport_from_url(
755
self.get_readonly_url('')))
685
756
self.assertEqual('', relpath)
686
757
branch, relpath = bzrdir.BzrDir.open_containing_from_transport(
687
get_transport(self.get_readonly_url('g/p/q')))
758
_mod_transport.get_transport_from_url(
759
self.get_readonly_url('g/p/q')))
688
760
self.assertEqual('g/p/q', relpath)
690
762
def test_open_containing_tree_or_branch(self):
786
856
self.build_tree(['tree1/subtree/file'])
787
857
sub_tree.add('file')
788
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')
789
862
tree.bzrdir.destroy_workingtree()
863
# FIXME: subtree/.bzr is left here which allows the test to pass (or
864
# fail :-( ) -- vila 20100909
790
865
repo = self.make_repository('repo', shared=True,
791
866
format='dirstate-with-subtree')
792
867
repo.set_make_working_trees(False)
793
tree.bzrdir.sprout('repo/tree2')
794
self.failUnlessExists('repo/tree2/subtree')
795
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')
797
881
def make_foo_bar_baz(self):
798
882
foo = bzrdir.BzrDir.create_branch_convenience('foo').bzrdir
803
887
def test_find_bzrdirs(self):
804
888
foo, bar, baz = self.make_foo_bar_baz()
805
transport = get_transport(self.get_url())
806
self.assertEqualBzrdirs([baz, foo, bar],
807
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))
809
924
def test_find_bzrdirs_list_current(self):
810
925
def list_current(transport):
811
926
return [s for s in transport.list_dir('') if s != 'baz']
813
928
foo, bar, baz = self.make_foo_bar_baz()
814
transport = get_transport(self.get_url())
815
self.assertEqualBzrdirs([foo, bar],
816
bzrdir.BzrDir.find_bzrdirs(transport,
817
list_current=list_current))
929
t = self.get_transport()
930
self.assertEqualBzrdirs(
932
bzrdir.BzrDir.find_bzrdirs(t, list_current=list_current))
820
934
def test_find_bzrdirs_evaluate(self):
821
935
def evaluate(bzrdir):
823
937
repo = bzrdir.open_repository()
824
except NoRepositoryPresent:
938
except errors.NoRepositoryPresent:
825
939
return True, bzrdir.root_transport.base
827
941
return False, bzrdir.root_transport.base
829
943
foo, bar, baz = self.make_foo_bar_baz()
830
transport = get_transport(self.get_url())
944
t = self.get_transport()
831
945
self.assertEqual([baz.root_transport.base, foo.root_transport.base],
832
list(bzrdir.BzrDir.find_bzrdirs(transport,
946
list(bzrdir.BzrDir.find_bzrdirs(t, evaluate=evaluate)))
835
948
def assertEqualBzrdirs(self, first, second):
836
949
first = list(first)
843
956
root = self.make_repository('', shared=True)
844
957
foo, bar, baz = self.make_foo_bar_baz()
845
958
qux = self.make_bzrdir('foo/qux')
846
transport = get_transport(self.get_url())
847
branches = bzrdir.BzrDir.find_branches(transport)
959
t = self.get_transport()
960
branches = bzrdir.BzrDir.find_branches(t)
848
961
self.assertEqual(baz.root_transport.base, branches[0].base)
849
962
self.assertEqual(foo.root_transport.base, branches[1].base)
850
963
self.assertEqual(bar.root_transport.base, branches[2].base)
852
965
# ensure this works without a top-level repo
853
branches = bzrdir.BzrDir.find_branches(transport.clone('foo'))
966
branches = bzrdir.BzrDir.find_branches(t.clone('foo'))
854
967
self.assertEqual(foo.root_transport.base, branches[0].base)
855
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/')
858
986
class TestMeta1DirFormat(TestCaseWithTransport):
859
987
"""Tests specific to the meta1 dir format."""
920
1061
self.assertEqual(2, rpc_count)
923
class TestFormat5(TestCaseWithTransport):
924
"""Tests specific to the version 5 bzrdir format."""
926
def test_same_lockfiles_between_tree_repo_branch(self):
927
# this checks that only a single lockfiles instance is created
928
# for format 5 objects
929
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
930
def check_dir_components_use_same_lock(dir):
931
ctrl_1 = dir.open_repository().control_files
932
ctrl_2 = dir.open_branch().control_files
933
ctrl_3 = dir.open_workingtree()._control_files
934
self.assertTrue(ctrl_1 is ctrl_2)
935
self.assertTrue(ctrl_2 is ctrl_3)
936
check_dir_components_use_same_lock(dir)
937
# and if we open it normally.
938
dir = bzrdir.BzrDir.open(self.get_url())
939
check_dir_components_use_same_lock(dir)
941
def test_can_convert(self):
942
# format 5 dirs are convertable
943
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
944
self.assertTrue(dir.can_convert_format())
946
def test_needs_conversion(self):
947
# format 5 dirs need a conversion if they are not the default,
949
dir = bzrdir.BzrDirFormat5().initialize(self.get_url())
950
# don't need to convert it to itself
951
self.assertFalse(dir.needs_format_conversion(bzrdir.BzrDirFormat5()))
952
# do need to convert it to the current default
953
self.assertTrue(dir.needs_format_conversion(
954
bzrdir.BzrDirFormat.get_default_format()))
957
class TestFormat6(TestCaseWithTransport):
958
"""Tests specific to the version 6 bzrdir format."""
960
def test_same_lockfiles_between_tree_repo_branch(self):
961
# this checks that only a single lockfiles instance is created
962
# for format 6 objects
963
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
964
def check_dir_components_use_same_lock(dir):
965
ctrl_1 = dir.open_repository().control_files
966
ctrl_2 = dir.open_branch().control_files
967
ctrl_3 = dir.open_workingtree()._control_files
968
self.assertTrue(ctrl_1 is ctrl_2)
969
self.assertTrue(ctrl_2 is ctrl_3)
970
check_dir_components_use_same_lock(dir)
971
# and if we open it normally.
972
dir = bzrdir.BzrDir.open(self.get_url())
973
check_dir_components_use_same_lock(dir)
975
def test_can_convert(self):
976
# format 6 dirs are convertable
977
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
978
self.assertTrue(dir.can_convert_format())
980
def test_needs_conversion(self):
981
# format 6 dirs need an conversion if they are not the default.
982
dir = bzrdir.BzrDirFormat6().initialize(self.get_url())
983
self.assertTrue(dir.needs_format_conversion(
984
bzrdir.BzrDirFormat.get_default_format()))
987
class NotBzrDir(bzrlib.bzrdir.BzrDir):
988
"""A non .bzr based control directory."""
990
def __init__(self, transport, format):
991
self._format = format
992
self.root_transport = transport
993
self.transport = transport.clone('.not')
996
class NotBzrDirFormat(bzrlib.bzrdir.BzrDirFormat):
997
"""A test class representing any non-.bzr based disk format."""
999
def initialize_on_transport(self, transport):
1000
"""Initialize a new .not dir in the base directory of a Transport."""
1001
transport.mkdir('.not')
1002
return self.open(transport)
1004
def open(self, transport):
1005
"""Open this directory."""
1006
return NotBzrDir(transport, self)
1009
def _known_formats(self):
1010
return set([NotBzrDirFormat()])
1013
def probe_transport(self, transport):
1014
"""Our format is present if the transport ends in '.not/'."""
1015
if transport.has('.not'):
1016
return NotBzrDirFormat()
1019
class TestNotBzrDir(TestCaseWithTransport):
1020
"""Tests for using the bzrdir api with a non .bzr based disk format.
1022
If/when one of these is in the core, we can let the implementation tests
1026
def test_create_and_find_format(self):
1027
# create a .notbzr dir
1028
format = NotBzrDirFormat()
1029
dir = format.initialize(self.get_url())
1030
self.assertIsInstance(dir, NotBzrDir)
1032
bzrlib.bzrdir.BzrDirFormat.register_control_format(format)
1034
found = bzrlib.bzrdir.BzrDirFormat.find_format(
1035
get_transport(self.get_url()))
1036
self.assertIsInstance(found, NotBzrDirFormat)
1038
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(format)
1040
def test_included_in_known_formats(self):
1041
bzrlib.bzrdir.BzrDirFormat.register_control_format(NotBzrDirFormat)
1043
formats = bzrlib.bzrdir.BzrDirFormat.known_formats()
1044
for format in formats:
1045
if isinstance(format, NotBzrDirFormat):
1047
self.fail("No NotBzrDirFormat in %s" % formats)
1049
bzrlib.bzrdir.BzrDirFormat.unregister_control_format(NotBzrDirFormat)
1052
1064
class NonLocalTests(TestCaseWithTransport):
1053
1065
"""Tests for bzrdir static behaviour on non local paths."""
1338
1369
url = transport.base
1339
1370
err = self.assertRaises(errors.BzrError, bzrdir.BzrDir.open, url)
1340
1371
self.assertEqual('fail', err._preformatted_string)
1373
def test_post_repo_init(self):
1374
from bzrlib.controldir import RepoInitHookParams
1376
bzrdir.BzrDir.hooks.install_named_hook('post_repo_init',
1378
self.make_repository('foo')
1379
self.assertLength(1, calls)
1381
self.assertIsInstance(params, RepoInitHookParams)
1382
self.assertTrue(hasattr(params, 'bzrdir'))
1383
self.assertTrue(hasattr(params, 'repository'))
1385
def test_post_repo_init_hook_repr(self):
1387
bzrdir.BzrDir.hooks.install_named_hook('post_repo_init',
1388
lambda params: param_reprs.append(repr(params)), None)
1389
self.make_repository('foo')
1390
self.assertLength(1, param_reprs)
1391
param_repr = param_reprs[0]
1392
self.assertStartsWith(param_repr, '<RepoInitHookParams for ')
1395
class TestGenerateBackupName(TestCaseWithMemoryTransport):
1396
# FIXME: This may need to be unified with test_osutils.TestBackupNames or
1397
# moved to per_bzrdir or per_transport for better coverage ?
1401
super(TestGenerateBackupName, self).setUp()
1402
self._transport = self.get_transport()
1403
bzrdir.BzrDir.create(self.get_url(),
1404
possible_transports=[self._transport])
1405
self._bzrdir = bzrdir.BzrDir.open_from_transport(self._transport)
1407
def test_deprecated_generate_backup_name(self):
1408
res = self.applyDeprecated(
1409
symbol_versioning.deprecated_in((2, 3, 0)),
1410
self._bzrdir.generate_backup_name, 'whatever')
1413
self.assertEqual("a.~1~", self._bzrdir._available_backup_name("a"))
1415
def test_exiting(self):
1416
self._transport.put_bytes("a.~1~", "some content")
1417
self.assertEqual("a.~2~", self._bzrdir._available_backup_name("a"))
1420
class TestMeta1DirColoFormat(TestCaseWithTransport):
1421
"""Tests specific to the meta1 dir with colocated branches format."""
1423
def test_supports_colo(self):
1424
format = bzrdir.BzrDirMetaFormat1Colo()
1425
self.assertTrue(format.colocated_branches)
1427
def test_upgrade_from_2a(self):
1428
tree = self.make_branch_and_tree('.', format='2a')
1429
format = bzrdir.BzrDirMetaFormat1Colo()
1430
self.assertTrue(tree.bzrdir.needs_format_conversion(format))
1431
converter = tree.bzrdir._format.get_converter(format)
1432
result = converter.convert(tree.bzrdir, None)
1433
self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1Colo)
1434
self.assertFalse(result.needs_format_conversion(format))
1436
def test_downgrade_to_2a(self):
1437
tree = self.make_branch_and_tree('.', format='development-colo')
1438
format = bzrdir.BzrDirMetaFormat1()
1439
self.assertTrue(tree.bzrdir.needs_format_conversion(format))
1440
converter = tree.bzrdir._format.get_converter(format)
1441
result = converter.convert(tree.bzrdir, None)
1442
self.assertIsInstance(result._format, bzrdir.BzrDirMetaFormat1)
1443
self.assertFalse(result.needs_format_conversion(format))
1445
def test_downgrade_to_2a_too_many_branches(self):
1446
tree = self.make_branch_and_tree('.', format='development-colo')
1447
tree.bzrdir.create_branch(name="another-colocated-branch")
1448
converter = tree.bzrdir._format.get_converter(
1449
bzrdir.BzrDirMetaFormat1())
1450
self.assertRaises(errors.BzrError, converter.convert, tree.bzrdir,
1454
class SampleBzrFormat(bzrdir.BzrFormat):
1457
def get_format_string(cls):
1458
return "First line\n"
1461
class TestBzrFormat(TestCase):
1462
"""Tests for BzrFormat."""
1464
def test_as_string(self):
1465
format = SampleBzrFormat()
1466
format.features = {"foo": "required"}
1467
self.assertEquals(format.as_string(),
1470
format.features["another"] = "optional"
1471
self.assertEquals(format.as_string(),
1474
"optional another\n")
1476
def test_network_name(self):
1477
# The network string should include the feature info
1478
format = SampleBzrFormat()
1479
format.features = {"foo": "required"}
1481
"First line\nrequired foo\n",
1482
format.network_name())
1484
def test_from_string_no_features(self):
1486
format = SampleBzrFormat.from_string(
1488
self.assertEquals({}, format.features)
1490
def test_from_string_with_feature(self):
1492
format = SampleBzrFormat.from_string(
1493
"First line\nrequired foo\n")
1494
self.assertEquals("required", format.features.get("foo"))
1496
def test_from_string_format_string_mismatch(self):
1497
# The first line has to match the format string
1498
self.assertRaises(AssertionError, SampleBzrFormat.from_string,
1499
"Second line\nrequired foo\n")
1501
def test_from_string_missing_space(self):
1502
# At least one space is required in the feature lines
1503
self.assertRaises(errors.ParseFormatError, SampleBzrFormat.from_string,
1504
"First line\nfoo\n")
1506
def test_from_string_with_spaces(self):
1507
# Feature with spaces (in case we add stuff like this in the future)
1508
format = SampleBzrFormat.from_string(
1509
"First line\nrequired foo with spaces\n")
1510
self.assertEquals("required", format.features.get("foo with spaces"))
1513
format1 = SampleBzrFormat()
1514
format1.features = {"nested-trees": "optional"}
1515
format2 = SampleBzrFormat()
1516
format2.features = {"nested-trees": "optional"}
1517
self.assertEquals(format1, format1)
1518
self.assertEquals(format1, format2)
1519
format3 = SampleBzrFormat()
1520
self.assertNotEquals(format1, format3)
1522
def test_check_support_status_optional(self):
1523
# Optional, so silently ignore
1524
format = SampleBzrFormat()
1525
format.features = {"nested-trees": "optional"}
1526
format.check_support_status(True)
1527
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1528
SampleBzrFormat.register_feature("nested-trees")
1529
format.check_support_status(True)
1531
def test_check_support_status_required(self):
1532
# Optional, so trigger an exception
1533
format = SampleBzrFormat()
1534
format.features = {"nested-trees": "required"}
1535
self.assertRaises(errors.MissingFeature, format.check_support_status,
1537
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1538
SampleBzrFormat.register_feature("nested-trees")
1539
format.check_support_status(True)
1541
def test_check_support_status_unknown(self):
1542
# treat unknown necessity as required
1543
format = SampleBzrFormat()
1544
format.features = {"nested-trees": "unknown"}
1545
self.assertRaises(errors.MissingFeature, format.check_support_status,
1547
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1548
SampleBzrFormat.register_feature("nested-trees")
1549
format.check_support_status(True)
1551
def test_feature_already_registered(self):
1552
# a feature can only be registered once
1553
self.addCleanup(SampleBzrFormat.unregister_feature, "nested-trees")
1554
SampleBzrFormat.register_feature("nested-trees")
1555
self.assertRaises(errors.FeatureAlreadyRegistered,
1556
SampleBzrFormat.register_feature, "nested-trees")
1558
def test_feature_with_space(self):
1559
# spaces are not allowed in feature names
1560
self.assertRaises(ValueError, SampleBzrFormat.register_feature,