49
53
class TestTransport(tests.TestCase):
50
54
"""Test the non transport-concrete class functionality."""
52
# FIXME: These tests should use addCleanup() and/or overrideAttr() instead
53
# of try/finally -- vila 20100205
55
56
def test__get_set_protocol_handlers(self):
56
57
handlers = transport._get_protocol_handlers()
57
self.assertNotEqual([], handlers.keys( ))
59
transport._clear_protocol_handlers()
60
self.assertEqual([], transport._get_protocol_handlers().keys())
62
transport._set_protocol_handlers(handlers)
58
self.assertNotEqual([], handlers.keys())
59
transport._clear_protocol_handlers()
60
self.addCleanup(transport._set_protocol_handlers, handlers)
61
self.assertEqual([], transport._get_protocol_handlers().keys())
64
63
def test_get_transport_modules(self):
65
64
handlers = transport._get_protocol_handlers()
65
self.addCleanup(transport._set_protocol_handlers, handlers)
66
66
# don't pollute the current handlers
67
67
transport._clear_protocol_handlers()
68
69
class SampleHandler(object):
69
70
"""I exist, isnt that enough?"""
71
transport._clear_protocol_handlers()
72
transport.register_transport_proto('foo')
73
transport.register_lazy_transport('foo',
74
'bzrlib.tests.test_transport',
75
'TestTransport.SampleHandler')
76
transport.register_transport_proto('bar')
77
transport.register_lazy_transport('bar',
78
'bzrlib.tests.test_transport',
79
'TestTransport.SampleHandler')
80
self.assertEqual([SampleHandler.__module__,
81
'bzrlib.transport.chroot',
82
'bzrlib.transport.pathfilter'],
83
transport._get_transport_modules())
85
transport._set_protocol_handlers(handlers)
71
transport._clear_protocol_handlers()
72
transport.register_transport_proto('foo')
73
transport.register_lazy_transport('foo',
74
'bzrlib.tests.test_transport',
75
'TestTransport.SampleHandler')
76
transport.register_transport_proto('bar')
77
transport.register_lazy_transport('bar',
78
'bzrlib.tests.test_transport',
79
'TestTransport.SampleHandler')
80
self.assertEqual([SampleHandler.__module__,
81
'bzrlib.transport.chroot',
82
'bzrlib.transport.pathfilter'],
83
transport._get_transport_modules())
87
85
def test_transport_dependency(self):
88
86
"""Transport with missing dependency causes no error"""
89
87
saved_handlers = transport._get_protocol_handlers()
88
self.addCleanup(transport._set_protocol_handlers, saved_handlers)
90
89
# don't pollute the current handlers
91
90
transport._clear_protocol_handlers()
91
transport.register_transport_proto('foo')
92
transport.register_lazy_transport(
93
'foo', 'bzrlib.tests.test_transport', 'BadTransportHandler')
93
transport.register_transport_proto('foo')
94
transport.register_lazy_transport(
95
'foo', 'bzrlib.tests.test_transport', 'BadTransportHandler')
97
transport.get_transport('foo://fooserver/foo')
98
except errors.UnsupportedProtocol, e:
100
self.assertEquals('Unsupported protocol'
101
' for url "foo://fooserver/foo":'
102
' Unable to import library "some_lib":'
103
' testing missing dependency', str(e))
105
self.fail('Did not raise UnsupportedProtocol')
107
# restore original values
108
transport._set_protocol_handlers(saved_handlers)
95
transport.get_transport_from_url('foo://fooserver/foo')
96
except errors.UnsupportedProtocol, e:
98
self.assertEquals('Unsupported protocol'
99
' for url "foo://fooserver/foo":'
100
' Unable to import library "some_lib":'
101
' testing missing dependency', str(e))
103
self.fail('Did not raise UnsupportedProtocol')
110
105
def test_transport_fallback(self):
111
106
"""Transport with missing dependency causes no error"""
112
107
saved_handlers = transport._get_protocol_handlers()
114
transport._clear_protocol_handlers()
115
transport.register_transport_proto('foo')
116
transport.register_lazy_transport(
117
'foo', 'bzrlib.tests.test_transport', 'BackupTransportHandler')
118
transport.register_lazy_transport(
119
'foo', 'bzrlib.tests.test_transport', 'BadTransportHandler')
120
t = transport.get_transport('foo://fooserver/foo')
121
self.assertTrue(isinstance(t, BackupTransportHandler))
123
transport._set_protocol_handlers(saved_handlers)
108
self.addCleanup(transport._set_protocol_handlers, saved_handlers)
109
transport._clear_protocol_handlers()
110
transport.register_transport_proto('foo')
111
transport.register_lazy_transport(
112
'foo', 'bzrlib.tests.test_transport', 'BackupTransportHandler')
113
transport.register_lazy_transport(
114
'foo', 'bzrlib.tests.test_transport', 'BadTransportHandler')
115
t = transport.get_transport_from_url('foo://fooserver/foo')
116
self.assertTrue(isinstance(t, BackupTransportHandler))
125
118
def test_ssh_hints(self):
126
119
"""Transport ssh:// should raise an error pointing out bzr+ssh://"""
128
transport.get_transport('ssh://fooserver/foo')
121
transport.get_transport_from_url('ssh://fooserver/foo')
129
122
except errors.UnsupportedProtocol, e:
131
124
self.assertEquals('Unsupported protocol'
220
202
def test_coalesce_fudge(self):
221
203
self.check([(10, 30, [(0, 10), (20, 10)]),
222
(100, 10, [(0, 10),]),
204
(100, 10, [(0, 10)]),
223
205
], [(10, 10), (30, 10), (100, 10)],
226
208
def test_coalesce_max_size(self):
227
209
self.check([(10, 20, [(0, 10), (10, 10)]),
228
210
(30, 50, [(0, 50)]),
229
211
# If one range is above max_size, it gets its own coalesced
231
(100, 80, [(0, 80),]),],
213
(100, 80, [(0, 80)]),],
232
214
[(10, 10), (20, 10), (30, 50), (100, 80)],
236
217
def test_coalesce_no_max_size(self):
237
self.check([(10, 170, [(0, 10), (10, 10), (20, 50), (70, 100)]),],
218
self.check([(10, 170, [(0, 10), (10, 10), (20, 50), (70, 100)])],
238
219
[(10, 10), (20, 10), (30, 50), (80, 100)],
241
222
def test_coalesce_default_limit(self):
242
223
# By default we use a 100MB max size.
243
ten_mb = 10*1024*1024
244
self.check([(0, 10*ten_mb, [(i*ten_mb, ten_mb) for i in range(10)]),
224
ten_mb = 10 * 1024 * 1024
225
self.check([(0, 10 * ten_mb, [(i * ten_mb, ten_mb) for i in range(10)]),
245
226
(10*ten_mb, ten_mb, [(0, ten_mb)])],
246
227
[(i*ten_mb, ten_mb) for i in range(11)])
247
self.check([(0, 11*ten_mb, [(i*ten_mb, ten_mb) for i in range(11)]),],
248
[(i*ten_mb, ten_mb) for i in range(11)],
228
self.check([(0, 11 * ten_mb, [(i * ten_mb, ten_mb) for i in range(11)])],
229
[(i * ten_mb, ten_mb) for i in range(11)],
249
230
max_size=1*1024*1024*1024)
459
439
backing_transport = memory.MemoryTransport()
460
440
server = chroot.ChrootServer(backing_transport)
461
441
server.start_server()
463
self.assertEqual('chroot-%d:///' % id(server), server.get_url())
442
self.addCleanup(server.stop_server)
443
self.assertEqual('chroot-%d:///' % id(server), server.get_url())
446
class TestHooks(tests.TestCase):
447
"""Basic tests for transport hooks"""
449
def _get_connected_transport(self):
450
return transport.ConnectedTransport("bogus:nowhere")
452
def test_transporthooks_initialisation(self):
453
"""Check all expected transport hook points are set up"""
454
hookpoint = transport.TransportHooks()
455
self.assertTrue("post_connect" in hookpoint,
456
"post_connect not in %s" % (hookpoint,))
458
def test_post_connect(self):
459
"""Ensure the post_connect hook is called when _set_transport is"""
461
transport.Transport.hooks.install_named_hook("post_connect",
463
t = self._get_connected_transport()
464
self.assertLength(0, calls)
465
t._set_connection("connection", "auth")
466
self.assertEqual(calls, [t])
468
469
class PathFilteringDecoratorTransportTest(tests.TestCase):
701
class TestTransportFromPath(tests.TestCaseInTempDir):
703
def test_with_path(self):
704
t = transport.get_transport_from_path(self.test_dir)
705
self.assertIsInstance(t, local.LocalTransport)
706
self.assertEquals(t.base.rstrip("/"),
707
urlutils.local_path_to_url(self.test_dir))
709
def test_with_url(self):
710
t = transport.get_transport_from_path("file:")
711
self.assertIsInstance(t, local.LocalTransport)
712
self.assertEquals(t.base.rstrip("/"),
713
urlutils.local_path_to_url(os.path.join(self.test_dir, "file:")))
716
class TestTransportFromUrl(tests.TestCaseInTempDir):
718
def test_with_path(self):
719
self.assertRaises(errors.InvalidURL, transport.get_transport_from_url,
722
def test_with_url(self):
723
url = urlutils.local_path_to_url(self.test_dir)
724
t = transport.get_transport_from_url(url)
725
self.assertIsInstance(t, local.LocalTransport)
726
self.assertEquals(t.base.rstrip("/"), url)
728
def test_with_url_and_segment_parameters(self):
729
url = urlutils.local_path_to_url(self.test_dir)+",branch=foo"
730
t = transport.get_transport_from_url(url)
731
self.assertIsInstance(t, local.LocalTransport)
732
self.assertEquals(t.base.rstrip("/"), url)
733
with open(os.path.join(self.test_dir, "afile"), 'w') as f:
735
self.assertTrue(t.has("afile"))
699
738
class TestLocalTransports(tests.TestCase):
701
740
def test_get_transport_from_abspath(self):
763
833
def test_parse_url(self):
764
834
t = transport.ConnectedTransport(
765
835
'http://simple.example.com/home/source')
766
self.assertEquals(t._host, 'simple.example.com')
767
self.assertEquals(t._port, None)
768
self.assertEquals(t._path, '/home/source/')
769
self.assertTrue(t._user is None)
770
self.assertTrue(t._password is None)
836
self.assertEquals(t._parsed_url.host, 'simple.example.com')
837
self.assertEquals(t._parsed_url.port, None)
838
self.assertEquals(t._parsed_url.path, '/home/source/')
839
self.assertTrue(t._parsed_url.user is None)
840
self.assertTrue(t._parsed_url.password is None)
772
842
self.assertEquals(t.base, 'http://simple.example.com/home/source/')
774
844
def test_parse_url_with_at_in_user(self):
776
846
t = transport.ConnectedTransport('ftp://user@host.com@www.host.com/')
777
self.assertEquals(t._user, 'user@host.com')
847
self.assertEquals(t._parsed_url.user, 'user@host.com')
779
849
def test_parse_quoted_url(self):
780
850
t = transport.ConnectedTransport(
781
851
'http://ro%62ey:h%40t@ex%41mple.com:2222/path')
782
self.assertEquals(t._host, 'exAmple.com')
783
self.assertEquals(t._port, 2222)
784
self.assertEquals(t._user, 'robey')
785
self.assertEquals(t._password, 'h@t')
786
self.assertEquals(t._path, '/path/')
852
self.assertEquals(t._parsed_url.host, 'exAmple.com')
853
self.assertEquals(t._parsed_url.port, 2222)
854
self.assertEquals(t._parsed_url.user, 'robey')
855
self.assertEquals(t._parsed_url.password, 'h@t')
856
self.assertEquals(t._parsed_url.path, '/path/')
788
858
# Base should not keep track of the password
789
self.assertEquals(t.base, 'http://robey@exAmple.com:2222/path/')
859
self.assertEquals(t.base, 'http://ro%62ey@ex%41mple.com:2222/path/')
791
861
def test_parse_invalid_url(self):
792
862
self.assertRaises(errors.InvalidURL,
847
918
def test_reuse_same_transport(self):
848
919
possible_transports = []
849
t1 = transport.get_transport('http://foo/',
920
t1 = transport.get_transport_from_url('http://foo/',
850
921
possible_transports=possible_transports)
851
922
self.assertEqual([t1], possible_transports)
852
t2 = transport.get_transport('http://foo/',
923
t2 = transport.get_transport_from_url('http://foo/',
853
924
possible_transports=[t1])
854
925
self.assertIs(t1, t2)
856
927
# Also check that final '/' are handled correctly
857
t3 = transport.get_transport('http://foo/path/')
858
t4 = transport.get_transport('http://foo/path',
928
t3 = transport.get_transport_from_url('http://foo/path/')
929
t4 = transport.get_transport_from_url('http://foo/path',
859
930
possible_transports=[t3])
860
931
self.assertIs(t3, t4)
862
t5 = transport.get_transport('http://foo/path')
863
t6 = transport.get_transport('http://foo/path/',
933
t5 = transport.get_transport_from_url('http://foo/path')
934
t6 = transport.get_transport_from_url('http://foo/path/',
864
935
possible_transports=[t5])
865
936
self.assertIs(t5, t6)
867
938
def test_don_t_reuse_different_transport(self):
868
t1 = transport.get_transport('http://foo/path')
869
t2 = transport.get_transport('http://bar/path',
939
t1 = transport.get_transport_from_url('http://foo/path')
940
t2 = transport.get_transport_from_url('http://bar/path',
870
941
possible_transports=[t1])
871
942
self.assertIsNot(t1, t2)
874
945
class TestTransportTrace(tests.TestCase):
877
t = transport.get_transport('trace+memory://')
878
self.assertIsInstance(t, bzrlib.transport.trace.TransportTraceDecorator)
947
def test_decorator(self):
948
t = transport.get_transport_from_url('trace+memory://')
949
self.assertIsInstance(
950
t, bzrlib.transport.trace.TransportTraceDecorator)
880
952
def test_clone_preserves_activity(self):
881
t = transport.get_transport('trace+memory://')
953
t = transport.get_transport_from_url('trace+memory://')
882
954
t2 = t.clone('.')
883
955
self.assertTrue(t is not t2)
884
956
self.assertTrue(t._activity is t2._activity)
1024
1097
result = http.unhtml_roughly(fake_html)
1025
1098
self.assertEquals(len(result), 1000)
1026
1099
self.assertStartsWith(result, " something!")
1102
class SomeDirectory(object):
1104
def look_up(self, name, url):
1108
class TestLocationToUrl(tests.TestCase):
1110
def get_base_location(self):
1111
path = osutils.abspath('/foo/bar')
1112
if path.startswith('/'):
1113
url = 'file://%s' % (path,)
1115
# On Windows, abspaths start with the drive letter, so we have to
1116
# add in the extra '/'
1117
url = 'file:///%s' % (path,)
1120
def test_regular_url(self):
1121
self.assertEquals("file://foo", location_to_url("file://foo"))
1123
def test_directory(self):
1124
directories.register("bar:", SomeDirectory, "Dummy directory")
1125
self.addCleanup(directories.remove, "bar:")
1126
self.assertEquals("http://bar", location_to_url("bar:"))
1128
def test_unicode_url(self):
1129
self.assertRaises(errors.InvalidURL, location_to_url,
1130
"http://fo/\xc3\xaf".decode("utf-8"))
1132
def test_unicode_path(self):
1133
path, url = self.get_base_location()
1134
location = path + "\xc3\xaf".decode("utf-8")
1136
self.assertEquals(url, location_to_url(location))
1138
def test_path(self):
1139
path, url = self.get_base_location()
1140
self.assertEquals(url, location_to_url(path))
1142
def test_relative_file_url(self):
1143
self.assertEquals(urlutils.local_path_to_url(".") + "/bar",
1144
location_to_url("file:bar"))
1146
def test_absolute_file_url(self):
1147
self.assertEquals("file:///bar", location_to_url("file:/bar"))