164
167
test_one('ab://foo', ('ab', 'foo'))
166
169
def test_dirname(self):
167
# Test breezy.urlutils.dirname()
170
# Test brzlib.urlutils.dirname()
168
171
dirname = urlutils.dirname
169
172
if sys.platform == 'win32':
170
self.assertRaises(urlutils.InvalidURL, dirname,
171
'file:///path/to/foo')
173
self.assertRaises(InvalidURL, dirname, 'file:///path/to/foo')
172
174
self.assertEqual('file:///C|/', dirname('file:///C|/foo'))
173
175
self.assertEqual('file:///C|/', dirname('file:///C|/'))
175
177
self.assertEqual('file:///', dirname('file:///foo'))
176
178
self.assertEqual('file:///', dirname('file:///'))
178
self.assertEqual('http://host/path/to',
179
dirname('http://host/path/to/foo'))
180
self.assertEqual('http://host/path/to',
181
dirname('http://host/path/to/foo/'))
180
self.assertEqual('http://host/path/to', dirname('http://host/path/to/foo'))
181
self.assertEqual('http://host/path/to', dirname('http://host/path/to/foo/'))
182
182
self.assertEqual('http://host/path/to/foo',
183
dirname('http://host/path/to/foo/',
184
exclude_trailing_slash=False))
183
dirname('http://host/path/to/foo/', exclude_trailing_slash=False))
185
184
self.assertEqual('http://host/', dirname('http://host/path'))
186
185
self.assertEqual('http://host/', dirname('http://host/'))
187
186
self.assertEqual('http://host', dirname('http://host'))
188
187
self.assertEqual('http:///nohost', dirname('http:///nohost/path'))
190
189
self.assertEqual('random+scheme://user:pass@ahost:port/',
191
dirname('random+scheme://user:pass@ahost:port/path'))
192
self.assertEqual('random+scheme://user:pass@ahost:port/',
193
dirname('random+scheme://user:pass@ahost:port/path/'))
194
self.assertEqual('random+scheme://user:pass@ahost:port/',
195
dirname('random+scheme://user:pass@ahost:port/'))
190
dirname('random+scheme://user:pass@ahost:port/path'))
191
self.assertEqual('random+scheme://user:pass@ahost:port/',
192
dirname('random+scheme://user:pass@ahost:port/path/'))
193
self.assertEqual('random+scheme://user:pass@ahost:port/',
194
dirname('random+scheme://user:pass@ahost:port/'))
198
197
self.assertEqual('path/to', dirname('path/to/foo'))
199
198
self.assertEqual('path/to', dirname('path/to/foo/'))
200
199
self.assertEqual('path/to/foo',
201
dirname('path/to/foo/', exclude_trailing_slash=False))
200
dirname('path/to/foo/', exclude_trailing_slash=False))
202
201
self.assertEqual('path/..', dirname('path/../foo'))
203
202
self.assertEqual('../path', dirname('../path/foo'))
205
204
def test_is_url(self):
206
205
self.assertTrue(urlutils.is_url('http://foo/bar'))
207
206
self.assertTrue(urlutils.is_url('bzr+ssh://foo/bar'))
292
291
# Invalid joinings
293
292
# Cannot go above root
294
self.assertRaises(urlutils.InvalidURLJoin, urlutils.joinpath, '/',
296
self.assertRaises(urlutils.InvalidURLJoin, urlutils.joinpath, '/',
298
self.assertRaises(urlutils.InvalidURLJoin, urlutils.joinpath, '/',
293
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '../baz')
294
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '..')
295
self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '/..')
301
297
def test_join_segment_parameters_raw(self):
302
298
join_segment_parameters_raw = urlutils.join_segment_parameters_raw
303
self.assertEqual("/somedir/path",
304
join_segment_parameters_raw("/somedir/path"))
305
self.assertEqual("/somedir/path,rawdata",
306
join_segment_parameters_raw(
307
"/somedir/path", "rawdata"))
308
self.assertRaises(urlutils.InvalidURLJoin,
309
join_segment_parameters_raw, "/somedir/path",
310
"rawdata1,rawdata2,rawdata3")
299
self.assertEqual("/somedir/path",
300
join_segment_parameters_raw("/somedir/path"))
301
self.assertEqual("/somedir/path,rawdata",
302
join_segment_parameters_raw("/somedir/path", "rawdata"))
303
self.assertRaises(InvalidURLJoin,
304
join_segment_parameters_raw, "/somedir/path",
305
"rawdata1,rawdata2,rawdata3")
311
306
self.assertEqual("/somedir/path,bla,bar",
312
join_segment_parameters_raw(
313
"/somedir/path", "bla", "bar"))
315
"/somedir,exist=some/path,bla,bar",
307
join_segment_parameters_raw("/somedir/path", "bla", "bar"))
308
self.assertEqual("/somedir,exist=some/path,bla,bar",
316
309
join_segment_parameters_raw("/somedir,exist=some/path",
318
self.assertRaises(TypeError, join_segment_parameters_raw,
311
self.assertRaises(TypeError, join_segment_parameters_raw,
321
314
def test_join_segment_parameters(self):
322
315
join_segment_parameters = urlutils.join_segment_parameters
323
self.assertEqual("/somedir/path",
324
join_segment_parameters("/somedir/path", {}))
326
"/somedir/path,key1=val1",
316
self.assertEqual("/somedir/path",
317
join_segment_parameters("/somedir/path", {}))
318
self.assertEqual("/somedir/path,key1=val1",
327
319
join_segment_parameters("/somedir/path", {"key1": "val1"}))
328
self.assertRaises(urlutils.InvalidURLJoin,
329
join_segment_parameters, "/somedir/path",
330
{"branch": "brr,brr,brr"})
332
urlutils.InvalidURLJoin,
320
self.assertRaises(InvalidURLJoin,
321
join_segment_parameters, "/somedir/path",
322
{"branch": "brr,brr,brr"})
323
self.assertRaises(InvalidURLJoin,
333
324
join_segment_parameters, "/somedir/path", {"key1=val1": "val2"})
334
325
self.assertEqual("/somedir/path,key1=val1,key2=val2",
335
join_segment_parameters("/somedir/path", {
336
"key1": "val1", "key2": "val2"}))
326
join_segment_parameters("/somedir/path", {
327
"key1": "val1", "key2": "val2"}))
337
328
self.assertEqual("/somedir/path,key1=val1,key2=val2",
338
join_segment_parameters("/somedir/path,key1=val1", {
329
join_segment_parameters("/somedir/path,key1=val1", {
340
331
self.assertEqual("/somedir/path,key1=val2",
341
join_segment_parameters("/somedir/path,key1=val1", {
332
join_segment_parameters("/somedir/path,key1=val1", {
343
334
self.assertEqual("/somedir,exist=some/path,key1=val1",
344
join_segment_parameters("/somedir,exist=some/path",
347
"/,key1=val1,key2=val2",
335
join_segment_parameters("/somedir,exist=some/path",
337
self.assertEqual("/,key1=val1,key2=val2",
348
338
join_segment_parameters("/,key1=val1", {"key2": "val2"}))
349
339
self.assertRaises(TypeError,
350
join_segment_parameters, "/,key1=val1", {"foo": 42})
340
join_segment_parameters, "/,key1=val1", {"foo": 42})
352
342
def test_function_type(self):
353
343
if sys.platform == 'win32':
354
344
self.assertEqual(urlutils._win32_local_path_to_url,
355
urlutils.local_path_to_url)
345
urlutils.local_path_to_url)
356
346
self.assertEqual(urlutils._win32_local_path_from_url,
357
urlutils.local_path_from_url)
347
urlutils.local_path_from_url)
359
349
self.assertEqual(urlutils._posix_local_path_to_url,
360
urlutils.local_path_to_url)
350
urlutils.local_path_to_url)
361
351
self.assertEqual(urlutils._posix_local_path_from_url,
362
urlutils.local_path_from_url)
352
urlutils.local_path_from_url)
364
354
def test_posix_local_path_to_url(self):
365
355
to_url = urlutils._posix_local_path_to_url
366
356
self.assertEqual('file:///path/to/foo',
367
to_url('/path/to/foo'))
357
to_url('/path/to/foo'))
369
359
self.assertEqual('file:///path/to/foo%2Cbar',
370
to_url('/path/to/foo,bar'))
360
to_url('/path/to/foo,bar'))
373
363
result = to_url(u'/path/to/r\xe4ksm\xf6rg\xe5s')
407
396
# self.assertEqual('file:///C:/path/to/foo%20',
408
397
# to_url('C:/path/to/foo '))
409
398
self.assertEqual('file:///C:/path/to/f%20oo',
410
to_url('C:/path/to/f oo'))
399
to_url('C:/path/to/f oo'))
412
401
self.assertEqual('file:///', to_url('/'))
414
403
self.assertEqual('file:///C:/path/to/foo%2Cbar',
415
to_url('C:/path/to/foo,bar'))
404
to_url('C:/path/to/foo,bar'))
417
406
result = to_url(u'd:/path/to/r\xe4ksm\xf6rg\xe5s')
418
407
except UnicodeError:
419
408
raise TestSkipped("local encoding cannot handle unicode")
422
'file:///D:/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
423
self.assertIsInstance(result, str)
410
self.assertEqual('file:///D:/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
411
self.assertFalse(isinstance(result, unicode))
425
413
def test_win32_unc_path_to_url(self):
426
414
self.requireFeature(features.win32_feature)
427
415
to_url = urlutils._win32_local_path_to_url
428
416
self.assertEqual('file://HOST/path',
429
to_url(r'\\HOST\path'))
417
to_url(r'\\HOST\path'))
430
418
self.assertEqual('file://HOST/path',
431
to_url('//HOST/path'))
419
to_url('//HOST/path'))
434
422
result = to_url(u'//HOST/path/to/r\xe4ksm\xf6rg\xe5s')
435
423
except UnicodeError:
436
424
raise TestSkipped("local encoding cannot handle unicode")
439
'file://HOST/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
440
self.assertFalse(isinstance(result, str))
426
self.assertEqual('file://HOST/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
427
self.assertFalse(isinstance(result, unicode))
442
429
def test_win32_local_path_from_url(self):
443
430
from_url = urlutils._win32_local_path_from_url
444
431
self.assertEqual('C:/path/to/foo',
445
from_url('file:///C|/path/to/foo'))
447
u'D:/path/to/r\xe4ksm\xf6rg\xe5s',
432
from_url('file:///C|/path/to/foo'))
433
self.assertEqual(u'D:/path/to/r\xe4ksm\xf6rg\xe5s',
448
434
from_url('file:///d|/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s'))
450
u'D:/path/to/r\xe4ksm\xf6rg\xe5s',
435
self.assertEqual(u'D:/path/to/r\xe4ksm\xf6rg\xe5s',
451
436
from_url('file:///d:/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
452
437
self.assertEqual('/', from_url('file:///'))
453
438
self.assertEqual('C:/path/to/foo',
454
from_url('file:///C|/path/to/foo,branch=foo'))
439
from_url('file:///C|/path/to/foo,branch=foo'))
456
self.assertRaises(urlutils.InvalidURL, from_url, 'file:///C:')
457
self.assertRaises(urlutils.InvalidURL, from_url, 'file:///c')
458
self.assertRaises(urlutils.InvalidURL, from_url, '/path/to/foo')
441
self.assertRaises(InvalidURL, from_url, 'file:///C:')
442
self.assertRaises(InvalidURL, from_url, 'file:///c')
443
self.assertRaises(InvalidURL, from_url, '/path/to/foo')
459
444
# Not a valid _win32 url, no drive letter
460
self.assertRaises(urlutils.InvalidURL, from_url, 'file:///path/to/foo')
445
self.assertRaises(InvalidURL, from_url, 'file:///path/to/foo')
462
447
def test_win32_unc_path_from_url(self):
463
448
from_url = urlutils._win32_local_path_from_url
464
449
self.assertEqual('//HOST/path', from_url('file://HOST/path'))
465
450
self.assertEqual('//HOST/path',
466
from_url('file://HOST/path,branch=foo'))
451
from_url('file://HOST/path,branch=foo'))
467
452
# despite IE allows 2, 4, 5 and 6 slashes in URL to another machine
468
453
# we want to use only 2 slashes
469
454
# Firefox understand only 5 slashes in URL, but it's ugly
470
self.assertRaises(urlutils.InvalidURL, from_url, 'file:////HOST/path')
471
self.assertRaises(urlutils.InvalidURL, from_url, 'file://///HOST/path')
472
self.assertRaises(urlutils.InvalidURL, from_url,
473
'file://////HOST/path')
455
self.assertRaises(InvalidURL, from_url, 'file:////HOST/path')
456
self.assertRaises(InvalidURL, from_url, 'file://///HOST/path')
457
self.assertRaises(InvalidURL, from_url, 'file://////HOST/path')
474
458
# check for file://C:/ instead of file:///C:/
475
self.assertRaises(urlutils.InvalidURL, from_url, 'file://C:/path')
459
self.assertRaises(InvalidURL, from_url, 'file://C:/path')
477
461
def test_win32_extract_drive_letter(self):
478
462
extract = urlutils._win32_extract_drive_letter
479
463
self.assertEqual(('file:///C:', '/foo'), extract('file://', '/C:/foo'))
480
self.assertEqual(('file:///d|', '/path'),
481
extract('file://', '/d|/path'))
482
self.assertRaises(urlutils.InvalidURL, extract, 'file://', '/path')
464
self.assertEqual(('file:///d|', '/path'), extract('file://', '/d|/path'))
465
self.assertRaises(InvalidURL, extract, 'file://', '/path')
483
466
# Root drives without slash treated as invalid, see bug #841322
484
467
self.assertEqual(('file:///C:', '/'), extract('file://', '/C:/'))
485
self.assertRaises(urlutils.InvalidURL, extract, 'file://', '/C:')
468
self.assertRaises(InvalidURL, extract, 'file://', '/C:')
486
469
# Invalid without drive separator or following forward slash
487
self.assertRaises(urlutils.InvalidURL, extract, 'file://', '/C')
488
self.assertRaises(urlutils.InvalidURL, extract, 'file://', '/C:ool')
470
self.assertRaises(InvalidURL, extract, 'file://', '/C')
471
self.assertRaises(InvalidURL, extract, 'file://', '/C:ool')
490
473
def test_split(self):
491
# Test breezy.urlutils.split()
474
# Test brzlib.urlutils.split()
492
475
split = urlutils.split
493
476
if sys.platform == 'win32':
494
self.assertRaises(urlutils.InvalidURL, split,
495
'file:///path/to/foo')
477
self.assertRaises(InvalidURL, split, 'file:///path/to/foo')
496
478
self.assertEqual(('file:///C|/', 'foo'), split('file:///C|/foo'))
497
479
self.assertEqual(('file:///C:/', ''), split('file:///C:/'))
499
481
self.assertEqual(('file:///', 'foo'), split('file:///foo'))
500
482
self.assertEqual(('file:///', ''), split('file:///'))
502
self.assertEqual(('http://host/path/to', 'foo'),
503
split('http://host/path/to/foo'))
504
self.assertEqual(('http://host/path/to', 'foo'),
505
split('http://host/path/to/foo/'))
507
('http://host/path/to/foo', ''),
484
self.assertEqual(('http://host/path/to', 'foo'), split('http://host/path/to/foo'))
485
self.assertEqual(('http://host/path/to', 'foo'), split('http://host/path/to/foo/'))
486
self.assertEqual(('http://host/path/to/foo', ''),
508
487
split('http://host/path/to/foo/', exclude_trailing_slash=False))
509
488
self.assertEqual(('http://host/', 'path'), split('http://host/path'))
510
489
self.assertEqual(('http://host/', ''), split('http://host/'))
511
490
self.assertEqual(('http://host', ''), split('http://host'))
512
self.assertEqual(('http:///nohost', 'path'),
513
split('http:///nohost/path'))
491
self.assertEqual(('http:///nohost', 'path'), split('http:///nohost/path'))
515
493
self.assertEqual(('random+scheme://user:pass@ahost:port/', 'path'),
516
split('random+scheme://user:pass@ahost:port/path'))
494
split('random+scheme://user:pass@ahost:port/path'))
517
495
self.assertEqual(('random+scheme://user:pass@ahost:port/', 'path'),
518
split('random+scheme://user:pass@ahost:port/path/'))
496
split('random+scheme://user:pass@ahost:port/path/'))
519
497
self.assertEqual(('random+scheme://user:pass@ahost:port/', ''),
520
split('random+scheme://user:pass@ahost:port/'))
498
split('random+scheme://user:pass@ahost:port/'))
523
501
self.assertEqual(('path/to', 'foo'), split('path/to/foo'))
524
502
self.assertEqual(('path/to', 'foo'), split('path/to/foo/'))
525
503
self.assertEqual(('path/to/foo', ''),
526
split('path/to/foo/', exclude_trailing_slash=False))
504
split('path/to/foo/', exclude_trailing_slash=False))
527
505
self.assertEqual(('path/..', 'foo'), split('path/../foo'))
528
506
self.assertEqual(('../path', 'foo'), split('../path/foo'))
530
def test_strip_segment_parameters(self):
531
strip_segment_parameters = urlutils.strip_segment_parameters
532
# Check relative references with absolute paths
533
self.assertEqual("/some/path",
534
strip_segment_parameters("/some/path"))
535
self.assertEqual("/some/path",
536
strip_segment_parameters("/some/path,tip"))
537
self.assertEqual("/some,dir/path",
538
strip_segment_parameters("/some,dir/path,tip"))
541
strip_segment_parameters("/somedir/path,heads%2Ftip"))
544
strip_segment_parameters("/somedir/path,heads%2Ftip,bar"))
545
# Check relative references with relative paths
546
self.assertEqual("", strip_segment_parameters(",key1=val1"))
547
self.assertEqual("foo/", strip_segment_parameters("foo/,key1=val1"))
548
self.assertEqual("foo", strip_segment_parameters("foo,key1=val1"))
550
"foo/base,la=bla/other/elements",
551
strip_segment_parameters("foo/base,la=bla/other/elements"))
553
"foo/base,la=bla/other/elements",
554
strip_segment_parameters("foo/base,la=bla/other/elements,a=b"))
555
# TODO: Check full URLs as well as relative references
557
508
def test_split_segment_parameters_raw(self):
558
509
split_segment_parameters_raw = urlutils.split_segment_parameters_raw
559
510
# Check relative references with absolute paths
560
511
self.assertEqual(("/some/path", []),
561
split_segment_parameters_raw("/some/path"))
512
split_segment_parameters_raw("/some/path"))
562
513
self.assertEqual(("/some/path", ["tip"]),
563
split_segment_parameters_raw("/some/path,tip"))
514
split_segment_parameters_raw("/some/path,tip"))
564
515
self.assertEqual(("/some,dir/path", ["tip"]),
565
split_segment_parameters_raw("/some,dir/path,tip"))
567
("/somedir/path", ["heads%2Ftip"]),
516
split_segment_parameters_raw("/some,dir/path,tip"))
517
self.assertEqual(("/somedir/path", ["heads%2Ftip"]),
568
518
split_segment_parameters_raw("/somedir/path,heads%2Ftip"))
570
("/somedir/path", ["heads%2Ftip", "bar"]),
519
self.assertEqual(("/somedir/path", ["heads%2Ftip", "bar"]),
571
520
split_segment_parameters_raw("/somedir/path,heads%2Ftip,bar"))
572
521
# Check relative references with relative paths
573
522
self.assertEqual(("", ["key1=val1"]),
574
split_segment_parameters_raw(",key1=val1"))
523
split_segment_parameters_raw(",key1=val1"))
575
524
self.assertEqual(("foo/", ["key1=val1"]),
576
split_segment_parameters_raw("foo/,key1=val1"))
525
split_segment_parameters_raw("foo/,key1=val1"))
577
526
self.assertEqual(("foo", ["key1=val1"]),
578
split_segment_parameters_raw("foo,key1=val1"))
580
("foo/base,la=bla/other/elements", []),
527
split_segment_parameters_raw("foo,key1=val1"))
528
self.assertEqual(("foo/base,la=bla/other/elements", []),
581
529
split_segment_parameters_raw("foo/base,la=bla/other/elements"))
583
("foo/base,la=bla/other/elements", ["a=b"]),
530
self.assertEqual(("foo/base,la=bla/other/elements", ["a=b"]),
584
531
split_segment_parameters_raw("foo/base,la=bla/other/elements,a=b"))
585
532
# TODO: Check full URLs as well as relative references
588
535
split_segment_parameters = urlutils.split_segment_parameters
589
536
# Check relative references with absolute paths
590
537
self.assertEqual(("/some/path", {}),
591
split_segment_parameters("/some/path"))
538
split_segment_parameters("/some/path"))
592
539
self.assertEqual(("/some/path", {"branch": "tip"}),
593
split_segment_parameters("/some/path,branch=tip"))
540
split_segment_parameters("/some/path,branch=tip"))
594
541
self.assertEqual(("/some,dir/path", {"branch": "tip"}),
595
split_segment_parameters("/some,dir/path,branch=tip"))
597
("/somedir/path", {"ref": "heads%2Ftip"}),
542
split_segment_parameters("/some,dir/path,branch=tip"))
543
self.assertEqual(("/somedir/path", {"ref": "heads%2Ftip"}),
598
544
split_segment_parameters("/somedir/path,ref=heads%2Ftip"))
599
545
self.assertEqual(("/somedir/path",
600
{"ref": "heads%2Ftip", "key1": "val1"}),
601
split_segment_parameters(
602
"/somedir/path,ref=heads%2Ftip,key1=val1"))
604
("/somedir/path", {"ref": "heads%2F=tip"}),
546
{"ref": "heads%2Ftip", "key1": "val1"}),
547
split_segment_parameters(
548
"/somedir/path,ref=heads%2Ftip,key1=val1"))
549
self.assertEqual(("/somedir/path", {"ref": "heads%2F=tip"}),
605
550
split_segment_parameters("/somedir/path,ref=heads%2F=tip"))
606
551
# Check relative references with relative paths
607
552
self.assertEqual(("", {"key1": "val1"}),
608
split_segment_parameters(",key1=val1"))
553
split_segment_parameters(",key1=val1"))
609
554
self.assertEqual(("foo/", {"key1": "val1"}),
610
split_segment_parameters("foo/,key1=val1"))
612
("foo/base,key1=val1/other/elements", {}),
555
split_segment_parameters("foo/,key1=val1"))
556
self.assertEqual(("foo/base,key1=val1/other/elements", {}),
613
557
split_segment_parameters("foo/base,key1=val1/other/elements"))
614
558
self.assertEqual(("foo/base,key1=val1/other/elements",
615
{"key2": "val2"}), split_segment_parameters(
616
"foo/base,key1=val1/other/elements,key2=val2"))
618
urlutils.InvalidURL, split_segment_parameters,
559
{"key2": "val2"}), split_segment_parameters(
560
"foo/base,key1=val1/other/elements,key2=val2"))
620
561
# TODO: Check full URLs as well as relative references
622
563
def test_win32_strip_local_trailing_slash(self):
731
672
test('a', 'http://host/', 'http://host/a')
732
673
test('http://entirely/different', 'sftp://host/branch',
733
'http://entirely/different')
674
'http://entirely/different')
734
675
test('../person/feature', 'http://host/branch/mainline',
735
'http://host/branch/person/feature')
676
'http://host/branch/person/feature')
736
677
test('..', 'http://host/branch', 'http://host/')
737
test('http://host2/branch', 'http://host1/branch',
738
'http://host2/branch')
678
test('http://host2/branch', 'http://host1/branch', 'http://host2/branch')
739
679
test('.', 'http://host1/branch', 'http://host1/branch')
740
680
test('../../../branch/2b', 'file:///home/jelmer/foo/bar/2b',
741
'file:///home/jelmer/branch/2b')
681
'file:///home/jelmer/branch/2b')
742
682
test('../../branch/2b', 'sftp://host/home/jelmer/bar/2b',
743
'sftp://host/home/jelmer/branch/2b')
683
'sftp://host/home/jelmer/branch/2b')
744
684
test('../../branch/feature/%2b', 'http://host/home/jelmer/bar/%2b',
745
'http://host/home/jelmer/branch/feature/%2b')
685
'http://host/home/jelmer/branch/feature/%2b')
746
686
test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/',
747
'http://host/home/jelmer/branch/feature/2b')
687
'http://host/home/jelmer/branch/feature/2b')
748
688
# relative_url should preserve a trailing slash
749
689
test('../../branch/feature/2b/', 'http://host/home/jelmer/bar/2b/',
750
'http://host/home/jelmer/branch/feature/2b/')
690
'http://host/home/jelmer/branch/feature/2b/')
751
691
test('../../branch/feature/2b/', 'http://host/home/jelmer/bar/2b',
752
'http://host/home/jelmer/branch/feature/2b/')
692
'http://host/home/jelmer/branch/feature/2b/')
754
694
# TODO: treat http://host as http://host/
755
695
# relative_url is typically called from a branch.base or
756
696
# transport.base which always ends with a /
757
# test('a', 'http://host', 'http://host/a')
697
#test('a', 'http://host', 'http://host/a')
758
698
test('http://host/a', 'http://host', 'http://host/a')
759
# test('.', 'http://host', 'http://host/')
699
#test('.', 'http://host', 'http://host/')
760
700
test('http://host/', 'http://host', 'http://host/')
761
# test('.', 'http://host/', 'http://host')
701
#test('.', 'http://host/', 'http://host')
762
702
test('http://host', 'http://host/', 'http://host')
764
704
# On Windows file:///C:/path/to and file:///D:/other/path
842
785
self.assertEqual('/foo', result)
844
787
def test_different_ports(self):
845
e = self.assertRaises(urlutils.InvalidRebaseURLs, urlutils.rebase_url,
788
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
846
789
'foo', 'http://bar:80', 'http://bar:81')
847
790
self.assertEqual(str(e), "URLs differ by more than path:"
848
791
" 'http://bar:80' and 'http://bar:81'")
850
793
def test_different_hosts(self):
851
e = self.assertRaises(urlutils.InvalidRebaseURLs, urlutils.rebase_url,
794
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
852
795
'foo', 'http://bar', 'http://baz')
853
796
self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
854
797
" and 'http://baz'")
856
799
def test_different_protocol(self):
857
e = self.assertRaises(urlutils.InvalidRebaseURLs, urlutils.rebase_url,
800
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
858
801
'foo', 'http://bar', 'ftp://bar')
859
802
self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
860
803
" and 'ftp://bar'")
862
805
def test_rebase_success(self):
863
806
self.assertEqual('../bar', urlutils.rebase_url('bar', 'http://baz/',
867
urlutils.rebase_url('bar', 'http://baz/qux', 'http://baz/'))
869
'.', urlutils.rebase_url('foo', 'http://bar/', 'http://bar/foo/'))
872
urlutils.rebase_url('../bar', 'http://baz/qux/foo', 'http://baz/'))
808
self.assertEqual('qux/bar', urlutils.rebase_url('bar',
809
'http://baz/qux', 'http://baz/'))
810
self.assertEqual('.', urlutils.rebase_url('foo',
811
'http://bar/', 'http://bar/foo/'))
812
self.assertEqual('qux/bar', urlutils.rebase_url('../bar',
813
'http://baz/qux/foo', 'http://baz/'))
874
815
def test_determine_relative_path(self):
875
816
self.assertEqual('../../baz/bar',
876
817
urlutils.determine_relative_path(
877
'/qux/quxx', '/baz/bar'))
818
'/qux/quxx', '/baz/bar'))
878
819
self.assertEqual('..',
879
820
urlutils.determine_relative_path(
881
822
self.assertEqual('baz',
882
823
urlutils.determine_relative_path(
884
825
self.assertEqual('.', urlutils.determine_relative_path(
1023
955
def test_same_url_posix(self):
1024
956
self._with_posix_paths()
1025
957
self.assertEqual("",
1026
urlutils.file_relpath("file:///a", "file:///a"))
1027
self.assertEqual("",
1028
urlutils.file_relpath("file:///a", "file:///a/"))
1029
self.assertEqual("",
1030
urlutils.file_relpath("file:///a/", "file:///a"))
958
urlutils.file_relpath("file:///a", "file:///a"))
960
urlutils.file_relpath("file:///a", "file:///a/"))
962
urlutils.file_relpath("file:///a/", "file:///a"))
1032
964
def test_same_url_win32(self):
1033
965
self._with_win32_paths()
1034
966
self.assertEqual("",
1035
urlutils.file_relpath("file:///A:/", "file:///A:/"))
1036
self.assertEqual("",
1037
urlutils.file_relpath("file:///A|/", "file:///A:/"))
1039
"", urlutils.file_relpath("file:///A:/b/", "file:///A:/b/"))
1041
"", urlutils.file_relpath("file:///A:/b", "file:///A:/b/"))
1043
"", urlutils.file_relpath("file:///A:/b/", "file:///A:/b"))
967
urlutils.file_relpath("file:///A:/", "file:///A:/"))
969
urlutils.file_relpath("file:///A|/", "file:///A:/"))
971
urlutils.file_relpath("file:///A:/b/", "file:///A:/b/"))
973
urlutils.file_relpath("file:///A:/b", "file:///A:/b/"))
975
urlutils.file_relpath("file:///A:/b/", "file:///A:/b"))
1045
977
def test_child_posix(self):
1046
978
self._with_posix_paths()
1048
"b", urlutils.file_relpath("file:///a", "file:///a/b"))
1050
"b", urlutils.file_relpath("file:///a/", "file:///a/b"))
1052
"b/c", urlutils.file_relpath("file:///a", "file:///a/b/c"))
979
self.assertEqual("b",
980
urlutils.file_relpath("file:///a", "file:///a/b"))
981
self.assertEqual("b",
982
urlutils.file_relpath("file:///a/", "file:///a/b"))
983
self.assertEqual("b/c",
984
urlutils.file_relpath("file:///a", "file:///a/b/c"))
1054
986
def test_child_win32(self):
1055
987
self._with_win32_paths()
1057
"b", urlutils.file_relpath("file:///A:/", "file:///A:/b"))
1059
"b", urlutils.file_relpath("file:///A|/", "file:///A:/b"))
1061
"c", urlutils.file_relpath("file:///A:/b", "file:///A:/b/c"))
1063
"c", urlutils.file_relpath("file:///A:/b/", "file:///A:/b/c"))
1065
"c/d", urlutils.file_relpath("file:///A:/b", "file:///A:/b/c/d"))
988
self.assertEqual("b",
989
urlutils.file_relpath("file:///A:/", "file:///A:/b"))
990
self.assertEqual("b",
991
urlutils.file_relpath("file:///A|/", "file:///A:/b"))
992
self.assertEqual("c",
993
urlutils.file_relpath("file:///A:/b", "file:///A:/b/c"))
994
self.assertEqual("c",
995
urlutils.file_relpath("file:///A:/b/", "file:///A:/b/c"))
996
self.assertEqual("c/d",
997
urlutils.file_relpath("file:///A:/b", "file:///A:/b/c/d"))
1067
999
def test_sibling_posix(self):
1068
1000
self._with_posix_paths()
1001
self.assertRaises(PathNotChild,
1071
1002
urlutils.file_relpath, "file:///a/b", "file:///a/c")
1003
self.assertRaises(PathNotChild,
1074
1004
urlutils.file_relpath, "file:///a/b/", "file:///a/c")
1005
self.assertRaises(PathNotChild,
1077
1006
urlutils.file_relpath, "file:///a/b/", "file:///a/c/")
1079
1008
def test_sibling_win32(self):
1080
1009
self._with_win32_paths()
1010
self.assertRaises(PathNotChild,
1083
1011
urlutils.file_relpath, "file:///A:/b", "file:///A:/c")
1012
self.assertRaises(PathNotChild,
1086
1013
urlutils.file_relpath, "file:///A:/b/", "file:///A:/c")
1014
self.assertRaises(PathNotChild,
1089
1015
urlutils.file_relpath, "file:///A:/b/", "file:///A:/c/")
1091
1017
def test_parent_posix(self):
1092
1018
self._with_posix_paths()
1093
1019
self.assertRaises(PathNotChild,
1094
urlutils.file_relpath, "file:///a/b", "file:///a")
1020
urlutils.file_relpath, "file:///a/b", "file:///a")
1095
1021
self.assertRaises(PathNotChild,
1096
urlutils.file_relpath, "file:///a/b", "file:///a/")
1022
urlutils.file_relpath, "file:///a/b", "file:///a/")
1098
1024
def test_parent_win32(self):
1099
1025
self._with_win32_paths()
1026
self.assertRaises(PathNotChild,
1102
1027
urlutils.file_relpath, "file:///A:/b", "file:///A:/")
1028
self.assertRaises(PathNotChild,
1105
1029
urlutils.file_relpath, "file:///A:/b/c", "file:///A:/b")