52
48
class TestTransport(tests.TestCase):
53
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
55
54
def test__get_set_protocol_handlers(self):
56
55
handlers = transport._get_protocol_handlers()
57
self.assertNotEqual([], handlers.keys())
58
transport._clear_protocol_handlers()
59
self.addCleanup(transport._set_protocol_handlers, handlers)
60
self.assertEqual([], transport._get_protocol_handlers().keys())
56
self.assertNotEqual([], handlers.keys( ))
58
transport._clear_protocol_handlers()
59
self.assertEqual([], transport._get_protocol_handlers().keys())
61
transport._set_protocol_handlers(handlers)
62
63
def test_get_transport_modules(self):
63
64
handlers = transport._get_protocol_handlers()
64
self.addCleanup(transport._set_protocol_handlers, handlers)
65
65
# don't pollute the current handlers
66
66
transport._clear_protocol_handlers()
68
67
class SampleHandler(object):
69
68
"""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')
79
self.assertEqual([SampleHandler.__module__,
80
'bzrlib.transport.chroot',
81
'bzrlib.transport.pathfilter'],
82
transport._get_transport_modules())
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')
79
self.assertEqual([SampleHandler.__module__,
80
'bzrlib.transport.chroot',
81
'bzrlib.transport.pathfilter'],
82
transport._get_transport_modules())
84
transport._set_protocol_handlers(handlers)
84
86
def test_transport_dependency(self):
85
87
"""Transport with missing dependency causes no error"""
86
88
saved_handlers = transport._get_protocol_handlers()
87
self.addCleanup(transport._set_protocol_handlers, saved_handlers)
88
89
# don't pollute the current handlers
89
90
transport._clear_protocol_handlers()
90
transport.register_transport_proto('foo')
91
transport.register_lazy_transport(
92
'foo', 'bzrlib.tests.test_transport', 'BadTransportHandler')
94
transport.get_transport_from_url('foo://fooserver/foo')
95
except errors.UnsupportedProtocol, e:
97
self.assertEquals('Unsupported protocol'
98
' for url "foo://fooserver/foo":'
99
' Unable to import library "some_lib":'
100
' testing missing dependency', str(e))
102
self.fail('Did not raise UnsupportedProtocol')
92
transport.register_transport_proto('foo')
93
transport.register_lazy_transport(
94
'foo', 'bzrlib.tests.test_transport', 'BadTransportHandler')
96
transport.get_transport('foo://fooserver/foo')
97
except errors.UnsupportedProtocol, e:
99
self.assertEquals('Unsupported protocol'
100
' for url "foo://fooserver/foo":'
101
' Unable to import library "some_lib":'
102
' testing missing dependency', str(e))
104
self.fail('Did not raise UnsupportedProtocol')
106
# restore original values
107
transport._set_protocol_handlers(saved_handlers)
104
109
def test_transport_fallback(self):
105
110
"""Transport with missing dependency causes no error"""
106
111
saved_handlers = transport._get_protocol_handlers()
107
self.addCleanup(transport._set_protocol_handlers, saved_handlers)
108
transport._clear_protocol_handlers()
109
transport.register_transport_proto('foo')
110
transport.register_lazy_transport(
111
'foo', 'bzrlib.tests.test_transport', 'BackupTransportHandler')
112
transport.register_lazy_transport(
113
'foo', 'bzrlib.tests.test_transport', 'BadTransportHandler')
114
t = transport.get_transport_from_url('foo://fooserver/foo')
115
self.assertTrue(isinstance(t, BackupTransportHandler))
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')
120
self.assertTrue(isinstance(t, BackupTransportHandler))
122
transport._set_protocol_handlers(saved_handlers)
117
124
def test_ssh_hints(self):
118
125
"""Transport ssh:// should raise an error pointing out bzr+ssh://"""
120
transport.get_transport_from_url('ssh://fooserver/foo')
127
transport.get_transport('ssh://fooserver/foo')
121
128
except errors.UnsupportedProtocol, e:
123
130
self.assertEquals('Unsupported protocol'
201
219
def test_coalesce_fudge(self):
202
220
self.check([(10, 30, [(0, 10), (20, 10)]),
203
(100, 10, [(0, 10)]),
221
(100, 10, [(0, 10),]),
204
222
], [(10, 10), (30, 10), (100, 10)],
207
225
def test_coalesce_max_size(self):
208
226
self.check([(10, 20, [(0, 10), (10, 10)]),
209
227
(30, 50, [(0, 50)]),
210
228
# If one range is above max_size, it gets its own coalesced
212
(100, 80, [(0, 80)]),],
230
(100, 80, [(0, 80),]),],
213
231
[(10, 10), (20, 10), (30, 50), (100, 80)],
216
235
def test_coalesce_no_max_size(self):
217
self.check([(10, 170, [(0, 10), (10, 10), (20, 50), (70, 100)])],
236
self.check([(10, 170, [(0, 10), (10, 10), (20, 50), (70, 100)]),],
218
237
[(10, 10), (20, 10), (30, 50), (80, 100)],
221
240
def test_coalesce_default_limit(self):
222
241
# By default we use a 100MB max size.
223
ten_mb = 10 * 1024 * 1024
224
self.check([(0, 10 * ten_mb, [(i * ten_mb, ten_mb) for i in range(10)]),
242
ten_mb = 10*1024*1024
243
self.check([(0, 10*ten_mb, [(i*ten_mb, ten_mb) for i in range(10)]),
225
244
(10*ten_mb, ten_mb, [(0, ten_mb)])],
226
245
[(i*ten_mb, ten_mb) for i in range(11)])
227
self.check([(0, 11 * ten_mb, [(i * ten_mb, ten_mb) for i in range(11)])],
228
[(i * ten_mb, ten_mb) for i in range(11)],
246
self.check([(0, 11*ten_mb, [(i*ten_mb, ten_mb) for i in range(11)]),],
247
[(i*ten_mb, ten_mb) for i in range(11)],
229
248
max_size=1*1024*1024*1024)
677
class TestTransportFromPath(tests.TestCaseInTempDir):
679
def test_with_path(self):
680
t = transport.get_transport_from_path(self.test_dir)
681
self.assertIsInstance(t, local.LocalTransport)
682
self.assertEquals(t.base.rstrip("/"),
683
urlutils.local_path_to_url(self.test_dir))
685
def test_with_url(self):
686
t = transport.get_transport_from_path("file:")
687
self.assertIsInstance(t, local.LocalTransport)
688
self.assertEquals(t.base.rstrip("/"),
689
urlutils.local_path_to_url(os.path.join(self.test_dir, "file:")))
692
class TestTransportFromUrl(tests.TestCaseInTempDir):
694
def test_with_path(self):
695
self.assertRaises(errors.InvalidURL, transport.get_transport_from_url,
698
def test_with_url(self):
699
url = urlutils.local_path_to_url(self.test_dir)
700
t = transport.get_transport_from_url(url)
701
self.assertIsInstance(t, local.LocalTransport)
702
self.assertEquals(t.base.rstrip("/"), url)
704
def test_with_url_and_segment_parameters(self):
705
url = urlutils.local_path_to_url(self.test_dir)+",branch=foo"
706
t = transport.get_transport_from_url(url)
707
self.assertIsInstance(t, local.LocalTransport)
708
self.assertEquals(t.base.rstrip("/"), url)
709
with open(os.path.join(self.test_dir, "afile"), 'w') as f:
711
self.assertTrue(t.has("afile"))
714
698
class TestLocalTransports(tests.TestCase):
716
700
def test_get_transport_from_abspath(self):
782
743
def test_parse_url(self):
783
744
t = transport.ConnectedTransport(
784
745
'http://simple.example.com/home/source')
785
self.assertEquals(t._parsed_url.host, 'simple.example.com')
786
self.assertEquals(t._parsed_url.port, None)
787
self.assertEquals(t._parsed_url.path, '/home/source/')
788
self.assertTrue(t._parsed_url.user is None)
789
self.assertTrue(t._parsed_url.password is None)
746
self.assertEquals(t._host, 'simple.example.com')
747
self.assertEquals(t._port, None)
748
self.assertEquals(t._path, '/home/source/')
749
self.failUnless(t._user is None)
750
self.failUnless(t._password is None)
791
752
self.assertEquals(t.base, 'http://simple.example.com/home/source/')
793
754
def test_parse_url_with_at_in_user(self):
795
756
t = transport.ConnectedTransport('ftp://user@host.com@www.host.com/')
796
self.assertEquals(t._parsed_url.user, 'user@host.com')
757
self.assertEquals(t._user, 'user@host.com')
798
759
def test_parse_quoted_url(self):
799
760
t = transport.ConnectedTransport(
800
761
'http://ro%62ey:h%40t@ex%41mple.com:2222/path')
801
self.assertEquals(t._parsed_url.host, 'exAmple.com')
802
self.assertEquals(t._parsed_url.port, 2222)
803
self.assertEquals(t._parsed_url.user, 'robey')
804
self.assertEquals(t._parsed_url.password, 'h@t')
805
self.assertEquals(t._parsed_url.path, '/path/')
762
self.assertEquals(t._host, 'exAmple.com')
763
self.assertEquals(t._port, 2222)
764
self.assertEquals(t._user, 'robey')
765
self.assertEquals(t._password, 'h@t')
766
self.assertEquals(t._path, '/path/')
807
768
# Base should not keep track of the password
808
self.assertEquals(t.base, 'http://ro%62ey@ex%41mple.com:2222/path/')
769
self.assertEquals(t.base, 'http://robey@exAmple.com:2222/path/')
810
771
def test_parse_invalid_url(self):
811
772
self.assertRaises(errors.InvalidURL,
867
827
def test_reuse_same_transport(self):
868
828
possible_transports = []
869
t1 = transport.get_transport_from_url('http://foo/',
829
t1 = transport.get_transport('http://foo/',
870
830
possible_transports=possible_transports)
871
831
self.assertEqual([t1], possible_transports)
872
t2 = transport.get_transport_from_url('http://foo/',
832
t2 = transport.get_transport('http://foo/',
873
833
possible_transports=[t1])
874
834
self.assertIs(t1, t2)
876
836
# Also check that final '/' are handled correctly
877
t3 = transport.get_transport_from_url('http://foo/path/')
878
t4 = transport.get_transport_from_url('http://foo/path',
837
t3 = transport.get_transport('http://foo/path/')
838
t4 = transport.get_transport('http://foo/path',
879
839
possible_transports=[t3])
880
840
self.assertIs(t3, t4)
882
t5 = transport.get_transport_from_url('http://foo/path')
883
t6 = transport.get_transport_from_url('http://foo/path/',
842
t5 = transport.get_transport('http://foo/path')
843
t6 = transport.get_transport('http://foo/path/',
884
844
possible_transports=[t5])
885
845
self.assertIs(t5, t6)
887
847
def test_don_t_reuse_different_transport(self):
888
t1 = transport.get_transport_from_url('http://foo/path')
889
t2 = transport.get_transport_from_url('http://bar/path',
848
t1 = transport.get_transport('http://foo/path')
849
t2 = transport.get_transport('http://bar/path',
890
850
possible_transports=[t1])
891
851
self.assertIsNot(t1, t2)
894
854
class TestTransportTrace(tests.TestCase):
896
def test_decorator(self):
897
t = transport.get_transport_from_url('trace+memory://')
898
self.assertIsInstance(
899
t, bzrlib.transport.trace.TransportTraceDecorator)
857
t = transport.get_transport('trace+memory://')
858
self.assertIsInstance(t, bzrlib.transport.trace.TransportTraceDecorator)
901
860
def test_clone_preserves_activity(self):
902
t = transport.get_transport_from_url('trace+memory://')
861
t = transport.get_transport('trace+memory://')
903
862
t2 = t.clone('.')
904
863
self.assertTrue(t is not t2)
905
864
self.assertTrue(t._activity is t2._activity)
1035
989
# And the rest are threads
1036
990
for t in started[1:]:
1040
class TestUnhtml(tests.TestCase):
1042
"""Tests for unhtml_roughly"""
1044
def test_truncation(self):
1045
fake_html = "<p>something!\n" * 1000
1046
result = http.unhtml_roughly(fake_html)
1047
self.assertEquals(len(result), 1000)
1048
self.assertStartsWith(result, " something!")
1051
class SomeDirectory(object):
1053
def look_up(self, name, url):
1057
class TestLocationToUrl(tests.TestCase):
1059
def get_base_location(self):
1060
path = osutils.abspath('/foo/bar')
1061
if path.startswith('/'):
1062
url = 'file://%s' % (path,)
1064
# On Windows, abspaths start with the drive letter, so we have to
1065
# add in the extra '/'
1066
url = 'file:///%s' % (path,)
1069
def test_regular_url(self):
1070
self.assertEquals("file://foo", location_to_url("file://foo"))
1072
def test_directory(self):
1073
directories.register("bar:", SomeDirectory, "Dummy directory")
1074
self.addCleanup(directories.remove, "bar:")
1075
self.assertEquals("http://bar", location_to_url("bar:"))
1077
def test_unicode_url(self):
1078
self.assertRaises(errors.InvalidURL, location_to_url,
1079
"http://fo/\xc3\xaf".decode("utf-8"))
1081
def test_unicode_path(self):
1082
path, url = self.get_base_location()
1083
location = path + "\xc3\xaf".decode("utf-8")
1085
self.assertEquals(url, location_to_url(location))
1087
def test_path(self):
1088
path, url = self.get_base_location()
1089
self.assertEquals(url, location_to_url(path))
1091
def test_relative_file_url(self):
1092
self.assertEquals(urlutils.local_path_to_url(".") + "/bar",
1093
location_to_url("file:bar"))
1095
def test_absolute_file_url(self):
1096
self.assertEquals("file:///bar", location_to_url("file:/bar"))