24
25
from bzrlib import (
31
from bzrlib.transport import (
39
from bzrlib.tests import (
31
from bzrlib.errors import (DependencyNotPresent,
39
from bzrlib.tests import features, TestCase, TestCaseInTempDir
40
from bzrlib.transport import (_clear_protocol_handlers,
43
_get_protocol_handlers,
44
_set_protocol_handlers,
45
_get_transport_modules,
48
register_lazy_transport,
49
register_transport_proto,
52
from bzrlib.transport.chroot import ChrootServer
53
from bzrlib.transport.memory import MemoryTransport
54
from bzrlib.transport.local import (LocalTransport,
55
EmulatedWin32LocalTransport)
56
from bzrlib.transport.pathfilter import PathFilteringServer
45
59
# TODO: Should possibly split transport-specific tests into their own files.
48
class TestTransport(tests.TestCase):
62
class TestTransport(TestCase):
49
63
"""Test the non transport-concrete class functionality."""
51
# FIXME: These tests should use addCleanup() and/or overrideAttr() instead
52
# of try/finally -- vila 20100205
54
65
def test__get_set_protocol_handlers(self):
55
handlers = transport._get_protocol_handlers()
66
handlers = _get_protocol_handlers()
56
67
self.assertNotEqual([], handlers.keys( ))
58
transport._clear_protocol_handlers()
59
self.assertEqual([], transport._get_protocol_handlers().keys())
69
_clear_protocol_handlers()
70
self.assertEqual([], _get_protocol_handlers().keys())
61
transport._set_protocol_handlers(handlers)
72
_set_protocol_handlers(handlers)
63
74
def test_get_transport_modules(self):
64
handlers = transport._get_protocol_handlers()
75
handlers = _get_protocol_handlers()
65
76
# don't pollute the current handlers
66
transport._clear_protocol_handlers()
77
_clear_protocol_handlers()
67
78
class SampleHandler(object):
68
79
"""I exist, isnt that enough?"""
70
transport._clear_protocol_handlers()
71
transport.register_transport_proto('foo')
72
transport.register_lazy_transport('foo',
73
'bzrlib.tests.test_transport',
74
'TestTransport.SampleHandler')
75
transport.register_transport_proto('bar')
76
transport.register_lazy_transport('bar',
77
'bzrlib.tests.test_transport',
78
'TestTransport.SampleHandler')
81
_clear_protocol_handlers()
82
register_transport_proto('foo')
83
register_lazy_transport('foo', 'bzrlib.tests.test_transport',
84
'TestTransport.SampleHandler')
85
register_transport_proto('bar')
86
register_lazy_transport('bar', 'bzrlib.tests.test_transport',
87
'TestTransport.SampleHandler')
79
88
self.assertEqual([SampleHandler.__module__,
80
89
'bzrlib.transport.chroot',
81
90
'bzrlib.transport.pathfilter'],
82
transport._get_transport_modules())
91
_get_transport_modules())
84
transport._set_protocol_handlers(handlers)
93
_set_protocol_handlers(handlers)
86
95
def test_transport_dependency(self):
87
96
"""Transport with missing dependency causes no error"""
88
saved_handlers = transport._get_protocol_handlers()
97
saved_handlers = _get_protocol_handlers()
89
98
# don't pollute the current handlers
90
transport._clear_protocol_handlers()
99
_clear_protocol_handlers()
92
transport.register_transport_proto('foo')
93
transport.register_lazy_transport(
94
'foo', 'bzrlib.tests.test_transport', 'BadTransportHandler')
101
register_transport_proto('foo')
102
register_lazy_transport('foo', 'bzrlib.tests.test_transport',
103
'BadTransportHandler')
96
transport.get_transport('foo://fooserver/foo')
97
except errors.UnsupportedProtocol, e:
105
get_transport('foo://fooserver/foo')
106
except UnsupportedProtocol, e:
99
108
self.assertEquals('Unsupported protocol'
100
109
' for url "foo://fooserver/foo":'
104
113
self.fail('Did not raise UnsupportedProtocol')
106
115
# restore original values
107
transport._set_protocol_handlers(saved_handlers)
116
_set_protocol_handlers(saved_handlers)
109
118
def test_transport_fallback(self):
110
119
"""Transport with missing dependency causes no error"""
111
saved_handlers = transport._get_protocol_handlers()
120
saved_handlers = _get_protocol_handlers()
113
transport._clear_protocol_handlers()
114
transport.register_transport_proto('foo')
115
transport.register_lazy_transport(
116
'foo', 'bzrlib.tests.test_transport', 'BackupTransportHandler')
117
transport.register_lazy_transport(
118
'foo', 'bzrlib.tests.test_transport', 'BadTransportHandler')
119
t = transport.get_transport('foo://fooserver/foo')
122
_clear_protocol_handlers()
123
register_transport_proto('foo')
124
register_lazy_transport('foo', 'bzrlib.tests.test_transport',
125
'BackupTransportHandler')
126
register_lazy_transport('foo', 'bzrlib.tests.test_transport',
127
'BadTransportHandler')
128
t = get_transport('foo://fooserver/foo')
120
129
self.assertTrue(isinstance(t, BackupTransportHandler))
122
transport._set_protocol_handlers(saved_handlers)
131
_set_protocol_handlers(saved_handlers)
124
133
def test_ssh_hints(self):
125
134
"""Transport ssh:// should raise an error pointing out bzr+ssh://"""
127
transport.get_transport('ssh://fooserver/foo')
128
except errors.UnsupportedProtocol, e:
136
get_transport('ssh://fooserver/foo')
137
except UnsupportedProtocol, e:
130
139
self.assertEquals('Unsupported protocol'
131
140
' for url "ssh://fooserver/foo":'
132
' bzr supports bzr+ssh to operate over ssh,'
133
' use "bzr+ssh://fooserver/foo".',
141
' bzr supports bzr+ssh to operate over ssh, use "bzr+ssh://fooserver/foo".',
136
144
self.fail('Did not raise UnsupportedProtocol')
138
146
def test_LateReadError(self):
139
147
"""The LateReadError helper should raise on read()."""
140
a_file = transport.LateReadError('a path')
148
a_file = LateReadError('a path')
143
except errors.ReadError, error:
151
except ReadError, error:
144
152
self.assertEqual('a path', error.path)
145
self.assertRaises(errors.ReadError, a_file.read, 40)
153
self.assertRaises(ReadError, a_file.read, 40)
148
156
def test__combine_paths(self):
149
t = transport.Transport('/')
150
158
self.assertEqual('/home/sarah/project/foo',
151
159
t._combine_paths('/home/sarah', 'project/foo'))
152
160
self.assertEqual('/etc',
248
256
max_size=1*1024*1024*1024)
251
class TestMemoryServer(tests.TestCase):
253
def test_create_server(self):
254
server = memory.MemoryServer()
255
server.start_server()
256
url = server.get_url()
257
self.assertTrue(url in transport.transport_list_registry)
258
t = transport.get_transport(url)
261
self.assertFalse(url in transport.transport_list_registry)
262
self.assertRaises(errors.UnsupportedProtocol,
263
transport.get_transport, url)
266
class TestMemoryTransport(tests.TestCase):
259
class TestMemoryTransport(TestCase):
268
261
def test_get_transport(self):
269
memory.MemoryTransport()
271
264
def test_clone(self):
272
t = memory.MemoryTransport()
273
self.assertTrue(isinstance(t, memory.MemoryTransport))
274
self.assertEqual("memory:///", t.clone("/").base)
265
transport = MemoryTransport()
266
self.assertTrue(isinstance(transport, MemoryTransport))
267
self.assertEqual("memory:///", transport.clone("/").base)
276
269
def test_abspath(self):
277
t = memory.MemoryTransport()
278
self.assertEqual("memory:///relpath", t.abspath('relpath'))
270
transport = MemoryTransport()
271
self.assertEqual("memory:///relpath", transport.abspath('relpath'))
280
273
def test_abspath_of_root(self):
281
t = memory.MemoryTransport()
282
self.assertEqual("memory:///", t.base)
283
self.assertEqual("memory:///", t.abspath('/'))
274
transport = MemoryTransport()
275
self.assertEqual("memory:///", transport.base)
276
self.assertEqual("memory:///", transport.abspath('/'))
285
278
def test_abspath_of_relpath_starting_at_root(self):
286
t = memory.MemoryTransport()
287
self.assertEqual("memory:///foo", t.abspath('/foo'))
279
transport = MemoryTransport()
280
self.assertEqual("memory:///foo", transport.abspath('/foo'))
289
282
def test_append_and_get(self):
290
t = memory.MemoryTransport()
291
t.append_bytes('path', 'content')
292
self.assertEqual(t.get('path').read(), 'content')
293
t.append_file('path', StringIO('content'))
294
self.assertEqual(t.get('path').read(), 'contentcontent')
283
transport = MemoryTransport()
284
transport.append_bytes('path', 'content')
285
self.assertEqual(transport.get('path').read(), 'content')
286
transport.append_file('path', StringIO('content'))
287
self.assertEqual(transport.get('path').read(), 'contentcontent')
296
289
def test_put_and_get(self):
297
t = memory.MemoryTransport()
298
t.put_file('path', StringIO('content'))
299
self.assertEqual(t.get('path').read(), 'content')
300
t.put_bytes('path', 'content')
301
self.assertEqual(t.get('path').read(), 'content')
290
transport = MemoryTransport()
291
transport.put_file('path', StringIO('content'))
292
self.assertEqual(transport.get('path').read(), 'content')
293
transport.put_bytes('path', 'content')
294
self.assertEqual(transport.get('path').read(), 'content')
303
296
def test_append_without_dir_fails(self):
304
t = memory.MemoryTransport()
305
self.assertRaises(errors.NoSuchFile,
306
t.append_bytes, 'dir/path', 'content')
297
transport = MemoryTransport()
298
self.assertRaises(NoSuchFile,
299
transport.append_bytes, 'dir/path', 'content')
308
301
def test_put_without_dir_fails(self):
309
t = memory.MemoryTransport()
310
self.assertRaises(errors.NoSuchFile,
311
t.put_file, 'dir/path', StringIO('content'))
302
transport = MemoryTransport()
303
self.assertRaises(NoSuchFile,
304
transport.put_file, 'dir/path', StringIO('content'))
313
306
def test_get_missing(self):
314
transport = memory.MemoryTransport()
315
self.assertRaises(errors.NoSuchFile, transport.get, 'foo')
307
transport = MemoryTransport()
308
self.assertRaises(NoSuchFile, transport.get, 'foo')
317
310
def test_has_missing(self):
318
t = memory.MemoryTransport()
319
self.assertEquals(False, t.has('foo'))
311
transport = MemoryTransport()
312
self.assertEquals(False, transport.has('foo'))
321
314
def test_has_present(self):
322
t = memory.MemoryTransport()
323
t.append_bytes('foo', 'content')
324
self.assertEquals(True, t.has('foo'))
315
transport = MemoryTransport()
316
transport.append_bytes('foo', 'content')
317
self.assertEquals(True, transport.has('foo'))
326
319
def test_list_dir(self):
327
t = memory.MemoryTransport()
328
t.put_bytes('foo', 'content')
330
t.put_bytes('dir/subfoo', 'content')
331
t.put_bytes('dirlike', 'content')
320
transport = MemoryTransport()
321
transport.put_bytes('foo', 'content')
322
transport.mkdir('dir')
323
transport.put_bytes('dir/subfoo', 'content')
324
transport.put_bytes('dirlike', 'content')
333
self.assertEquals(['dir', 'dirlike', 'foo'], sorted(t.list_dir('.')))
334
self.assertEquals(['subfoo'], sorted(t.list_dir('dir')))
326
self.assertEquals(['dir', 'dirlike', 'foo'], sorted(transport.list_dir('.')))
327
self.assertEquals(['subfoo'], sorted(transport.list_dir('dir')))
336
329
def test_mkdir(self):
337
t = memory.MemoryTransport()
339
t.append_bytes('dir/path', 'content')
340
self.assertEqual(t.get('dir/path').read(), 'content')
330
transport = MemoryTransport()
331
transport.mkdir('dir')
332
transport.append_bytes('dir/path', 'content')
333
self.assertEqual(transport.get('dir/path').read(), 'content')
342
335
def test_mkdir_missing_parent(self):
343
t = memory.MemoryTransport()
344
self.assertRaises(errors.NoSuchFile, t.mkdir, 'dir/dir')
336
transport = MemoryTransport()
337
self.assertRaises(NoSuchFile,
338
transport.mkdir, 'dir/dir')
346
340
def test_mkdir_twice(self):
347
t = memory.MemoryTransport()
349
self.assertRaises(errors.FileExists, t.mkdir, 'dir')
341
transport = MemoryTransport()
342
transport.mkdir('dir')
343
self.assertRaises(FileExists, transport.mkdir, 'dir')
351
345
def test_parameters(self):
352
t = memory.MemoryTransport()
353
self.assertEqual(True, t.listable())
354
self.assertEqual(False, t.is_readonly())
346
transport = MemoryTransport()
347
self.assertEqual(True, transport.listable())
348
self.assertEqual(False, transport.is_readonly())
356
350
def test_iter_files_recursive(self):
357
t = memory.MemoryTransport()
359
t.put_bytes('dir/foo', 'content')
360
t.put_bytes('dir/bar', 'content')
361
t.put_bytes('bar', 'content')
362
paths = set(t.iter_files_recursive())
351
transport = MemoryTransport()
352
transport.mkdir('dir')
353
transport.put_bytes('dir/foo', 'content')
354
transport.put_bytes('dir/bar', 'content')
355
transport.put_bytes('bar', 'content')
356
paths = set(transport.iter_files_recursive())
363
357
self.assertEqual(set(['dir/foo', 'dir/bar', 'bar']), paths)
365
359
def test_stat(self):
366
t = memory.MemoryTransport()
367
t.put_bytes('foo', 'content')
368
t.put_bytes('bar', 'phowar')
369
self.assertEqual(7, t.stat('foo').st_size)
370
self.assertEqual(6, t.stat('bar').st_size)
373
class ChrootDecoratorTransportTest(tests.TestCase):
360
transport = MemoryTransport()
361
transport.put_bytes('foo', 'content')
362
transport.put_bytes('bar', 'phowar')
363
self.assertEqual(7, transport.stat('foo').st_size)
364
self.assertEqual(6, transport.stat('bar').st_size)
367
class ChrootDecoratorTransportTest(TestCase):
374
368
"""Chroot decoration specific tests."""
376
370
def test_abspath(self):
377
371
# The abspath is always relative to the chroot_url.
378
server = chroot.ChrootServer(
379
transport.get_transport('memory:///foo/bar/'))
372
server = ChrootServer(get_transport('memory:///foo/bar/'))
380
373
self.start_server(server)
381
t = transport.get_transport(server.get_url())
382
self.assertEqual(server.get_url(), t.abspath('/'))
374
transport = get_transport(server.get_url())
375
self.assertEqual(server.get_url(), transport.abspath('/'))
384
subdir_t = t.clone('subdir')
385
self.assertEqual(server.get_url(), subdir_t.abspath('/'))
377
subdir_transport = transport.clone('subdir')
378
self.assertEqual(server.get_url(), subdir_transport.abspath('/'))
387
380
def test_clone(self):
388
server = chroot.ChrootServer(
389
transport.get_transport('memory:///foo/bar/'))
381
server = ChrootServer(get_transport('memory:///foo/bar/'))
390
382
self.start_server(server)
391
t = transport.get_transport(server.get_url())
383
transport = get_transport(server.get_url())
392
384
# relpath from root and root path are the same
393
relpath_cloned = t.clone('foo')
394
abspath_cloned = t.clone('/foo')
385
relpath_cloned = transport.clone('foo')
386
abspath_cloned = transport.clone('/foo')
395
387
self.assertEqual(server, relpath_cloned.server)
396
388
self.assertEqual(server, abspath_cloned.server)
420
411
This is so that it is not possible to escape a chroot by doing::
421
412
url = chroot_transport.base
422
413
parent_url = urlutils.join(url, '..')
423
new_t = transport.get_transport(parent_url)
414
new_transport = get_transport(parent_url)
425
server = chroot.ChrootServer(transport.get_transport('memory:///path/'))
416
server = ChrootServer(get_transport('memory:///path/'))
426
417
self.start_server(server)
427
t = transport.get_transport(server.get_url())
418
transport = get_transport(server.get_url())
428
419
self.assertRaises(
429
errors.InvalidURLJoin, urlutils.join, t.base, '..')
432
class TestChrootServer(tests.TestCase):
420
InvalidURLJoin, urlutils.join, transport.base, '..')
423
class ChrootServerTest(TestCase):
434
425
def test_construct(self):
435
backing_transport = memory.MemoryTransport()
436
server = chroot.ChrootServer(backing_transport)
426
backing_transport = MemoryTransport()
427
server = ChrootServer(backing_transport)
437
428
self.assertEqual(backing_transport, server.backing_transport)
439
430
def test_setUp(self):
440
backing_transport = memory.MemoryTransport()
441
server = chroot.ChrootServer(backing_transport)
442
server.start_server()
431
backing_transport = MemoryTransport()
432
server = ChrootServer(backing_transport)
444
self.assertTrue(server.scheme
445
in transport._get_protocol_handlers().keys())
435
self.assertTrue(server.scheme in _get_protocol_handlers().keys())
449
def test_stop_server(self):
450
backing_transport = memory.MemoryTransport()
451
server = chroot.ChrootServer(backing_transport)
452
server.start_server()
454
self.assertFalse(server.scheme
455
in transport._get_protocol_handlers().keys())
439
def test_tearDown(self):
440
backing_transport = MemoryTransport()
441
server = ChrootServer(backing_transport)
444
self.assertFalse(server.scheme in _get_protocol_handlers().keys())
457
446
def test_get_url(self):
458
backing_transport = memory.MemoryTransport()
459
server = chroot.ChrootServer(backing_transport)
460
server.start_server()
447
backing_transport = MemoryTransport()
448
server = ChrootServer(backing_transport)
462
451
self.assertEqual('chroot-%d:///' % id(server), server.get_url())
467
class PathFilteringDecoratorTransportTest(tests.TestCase):
456
class PathFilteringDecoratorTransportTest(TestCase):
468
457
"""Pathfilter decoration specific tests."""
470
459
def test_abspath(self):
471
460
# The abspath is always relative to the base of the backing transport.
472
server = pathfilter.PathFilteringServer(
473
transport.get_transport('memory:///foo/bar/'),
461
server = PathFilteringServer(get_transport('memory:///foo/bar/'),
475
server.start_server()
476
t = transport.get_transport(server.get_url())
477
self.assertEqual(server.get_url(), t.abspath('/'))
464
transport = get_transport(server.get_url())
465
self.assertEqual(server.get_url(), transport.abspath('/'))
479
subdir_t = t.clone('subdir')
480
self.assertEqual(server.get_url(), subdir_t.abspath('/'))
467
subdir_transport = transport.clone('subdir')
468
self.assertEqual(server.get_url(), subdir_transport.abspath('/'))
483
471
def make_pf_transport(self, filter_func=None):
484
472
"""Make a PathFilteringTransport backed by a MemoryTransport.
487
475
parameter to override it."""
488
476
if filter_func is None:
489
477
filter_func = lambda x: x
490
server = pathfilter.PathFilteringServer(
491
transport.get_transport('memory:///foo/bar/'), filter_func)
492
server.start_server()
493
self.addCleanup(server.stop_server)
494
return transport.get_transport(server.get_url())
478
server = PathFilteringServer(
479
get_transport('memory:///foo/bar/'), filter_func)
481
self.addCleanup(server.tearDown)
482
return get_transport(server.get_url())
496
484
def test__filter(self):
497
485
# _filter (with an identity func as filter_func) always returns
498
486
# paths relative to the base of the backing transport.
499
t = self.make_pf_transport()
500
self.assertEqual('foo', t._filter('foo'))
501
self.assertEqual('foo/bar', t._filter('foo/bar'))
502
self.assertEqual('', t._filter('..'))
503
self.assertEqual('', t._filter('/'))
487
transport = self.make_pf_transport()
488
self.assertEqual('foo', transport._filter('foo'))
489
self.assertEqual('foo/bar', transport._filter('foo/bar'))
490
self.assertEqual('', transport._filter('..'))
491
self.assertEqual('', transport._filter('/'))
504
492
# The base of the pathfiltering transport is taken into account too.
505
t = t.clone('subdir1/subdir2')
506
self.assertEqual('subdir1/subdir2/foo', t._filter('foo'))
507
self.assertEqual('subdir1/subdir2/foo/bar', t._filter('foo/bar'))
508
self.assertEqual('subdir1', t._filter('..'))
509
self.assertEqual('', t._filter('/'))
493
transport = transport.clone('subdir1/subdir2')
494
self.assertEqual('subdir1/subdir2/foo', transport._filter('foo'))
496
'subdir1/subdir2/foo/bar', transport._filter('foo/bar'))
497
self.assertEqual('subdir1', transport._filter('..'))
498
self.assertEqual('', transport._filter('/'))
511
500
def test_filter_invocation(self):
513
502
def filter(path):
514
503
filter_log.append(path)
516
t = self.make_pf_transport(filter)
505
transport = self.make_pf_transport(filter)
518
507
self.assertEqual(['abc'], filter_log)
519
508
del filter_log[:]
520
t.clone('abc').has('xyz')
509
transport.clone('abc').has('xyz')
521
510
self.assertEqual(['abc/xyz'], filter_log)
522
511
del filter_log[:]
512
transport.has('/abc')
524
513
self.assertEqual(['abc'], filter_log)
526
515
def test_clone(self):
527
t = self.make_pf_transport()
516
transport = self.make_pf_transport()
528
517
# relpath from root and root path are the same
529
relpath_cloned = t.clone('foo')
530
abspath_cloned = t.clone('/foo')
531
self.assertEqual(t.server, relpath_cloned.server)
532
self.assertEqual(t.server, abspath_cloned.server)
518
relpath_cloned = transport.clone('foo')
519
abspath_cloned = transport.clone('/foo')
520
self.assertEqual(transport.server, relpath_cloned.server)
521
self.assertEqual(transport.server, abspath_cloned.server)
534
523
def test_url_preserves_pathfiltering(self):
535
524
"""Calling get_transport on a pathfiltered transport's base should
540
529
otherwise) the filtering by doing::
541
530
url = filtered_transport.base
542
531
parent_url = urlutils.join(url, '..')
543
new_t = transport.get_transport(parent_url)
532
new_transport = get_transport(parent_url)
545
t = self.make_pf_transport()
546
new_t = transport.get_transport(t.base)
547
self.assertEqual(t.server, new_t.server)
548
self.assertEqual(t.base, new_t.base)
551
class ReadonlyDecoratorTransportTest(tests.TestCase):
534
transport = self.make_pf_transport()
535
new_transport = get_transport(transport.base)
536
self.assertEqual(transport.server, new_transport.server)
537
self.assertEqual(transport.base, new_transport.base)
540
class ReadonlyDecoratorTransportTest(TestCase):
552
541
"""Readonly decoration specific tests."""
554
543
def test_local_parameters(self):
544
import bzrlib.transport.readonly as readonly
555
545
# connect to . in readonly mode
556
t = readonly.ReadonlyTransportDecorator('readonly+.')
557
self.assertEqual(True, t.listable())
558
self.assertEqual(True, t.is_readonly())
546
transport = readonly.ReadonlyTransportDecorator('readonly+.')
547
self.assertEqual(True, transport.listable())
548
self.assertEqual(True, transport.is_readonly())
560
550
def test_http_parameters(self):
561
551
from bzrlib.tests.http_server import HttpServer
552
import bzrlib.transport.readonly as readonly
562
553
# connect to '.' via http which is not listable
563
554
server = HttpServer()
564
555
self.start_server(server)
565
t = transport.get_transport('readonly+' + server.get_url())
566
self.failUnless(isinstance(t, readonly.ReadonlyTransportDecorator))
567
self.assertEqual(False, t.listable())
568
self.assertEqual(True, t.is_readonly())
571
class FakeNFSDecoratorTests(tests.TestCaseInTempDir):
556
transport = get_transport('readonly+' + server.get_url())
557
self.failUnless(isinstance(transport,
558
readonly.ReadonlyTransportDecorator))
559
self.assertEqual(False, transport.listable())
560
self.assertEqual(True, transport.is_readonly())
563
class FakeNFSDecoratorTests(TestCaseInTempDir):
572
564
"""NFS decorator specific tests."""
574
566
def get_nfs_transport(self, url):
567
import bzrlib.transport.fakenfs as fakenfs
575
568
# connect to url with nfs decoration
576
569
return fakenfs.FakeNFSTransportDecorator('fakenfs+' + url)
578
571
def test_local_parameters(self):
579
572
# the listable and is_readonly parameters
580
573
# are not changed by the fakenfs decorator
581
t = self.get_nfs_transport('.')
582
self.assertEqual(True, t.listable())
583
self.assertEqual(False, t.is_readonly())
574
transport = self.get_nfs_transport('.')
575
self.assertEqual(True, transport.listable())
576
self.assertEqual(False, transport.is_readonly())
585
578
def test_http_parameters(self):
586
579
# the listable and is_readonly parameters
589
582
# connect to '.' via http which is not listable
590
583
server = HttpServer()
591
584
self.start_server(server)
592
t = self.get_nfs_transport(server.get_url())
593
self.assertIsInstance(t, fakenfs.FakeNFSTransportDecorator)
594
self.assertEqual(False, t.listable())
595
self.assertEqual(True, t.is_readonly())
585
transport = self.get_nfs_transport(server.get_url())
586
self.assertIsInstance(
587
transport, bzrlib.transport.fakenfs.FakeNFSTransportDecorator)
588
self.assertEqual(False, transport.listable())
589
self.assertEqual(True, transport.is_readonly())
597
591
def test_fakenfs_server_default(self):
598
592
# a FakeNFSServer() should bring up a local relpath server for itself
599
server = test_server.FakeNFSServer()
593
import bzrlib.transport.fakenfs as fakenfs
594
server = fakenfs.FakeNFSServer()
600
595
self.start_server(server)
601
596
# the url should be decorated appropriately
602
597
self.assertStartsWith(server.get_url(), 'fakenfs+')
603
598
# and we should be able to get a transport for it
604
t = transport.get_transport(server.get_url())
599
transport = get_transport(server.get_url())
605
600
# which must be a FakeNFSTransportDecorator instance.
606
self.assertIsInstance(t, fakenfs.FakeNFSTransportDecorator)
601
self.assertIsInstance(transport, fakenfs.FakeNFSTransportDecorator)
608
603
def test_fakenfs_rename_semantics(self):
609
604
# a FakeNFS transport must mangle the way rename errors occur to
610
605
# look like NFS problems.
611
t = self.get_nfs_transport('.')
606
transport = self.get_nfs_transport('.')
612
607
self.build_tree(['from/', 'from/foo', 'to/', 'to/bar'],
614
self.assertRaises(errors.ResourceBusy, t.rename, 'from', 'to')
617
class FakeVFATDecoratorTests(tests.TestCaseInTempDir):
609
self.assertRaises(errors.ResourceBusy,
610
transport.rename, 'from', 'to')
613
class FakeVFATDecoratorTests(TestCaseInTempDir):
618
614
"""Tests for simulation of VFAT restrictions"""
620
616
def get_vfat_transport(self, url):
821
814
self.assertIs(new_password, c._get_credentials())
824
class TestReusedTransports(tests.TestCase):
817
class TestReusedTransports(TestCase):
825
818
"""Tests for transport reuse"""
827
820
def test_reuse_same_transport(self):
828
821
possible_transports = []
829
t1 = transport.get_transport('http://foo/',
830
possible_transports=possible_transports)
822
t1 = get_transport('http://foo/',
823
possible_transports=possible_transports)
831
824
self.assertEqual([t1], possible_transports)
832
t2 = transport.get_transport('http://foo/',
833
possible_transports=[t1])
825
t2 = get_transport('http://foo/', possible_transports=[t1])
834
826
self.assertIs(t1, t2)
836
828
# Also check that final '/' are handled correctly
837
t3 = transport.get_transport('http://foo/path/')
838
t4 = transport.get_transport('http://foo/path',
839
possible_transports=[t3])
829
t3 = get_transport('http://foo/path/')
830
t4 = get_transport('http://foo/path', possible_transports=[t3])
840
831
self.assertIs(t3, t4)
842
t5 = transport.get_transport('http://foo/path')
843
t6 = transport.get_transport('http://foo/path/',
844
possible_transports=[t5])
833
t5 = get_transport('http://foo/path')
834
t6 = get_transport('http://foo/path/', possible_transports=[t5])
845
835
self.assertIs(t5, t6)
847
837
def test_don_t_reuse_different_transport(self):
848
t1 = transport.get_transport('http://foo/path')
849
t2 = transport.get_transport('http://bar/path',
850
possible_transports=[t1])
838
t1 = get_transport('http://foo/path')
839
t2 = get_transport('http://bar/path', possible_transports=[t1])
851
840
self.assertIsNot(t1, t2)
854
class TestTransportTrace(tests.TestCase):
843
class TestTransportTrace(TestCase):
856
845
def test_get(self):
857
t = transport.get_transport('trace+memory://')
858
self.assertIsInstance(t, bzrlib.transport.trace.TransportTraceDecorator)
846
transport = get_transport('trace+memory://')
847
self.assertIsInstance(
848
transport, bzrlib.transport.trace.TransportTraceDecorator)
860
850
def test_clone_preserves_activity(self):
861
t = transport.get_transport('trace+memory://')
863
self.assertTrue(t is not t2)
864
self.assertTrue(t._activity is t2._activity)
851
transport = get_transport('trace+memory://')
852
transport2 = transport.clone('.')
853
self.assertTrue(transport is not transport2)
854
self.assertTrue(transport._activity is transport2._activity)
866
856
# the following specific tests are for the operations that have made use of
867
857
# logging in tests; we could test every single operation but doing that
868
858
# still won't cause a test failure when the top level Transport API
869
859
# changes; so there is little return doing that.
870
860
def test_get(self):
871
t = transport.get_transport('trace+memory:///')
872
t.put_bytes('foo', 'barish')
861
transport = get_transport('trace+memory:///')
862
transport.put_bytes('foo', 'barish')
874
864
expected_result = []
875
865
# put_bytes records the bytes, not the content to avoid memory
877
867
expected_result.append(('put_bytes', 'foo', 6, None))
878
868
# get records the file name only.
879
869
expected_result.append(('get', 'foo'))
880
self.assertEqual(expected_result, t._activity)
870
self.assertEqual(expected_result, transport._activity)
882
872
def test_readv(self):
883
t = transport.get_transport('trace+memory:///')
884
t.put_bytes('foo', 'barish')
885
list(t.readv('foo', [(0, 1), (3, 2)],
886
adjust_for_latency=True, upper_limit=6))
873
transport = get_transport('trace+memory:///')
874
transport.put_bytes('foo', 'barish')
875
list(transport.readv('foo', [(0, 1), (3, 2)], adjust_for_latency=True,
887
877
expected_result = []
888
878
# put_bytes records the bytes, not the content to avoid memory
890
880
expected_result.append(('put_bytes', 'foo', 6, None))
891
881
# readv records the supplied offset request
892
882
expected_result.append(('readv', 'foo', [(0, 1), (3, 2)], True, 6))
893
self.assertEqual(expected_result, t._activity)
883
self.assertEqual(expected_result, transport._activity)
896
886
class TestSSHConnections(tests.TestCaseWithTransport):