Skip to content

Commit b56037d

Browse files
committed
threads: add test for threaded HTTPServer
1 parent 3bb7021 commit b56037d

2 files changed

Lines changed: 61 additions & 0 deletions

File tree

tests/test_release.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ def test_sdist_contents(build: Build, version: str):
220220
"test_querystring.py",
221221
"test_release.py",
222222
"test_ssl.py",
223+
"test_threaded.py",
223224
"test_urimatch.py",
224225
"test_wait.py",
225226
"test_with_statement.py",

tests/test_threaded.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
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

Comments
 (0)