Skip to content

Commit 1bb03ba

Browse files
yngve-skeivindjahren
authored andcommitted
Make EverestClient tests wait for server to come up
1 parent fa509f8 commit 1bb03ba

File tree

1 file changed

+30
-9
lines changed

1 file changed

+30
-9
lines changed

tests/everest/test_everest_client.py

+30-9
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import logging
22
import ssl
33
import threading
4-
import time
54
from pathlib import Path
65

76
import pytest
7+
import requests
88
import uvicorn
99
from fastapi import FastAPI
1010
from starlette.responses import Response
@@ -15,6 +15,7 @@
1515
from everest.detached.jobs.everserver import _find_open_port
1616
from everest.gui.everest_client import EverestClient
1717
from everest.strings import STOP_ENDPOINT
18+
from tests.ert.utils import wait_until
1819

1920

2021
@pytest.fixture
@@ -24,6 +25,10 @@ def client_server_mock() -> tuple[FastAPI, threading.Thread, EverestClient]:
2425
port = _find_open_port(host, lower=5000, upper=5800)
2526
server_url = f"http://{host}:{port}"
2627

28+
@server_app.get("alive")
29+
def alive():
30+
return Response("Hello", status_code=200)
31+
2732
server = uvicorn.Server(
2833
uvicorn.Config(server_app, host=host, port=port, log_level="info")
2934
)
@@ -41,7 +46,23 @@ def client_server_mock() -> tuple[FastAPI, threading.Thread, EverestClient]:
4146
ssl_context=ssl.create_default_context(),
4247
)
4348

44-
yield server_app, server_thread, everest_client
49+
def wait_until_alive(timeout=60, sleep_between_retries=1) -> None:
50+
def ping_server() -> bool:
51+
try:
52+
requests.get(
53+
f"{server_url}/alive",
54+
verify="N/A",
55+
auth=("", ""),
56+
proxies={"http": None, "https": None}, # type: ignore
57+
)
58+
59+
return True
60+
except requests.exceptions.ConnectionError:
61+
return False
62+
63+
wait_until(ping_server, timeout=timeout, interval=sleep_between_retries)
64+
65+
yield server_app, server_thread, everest_client, wait_until_alive
4566

4667
if server_thread.is_alive():
4768
server.should_exit = True
@@ -51,14 +72,14 @@ def client_server_mock() -> tuple[FastAPI, threading.Thread, EverestClient]:
5172
def test_that_stop_invokes_correct_endpoint(
5273
caplog, client_server_mock: tuple[FastAPI, threading.Thread, EverestClient]
5374
):
54-
server_app, server_thread, client = client_server_mock
75+
server_app, server_thread, client, wait_until_alive = client_server_mock
5576

5677
@server_app.post(f"/{STOP_ENDPOINT}")
5778
def stop():
5879
return Response("STOP..", 200)
5980

6081
server_thread.start()
61-
time.sleep(0.1)
82+
wait_until_alive()
6283

6384
with caplog.at_level(logging.INFO):
6485
client.stop()
@@ -70,14 +91,14 @@ def stop():
7091
def test_that_stop_errors_on_non_ok_httpcode(
7192
caplog, client_server_mock: tuple[FastAPI, threading.Thread, EverestClient]
7293
):
73-
server_app, server_thread, client = client_server_mock
94+
server_app, server_thread, client, wait_until_alive = client_server_mock
7495

7596
@server_app.post(f"/{STOP_ENDPOINT}")
7697
def stop():
7798
return Response("STOP..", 505)
7899

79100
server_thread.start()
80-
time.sleep(0.1)
101+
wait_until_alive()
81102

82103
with caplog.at_level(logging.ERROR):
83104
client.stop()
@@ -92,7 +113,7 @@ def stop():
92113
def test_that_stop_errors_on_server_down(
93114
caplog, client_server_mock: tuple[FastAPI, threading.Thread, EverestClient]
94115
):
95-
_, _, client = client_server_mock
116+
_, _, client, _ = client_server_mock
96117

97118
with caplog.at_level(logging.ERROR):
98119
client.stop()
@@ -107,10 +128,10 @@ def test_that_stop_errors_on_server_down(
107128
def test_that_stop_errors_on_server_up_but_endpoint_down(
108129
caplog, client_server_mock: tuple[FastAPI, threading.Thread, EverestClient]
109130
):
110-
_, server_thread, client = client_server_mock
131+
_, server_thread, client, wait_until_alive = client_server_mock
111132

112133
server_thread.start()
113-
time.sleep(0.1)
134+
wait_until_alive()
114135

115136
with caplog.at_level(logging.ERROR):
116137
client.stop()

0 commit comments

Comments
 (0)