Skip to content

Pytest 9 compatibility problems #178

Description

@rolandmas

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 :-)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions