tests/test-url.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Wed, 21 Feb 2024 13:05:29 +0100
changeset 51420 ac1c75188440
parent 48875 6000f5b25c9b
permissions -rw-r--r--
phases: invalidate the phases set less often on retract boundary We already have the information to update the phase set, so we do so directly instead of invalidating the cache. This show a sizeable speedup in our `perf::unbundle` benchmark on the many-draft mozilla-try repository. ### data-env-vars.name = mozilla-try-2023-03-22-zstd-sparse-revlog # benchmark.name = hg.perf.perf-unbundle # bin-env-vars.hg.flavor = no-rust # bin-env-vars.hg.py-re2-module = default # benchmark.variants.issue6528 = disabled # benchmark.variants.revs = last-10 before: 2.055259 seconds after: 1.887064 seconds (-8.18%) # benchmark.variants.revs = last-100 before: 2.409239 seconds after: 2.222429 seconds (-7.75%) # benchmark.variants.revs = last-1000 before: 3.945648 seconds after: 3.762480 seconds (-4.64%)
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
63fe5ddb8715 tests: make test-url use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28677
diff changeset
     3
import doctest
15398
474279be5add tests: fix readline escape characters in heredoctest.py/test-url.py
Brodie Rao <brodie@bitheap.org>
parents: 15018
diff changeset
     4
import os
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
     5
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
     6
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
     7
def check(a, b):
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
     8
    if a != b:
28677
2903558a6991 py3: make test-url use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 26421
diff changeset
     9
        print((a, b))
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    10
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    11
12606
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    12
def cert(cn):
20685
56b1f39dd0c1 test-url: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 15611
diff changeset
    13
    return {'subject': ((('commonName', cn),),)}
12606
5c8353692123 test-url: refactor with shorter lines
Martin Geisler <mg@aragost.com>
parents: 12592
diff changeset
    14
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    15
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    16
from mercurial import sslutil
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    17
28914
63fe5ddb8715 tests: make test-url use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28677
diff changeset
    18
_verifycert = sslutil._verifycert
12724
66e7ba85585b test-url: remove trailing whitespace
Augie Fackler <durin42@gmail.com>
parents: 12606
diff changeset
    19
# Test non-wildcard certificates
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    20
check(_verifycert(cert('example.com'), 'example.com'), None)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    21
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    22
    _verifycert(cert('example.com'), 'www.example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    23
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    24
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    25
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    26
    _verifycert(cert('www.example.com'), 'example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    27
    b'certificate is for www.example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    28
)
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    29
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    30
# Test wildcard certificates
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    31
check(_verifycert(cert('*.example.com'), 'www.example.com'), None)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    32
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    33
    _verifycert(cert('*.example.com'), 'example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    34
    b'certificate is for *.example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    35
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    36
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    37
    _verifycert(cert('*.example.com'), 'w.w.example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    38
    b'certificate is for *.example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    39
)
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    40
13249
75d0c38a0bca url: check subjectAltName when verifying ssl certificate
Yuya Nishihara <yuya@tcha.org>
parents: 13248
diff changeset
    41
# Test subjectAltName
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    42
san_cert = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    43
    'subject': ((('commonName', 'example.com'),),),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    44
    'subjectAltName': (('DNS', '*.example.net'), ('DNS', 'example.net')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    45
}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    46
check(_verifycert(san_cert, 'example.net'), None)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    47
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
    48
# no fallback to subject commonName when subjectAltName has DNS
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    49
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    50
    _verifycert(san_cert, 'example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    51
    b'certificate is for *.example.net, example.net',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    52
)
14666
27b080aa880a sslutil: fall back to commonName when no dNSName in subjectAltName (issue2798)
Nicolas Bareil <nico@chdir.org>
parents: 14313
diff changeset
    53
# fallback to subject commonName when no DNS in subjectAltName
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    54
san_cert = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    55
    'subject': ((('commonName', 'example.com'),),),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    56
    'subjectAltName': (('IP Address', '8.8.8.8'),),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    57
}
14666
27b080aa880a sslutil: fall back to commonName when no dNSName in subjectAltName (issue2798)
Nicolas Bareil <nico@chdir.org>
parents: 14313
diff changeset
    58
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
    59
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    60
# Avoid some pitfalls
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    61
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
    62
check(_verifycert(cert('*o'), 'foo'), None)
12592
f2937d6492c5 url: verify correctness of https server certificates (issue2407)
Mads Kiilerich <mads@kiilerich.com>
parents:
diff changeset
    63
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    64
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    65
    _verifycert({'subject': ()}, 'example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    66
    b'no commonName or subjectAltName found in certificate',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    67
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    68
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
    69
14666
27b080aa880a sslutil: fall back to commonName when no dNSName in subjectAltName (issue2798)
Nicolas Bareil <nico@chdir.org>
parents: 14313
diff changeset
    70
# Unicode (IDN) certname isn't supported
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    71
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    72
    _verifycert(cert(u'\u4f8b.jp'), 'example.jp'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    73
    b'IDN in certificate not supported',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    74
)
14666
27b080aa880a sslutil: fall back to commonName when no dNSName in subjectAltName (issue2798)
Nicolas Bareil <nico@chdir.org>
parents: 14313
diff changeset
    75
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
    76
# 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
    77
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
    78
check(_verifycert(cert('example.com'), 'ExAmple.cOm'), None)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    79
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    80
    _verifycert(cert('example.com'), 'www.example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    81
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    82
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    83
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    84
    _verifycert(cert('example.com'), '.example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    85
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    86
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    87
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    88
    _verifycert(cert('example.com'), 'example.org'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    89
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    90
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    91
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    92
    _verifycert(cert('example.com'), 'exampleXcom'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    93
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    94
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
    95
check(_verifycert(cert('*.a.com'), 'foo.a.com'), None)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    96
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    97
    _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: 37955
diff changeset
    98
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
    99
check(_verifycert(cert('*.a.com'), 'a.com'), b'certificate is for *.a.com')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   100
check(_verifycert(cert('*.a.com'), 'Xa.com'), b'certificate is for *.a.com')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   101
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
   102
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   103
# 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
   104
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
   105
check(_verifycert(cert('f*.com'), 'f.com'), None)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   106
check(_verifycert(cert('f*.com'), 'bar.com'), b'certificate is for f*.com')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   107
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: 37955
diff changeset
   108
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
   109
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   110
# NULL bytes are bad, CVE-2013-4073
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   111
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   112
    _verifycert(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   113
        cert('null.python.org\x00example.org'), 'null.python.org\x00example.org'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   114
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   115
    None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   116
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   117
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   118
    _verifycert(cert('null.python.org\x00example.org'), 'example.org'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   119
    b'certificate is for null.python.org\x00example.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   120
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   121
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   122
    _verifycert(cert('null.python.org\x00example.org'), 'null.python.org'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   123
    b'certificate is for null.python.org\x00example.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   124
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   125
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   126
# error cases with wildcards
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   127
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   128
    _verifycert(cert('*.*.a.com'), 'bar.foo.a.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   129
    b'certificate is for *.*.a.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   130
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   131
check(_verifycert(cert('*.*.a.com'), 'a.com'), b'certificate is for *.*.a.com')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   132
check(_verifycert(cert('*.*.a.com'), 'Xa.com'), b'certificate is for *.*.a.com')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   133
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
   134
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   135
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: 37955
diff changeset
   136
check(_verifycert(cert('a.*.com'), 'a..com'), b'certificate is for a.*.com')
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   137
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
   138
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   139
# 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
   140
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
   141
check(_verifycert(cert(idna), idna), None)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   142
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   143
    _verifycert(cert('x*.python.org'), idna),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   144
    b'certificate is for x*.python.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   145
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   146
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   147
    _verifycert(cert('xn--p*.python.org'), idna),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   148
    b'certificate is for xn--p*.python.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   149
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   150
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   151
# 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
   152
# are supported.
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   153
idna = u'www*.pythön.org'.encode('idna').decode('ascii')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   154
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   155
    _verifycert(cert(idna), u'www.pythön.org'.encode('idna').decode('ascii')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   156
    None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   157
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   158
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   159
    _verifycert(cert(idna), u'www1.pythön.org'.encode('idna').decode('ascii')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   160
    None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   161
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   162
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   163
    _verifycert(cert(idna), u'ftp.pythön.org'.encode('idna').decode('ascii')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   164
    b'certificate is for www*.xn--pythn-mua.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   165
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   166
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   167
    _verifycert(cert(idna), u'pythön.org'.encode('idna').decode('ascii')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   168
    b'certificate is for www*.xn--pythn-mua.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   169
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   170
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   171
c = {
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   172
    '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
   173
    'subject': (((u'commonName', u'linuxfrz.org'),),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   174
    'subjectAltName': (
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   175
        ('DNS', 'linuxfr.org'),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   176
        ('DNS', 'linuxfr.com'),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   177
        ('othername', '<unsupported>'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   178
    ),
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   179
}
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   180
check(_verifycert(c, 'linuxfr.org'), None)
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   181
check(_verifycert(c, 'linuxfr.com'), None)
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   182
# Not a "DNS" entry
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   183
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   184
    _verifycert(c, '<unsupported>'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   185
    b'certificate is for linuxfr.org, linuxfr.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   186
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   187
# When there is a subjectAltName, commonName isn't used
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   188
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   189
    _verifycert(c, 'linuxfrz.org'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   190
    b'certificate is for linuxfr.org, linuxfr.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   191
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   192
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   193
# A pristine real-world example
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   194
c = {
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   195
    '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
   196
    'subject': (
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   197
        ((u'countryName', u'US'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   198
        ((u'stateOrProvinceName', u'California'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   199
        ((u'localityName', u'Mountain View'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   200
        ((u'organizationName', u'Google Inc'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   201
        ((u'commonName', u'mail.google.com'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   202
    ),
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
check(_verifycert(c, 'mail.google.com'), None)
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   205
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
   206
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   207
# Only commonName is considered
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   208
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
   209
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   210
# Neither commonName nor subjectAltName
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   211
c = {
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   212
    '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
   213
    'subject': (
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   214
        ((u'countryName', u'US'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   215
        ((u'stateOrProvinceName', u'California'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   216
        ((u'localityName', u'Mountain View'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   217
        ((u'organizationName', u'Google Inc'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   218
    ),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   219
}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   220
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   221
    _verifycert(c, 'mail.google.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   222
    b'no commonName or subjectAltName found in certificate',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   223
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   224
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   225
# 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
   226
c = {
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   227
    '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
   228
    'subject': (
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   229
        ((u'countryName', u'US'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   230
        ((u'stateOrProvinceName', u'California'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   231
        ((u'localityName', u'Mountain View'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   232
        ((u'commonName', u'mail.google.com'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   233
    ),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   234
    'subjectAltName': (('othername', 'blabla'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   235
}
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   236
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
   237
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   238
# 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
   239
c = {
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   240
    '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
   241
    'subject': (
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   242
        ((u'countryName', u'US'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   243
        ((u'stateOrProvinceName', u'California'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   244
        ((u'localityName', u'Mountain View'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   245
        ((u'organizationName', u'Google Inc'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   246
    ),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   247
    'subjectAltName': (('othername', 'blabla'),),
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   248
}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   249
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   250
    _verifycert(c, 'google.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   251
    b'no commonName or subjectAltName found in certificate',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   252
)
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   253
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   254
# Empty cert / no cert
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   255
check(_verifycert(None, 'example.com'), b'no certificate received')
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   256
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
   257
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   258
# 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
   259
# wildcard per fragment.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   260
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   261
    _verifycert({'subject': (((u'commonName', u'a*b.com'),),)}, 'axxb.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   262
    None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   263
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   264
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   265
    _verifycert({'subject': (((u'commonName', u'a*b.co*'),),)}, 'axxb.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   266
    b'certificate is for a*b.co*',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   267
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   268
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   269
    _verifycert({'subject': (((u'commonName', u'a*b*.com'),),)}, 'axxbxxc.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   270
    b'too many wildcards in certificate DNS name: a*b*.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   271
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   272
29451
676f4d0e3a7b tests: import CPython's hostname matching tests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28914
diff changeset
   273
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   274
def test_url():
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   275
    """
37874
0dcd03637d36 tests: fix error case in test-url.py's doctest
Augie Fackler <augie@google.com>
parents: 29452
diff changeset
   276
    >>> from mercurial import error, pycompat
46907
ffd3e823a7e5 urlutil: extract `url` related code from `util` into the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45687
diff changeset
   277
    >>> from mercurial.utils.urlutil import url
37955
d088810c496e tests: fix deprecation warning in test-url.py
Augie Fackler <augie@google.com>
parents: 37875
diff changeset
   278
    >>> from mercurial.utils.stringutil import forcebytestr
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   279
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   280
    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
   281
    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
   282
    part of the class's doc tests.
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   283
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   284
    Query strings and fragments:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   285
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   286
    >>> url(b'http://host/a?b#c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   287
    <url scheme: 'http', host: 'host', path: 'a', query: 'b', fragment: 'c'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   288
    >>> url(b'http://host/a?')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   289
    <url scheme: 'http', host: 'host', path: 'a'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   290
    >>> url(b'http://host/a#b#c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   291
    <url scheme: 'http', host: 'host', path: 'a', fragment: 'b#c'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   292
    >>> url(b'http://host/a#b?c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   293
    <url scheme: 'http', host: 'host', path: 'a', fragment: 'b?c'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   294
    >>> url(b'http://host/?a#b')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   295
    <url scheme: 'http', host: 'host', path: '', query: 'a', fragment: 'b'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   296
    >>> url(b'http://host/?a#b', parsequery=False)
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   297
    <url scheme: 'http', host: 'host', path: '?a', fragment: 'b'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   298
    >>> url(b'http://host/?a#b', parsefragment=False)
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   299
    <url scheme: 'http', host: 'host', path: '', query: 'a#b'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   300
    >>> 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
   301
    <url scheme: 'http', host: 'host', path: '?a#b'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   302
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   303
    IPv6 addresses:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   304
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   305
    >>> 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
   306
    <url scheme: 'ldap', host: '[2001:db8::7]', path: 'c=GB',
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   307
         query: 'objectClass?one'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   308
    >>> 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
   309
    <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
   310
         port: '80', path: 'c=GB', query: 'objectClass?one'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   311
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   312
    Missing scheme, host, etc.:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   313
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   314
    >>> url(b'://192.0.2.16:80/')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   315
    <url path: '://192.0.2.16:80/'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   316
    >>> url(b'https://mercurial-scm.org')
26421
4b0fc75f9403 urls: bulk-change primary website URLs
Matt Mackall <mpm@selenic.com>
parents: 20685
diff changeset
   317
    <url scheme: 'https', host: 'mercurial-scm.org'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   318
    >>> url(b'/foo')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   319
    <url path: '/foo'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   320
    >>> url(b'bundle:/foo')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   321
    <url scheme: 'bundle', path: '/foo'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   322
    >>> url(b'a?b#c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   323
    <url path: 'a?b', fragment: 'c'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   324
    >>> url(b'http://x.com?arg=/foo')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   325
    <url scheme: 'http', host: 'x.com', query: 'arg=/foo'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   326
    >>> url(b'http://joe:xxx@/foo')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   327
    <url scheme: 'http', user: 'joe', passwd: 'xxx', path: 'foo'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   328
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   329
    Just a scheme and a path:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   330
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   331
    >>> url(b'mailto:John.Doe@example.com')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   332
    <url scheme: 'mailto', path: 'John.Doe@example.com'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   333
    >>> url(b'a:b:c:d')
13808
58b86b9149f1 url: fix tests
Matt Mackall <mpm@selenic.com>
parents: 13770
diff changeset
   334
    <url path: 'a:b:c:d'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   335
    >>> url(b'aa:bb:cc:dd')
13808
58b86b9149f1 url: fix tests
Matt Mackall <mpm@selenic.com>
parents: 13770
diff changeset
   336
    <url scheme: 'aa', path: 'bb:cc:dd'>
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   337
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   338
    SSH examples:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   339
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   340
    >>> url(b'ssh://joe@host//home/joe')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   341
    <url scheme: 'ssh', user: 'joe', host: 'host', path: '/home/joe'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   342
    >>> url(b'ssh://joe:xxx@host/src')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   343
    <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host', path: 'src'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   344
    >>> url(b'ssh://joe:xxx@host')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   345
    <url scheme: 'ssh', user: 'joe', passwd: 'xxx', host: 'host'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   346
    >>> url(b'ssh://joe@host')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   347
    <url scheme: 'ssh', user: 'joe', host: 'host'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   348
    >>> url(b'ssh://host')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   349
    <url scheme: 'ssh', host: 'host'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   350
    >>> url(b'ssh://')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   351
    <url scheme: 'ssh'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   352
    >>> url(b'ssh:')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   353
    <url scheme: 'ssh'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   354
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   355
    Non-numeric port:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   356
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   357
    >>> url(b'http://example.com:dd')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   358
    <url scheme: 'http', host: 'example.com', port: 'dd'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   359
    >>> url(b'ssh://joe:xxx@host:ssh/foo')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   360
    <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
   361
         path: 'foo'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   362
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   363
    Bad authentication credentials:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   364
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   365
    >>> 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
   366
    <url scheme: 'http', user: 'joe@joeville', passwd: '123@4:',
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   367
         host: 'host', path: 'a', query: 'b', fragment: 'c'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   368
    >>> url(b'http://!*#?/@!*#?/:@host/a?b#c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   369
    <url scheme: 'http', host: '!*', fragment: '?/@!*#?/:@host/a?b#c'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   370
    >>> url(b'http://!*#?@!*#?:@host/a?b#c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   371
    <url scheme: 'http', host: '!*', fragment: '?@!*#?:@host/a?b#c'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   372
    >>> url(b'http://!*@:!*@@host/a?b#c')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   373
    <url scheme: 'http', user: '!*@', passwd: '!*@', host: 'host',
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   374
         path: 'a', query: 'b', fragment: 'c'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   375
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   376
    File paths:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   377
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   378
    >>> url(b'a/b/c/d.g.f')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   379
    <url path: 'a/b/c/d.g.f'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   380
    >>> url(b'/x///z/y/')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   381
    <url path: '/x///z/y/'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   382
    >>> url(b'/foo:bar')
13848
b2798c1defff url: be stricter about detecting schemes
Brodie Rao <brodie@bitheap.org>
parents: 13827
diff changeset
   383
    <url path: '/foo:bar'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   384
    >>> url(b'\\\\foo:bar')
13848
b2798c1defff url: be stricter about detecting schemes
Brodie Rao <brodie@bitheap.org>
parents: 13827
diff changeset
   385
    <url path: '\\\\foo:bar'>
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   386
    >>> url(b'./foo:bar')
13848
b2798c1defff url: be stricter about detecting schemes
Brodie Rao <brodie@bitheap.org>
parents: 13827
diff changeset
   387
    <url path: './foo:bar'>
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   388
13817
7f18bab2c0b0 url: abort on file:// URLs with non-localhost hosts
Brodie Rao <brodie@bitheap.org>
parents: 13808
diff changeset
   389
    Non-localhost file URL:
7f18bab2c0b0 url: abort on file:// URLs with non-localhost hosts
Brodie Rao <brodie@bitheap.org>
parents: 13808
diff changeset
   390
37874
0dcd03637d36 tests: fix error case in test-url.py's doctest
Augie Fackler <augie@google.com>
parents: 29452
diff changeset
   391
    >>> try:
0dcd03637d36 tests: fix error case in test-url.py's doctest
Augie Fackler <augie@google.com>
parents: 29452
diff changeset
   392
    ...   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
   393
    ... 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
   394
    ...   pycompat.bytestr(e.message)
37874
0dcd03637d36 tests: fix error case in test-url.py's doctest
Augie Fackler <augie@google.com>
parents: 29452
diff changeset
   395
    '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
   396
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   397
    Empty URL:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   398
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   399
    >>> u = url(b'')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   400
    >>> u
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   401
    <url path: ''>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   402
    >>> str(u)
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   403
    ''
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
    Empty path with query string:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   406
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   407
    >>> str(url(b'http://foo/?bar'))
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   408
    'http://foo/?bar'
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   409
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   410
    Invalid path:
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   411
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   412
    >>> u = url(b'http://foo/bar')
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   413
    >>> u.path = b'bar'
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   414
    >>> str(u)
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   415
    'http://foo/bar'
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   416
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   417
    >>> 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
   418
    >>> u
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   419
    <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
   420
    >>> str(u)
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   421
    'file:///foo/bar/baz'
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   422
    >>> 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
   423
    '/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
   424
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   425
    >>> u = url(b'file:///foo/bar/baz')
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   426
    >>> u
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   427
    <url scheme: 'file', path: '/foo/bar/baz'>
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   428
    >>> str(u)
14313
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   429
    'file:///foo/bar/baz'
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   430
    >>> 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
   431
    '/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
   432
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   433
    >>> 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
   434
    >>> u
e89f62dcd723 url: really handle urls of the form file:///c:/foo/bar/ correctly
Mads Kiilerich <mads@kiilerich.com>
parents: 14666
diff changeset
   435
    <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
   436
    >>> str(u)
15611
ec8a49c46d7e merge with stable
Matt Mackall <mpm@selenic.com>
parents: 15513 15609
diff changeset
   437
    'file:///f:oo/bar/baz'
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   438
    >>> 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
   439
    '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
   440
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   441
    >>> 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
   442
    >>> u
396e83d635a6 url: handle file://localhost/c:/foo "correctly"
Mads Kiilerich <mads@kiilerich.com>
parents: 15398
diff changeset
   443
    <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
   444
    >>> str(u)
15513
646759147717 merge with stable
Matt Mackall <mpm@selenic.com>
parents: 15452 15496
diff changeset
   445
    'file://localhost/f:oo/bar/baz'
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   446
    >>> pycompat.bytestr(u.localpath())
15496
396e83d635a6 url: handle file://localhost/c:/foo "correctly"
Mads Kiilerich <mads@kiilerich.com>
parents: 15398
diff changeset
   447
    'f:oo/bar/baz'
396e83d635a6 url: handle file://localhost/c:/foo "correctly"
Mads Kiilerich <mads@kiilerich.com>
parents: 15398
diff changeset
   448
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   449
    >>> 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
   450
    >>> u
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   451
    <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
   452
    >>> str(u)
a389dd285282 util: make str(url) return file:/// for abs paths again
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 14204
diff changeset
   453
    'file:foo/bar/baz'
37875
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37874
diff changeset
   454
    >>> 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
   455
    'foo/bar/baz'
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   456
    """
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   457
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37955
diff changeset
   458
15398
474279be5add tests: fix readline escape characters in heredoctest.py/test-url.py
Brodie Rao <brodie@bitheap.org>
parents: 15018
diff changeset
   459
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
   460
    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
   461
13770
4e8f2310f310 url: provide url object
Brodie Rao <brodie@bitheap.org>
parents: 13249
diff changeset
   462
doctest.testmod(optionflags=doctest.NORMALIZE_WHITESPACE)