From 4637b2edba33ddf3ea3609a640359fa0eb6f96dd Mon Sep 17 00:00:00 2001 From: moson Date: Mon, 27 Nov 2023 13:21:37 +0100 Subject: [PATCH] fix(tests): Fix test case for Prometheus metrics Disable prometheus multiprocess mode in tests to avoid global state: Depending on the workers which are processing a testfile, we might run into race issues where tests might influence each other. We also need to make sure to clear any previously collected values in case the same worker/process is executing different tests which evaluate prometheus values. Signed-off-by: moson --- aurweb/testing/prometheus.py | 8 ++++++++ test/conftest.py | 15 +++++++++++++++ test/test_metrics.py | 2 +- test/test_statistics.py | 9 ++------- 4 files changed, 26 insertions(+), 8 deletions(-) create mode 100644 aurweb/testing/prometheus.py diff --git a/aurweb/testing/prometheus.py b/aurweb/testing/prometheus.py new file mode 100644 index 00000000..d04190f6 --- /dev/null +++ b/aurweb/testing/prometheus.py @@ -0,0 +1,8 @@ +from aurweb import prometheus + + +def clear_metrics(): + prometheus.PACKAGES.clear() + prometheus.REQUESTS.clear() + prometheus.SEARCH_REQUESTS.clear() + prometheus.USERS.clear() diff --git a/test/conftest.py b/test/conftest.py index c36f78dd..575e9b98 100644 --- a/test/conftest.py +++ b/test/conftest.py @@ -43,6 +43,7 @@ from multiprocessing import Lock import py import pytest +from prometheus_client import values from sqlalchemy import create_engine from sqlalchemy.engine import URL from sqlalchemy.engine.base import Engine @@ -54,12 +55,16 @@ import aurweb.db from aurweb import aur_logging, initdb, testing from aurweb.testing.email import Email from aurweb.testing.git import GitRepository +from aurweb.testing.prometheus import clear_metrics logger = aur_logging.get_logger(__name__) # Synchronization lock for database setup. setup_lock = Lock() +# Disable prometheus multiprocess mode for tests +values.ValueClass = values.MutexValue + def test_engine() -> Engine: """ @@ -206,3 +211,13 @@ def email_test() -> None: that we set them up to be used via aurweb.testing.email.Email. """ setup_email() + + +@pytest.fixture +def prometheus_test(): + """ + Prometheus test fixture + + Removes any existing values from our metrics + """ + clear_metrics() diff --git a/test/test_metrics.py b/test/test_metrics.py index 6f67d926..c9f3d617 100644 --- a/test/test_metrics.py +++ b/test/test_metrics.py @@ -8,7 +8,7 @@ from aurweb.models.user import User @pytest.fixture(autouse=True) -def setup(db_test): +def setup(db_test, prometheus_test): return diff --git a/test/test_statistics.py b/test/test_statistics.py index 4057f4a1..4859a2ce 100644 --- a/test/test_statistics.py +++ b/test/test_statistics.py @@ -1,7 +1,7 @@ import pytest from prometheus_client import REGISTRY, generate_latest -from aurweb import cache, db, prometheus, time +from aurweb import cache, db, time from aurweb.models import Package, PackageBase, PackageRequest from aurweb.models.account_type import PACKAGE_MAINTAINER_ID, USER_ID from aurweb.models.package_request import ( @@ -16,7 +16,7 @@ from aurweb.statistics import Statistics, update_prometheus_metrics @pytest.fixture(autouse=True) -def setup(db_test): +def setup(db_test, prometheus_test): return @@ -140,11 +140,6 @@ def test_get_count_change(stats: Statistics, test_data): def test_update_prometheus_metrics(test_data): - # Make sure any previous data is cleared - prometheus.USERS.clear() - prometheus.PACKAGES.clear() - prometheus.REQUESTS.clear() - metrics = str(generate_latest(REGISTRY)) assert "aur_users{" not in metrics