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