|
| 1 | +import http.client |
| 2 | +import threading |
| 3 | +import time |
| 4 | +from typing import Iterable |
| 5 | + |
| 6 | +import pytest |
| 7 | +from werkzeug.wrappers import Request |
| 8 | +from werkzeug.wrappers import Response |
| 9 | + |
| 10 | +from pytest_httpserver import HTTPServer |
| 11 | + |
| 12 | + |
| 13 | +@pytest.fixture() |
| 14 | +def threaded() -> Iterable[HTTPServer]: |
| 15 | + server = HTTPServer(threaded=True) |
| 16 | + server.start() |
| 17 | + yield server |
| 18 | + server.clear() |
| 19 | + if server.is_running(): |
| 20 | + server.stop() |
| 21 | + |
| 22 | + |
| 23 | +def test_threaded(threaded: HTTPServer): |
| 24 | + sleep_time = 0.5 |
| 25 | + |
| 26 | + def handler(_request: Request): |
| 27 | + # allow some time to the client to have multiple pending request |
| 28 | + # handlers running in parallel |
| 29 | + time.sleep(sleep_time) |
| 30 | + |
| 31 | + # send back thread id |
| 32 | + return Response(f"{threading.get_ident()}") |
| 33 | + |
| 34 | + threaded.expect_request("/foo").respond_with_handler(handler) |
| 35 | + |
| 36 | + t_start = time.perf_counter() |
| 37 | + |
| 38 | + number_of_connections = 5 |
| 39 | + conns = [http.client.HTTPConnection(threaded.host, threaded.port) for _ in range(number_of_connections)] |
| 40 | + |
| 41 | + for conn in conns: |
| 42 | + conn.request("GET", "/foo", headers={"Host": threaded.host}) |
| 43 | + |
| 44 | + thread_ids: list[int] = [] |
| 45 | + for conn in conns: |
| 46 | + response = conn.getresponse() |
| 47 | + |
| 48 | + assert response.status == 200 |
| 49 | + thread_ids.append(int(response.read())) |
| 50 | + |
| 51 | + for conn in conns: |
| 52 | + conn.close() |
| 53 | + |
| 54 | + t_elapsed = time.perf_counter() - t_start |
| 55 | + |
| 56 | + assert len(thread_ids) == len(set(thread_ids)), "thread ids returned should be unique" |
| 57 | + |
| 58 | + assert ( |
| 59 | + t_elapsed < number_of_connections * sleep_time * 0.9 |
| 60 | + ), "elapsed time should be less than processing sequential requests" |
0 commit comments