changeset 37875:078c3eec2d5c

tests: port test-url.py to Python 3 # skip-blame it's all b prefixes and pycompat.bytestr() wrappers Differential Revision: https://phab.mercurial-scm.org/D3470
author Augie Fackler <augie@google.com>
date Fri, 27 Apr 2018 00:08:48 -0400
parents 0dcd03637d36
children 9c98cb30f4de
files contrib/python3-whitelist tests/test-url.py
diffstat 2 files changed, 96 insertions(+), 95 deletions(-) [+]
line wrap: on
line diff
--- a/contrib/python3-whitelist	Fri Apr 27 00:08:21 2018 -0400
+++ b/contrib/python3-whitelist	Fri Apr 27 00:08:48 2018 -0400
@@ -449,6 +449,7 @@
 test-upgrade-repo.t
 test-url-download.t
 test-url-rev.t
+test-url.py
 test-username-newline.t
 test-verify.t
 test-websub.t
--- a/tests/test-url.py	Fri Apr 27 00:08:21 2018 -0400
+++ b/tests/test-url.py	Fri Apr 27 00:08:48 2018 -0400
@@ -20,17 +20,17 @@
 check(_verifycert(cert('example.com'), 'example.com'),
       None)
 check(_verifycert(cert('example.com'), 'www.example.com'),
-      'certificate is for example.com')
+      b'certificate is for example.com')
 check(_verifycert(cert('www.example.com'), 'example.com'),
-      'certificate is for www.example.com')
+      b'certificate is for www.example.com')
 
 # Test wildcard certificates
 check(_verifycert(cert('*.example.com'), 'www.example.com'),
       None)
 check(_verifycert(cert('*.example.com'), 'example.com'),
-      'certificate is for *.example.com')
+      b'certificate is for *.example.com')
 check(_verifycert(cert('*.example.com'), 'w.w.example.com'),
-      'certificate is for *.example.com')
+      b'certificate is for *.example.com')
 
 # Test subjectAltName
 san_cert = {'subject': ((('commonName', 'example.com'),),),
@@ -42,7 +42,7 @@
       None)
 # no fallback to subject commonName when subjectAltName has DNS
 check(_verifycert(san_cert, 'example.com'),
-      'certificate is for *.example.net, example.net')
+      b'certificate is for *.example.net, example.net')
 # fallback to subject commonName when no DNS in subjectAltName
 san_cert = {'subject': ((('commonName', 'example.com'),),),
             'subjectAltName': (('IP Address', '8.8.8.8'),)}
@@ -50,84 +50,84 @@
 
 # Avoid some pitfalls
 check(_verifycert(cert('*.foo'), 'foo'),
-      'certificate is for *.foo')
+      b'certificate is for *.foo')
 check(_verifycert(cert('*o'), 'foo'), None)
 
 check(_verifycert({'subject': ()},
                   'example.com'),
-      'no commonName or subjectAltName found in certificate')
+      b'no commonName or subjectAltName found in certificate')
 check(_verifycert(None, 'example.com'),
-      'no certificate received')
+      b'no certificate received')
 
 # Unicode (IDN) certname isn't supported
 check(_verifycert(cert(u'\u4f8b.jp'), 'example.jp'),
-      'IDN in certificate not supported')
+      b'IDN in certificate not supported')
 
 # The following tests are from CPython's test_ssl.py.
 check(_verifycert(cert('example.com'), 'example.com'), None)
 check(_verifycert(cert('example.com'), 'ExAmple.cOm'), None)
 check(_verifycert(cert('example.com'), 'www.example.com'),
-      'certificate is for example.com')
+      b'certificate is for example.com')
 check(_verifycert(cert('example.com'), '.example.com'),
-      'certificate is for example.com')
+      b'certificate is for example.com')
 check(_verifycert(cert('example.com'), 'example.org'),
-      'certificate is for example.com')
+      b'certificate is for example.com')
 check(_verifycert(cert('example.com'), 'exampleXcom'),
-      'certificate is for example.com')
+      b'certificate is for example.com')
 check(_verifycert(cert('*.a.com'), 'foo.a.com'), None)
 check(_verifycert(cert('*.a.com'), 'bar.foo.a.com'),
-      'certificate is for *.a.com')
+      b'certificate is for *.a.com')
 check(_verifycert(cert('*.a.com'), 'a.com'),
-      'certificate is for *.a.com')
+      b'certificate is for *.a.com')
 check(_verifycert(cert('*.a.com'), 'Xa.com'),
-      'certificate is for *.a.com')
+      b'certificate is for *.a.com')
 check(_verifycert(cert('*.a.com'), '.a.com'),
-      'certificate is for *.a.com')
+      b'certificate is for *.a.com')
 
 # only match one left-most wildcard
 check(_verifycert(cert('f*.com'), 'foo.com'), None)
 check(_verifycert(cert('f*.com'), 'f.com'), None)
 check(_verifycert(cert('f*.com'), 'bar.com'),
-      'certificate is for f*.com')
+      b'certificate is for f*.com')
 check(_verifycert(cert('f*.com'), 'foo.a.com'),
-      'certificate is for f*.com')
+      b'certificate is for f*.com')
 check(_verifycert(cert('f*.com'), 'bar.foo.com'),
-      'certificate is for f*.com')
+      b'certificate is for f*.com')
 
 # NULL bytes are bad, CVE-2013-4073
 check(_verifycert(cert('null.python.org\x00example.org'),
                   'null.python.org\x00example.org'), None)
 check(_verifycert(cert('null.python.org\x00example.org'),
                   'example.org'),
-      'certificate is for null.python.org\x00example.org')
+      b'certificate is for null.python.org\x00example.org')
 check(_verifycert(cert('null.python.org\x00example.org'),
                   'null.python.org'),
-      'certificate is for null.python.org\x00example.org')
+      b'certificate is for null.python.org\x00example.org')
 
 # error cases with wildcards
 check(_verifycert(cert('*.*.a.com'), 'bar.foo.a.com'),
-      'certificate is for *.*.a.com')
+      b'certificate is for *.*.a.com')
 check(_verifycert(cert('*.*.a.com'), 'a.com'),
-      'certificate is for *.*.a.com')
+      b'certificate is for *.*.a.com')
 check(_verifycert(cert('*.*.a.com'), 'Xa.com'),
-      'certificate is for *.*.a.com')
+      b'certificate is for *.*.a.com')
 check(_verifycert(cert('*.*.a.com'), '.a.com'),
-      'certificate is for *.*.a.com')
+      b'certificate is for *.*.a.com')
 
 check(_verifycert(cert('a.*.com'), 'a.foo.com'),
-      'certificate is for a.*.com')
+      b'certificate is for a.*.com')
 check(_verifycert(cert('a.*.com'), 'a..com'),
-      'certificate is for a.*.com')
+      b'certificate is for a.*.com')
 check(_verifycert(cert('a.*.com'), 'a.com'),
-      'certificate is for a.*.com')
+      b'certificate is for a.*.com')
 
 # wildcard doesn't match IDNA prefix 'xn--'
 idna = u'püthon.python.org'.encode('idna').decode('ascii')
 check(_verifycert(cert(idna), idna), None)
 check(_verifycert(cert('x*.python.org'), idna),
-      'certificate is for x*.python.org')
+      b'certificate is for x*.python.org')
 check(_verifycert(cert('xn--p*.python.org'), idna),
-      'certificate is for xn--p*.python.org')
+      b'certificate is for xn--p*.python.org')
 
 # wildcard in first fragment and  IDNA A-labels in sequent fragments
 # are supported.
@@ -140,10 +140,10 @@
       None)
 check(_verifycert(cert(idna),
                   u'ftp.pythön.org'.encode('idna').decode('ascii')),
-      'certificate is for www*.xn--pythn-mua.org')
+      b'certificate is for www*.xn--pythn-mua.org')
 check(_verifycert(cert(idna),
                   u'pythön.org'.encode('idna').decode('ascii')),
-      'certificate is for www*.xn--pythn-mua.org')
+      b'certificate is for www*.xn--pythn-mua.org')
 
 c = {
     'notAfter': 'Jun 26 21:41:46 2011 GMT',
@@ -158,10 +158,10 @@
 check(_verifycert(c, 'linuxfr.com'), None)
 # Not a "DNS" entry
 check(_verifycert(c, '<unsupported>'),
-      'certificate is for linuxfr.org, linuxfr.com')
+      b'certificate is for linuxfr.org, linuxfr.com')
 # When there is a subjectAltName, commonName isn't used
 check(_verifycert(c, 'linuxfrz.org'),
-      'certificate is for linuxfr.org, linuxfr.com')
+      b'certificate is for linuxfr.org, linuxfr.com')
 
 # A pristine real-world example
 c = {
@@ -175,10 +175,10 @@
     ),
 }
 check(_verifycert(c, 'mail.google.com'), None)
-check(_verifycert(c, 'gmail.com'), 'certificate is for mail.google.com')
+check(_verifycert(c, 'gmail.com'), b'certificate is for mail.google.com')
 
 # Only commonName is considered
-check(_verifycert(c, 'California'), 'certificate is for mail.google.com')
+check(_verifycert(c, 'California'), b'certificate is for mail.google.com')
 
 # Neither commonName nor subjectAltName
 c = {
@@ -191,7 +191,7 @@
     ),
 }
 check(_verifycert(c, 'mail.google.com'),
-      'no commonName or subjectAltName found in certificate')
+      b'no commonName or subjectAltName found in certificate')
 
 # No DNS entry in subjectAltName but a commonName
 c = {
@@ -218,21 +218,21 @@
     'subjectAltName': (('othername', 'blabla'),),
 }
 check(_verifycert(c, 'google.com'),
-      'no commonName or subjectAltName found in certificate')
+      b'no commonName or subjectAltName found in certificate')
 
 # Empty cert / no cert
-check(_verifycert(None, 'example.com'), 'no certificate received')
-check(_verifycert({}, 'example.com'), 'no certificate received')
+check(_verifycert(None, 'example.com'), b'no certificate received')
+check(_verifycert({}, 'example.com'), b'no certificate received')
 
 # avoid denials of service by refusing more than one
 # wildcard per fragment.
 check(_verifycert({'subject': (((u'commonName', u'a*b.com'),),)},
                   'axxb.com'), None)
 check(_verifycert({'subject': (((u'commonName', u'a*b.co*'),),)},
-                  'axxb.com'), 'certificate is for a*b.co*')
+                  'axxb.com'), b'certificate is for a*b.co*')
 check(_verifycert({'subject': (((u'commonName', u'a*b*.com'),),)},
                   'axxbxxc.com'),
-      'too many wildcards in certificate DNS name: a*b*.com')
+      b'too many wildcards in certificate DNS name: a*b*.com')
 
 def test_url():
     """
@@ -245,107 +245,107 @@
 
     Query strings and fragments:
 
-    >>> url('http://host/a?b#c')
+    >>> url(b'http://host/a?b#c')
     <url scheme: 'http', host: 'host', path: 'a', query: 'b', fragment: 'c'>
-    >>> url('http://host/a?')
+    >>> url(b'http://host/a?')
     <url scheme: 'http', host: 'host', path: 'a'>
-    >>> url('http://host/a#b#c')
+    >>> url(b'http://host/a#b#c')
     <url scheme: 'http', host: 'host', path: 'a', fragment: 'b#c'>
-    >>> url('http://host/a#b?c')
+    >>> url(b'http://host/a#b?c')
     <url scheme: 'http', host: 'host', path: 'a', fragment: 'b?c'>
-    >>> url('http://host/?a#b')
+    >>> url(b'http://host/?a#b')
     <url scheme: 'http', host: 'host', path: '', query: 'a', fragment: 'b'>
-    >>> url('http://host/?a#b', parsequery=False)
+    >>> url(b'http://host/?a#b', parsequery=False)
     <url scheme: 'http', host: 'host', path: '?a', fragment: 'b'>
-    >>> url('http://host/?a#b', parsefragment=False)
+    >>> url(b'http://host/?a#b', parsefragment=False)
     <url scheme: 'http', host: 'host', path: '', query: 'a#b'>
-    >>> url('http://host/?a#b', parsequery=False, parsefragment=False)
+    >>> url(b'http://host/?a#b', parsequery=False, parsefragment=False)
     <url scheme: 'http', host: 'host', path: '?a#b'>
 
     IPv6 addresses:
 
-    >>> url('ldap://[2001:db8::7]/c=GB?objectClass?one')
+    >>> url(b'ldap://[2001:db8::7]/c=GB?objectClass?one')
     <url scheme: 'ldap', host: '[2001:db8::7]', path: 'c=GB',
          query: 'objectClass?one'>
-    >>> url('ldap://joe:xxx@[2001:db8::7]:80/c=GB?objectClass?one')
+    >>> url(b'ldap://joe:xxx@[2001:db8::7]:80/c=GB?objectClass?one')
     <url scheme: 'ldap', user: 'joe', passwd: 'xxx', host: '[2001:db8::7]',
          port: '80', path: 'c=GB', query: 'objectClass?one'>
 
     Missing scheme, host, etc.:
 
-    >>> url('://192.0.2.16:80/')
+    >>> url(b'://192.0.2.16:80/')
     <url path: '://192.0.2.16:80/'>
-    >>> url('https://mercurial-scm.org')
+    >>> url(b'https://mercurial-scm.org')
     <url scheme: 'https', host: 'mercurial-scm.org'>
-    >>> url('/foo')
+    >>> url(b'/foo')
     <url path: '/foo'>
-    >>> url('bundle:/foo')
+    >>> url(b'bundle:/foo')
     <url scheme: 'bundle', path: '/foo'>
-    >>> url('a?b#c')
+    >>> url(b'a?b#c')
     <url path: 'a?b', fragment: 'c'>
-    >>> url('http://x.com?arg=/foo')
+    >>> url(b'http://x.com?arg=/foo')
     <url scheme: 'http', host: 'x.com', query: 'arg=/foo'>
-    >>> url('http://joe:xxx@/foo')
+    >>> url(b'http://joe:xxx@/foo')
     <url scheme: 'http', user: 'joe', passwd: 'xxx', path: 'foo'>
 
     Just a scheme and a path:
 
-    >>> url('mailto:John.Doe@example.com')
+    >>> url(b'mailto:John.Doe@example.com')
     <url scheme: 'mailto', path: 'John.Doe@example.com'>
-    >>> url('a:b:c:d')
+    >>> url(b'a:b:c:d')
     <url path: 'a:b:c:d'>
-    >>> url('aa:bb:cc:dd')
+    >>> url(b'aa:bb:cc:dd')
     <url scheme: 'aa', path: 'bb:cc:dd'>
 
     SSH examples:
 
-    >>> url('ssh://joe@host//home/joe')
+    >>> url(b'ssh://joe@host//home/joe')
     <url scheme: 'ssh', user: 'joe', host: 'host', path: '/home/joe'>
-    >>> url('ssh://joe:xxx@host/src')
+    >>> url(b'ssh://joe:xxx@host/src')
     <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', path: 'src'>
-    >>> url('ssh://joe:xxx@host')
+    >>> url(b'ssh://joe:xxx@host')
     <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host'>
-    >>> url('ssh://joe@host')
+    >>> url(b'ssh://joe@host')
     <url scheme: 'ssh', user: 'joe', host: 'host'>
-    >>> url('ssh://host')
+    >>> url(b'ssh://host')
     <url scheme: 'ssh', host: 'host'>
-    >>> url('ssh://')
+    >>> url(b'ssh://')
     <url scheme: 'ssh'>
-    >>> url('ssh:')
+    >>> url(b'ssh:')
     <url scheme: 'ssh'>
 
     Non-numeric port:
 
-    >>> url('http://example.com:dd')
+    >>> url(b'http://example.com:dd')
     <url scheme: 'http', host: 'example.com', port: 'dd'>
-    >>> url('ssh://joe:xxx@host:ssh/foo')
+    >>> url(b'ssh://joe:xxx@host:ssh/foo')
     <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', port: 'ssh',
          path: 'foo'>
 
     Bad authentication credentials:
 
-    >>> url('http://joe@joeville:123@4:@host/a?b#c')
+    >>> url(b'http://joe@joeville:123@4:@host/a?b#c')
     <url scheme: 'http', user: 'joe@joeville', passwd: '123@4:',
          host: 'host', path: 'a', query: 'b', fragment: 'c'>
-    >>> url('http://!*#?/@!*#?/:@host/a?b#c')
+    >>> url(b'http://!*#?/@!*#?/:@host/a?b#c')
     <url scheme: 'http', host: '!*', fragment: '?/@!*#?/:@host/a?b#c'>
-    >>> url('http://!*#?@!*#?:@host/a?b#c')
+    >>> url(b'http://!*#?@!*#?:@host/a?b#c')
     <url scheme: 'http', host: '!*', fragment: '?@!*#?:@host/a?b#c'>
-    >>> url('http://!*@:!*@@host/a?b#c')
+    >>> url(b'http://!*@:!*@@host/a?b#c')
     <url scheme: 'http', user: '!*@', passwd: '!*@', host: 'host',
          path: 'a', query: 'b', fragment: 'c'>
 
     File paths:
 
-    >>> url('a/b/c/d.g.f')
+    >>> url(b'a/b/c/d.g.f')
     <url path: 'a/b/c/d.g.f'>
-    >>> url('/x///z/y/')
+    >>> url(b'/x///z/y/')
     <url path: '/x///z/y/'>
-    >>> url('/foo:bar')
+    >>> url(b'/foo:bar')
     <url path: '/foo:bar'>
-    >>> url('\\\\foo:bar')
+    >>> url(b'\\\\foo:bar')
     <url path: '\\\\foo:bar'>
-    >>> url('./foo:bar')
+    >>> url(b'./foo:bar')
     <url path: './foo:bar'>
 
     Non-localhost file URL:
@@ -358,7 +358,7 @@
 
     Empty URL:
 
-    >>> u = url('')
+    >>> u = url(b'')
     >>> u
     <url path: ''>
     >>> str(u)
@@ -366,54 +366,54 @@
 
     Empty path with query string:
 
-    >>> str(url('http://foo/?bar'))
+    >>> str(url(b'http://foo/?bar'))
     'http://foo/?bar'
 
     Invalid path:
 
-    >>> u = url('http://foo/bar')
-    >>> u.path = 'bar'
+    >>> u = url(b'http://foo/bar')
+    >>> u.path = b'bar'
     >>> str(u)
     'http://foo/bar'
 
-    >>> u = url('file:/foo/bar/baz')
+    >>> u = url(b'file:/foo/bar/baz')
     >>> u
     <url scheme: 'file', path: '/foo/bar/baz'>
     >>> str(u)
     'file:///foo/bar/baz'
-    >>> u.localpath()
+    >>> pycompat.bytestr(u.localpath())
     '/foo/bar/baz'
 
-    >>> u = url('file:///foo/bar/baz')
+    >>> u = url(b'file:///foo/bar/baz')
     >>> u
     <url scheme: 'file', path: '/foo/bar/baz'>
     >>> str(u)
     'file:///foo/bar/baz'
-    >>> u.localpath()
+    >>> pycompat.bytestr(u.localpath())
     '/foo/bar/baz'
 
-    >>> u = url('file:///f:oo/bar/baz')
+    >>> u = url(b'file:///f:oo/bar/baz')
     >>> u
     <url scheme: 'file', path: 'f:oo/bar/baz'>
     >>> str(u)
     'file:///f:oo/bar/baz'
-    >>> u.localpath()
+    >>> pycompat.bytestr(u.localpath())
     'f:oo/bar/baz'
 
-    >>> u = url('file://localhost/f:oo/bar/baz')
+    >>> u = url(b'file://localhost/f:oo/bar/baz')
     >>> u
     <url scheme: 'file', host: 'localhost', path: 'f:oo/bar/baz'>
     >>> str(u)
     'file://localhost/f:oo/bar/baz'
-    >>> u.localpath()
+    >>> pycompat.bytestr(u.localpath())
     'f:oo/bar/baz'
 
-    >>> u = url('file:foo/bar/baz')
+    >>> u = url(b'file:foo/bar/baz')
     >>> u
     <url scheme: 'file', path: 'foo/bar/baz'>
     >>> str(u)
     'file:foo/bar/baz'
-    >>> u.localpath()
+    >>> pycompat.bytestr(u.localpath())
     'foo/bar/baz'
     """