66
65
RemoteRepositoryFormat,
68
from .. import groupcompress_repo, knitpack_repo
69
from ...revision import (
67
from ..bzr import groupcompress_repo, knitpack_repo
68
from ..revision import (
73
from ..smart import medium, request
74
from ..smart.client import _SmartClient
75
from ..smart.repository import (
72
from ..sixish import (
77
from ..bzr.smart import medium, request
78
from ..bzr.smart.client import _SmartClient
79
from ..bzr.smart.repository import (
76
80
SmartServerRepositoryGetParentMap,
77
81
SmartServerRepositoryGetStream_1_19,
78
82
_stream_to_byte_stream,
80
from ...tests import (
83
from ...tests.scenarios import load_tests_apply_scenarios
84
from ...transport.memory import MemoryTransport
85
from ...transport.remote import (
87
from .scenarios import load_tests_apply_scenarios
88
from ..transport.memory import MemoryTransport
89
from ..transport.remote import (
87
91
RemoteSSHTransport,
88
92
RemoteTCPTransport,
129
133
def test_find_correct_format(self):
130
134
"""Should open a RemoteBzrDir over a RemoteTransport"""
131
135
fmt = BzrDirFormat.find_format(self.transport)
132
self.assertIn(RemoteBzrProber, controldir.ControlDirFormat._probers)
136
self.assertTrue(RemoteBzrProber
137
in controldir.ControlDirFormat._server_probers)
133
138
self.assertIsInstance(fmt, RemoteBzrDirFormat)
135
140
def test_open_detected_smart_format(self):
335
340
client.add_success_response(b'yes',)
336
341
transport = RemoteTransport('bzr://localhost/', _client=client)
337
342
filename = u'/hell\u00d8'
338
result = transport.has(filename)
344
result = transport.has(filename)
346
result = transport.has(filename.encode('utf-8'))
339
347
self.assertEqual(
340
348
[('call', b'has', (filename.encode('utf-8'),))],
1780
1788
branch._set_last_revision, b'rev-id')
1781
1789
# The UTF-8 message from the response has been decoded into a unicode
1783
self.assertIsInstance(err.msg, str)
1791
self.assertIsInstance(err.msg, text_type)
1784
1792
self.assertEqual(rejection_msg_unicode, err.msg)
1785
1793
branch.unlock()
1786
1794
self.assertFinished(client)
2206
2214
branch.revision_id_to_dotted_revno, b'unknown')
2207
2215
self.assertFinished(client)
2209
def test_ghost_revid(self):
2210
transport = MemoryTransport()
2211
client = FakeClient(transport.base)
2212
client.add_expected_call(
2213
b'Branch.get_stacked_on_url', (b'quack/',),
2214
b'error', (b'NotStacked',),)
2215
# Some older versions of bzr/brz didn't explicitly return
2216
# GhostRevisionsHaveNoRevno
2217
client.add_expected_call(
2218
b'Branch.revision_id_to_revno', (b'quack/', b'revid'),
2219
b'error', (b'error', b'GhostRevisionsHaveNoRevno',
2220
b'The reivison {revid} was not found because there was '
2221
b'a ghost at {ghost-revid}'))
2222
client.add_expected_call(
2223
b'Branch.revision_id_to_revno', (b'quack/', b'revid'),
2224
b'error', (b'GhostRevisionsHaveNoRevno', b'revid', b'ghost-revid',))
2225
transport.mkdir('quack')
2226
transport = transport.clone('quack')
2227
branch = self.make_remote_branch(transport, client)
2228
self.assertRaises(errors.GhostRevisionsHaveNoRevno,
2229
branch.revision_id_to_dotted_revno, b'revid')
2230
self.assertRaises(errors.GhostRevisionsHaveNoRevno,
2231
branch.revision_id_to_dotted_revno, b'revid')
2232
self.assertFinished(client)
2234
2217
def test_dotted_no_smart_verb(self):
2235
2218
self.setup_smart_server_with_call_log()
2236
2219
branch = self.make_branch('.')
2854
2837
somerev1.timezone = -60
2855
2838
somerev1.inventory_sha1 = b"691b39be74c67b1212a75fcb19c433aaed903c2b"
2856
2839
somerev1.message = "Message"
2857
body = zlib.compress(b''.join(chk_bencode_serializer.write_revision_to_lines(
2840
body = zlib.compress(chk_bencode_serializer.write_revision_to_string(
2859
2842
# Split up body into two bits to make sure the zlib compression object
2860
2843
# gets data fed twice.
2861
2844
client.add_success_response_with_body(
3008
2991
repo.get_rev_id_for_revno, 5, (42, b'rev-foo'))
3009
2992
self.assertFinished(client)
3011
def test_outofbounds(self):
3012
repo, client = self.setup_fake_client_and_repository('quack')
3013
client.add_expected_call(
3014
b'Repository.get_rev_id_for_revno', (b'quack/',
3015
43, (42, b'rev-foo')),
3016
b'error', (b'revno-outofbounds', 43, 0, 42))
3018
errors.RevnoOutOfBounds,
3019
repo.get_rev_id_for_revno, 43, (42, b'rev-foo'))
3020
self.assertFinished(client)
3022
def test_outofbounds_old(self):
3023
# Older versions of bzr didn't support RevnoOutOfBounds
3024
repo, client = self.setup_fake_client_and_repository('quack')
3025
client.add_expected_call(
3026
b'Repository.get_rev_id_for_revno', (b'quack/',
3027
43, (42, b'rev-foo')),
3029
b'error', b'ValueError',
3030
b'requested revno (43) is later than given known revno (42)'))
3032
errors.RevnoOutOfBounds,
3033
repo.get_rev_id_for_revno, 43, (42, b'rev-foo'))
3034
self.assertFinished(client)
3036
2994
def test_branch_fallback_locking(self):
3037
2995
"""RemoteBranch.get_rev_id takes a read lock, and tries to call the
3038
2996
get_rev_id_for_revno verb. If the verb is unknown the VFS fallback
3530
3488
def inventories_substream():
3531
3489
# An empty inventory fulltext. This will be streamed normally.
3532
chunks = fmt._serializer.write_inventory_to_lines(inv)
3533
yield versionedfile.ChunkedContentFactory(
3534
(b'rev1',), (), None, chunks, chunks_are_lines=True)
3490
text = fmt._serializer.write_inventory_to_string(inv)
3491
yield versionedfile.FulltextContentFactory(
3492
(b'rev1',), (), None, text)
3536
3494
def inventory_delta_substream():
3537
3495
# An inventory delta. This can't be streamed via this verb, so it
3960
3918
expected_error = errors.UnknownErrorFromSmartServer(err)
3961
3919
self.assertEqual(expected_error, translated_error)
3963
def test_RevnoOutOfBounds(self):
3964
translated_error = self.translateTuple(
3965
((b'revno-outofbounds', 5, 0, 3)), path=b'path')
3966
expected_error = errors.RevnoOutOfBounds(5, (0, 3))
3967
self.assertEqual(expected_error, translated_error)
3970
3922
class TestErrorTranslationRobustness(TestErrorTranslationBase):
3971
3923
"""Unit tests for breezy.bzr.remote._translate_error's robustness.
4522
4474
(b'baserevid', b'line 1\n'),
4523
4475
(b'somerevid', b'line2\n')],
4524
4476
list(tree.annotate_iter('filename')))
4527
class TestBranchGetAllReferenceInfo(RemoteBranchTestCase):
4529
def test_get_all_reference_info(self):
4530
transport = MemoryTransport()
4531
client = FakeClient(transport.base)
4532
client.add_expected_call(
4533
b'Branch.get_stacked_on_url', (b'quack/',),
4534
b'error', (b'NotStacked',))
4535
client.add_expected_call(
4536
b'Branch.get_all_reference_info', (b'quack/',),
4537
b'success', (b'ok',), bencode.bencode([
4538
(b'file-id', b'https://www.example.com/', b'')]))
4539
transport.mkdir('quack')
4540
transport = transport.clone('quack')
4541
branch = self.make_remote_branch(transport, client)
4542
result = branch._get_all_reference_info()
4543
self.assertFinished(client)
4544
self.assertEqual({b'file-id': ('https://www.example.com/', None)}, result)