28
transport as _mod_transport,
31
31
from bzrlib.transport import (
39
from bzrlib.tests import (
34
from bzrlib.errors import (DependencyNotPresent,
42
from bzrlib.tests import features, TestCase, TestCaseInTempDir
43
from bzrlib.transport import (_clear_protocol_handlers,
46
_get_protocol_handlers,
47
_set_protocol_handlers,
48
_get_transport_modules,
51
register_lazy_transport,
52
register_transport_proto,
55
from bzrlib.transport.chroot import ChrootServer
56
from bzrlib.transport.local import (LocalTransport,
57
EmulatedWin32LocalTransport)
58
from bzrlib.transport.pathfilter import PathFilteringServer
45
61
# TODO: Should possibly split transport-specific tests into their own files.
48
class TestTransport(tests.TestCase):
64
class TestTransport(TestCase):
49
65
"""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
67
def test__get_set_protocol_handlers(self):
55
handlers = transport._get_protocol_handlers()
68
handlers = _get_protocol_handlers()
56
69
self.assertNotEqual([], handlers.keys( ))
58
transport._clear_protocol_handlers()
59
self.assertEqual([], transport._get_protocol_handlers().keys())
71
_clear_protocol_handlers()
72
self.assertEqual([], _get_protocol_handlers().keys())
61
transport._set_protocol_handlers(handlers)
74
_set_protocol_handlers(handlers)
63
76
def test_get_transport_modules(self):
64
handlers = transport._get_protocol_handlers()
77
handlers = _get_protocol_handlers()
65
78
# don't pollute the current handlers
66
transport._clear_protocol_handlers()
79
_clear_protocol_handlers()
67
80
class SampleHandler(object):
68
81
"""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')
83
_clear_protocol_handlers()
84
register_transport_proto('foo')
85
register_lazy_transport('foo', 'bzrlib.tests.test_transport',
86
'TestTransport.SampleHandler')
87
register_transport_proto('bar')
88
register_lazy_transport('bar', 'bzrlib.tests.test_transport',
89
'TestTransport.SampleHandler')
79
90
self.assertEqual([SampleHandler.__module__,
80
91
'bzrlib.transport.chroot',
81
92
'bzrlib.transport.pathfilter'],
82
transport._get_transport_modules())
93
_get_transport_modules())
84
transport._set_protocol_handlers(handlers)
95
_set_protocol_handlers(handlers)
86
97
def test_transport_dependency(self):
87
98
"""Transport with missing dependency causes no error"""
88
saved_handlers = transport._get_protocol_handlers()
99
saved_handlers = _get_protocol_handlers()
89
100
# don't pollute the current handlers
90
transport._clear_protocol_handlers()
101
_clear_protocol_handlers()
92
transport.register_transport_proto('foo')
93
transport.register_lazy_transport(
94
'foo', 'bzrlib.tests.test_transport', 'BadTransportHandler')
103
register_transport_proto('foo')
104
register_lazy_transport('foo', 'bzrlib.tests.test_transport',
105
'BadTransportHandler')
96
transport.get_transport('foo://fooserver/foo')
97
except errors.UnsupportedProtocol, e:
107
get_transport('foo://fooserver/foo')
108
except UnsupportedProtocol, e:
99
110
self.assertEquals('Unsupported protocol'
100
111
' for url "foo://fooserver/foo":'
104
115
self.fail('Did not raise UnsupportedProtocol')
106
117
# restore original values
107
transport._set_protocol_handlers(saved_handlers)
118
_set_protocol_handlers(saved_handlers)
109
120
def test_transport_fallback(self):
110
121
"""Transport with missing dependency causes no error"""
111
saved_handlers = transport._get_protocol_handlers()
122
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')
124
_clear_protocol_handlers()
125
register_transport_proto('foo')
126
register_lazy_transport('foo', 'bzrlib.tests.test_transport',
127
'BackupTransportHandler')
128
register_lazy_transport('foo', 'bzrlib.tests.test_transport',
129
'BadTransportHandler')
130
t = get_transport('foo://fooserver/foo')
120
131
self.assertTrue(isinstance(t, BackupTransportHandler))
122
transport._set_protocol_handlers(saved_handlers)
133
_set_protocol_handlers(saved_handlers)
124
135
def test_ssh_hints(self):
125
136
"""Transport ssh:// should raise an error pointing out bzr+ssh://"""
127
transport.get_transport('ssh://fooserver/foo')
128
except errors.UnsupportedProtocol, e:
138
get_transport('ssh://fooserver/foo')
139
except UnsupportedProtocol, e:
130
141
self.assertEquals('Unsupported protocol'
131
142
' for url "ssh://fooserver/foo":'
132
' bzr supports bzr+ssh to operate over ssh,'
133
' use "bzr+ssh://fooserver/foo".',
143
' bzr supports bzr+ssh to operate over ssh, use "bzr+ssh://fooserver/foo".',
136
146
self.fail('Did not raise UnsupportedProtocol')
138
148
def test_LateReadError(self):
139
149
"""The LateReadError helper should raise on read()."""
140
a_file = transport.LateReadError('a path')
150
a_file = LateReadError('a path')
143
except errors.ReadError, error:
153
except ReadError, error:
144
154
self.assertEqual('a path', error.path)
145
self.assertRaises(errors.ReadError, a_file.read, 40)
155
self.assertRaises(ReadError, a_file.read, 40)
148
158
def test__combine_paths(self):
149
t = transport.Transport('/')
150
160
self.assertEqual('/home/sarah/project/foo',
151
161
t._combine_paths('/home/sarah', 'project/foo'))
152
162
self.assertEqual('/etc',
248
258
max_size=1*1024*1024*1024)
251
class TestMemoryServer(tests.TestCase):
261
class TestMemoryServer(TestCase):
253
263
def test_create_server(self):
254
264
server = memory.MemoryServer()
255
server.start_server()
256
266
url = server.get_url()
257
self.assertTrue(url in transport.transport_list_registry)
258
t = transport.get_transport(url)
267
self.assertTrue(url in _mod_transport.transport_list_registry)
268
t = _mod_transport.get_transport(url)
261
self.assertFalse(url in transport.transport_list_registry)
271
self.assertFalse(url in _mod_transport.transport_list_registry)
262
272
self.assertRaises(errors.UnsupportedProtocol,
263
transport.get_transport, url)
266
class TestMemoryTransport(tests.TestCase):
273
_mod_transport.get_transport, url)
276
class TestMemoryTransport(TestCase):
268
278
def test_get_transport(self):
269
279
memory.MemoryTransport()
271
281
def test_clone(self):
272
t = memory.MemoryTransport()
273
self.assertTrue(isinstance(t, memory.MemoryTransport))
274
self.assertEqual("memory:///", t.clone("/").base)
282
transport = memory.MemoryTransport()
283
self.assertTrue(isinstance(transport, memory.MemoryTransport))
284
self.assertEqual("memory:///", transport.clone("/").base)
276
286
def test_abspath(self):
277
t = memory.MemoryTransport()
278
self.assertEqual("memory:///relpath", t.abspath('relpath'))
287
transport = memory.MemoryTransport()
288
self.assertEqual("memory:///relpath", transport.abspath('relpath'))
280
290
def test_abspath_of_root(self):
281
t = memory.MemoryTransport()
282
self.assertEqual("memory:///", t.base)
283
self.assertEqual("memory:///", t.abspath('/'))
291
transport = memory.MemoryTransport()
292
self.assertEqual("memory:///", transport.base)
293
self.assertEqual("memory:///", transport.abspath('/'))
285
295
def test_abspath_of_relpath_starting_at_root(self):
286
t = memory.MemoryTransport()
287
self.assertEqual("memory:///foo", t.abspath('/foo'))
296
transport = memory.MemoryTransport()
297
self.assertEqual("memory:///foo", transport.abspath('/foo'))
289
299
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')
300
transport = memory.MemoryTransport()
301
transport.append_bytes('path', 'content')
302
self.assertEqual(transport.get('path').read(), 'content')
303
transport.append_file('path', StringIO('content'))
304
self.assertEqual(transport.get('path').read(), 'contentcontent')
296
306
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')
307
transport = memory.MemoryTransport()
308
transport.put_file('path', StringIO('content'))
309
self.assertEqual(transport.get('path').read(), 'content')
310
transport.put_bytes('path', 'content')
311
self.assertEqual(transport.get('path').read(), 'content')
303
313
def test_append_without_dir_fails(self):
304
t = memory.MemoryTransport()
305
self.assertRaises(errors.NoSuchFile,
306
t.append_bytes, 'dir/path', 'content')
314
transport = memory.MemoryTransport()
315
self.assertRaises(NoSuchFile,
316
transport.append_bytes, 'dir/path', 'content')
308
318
def test_put_without_dir_fails(self):
309
t = memory.MemoryTransport()
310
self.assertRaises(errors.NoSuchFile,
311
t.put_file, 'dir/path', StringIO('content'))
319
transport = memory.MemoryTransport()
320
self.assertRaises(NoSuchFile,
321
transport.put_file, 'dir/path', StringIO('content'))
313
323
def test_get_missing(self):
314
324
transport = memory.MemoryTransport()
315
self.assertRaises(errors.NoSuchFile, transport.get, 'foo')
325
self.assertRaises(NoSuchFile, transport.get, 'foo')
317
327
def test_has_missing(self):
318
t = memory.MemoryTransport()
319
self.assertEquals(False, t.has('foo'))
328
transport = memory.MemoryTransport()
329
self.assertEquals(False, transport.has('foo'))
321
331
def test_has_present(self):
322
t = memory.MemoryTransport()
323
t.append_bytes('foo', 'content')
324
self.assertEquals(True, t.has('foo'))
332
transport = memory.MemoryTransport()
333
transport.append_bytes('foo', 'content')
334
self.assertEquals(True, transport.has('foo'))
326
336
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')
337
transport = memory.MemoryTransport()
338
transport.put_bytes('foo', 'content')
339
transport.mkdir('dir')
340
transport.put_bytes('dir/subfoo', 'content')
341
transport.put_bytes('dirlike', 'content')
333
self.assertEquals(['dir', 'dirlike', 'foo'], sorted(t.list_dir('.')))
334
self.assertEquals(['subfoo'], sorted(t.list_dir('dir')))
343
self.assertEquals(['dir', 'dirlike', 'foo'], sorted(transport.list_dir('.')))
344
self.assertEquals(['subfoo'], sorted(transport.list_dir('dir')))
336
346
def test_mkdir(self):
337
t = memory.MemoryTransport()
339
t.append_bytes('dir/path', 'content')
340
self.assertEqual(t.get('dir/path').read(), 'content')
347
transport = memory.MemoryTransport()
348
transport.mkdir('dir')
349
transport.append_bytes('dir/path', 'content')
350
self.assertEqual(transport.get('dir/path').read(), 'content')
342
352
def test_mkdir_missing_parent(self):
343
t = memory.MemoryTransport()
344
self.assertRaises(errors.NoSuchFile, t.mkdir, 'dir/dir')
353
transport = memory.MemoryTransport()
354
self.assertRaises(NoSuchFile,
355
transport.mkdir, 'dir/dir')
346
357
def test_mkdir_twice(self):
347
t = memory.MemoryTransport()
349
self.assertRaises(errors.FileExists, t.mkdir, 'dir')
358
transport = memory.MemoryTransport()
359
transport.mkdir('dir')
360
self.assertRaises(FileExists, transport.mkdir, 'dir')
351
362
def test_parameters(self):
352
t = memory.MemoryTransport()
353
self.assertEqual(True, t.listable())
354
self.assertEqual(False, t.is_readonly())
363
transport = memory.MemoryTransport()
364
self.assertEqual(True, transport.listable())
365
self.assertEqual(False, transport.is_readonly())
356
367
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())
368
transport = memory.MemoryTransport()
369
transport.mkdir('dir')
370
transport.put_bytes('dir/foo', 'content')
371
transport.put_bytes('dir/bar', 'content')
372
transport.put_bytes('bar', 'content')
373
paths = set(transport.iter_files_recursive())
363
374
self.assertEqual(set(['dir/foo', 'dir/bar', 'bar']), paths)
365
376
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):
377
transport = memory.MemoryTransport()
378
transport.put_bytes('foo', 'content')
379
transport.put_bytes('bar', 'phowar')
380
self.assertEqual(7, transport.stat('foo').st_size)
381
self.assertEqual(6, transport.stat('bar').st_size)
384
class ChrootDecoratorTransportTest(TestCase):
374
385
"""Chroot decoration specific tests."""
376
387
def test_abspath(self):
377
388
# The abspath is always relative to the chroot_url.
378
server = chroot.ChrootServer(
379
transport.get_transport('memory:///foo/bar/'))
389
server = ChrootServer(get_transport('memory:///foo/bar/'))
380
390
self.start_server(server)
381
t = transport.get_transport(server.get_url())
382
self.assertEqual(server.get_url(), t.abspath('/'))
391
transport = get_transport(server.get_url())
392
self.assertEqual(server.get_url(), transport.abspath('/'))
384
subdir_t = t.clone('subdir')
385
self.assertEqual(server.get_url(), subdir_t.abspath('/'))
394
subdir_transport = transport.clone('subdir')
395
self.assertEqual(server.get_url(), subdir_transport.abspath('/'))
387
397
def test_clone(self):
388
server = chroot.ChrootServer(
389
transport.get_transport('memory:///foo/bar/'))
398
server = ChrootServer(get_transport('memory:///foo/bar/'))
390
399
self.start_server(server)
391
t = transport.get_transport(server.get_url())
400
transport = get_transport(server.get_url())
392
401
# relpath from root and root path are the same
393
relpath_cloned = t.clone('foo')
394
abspath_cloned = t.clone('/foo')
402
relpath_cloned = transport.clone('foo')
403
abspath_cloned = transport.clone('/foo')
395
404
self.assertEqual(server, relpath_cloned.server)
396
405
self.assertEqual(server, abspath_cloned.server)
487
492
parameter to override it."""
488
493
if filter_func is None:
489
494
filter_func = lambda x: x
490
server = pathfilter.PathFilteringServer(
491
transport.get_transport('memory:///foo/bar/'), filter_func)
495
server = PathFilteringServer(
496
get_transport('memory:///foo/bar/'), filter_func)
492
497
server.start_server()
493
498
self.addCleanup(server.stop_server)
494
return transport.get_transport(server.get_url())
499
return get_transport(server.get_url())
496
501
def test__filter(self):
497
502
# _filter (with an identity func as filter_func) always returns
498
503
# 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('/'))
504
transport = self.make_pf_transport()
505
self.assertEqual('foo', transport._filter('foo'))
506
self.assertEqual('foo/bar', transport._filter('foo/bar'))
507
self.assertEqual('', transport._filter('..'))
508
self.assertEqual('', transport._filter('/'))
504
509
# 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('/'))
510
transport = transport.clone('subdir1/subdir2')
511
self.assertEqual('subdir1/subdir2/foo', transport._filter('foo'))
513
'subdir1/subdir2/foo/bar', transport._filter('foo/bar'))
514
self.assertEqual('subdir1', transport._filter('..'))
515
self.assertEqual('', transport._filter('/'))
511
517
def test_filter_invocation(self):
513
519
def filter(path):
514
520
filter_log.append(path)
516
t = self.make_pf_transport(filter)
522
transport = self.make_pf_transport(filter)
518
524
self.assertEqual(['abc'], filter_log)
519
525
del filter_log[:]
520
t.clone('abc').has('xyz')
526
transport.clone('abc').has('xyz')
521
527
self.assertEqual(['abc/xyz'], filter_log)
522
528
del filter_log[:]
529
transport.has('/abc')
524
530
self.assertEqual(['abc'], filter_log)
526
532
def test_clone(self):
527
t = self.make_pf_transport()
533
transport = self.make_pf_transport()
528
534
# 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)
535
relpath_cloned = transport.clone('foo')
536
abspath_cloned = transport.clone('/foo')
537
self.assertEqual(transport.server, relpath_cloned.server)
538
self.assertEqual(transport.server, abspath_cloned.server)
534
540
def test_url_preserves_pathfiltering(self):
535
541
"""Calling get_transport on a pathfiltered transport's base should
540
546
otherwise) the filtering by doing::
541
547
url = filtered_transport.base
542
548
parent_url = urlutils.join(url, '..')
543
new_t = transport.get_transport(parent_url)
549
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):
551
transport = self.make_pf_transport()
552
new_transport = get_transport(transport.base)
553
self.assertEqual(transport.server, new_transport.server)
554
self.assertEqual(transport.base, new_transport.base)
557
class ReadonlyDecoratorTransportTest(TestCase):
552
558
"""Readonly decoration specific tests."""
554
560
def test_local_parameters(self):
561
import bzrlib.transport.readonly as readonly
555
562
# connect to . in readonly mode
556
t = readonly.ReadonlyTransportDecorator('readonly+.')
557
self.assertEqual(True, t.listable())
558
self.assertEqual(True, t.is_readonly())
563
transport = readonly.ReadonlyTransportDecorator('readonly+.')
564
self.assertEqual(True, transport.listable())
565
self.assertEqual(True, transport.is_readonly())
560
567
def test_http_parameters(self):
561
568
from bzrlib.tests.http_server import HttpServer
569
import bzrlib.transport.readonly as readonly
562
570
# connect to '.' via http which is not listable
563
571
server = HttpServer()
564
572
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):
573
transport = get_transport('readonly+' + server.get_url())
574
self.failUnless(isinstance(transport,
575
readonly.ReadonlyTransportDecorator))
576
self.assertEqual(False, transport.listable())
577
self.assertEqual(True, transport.is_readonly())
580
class FakeNFSDecoratorTests(TestCaseInTempDir):
572
581
"""NFS decorator specific tests."""
574
583
def get_nfs_transport(self, url):
584
import bzrlib.transport.fakenfs as fakenfs
575
585
# connect to url with nfs decoration
576
586
return fakenfs.FakeNFSTransportDecorator('fakenfs+' + url)
578
588
def test_local_parameters(self):
579
589
# the listable and is_readonly parameters
580
590
# 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())
591
transport = self.get_nfs_transport('.')
592
self.assertEqual(True, transport.listable())
593
self.assertEqual(False, transport.is_readonly())
585
595
def test_http_parameters(self):
586
596
# the listable and is_readonly parameters
589
599
# connect to '.' via http which is not listable
590
600
server = HttpServer()
591
601
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())
602
transport = self.get_nfs_transport(server.get_url())
603
self.assertIsInstance(
604
transport, bzrlib.transport.fakenfs.FakeNFSTransportDecorator)
605
self.assertEqual(False, transport.listable())
606
self.assertEqual(True, transport.is_readonly())
597
608
def test_fakenfs_server_default(self):
598
609
# a FakeNFSServer() should bring up a local relpath server for itself
599
server = test_server.FakeNFSServer()
610
import bzrlib.transport.fakenfs as fakenfs
611
server = fakenfs.FakeNFSServer()
600
612
self.start_server(server)
601
613
# the url should be decorated appropriately
602
614
self.assertStartsWith(server.get_url(), 'fakenfs+')
603
615
# and we should be able to get a transport for it
604
t = transport.get_transport(server.get_url())
616
transport = get_transport(server.get_url())
605
617
# which must be a FakeNFSTransportDecorator instance.
606
self.assertIsInstance(t, fakenfs.FakeNFSTransportDecorator)
618
self.assertIsInstance(transport, fakenfs.FakeNFSTransportDecorator)
608
620
def test_fakenfs_rename_semantics(self):
609
621
# a FakeNFS transport must mangle the way rename errors occur to
610
622
# look like NFS problems.
611
t = self.get_nfs_transport('.')
623
transport = self.get_nfs_transport('.')
612
624
self.build_tree(['from/', 'from/foo', 'to/', 'to/bar'],
614
self.assertRaises(errors.ResourceBusy, t.rename, 'from', 'to')
617
class FakeVFATDecoratorTests(tests.TestCaseInTempDir):
626
self.assertRaises(errors.ResourceBusy,
627
transport.rename, 'from', 'to')
630
class FakeVFATDecoratorTests(TestCaseInTempDir):
618
631
"""Tests for simulation of VFAT restrictions"""
620
633
def get_vfat_transport(self, url):
821
831
self.assertIs(new_password, c._get_credentials())
824
class TestReusedTransports(tests.TestCase):
834
class TestReusedTransports(TestCase):
825
835
"""Tests for transport reuse"""
827
837
def test_reuse_same_transport(self):
828
838
possible_transports = []
829
t1 = transport.get_transport('http://foo/',
830
possible_transports=possible_transports)
839
t1 = get_transport('http://foo/',
840
possible_transports=possible_transports)
831
841
self.assertEqual([t1], possible_transports)
832
t2 = transport.get_transport('http://foo/',
833
possible_transports=[t1])
842
t2 = get_transport('http://foo/', possible_transports=[t1])
834
843
self.assertIs(t1, t2)
836
845
# 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])
846
t3 = get_transport('http://foo/path/')
847
t4 = get_transport('http://foo/path', possible_transports=[t3])
840
848
self.assertIs(t3, t4)
842
t5 = transport.get_transport('http://foo/path')
843
t6 = transport.get_transport('http://foo/path/',
844
possible_transports=[t5])
850
t5 = get_transport('http://foo/path')
851
t6 = get_transport('http://foo/path/', possible_transports=[t5])
845
852
self.assertIs(t5, t6)
847
854
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])
855
t1 = get_transport('http://foo/path')
856
t2 = get_transport('http://bar/path', possible_transports=[t1])
851
857
self.assertIsNot(t1, t2)
854
class TestTransportTrace(tests.TestCase):
860
class TestTransportTrace(TestCase):
856
862
def test_get(self):
857
t = transport.get_transport('trace+memory://')
858
self.assertIsInstance(t, bzrlib.transport.trace.TransportTraceDecorator)
863
transport = get_transport('trace+memory://')
864
self.assertIsInstance(
865
transport, bzrlib.transport.trace.TransportTraceDecorator)
860
867
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)
868
transport = get_transport('trace+memory://')
869
transport2 = transport.clone('.')
870
self.assertTrue(transport is not transport2)
871
self.assertTrue(transport._activity is transport2._activity)
866
873
# the following specific tests are for the operations that have made use of
867
874
# logging in tests; we could test every single operation but doing that
868
875
# still won't cause a test failure when the top level Transport API
869
876
# changes; so there is little return doing that.
870
877
def test_get(self):
871
t = transport.get_transport('trace+memory:///')
872
t.put_bytes('foo', 'barish')
878
transport = get_transport('trace+memory:///')
879
transport.put_bytes('foo', 'barish')
874
881
expected_result = []
875
882
# put_bytes records the bytes, not the content to avoid memory
877
884
expected_result.append(('put_bytes', 'foo', 6, None))
878
885
# get records the file name only.
879
886
expected_result.append(('get', 'foo'))
880
self.assertEqual(expected_result, t._activity)
887
self.assertEqual(expected_result, transport._activity)
882
889
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))
890
transport = get_transport('trace+memory:///')
891
transport.put_bytes('foo', 'barish')
892
list(transport.readv('foo', [(0, 1), (3, 2)], adjust_for_latency=True,
887
894
expected_result = []
888
895
# put_bytes records the bytes, not the content to avoid memory
890
897
expected_result.append(('put_bytes', 'foo', 6, None))
891
898
# readv records the supplied offset request
892
899
expected_result.append(('readv', 'foo', [(0, 1), (3, 2)], True, 6))
893
self.assertEqual(expected_result, t._activity)
900
self.assertEqual(expected_result, transport._activity)
896
903
class TestSSHConnections(tests.TestCaseWithTransport):