107
107
# Create a SmartServerRequestHandler with a SmartServerRequest subclass
108
108
# that does not implement do_body.
109
109
handler = request.SmartServerRequestHandler(
110
None, {b'foo': NoBodyRequest}, '/')
110
None, {'foo': NoBodyRequest}, '/')
111
111
# Emulate a request with no body (i.e. just args).
112
handler.args_received((b'foo',))
112
handler.args_received(('foo',))
113
113
handler.end_received()
114
114
# Request done, no exception was raised.
116
116
def test_only_request_code_is_jailed(self):
117
117
transport = 'dummy transport'
118
118
handler = request.SmartServerRequestHandler(
119
transport, {b'foo': CheckJailRequest}, '/')
120
handler.args_received((b'foo',))
119
transport, {'foo': CheckJailRequest}, '/')
120
handler.args_received(('foo',))
121
121
self.assertEqual(None, request.jail_info.transports)
122
handler.accept_body(b'bytes')
122
handler.accept_body('bytes')
123
123
self.assertEqual(None, request.jail_info.transports)
124
124
handler.end_received()
125
125
self.assertEqual(None, request.jail_info.transports)
147
147
self.assertEqual(None, handler.response)
149
149
def assertResponseIsTranslatedError(self, handler):
150
expected_translation = (b'NoSuchFile', b'xyzzy')
150
expected_translation = ('NoSuchFile', 'xyzzy')
151
151
self.assertEqual(
152
152
request.FailedSmartServerResponse(expected_translation),
153
153
handler.response)
155
155
def test_error_translation_from_args_received(self):
156
156
handler = request.SmartServerRequestHandler(
157
None, {b'foo': DoErrorRequest}, '/')
158
handler.args_received((b'foo',))
157
None, {'foo': DoErrorRequest}, '/')
158
handler.args_received(('foo',))
159
159
self.assertResponseIsTranslatedError(handler)
161
161
def test_error_translation_from_chunk_received(self):
162
162
handler = request.SmartServerRequestHandler(
163
None, {b'foo': ChunkErrorRequest}, '/')
164
handler.args_received((b'foo',))
163
None, {'foo': ChunkErrorRequest}, '/')
164
handler.args_received(('foo',))
165
165
self.assertNoResponse(handler)
166
handler.accept_body(b'bytes')
166
handler.accept_body('bytes')
167
167
self.assertResponseIsTranslatedError(handler)
169
169
def test_error_translation_from_end_received(self):
170
170
handler = request.SmartServerRequestHandler(
171
None, {b'foo': EndErrorRequest}, '/')
172
handler.args_received((b'foo',))
171
None, {'foo': EndErrorRequest}, '/')
172
handler.args_received(('foo',))
173
173
self.assertNoResponse(handler)
174
174
handler.end_received()
175
175
self.assertResponseIsTranslatedError(handler)
177
177
def test_unexpected_error_translation(self):
178
178
handler = request.SmartServerRequestHandler(
179
None, {b'foo': DoUnexpectedErrorRequest}, '/')
180
handler.args_received((b'foo',))
179
None, {'foo': DoUnexpectedErrorRequest}, '/')
180
handler.args_received(('foo',))
181
181
self.assertEqual(
182
request.FailedSmartServerResponse((b'error', b'KeyError', b"1")),
182
request.FailedSmartServerResponse(('error', 'KeyError', "1")),
183
183
handler.response)
192
192
def test_NoSuchFile(self):
193
193
self.assertTranslationEqual(
194
(b'NoSuchFile', b'path'), errors.NoSuchFile('path'))
194
('NoSuchFile', 'path'), errors.NoSuchFile('path'))
196
196
def test_LockContention(self):
197
197
# For now, LockContentions are always transmitted with no details.
198
198
# Eventually they should include a relpath or url or something else to
199
199
# identify which lock is busy.
200
200
self.assertTranslationEqual(
201
(b'LockContention',), errors.LockContention('lock', 'msg'))
201
('LockContention',), errors.LockContention('lock', 'msg'))
203
203
def test_TokenMismatch(self):
204
204
self.assertTranslationEqual(
205
(b'TokenMismatch', b'some-token', b'actual-token'),
206
errors.TokenMismatch(b'some-token', b'actual-token'))
205
('TokenMismatch', 'some-token', 'actual-token'),
206
errors.TokenMismatch('some-token', 'actual-token'))
208
208
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'))
209
self.assertTranslationEqual(("MemoryError",), MemoryError())
216
211
def test_generic_Exception(self):
217
self.assertTranslationEqual((b'error', b'Exception', b""),
212
self.assertTranslationEqual(('error', 'Exception', ""),
220
215
def test_generic_BzrError(self):
221
self.assertTranslationEqual((b'error', b'BzrError', b"some text"),
222
errors.BzrError(msg="some text"))
216
self.assertTranslationEqual(('error', 'BzrError', "some text"),
217
errors.BzrError(msg="some text"))
224
219
def test_generic_zlib_error(self):
225
220
from zlib import error
226
221
msg = "Error -3 while decompressing data: incorrect data check"
227
self.assertTranslationEqual((b'error', b'zlib.error', msg.encode('utf-8')),
222
self.assertTranslationEqual(('error', 'zlib.error', msg),
231
226
class TestRequestJail(TestCaseWithMemoryTransport):