27
26
from bzrlib import (
30
29
revision as _mod_revision,
33
31
from bzrlib.branch import Branch
34
32
from bzrlib.bzrdir import BzrDir
35
33
from bzrlib.errors import ParamikoNotPresent
36
from bzrlib.smart import client, medium
37
from bzrlib.smart.server import SmartTCPServer
34
from bzrlib.smart import medium
38
35
from bzrlib.tests import TestCaseWithTransport, TestSkipped
39
from bzrlib.trace import mutter
40
36
from bzrlib.transport import get_transport, remote
142
138
self.make_read_requests(branch)
143
139
self.assertServerFinishesCleanly(process)
145
def test_bzr_serve_supports_protocol(self):
147
self.make_branch('.')
149
process, url = self.start_server_port(['--allow-writes',
152
# Connect to the server
153
branch = Branch.open(url)
154
self.make_read_requests(branch)
155
self.assertServerFinishesCleanly(process)
157
141
def test_bzr_connect_to_bzr_ssh(self):
158
142
"""User acceptance that get_transport of a bzr+ssh:// behaves correctly.
243
227
% bzr_remote_path],
244
228
self.command_executed)
247
class TestCmdServeChrooting(TestCaseWithTransport):
249
def test_serve_tcp(self):
250
"""'bzr serve' wraps the given --directory in a ChrootServer.
252
So requests that search up through the parent directories (like
253
find_repositoryV3) will give "not found" responses, rather than
254
InvalidURLJoin or jail break errors.
256
t = self.get_transport()
257
t.mkdir('server-root')
258
self.run_bzr_serve_then_func(
259
['--port', '0', '--directory', t.local_abspath('server-root'),
261
self.when_server_started)
262
# The when_server_started method issued a find_repositoryV3 that should
263
# fail with 'norepository' because there are no repositories inside the
265
self.assertEqual(('norepository',), self.client_resp)
267
def run_bzr_serve_then_func(self, serve_args, func, *func_args,
269
"""Run 'bzr serve', and run the given func in a thread once the server
272
When 'func' terminates, the server will be terminated too.
275
def on_server_start(backing_urls, tcp_server):
276
t = threading.Thread(
277
target=on_server_start_thread, args=(tcp_server,))
279
def on_server_start_thread(tcp_server):
282
self.tcp_server = tcp_server
284
func(*func_args, **func_kwargs)
286
# Log errors to make some test failures a little less
288
mutter('func broke: %r', e)
290
# Then stop the server
291
mutter('interrupting...')
292
thread.interrupt_main()
293
SmartTCPServer.hooks.install_named_hook(
294
'server_started_ex', on_server_start,
295
'run_bzr_serve_then_func hook')
298
self.run_bzr(['serve'] + list(serve_args))
299
except KeyboardInterrupt:
302
def when_server_started(self):
303
# Connect to the TCP server and issue some requests and see what comes
305
client_medium = medium.SmartTCPClientMedium(
306
'127.0.0.1', self.tcp_server.port,
307
'bzr://localhost:%d/' % (self.tcp_server.port,))
308
smart_client = client._SmartClient(client_medium)
309
resp = smart_client.call('mkdir', 'foo', '')
310
resp = smart_client.call('BzrDirFormat.initialize', 'foo/')
312
resp = smart_client.call('BzrDir.find_repositoryV3', 'foo/')
313
except errors.ErrorFromSmartServer, e:
315
self.client_resp = resp
316
client_medium.disconnect()