From d12a8d1bde6dac4c00103d7fc534147e47483f44 Mon Sep 17 00:00:00 2001 From: conduition Date: Sat, 19 Oct 2024 19:01:32 -0400 Subject: [PATCH] wait for uvicorn server to bind before running tests (#607) * wait for uvicorn server to bind before running tests Previously we had a simple `time.sleep(1)` call after `server.start()` which was present to give the Mint's HTTP server time to spin up during test runs. This meant that if the server took longer than 1s to start on a dev's machine for any reason (even intermittently) then tests would fail due to connection errors. The fix is to use a simple repeated polling check which allows the test runner to start only once the server is confirmed listening. * fix linter errors * prevent infinite loop * specifically except httpx.ConnectError Co-authored-by: Pavol Rusnak --------- Co-authored-by: Pavol Rusnak --- tests/conftest.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tests/conftest.py b/tests/conftest.py index 4a2353f..024f02b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -6,6 +6,7 @@ import shutil import time from pathlib import Path +import httpx import pytest import pytest_asyncio import uvicorn @@ -27,7 +28,6 @@ settings.log_level = "TRACE" settings.cashu_dir = "./test_data/" settings.mint_host = "localhost" settings.mint_port = SERVER_PORT -settings.mint_host = "0.0.0.0" settings.mint_listen_port = SERVER_PORT settings.mint_url = SERVER_ENDPOINT settings.tor = False @@ -139,6 +139,16 @@ def mint(): server = UvicornServer(config=config) server.start() - time.sleep(1) + + # Wait until the server has bound to the localhost socket. Max out after 10s. + tries = 0 + while tries < 100: + try: + httpx.get(settings.mint_url) + break + except httpx.ConnectError: + tries += 1 + time.sleep(0.1) + yield server server.stop()