tests/test-url.py
changeset 13770 4e8f2310f310
parent 13249 75d0c38a0bca
child 13808 58b86b9149f1
equal deleted inserted replaced
13769:8796fb6af67e 13770:4e8f2310f310
    47                   'example.com'),
    47                   'example.com'),
    48       'no commonName or subjectAltName found in certificate')
    48       'no commonName or subjectAltName found in certificate')
    49 check(_verifycert(None, 'example.com'),
    49 check(_verifycert(None, 'example.com'),
    50       'no certificate received')
    50       'no certificate received')
    51 
    51 
       
    52 import doctest
       
    53 
       
    54 def test_url():
       
    55     """
       
    56     >>> from mercurial.url import url
       
    57 
       
    58     This tests for edge cases in url.URL's parsing algorithm. Most of
       
    59     these aren't useful for documentation purposes, so they aren't
       
    60     part of the class's doc tests.
       
    61 
       
    62     Query strings and fragments:
       
    63 
       
    64     >>> url('http://host/a?b#c')
       
    65     <url scheme: 'http', host: 'host', path: 'a', query: 'b', fragment: 'c'>
       
    66     >>> url('http://host/a?')
       
    67     <url scheme: 'http', host: 'host', path: 'a'>
       
    68     >>> url('http://host/a#b#c')
       
    69     <url scheme: 'http', host: 'host', path: 'a', fragment: 'b#c'>
       
    70     >>> url('http://host/a#b?c')
       
    71     <url scheme: 'http', host: 'host', path: 'a', fragment: 'b?c'>
       
    72     >>> url('http://host/?a#b')
       
    73     <url scheme: 'http', host: 'host', path: '', query: 'a', fragment: 'b'>
       
    74     >>> url('http://host/?a#b', parse_query=False)
       
    75     <url scheme: 'http', host: 'host', path: '?a', fragment: 'b'>
       
    76     >>> url('http://host/?a#b', parse_fragment=False)
       
    77     <url scheme: 'http', host: 'host', path: '', query: 'a#b'>
       
    78     >>> url('http://host/?a#b', parse_query=False, parse_fragment=False)
       
    79     <url scheme: 'http', host: 'host', path: '?a#b'>
       
    80 
       
    81     IPv6 addresses:
       
    82 
       
    83     >>> url('ldap://[2001:db8::7]/c=GB?objectClass?one')
       
    84     <url scheme: 'ldap', host: '[2001:db8::7]', path: 'c=GB',
       
    85          query: 'objectClass?one'>
       
    86     >>> url('ldap://joe:xxx@[2001:db8::7]:80/c=GB?objectClass?one')
       
    87     <url scheme: 'ldap', user: 'joe', passwd: 'xxx', host: '[2001:db8::7]',
       
    88          port: '80', path: 'c=GB', query: 'objectClass?one'>
       
    89 
       
    90     Missing scheme, host, etc.:
       
    91 
       
    92     >>> url('://192.0.2.16:80/')
       
    93     <url path: '://192.0.2.16:80/'>
       
    94     >>> url('http://mercurial.selenic.com')
       
    95     <url scheme: 'http', host: 'mercurial.selenic.com'>
       
    96     >>> url('/foo')
       
    97     <url path: '/foo'>
       
    98     >>> url('bundle:/foo')
       
    99     <url scheme: 'bundle', path: '/foo'>
       
   100     >>> url('a?b#c')
       
   101     <url path: 'a?b', fragment: 'c'>
       
   102     >>> url('http://x.com?arg=/foo')
       
   103     <url scheme: 'http', host: 'x.com', query: 'arg=/foo'>
       
   104     >>> url('http://joe:xxx@/foo')
       
   105     <url scheme: 'http', user: 'joe', passwd: 'xxx', path: 'foo'>
       
   106 
       
   107     Just a scheme and a path:
       
   108 
       
   109     >>> url('mailto:John.Doe@example.com')
       
   110     <url scheme: 'mailto', path: 'John.Doe@example.com'>
       
   111     >>> url('a:b:c:d')
       
   112     <url scheme: 'a', path: 'b:c:d'>
       
   113 
       
   114     SSH examples:
       
   115 
       
   116     >>> url('ssh://joe@host//home/joe')
       
   117     <url scheme: 'ssh', user: 'joe', host: 'host', path: '/home/joe'>
       
   118     >>> url('ssh://joe:xxx@host/src')
       
   119     <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', path: 'src'>
       
   120     >>> url('ssh://joe:xxx@host')
       
   121     <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host'>
       
   122     >>> url('ssh://joe@host')
       
   123     <url scheme: 'ssh', user: 'joe', host: 'host'>
       
   124     >>> url('ssh://host')
       
   125     <url scheme: 'ssh', host: 'host'>
       
   126     >>> url('ssh://')
       
   127     <url scheme: 'ssh'>
       
   128     >>> url('ssh:')
       
   129     <url scheme: 'ssh'>
       
   130 
       
   131     Non-numeric port:
       
   132 
       
   133     >>> url('http://example.com:dd')
       
   134     <url scheme: 'http', host: 'example.com', port: 'dd'>
       
   135     >>> url('ssh://joe:xxx@host:ssh/foo')
       
   136     <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', port: 'ssh',
       
   137          path: 'foo'>
       
   138 
       
   139     Bad authentication credentials:
       
   140 
       
   141     >>> url('http://joe@joeville:123@4:@host/a?b#c')
       
   142     <url scheme: 'http', user: 'joe@joeville', passwd: '123@4:',
       
   143          host: 'host', path: 'a', query: 'b', fragment: 'c'>
       
   144     >>> url('http://!*#?/@!*#?/:@host/a?b#c')
       
   145     <url scheme: 'http', host: '!*', fragment: '?/@!*#?/:@host/a?b#c'>
       
   146     >>> url('http://!*#?@!*#?:@host/a?b#c')
       
   147     <url scheme: 'http', host: '!*', fragment: '?@!*#?:@host/a?b#c'>
       
   148     >>> url('http://!*@:!*@@host/a?b#c')
       
   149     <url scheme: 'http', user: '!*@', passwd: '!*@', host: 'host',
       
   150          path: 'a', query: 'b', fragment: 'c'>
       
   151 
       
   152     File paths:
       
   153 
       
   154     >>> url('a/b/c/d.g.f')
       
   155     <url path: 'a/b/c/d.g.f'>
       
   156     >>> url('/x///z/y/')
       
   157     <url path: '/x///z/y/'>
       
   158 
       
   159     Empty URL:
       
   160 
       
   161     >>> u = url('')
       
   162     >>> u
       
   163     <url path: ''>
       
   164     >>> str(u)
       
   165     ''
       
   166 
       
   167     Empty path with query string:
       
   168 
       
   169     >>> str(url('http://foo/?bar'))
       
   170     'http://foo/?bar'
       
   171 
       
   172     Invalid path:
       
   173 
       
   174     >>> u = url('http://foo/bar')
       
   175     >>> u.path = 'bar'
       
   176     >>> str(u)
       
   177     'http://foo/bar'
       
   178 
       
   179     >>> u = url('file:///foo/bar/baz')
       
   180     >>> u
       
   181     <url scheme: 'file', path: '/foo/bar/baz'>
       
   182     >>> str(u)
       
   183     'file:/foo/bar/baz'
       
   184     """
       
   185 
       
   186 doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)
       
   187 
    52 # Unicode (IDN) certname isn't supported
   188 # Unicode (IDN) certname isn't supported
    53 check(_verifycert(cert(u'\u4f8b.jp'), 'example.jp'),
   189 check(_verifycert(cert(u'\u4f8b.jp'), 'example.jp'),
    54       'IDN in certificate not supported')
   190       'IDN in certificate not supported')