107
99
# Create a SmartServerRequestHandler with a SmartServerRequest subclass
108
100
# that does not implement do_body.
109
101
handler = request.SmartServerRequestHandler(
110
None, {b'foo': NoBodyRequest}, '/')
102
None, {'foo': NoBodyRequest}, '/')
111
103
# Emulate a request with no body (i.e. just args).
112
handler.args_received((b'foo',))
104
handler.args_received(('foo',))
113
105
handler.end_received()
114
106
# Request done, no exception was raised.
116
108
def test_only_request_code_is_jailed(self):
117
109
transport = 'dummy transport'
118
110
handler = request.SmartServerRequestHandler(
119
transport, {b'foo': CheckJailRequest}, '/')
120
handler.args_received((b'foo',))
111
transport, {'foo': CheckJailRequest}, '/')
112
handler.args_received(('foo',))
121
113
self.assertEqual(None, request.jail_info.transports)
122
handler.accept_body(b'bytes')
114
handler.accept_body('bytes')
123
115
self.assertEqual(None, request.jail_info.transports)
124
116
handler.end_received()
125
117
self.assertEqual(None, request.jail_info.transports)
147
139
self.assertEqual(None, handler.response)
149
141
def assertResponseIsTranslatedError(self, handler):
150
expected_translation = (b'NoSuchFile', b'xyzzy')
142
expected_translation = ('NoSuchFile', 'xyzzy')
151
143
self.assertEqual(
152
144
request.FailedSmartServerResponse(expected_translation),
153
145
handler.response)
155
147
def test_error_translation_from_args_received(self):
156
148
handler = request.SmartServerRequestHandler(
157
None, {b'foo': DoErrorRequest}, '/')
158
handler.args_received((b'foo',))
149
None, {'foo': DoErrorRequest}, '/')
150
handler.args_received(('foo',))
159
151
self.assertResponseIsTranslatedError(handler)
161
153
def test_error_translation_from_chunk_received(self):
162
154
handler = request.SmartServerRequestHandler(
163
None, {b'foo': ChunkErrorRequest}, '/')
164
handler.args_received((b'foo',))
155
None, {'foo': ChunkErrorRequest}, '/')
156
handler.args_received(('foo',))
165
157
self.assertNoResponse(handler)
166
handler.accept_body(b'bytes')
158
handler.accept_body('bytes')
167
159
self.assertResponseIsTranslatedError(handler)
169
161
def test_error_translation_from_end_received(self):
170
162
handler = request.SmartServerRequestHandler(
171
None, {b'foo': EndErrorRequest}, '/')
172
handler.args_received((b'foo',))
163
None, {'foo': EndErrorRequest}, '/')
164
handler.args_received(('foo',))
173
165
self.assertNoResponse(handler)
174
166
handler.end_received()
175
167
self.assertResponseIsTranslatedError(handler)
177
169
def test_unexpected_error_translation(self):
178
170
handler = request.SmartServerRequestHandler(
179
None, {b'foo': DoUnexpectedErrorRequest}, '/')
180
handler.args_received((b'foo',))
171
None, {'foo': DoUnexpectedErrorRequest}, '/')
172
handler.args_received(('foo',))
181
173
self.assertEqual(
182
request.FailedSmartServerResponse((b'error', b'KeyError', b"1")),
174
request.FailedSmartServerResponse(('error', 'KeyError', "1")),
183
175
handler.response)
186
178
class TestRequestHanderErrorTranslation(TestCase):
187
"""Tests for breezy.bzr.smart.request._translate_error."""
179
"""Tests for breezy.smart.request._translate_error."""
189
181
def assertTranslationEqual(self, expected_tuple, error):
190
182
self.assertEqual(expected_tuple, request._translate_error(error))
192
184
def test_NoSuchFile(self):
193
185
self.assertTranslationEqual(
194
(b'NoSuchFile', b'path'), errors.NoSuchFile('path'))
186
('NoSuchFile', 'path'), errors.NoSuchFile('path'))
196
188
def test_LockContention(self):
197
189
# For now, LockContentions are always transmitted with no details.
198
190
# Eventually they should include a relpath or url or something else to
199
191
# identify which lock is busy.
200
192
self.assertTranslationEqual(
201
(b'LockContention',), errors.LockContention('lock', 'msg'))
193
('LockContention',), errors.LockContention('lock', 'msg'))
203
195
def test_TokenMismatch(self):
204
196
self.assertTranslationEqual(
205
(b'TokenMismatch', b'some-token', b'actual-token'),
206
errors.TokenMismatch(b'some-token', b'actual-token'))
197
('TokenMismatch', 'some-token', 'actual-token'),
198
errors.TokenMismatch('some-token', 'actual-token'))
208
200
def test_MemoryError(self):
209
self.assertTranslationEqual((b"MemoryError",), MemoryError())
211
def test_GhostRevisionsHaveNoRevno(self):
212
self.assertTranslationEqual(
213
(b"GhostRevisionsHaveNoRevno", b'revid1', b'revid2'),
214
errors.GhostRevisionsHaveNoRevno(b'revid1', b'revid2'))
201
self.assertTranslationEqual(("MemoryError",), MemoryError())
216
203
def test_generic_Exception(self):
217
self.assertTranslationEqual((b'error', b'Exception', b""),
204
self.assertTranslationEqual(('error', 'Exception', ""),
220
207
def test_generic_BzrError(self):
221
self.assertTranslationEqual((b'error', b'BzrError', b"some text"),
222
errors.BzrError(msg="some text"))
208
self.assertTranslationEqual(('error', 'BzrError', "some text"),
209
errors.BzrError(msg="some text"))
224
211
def test_generic_zlib_error(self):
225
212
from zlib import error
226
213
msg = "Error -3 while decompressing data: incorrect data check"
227
self.assertTranslationEqual((b'error', b'zlib.error', msg.encode('utf-8')),
214
self.assertTranslationEqual(('error', 'zlib.error', msg),
231
218
class TestRequestJail(TestCaseWithMemoryTransport):