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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
"""Tests for the urlutils wrapper."""
23
23
from bzrlib import osutils, urlutils, win32utils
25
from bzrlib.errors import InvalidURL, InvalidURLJoin
24
from bzrlib.errors import InvalidURL, InvalidURLJoin, InvalidRebaseURLs
26
25
from bzrlib.tests import TestCaseInTempDir, TestCase, TestSkipped
29
28
class TestUrlToPath(TestCase):
31
30
def test_basename(self):
32
31
# bzrlib.urlutils.basename
33
32
# Test bzrlib.urlutils.split()
316
316
self.assertEqual('file:///C:/path/to/f%20oo',
317
317
to_url('C:/path/to/f oo'))
319
self.assertEqual('file:///', to_url('/'))
320
322
result = to_url(u'd:/path/to/r\xe4ksm\xf6rg\xe5s')
321
323
except UnicodeError:
322
324
raise TestSkipped("local encoding cannot handle unicode")
324
326
self.assertEqual('file:///D:/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
327
self.assertFalse(isinstance(result, unicode))
326
329
def test_win32_unc_path_to_url(self):
327
330
to_url = urlutils._win32_local_path_to_url
346
349
from_url('file:///d|/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s'))
347
350
self.assertEqual(u'D:/path/to/r\xe4ksm\xf6rg\xe5s',
348
351
from_url('file:///d:/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
352
self.assertEqual('/', from_url('file:///'))
350
354
self.assertRaises(InvalidURL, from_url, '/path/to/foo')
351
355
# Not a valid _win32 url, no drive letter
491
495
def test_escape(self):
492
496
self.assertEqual('%25', urlutils.escape('%'))
493
497
self.assertEqual('%C3%A5', urlutils.escape(u'\xe5'))
498
self.assertFalse(isinstance(urlutils.escape(u'\xe5'), unicode))
500
def test_escape_tildes(self):
501
self.assertEqual('~foo', urlutils.escape('~foo'))
495
503
def test_unescape(self):
496
504
self.assertEqual('%', urlutils.unescape('%25'))
508
516
def test(expected, base, other):
509
517
result = urlutils.relative_url(base, other)
510
518
self.assertEqual(expected, result)
512
520
test('a', 'http://host/', 'http://host/a')
513
521
test('http://entirely/different', 'sftp://host/branch',
514
522
'http://entirely/different')
523
531
'sftp://host/home/jelmer/branch/2b')
524
532
test('../../branch/feature/%2b', 'http://host/home/jelmer/bar/%2b',
525
533
'http://host/home/jelmer/branch/feature/%2b')
526
test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/',
534
test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/',
527
535
'http://host/home/jelmer/branch/feature/2b')
528
536
# relative_url should preserve a trailing slash
529
537
test('../../branch/feature/2b/', 'http://host/home/jelmer/bar/2b/',
541
549
#test('.', 'http://host/', 'http://host')
542
550
test('http://host', 'http://host/', 'http://host')
552
# On Windows file:///C:/path/to and file:///D:/other/path
553
# should not use relative url over the non-existent '/' directory.
554
if sys.platform == 'win32':
556
test('../../other/path',
557
'file:///C:/path/to', 'file:///C:/other/path')
558
#~next two tests is failed, i.e. urlutils.relative_url expects
559
#~to see normalized file URLs?
560
#~test('../../other/path',
561
#~ 'file:///C:/path/to', 'file:///c:/other/path')
562
#~test('../../other/path',
563
#~ 'file:///C:/path/to', 'file:///C|/other/path')
565
# check UNC paths too
566
test('../../other/path',
567
'file://HOST/base/path/to', 'file://HOST/base/other/path')
568
# on different drives
569
test('file:///D:/other/path',
570
'file:///C:/path/to', 'file:///D:/other/path')
571
# TODO: strictly saying in UNC path //HOST/base is full analog
572
# of drive letter for hard disk, and this situation is also
573
# should be exception from rules. [bialix 20071221]
545
576
class TestCwdToURL(TestCaseInTempDir):
546
577
"""Test that local_path_to_url works base on the cwd"""
565
596
os.chdir(u'dod\xe9')
567
# On Mac OSX this directory is actually:
598
# On Mac OSX this directory is actually:
568
599
# u'/dode\u0301' => '/dode\xcc\x81
569
# but we should normalize it back to
600
# but we should normalize it back to
570
601
# u'/dod\xe9' => '/dod\xc3\xa9'
571
602
url = urlutils.local_path_to_url('.')
572
603
self.assertEndsWith(url, '/dod%C3%A9')
588
619
self.assertEqual("bar", derive("http://foo/bar"))
589
620
self.assertEqual("bar", derive("bzr+ssh://foo/bar"))
590
621
self.assertEqual("foo-bar", derive("lp:foo-bar"))
624
class TestRebaseURL(TestCase):
625
"""Test the behavior of rebase_url."""
627
def test_non_relative(self):
628
result = urlutils.rebase_url('file://foo', 'file://foo',
630
self.assertEqual('file://foo', result)
631
result = urlutils.rebase_url('/foo', 'file://foo',
633
self.assertEqual('/foo', result)
635
def test_different_ports(self):
636
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
637
'foo', 'http://bar:80', 'http://bar:81')
638
self.assertEqual(str(e), "URLs differ by more than path:"
639
" 'http://bar:80' and 'http://bar:81'")
641
def test_different_hosts(self):
642
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
643
'foo', 'http://bar', 'http://baz')
644
self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
647
def test_different_protocol(self):
648
e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
649
'foo', 'http://bar', 'ftp://bar')
650
self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
653
def test_rebase_success(self):
654
self.assertEqual('../bar', urlutils.rebase_url('bar', 'http://baz/',
656
self.assertEqual('qux/bar', urlutils.rebase_url('bar',
657
'http://baz/qux', 'http://baz/'))
658
self.assertEqual('.', urlutils.rebase_url('foo',
659
'http://bar/', 'http://bar/foo/'))
660
self.assertEqual('qux/bar', urlutils.rebase_url('../bar',
661
'http://baz/qux/foo', 'http://baz/'))
663
def test_determine_relative_path(self):
664
self.assertEqual('../../baz/bar',
665
urlutils.determine_relative_path(
666
'/qux/quxx', '/baz/bar'))
667
self.assertEqual('..',
668
urlutils.determine_relative_path(
670
self.assertEqual('baz',
671
urlutils.determine_relative_path(
673
self.assertEqual('.', urlutils.determine_relative_path(