]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Added failing tests to remember to implement connect_timeout
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Thu, 12 Nov 2020 02:13:03 +0000 (02:13 +0000)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Thu, 12 Nov 2020 02:26:27 +0000 (02:26 +0000)
tests/test_connection.py
tests/test_connection_async.py

index 126865376e074eee33cf10750735a8ad06fff68a..80f7f0b5cf8bf97bae6a1c024eb7252a0a75f517 100644 (file)
@@ -1,7 +1,10 @@
 import gc
+import time
+import socket
 import pytest
 import logging
 import weakref
+from threading import Thread
 
 import psycopg3
 from psycopg3 import Connection, Notify
@@ -30,6 +33,27 @@ def test_connect_bad():
         Connection.connect("dbname=nosuchdb")
 
 
+@pytest.mark.slow
+@pytest.mark.xfail
+def test_connect_timeout():
+    s = socket.socket(socket.AF_INET)
+    s.bind(("", 0))
+    port = s.getsockname()[1]
+    s.listen(0)
+
+    def closer():
+        time.sleep(1.5)
+        s.close()
+
+    Thread(target=closer).start()
+
+    t0 = time.time()
+    with pytest.raises(psycopg3.DatabaseError):
+        Connection.connect(host="localhost", port=port, connect_timeout=1)
+    elapsed = time.time() - t0
+    assert elapsed == pytest.approx(1.0, abs=0.05)
+
+
 def test_close(conn):
     assert not conn.closed
     conn.close()
index 86dc0345c9533ce1e3759a448602afb2cfa4fdfe..4c0a8da62699cf59938ca39e34f6f056fec42f1d 100644 (file)
@@ -1,5 +1,8 @@
 import gc
+import time
+import socket
 import pytest
+import asyncio
 import logging
 import weakref
 
@@ -18,7 +21,6 @@ async def test_connect(dsn):
     assert conn.pgconn.status == conn.ConnStatus.OK
 
 
-@pytest.mark.asyncio
 async def test_connect_bad():
     with pytest.raises(psycopg3.OperationalError):
         await AsyncConnection.connect("dbname=nosuchdb")
@@ -33,6 +35,32 @@ async def test_connect_str_subclass(dsn):
     assert conn.pgconn.status == conn.ConnStatus.OK
 
 
+@pytest.mark.slow
+@pytest.mark.xfail
+async def test_connect_timeout():
+    s = socket.socket(socket.AF_INET)
+    s.bind(("", 0))
+    port = s.getsockname()[1]
+    s.listen(0)
+
+    async def closer():
+        await asyncio.sleep(1.5)
+        s.close()
+
+    async def connect():
+        t0 = time.time()
+        with pytest.raises(psycopg3.DatabaseError):
+            await AsyncConnection.connect(
+                host="localhost", port=port, connect_timeout=1
+            )
+        nonlocal elapsed
+        elapsed = time.time() - t0
+
+    elapsed = 0
+    await asyncio.wait([closer(), connect()])
+    assert elapsed == pytest.approx(1.0, abs=0.05)
+
+
 async def test_close(aconn):
     assert not aconn.closed
     await aconn.close()