summaryrefslogtreecommitdiffstats
path: root/third_party/typ/typ/fakes/test_result_server_fake.py
blob: 4caeaf2f8fd9465b09edbdaf2f002c95649e4a91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# Copyright 2014 Google Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""A fake implementation of test-results.appspot.com."""

import io
import sys
import threading


if sys.version_info.major == 2:  # pragma: python2
    from SimpleHTTPServer import SimpleHTTPRequestHandler as HTTPRequestHandler
    from SocketServer import TCPServer
else:  # pragma: python3
    assert sys.version_info.major == 3
    # pylint: disable=redefined-builtin
    unicode = str
    from http.server import BaseHTTPRequestHandler  # pylint: disable=F0401
    HTTPRequestHandler = BaseHTTPRequestHandler
    from socketserver import TCPServer  # pylint: disable=F0401


def start(code=200):
    server = _Server(code=code)
    thread = threading.Thread(target=_run, args=(server,))
    server.main_thread = thread
    thread.daemon = True
    thread.start()
    return server


def _run(server):
    server.serve_forever(0.05)


class _Server(TCPServer):

    def __init__(self, code):
        self.allow_reuse_address = True
        TCPServer.__init__(self, ('localhost', 0), _RequestHandler)
        self.log = io.StringIO()
        self.requests = []
        self.main_thread = None
        self.code = code

    def stop(self):
        self.shutdown()
        self.main_thread.join()
        return self.requests


class _RequestHandler(HTTPRequestHandler):

    def __init__(self, *args, **kwargs):
        HTTPRequestHandler.__init__(self, *args, **kwargs)

    # 'Invalid Name' pylint: disable=C0103
    def do_POST(self):
        path = self.path
        length = int(self.headers['content-length'])
        payload = self.rfile.read(length)
        self.server.requests.append(('post', path, payload))
        self.send_response(self.server.code)
        self.end_headers()

    # 'Redefining built-in' pylint: disable=W0622
    def log_message(self, format, *args):
        self.server.log.write(unicode('%s\n' % (format % args)))