27
28
from bzrlib import (
31
32
revision as _mod_revision,
34
34
from bzrlib.branch import Branch
35
35
from bzrlib.bzrdir import BzrDir
36
36
from bzrlib.smart import client, medium
37
from bzrlib.smart.server import SmartTCPServer
38
from bzrlib.tests import ParamikoFeature, TestCaseWithTransport, TestSkipped
37
from bzrlib.smart.server import BzrServerFactory, SmartTCPServer
38
from bzrlib.tests import (
40
TestCaseWithMemoryTransport,
41
TestCaseWithTransport,
39
44
from bzrlib.trace import mutter
40
45
from bzrlib.transport import get_transport, remote
235
240
client_medium.disconnect()
243
class TestUserdirExpansion(TestCaseWithMemoryTransport):
245
def fake_expanduser(self, path):
246
"""A simple, environment-independent, function for the duration of this
249
Paths starting with a path segment of '~user' will expand to start with
250
'/home/user/'. Every other path will be unchanged.
252
if path.split('/', 1)[0] == '~user':
253
return '/home/user' + path[len('~user'):]
256
def make_test_server(self, base_path='/'):
257
"""Make and setUp a BzrServerFactory, backed by a memory transport, and
258
creat '/home/user' in that transport.
260
bzr_server = BzrServerFactory(
261
self.fake_expanduser, lambda t: base_path)
262
mem_transport = self.get_transport()
263
mem_transport.mkdir_multi(['home', 'home/user'])
264
bzr_server.set_up(mem_transport, None, None, inet=True)
265
self.addCleanup(bzr_server.tear_down)
268
def test_bzr_serve_expands_userdir(self):
269
bzr_server = self.make_test_server()
270
self.assertTrue(bzr_server.smart_server.backing_transport.has('~user'))
272
def test_bzr_serve_does_not_expand_userdir_outside_base(self):
273
bzr_server = self.make_test_server('/foo')
274
self.assertFalse(bzr_server.smart_server.backing_transport.has('~user'))
276
def test_get_base_path(self):
277
"""cmd_serve will turn the --directory option into a LocalTransport
278
(optionally decorated with 'readonly+'). BzrServerFactory can
279
determine the original --directory from that transport.
281
# Define a fake 'protocol' to capture the transport that cmd_serve
282
# passes to serve_bzr.
283
def capture_transport(transport, host, port, inet):
284
self.bzr_serve_transport = transport
285
cmd = builtins.cmd_serve()
287
cmd.run(directory='/a/b/c', protocol=capture_transport)
288
server_maker = BzrServerFactory()
290
'readonly+file:///a/b/c/', self.bzr_serve_transport.base)
292
u'/a/b/c/', server_maker.get_base_path(self.bzr_serve_transport))
294
cmd.run(directory='/a/b/c', protocol=capture_transport,
296
server_maker = BzrServerFactory()
297
self.assertEqual('file:///a/b/c/', self.bzr_serve_transport.base)
299
u'/a/b/c/', server_maker.get_base_path(self.bzr_serve_transport))