/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_smart_request.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-03-24 06:40:26 UTC
  • mfrom: (4160.2.16 bzrdir-open-gaol)
  • Revision ID: pqm@pqm.ubuntu.com-20090324064026-a5a7mmoiaev5mpc9
(andrew) Strengthen the smart server's jail,
        and add ignore_fallbacks parameter to BzrDir.open_branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
"""Tests for smart server request infrastructure (bzrlib.smart.request)."""
18
18
 
 
19
import threading
 
20
 
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
22
25
 
23
26
 
24
27
class NoBodyRequest(request.SmartServerRequest):
61
64
        raise errors.NoSuchFile('xyzzy')
62
65
 
63
66
 
 
67
class CheckJailRequest(request.SmartServerRequest):
 
68
 
 
69
    def __init__(self, *args):
 
70
        request.SmartServerRequest.__init__(self, *args)
 
71
        self.jail_transports_log = []
 
72
 
 
73
    def do(self):
 
74
        self.jail_transports_log.append(request.jail_info.transports)
 
75
 
 
76
    def do_chunk(self, bytes):
 
77
        self.jail_transports_log.append(request.jail_info.transports)
 
78
 
 
79
    def do_end(self):
 
80
        self.jail_transports_log.append(request.jail_info.transports)
 
81
 
 
82
 
64
83
class TestSmartRequest(TestCase):
65
84
 
66
85
    def test_request_class_without_do_body(self):
76
95
        handler.end_received()
77
96
        # Request done, no exception was raised.
78
97
 
 
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)
 
108
        self.assertEqual(
 
109
            [[transport]] * 3, handler._command.jail_transports_log)
 
110
 
 
111
 
79
112
 
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'))
136
169
 
 
170
 
 
171
class TestRequestJail(TestCaseWithMemoryTransport):
 
172
    
 
173
    def test_jail(self):
 
174
        transport = self.get_transport('blah')
 
175
        req = request.SmartServerRequest(transport)
 
176
        self.assertEqual(None, request.jail_info.transports)
 
177
        req.setup_jail()
 
178
        self.assertEqual([transport], request.jail_info.transports)
 
179
        req.teardown_jail()
 
180
        self.assertEqual(None, request.jail_info.transports)
 
181
 
 
182
 
 
183
class TestJailHook(TestCaseWithMemoryTransport):
 
184
 
 
185
    def tearDown(self):
 
186
        request.jail_info.transports = None
 
187
        TestCaseWithMemoryTransport.tearDown(self)
 
188
 
 
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')
 
194
        _pre_open_hook(t)
 
195
        # A transport in jail_info.transports is allowed
 
196
        request.jail_info.transports = [t]
 
197
        _pre_open_hook(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
 
203
        self.assertRaises(
 
204
            errors.BzrError, _pre_open_hook, get_transport('http://host/'))
 
205