~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_urlutils.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-06-25 17:46:47 UTC
  • mfrom: (2547.2.1 jam-integration)
  • Revision ID: pqm@pqm.ubuntu.com-20070625174647-pocypsjmp861qgv7
(Vincent Ladeuil) Fix bug #121889 by working around urllib2 limitation.

Show diffs side-by-side

added added

removed removed

Lines of Context:
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')
289
291
            raise TestSkipped("local encoding cannot handle unicode")
290
292
 
291
293
        self.assertEqual('file:///path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
292
 
        self.assertFalse(isinstance(result, unicode))
293
294
 
294
295
    def test_posix_local_path_from_url(self):
295
296
        from_url = urlutils._posix_local_path_from_url
299
300
            from_url('file:///path/to/r%C3%A4ksm%C3%B6rg%C3%A5s'))
300
301
        self.assertEqual(u'/path/to/r\xe4ksm\xf6rg\xe5s',
301
302
            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
303
 
305
304
        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
305
 
310
306
    def test_win32_local_path_to_url(self):
311
307
        to_url = urlutils._win32_local_path_to_url
320
316
        self.assertEqual('file:///C:/path/to/f%20oo',
321
317
            to_url('C:/path/to/f oo'))
322
318
 
323
 
        self.assertEqual('file:///', to_url('/'))
324
 
 
325
319
        try:
326
320
            result = to_url(u'd:/path/to/r\xe4ksm\xf6rg\xe5s')
327
321
        except UnicodeError:
328
322
            raise TestSkipped("local encoding cannot handle unicode")
329
323
 
330
324
        self.assertEqual('file:///D:/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
331
 
        self.assertFalse(isinstance(result, unicode))
332
325
 
333
326
    def test_win32_unc_path_to_url(self):
334
327
        to_url = urlutils._win32_local_path_to_url
343
336
            raise TestSkipped("local encoding cannot handle unicode")
344
337
 
345
338
        self.assertEqual('file://HOST/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s', result)
346
 
        self.assertFalse(isinstance(result, unicode))
 
339
 
347
340
 
348
341
    def test_win32_local_path_from_url(self):
349
342
        from_url = urlutils._win32_local_path_from_url
353
346
            from_url('file:///d|/path/to/r%C3%A4ksm%C3%B6rg%C3%A5s'))
354
347
        self.assertEqual(u'D:/path/to/r\xe4ksm\xf6rg\xe5s',
355
348
            from_url('file:///d:/path/to/r%c3%a4ksm%c3%b6rg%c3%a5s'))
356
 
        self.assertEqual('/', from_url('file:///'))
357
349
 
358
350
        self.assertRaises(InvalidURL, from_url, '/path/to/foo')
359
351
        # Not a valid _win32 url, no drive letter
499
491
    def test_escape(self):
500
492
        self.assertEqual('%25', urlutils.escape('%'))
501
493
        self.assertEqual('%C3%A5', urlutils.escape(u'\xe5'))
502
 
        self.assertFalse(isinstance(urlutils.escape(u'\xe5'), unicode))
503
 
 
504
 
    def test_escape_tildes(self):
505
 
        self.assertEqual('~foo', urlutils.escape('~foo'))
506
494
 
507
495
    def test_unescape(self):
508
496
        self.assertEqual('%', urlutils.unescape('%25'))
520
508
        def test(expected, base, other):
521
509
            result = urlutils.relative_url(base, other)
522
510
            self.assertEqual(expected, result)
523
 
 
 
511
            
524
512
        test('a', 'http://host/', 'http://host/a')
525
513
        test('http://entirely/different', 'sftp://host/branch',
526
514
                    'http://entirely/different')
535
523
                    'sftp://host/home/jelmer/branch/2b')
536
524
        test('../../branch/feature/%2b', 'http://host/home/jelmer/bar/%2b',
537
525
                    'http://host/home/jelmer/branch/feature/%2b')
538
 
        test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/',
 
526
        test('../../branch/feature/2b', 'http://host/home/jelmer/bar/2b/', 
539
527
                    'http://host/home/jelmer/branch/feature/2b')
540
528
        # relative_url should preserve a trailing slash
541
529
        test('../../branch/feature/2b/', 'http://host/home/jelmer/bar/2b/',
553
541
        #test('.', 'http://host/', 'http://host')
554
542
        test('http://host', 'http://host/', 'http://host')
555
543
 
556
 
        # On Windows file:///C:/path/to and file:///D:/other/path
557
 
        # should not use relative url over the non-existent '/' directory.
558
 
        if sys.platform == 'win32':
559
 
            # on the same drive
560
 
            test('../../other/path',
561
 
                'file:///C:/path/to', 'file:///C:/other/path')
562
 
            #~next two tests is failed, i.e. urlutils.relative_url expects
563
 
            #~to see normalized file URLs?
564
 
            #~test('../../other/path',
565
 
            #~    'file:///C:/path/to', 'file:///c:/other/path')
566
 
            #~test('../../other/path',
567
 
            #~    'file:///C:/path/to', 'file:///C|/other/path')
568
 
 
569
 
            # check UNC paths too
570
 
            test('../../other/path',
571
 
                'file://HOST/base/path/to', 'file://HOST/base/other/path')
572
 
            # on different drives
573
 
            test('file:///D:/other/path',
574
 
                'file:///C:/path/to', 'file:///D:/other/path')
575
 
            # TODO: strictly saying in UNC path //HOST/base is full analog
576
 
            # of drive letter for hard disk, and this situation is also
577
 
            # should be exception from rules. [bialix 20071221]
578
 
 
579
544
 
580
545
class TestCwdToURL(TestCaseInTempDir):
581
546
    """Test that local_path_to_url works base on the cwd"""
599
564
 
600
565
        os.chdir(u'dod\xe9')
601
566
 
602
 
        # On Mac OSX this directory is actually:
 
567
        # On Mac OSX this directory is actually: 
603
568
        #   u'/dode\u0301' => '/dode\xcc\x81
604
 
        # but we should normalize it back to
 
569
        # but we should normalize it back to 
605
570
        #   u'/dod\xe9' => '/dod\xc3\xa9'
606
571
        url = urlutils.local_path_to_url('.')
607
572
        self.assertEndsWith(url, '/dod%C3%A9')
623
588
        self.assertEqual("bar", derive("http://foo/bar"))
624
589
        self.assertEqual("bar", derive("bzr+ssh://foo/bar"))
625
590
        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'))