136
136
"""Create a FakeClient.
138
138
:param responses: A list of response-tuple, body-data pairs to be sent
139
back to callers. A special case is if the response-tuple is
140
'unknown verb', then a UnknownSmartMethod will be raised for that
141
call, using the second element of the tuple as the verb in the
141
144
self.responses = responses
143
146
self.expecting_body = False
144
147
_SmartClient.__init__(self, FakeMedium(self._calls), fake_medium_base)
149
def _get_next_response(self):
150
response_tuple = self.responses.pop(0)
151
if response_tuple[0][0] == 'unknown verb':
152
raise errors.UnknownSmartMethod(response_tuple[0][1])
153
return response_tuple
146
155
def call(self, method, *args):
147
156
self._calls.append(('call', method, args))
148
return self.responses.pop(0)[0]
157
return self._get_next_response()[0]
150
159
def call_expecting_body(self, method, *args):
151
160
self._calls.append(('call_expecting_body', method, args))
152
result = self.responses.pop(0)
161
result = self._get_next_response()
153
162
self.expecting_body = True
154
163
return result[0], FakeProtocol(result[1], self)
156
165
def call_with_body_bytes_expecting_body(self, method, args, body):
157
166
self._calls.append(('call_with_body_bytes_expecting_body', method,
159
result = self.responses.pop(0)
168
result = self._get_next_response()
160
169
self.expecting_body = True
161
170
return result[0], FakeProtocol(result[1], self)
315
324
RemoteBzrDirFormat.probe_transport, OldServerTransport())
327
class TestBzrDirOpenRepository(tests.TestCase):
329
def test_backwards_compat_1_2(self):
330
transport = MemoryTransport()
331
transport.mkdir('quack')
332
transport = transport.clone('quack')
333
client = FakeClient([
334
(('unknown verb', 'RemoteRepository.find_repositoryV2'), ''),
335
(('ok', '', 'no', 'no'), ''),],
337
bzrdir = RemoteBzrDir(transport, _client=client)
338
repo = bzrdir.open_repository()
340
[('call', 'BzrDir.find_repositoryV2', ('quack/',)),
341
('call', 'BzrDir.find_repository', ('quack/',))],
318
345
class OldSmartClient(object):
319
346
"""A fake smart client for test_old_version that just returns a version one
320
347
response to the 'hello' (query version) command.
536
563
advisory anyway (a transport could be read-write, but then the
537
564
underlying filesystem could be readonly anyway).
539
client = FakeClient([(
540
('error', "Generic bzr smart protocol error: "
541
"bad request 'Transport.is_readonly'"), '')])
542
transport = RemoteTransport('bzr://example.com/', medium=False,
544
self.assertEqual(False, transport.is_readonly())
546
[('call', 'Transport.is_readonly', ())],
549
def test_error_from_old_0_11_server(self):
550
"""Same as test_error_from_old_server, but with the slightly different
551
error message from bzr 0.11 servers.
553
client = FakeClient([(
554
('error', "Generic bzr smart protocol error: "
555
"bad request u'Transport.is_readonly'"), '')])
566
client = FakeClient([(('unknown verb', 'Transport.is_readonly'), '')])
556
567
transport = RemoteTransport('bzr://example.com/', medium=False,
558
569
self.assertEqual(False, transport.is_readonly())
706
717
def test_get_parent_map_reconnects_if_unknown_method(self):
708
"Generic bzr smart protocol error: "
709
"bad request 'Repository.get_parent_map'")
711
(('error', error_msg), ''),
719
(('unknown verb', 'Repository.get_parent_map'), ''),
713
721
transport_path = 'quack'
714
722
repo, client = self.setup_fake_client_and_repository(
715
723
responses, transport_path)
716
724
rev_id = 'revision-id'
717
parents = repo.get_parent_map([rev_id])
725
expected_deprecations = [
726
'bzrlib.remote.RemoteRepository.get_revision_graph was deprecated '
728
parents = self.callDeprecated(
729
expected_deprecations, repo.get_parent_map, [rev_id])
718
730
self.assertEqual(
719
731
[('call_with_body_bytes_expecting_body',
720
732
'Repository.get_parent_map', ('quack/', rev_id), '\n\n0'),
997
1009
def test_backwards_compatibility(self):
998
1010
"""If the server doesn't recognise this request, fallback to VFS."""
1000
"Generic bzr smart protocol error: "
1001
"bad request 'Repository.stream_revisions_chunked'")
1003
(('error', error_msg), '')]
1012
(('unknown verb', 'Repository.stream_revisions_chunked'), '')]
1004
1013
repo, client = self.setup_fake_client_and_repository(
1005
1014
responses, 'path')
1006
1015
self.mock_called = False