Run keep alive tests in loop to get available port (#2779)

This commit is contained in:
Adam Hopkins 2023-07-09 22:58:17 +03:00 committed by GitHub
parent 666371bb92
commit 6848ff24d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -17,6 +17,7 @@ from sanic.response import text
CONFIG_FOR_TESTS = {"KEEP_ALIVE_TIMEOUT": 2, "KEEP_ALIVE": True} CONFIG_FOR_TESTS = {"KEEP_ALIVE_TIMEOUT": 2, "KEEP_ALIVE": True}
PORT = 42001 # test_keep_alive_timeout_reuse doesn't work with random port PORT = 42001 # test_keep_alive_timeout_reuse doesn't work with random port
MAX_LOOPS = 15
port_counter = count() port_counter = count()
@ -69,10 +70,15 @@ def test_keep_alive_timeout_reuse():
"""If the server keep-alive timeout and client keep-alive timeout are """If the server keep-alive timeout and client keep-alive timeout are
both longer than the delay, the client _and_ server will successfully both longer than the delay, the client _and_ server will successfully
reuse the existing connection.""" reuse the existing connection."""
loops = 0
while True:
port = get_port() port = get_port()
loop = asyncio.new_event_loop() loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop) asyncio.set_event_loop(loop)
client = ReusableClient(keep_alive_timeout_app_reuse, loop=loop, port=port) client = ReusableClient(
keep_alive_timeout_app_reuse, loop=loop, port=port
)
try:
with client: with client:
headers = {"Connection": "keep-alive"} headers = {"Connection": "keep-alive"}
request, response = client.get("/1", headers=headers) request, response = client.get("/1", headers=headers)
@ -86,6 +92,13 @@ def test_keep_alive_timeout_reuse():
assert response.status == 200 assert response.status == 200
assert response.text == "OK" assert response.text == "OK"
assert request.protocol.state["requests_count"] == 2 assert request.protocol.state["requests_count"] == 2
except OSError:
loops += 1
if loops > MAX_LOOPS:
raise
continue
else:
break
@pytest.mark.skipif( @pytest.mark.skipif(
@ -97,6 +110,9 @@ def test_keep_alive_timeout_reuse():
def test_keep_alive_client_timeout(): def test_keep_alive_client_timeout():
"""If the server keep-alive timeout is longer than the client """If the server keep-alive timeout is longer than the client
keep-alive timeout, client will try to create a new connection here.""" keep-alive timeout, client will try to create a new connection here."""
loops = 0
while True:
try:
port = get_port() port = get_port()
loop = asyncio.new_event_loop() loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop) asyncio.set_event_loop(loop)
@ -105,7 +121,9 @@ def test_keep_alive_client_timeout():
) )
with client: with client:
headers = {"Connection": "keep-alive"} headers = {"Connection": "keep-alive"}
request, response = client.get("/1", headers=headers, timeout=1) request, response = client.get(
"/1", headers=headers, timeout=1
)
assert response.status == 200 assert response.status == 200
assert response.text == "OK" assert response.text == "OK"
@ -114,6 +132,13 @@ def test_keep_alive_client_timeout():
loop.run_until_complete(aio_sleep(2)) loop.run_until_complete(aio_sleep(2))
request, response = client.get("/1", timeout=1) request, response = client.get("/1", timeout=1)
assert request.protocol.state["requests_count"] == 1 assert request.protocol.state["requests_count"] == 1
except OSError:
loops += 1
if loops > MAX_LOOPS:
raise
continue
else:
break
@pytest.mark.skipif( @pytest.mark.skipif(
@ -125,6 +150,9 @@ def test_keep_alive_server_timeout():
keep-alive timeout, the client will either a 'Connection reset' error keep-alive timeout, the client will either a 'Connection reset' error
_or_ a new connection. Depending on how the event-loop handles the _or_ a new connection. Depending on how the event-loop handles the
broken server connection.""" broken server connection."""
loops = 0
while True:
try:
port = get_port() port = get_port()
loop = asyncio.new_event_loop() loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop) asyncio.set_event_loop(loop)
@ -133,7 +161,9 @@ def test_keep_alive_server_timeout():
) )
with client: with client:
headers = {"Connection": "keep-alive"} headers = {"Connection": "keep-alive"}
request, response = client.get("/1", headers=headers, timeout=60) request, response = client.get(
"/1", headers=headers, timeout=60
)
assert response.status == 200 assert response.status == 200
assert response.text == "OK" assert response.text == "OK"
@ -143,6 +173,13 @@ def test_keep_alive_server_timeout():
request, response = client.get("/1", timeout=60) request, response = client.get("/1", timeout=60)
assert request.protocol.state["requests_count"] == 1 assert request.protocol.state["requests_count"] == 1
except OSError:
loops += 1
if loops > MAX_LOOPS:
raise
continue
else:
break
@pytest.mark.skipif( @pytest.mark.skipif(
@ -150,10 +187,15 @@ def test_keep_alive_server_timeout():
reason="Not testable with current client", reason="Not testable with current client",
) )
def test_keep_alive_connection_context(): def test_keep_alive_connection_context():
loops = 0
while True:
try:
port = get_port() port = get_port()
loop = asyncio.new_event_loop() loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop) asyncio.set_event_loop(loop)
client = ReusableClient(keep_alive_app_context, loop=loop, port=port) client = ReusableClient(
keep_alive_app_context, loop=loop, port=port
)
with client: with client:
headers = {"Connection": "keep-alive"} headers = {"Connection": "keep-alive"}
request1, _ = client.post("/ctx", headers=headers) request1, _ = client.post("/ctx", headers=headers)
@ -164,6 +206,15 @@ def test_keep_alive_connection_context():
assert response.text == "hello" assert response.text == "hello"
assert id(request1.conn_info.ctx) == id(request2.conn_info.ctx) assert id(request1.conn_info.ctx) == id(request2.conn_info.ctx)
assert ( assert (
request1.conn_info.ctx.foo == request2.conn_info.ctx.foo == "hello" request1.conn_info.ctx.foo
== request2.conn_info.ctx.foo
== "hello"
) )
assert request2.protocol.state["requests_count"] == 2 assert request2.protocol.state["requests_count"] == 2
except OSError:
loops += 1
if loops > MAX_LOOPS:
raise
continue
else:
break