96
95
self.addCleanup(self.transport.disconnect)
98
97
def test_create_remote_bzrdir(self):
99
b = remote.RemoteBzrDir(self.transport, RemoteBzrDirFormat())
98
b = remote.RemoteBzrDir(self.transport, remote.RemoteBzrDirFormat())
100
99
self.assertIsInstance(b, BzrDir)
102
101
def test_open_remote_branch(self):
103
102
# open a standalone branch in the working directory
104
b = remote.RemoteBzrDir(self.transport, RemoteBzrDirFormat())
103
b = remote.RemoteBzrDir(self.transport, remote.RemoteBzrDirFormat())
105
104
branch = b.open_branch()
106
105
self.assertIsInstance(branch, Branch)
470
469
client.add_expected_call(
471
470
'BzrDir.cloning_metadir', ('quack/', 'False'),
472
471
'success', (control_name, '', ('branch', ''))),
473
a_bzrdir = RemoteBzrDir(transport, RemoteBzrDirFormat(),
472
a_bzrdir = RemoteBzrDir(transport, remote.RemoteBzrDirFormat(),
475
474
result = a_bzrdir.cloning_metadir()
476
475
# We should have got a reference control dir with default branch and
496
495
client.add_expected_call(
497
496
'BzrDir.open_2.1', ('quack/',), 'success', ('no',))
498
497
self.assertRaises(errors.NotBranchError, RemoteBzrDir, transport,
499
RemoteBzrDirFormat(), _client=client, _force_probe=True)
498
remote.RemoteBzrDirFormat(), _client=client, _force_probe=True)
500
499
self.assertFinished(client)
502
501
def test_present_without_workingtree(self):
503
502
client, transport = self.make_fake_client_and_transport()
504
503
client.add_expected_call(
505
504
'BzrDir.open_2.1', ('quack/',), 'success', ('yes', 'no'))
506
bd = RemoteBzrDir(transport, RemoteBzrDirFormat(),
505
bd = RemoteBzrDir(transport, remote.RemoteBzrDirFormat(),
507
506
_client=client, _force_probe=True)
508
507
self.assertIsInstance(bd, RemoteBzrDir)
509
508
self.assertFalse(bd.has_workingtree())
514
513
client, transport = self.make_fake_client_and_transport()
515
514
client.add_expected_call(
516
515
'BzrDir.open_2.1', ('quack/',), 'success', ('yes', 'yes'))
517
bd = RemoteBzrDir(transport, RemoteBzrDirFormat(),
516
bd = RemoteBzrDir(transport, remote.RemoteBzrDirFormat(),
518
517
_client=client, _force_probe=True)
519
518
self.assertIsInstance(bd, RemoteBzrDir)
520
519
self.assertTrue(bd.has_workingtree())
527
526
'BzrDir.open_2.1', ('quack/',), 'unknown', ('BzrDir.open_2.1',))
528
527
client.add_expected_call(
529
528
'BzrDir.open', ('quack/',), 'success', ('yes',))
530
bd = RemoteBzrDir(transport, RemoteBzrDirFormat(),
529
bd = RemoteBzrDir(transport, remote.RemoteBzrDirFormat(),
531
530
_client=client, _force_probe=True)
532
531
self.assertIsInstance(bd, RemoteBzrDir)
533
532
self.assertFinished(client)
549
548
'BzrDir.open_2.1', ('quack/',), 'unknown', ('BzrDir.open_2.1',))
550
549
client.add_expected_call(
551
550
'BzrDir.open', ('quack/',), 'success', ('yes',))
552
bd = RemoteBzrDir(transport, RemoteBzrDirFormat(),
551
bd = RemoteBzrDir(transport, remote.RemoteBzrDirFormat(),
553
552
_client=client, _force_probe=True)
554
553
self.assertIsInstance(bd, RemoteBzrDir)
555
554
self.assertFinished(client)
725
724
format = branch._format
726
725
self.assertEqual(network_name, format.network_name())
728
def test_already_open_repo_and_reused_medium(self):
729
"""Bug 726584: create_branch(..., repository=repo) should work
730
regardless of what the smart medium's base URL is.
732
self.transport_server = test_server.SmartTCPServer_for_testing
733
transport = self.get_transport('.')
734
repo = self.make_repository('quack')
735
# Client's medium rooted a transport root (not at the bzrdir)
736
client = FakeClient(transport.base)
737
transport = transport.clone('quack')
738
reference_bzrdir_format = bzrdir.format_registry.get('default')()
739
reference_format = reference_bzrdir_format.get_branch_format()
740
network_name = reference_format.network_name()
741
reference_repo_fmt = reference_bzrdir_format.repository_format
742
reference_repo_name = reference_repo_fmt.network_name()
743
client.add_expected_call(
744
'BzrDir.create_branch', ('extra/quack/', network_name),
745
'success', ('ok', network_name, '', 'no', 'no', 'yes',
746
reference_repo_name))
747
a_bzrdir = RemoteBzrDir(transport, RemoteBzrDirFormat(),
749
branch = a_bzrdir.create_branch(repository=repo)
750
# We should have got a remote branch
751
self.assertIsInstance(branch, remote.RemoteBranch)
752
# its format should have the settings from the response
753
format = branch._format
754
self.assertEqual(network_name, format.network_name())
757
728
class TestBzrDirCreateRepository(TestRemote):
1172
1143
[('set_tags_bytes', 'tags bytes')] * 2, real_branch.calls)
1175
class TestBranchHeadsToFetch(RemoteBranchTestCase):
1177
def test_uses_last_revision_info_and_tags_by_default(self):
1178
transport = MemoryTransport()
1179
client = FakeClient(transport.base)
1180
client.add_expected_call(
1181
'Branch.get_stacked_on_url', ('quack/',),
1182
'error', ('NotStacked',))
1183
client.add_expected_call(
1184
'Branch.last_revision_info', ('quack/',),
1185
'success', ('ok', '1', 'rev-tip'))
1186
# XXX: this will break if the default format's serialization of tags
1187
# changes, or if the RPC for fetching tags changes from get_tags_bytes.
1188
client.add_expected_call(
1189
'Branch.get_tags_bytes', ('quack/',),
1190
'success', ('d5:tag-17:rev-foo5:tag-27:rev-bare',))
1191
transport.mkdir('quack')
1192
transport = transport.clone('quack')
1193
branch = self.make_remote_branch(transport, client)
1194
result = branch.heads_to_fetch()
1195
self.assertFinished(client)
1197
(set(['rev-tip']), set(['rev-foo', 'rev-bar'])), result)
1199
def test_uses_rpc_for_formats_with_non_default_heads_to_fetch(self):
1200
transport = MemoryTransport()
1201
client = FakeClient(transport.base)
1202
client.add_expected_call(
1203
'Branch.get_stacked_on_url', ('quack/',),
1204
'error', ('NotStacked',))
1205
client.add_expected_call(
1206
'Branch.heads_to_fetch', ('quack/',),
1207
'success', (['tip'], ['tagged-1', 'tagged-2']))
1208
transport.mkdir('quack')
1209
transport = transport.clone('quack')
1210
branch = self.make_remote_branch(transport, client)
1211
branch._format._use_default_local_heads_to_fetch = lambda: False
1212
result = branch.heads_to_fetch()
1213
self.assertFinished(client)
1214
self.assertEqual((set(['tip']), set(['tagged-1', 'tagged-2'])), result)
1216
def test_backwards_compatible(self):
1217
self.setup_smart_server_with_call_log()
1218
# Make a branch with a single revision.
1219
builder = self.make_branch_builder('foo')
1220
builder.start_series()
1221
builder.build_snapshot('tip', None, [
1222
('add', ('', 'root-id', 'directory', ''))])
1223
builder.finish_series()
1224
branch = builder.get_branch()
1225
# Add two tags to that branch
1226
branch.tags.set_tag('tag-1', 'rev-1')
1227
branch.tags.set_tag('tag-2', 'rev-2')
1228
self.addCleanup(branch.lock_read().unlock)
1229
# Disable the heads_to_fetch verb
1230
verb = 'Branch.heads_to_fetch'
1231
self.disable_verb(verb)
1232
self.reset_smart_call_log()
1233
result = branch.heads_to_fetch()
1234
self.assertEqual((set(['tip']), set(['rev-1', 'rev-2'])), result)
1236
['Branch.last_revision_info', 'Branch.get_tags_bytes'],
1237
[call.call.method for call in self.hpss_calls])
1240
1146
class TestBranchLastRevisionInfo(RemoteBranchTestCase):
1242
1148
def test_empty_branch(self):
1405
1311
# unnecessarily invokes _ensure_real upon a call to lock_write.
1406
1312
branch._ensure_real = lambda: None
1407
1313
branch.lock_write()
1408
result = branch._set_last_revision(NULL_REVISION)
1314
result = branch.set_revision_history([])
1409
1315
branch.unlock()
1410
1316
self.assertEqual(None, result)
1411
1317
self.assertFinished(client)
1413
1319
def test_set_nonempty(self):
1414
# set_last_revision_info(N, rev-idN) is translated to calling
1320
# set_revision_history([rev-id1, ..., rev-idN]) is translated to calling
1415
1321
# Branch.set_last_revision(path, rev-idN) on the wire.
1416
1322
transport = MemoryTransport()
1417
1323
transport.mkdir('branch')
2870
2775
('pack collection autopack',)],
2873
def test_oom_error_reporting(self):
2874
"""An out-of-memory condition on the server is reported clearly"""
2875
transport_path = 'quack'
2876
repo, client = self.setup_fake_client_and_repository(transport_path)
2877
client.add_expected_call(
2878
'PackRepository.autopack', ('quack/',),
2879
'error', ('MemoryError',))
2880
err = self.assertRaises(errors.BzrError, repo.autopack)
2881
self.assertContainsRe(str(err), "^remote server out of mem")
2884
2779
class TestErrorTranslationBase(tests.TestCaseWithMemoryTransport):
2885
2780
"""Base class for unit tests for bzrlib.remote._translate_error."""
2998
2886
expected_error = errors.DivergedBranches(branch, other_branch)
2999
2887
self.assertEqual(expected_error, translated_error)
3001
def test_NotStacked(self):
3002
branch = self.make_branch('')
3003
translated_error = self.translateTuple(('NotStacked',), branch=branch)
3004
expected_error = errors.NotStacked(branch)
3005
self.assertEqual(expected_error, translated_error)
3007
2889
def test_ReadError_no_args(self):
3008
2890
path = 'a path'
3009
2891
translated_error = self.translateTuple(('ReadError',), path=path)
3055
2936
expected_error = errors.PermissionDenied(path, extra)
3056
2937
self.assertEqual(expected_error, translated_error)
3058
# GZ 2011-03-02: TODO test for PermissionDenied with non-ascii 'extra'
3060
def test_NoSuchFile_context_path(self):
3061
local_path = "local path"
3062
translated_error = self.translateTuple(('ReadError', "remote path"),
3064
expected_error = errors.ReadError(local_path)
3065
self.assertEqual(expected_error, translated_error)
3067
def test_NoSuchFile_without_context(self):
3068
remote_path = "remote path"
3069
translated_error = self.translateTuple(('ReadError', remote_path))
3070
expected_error = errors.ReadError(remote_path)
3071
self.assertEqual(expected_error, translated_error)
3073
def test_ReadOnlyError(self):
3074
translated_error = self.translateTuple(('ReadOnlyError',))
3075
expected_error = errors.TransportNotPossible("readonly transport")
3076
self.assertEqual(expected_error, translated_error)
3078
def test_MemoryError(self):
3079
translated_error = self.translateTuple(('MemoryError',))
3080
self.assertStartsWith(str(translated_error),
3081
"remote server out of memory")
3083
def test_generic_IndexError_no_classname(self):
3084
err = errors.ErrorFromSmartServer(('error', "list index out of range"))
3085
translated_error = self.translateErrorFromSmartServer(err)
3086
expected_error = errors.UnknownErrorFromSmartServer(err)
3087
self.assertEqual(expected_error, translated_error)
3089
# GZ 2011-03-02: TODO test generic non-ascii error string
3091
def test_generic_KeyError(self):
3092
err = errors.ErrorFromSmartServer(('error', 'KeyError', "1"))
3093
translated_error = self.translateErrorFromSmartServer(err)
3094
expected_error = errors.UnknownErrorFromSmartServer(err)
3095
self.assertEqual(expected_error, translated_error)
3098
2940
class TestErrorTranslationRobustness(TestErrorTranslationBase):
3099
2941
"""Unit tests for bzrlib.remote._translate_error's robustness.