]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
test: make sure tests don't hang if default connection points to a closed port
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Mon, 2 Jun 2025 10:37:26 +0000 (11:37 +0100)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Mon, 2 Jun 2025 13:53:56 +0000 (14:53 +0100)
They might hang is the server doesn't accept connections on the standard
port.

Tested by forcing the default connection to go to an unresponsive port,
using:

    export PGHOST=192.0.2.1
    export PSYCOPG_TEST_DSN="host=localhost dbname=psycopg_test"

and fixing all the tests hanging because they try to connect to the
unroutable hostname, not taking into account the test dsn.

tests/pq/test_pgconn.py
tests/test_connection.py
tests/test_connection_async.py
tests/test_errors.py
tests/test_gevent.py
tests/test_waiting.py

index 657cab9b8a541946e93362e59d56aa50253e5aed..f6f7f2e9397e8ec2b2aae5081b282e9f66010e52 100644 (file)
@@ -16,6 +16,7 @@ import pytest
 import psycopg
 import psycopg.generators
 from psycopg import pq
+from psycopg.conninfo import make_conninfo
 
 if TYPE_CHECKING:
     from psycopg.pq.abc import PGcancelConn, PGconn
@@ -49,8 +50,8 @@ def test_connectdb(dsn):
     assert conn.status == pq.ConnStatus.OK, conn.error_message
 
 
-def test_connectdb_error():
-    conn = pq.PGconn.connect(b"dbname=psycopg_test_not_for_real")
+def test_connectdb_error(dsn):
+    conn = pq.PGconn.connect(make_conninfo(dsn, dbname="nosuchdb").encode())
     assert conn.status == pq.ConnStatus.BAD
 
 
@@ -179,7 +180,7 @@ def test_ping(dsn):
     rv = pq.PGconn.ping(dsn.encode())
     assert rv == pq.Ping.OK
 
-    rv = pq.PGconn.ping(b"port=9999")
+    rv = pq.PGconn.ping(make_conninfo(dsn, port=9999, connect_timeout=3).encode())
     assert rv == pq.Ping.NO_RESPONSE
 
 
index c340205c7b01bacacc04d3e06ba4f248cc66ea07..50c27ef6a3fd64dbb8117ea6eb7b3ed0f72947e6 100644 (file)
@@ -34,9 +34,9 @@ def test_connect(conn_cls, dsn):
     conn.close()
 
 
-def test_connect_bad(conn_cls):
+def test_connect_bad(conn_cls, dsn):
     with pytest.raises(psycopg.OperationalError):
-        conn_cls.connect("dbname=nosuchdb")
+        conn_cls.connect(dsn, dbname="nosuchdb")
 
 
 @pytest.mark.slow
index ea7e6f77dfbbc2b4be3f2b54e67ab79d55c3cf72..ef1efb80b1ead021dfe32d9e31b79a17f90961b1 100644 (file)
@@ -31,9 +31,9 @@ async def test_connect(aconn_cls, dsn):
     await conn.close()
 
 
-async def test_connect_bad(aconn_cls):
+async def test_connect_bad(aconn_cls, dsn):
     with pytest.raises(psycopg.OperationalError):
-        await aconn_cls.connect("dbname=nosuchdb")
+        await aconn_cls.connect(dsn, dbname="nosuchdb")
 
 
 @pytest.mark.slow
index 536cbf3e6b751aec3bf6a427d3be632658236af1..3c875b0c68d89253b053c29b7265ad3f9e98f62a 100644 (file)
@@ -286,18 +286,18 @@ def test_unknown_sqlstate(conn):
     assert pexc.sqlstate == code
 
 
-def test_pgconn_error(conn_cls):
+def test_pgconn_error(conn_cls, dsn):
     with pytest.raises(psycopg.OperationalError) as excinfo:
-        conn_cls.connect("dbname=nosuchdb")
+        conn_cls.connect(dsn, dbname="nosuchdb")
 
     exc = excinfo.value
     assert exc.pgconn
     assert exc.pgconn.db == b"nosuchdb"
 
 
-def test_pgconn_error_pickle(conn_cls):
+def test_pgconn_error_pickle(conn_cls, dsn):
     with pytest.raises(psycopg.OperationalError) as excinfo:
-        conn_cls.connect("dbname=nosuchdb")
+        conn_cls.connect(dsn, dbname="nosuchdb")
 
     exc = pickle.loads(pickle.dumps(excinfo.value))
     assert exc.pgconn is None
index 68df413142bb02c1210605ccde98a5744578a86e..0d39fa8f9a5c1034577166f53ae57927d8aad203 100644 (file)
@@ -53,7 +53,7 @@ print(json.dumps(dts))
     dts = json.loads(rv.stdout)
 
     for dt in dts:
-        assert TICK <= dt < TICK * 1.1
+        assert TICK <= dt < TICK * 1.2
 
 
 @pytest.mark.skipif("not psycopg._cmodule._psycopg")
index 22ce74ef92c04150fac013f36e98b8a2d836ac8b..fc5130386d3feb87747b1a9defef402f62d279be 100644 (file)
@@ -8,6 +8,7 @@ import pytest
 import psycopg
 from psycopg import generators, waiting
 from psycopg.pq import ConnStatus, ExecStatus
+from psycopg.conninfo import make_conninfo
 
 skip_if_not_linux = pytest.mark.skipif(
     not sys.platform.startswith("linux"), reason="non-Linux platform"
@@ -39,7 +40,7 @@ def test_wait_conn(dsn, timeout):
 
 
 def test_wait_conn_bad(dsn):
-    gen = generators.connect("dbname=nosuchdb")
+    gen = generators.connect(make_conninfo(dsn, dbname="nosuchdb"))
     with pytest.raises(psycopg.OperationalError):
         waiting.wait_conn(gen)
 
@@ -155,7 +156,7 @@ async def test_wait_conn_async(dsn, timeout):
 
 @pytest.mark.anyio
 async def test_wait_conn_async_bad(dsn):
-    gen = generators.connect("dbname=nosuchdb")
+    gen = generators.connect(make_conninfo(dsn, dbname="nosuchdb"))
     with pytest.raises(psycopg.OperationalError):
         await waiting.wait_conn_async(gen)