tests/test-url.py
author Martin von Zweigbergk <martinvonz@google.com>
Fri, 20 Nov 2020 14:43:21 -0800
changeset 45909 9dc1351d0b5f
parent 45687 223296268c4e
child 46907 ffd3e823a7e5
permissions -rw-r--r--
errors: raise ConfigError on failure to parse config file This replaces two raises of `ParseError` by `ConfigError`, which makes it so we get the desired exit code when `ui.detailed-exit-code` is enabled. Because the exceptions include a location, I had to add that to `ConfigError` as well. I considered making `ConfigError` a subclass of `ParseError`, but it doesn't feel like it quite passes the "is-a" test. I used "config error: " as prefix for these errors instead of the previous "hg: parse error: ", which seems a little less accurate now (and, as I've said before, I don't know what the "hg: " part is supposed to signify anyway). I can easily be convinced to change the prefix to something else (including "abort: "). Some of the exceptions raised here mean that we fail to even load the `ui` object in the `dispatch` module. When that happens, we don't know to use detailed exit codes, so some tests (e.g. `test-hgrc.t`) still see exit code 255. I'll try to get back to that later. It should be possible to give detailed exit codes if at least part of the config can be read (e.g. when the system-wide one enables detailed exit codes and the user's config fails to parse). Differential Revision: https://phab.mercurial-scm.org/D9355
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
     1
# coding=utf-8
28914
63fe5ddb8715 tests: make test-url use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28677
diff changeset
     2
from __future__ import absolute_import, print_function
63fe5ddb8715 tests: make test-url use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28677
diff changeset
     3
63fe5ddb8715 tests: make test-url use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28677
diff changeset
     4
import doctest
15398
474279be5add tests: fix readline escape characters in heredoctest.py/test-url.py
Brodie Rao <brodie@bitheap.org>
parents: 15018
diff changeset
     5
import os
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
     6
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
     7
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
     8
def check(a, b):
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
     9
    if a != b:
28677
2903558a6991 py3: make test-url use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 26421
diff changeset
    10
        print((a, b))
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    11
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    12
12606
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    13
def cert(cn):
20685
56b1f39dd0c1 test-url: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 15611
diff changeset
    14
    return {'subject': ((('commonName', cn),),)}
12606
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    15
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    16
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    17
from mercurial import sslutil
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    18
28914
63fe5ddb8715 tests: make test-url use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28677
diff changeset
    19
_verifycert = sslutil._verifycert
12724
66e7ba85585b test-url: remove trailing whitespace
Augie Fackler <durin42@gmail.com>
parents: 12606
diff changeset
    20
# Test non-wildcard certificates
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    21
check(_verifycert(cert('example.com'), 'example.com'), None)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    22
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    23
    _verifycert(cert('example.com'), 'www.example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    24
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    25
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    26
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    27
    _verifycert(cert('www.example.com'), 'example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    28
    b'certificate is for www.example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    29
)
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    30
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    31
# Test wildcard certificates
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    32
check(_verifycert(cert('*.example.com'), 'www.example.com'), None)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    33
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    34
    _verifycert(cert('*.example.com'), 'example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    35
    b'certificate is for *.example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    36
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    37
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    38
    _verifycert(cert('*.example.com'), 'w.w.example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    39
    b'certificate is for *.example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    40
)
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    41
13249
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    42
# Test subjectAltName
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    43
san_cert = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    44
    'subject': ((('commonName', 'example.com'),),),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    45
    'subjectAltName': (('DNS', '*.example.net'), ('DNS', 'example.net')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    46
}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    47
check(_verifycert(san_cert, 'example.net'), None)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    48
check(_verifycert(san_cert, 'foo.example.net'), None)
14666
27b080aa880a sslutil: fall back to commonName when no dNSName in subjectAltName (issue2798)
Nicolas Bareil <nico@chdir.org>
parents: 14313
diff changeset
    49
# no fallback to subject commonName when subjectAltName has DNS
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    50
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    51
    _verifycert(san_cert, 'example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    52
    b'certificate is for *.example.net, example.net',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    53
)
14666
27b080aa880a sslutil: fall back to commonName when no dNSName in subjectAltName (issue2798)
Nicolas Bareil <nico@chdir.org>
parents: 14313
diff changeset
    54
# fallback to subject commonName when no DNS in subjectAltName
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    55
san_cert = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    56
    'subject': ((('commonName', 'example.com'),),),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    57
    'subjectAltName': (('IP Address', '8.8.8.8'),),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    58
}
14666
27b080aa880a sslutil: fall back to commonName when no dNSName in subjectAltName (issue2798)
Nicolas Bareil <nico@chdir.org>
parents: 14313
diff changeset
    59
check(_verifycert(san_cert, 'example.com'), None)
13249
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    60
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    61
# Avoid some pitfalls
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    62
check(_verifycert(cert('*.foo'), 'foo'), b'certificate is for *.foo')
29452
26a5d605b868 sslutil: synchronize hostname matching logic with CPython
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29451
diff changeset
    63
check(_verifycert(cert('*o'), 'foo'), None)
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    64
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    65
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    66
    _verifycert({'subject': ()}, 'example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    67
    b'no commonName or subjectAltName found in certificate',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    68
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    69
check(_verifycert(None, 'example.com'), b'no certificate received')
13248
00411a4fa1bb url: fix UnicodeDecodeError on certificate verification error
Yuya Nishihara <yuya@tcha.org>
parents: 12865
diff changeset
    70
14666
27b080aa880a sslutil: fall back to commonName when no dNSName in subjectAltName (issue2798)
Nicolas Bareil <nico@chdir.org>
parents: 14313
diff changeset
    71
# Unicode (IDN) certname isn't supported
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    72
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    73
    _verifycert(cert(u'\u4f8b.jp'), 'example.jp'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    74
    b'IDN in certificate not supported',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    75
)
14666
27b080aa880a sslutil: fall back to commonName when no dNSName in subjectAltName (issue2798)
Nicolas Bareil <nico@chdir.org>
parents: 14313
diff changeset
    76
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
    77
# The following tests are from CPython's test_ssl.py.
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
    78
check(_verifycert(cert('example.com'), 'example.com'), None)
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
    79
check(_verifycert(cert('example.com'), 'ExAmple.cOm'), None)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    80
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    81
    _verifycert(cert('example.com'), 'www.example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    82
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    83
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    84
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    85
    _verifycert(cert('example.com'), '.example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    86
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    87
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    88
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    89
    _verifycert(cert('example.com'), 'example.org'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    90
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    91
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    92
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    93
    _verifycert(cert('example.com'), 'exampleXcom'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    94
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    95
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
    96
check(_verifycert(cert('*.a.com'), 'foo.a.com'), None)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    97
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    98
    _verifycert(cert('*.a.com'), 'bar.foo.a.com'), b'certificate is for *.a.com'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    99
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   100
check(_verifycert(cert('*.a.com'), 'a.com'), b'certificate is for *.a.com')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   101
check(_verifycert(cert('*.a.com'), 'Xa.com'), b'certificate is for *.a.com')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   102
check(_verifycert(cert('*.a.com'), '.a.com'), b'certificate is for *.a.com')
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   103
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   104
# only match one left-most wildcard
29452
26a5d605b868 sslutil: synchronize hostname matching logic with CPython
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29451
diff changeset
   105
check(_verifycert(cert('f*.com'), 'foo.com'), None)
26a5d605b868 sslutil: synchronize hostname matching logic with CPython
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29451
diff changeset
   106
check(_verifycert(cert('f*.com'), 'f.com'), None)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   107
check(_verifycert(cert('f*.com'), 'bar.com'), b'certificate is for f*.com')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   108
check(_verifycert(cert('f*.com'), 'foo.a.com'), b'certificate is for f*.com')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   109
check(_verifycert(cert('f*.com'), 'bar.foo.com'), b'certificate is for f*.com')
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   110
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   111
# NULL bytes are bad, CVE-2013-4073
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   112
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   113
    _verifycert(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   114
        cert('null.python.org\x00example.org'), 'null.python.org\x00example.org'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   115
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   116
    None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   117
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   118
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   119
    _verifycert(cert('null.python.org\x00example.org'), 'example.org'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   120
    b'certificate is for null.python.org\x00example.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   121
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   122
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   123
    _verifycert(cert('null.python.org\x00example.org'), 'null.python.org'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   124
    b'certificate is for null.python.org\x00example.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   125
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   126
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   127
# error cases with wildcards
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   128
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   129
    _verifycert(cert('*.*.a.com'), 'bar.foo.a.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   130
    b'certificate is for *.*.a.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   131
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   132
check(_verifycert(cert('*.*.a.com'), 'a.com'), b'certificate is for *.*.a.com')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   133
check(_verifycert(cert('*.*.a.com'), 'Xa.com'), b'certificate is for *.*.a.com')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   134
check(_verifycert(cert('*.*.a.com'), '.a.com'), b'certificate is for *.*.a.com')
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   135
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   136
check(_verifycert(cert('a.*.com'), 'a.foo.com'), b'certificate is for a.*.com')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   137
check(_verifycert(cert('a.*.com'), 'a..com'), b'certificate is for a.*.com')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   138
check(_verifycert(cert('a.*.com'), 'a.com'), b'certificate is for a.*.com')
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   139
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   140
# wildcard doesn't match IDNA prefix 'xn--'
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   141
idna = u'püthon.python.org'.encode('idna').decode('ascii')
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   142
check(_verifycert(cert(idna), idna), None)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   143
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   144
    _verifycert(cert('x*.python.org'), idna),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   145
    b'certificate is for x*.python.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   146
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   147
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   148
    _verifycert(cert('xn--p*.python.org'), idna),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   149
    b'certificate is for xn--p*.python.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   150
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   151
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   152
# wildcard in first fragment and  IDNA A-labels in sequent fragments
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   153
# are supported.
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   154
idna = u'www*.pythön.org'.encode('idna').decode('ascii')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   155
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   156
    _verifycert(cert(idna), u'www.pythön.org'.encode('idna').decode('ascii')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   157
    None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   158
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   159
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   160
    _verifycert(cert(idna), u'www1.pythön.org'.encode('idna').decode('ascii')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   161
    None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   162
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   163
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   164
    _verifycert(cert(idna), u'ftp.pythön.org'.encode('idna').decode('ascii')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   165
    b'certificate is for www*.xn--pythn-mua.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   166
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   167
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   168
    _verifycert(cert(idna), u'pythön.org'.encode('idna').decode('ascii')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   169
    b'certificate is for www*.xn--pythn-mua.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   170
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   171
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   172
c = {
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   173
    'notAfter': 'Jun 26 21:41:46 2011 GMT',
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   174
    'subject': (((u'commonName', u'linuxfrz.org'),),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   175
    'subjectAltName': (
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   176
        ('DNS', 'linuxfr.org'),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   177
        ('DNS', 'linuxfr.com'),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   178
        ('othername', '<unsupported>'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   179
    ),
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   180
}
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   181
check(_verifycert(c, 'linuxfr.org'), None)
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   182
check(_verifycert(c, 'linuxfr.com'), None)
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   183
# Not a "DNS" entry
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   184
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   185
    _verifycert(c, '<unsupported>'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   186
    b'certificate is for linuxfr.org, linuxfr.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   187
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   188
# When there is a subjectAltName, commonName isn't used
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   189
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   190
    _verifycert(c, 'linuxfrz.org'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   191
    b'certificate is for linuxfr.org, linuxfr.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   192
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   193
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   194
# A pristine real-world example
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   195
c = {
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   196
    'notAfter': 'Dec 18 23:59:59 2011 GMT',
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   197
    'subject': (
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   198
        ((u'countryName', u'US'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   199
        ((u'stateOrProvinceName', u'California'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   200
        ((u'localityName', u'Mountain View'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   201
        ((u'organizationName', u'Google Inc'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   202
        ((u'commonName', u'mail.google.com'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   203
    ),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   204
}
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   205
check(_verifycert(c, 'mail.google.com'), None)
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   206
check(_verifycert(c, 'gmail.com'), b'certificate is for mail.google.com')
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   207
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   208
# Only commonName is considered
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   209
check(_verifycert(c, 'California'), b'certificate is for mail.google.com')
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   210
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   211
# Neither commonName nor subjectAltName
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   212
c = {
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   213
    'notAfter': 'Dec 18 23:59:59 2011 GMT',
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   214
    'subject': (
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   215
        ((u'countryName', u'US'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   216
        ((u'stateOrProvinceName', u'California'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   217
        ((u'localityName', u'Mountain View'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   218
        ((u'organizationName', u'Google Inc'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   219
    ),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   220
}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   221
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   222
    _verifycert(c, 'mail.google.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   223
    b'no commonName or subjectAltName found in certificate',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   224
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   225
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   226
# No DNS entry in subjectAltName but a commonName
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   227
c = {
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   228
    'notAfter': 'Dec 18 23:59:59 2099 GMT',
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   229
    'subject': (
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   230
        ((u'countryName', u'US'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   231
        ((u'stateOrProvinceName', u'California'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   232
        ((u'localityName', u'Mountain View'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   233
        ((u'commonName', u'mail.google.com'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   234
    ),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   235
    'subjectAltName': (('othername', 'blabla'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   236
}
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   237
check(_verifycert(c, 'mail.google.com'), None)
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   238
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   239
# No DNS entry subjectAltName and no commonName
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   240
c = {
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   241
    'notAfter': 'Dec 18 23:59:59 2099 GMT',
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   242
    'subject': (
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   243
        ((u'countryName', u'US'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   244
        ((u'stateOrProvinceName', u'California'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   245
        ((u'localityName', u'Mountain View'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   246
        ((u'organizationName', u'Google Inc'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   247
    ),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   248
    'subjectAltName': (('othername', 'blabla'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   249
}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   250
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   251
    _verifycert(c, 'google.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   252
    b'no commonName or subjectAltName found in certificate',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   253
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   254
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   255
# Empty cert / no cert
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   256
check(_verifycert(None, 'example.com'), b'no certificate received')
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   257
check(_verifycert({}, 'example.com'), b'no certificate received')
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   258
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   259
# avoid denials of service by refusing more than one
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   260
# wildcard per fragment.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   261
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   262
    _verifycert({'subject': (((u'commonName', u'a*b.com'),),)}, 'axxb.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   263
    None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   264
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   265
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   266
    _verifycert({'subject': (((u'commonName', u'a*b.co*'),),)}, 'axxb.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   267
    b'certificate is for a*b.co*',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   268
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   269
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   270
    _verifycert({'subject': (((u'commonName', u'a*b*.com'),),)}, 'axxbxxc.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   271
    b'too many wildcards in certificate DNS name: a*b*.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   272
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   273
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   274
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   275
def test_url():
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   276
    """
37918
0dcd03637d36 tests: fix error case in test-url.py's doctest
Augie Fackler <augie@google.com>
parents: 29452
diff changeset
   277
    >>> from mercurial import error, pycompat
37999
d088810c496e tests: fix deprecation warning in test-url.py
Augie Fackler <augie@google.com>
parents: 37919
diff changeset
   278
    >>> from mercurial.util import url
d088810c496e tests: fix deprecation warning in test-url.py
Augie Fackler <augie@google.com>
parents: 37919
diff changeset
   279
    >>> from mercurial.utils.stringutil import forcebytestr
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   280
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   281
    This tests for edge cases in url.URL's parsing algorithm. Most of
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   282
    these aren't useful for documentation purposes, so they aren't
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   283
    part of the class's doc tests.
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   284
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   285
    Query strings and fragments:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   286
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   287
    >>> url(b'http://host/a?b#c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   288
    <url scheme: 'http', host: 'host', path: 'a', query: 'b', fragment: 'c'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   289
    >>> url(b'http://host/a?')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   290
    <url scheme: 'http', host: 'host', path: 'a'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   291
    >>> url(b'http://host/a#b#c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   292
    <url scheme: 'http', host: 'host', path: 'a', fragment: 'b#c'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   293
    >>> url(b'http://host/a#b?c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   294
    <url scheme: 'http', host: 'host', path: 'a', fragment: 'b?c'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   295
    >>> url(b'http://host/?a#b')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   296
    <url scheme: 'http', host: 'host', path: '', query: 'a', fragment: 'b'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   297
    >>> url(b'http://host/?a#b', parsequery=False)
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   298
    <url scheme: 'http', host: 'host', path: '?a', fragment: 'b'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   299
    >>> url(b'http://host/?a#b', parsefragment=False)
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   300
    <url scheme: 'http', host: 'host', path: '', query: 'a#b'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   301
    >>> url(b'http://host/?a#b', parsequery=False, parsefragment=False)
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   302
    <url scheme: 'http', host: 'host', path: '?a#b'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   303
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   304
    IPv6 addresses:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   305
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   306
    >>> url(b'ldap://[2001:db8::7]/c=GB?objectClass?one')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   307
    <url scheme: 'ldap', host: '[2001:db8::7]', path: 'c=GB',
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   308
         query: 'objectClass?one'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   309
    >>> url(b'ldap://joe:xxx@[2001:db8::7]:80/c=GB?objectClass?one')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   310
    <url scheme: 'ldap', user: 'joe', passwd: 'xxx', host: '[2001:db8::7]',
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   311
         port: '80', path: 'c=GB', query: 'objectClass?one'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   312
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   313
    Missing scheme, host, etc.:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   314
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   315
    >>> url(b'://192.0.2.16:80/')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   316
    <url path: '://192.0.2.16:80/'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   317
    >>> url(b'https://mercurial-scm.org')
26421
4b0fc75f9403 urls: bulk-change primary website URLs
Matt Mackall <mpm@selenic.com>
parents: 20685
diff changeset
   318
    <url scheme: 'https', host: 'mercurial-scm.org'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   319
    >>> url(b'/foo')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   320
    <url path: '/foo'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   321
    >>> url(b'bundle:/foo')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   322
    <url scheme: 'bundle', path: '/foo'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   323
    >>> url(b'a?b#c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   324
    <url path: 'a?b', fragment: 'c'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   325
    >>> url(b'http://x.com?arg=/foo')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   326
    <url scheme: 'http', host: 'x.com', query: 'arg=/foo'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   327
    >>> url(b'http://joe:xxx@/foo')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   328
    <url scheme: 'http', user: 'joe', passwd: 'xxx', path: 'foo'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   329
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   330
    Just a scheme and a path:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   331
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   332
    >>> url(b'mailto:John.Doe@example.com')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   333
    <url scheme: 'mailto', path: 'John.Doe@example.com'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   334
    >>> url(b'a:b:c:d')
13808
58b86b9149f1 url: fix tests
Matt Mackall <mpm@selenic.com>
parents: 13770
diff changeset
   335
    <url path: 'a:b:c:d'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   336
    >>> url(b'aa:bb:cc:dd')
13808
58b86b9149f1 url: fix tests
Matt Mackall <mpm@selenic.com>
parents: 13770
diff changeset
   337
    <url scheme: 'aa', path: 'bb:cc:dd'>
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   338
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   339
    SSH examples:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   340
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   341
    >>> url(b'ssh://joe@host//home/joe')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   342
    <url scheme: 'ssh', user: 'joe', host: 'host', path: '/home/joe'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   343
    >>> url(b'ssh://joe:xxx@host/src')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   344
    <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', path: 'src'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   345
    >>> url(b'ssh://joe:xxx@host')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   346
    <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   347
    >>> url(b'ssh://joe@host')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   348
    <url scheme: 'ssh', user: 'joe', host: 'host'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   349
    >>> url(b'ssh://host')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   350
    <url scheme: 'ssh', host: 'host'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   351
    >>> url(b'ssh://')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   352
    <url scheme: 'ssh'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   353
    >>> url(b'ssh:')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   354
    <url scheme: 'ssh'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   355
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   356
    Non-numeric port:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   357
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   358
    >>> url(b'http://example.com:dd')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   359
    <url scheme: 'http', host: 'example.com', port: 'dd'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   360
    >>> url(b'ssh://joe:xxx@host:ssh/foo')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   361
    <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', port: 'ssh',
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   362
         path: 'foo'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   363
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   364
    Bad authentication credentials:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   365
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   366
    >>> url(b'http://joe@joeville:123@4:@host/a?b#c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   367
    <url scheme: 'http', user: 'joe@joeville', passwd: '123@4:',
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   368
         host: 'host', path: 'a', query: 'b', fragment: 'c'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   369
    >>> url(b'http://!*#?/@!*#?/:@host/a?b#c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   370
    <url scheme: 'http', host: '!*', fragment: '?/@!*#?/:@host/a?b#c'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   371
    >>> url(b'http://!*#?@!*#?:@host/a?b#c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   372
    <url scheme: 'http', host: '!*', fragment: '?@!*#?:@host/a?b#c'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   373
    >>> url(b'http://!*@:!*@@host/a?b#c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   374
    <url scheme: 'http', user: '!*@', passwd: '!*@', host: 'host',
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   375
         path: 'a', query: 'b', fragment: 'c'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   376
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   377
    File paths:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   378
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   379
    >>> url(b'a/b/c/d.g.f')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   380
    <url path: 'a/b/c/d.g.f'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   381
    >>> url(b'/x///z/y/')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   382
    <url path: '/x///z/y/'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   383
    >>> url(b'/foo:bar')
13848
b2798c1defff url: be stricter about detecting schemes
Brodie Rao <brodie@bitheap.org>
parents: 13827
diff changeset
   384
    <url path: '/foo:bar'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   385
    >>> url(b'\\\\foo:bar')
13848
b2798c1defff url: be stricter about detecting schemes
Brodie Rao <brodie@bitheap.org>
parents: 13827
diff changeset
   386
    <url path: '\\\\foo:bar'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   387
    >>> url(b'./foo:bar')
13848
b2798c1defff url: be stricter about detecting schemes
Brodie Rao <brodie@bitheap.org>
parents: 13827
diff changeset
   388
    <url path: './foo:bar'>
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   389
13817
7f18bab2c0b0 url: abort on file:// URLs with non-localhost hosts
Brodie Rao <brodie@bitheap.org>
parents: 13808
diff changeset
   390
    Non-localhost file URL:
7f18bab2c0b0 url: abort on file:// URLs with non-localhost hosts
Brodie Rao <brodie@bitheap.org>
parents: 13808
diff changeset
   391
37918
0dcd03637d36 tests: fix error case in test-url.py's doctest
Augie Fackler <augie@google.com>
parents: 29452
diff changeset
   392
    >>> try:
0dcd03637d36 tests: fix error case in test-url.py's doctest
Augie Fackler <augie@google.com>
parents: 29452
diff changeset
   393
    ...   u = url(b'file://mercurial-scm.org/foo')
0dcd03637d36 tests: fix error case in test-url.py's doctest
Augie Fackler <augie@google.com>
parents: 29452
diff changeset
   394
    ... except error.Abort as e:
45687
223296268c4e tests: fix test-url.py on py3, broken by D9179
Martin von Zweigbergk <martinvonz@google.com>
parents: 45682
diff changeset
   395
    ...   pycompat.bytestr(e.message)
37918
0dcd03637d36 tests: fix error case in test-url.py's doctest
Augie Fackler <augie@google.com>
parents: 29452
diff changeset
   396
    'file:// URLs can only refer to localhost'
13817
7f18bab2c0b0 url: abort on file:// URLs with non-localhost hosts
Brodie Rao <brodie@bitheap.org>
parents: 13808
diff changeset
   397
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   398
    Empty URL:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   399
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   400
    >>> u = url(b'')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   401
    >>> u
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   402
    <url path: ''>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   403
    >>> str(u)
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   404
    ''
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   405
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   406
    Empty path with query string:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   407
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   408
    >>> str(url(b'http://foo/?bar'))
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   409
    'http://foo/?bar'
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   410
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   411
    Invalid path:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   412
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   413
    >>> u = url(b'http://foo/bar')
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   414
    >>> u.path = b'bar'
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   415
    >>> str(u)
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   416
    'http://foo/bar'
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   417
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   418
    >>> u = url(b'file:/foo/bar/baz')
14313
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   419
    >>> u
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   420
    <url scheme: 'file', path: '/foo/bar/baz'>
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   421
    >>> str(u)
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   422
    'file:///foo/bar/baz'
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   423
    >>> pycompat.bytestr(u.localpath())
15018
e89f62dcd723 url: really handle urls of the form file:///c:/foo/bar/ correctly
Mads Kiilerich <mads@kiilerich.com>
parents: 14666
diff changeset
   424
    '/foo/bar/baz'
14313
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   425
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   426
    >>> u = url(b'file:///foo/bar/baz')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   427
    >>> u
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   428
    <url scheme: 'file', path: '/foo/bar/baz'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   429
    >>> str(u)
14313
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   430
    'file:///foo/bar/baz'
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   431
    >>> pycompat.bytestr(u.localpath())
15018
e89f62dcd723 url: really handle urls of the form file:///c:/foo/bar/ correctly
Mads Kiilerich <mads@kiilerich.com>
parents: 14666
diff changeset
   432
    '/foo/bar/baz'
e89f62dcd723 url: really handle urls of the form file:///c:/foo/bar/ correctly
Mads Kiilerich <mads@kiilerich.com>
parents: 14666
diff changeset
   433
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   434
    >>> u = url(b'file:///f:oo/bar/baz')
15018
e89f62dcd723 url: really handle urls of the form file:///c:/foo/bar/ correctly
Mads Kiilerich <mads@kiilerich.com>
parents: 14666
diff changeset
   435
    >>> u
e89f62dcd723 url: really handle urls of the form file:///c:/foo/bar/ correctly
Mads Kiilerich <mads@kiilerich.com>
parents: 14666
diff changeset
   436
    <url scheme: 'file', path: 'f:oo/bar/baz'>
e89f62dcd723 url: really handle urls of the form file:///c:/foo/bar/ correctly
Mads Kiilerich <mads@kiilerich.com>
parents: 14666
diff changeset
   437
    >>> str(u)
15611
ec8a49c46d7e merge with stable
Matt Mackall <mpm@selenic.com>
parents: 15513 15609
diff changeset
   438
    'file:///f:oo/bar/baz'
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   439
    >>> pycompat.bytestr(u.localpath())
15018
e89f62dcd723 url: really handle urls of the form file:///c:/foo/bar/ correctly
Mads Kiilerich <mads@kiilerich.com>
parents: 14666
diff changeset
   440
    'f:oo/bar/baz'
14313
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   441
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   442
    >>> u = url(b'file://localhost/f:oo/bar/baz')
15496
396e83d635a6 url: handle file://localhost/c:/foo "correctly"
Mads Kiilerich <mads@kiilerich.com>
parents: 15398
diff changeset
   443
    >>> u
396e83d635a6 url: handle file://localhost/c:/foo "correctly"
Mads Kiilerich <mads@kiilerich.com>
parents: 15398
diff changeset
   444
    <url scheme: 'file', host: 'localhost', path: 'f:oo/bar/baz'>
396e83d635a6 url: handle file://localhost/c:/foo "correctly"
Mads Kiilerich <mads@kiilerich.com>
parents: 15398
diff changeset
   445
    >>> str(u)
15513
646759147717 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 15452 15496
diff changeset
   446
    'file://localhost/f:oo/bar/baz'
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   447
    >>> pycompat.bytestr(u.localpath())
15496
396e83d635a6 url: handle file://localhost/c:/foo "correctly"
Mads Kiilerich <mads@kiilerich.com>
parents: 15398
diff changeset
   448
    'f:oo/bar/baz'
396e83d635a6 url: handle file://localhost/c:/foo "correctly"
Mads Kiilerich <mads@kiilerich.com>
parents: 15398
diff changeset
   449
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   450
    >>> u = url(b'file:foo/bar/baz')
14313
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   451
    >>> u
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   452
    <url scheme: 'file', path: 'foo/bar/baz'>
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   453
    >>> str(u)
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   454
    'file:foo/bar/baz'
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   455
    >>> pycompat.bytestr(u.localpath())
15018
e89f62dcd723 url: really handle urls of the form file:///c:/foo/bar/ correctly
Mads Kiilerich <mads@kiilerich.com>
parents: 14666
diff changeset
   456
    'foo/bar/baz'
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   457
    """
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   458
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   459
15398
474279be5add tests: fix readline escape characters in heredoctest.py/test-url.py
Brodie Rao <brodie@bitheap.org>
parents: 15018
diff changeset
   460
if 'TERM' in os.environ:
474279be5add tests: fix readline escape characters in heredoctest.py/test-url.py
Brodie Rao <brodie@bitheap.org>
parents: 15018
diff changeset
   461
    del os.environ['TERM']
474279be5add tests: fix readline escape characters in heredoctest.py/test-url.py
Brodie Rao <brodie@bitheap.org>
parents: 15018
diff changeset
   462
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   463
doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)