tests/dumbhttp.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Mon, 26 Feb 2024 15:44:44 +0100
changeset 51563 0d4a6ab3c8da
parent 49037 642e31cb55f0
child 51749 493034cc3265
permissions -rwxr-xr-x
branchcache-v3: use more explicit header line The key-value approach is clearer and gives more rooms to have the format evolve in a clear way. It also provides extension (like topic) simpler way to extend the validation scheme. This is just a small evolution, the V3 format is still a work in progress.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47505
23f5ed6dbcb1 run-tests: stop writing a `python3` symlink pointing to python2
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 45849
diff changeset
     1
#!/usr/bin/env python
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
     2
27282
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
     3
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
     4
"""
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
     5
Small and dumb HTTP server for use in tests.
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
     6
"""
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
     7
27282
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
     8
import optparse
31024
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30515
diff changeset
     9
import os
27282
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
    10
import signal
31024
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30515
diff changeset
    11
import socket
27282
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
    12
import sys
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
    13
27282
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
    14
from mercurial import (
38594
e46c3b6a47b5 py3: fix dumbhttp.py to convert --daemon-postexec arguments back to bytes
Yuya Nishihara <yuya@tcha.org>
parents: 37672
diff changeset
    15
    encoding,
37672
8bacc09814ba py3: make values bytes before passing into server.runservice()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34944
diff changeset
    16
    pycompat,
30515
d9d8d78e6bc9 server: move cmdutil.service() to new module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 29566
diff changeset
    17
    server,
29566
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28771
diff changeset
    18
    util,
27282
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
    19
)
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
    20
29566
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28771
diff changeset
    21
httpserver = util.httpserver
27282
0bb8c405a7c7 tests/dumbhttp: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23136
diff changeset
    22
OptionParser = optparse.OptionParser
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
    23
31024
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30515
diff changeset
    24
if os.environ.get('HGIPV6', '0') == '1':
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    25
31024
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30515
diff changeset
    26
    class simplehttpserver(httpserver.httpserver):
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30515
diff changeset
    27
        address_family = socket.AF_INET6
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    28
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    29
31024
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30515
diff changeset
    30
else:
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30515
diff changeset
    31
    simplehttpserver = httpserver.httpserver
d05fefbb5ab3 dumbhttp: use IPv6 if HGIPV6 is set to 1
Jun Wu <quark@fb.com>
parents: 30515
diff changeset
    32
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    33
34944
bf2db35a6fe7 test-static-http: flush access log per request
Yuya Nishihara <yuya@tcha.org>
parents: 34925
diff changeset
    34
class _httprequesthandler(httpserver.simplehttprequesthandler):
bf2db35a6fe7 test-static-http: flush access log per request
Yuya Nishihara <yuya@tcha.org>
parents: 34925
diff changeset
    35
    def log_message(self, format, *args):
bf2db35a6fe7 test-static-http: flush access log per request
Yuya Nishihara <yuya@tcha.org>
parents: 34925
diff changeset
    36
        httpserver.simplehttprequesthandler.log_message(self, format, *args)
bf2db35a6fe7 test-static-http: flush access log per request
Yuya Nishihara <yuya@tcha.org>
parents: 34925
diff changeset
    37
        sys.stderr.flush()
bf2db35a6fe7 test-static-http: flush access log per request
Yuya Nishihara <yuya@tcha.org>
parents: 34925
diff changeset
    38
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    39
49037
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48966
diff changeset
    40
class simplehttpservice:
23136
6eab50a34fed tests: have dumbhttp.py use cmdutil.service() to wait for child to listen()
Yuya Nishihara <yuya@tcha.org>
parents: 22959
diff changeset
    41
    def __init__(self, host, port):
6eab50a34fed tests: have dumbhttp.py use cmdutil.service() to wait for child to listen()
Yuya Nishihara <yuya@tcha.org>
parents: 22959
diff changeset
    42
        self.address = (host, port)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    43
23136
6eab50a34fed tests: have dumbhttp.py use cmdutil.service() to wait for child to listen()
Yuya Nishihara <yuya@tcha.org>
parents: 22959
diff changeset
    44
    def init(self):
34944
bf2db35a6fe7 test-static-http: flush access log per request
Yuya Nishihara <yuya@tcha.org>
parents: 34925
diff changeset
    45
        self.httpd = simplehttpserver(self.address, _httprequesthandler)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    46
23136
6eab50a34fed tests: have dumbhttp.py use cmdutil.service() to wait for child to listen()
Yuya Nishihara <yuya@tcha.org>
parents: 22959
diff changeset
    47
    def run(self):
6eab50a34fed tests: have dumbhttp.py use cmdutil.service() to wait for child to listen()
Yuya Nishihara <yuya@tcha.org>
parents: 22959
diff changeset
    48
        self.httpd.serve_forever()
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
    49
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    50
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
    51
if __name__ == '__main__':
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
    52
    parser = OptionParser()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    53
    parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    54
        '-p',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    55
        '--port',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    56
        dest='port',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    57
        type='int',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    58
        default=8000,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    59
        help='TCP port to listen on',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    60
        metavar='PORT',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    61
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    62
    parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    63
        '-H',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    64
        '--host',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    65
        dest='host',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    66
        default='localhost',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    67
        help='hostname or IP to listen on',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    68
        metavar='HOST',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    69
    )
34925
8b95e420e248 test-static-http: show all files accessed over HTTP
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
    70
    parser.add_option('--logfile', help='file name of access/error log')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    71
    parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    72
        '--pid',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    73
        dest='pid',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    74
        help='file name where the PID of the server is stored',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    75
    )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    76
    parser.add_option(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    77
        '-f',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    78
        '--foreground',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    79
        dest='foreground',
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
    80
        action='store_true',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    81
        help='do not start the HTTP server in the background',
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    82
    )
28451
c90cfe76e024 serve: accept multiple values for --daemon-postexec
Jun Wu <quark@fb.com>
parents: 28194
diff changeset
    83
    parser.add_option('--daemon-postexec', action='append')
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
    84
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
    85
    (options, args) = parser.parse_args()
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
    86
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
    87
    signal.signal(signal.SIGTERM, lambda x, y: sys.exit(0))
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
    88
34925
8b95e420e248 test-static-http: show all files accessed over HTTP
Yuya Nishihara <yuya@tcha.org>
parents: 31024
diff changeset
    89
    if options.foreground and options.logfile:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    90
        parser.error(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    91
            "options --logfile and --foreground are mutually " "exclusive"
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    92
        )
22959
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
    93
    if options.foreground and options.pid:
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
    94
        parser.error("options --pid and --foreground are mutually exclusive")
10116463b0b1 tests: pull common http server setup out of individual tests
Mike Hommey <mh@glandium.org>
parents:
diff changeset
    95
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    96
    opts = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    97
        b'pid_file': options.pid,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    98
        b'daemon': not options.foreground,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
    99
        b'daemon_postexec': pycompat.rapply(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
   100
            encoding.strtolocal, options.daemon_postexec
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
   101
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
   102
    }
23136
6eab50a34fed tests: have dumbhttp.py use cmdutil.service() to wait for child to listen()
Yuya Nishihara <yuya@tcha.org>
parents: 22959
diff changeset
   103
    service = simplehttpservice(options.host, options.port)
37672
8bacc09814ba py3: make values bytes before passing into server.runservice()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34944
diff changeset
   104
    runargs = [sys.executable, __file__] + sys.argv[1:]
8bacc09814ba py3: make values bytes before passing into server.runservice()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34944
diff changeset
   105
    runargs = [pycompat.fsencode(a) for a in runargs]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
   106
    server.runservice(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
   107
        opts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
   108
        initfn=service.init,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
   109
        runfn=service.run,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
   110
        logfile=options.logfile,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
   111
        runargs=runargs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 38594
diff changeset
   112
    )