From: Daniele Varrazzo Date: Mon, 15 Nov 2021 01:15:47 +0000 (+0100) Subject: Warm up database before running tests X-Git-Tag: 3.0.5~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3cf7d2b01bbaad9c21dda358ff9e12dc535c570e;p=thirdparty%2Fpsycopg.git Warm up database before running tests Sometimes, in the test CI, the first connection may take a long time, and if the first test is about connection timeout, it might fail. https://github.com/psycopg/psycopg/runs/4206004327?check_suite_focus=true --- diff --git a/tests/fix_db.py b/tests/fix_db.py index 97287c42d..3e4c60ab8 100644 --- a/tests/fix_db.py +++ b/tests/fix_db.py @@ -1,5 +1,7 @@ import os import pytest +import logging +from typing import List from .utils import check_server_version @@ -37,6 +39,15 @@ def dsn(request): dsn = request.config.getoption("--test-dsn") if dsn is None: pytest.skip("skipping test as no --test-dsn") + + try: + warm_up_database(dsn) + except Exception: + # This is a session fixture, so, in case of error, the exception would + # be cached and nothing would run. + # Let the caller fail instead. + logging.exception("error warming up database") + return dsn @@ -155,3 +166,24 @@ def hstore(svcconn): svcconn.execute("create extension if not exists hstore") except Error as e: pytest.skip(str(e)) + + +def warm_up_database( + dsn: str, __first_connection: List[bool] = [True] +) -> None: + """Connect to the database before returning a connection. + + In the CI sometimes, the first test fails with a timeout, probably because + the server hasn't started yet. Absorb the delay before the test. + """ + # Do it only once, even in case of failure, otherwise, in case of bad + # configuration, with every test timing out, the entire test run would take + # forever. + if not __first_connection: + return + del __first_connection[:] + + import psycopg + + with psycopg.connect(dsn, connect_timeout=10) as conn: + conn.execute("select 1")