From 1871be13f7ab7d8739dba91ae14a916441f912e6 Mon Sep 17 00:00:00 2001 From: Lars Reimann Date: Thu, 2 May 2024 22:55:29 +0200 Subject: [PATCH] feat: method to check whether server is started --- src/safeds_runner/server/_server.py | 10 ++++++++-- tests/safeds_runner/server/test_server.py | 6 ++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/safeds_runner/server/_server.py b/src/safeds_runner/server/_server.py index 41db29a..c46c5d2 100644 --- a/src/safeds_runner/server/_server.py +++ b/src/safeds_runner/server/_server.py @@ -20,6 +20,8 @@ class SafeDsServer: def __init__(self) -> None: self._sio = socketio.AsyncServer(logger=True, async_mode="asgi") self._app = socketio.ASGIApp(self._sio) + self._server: uvicorn.Server | None = None + self._process_manager = ProcessManager() self._pipeline_manager = PipelineManager(self._process_manager) self._lock = Lock() @@ -35,14 +37,18 @@ async def startup(self, port: int) -> None: logging.info("Starting Safe-DS Runner on port %s...", str(port)) config = uvicorn.config.Config(self._app, host="127.0.0.1", port=port) - server = uvicorn.server.Server(config) - await server.serve() + self._server = uvicorn.Server(config) + await self._server.serve() async def shutdown(self) -> None: """Shutdown the server.""" self._process_manager.shutdown() await self._sio.shutdown() + def is_started(self) -> bool: + """Check if the server is started.""" + return self._server is not None and self._server.started + def _interrupt_handler(self, _signal: Any, _frame: Any) -> None: """Handle the interrupt signal.""" asyncio.get_running_loop().create_task(self.shutdown()) diff --git a/tests/safeds_runner/server/test_server.py b/tests/safeds_runner/server/test_server.py index 5f8bc6e..05f30f5 100644 --- a/tests/safeds_runner/server/test_server.py +++ b/tests/safeds_runner/server/test_server.py @@ -44,6 +44,12 @@ def run_server(): thread = threading.Thread(target=run_server, daemon=True) thread.start() + # Wait until the server is ready to accept connections + for _ in range(10 * BASE_TIMEOUT): + if server.is_started(): + break + await asyncio.sleep(0.1) + # Run the actual test yield