tests/test-url.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Wed, 31 May 2023 18:08:56 +0100
changeset 50674 c814101560d9
parent 48966 6000f5b25c9b
permissions -rw-r--r--
tree-manifest: allow `debugupgraderepo` to run on tree manifest repo There does not seems to be anything wrong with running the current logic on them. So we remove the limitation.
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: 37999
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: 37999
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: 37999
diff changeset
    15
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
    20
check(_verifycert(cert('example.com'), 'example.com'), None)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    21
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    22
    _verifycert(cert('example.com'), 'www.example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    23
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    24
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    25
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    26
    _verifycert(cert('www.example.com'), 'example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    27
    b'certificate is for www.example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
    31
check(_verifycert(cert('*.example.com'), 'www.example.com'), None)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    32
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    33
    _verifycert(cert('*.example.com'), 'example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    34
    b'certificate is for *.example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    35
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    36
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    37
    _verifycert(cert('*.example.com'), 'w.w.example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    38
    b'certificate is for *.example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
    42
san_cert = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    43
    'subject': ((('commonName', 'example.com'),),),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    44
    'subjectAltName': (('DNS', '*.example.net'), ('DNS', 'example.net')),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    45
}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    46
check(_verifycert(san_cert, 'example.net'), None)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
    49
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    50
    _verifycert(san_cert, 'example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    51
    b'certificate is for *.example.net, example.net',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
    54
san_cert = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    55
    'subject': ((('commonName', 'example.com'),),),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    56
    'subjectAltName': (('IP Address', '8.8.8.8'),),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
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: 37999
diff changeset
    64
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    65
    _verifycert({'subject': ()}, 'example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    66
    b'no commonName or subjectAltName found in certificate',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    67
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
    71
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    72
    _verifycert(cert(u'\u4f8b.jp'), 'example.jp'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    73
    b'IDN in certificate not supported',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
    79
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    80
    _verifycert(cert('example.com'), 'www.example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    81
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    82
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    83
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    84
    _verifycert(cert('example.com'), '.example.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    85
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    86
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    87
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    88
    _verifycert(cert('example.com'), 'example.org'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    89
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    90
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    91
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    92
    _verifycert(cert('example.com'), 'exampleXcom'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
    93
    b'certificate is for example.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
    96
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
    98
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
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: 37999
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: 37999
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: 37999
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: 37999
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: 37999
diff changeset
   111
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   112
    _verifycert(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
   114
    ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   115
    None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   116
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   117
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   118
    _verifycert(cert('null.python.org\x00example.org'), 'example.org'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   119
    b'certificate is for null.python.org\x00example.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   120
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   121
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   122
    _verifycert(cert('null.python.org\x00example.org'), 'null.python.org'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   123
    b'certificate is for null.python.org\x00example.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
   127
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   128
    _verifycert(cert('*.*.a.com'), 'bar.foo.a.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   129
    b'certificate is for *.*.a.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   130
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
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: 37999
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: 37999
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: 37999
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: 37999
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: 37999
diff changeset
   142
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   143
    _verifycert(cert('x*.python.org'), idna),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   144
    b'certificate is for x*.python.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   145
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   146
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   147
    _verifycert(cert('xn--p*.python.org'), idna),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   148
    b'certificate is for xn--p*.python.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
   154
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
   156
    None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   157
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   158
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
   160
    None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   161
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   162
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
   164
    b'certificate is for www*.xn--pythn-mua.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   165
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   166
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
   168
    b'certificate is for www*.xn--pythn-mua.org',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
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: 37999
diff changeset
   183
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   184
    _verifycert(c, '<unsupported>'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   185
    b'certificate is for linuxfr.org, linuxfr.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
   188
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   189
    _verifycert(c, 'linuxfrz.org'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   190
    b'certificate is for linuxfr.org, linuxfr.com',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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)
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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: 37999
diff changeset
   220
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   221
    _verifycert(c, 'mail.google.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   222
    b'no commonName or subjectAltName found in certificate',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
   249
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   250
    _verifycert(c, 'google.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   251
    b'no commonName or subjectAltName found in certificate',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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: 37918
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: 37999
diff changeset
   260
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   261
    _verifycert({'subject': (((u'commonName', u'a*b.com'),),)}, 'axxb.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   262
    None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   263
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   264
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   265
    _verifycert({'subject': (((u'commonName', u'a*b.co*'),),)}, 'axxb.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   266
    b'certificate is for a*b.co*',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   267
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   268
check(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
diff changeset
   269
    _verifycert({'subject': (((u'commonName', u'a*b*.com'),),)}, 'axxbxxc.com'),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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: 37999
diff changeset
   271
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 37999
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
    """
37918
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
37999
d088810c496e tests: fix deprecation warning in test-url.py
Augie Fackler <augie@google.com>
parents: 37919
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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/'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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/'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'>
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37918
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)
37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
diff changeset
   412
    >>> u = url(b'http://foo/bar')
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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'
37919
078c3eec2d5c tests: port test-url.py to Python 3
Augie Fackler <augie@google.com>
parents: 37918
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: 37999
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)