13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
"""Tests for the urlutils wrapper."""
22
23
from bzrlib import osutils, urlutils, win32utils
23
25
from bzrlib.errors import InvalidURL, InvalidURLJoin, InvalidRebaseURLs
24
26
from bzrlib.tests import TestCaseInTempDir, TestCase, TestSkipped
27
29
class TestUrlToPath(TestCase):
29
31
def test_basename(self):
30
32
# bzrlib.urlutils.basename
31
33
# Test bzrlib.urlutils.split()
195
197
dirname('path/to/foo/', exclude_trailing_slash=False))
196
198
self.assertEqual('path/..', dirname('path/../foo'))
197
199
self.assertEqual('../path', dirname('../path/foo'))
199
def test_is_url(self):
200
self.assertTrue(urlutils.is_url('http://foo/bar'))
201
self.assertTrue(urlutils.is_url('bzr+ssh://foo/bar'))
202
self.assertTrue(urlutils.is_url('lp:foo/bar'))
203
self.assertTrue(urlutils.is_url('file:///foo/bar'))
204
self.assertFalse(urlutils.is_url(''))
205
self.assertFalse(urlutils.is_url('foo'))
206
self.assertFalse(urlutils.is_url('foo/bar'))
207
self.assertFalse(urlutils.is_url('/foo'))
208
self.assertFalse(urlutils.is_url('/foo/bar'))
209
self.assertFalse(urlutils.is_url('C:/'))
210
self.assertFalse(urlutils.is_url('C:/foo'))
211
self.assertFalse(urlutils.is_url('C:/foo/bar'))
213
201
def test_join(self):
214
202
def test(expected, *args):
235
221
test('http://bar/', 'http://foo', 'http://bar/')
236
222
test('http://bar/a', 'http://foo', 'http://bar/a')
237
223
test('http://bar/a/', 'http://foo', 'http://bar/a/')
238
test('lp:bar', 'http://foo', 'lp:bar')
239
test('lp:bar', 'lp:foo', 'lp:bar')
240
test('file:///stuff', 'lp:foo', 'file:///stuff')
242
225
# From a base path
243
226
test('file:///foo', 'file:///', 'foo')
244
227
test('file:///bar/foo', 'file:///bar/', 'foo')
245
228
test('http://host/foo', 'http://host/', 'foo')
246
229
test('http://host/', 'http://host', '')
248
231
# Invalid joinings
249
232
# Cannot go above root
250
233
# Implicitly at root:
283
266
# Test joining to a path with a trailing slash
284
267
test('foo/bar', 'foo/', 'bar')
286
269
# Invalid joinings
287
270
# Cannot go above root
288
271
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '../baz')
289
272
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '..')
290
273
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '/..')
292
def test_join_segment_parameters_raw(self):
293
join_segment_parameters_raw = urlutils.join_segment_parameters_raw
294
self.assertEquals("/somedir/path",
295
join_segment_parameters_raw("/somedir/path"))
296
self.assertEquals("/somedir/path,rawdata",
297
join_segment_parameters_raw("/somedir/path", "rawdata"))
298
self.assertRaises(InvalidURLJoin,
299
join_segment_parameters_raw, "/somedir/path",
300
"rawdata1,rawdata2,rawdata3")
301
self.assertEquals("/somedir/path,bla,bar",
302
join_segment_parameters_raw("/somedir/path", "bla", "bar"))
303
self.assertEquals("/somedir,exist=some/path,bla,bar",
304
join_segment_parameters_raw("/somedir,exist=some/path",
306
self.assertRaises(TypeError, join_segment_parameters_raw,
309
def test_join_segment_parameters(self):
310
join_segment_parameters = urlutils.join_segment_parameters
311
self.assertEquals("/somedir/path",
312
join_segment_parameters("/somedir/path", {}))
313
self.assertEquals("/somedir/path,key1=val1",
314
join_segment_parameters("/somedir/path", {"key1": "val1"}))
315
self.assertRaises(InvalidURLJoin,
316
join_segment_parameters, "/somedir/path",
317
{"branch": "brr,brr,brr"})
318
self.assertRaises(InvalidURLJoin,
319
join_segment_parameters, "/somedir/path", {"key1=val1": "val2"})
320
self.assertEquals("/somedir/path,key1=val1,key2=val2",
321
join_segment_parameters("/somedir/path", {
322
"key1": "val1", "key2": "val2"}))
323
self.assertEquals("/somedir/path,key1=val1,key2=val2",
324
join_segment_parameters("/somedir/path,key1=val1", {
326
self.assertEquals("/somedir/path,key1=val2",
327
join_segment_parameters("/somedir/path,key1=val1", {
329
self.assertEquals("/somedir,exist=some/path,key1=val1",
330
join_segment_parameters("/somedir,exist=some/path",
332
self.assertEquals("/,key1=val1,key2=val2",
333
join_segment_parameters("/,key1=val1", {"key2": "val2"}))
334
self.assertRaises(TypeError,
335
join_segment_parameters, "/,key1=val1", {"foo": 42})
337
275
def test_function_type(self):
338
276
if sys.platform == 'win32':
339
self.assertEqual(urlutils._win32_local_path_to_url,
340
urlutils.local_path_to_url)
341
self.assertEqual(urlutils._win32_local_path_from_url,
342
urlutils.local_path_from_url)
277
self.assertEqual(urlutils._win32_local_path_to_url, urlutils.local_path_to_url)
278
self.assertEqual(urlutils._win32_local_path_from_url, urlutils.local_path_from_url)
344
self.assertEqual(urlutils._posix_local_path_to_url,
345
urlutils.local_path_to_url)
346
self.assertEqual(urlutils._posix_local_path_from_url,
347
urlutils.local_path_from_url)
280
self.assertEqual(urlutils._posix_local_path_to_url, urlutils.local_path_to_url)
281
self.assertEqual(urlutils._posix_local_path_from_url, urlutils.local_path_from_url)
349
283
def test_posix_local_path_to_url(self):
350
284
to_url = urlutils._posix_local_path_to_url
351
285
self.assertEqual('file:///path/to/foo',
352
286
to_url('/path/to/foo'))
354
self.assertEqual('file:///path/to/foo%2Cbar',
355
to_url('/path/to/foo,bar'))
358
289
result = to_url(u'/path/to/r\xe4ksm\xf6rg\xe5s')
359
290
except UnicodeError:
366
297
from_url = urlutils._posix_local_path_from_url
367
298
self.assertEqual('/path/to/foo',
368
299
from_url('file:///path/to/foo'))
369
self.assertEqual('/path/to/foo',
370
from_url('file:///path/to/foo,branch=foo'))
371
300
self.assertEqual(u'/path/to/r\xe4ksm\xf6rg\xe5s',
372
301
from_url('file:///path/to/r%C3%A4ksm%C3%B6rg%C3%A5s'))
373
302
self.assertEqual(u'/path/to/r\xe4ksm\xf6rg\xe5s',
374
303
from_url('file:///path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
375
self.assertEqual(u'/path/to/r\xe4ksm\xf6rg\xe5s',
376
from_url('file://localhost/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
378
305
self.assertRaises(InvalidURL, from_url, '/path/to/foo')
380
InvalidURL, from_url,
381
'file://remotehost/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s')
383
307
def test_win32_local_path_to_url(self):
384
308
to_url = urlutils._win32_local_path_to_url
457
373
self.assertEqual(('file:///C:', '/foo'), extract('file://', '/C:/foo'))
458
374
self.assertEqual(('file:///d|', '/path'), extract('file://', '/d|/path'))
459
375
self.assertRaises(InvalidURL, extract, 'file://', '/path')
460
# Root drives without slash treated as invalid, see bug #841322
461
self.assertEqual(('file:///C:', '/'), extract('file://', '/C:/'))
462
self.assertRaises(InvalidURL, extract, 'file://', '/C:')
463
# Invalid without drive separator or following forward slash
464
self.assertRaises(InvalidURL, extract, 'file://', '/C')
465
self.assertRaises(InvalidURL, extract, 'file://', '/C:ool')
467
377
def test_split(self):
468
378
# Test bzrlib.urlutils.split()
499
409
self.assertEqual(('path/..', 'foo'), split('path/../foo'))
500
410
self.assertEqual(('../path', 'foo'), split('../path/foo'))
502
def test_split_segment_parameters_raw(self):
503
split_segment_parameters_raw = urlutils.split_segment_parameters_raw
504
self.assertEquals(("/some/path", []),
505
split_segment_parameters_raw("/some/path"))
506
self.assertEquals(("/some/path", ["tip"]),
507
split_segment_parameters_raw("/some/path,tip"))
508
self.assertEquals(("/some,dir/path", ["tip"]),
509
split_segment_parameters_raw("/some,dir/path,tip"))
510
self.assertEquals(("/somedir/path", ["heads%2Ftip"]),
511
split_segment_parameters_raw("/somedir/path,heads%2Ftip"))
512
self.assertEquals(("/somedir/path", ["heads%2Ftip", "bar"]),
513
split_segment_parameters_raw("/somedir/path,heads%2Ftip,bar"))
514
self.assertEquals(("/", ["key1=val1"]),
515
split_segment_parameters_raw(",key1=val1"))
516
self.assertEquals(("foo/", ["key1=val1"]),
517
split_segment_parameters_raw("foo/,key1=val1"))
518
self.assertEquals(("/foo", ["key1=val1"]),
519
split_segment_parameters_raw("foo,key1=val1"))
520
self.assertEquals(("foo/base,la=bla/other/elements", []),
521
split_segment_parameters_raw("foo/base,la=bla/other/elements"))
522
self.assertEquals(("foo/base,la=bla/other/elements", ["a=b"]),
523
split_segment_parameters_raw("foo/base,la=bla/other/elements,a=b"))
525
def test_split_segment_parameters(self):
526
split_segment_parameters = urlutils.split_segment_parameters
527
self.assertEquals(("/some/path", {}),
528
split_segment_parameters("/some/path"))
529
self.assertEquals(("/some/path", {"branch": "tip"}),
530
split_segment_parameters("/some/path,branch=tip"))
531
self.assertEquals(("/some,dir/path", {"branch": "tip"}),
532
split_segment_parameters("/some,dir/path,branch=tip"))
533
self.assertEquals(("/somedir/path", {"ref": "heads%2Ftip"}),
534
split_segment_parameters("/somedir/path,ref=heads%2Ftip"))
535
self.assertEquals(("/somedir/path",
536
{"ref": "heads%2Ftip", "key1": "val1"}),
537
split_segment_parameters(
538
"/somedir/path,ref=heads%2Ftip,key1=val1"))
539
self.assertEquals(("/somedir/path", {"ref": "heads%2F=tip"}),
540
split_segment_parameters("/somedir/path,ref=heads%2F=tip"))
541
self.assertEquals(("/", {"key1": "val1"}),
542
split_segment_parameters(",key1=val1"))
543
self.assertEquals(("foo/", {"key1": "val1"}),
544
split_segment_parameters("foo/,key1=val1"))
545
self.assertEquals(("foo/base,key1=val1/other/elements", {}),
546
split_segment_parameters("foo/base,key1=val1/other/elements"))
547
self.assertEquals(("foo/base,key1=val1/other/elements",
548
{"key2": "val2"}), split_segment_parameters(
549
"foo/base,key1=val1/other/elements,key2=val2"))
551
412
def test_win32_strip_local_trailing_slash(self):
552
413
strip = urlutils._win32_strip_local_trailing_slash
553
414
self.assertEqual('file://', strip('file://'))
812
670
'/bar', '/bar/baz'))
813
671
self.assertEqual('.', urlutils.determine_relative_path(
817
class TestParseURL(TestCase):
819
def test_parse_simple(self):
820
parsed = urlutils.parse_url('http://example.com:80/one')
821
self.assertEquals(('http', None, None, 'example.com', 80, '/one'),
825
parsed = urlutils.parse_url('http://[1:2:3::40]/one')
826
self.assertEquals(('http', None, None, '1:2:3::40', None, '/one'),
829
def test_ipv6_port(self):
830
parsed = urlutils.parse_url('http://[1:2:3::40]:80/one')
831
self.assertEquals(('http', None, None, '1:2:3::40', 80, '/one'),
835
class TestURL(TestCase):
837
def test_parse_simple(self):
838
parsed = urlutils.URL.from_string('http://example.com:80/one')
839
self.assertEquals('http', parsed.scheme)
840
self.assertIs(None, parsed.user)
841
self.assertIs(None, parsed.password)
842
self.assertEquals('example.com', parsed.host)
843
self.assertEquals(80, parsed.port)
844
self.assertEquals('/one', parsed.path)
847
parsed = urlutils.URL.from_string('http://[1:2:3::40]/one')
848
self.assertEquals('http', parsed.scheme)
849
self.assertIs(None, parsed.port)
850
self.assertIs(None, parsed.user)
851
self.assertIs(None, parsed.password)
852
self.assertEquals('1:2:3::40', parsed.host)
853
self.assertEquals('/one', parsed.path)
855
def test_ipv6_port(self):
856
parsed = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
857
self.assertEquals('http', parsed.scheme)
858
self.assertEquals('1:2:3::40', parsed.host)
859
self.assertIs(None, parsed.user)
860
self.assertIs(None, parsed.password)
861
self.assertEquals(80, parsed.port)
862
self.assertEquals('/one', parsed.path)
864
def test_quoted(self):
865
parsed = urlutils.URL.from_string(
866
'http://ro%62ey:h%40t@ex%41mple.com:2222/path')
867
self.assertEquals(parsed.quoted_host, 'ex%41mple.com')
868
self.assertEquals(parsed.host, 'exAmple.com')
869
self.assertEquals(parsed.port, 2222)
870
self.assertEquals(parsed.quoted_user, 'ro%62ey')
871
self.assertEquals(parsed.user, 'robey')
872
self.assertEquals(parsed.quoted_password, 'h%40t')
873
self.assertEquals(parsed.password, 'h@t')
874
self.assertEquals(parsed.path, '/path')
877
parsed1 = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
878
parsed2 = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
879
self.assertEquals(parsed1, parsed2)
880
self.assertEquals(parsed1, parsed1)
881
parsed2.path = '/two'
882
self.assertNotEquals(parsed1, parsed2)
885
parsed = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
887
"<URL('http', None, None, '1:2:3::40', 80, '/one')>",
891
parsed = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
892
self.assertEquals('http://[1:2:3::40]:80/one', str(parsed))
894
def test__combine_paths(self):
895
combine = urlutils.URL._combine_paths
896
self.assertEqual('/home/sarah/project/foo',
897
combine('/home/sarah', 'project/foo'))
898
self.assertEqual('/etc',
899
combine('/home/sarah', '../../etc'))
900
self.assertEqual('/etc',
901
combine('/home/sarah', '../../../etc'))
902
self.assertEqual('/etc',
903
combine('/home/sarah', '/etc'))
905
def test_clone(self):
906
url = urlutils.URL.from_string('http://[1:2:3::40]:80/one')
907
url1 = url.clone("two")
908
self.assertEquals("/one/two", url1.path)
909
url2 = url.clone("/two")
910
self.assertEquals("/two", url2.path)
912
self.assertIsNot(url, url3)
913
self.assertEquals(url, url3)