Matthias Bisping 6030f4055a Pull request #12: Image prediction service overhaul xref and empty result fix fix
Merge in RR/image-prediction from image_prediction_service_overhaul_xref_and_empty_result_fix_fix to master

Squashed commit of the following:

commit 1dfa95b3e2875d58d19639a2110ba50a46e949aa
Merge: c9cad0e eb050a5
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date:   Thu May 12 10:13:40 2022 +0200

    Merge branch 'master' of ssh://git.iqser.com:2222/rr/image-prediction into image_prediction_service_overhaul_xref_and_empty_result_fix_fix

commit c9cad0eda55c32e4cb0b601679e39d4962b4b485
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date:   Mon Apr 25 17:06:59 2022 +0200

    logging setup changed

commit 89e33618fe6b8e30a376d619395db6a6c664e218
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date:   Mon Apr 25 17:01:44 2022 +0200

    logging setup changed

commit 7312e57d1127b081bfdc6e96311e8348d3f8110d
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date:   Mon Apr 25 16:45:12 2022 +0200

    logging setup changed

commit 955e353d74f414ee2d57b234bdf84d32817d14bf
Author: Matthias Bisping <matthias.bisping@iqser.com>
Date:   Mon Apr 25 16:37:52 2022 +0200

    fixed assignment
2022-05-12 10:18:13 +02:00

104 lines
2.4 KiB
Python

import socket
from multiprocessing import Process
import pytest
import requests
from funcy import retry
from waitress import serve
from image_prediction.flask import make_prediction_server
from image_prediction.pipeline import load_pipeline
@pytest.fixture
def host():
return "0.0.0.0"
def get_free_port(host):
sock = socket.socket()
sock.bind((host, 0))
return sock.getsockname()[1]
@pytest.fixture
def port(host):
return get_free_port(host)
@pytest.fixture
def url(host, port):
return f"http://{host}:{port}"
@pytest.fixture(params=["dummy", "actual"])
def server_type(request):
return request.param
@pytest.fixture
def server(server_type):
if server_type == "dummy":
return make_prediction_server(lambda x: int(x.decode()) // 2)
elif server_type == "actual":
return make_prediction_server(lambda x: list(load_pipeline(verbose=False)(x)))
else:
raise ValueError(f"Unknown server type {server_type}.")
@pytest.fixture
def host_and_port(host, port):
return {"host": host, "port": port}
@retry(tries=5, timeout=1)
def server_ready(url):
response = requests.get(f"{url}/ready")
response.raise_for_status()
return response.status_code == 200
@pytest.fixture(autouse=True, scope="function")
def server_process(server, host_and_port, url):
def get_server_process():
return Process(target=serve, kwargs={"app": server, **host_and_port})
server = get_server_process()
server.start()
if server_ready(url):
yield
server.kill()
server.join()
server.close()
@pytest.mark.parametrize("server_type", ["actual"])
@pytest.mark.skip()
def test_server_predict(url, real_pdf, real_expected_service_response):
response = requests.post(f"{url}/predict", data=real_pdf)
response.raise_for_status()
assert response.json() == real_expected_service_response
@pytest.mark.parametrize("server_type", ["dummy"])
def test_server_dummy_operation(url):
response = requests.post(f"{url}/predict", data=b"42")
response.raise_for_status()
assert response.json() == 21
@pytest.mark.parametrize("server_type", ["dummy"])
def test_server_health_check(url):
response = requests.get(f"{url}/health")
response.raise_for_status()
assert response.status_code == 200
@pytest.mark.parametrize("server_type", ["dummy"])
def test_server_ready_check(url):
assert server_ready(url)