17
17
"""Tests for smart server request infrastructure (bzrlib.smart.request)."""
19
21
from bzrlib import errors
20
22
from bzrlib.smart import request
21
from bzrlib.tests import TestCase
23
from bzrlib.tests import TestCase, TestCaseWithMemoryTransport
24
from bzrlib.transport import get_transport
24
27
class NoBodyRequest(request.SmartServerRequest):
61
64
raise errors.NoSuchFile('xyzzy')
67
class CheckJailRequest(request.SmartServerRequest):
69
def __init__(self, *args):
70
request.SmartServerRequest.__init__(self, *args)
71
self.jail_transports_log = []
74
self.jail_transports_log.append(request.jail_info.transports)
76
def do_chunk(self, bytes):
77
self.jail_transports_log.append(request.jail_info.transports)
80
self.jail_transports_log.append(request.jail_info.transports)
64
83
class TestSmartRequest(TestCase):
66
85
def test_request_class_without_do_body(self):
76
95
handler.end_received()
77
96
# Request done, no exception was raised.
98
def test_only_request_code_is_jailed(self):
99
transport = 'dummy transport'
100
handler = request.SmartServerRequestHandler(
101
transport, {'foo': CheckJailRequest}, '/')
102
handler.args_received(('foo',))
103
self.assertEqual(None, request.jail_info.transports)
104
handler.accept_body('bytes')
105
self.assertEqual(None, request.jail_info.transports)
106
handler.end_received()
107
self.assertEqual(None, request.jail_info.transports)
109
[[transport]] * 3, handler._command.jail_transports_log)
80
113
class TestSmartRequestHandlerErrorTranslation(TestCase):
81
114
"""Tests that SmartServerRequestHandler will translate exceptions raised by
134
167
('TokenMismatch', 'some-token', 'actual-token'),
135
168
errors.TokenMismatch('some-token', 'actual-token'))
171
class TestRequestJail(TestCaseWithMemoryTransport):
174
transport = self.get_transport('blah')
175
req = request.SmartServerRequest(transport)
176
self.assertEqual(None, request.jail_info.transports)
178
self.assertEqual([transport], request.jail_info.transports)
180
self.assertEqual(None, request.jail_info.transports)
183
class TestJailHook(TestCaseWithMemoryTransport):
186
request.jail_info.transports = None
187
TestCaseWithMemoryTransport.tearDown(self)
189
def test_jail_hook(self):
190
request.jail_info.transports = None
191
_pre_open_hook = request._pre_open_hook
192
# Any transport is fine if jail_info.transports is None
193
t = self.get_transport('foo')
195
# A transport in jail_info.transports is allowed
196
request.jail_info.transports = [t]
198
# A child of a transport in jail_info is allowed
199
_pre_open_hook(t.clone('child'))
200
# A parent is not allowed
201
self.assertRaises(errors.BzrError, _pre_open_hook, t.clone('..'))
202
# A completely unrelated transport is not allowed
204
errors.BzrError, _pre_open_hook, get_transport('http://host/'))