~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_urlutils.py

  • Committer: Martin Pool
  • Date: 2008-05-08 04:12:06 UTC
  • mto: This revision was merged to the branch mainline in revision 3415.
  • Revision ID: mbp@sourcefrog.net-20080508041206-tkrr8ucmcyrlzkum
Some review cleanups for assertion removal

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2005 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
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
16
16
 
17
17
"""Tests for the urlutils wrapper."""
18
18
 
19
19
import os
 
20
import re
20
21
import sys
21
22
 
22
23
from bzrlib import osutils, urlutils, win32utils
23
 
from bzrlib.errors import InvalidURL, InvalidURLJoin, InvalidRebaseURLs
 
24
import bzrlib
 
25
from bzrlib.errors import InvalidURL, InvalidURLJoin
24
26
from bzrlib.tests import TestCaseInTempDir, TestCase, TestSkipped
25
27
 
26
28
 
27
29
class TestUrlToPath(TestCase):
28
 
 
 
30
    
29
31
    def test_basename(self):
30
32
        # bzrlib.urlutils.basename
31
33
        # Test bzrlib.urlutils.split()
80
82
 
81
83
        # Local paths are assumed to *not* be escaped at all
82
84
        try:
83
 
            u'uni/\xb5'.encode(osutils.get_user_encoding())
 
85
            u'uni/\xb5'.encode(bzrlib.user_encoding)
84
86
        except UnicodeError:
85
 
            # locale cannot handle unicode
 
87
            # locale cannot handle unicode 
86
88
            pass
87
89
        else:
88
90
            norm_file('uni/%C2%B5', u'uni/\xb5')
225
227
        test('file:///bar/foo', 'file:///bar/', 'foo')
226
228
        test('http://host/foo', 'http://host/', 'foo')
227
229
        test('http://host/', 'http://host', '')
228
 
 
 
230
        
229
231
        # Invalid joinings
230
232
        # Cannot go above root
231
233
        # Implicitly at root:
263
265
 
264
266
        # Test joining to a path with a trailing slash
265
267
        test('foo/bar', 'foo/', 'bar')
266
 
 
 
268
        
267
269
        # Invalid joinings
268
270
        # Cannot go above root
269
271
        self.assertRaises(InvalidURLJoin, urlutils.joinpath, '/', '../baz')
299
301
            from_url('file:///path/to/r%C3%A4ksm%C3%B6rg%C3%A5s'))
300
302
        self.assertEqual(u'/path/to/r\xe4ksm\xf6rg\xe5s',
301
303
            from_url('file:///path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
302
 
        self.assertEqual(u'/path/to/r\xe4ksm\xf6rg\xe5s',
303
 
            from_url('file://localhost/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
304
304
 
305
305
        self.assertRaises(InvalidURL, from_url, '/path/to/foo')
306
 
        self.assertRaises(
307
 
            InvalidURL, from_url,
308
 
            'file://remotehost/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s')
309
306
 
310
307
    def test_win32_local_path_to_url(self):
311
308
        to_url = urlutils._win32_local_path_to_url
320
317
        self.assertEqual('file:///C:/path/to/f%20oo',
321
318
            to_url('C:/path/to/f oo'))
322
319
 
323
 
        self.assertEqual('file:///', to_url('/'))
324
 
 
325
320
        try:
326
321
            result = to_url(u'd:/path/to/r\xe4ksm\xf6rg\xe5s')
327
322
        except UnicodeError:
353
348
            from_url('file:///d|/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s'))
354
349
        self.assertEqual(u'D:/path/to/r\xe4ksm\xf6rg\xe5s',
355
350
            from_url('file:///d:/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
356
 
        self.assertEqual('/', from_url('file:///'))
357
351
 
358
352
        self.assertRaises(InvalidURL, from_url, '/path/to/foo')
359
353
        # Not a valid _win32 url, no drive letter
501
495
        self.assertEqual('%C3%A5', urlutils.escape(u'\xe5'))
502
496
        self.assertFalse(isinstance(urlutils.escape(u'\xe5'), unicode))
503
497
 
504
 
    def test_escape_tildes(self):
505
 
        self.assertEqual('~foo', urlutils.escape('~foo'))
506
 
 
507
498
    def test_unescape(self):
508
499
        self.assertEqual('%', urlutils.unescape('%25'))
509
500
        self.assertEqual(u'\xe5', urlutils.unescape('%C3%A5'))
520
511
        def test(expected, base, other):
521
512
            result = urlutils.relative_url(base, other)
522
513
            self.assertEqual(expected, result)
523
 
 
 
514
            
524
515
        test('a', 'http://host/', 'http://host/a')
525
516
        test('http://entirely/different', 'sftp://host/branch',
526
517
                    'http://entirely/different')
535
526
                    'sftp://host/home/jelmer/branch/2b')
536
527
        test('../../branch/feature/%2b', 'http://host/home/jelmer/bar/%2b',
537
528
                    'http://host/home/jelmer/branch/feature/%2b')
538
 
        test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/',
 
529
        test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/', 
539
530
                    'http://host/home/jelmer/branch/feature/2b')
540
531
        # relative_url should preserve a trailing slash
541
532
        test('../../branch/feature/2b/', 'http://host/home/jelmer/bar/2b/',
599
590
 
600
591
        os.chdir(u'dod\xe9')
601
592
 
602
 
        # On Mac OSX this directory is actually:
 
593
        # On Mac OSX this directory is actually: 
603
594
        #   u'/dode\u0301' => '/dode\xcc\x81
604
 
        # but we should normalize it back to
 
595
        # but we should normalize it back to 
605
596
        #   u'/dod\xe9' => '/dod\xc3\xa9'
606
597
        url = urlutils.local_path_to_url('.')
607
598
        self.assertEndsWith(url, '/dod%C3%A9')
623
614
        self.assertEqual("bar", derive("http://foo/bar"))
624
615
        self.assertEqual("bar", derive("bzr+ssh://foo/bar"))
625
616
        self.assertEqual("foo-bar", derive("lp:foo-bar"))
626
 
 
627
 
 
628
 
class TestRebaseURL(TestCase):
629
 
    """Test the behavior of rebase_url."""
630
 
 
631
 
    def test_non_relative(self):
632
 
        result = urlutils.rebase_url('file://foo', 'file://foo',
633
 
                                     'file://foo/bar')
634
 
        self.assertEqual('file://foo', result)
635
 
        result = urlutils.rebase_url('/foo', 'file://foo',
636
 
                                     'file://foo/bar')
637
 
        self.assertEqual('/foo', result)
638
 
 
639
 
    def test_different_ports(self):
640
 
        e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
641
 
                              'foo', 'http://bar:80', 'http://bar:81')
642
 
        self.assertEqual(str(e), "URLs differ by more than path:"
643
 
                         " 'http://bar:80' and 'http://bar:81'")
644
 
 
645
 
    def test_different_hosts(self):
646
 
        e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
647
 
                              'foo', 'http://bar', 'http://baz')
648
 
        self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
649
 
                         " and 'http://baz'")
650
 
 
651
 
    def test_different_protocol(self):
652
 
        e = self.assertRaises(InvalidRebaseURLs, urlutils.rebase_url,
653
 
                              'foo', 'http://bar', 'ftp://bar')
654
 
        self.assertEqual(str(e), "URLs differ by more than path: 'http://bar'"
655
 
                         " and 'ftp://bar'")
656
 
 
657
 
    def test_rebase_success(self):
658
 
        self.assertEqual('../bar', urlutils.rebase_url('bar', 'http://baz/',
659
 
                         'http://baz/qux'))
660
 
        self.assertEqual('qux/bar', urlutils.rebase_url('bar',
661
 
                         'http://baz/qux', 'http://baz/'))
662
 
        self.assertEqual('.', urlutils.rebase_url('foo',
663
 
                         'http://bar/', 'http://bar/foo/'))
664
 
        self.assertEqual('qux/bar', urlutils.rebase_url('../bar',
665
 
                         'http://baz/qux/foo', 'http://baz/'))
666
 
 
667
 
    def test_determine_relative_path(self):
668
 
        self.assertEqual('../../baz/bar',
669
 
                         urlutils.determine_relative_path(
670
 
                         '/qux/quxx', '/baz/bar'))
671
 
        self.assertEqual('..',
672
 
                         urlutils.determine_relative_path(
673
 
                         '/bar/baz', '/bar'))
674
 
        self.assertEqual('baz',
675
 
                         urlutils.determine_relative_path(
676
 
                         '/bar', '/bar/baz'))
677
 
        self.assertEqual('.', urlutils.determine_relative_path(
678
 
                         '/bar', '/bar'))
679
 
 
680
 
 
681
 
class TestParseURL(TestCase):
682
 
 
683
 
    def test_parse_url(self):
684
 
        self.assertEqual(urlutils.parse_url('http://example.com:80/one'),
685
 
            ('http', None, None, 'example.com', 80, '/one'))
686
 
        self.assertEqual(urlutils.parse_url('http://[1:2:3::40]/one'),
687
 
                ('http', None, None, '1:2:3::40', None, '/one'))
688
 
        self.assertEqual(urlutils.parse_url('http://[1:2:3::40]:80/one'),
689
 
                ('http', None, None, '1:2:3::40', 80, '/one'))