80
81
register_lazy_transport('bar', 'bzrlib.tests.test_transport',
81
82
'TestTransport.SampleHandler')
82
83
self.assertEqual([SampleHandler.__module__,
83
'bzrlib.transport.chroot'],
84
'bzrlib.transport.chroot',
85
'bzrlib.transport.pathfilter'],
84
86
_get_transport_modules())
86
88
_set_protocol_handlers(handlers)
446
448
server.tearDown()
451
class PathFilteringDecoratorTransportTest(TestCase):
452
"""Pathfilter decoration specific tests."""
454
def test_abspath(self):
455
# The abspath is always relative to the base of the backing transport.
456
server = PathFilteringServer(get_transport('memory:///foo/bar/'),
459
transport = get_transport(server.get_url())
460
self.assertEqual(server.get_url(), transport.abspath('/'))
462
subdir_transport = transport.clone('subdir')
463
self.assertEqual(server.get_url(), subdir_transport.abspath('/'))
466
def make_pf_transport(self, filter_func=None):
467
"""Make a PathFilteringTransport backed by a MemoryTransport.
469
:param filter_func: by default this will be a no-op function. Use this
470
parameter to override it."""
471
if filter_func is None:
472
filter_func = lambda x: x
473
server = PathFilteringServer(
474
get_transport('memory:///foo/bar/'), filter_func)
476
self.addCleanup(server.tearDown)
477
return get_transport(server.get_url())
479
def test__filter(self):
480
# _filter (with an identity func as filter_func) always returns
481
# paths relative to the base of the backing transport.
482
transport = self.make_pf_transport()
483
self.assertEqual('foo', transport._filter('foo'))
484
self.assertEqual('foo/bar', transport._filter('foo/bar'))
485
self.assertEqual('', transport._filter('..'))
486
self.assertEqual('', transport._filter('/'))
487
# The base of the pathfiltering transport is taken into account too.
488
transport = transport.clone('subdir1/subdir2')
489
self.assertEqual('subdir1/subdir2/foo', transport._filter('foo'))
491
'subdir1/subdir2/foo/bar', transport._filter('foo/bar'))
492
self.assertEqual('subdir1', transport._filter('..'))
493
self.assertEqual('', transport._filter('/'))
495
def test_filter_invocation(self):
498
filter_log.append(path)
500
transport = self.make_pf_transport(filter)
502
self.assertEqual(['abc'], filter_log)
504
transport.clone('abc').has('xyz')
505
self.assertEqual(['abc/xyz'], filter_log)
507
transport.has('/abc')
508
self.assertEqual(['abc'], filter_log)
510
def test_clone(self):
511
transport = self.make_pf_transport()
512
# relpath from root and root path are the same
513
relpath_cloned = transport.clone('foo')
514
abspath_cloned = transport.clone('/foo')
515
self.assertEqual(transport.server, relpath_cloned.server)
516
self.assertEqual(transport.server, abspath_cloned.server)
518
def test_url_preserves_pathfiltering(self):
519
"""Calling get_transport on a pathfiltered transport's base should
520
produce a transport with exactly the same behaviour as the original
521
pathfiltered transport.
523
This is so that it is not possible to escape (accidentally or
524
otherwise) the filtering by doing::
525
url = filtered_transport.base
526
parent_url = urlutils.join(url, '..')
527
new_transport = get_transport(parent_url)
529
transport = self.make_pf_transport()
530
new_transport = get_transport(transport.base)
531
self.assertEqual(transport.server, new_transport.server)
532
self.assertEqual(transport.base, new_transport.base)
449
535
class ReadonlyDecoratorTransportTest(TestCase):
450
536
"""Readonly decoration specific tests."""