chrysn/aiocoap

gbulb tests fail for short-lived contexts

Closed this issue · 1 comments

The test_multiple_contexts test is failing with gbulb.

I don't have the time to trace it down, so for the moment, that one is being set to expected-failure.

One observation debugging it so far was that it's not actually the presence of multiple contexts that is causing the issue (running the teste with c1/c2 commented out fails the same). It's also no race condition -- there is something about how this is set up and shut down that doesn't sit well with gbulb.

test logs when removing c1/c2
===================================================================================================================================================== test session starts =======================================================================================================================================================
platform linux -- Python 3.11.5, pytest-7.4.2, pluggy-1.3.0
cachedir: .tox/py311-gbulb/.pytest_cache
rootdir: /home/chrysn/git/aiocoap
collected 241 items / 240 deselected / 1 selected                                                                                                                                                                                                                                                                                

tests/test_protocol.py F                                                                                                                                                                                                                                                                                                   [100%]

============================================================================================================================================================ FAILURES ============================================================================================================================================================
____________________________________________________________________________________________________________________________________________ TestProtocolSetup.test_multiple_contexts ____________________________________________________________________________________________________________________________________________

self = <tests.test_protocol.TestProtocolSetup testMethod=test_multiple_contexts>, function = <function TestProtocolSetup.test_multiple_contexts at 0x7f678799a4c0>, args = (), startcount = 0, result = None

    def wrapped(self, *args, function=function):
        # assertLogs does not work as assertDoesntLog anyway without major
        # tricking, and it interacts badly with WithLogMonitoring as they both
        # try to change the root logger's level.
    
        startcount = len(self.handler.list)
        result = function(self, *args)
        messages = [m.getMessage() for m in self.handler.list[startcount:] if m.levelno >= logging.WARNING and 'There is no current event loop' not in m.getMessage()]
        if len(expected_warnings) != len(messages) or not all(
                e == m or (e.endswith('...') and m.startswith(e[:-3]))
                for (e, m)
                in zip(expected_warnings, messages)):
>           self.assertEqual(messages, expected_warnings, "Function %s had unexpected warnings"%function.__name__)
E           AssertionError: Lists differ: ['Exception in callback ReadTransport._loo[1658 chars]op)'] != []
E           
E           First list contains 1 additional elements.
E           First extra element 0:
E           'Exception in callback ReadTransport._loop_reading(<Future cance...events.py:595>)\nhandle: <GLibHandle ReadTransport._loop_reading(<Future cance...events.py:595>) created at /home/chrysn/git/aiocoap/.tox/py311-gbulb/lib/python3.11/site-packages/gbulb/glib_events.py:146>\nsource_traceback: Object created at (most recent call last):\n  File "/usr/lib/python3.11/asyncio/events.py", line 80, in _run\n    self._context.run(self._callback, *self._args)\n  File "/home/chrysn/git/aiocoap/aiocoap/tokenmanager.py", line 61, in shutdown\n    await self.token_interface.shutdown()\n  File "/home/chrysn/git/aiocoap/aiocoap/messagemanager.py", line 71, in shutdown\n    await self.message_interface.shutdown()\n  File "/home/chrysn/git/aiocoap/aiocoap/transports/tinydtls_server.py", line 274, in shutdown\n    await super().shutdown()\n  File "/home/chrysn/git/aiocoap/aiocoap/transports/generic_udp.py", line 51, in shutdown\n    await self._pool.shutdown()\n  File "/home/chrysn/git/aiocoap/aiocoap/transports/simplesocketserver.py", line 124, in shutdown\n    self._transport.abort()\n  File "/home/chrysn/git/aiocoap/.tox/py311-gbulb/lib/python3.11/site-packages/gbulb/transports.py", line 193, in abort\n    self._force_close(None)\n  File "/home/chrysn/git/aiocoap/.tox/py311-gbulb/lib/python3.11/site-packages/gbulb/transports.py", line 68, in _force_close\n    cancelable.cancel()\n  File "/home/chrysn/git/aiocoap/.tox/py311-gbulb/lib/python3.11/site-packages/gbulb/glib_events.py", line 876, in call_soon\n    return GLibHandle(\n  File "/home/chrysn/git/aiocoap/.tox/py311-gbulb/lib/python3.11/site-packages/gbulb/glib_events.py", line 146, in __init__\n    super().__init__(callback, args, loop)'
E           
E           Diff is 1941 characters long. Set self.maxDiff to None to see it. : Function test_multiple_contexts had unexpected warnings

tests/fixtures.py:78: AssertionError
------------------------------------------------------------------------------------------------------------------------------------------------------- Captured log call --------------------------------------------------------------------------------------------------------------------------------------------------------
INFO     asyncio:base_events.py:1394 Datagram endpoint local_addr=('::1', 5684) remote_addr=None created: (<gbulb.transports.DatagramTransport object at 0x7f67877761e0>, <aiocoap.transports.tinydtls_server._DatagramServerSocketSimpleDTLS object at 0x7f67878ba360>)
INFO     asyncio:base_events.py:1553 <Server sockets=(<asyncio.TransportSocket fd=15, family=10, type=1, proto=6, laddr=('::1', 5683, 0, 0)>,)> is serving
INFO     asyncio:base_events.py:1553 <Server sockets=(<asyncio.TransportSocket fd=16, family=10, type=1, proto=6, laddr=('::1', 8683, 0, 0)>,)> is serving
INFO     websockets.server:server.py:711 server listening on [::1]:8683
DEBUG    asyncio:base_events.py:847 Get address info ::1:5683, type=<SocketKind.SOCK_DGRAM: 2>, proto=17, flags=<AddressInfo.AI_ADDRCONFIG: 32>
DEBUG    asyncio:base_events.py:857 Getting address info ::1:5683, type=<SocketKind.SOCK_DGRAM: 2>, proto=17, flags=<AddressInfo.AI_ADDRCONFIG: 32> took 0.193ms: [(<AddressFamily.AF_INET6: 10>, <SocketKind.SOCK_DGRAM: 2>, 17, '', ('::1', 5683, 0, 0))]
DEBUG    coap-server:protocol.py:299 Server ready to receive requests
DEBUG    coap-server:protocol.py:315 Shutting down context
DEBUG    coap-server:tcp.py:321 Shutting down server <aiocoap.transports.tcp.TCPServer object at 0x7f67878bb080>
DEBUG    coap-server:tcp.py:421 Shutting down any outgoing connections on on <aiocoap.transports.tcp.TCPClient object at 0x7f67878bb8a0>
DEBUG    coap-server:tcp.py:421 Shutting down any outgoing connections on on <aiocoap.transports.tls.TLSClient object at 0x7f67878bb7b0>
DEBUG    coap-server:ws.py:355 Shutting down any connections on <aiocoap.transports.ws.WSPool object at 0x7f67878bb9e0>
ERROR    asyncio:base_events.py:1771 Exception in callback ReadTransport._loop_reading(<Future cance...events.py:595>)
handle: <GLibHandle ReadTransport._loop_reading(<Future cance...events.py:595>) created at /home/chrysn/git/aiocoap/.tox/py311-gbulb/lib/python3.11/site-packages/gbulb/glib_events.py:146>
source_traceback: Object created at (most recent call last):
  File "/usr/lib/python3.11/asyncio/events.py", line 80, in _run
    self._context.run(self._callback, *self._args)
  File "/home/chrysn/git/aiocoap/aiocoap/tokenmanager.py", line 61, in shutdown
    await self.token_interface.shutdown()
  File "/home/chrysn/git/aiocoap/aiocoap/messagemanager.py", line 71, in shutdown
    await self.message_interface.shutdown()
  File "/home/chrysn/git/aiocoap/aiocoap/transports/tinydtls_server.py", line 274, in shutdown
    await super().shutdown()
  File "/home/chrysn/git/aiocoap/aiocoap/transports/generic_udp.py", line 51, in shutdown
    await self._pool.shutdown()
  File "/home/chrysn/git/aiocoap/aiocoap/transports/simplesocketserver.py", line 124, in shutdown
    self._transport.abort()
  File "/home/chrysn/git/aiocoap/.tox/py311-gbulb/lib/python3.11/site-packages/gbulb/transports.py", line 193, in abort
    self._force_close(None)
  File "/home/chrysn/git/aiocoap/.tox/py311-gbulb/lib/python3.11/site-packages/gbulb/transports.py", line 68, in _force_close
    cancelable.cancel()
  File "/home/chrysn/git/aiocoap/.tox/py311-gbulb/lib/python3.11/site-packages/gbulb/glib_events.py", line 876, in call_soon
    return GLibHandle(
  File "/home/chrysn/git/aiocoap/.tox/py311-gbulb/lib/python3.11/site-packages/gbulb/glib_events.py", line 146, in __init__
    super().__init__(callback, args, loop)
Traceback (most recent call last):
  File "/usr/lib/python3.11/asyncio/events.py", line 80, in _run
    self._context.run(self._callback, *self._args)
  File "/home/chrysn/git/aiocoap/.tox/py311-gbulb/lib/python3.11/site-packages/gbulb/transports.py", line 146, in _loop_reading
    data = fut.result()  # Deliver data later in "finally" clause
           ^^^^^^^^^^^^
asyncio.exceptions.CancelledError
INFO     websockets.server:server.py:763 server closing
INFO     websockets.server:server.py:804 server closed
==================================================================================================================================================== short test summary info =====================================================================================================================================================
FAILED tests/test_protocol.py::TestProtocolSetup::test_multiple_contexts - AssertionError: Lists differ: ['Exception in callback ReadTransport._loo[1658 chars]op)'] != []
=============================================================================================================================================== 1 failed, 240 deselected in 0.68s ================================================================================================================================================
py311-gbulb: exit 1 (0.94 seconds) /home/chrysn/git/aiocoap> sh -c 'if python3 --version |grep -iq pypy ; then python -Xdev -m pytest "$@" ; else python -Xdev -m coverage run --parallel -m pytest "$@" ; fi' arbitrary-name-for-our-script -k multiple pid=11617
.pkg: _exit> python /usr/lib/python3/dist-packages/pyproject_api/_backend.py True setuptools.build_meta
  py311-gbulb: FAIL code 1 (4.22=setup[3.12]+cmd[0.15,0.94] seconds)
  evaluation failed :( (4.28 seconds)

Closing as gbulb support is being phased out in favor of pygobject's upcoming native asyncio support.