Hi there, your friendly Debian maintainer here :-)
As part of regular CI tests in Debian, it has been discovered that the qasync testsuite fails when run under Pytest 9. This is with qasync 0.28.0 on Debian unstable, and it happens both with Python 3.13 and Python 3.14.
The full logs are currently available at https://ci.debian.net/packages/q/qasync/testing/amd64/72572311/
In case they eventually expire, here's the hopefully relevant part:
67s ============================= test session starts ==============================
67s platform linux -- Python 3.14.6, pytest-9.1.1, pluggy-1.6.0
67s rootdir: /tmp/autopkgtest-lxc.v00y4wfw/downtmp/autopkgtest_tmp/build
67s configfile: pyproject.toml
67s testpaths: tests
67s plugins: xvfb-3.0.0
67s collected 60 items / 1 deselected / 59 selected
67s
69s tests/test_qeventloop.py ............................................... [ 79%]
69s [ 79%]
71s tests/test_qthreadexec.py ....FF [ 89%]
71s tests/test_run.py .s.... [100%]
71s
71s =================================== FAILURES ===================================
71s _____________________ test_no_stale_reference_as_argument ______________________
71s
71s executor = <qasync.QThreadExecutor object at 0x7f1369ebae50>
71s disable_executor_logging = None
71s
71s def test_no_stale_reference_as_argument(executor, disable_executor_logging):
71s test_obj = _TestObject()
71s test_obj_collected = threading.Event()
71s
71s # Reference to weakref has to be kept for callback to work
71s _ = weakref.ref(test_obj, lambda *_: test_obj_collected.set())
71s # Submit object as argument to the executor
71s future = executor.submit(lambda *_: None, test_obj)
71s del test_obj
71s # Wait for future to resolve
71s future.result()
71s
71s collected = test_obj_collected.wait(timeout=1)
71s > assert collected is True, (
71s "Stale reference to executor argument not collected within timeout."
71s )
71s E AssertionError: Stale reference to executor argument not collected within timeout.
71s E assert False is True
71s
71s tests/test_qthreadexec.py:89: AssertionError
71s ------------------------------ Captured log call -------------------------------
71s DEBUG qasync.QThreadExecutor:__init__.py:204 Submitting callback <function test_no_stale_reference_as_argument.<locals>.<lambda> at 0x7f1369ed56f0> with args (<test_qthreadexec._TestObject object at 0x7f1370b91d30>,) and kwargs {} to thread worker queue
71s DEBUG qasync._QThreadWorker:__init__.py:132 #2 got callback <function test_no_stale_reference_as_argument.<locals>.<lambda> at 0x7f1369ed56f0> with args (<test_qthreadexec._TestObject object at 0x7f1370b91d30>,) and kwargs {} from queue
71s DEBUG qasync._QThreadWorker:__init__.py:140 Invoking callback
71s DEBUG qasync._QThreadWorker:__init__.py:147 Setting Future result: None
71s ---------------------------- Captured log teardown -----------------------------
71s DEBUG qasync.QThreadExecutor:__init__.py:222 Shutting down
71s DEBUG qasync._QThreadWorker:__init__.py:161 Waiting for thread #1 to stop...
71s DEBUG qasync._QThreadWorker:__init__.py:158 Thread #4 stopped
71s DEBUG qasync._QThreadWorker:__init__.py:158 Thread #3 stopped
71s DEBUG qasync._QThreadWorker:__init__.py:158 Thread #1 stopped
71s DEBUG qasync._QThreadWorker:__init__.py:158 Thread #5 stopped
71s DEBUG qasync._QThreadWorker:__init__.py:158 Thread #2 stopped
71s DEBUG qasync._QThreadWorker:__init__.py:161 Waiting for thread #2 to stop...
71s DEBUG qasync._QThreadWorker:__init__.py:161 Waiting for thread #3 to stop...
71s DEBUG qasync._QThreadWorker:__init__.py:161 Waiting for thread #4 to stop...
71s DEBUG qasync._QThreadWorker:__init__.py:161 Waiting for thread #5 to stop...
71s ______________________ test_no_stale_reference_as_result _______________________
71s
71s executor = <qasync.QThreadExecutor object at 0x7f1369ebac50>
71s disable_executor_logging = None
71s
71s def test_no_stale_reference_as_result(executor, disable_executor_logging):
71s # Get object as result out of executor
71s test_obj = executor.submit(lambda: _TestObject()).result()
71s test_obj_collected = threading.Event()
71s
71s # Reference to weakref has to be kept for callback to work
71s _ = weakref.ref(test_obj, lambda *_: test_obj_collected.set())
71s del test_obj
71s
71s collected = test_obj_collected.wait(timeout=1)
71s > assert collected is True, (
71s "Stale reference to executor result not collected within timeout."
71s )
71s E AssertionError: Stale reference to executor result not collected within timeout.
71s E assert False is True
71s
71s tests/test_qthreadexec.py:104: AssertionError
71s ------------------------------ Captured log call -------------------------------
71s DEBUG qasync.QThreadExecutor:__init__.py:204 Submitting callback <function test_no_stale_reference_as_result.<locals>.<lambda> at 0x7f1369eb56f0> with args () and kwargs {} to thread worker queue
71s DEBUG qasync._QThreadWorker:__init__.py:132 #1 got callback <function test_no_stale_reference_as_result.<locals>.<lambda> at 0x7f1369eb56f0> with args () and kwargs {} from queue
71s DEBUG qasync._QThreadWorker:__init__.py:140 Invoking callback
71s DEBUG qasync._QThreadWorker:__init__.py:147 Setting Future result: <test_qthreadexec._TestObject object at 0x7f137007ead0>
71s ---------------------------- Captured log teardown -----------------------------
71s DEBUG qasync.QThreadExecutor:__init__.py:222 Shutting down
71s DEBUG qasync._QThreadWorker:__init__.py:161 Waiting for thread #1 to stop...
71s DEBUG qasync._QThreadWorker:__init__.py:158 Thread #4 stopped
71s DEBUG qasync._QThreadWorker:__init__.py:158 Thread #2 stopped
71s DEBUG qasync._QThreadWorker:__init__.py:158 Thread #1 stopped
71s DEBUG qasync._QThreadWorker:__init__.py:161 Waiting for thread #2 to stop...
71s DEBUG qasync._QThreadWorker:__init__.py:161 Waiting for thread #3 to stop...
71s DEBUG qasync._QThreadWorker:__init__.py:158 Thread #3 stopped
71s DEBUG qasync._QThreadWorker:__init__.py:161 Waiting for thread #4 to stop...
71s DEBUG qasync._QThreadWorker:__init__.py:161 Waiting for thread #5 to stop...
71s DEBUG qasync._QThreadWorker:__init__.py:158 Thread #5 stopped
71s =============================== warnings summary ===============================
71s tests/test_qeventloop.py: 226 warnings
71s tests/test_run.py: 50 warnings
71s /usr/lib/python3/dist-packages/qasync/__init__.py:489: DeprecationWarning: 'asyncio.iscoroutinefunction' is deprecated and slated for removal in Python 3.16; use inspect.iscoroutinefunction() instead
71s if asyncio.iscoroutinefunction(callback):
71s
71s -- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
71s =========================== short test summary info ============================
71s FAILED tests/test_qthreadexec.py::test_no_stale_reference_as_argument - Asser...
71s FAILED tests/test_qthreadexec.py::test_no_stale_reference_as_result - Asserti...
71s ===== 2 failed, 56 passed, 1 skipped, 1 deselected, 276 warnings in 4.70s ======
71s E: pybuild pybuild:485: test: plugin pyproject failed with: exit code=1: cd /tmp/autopkgtest-lxc.v00y4wfw/downtmp/autopkgtest_tmp/build; python3.14 -m pytest -k 'not test_regression_bug13'
I'm not 100% sure Pytest is to blame, but in any case this should be fixed :-)
Hi there, your friendly Debian maintainer here :-)
As part of regular CI tests in Debian, it has been discovered that the qasync testsuite fails when run under Pytest 9. This is with qasync 0.28.0 on Debian unstable, and it happens both with Python 3.13 and Python 3.14.
The full logs are currently available at https://ci.debian.net/packages/q/qasync/testing/amd64/72572311/
In case they eventually expire, here's the hopefully relevant part:
I'm not 100% sure Pytest is to blame, but in any case this should be fixed :-)