• Bug#1066738: python-asyncio-mqtt: FTBFS: dh_auto_test: error: pybuild -

    From Lucas Nussbaum@21:1/5 to All on Wed Mar 13 16:10:23 2024
    Source: python-asyncio-mqtt
    Version: 0.16.1-3
    Severity: serious
    Justification: FTBFS
    Tags: trixie sid ftbfs
    User: lucas@debian.org
    Usertags: ftbfs-20240313 ftbfs-trixie

    Hi,

    During a rebuild of all packages in sid, your package failed to build
    on amd64.


    Relevant part (hopefully):
    make[1]: Entering directory '/<<PKGBUILDDIR>>'
    echo "__version__ = version = '0.16.1'" > asyncio_mqtt/_version.py
    echo "__version_tuple__ = version_tuple = tuple('0.16.1'.split('.'))" >> asyncio_mqtt/_version.py
    make[1]: Leaving directory '/<<PKGBUILDDIR>>'
    dh_auto_build -O--buildsystem=pybuild
    I: pybuild plugin_pyproject:129: Building wheel for python3.11 with "build" module
    I: pybuild base:305: python3.11 -m build --skip-dependency-check --no-isolation --wheel --outdir /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncio_mqtt
    * Building wheel...
    running bdist_wheel
    running build
    running build_py
    creating build
    creating build/lib
    creating build/lib/asyncio_mqtt
    copying asyncio_mqtt/__init__.py -> build/lib/asyncio_mqtt
    copying asyncio_mqtt/error.py -> build/lib/asyncio_mqtt
    copying asyncio_mqtt/_version.py -> build/lib/asyncio_mqtt
    copying asyncio_mqtt/client.py -> build/lib/asyncio_mqtt
    copying asyncio_mqtt/types.py -> build/lib/asyncio_mqtt
    running egg_info
    creating asyncio_mqtt.egg-info
    writing asyncio_mqtt.egg-info/PKG-INFO
    writing dependency_links to asyncio_mqtt.egg-info/dependency_links.txt writing requirements to asyncio_mqtt.egg-info/requires.txt
    writing top-level names to asyncio_mqtt.egg-info/top_level.txt
    writing manifest file 'asyncio_mqtt.egg-info/SOURCES.txt'
    reading manifest file 'asyncio_mqtt.egg-info/SOURCES.txt'
    adding license file 'LICENSE'
    writing manifest file 'asyncio_mqtt.egg-info/SOURCES.txt'
    installing to build/bdist.linux-x86_64/wheel
    running install
    running install_lib
    creating build/bdist.linux-x86_64
    creating build/bdist.linux-x86_64/wheel
    creating build/bdist.linux-x86_64/wheel/asyncio_mqtt
    copying build/lib/asyncio_mqtt/__init__.py -> build/bdist.linux-x86_64/wheel/asyncio_mqtt
    copying build/lib/asyncio_mqtt/error.py -> build/bdist.linux-x86_64/wheel/asyncio_mqtt
    copying build/lib/asyncio_mqtt/_version.py -> build/bdist.linux-x86_64/wheel/asyncio_mqtt
    copying build/lib/asyncio_mqtt/client.py -> build/bdist.linux-x86_64/wheel/asyncio_mqtt
    copying build/lib/asyncio_mqtt/types.py -> build/bdist.linux-x86_64/wheel/asyncio_mqtt
    running install_egg_info
    Copying asyncio_mqtt.egg-info to build/bdist.linux-x86_64/wheel/asyncio_mqtt-0.0.0.egg-info
    running install_scripts
    creating build/bdist.linux-x86_64/wheel/asyncio_mqtt-0.0.0.dist-info/WHEEL creating '/<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncio_mqtt/.tmp-nh8imiqf/asyncio_mqtt-0.0.0-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
    adding 'asyncio_mqtt/__init__.py'
    adding 'asyncio_mqtt/_version.py'
    adding 'asyncio_mqtt/client.py'
    adding 'asyncio_mqtt/error.py'
    adding 'asyncio_mqtt/types.py'
    adding 'asyncio_mqtt-0.0.0.dist-info/LICENSE'
    adding 'asyncio_mqtt-0.0.0.dist-info/METADATA'
    adding 'asyncio_mqtt-0.0.0.dist-info/WHEEL'
    adding 'asyncio_mqtt-0.0.0.dist-info/top_level.txt'
    adding 'asyncio_mqtt-0.0.0.dist-info/RECORD'
    removing build/bdist.linux-x86_64/wheel
    Successfully built asyncio_mqtt-0.0.0-py3-none-any.whl
    I: pybuild plugin_pyproject:144: Unpacking wheel built for python3.11 with "installer" module
    dh_auto_test -O--buildsystem=pybuild
    I: pybuild base:305: cd /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncio_mqtt/build; python3.11 -m pytest tests
    ============================= test session starts ==============================
    platform linux -- Python 3.11.8, pytest-8.0.2, pluggy-1.4.0
    rootdir: /<<PKGBUILDDIR>>/.pybuild/cpython3_3.11_asyncio_mqtt/build configfile: pyproject.toml
    plugins: anyio-4.2.0
    collected 50 items

    tests/test_client.py ...ssssFFFsssssssss [ 38%]
    tests/test_error.py ..................FFF.......FFF [100%]

    =================================== FAILURES ===================================
    _____________________________ test_client_id[3-22] _____________________________

    protocol = <ProtocolVersion.V31: 3>, length = 22

    @pytest.mark.parametrize(
    "protocol, length",
    ((ProtocolVersion.V31, 22), (ProtocolVersion.V311, 0), (ProtocolVersion.V5, 0)),
    )
    async def test_client_id(protocol: ProtocolVersion, length: int) -> None:
    client = Client(HOSTNAME, protocol=protocol)

    tests/test_client.py:187:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    self = <asyncio_mqtt.client.Client object at 0x7fc604cef8d0>
    hostname = 'test.mosquitto.org', port = 1883

    def __init__( # noqa: C901
    self,
    hostname: str,
    port: int = 1883,
    *,
    username: str | None = None,
    password: str | None = None,
    logger: logging.Logger | None = None,
    client_id: str | None = None,
    tls_context: ssl.SSLContext | None = None,
    tls_params: TLSParameters | None = None,
    proxy: ProxySettings | None = None,
    protocol: ProtocolVersion | None = None,
    will: Will | None = None,
    clean_session: bool | None = None,
    transport: str = "tcp",
    keepalive: int = 60,
    bind_address: str = "",
    bind_port: int = 0,
    clean_start: int = mqtt.MQTT_CLEAN_START_FIRST_ONLY,
    properties: Properties | None = None,
    message_retry_set: int = 20,
    socket_options: Iterable[SocketOption] | None = None,
    max_concurrent_outgoing_calls: int | None = None,
    websocket_path: str | None = None,
    websocket_headers: WebSocketHeaders | None = None,
    ):
    self._hostname = hostname
    self._port = port
    self._keepalive = keepalive
    self._bind_address = bind_address
    self._bind_port = bind_port
    self._clean_start = clean_start
    self._properties = properties
    self._loop = asyncio.get_event_loop()
    self._connected: asyncio.Future[int | mqtt.ReasonCodes] = asyncio.Future()
    self._disconnected: asyncio.Future[
    int | mqtt.ReasonCodes | None
    ] = asyncio.Future()
    # Pending subscribe, unsubscribe, and publish calls
    self._pending_subscribes: dict[
    int, asyncio.Future[tuple[int] | list[mqtt.ReasonCodes]]
    ] = {}
    self._pending_unsubscribes: dict[int, asyncio.Event] = {}
    self._pending_publishes: dict[int, asyncio.Event] = {}
    self._pending_calls_threshold: int = 10
    self._misc_task: asyncio.Task[None] | None = None

    # List of all callbacks to call when a message is received
    self._on_message_callbacks: list[Callable[[Message], None]] = []
    self._unfiltered_messages_callback: Callable[
    [mqtt.Client, Any, mqtt.MQTTMessage], None
    ] | None = None

    self._outgoing_calls_sem: asyncio.Semaphore | None
    if max_concurrent_outgoing_calls is not None:
    self._outgoing_calls_sem = asyncio.Semaphore(max_concurrent_outgoing_calls)
    else:
    self._outgoing_calls_sem = None

    if protocol is None:
    protocol = ProtocolVersion.V311

    self._client: mqtt.Client = mqtt.Client(
    client_id=client_id,
    protocol=protocol,
    clean_session=clean_session,
    transport=transport,
    reconnect_on_failure=False,
    )
    E TypeError: Client.__init__() missing 1 required positional argument: 'callback_api_version'

    asyncio_mqtt/client.py:292: TypeError

    During handling of the above exception, another exception occurred:

    cls = <class '_pytest.runner.CallInfo'>
    func = <function call_runtest_hook.<locals>.<lambda> at 0x7fc605476840>
    when = 'call'
    reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
    cls,
    func: Callable[[], TResult],
    when: Literal["collect", "setup", "call", "teardown"],
    reraise: Optional[
    Union[Type[BaseException], Tuple[Type[BaseException], ...]]
    ] = None,
    ) -> "CallInfo[TResult]":
    """Call func, wrapping the result in a CallInfo.

    :param func:
    The function to call. Called without arguments.
    :param when:
    The phase in which the function is called.
    :param reraise:
    Exception or exceptions that shall propagate if raised by the
    function, instead of being wrapped in the CallInfo.
    """
    excinfo = None
    start = timing.time()
    precise_start = timing.perf_counter()
    try:
    result: Optional[TResult] = func()

    /usr/lib/python3/dist-packages/_pytest/runner.py:342:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    /usr/lib/python3/dist-packages/_pytest/runner.py:263: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise /usr/lib/python3/dist-packages/pluggy/_hooks.py:501: in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
    /usr/lib/python3/dist-packages/pluggy/_manager.py:119: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult) /usr/lib/python3/dist-packages/_pytest/threadexception.py:87: in pytest_runtest_call
    yield from thread_exception_runtest_hook() /usr/lib/python3/dist-packages/_pytest/threadexception.py:63: in thread_exception_runtest_hook
    yield
    /usr/lib/python3/dist-packages/_pytest/unraisableexception.py:90: in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    def unraisable_exception_runtest_hook() -> Generator[None, None, None]:
    with catch_unraisable_exception() as cm:
    try:
    yield
    finally:
    if cm.unraisable:
    if cm.unraisable.err_msg is not None:
    err_msg = cm.unraisable.err_msg
    else:
    err_msg = "Exception ignored in"
    msg = f"{err_msg}: {cm.unraisable.object!r}\n\n"
    msg += "".join(
    traceback.format_exception(
    cm.unraisable.exc_type,
    cm.unraisable.exc_value,
    cm.unraisable.exc_traceback,
    )
    )
    warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))
    E pytest.PytestUnraisableExceptionWarning: Exception ignored in: <function Client.__del__ at 0x7fc604d93560>
    E
    E Traceback (most recent call last):
    E File "/usr/lib/python3/dist-packages/paho/mqtt/client.py", line 874, in __del__
    E self._reset_sockets()
    E File "/usr/lib/python3/dist-packages/paho/mqtt/client.py", line 1133, in _reset_sockets
    E self._sock_close()
    E File "/usr/lib/python3/dist-packages/paho/mqtt/client.py", line 1119, in _sock_close
    E if not self._sock:
    E ^^^^^^^^^^
    E AttributeError: 'Client' object has no attribute '_sock'

    /usr/lib/python3/dist-packages/_pytest/unraisableexception.py:80: PytestUnraisableExceptionWarning
    _____________________________ test_client_id[4-0] ______________________________

    protocol = <ProtocolVersion.V311: 4>, length = 0

    @pytest.mark.parametrize(
    "protocol, length",
    ((ProtocolVersion.V31, 22), (ProtocolVersion.V311, 0), (ProtocolVersion.V5, 0)),
    )
    async def test_client_id(protocol: ProtocolVersion, length: int) -> None:
    client = Client(HOSTNAME, protocol=protocol)

    tests/test_client.py:187:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    self = <asyncio_mqtt.client.Client object at 0x7fc604987b90>
    hostname = 'test.mosquitto.org', port = 1883

    def __init__( # noqa: C901
    self,
    hostname: str,
    port: int = 1883,
    *,
    username: str | None = None,
    password: str | None = None,
    logger: logging.Logger | None = None,
    client_id: str | None = None,
    tls_context: ssl.SSLContext | None = None,
    tls_params: TLSParameters | None = None,
    proxy: ProxySettings | None = None,
    protocol: ProtocolVersion | None = None,
    will: Will | None = None,
    clean_session: bool | None = None,
    transport: str = "tcp",
    keepalive: int = 60,
    bind_address: str = "",
    bind_port: int = 0,
    clean_start: int = mqtt.MQTT_CLEAN_START_FIRST_ONLY,
    properties: Properties | None = None,
    message_retry_set: int = 20,
    socket_options: Iterable[SocketOption] | None = None,
    max_concurrent_outgoing_calls: int | None = None,
    websocket_path: str | None = None,
    websocket_headers: WebSocketHeaders | None = None,
    ):
    self._hostname = hostname
    self._port = port
    self._keepalive = keepalive
    self._bind_address = bind_address
    self._bind_port = bind_port
    self._clean_start = clean_start
    self._properties = properties
    self._loop = asyncio.get_event_loop()
    self._connected: asyncio.Future[int | mqtt.ReasonCodes] = asyncio.Future()
    self._disconnected: asyncio.Future[
    int | mqtt.ReasonCodes | None
    ] = asyncio.Future()
    # Pending subscribe, unsubscribe, and publish calls
    self._pending_subscribes: dict[
    int, asyncio.Future[tuple[int] | list[mqtt.ReasonCodes]]
    ] = {}
    self._pending_unsubscribes: dict[int, asyncio.Event] = {}
    self._pending_publishes: dict[int, asyncio.Event] = {}
    self._pending_calls_threshold: int = 10
    self._misc_task: asyncio.Task[None] | None = None

    # List of all callbacks to call when a message is received
    self._on_message_callbacks: list[Callable[[Message], None]] = []
    self._unfiltered_messages_callback: Callable[
    [mqtt.Client, Any, mqtt.MQTTMessage], None
    ] | None = None

    self._outgoing_calls_sem: asyncio.Semaphore | None
    if max_concurrent_outgoing_calls is not None:
    self._outgoing_calls_sem = asyncio.Semaphore(max_concurrent_outgoing_calls)
    else:
    self._outgoing_calls_sem = None

    if protocol is None:
    protocol = ProtocolVersion.V311

    self._client: mqtt.Client = mqtt.Client(
    client_id=client_id,
    protocol=protocol,
    clean_session=clean_session,
    transport=transport,
    reconnect_on_failure=False,
    )
    E TypeError: Client.__init__() missing 1 required positional argument: 'callback_api_version'

    asyncio_mqtt/client.py:292: TypeError

    During handling of the above exception, another exception occurred:

    cls = <class '_pytest.runner.CallInfo'>
    func = <function call_runtest_hook.<locals>.<lambda> at 0x7fc604ce8f40>
    when = 'call'
    reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
    cls,
    func: Callable[[], TResult],
    when: Literal["collect", "setup", "call", "teardown"],
    reraise: Optional[
    Union[Type[BaseException], Tuple[Type[BaseException], ...]]
    ] = None,
    ) -> "CallInfo[TResult]":
    """Call func, wrapping the result in a CallInfo.

    :param func:
    The function to call. Called without arguments.
    :param when:
    The phase in which the function is called.
    :param reraise:
    Exception or exceptions that shall propagate if raised by the
    function, instead of being wrapped in the CallInfo.
    """
    excinfo = None
    start = timing.time()
    precise_start = timing.perf_counter()
    try:
    result: Optional[TResult] = func()

    /usr/lib/python3/dist-packages/_pytest/runner.py:342:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    /usr/lib/python3/dist-packages/_pytest/runner.py:263: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise /usr/lib/python3/dist-packages/pluggy/_hooks.py:501: in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
    /usr/lib/python3/dist-packages/pluggy/_manager.py:119: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult) /usr/lib/python3/dist-packages/_pytest/threadexception.py:87: in pytest_runtest_call
    yield from thread_exception_runtest_hook() /usr/lib/python3/dist-packages/_pytest/threadexception.py:63: in thread_exception_runtest_hook
    yield
    /usr/lib/python3/dist-packages/_pytest/unraisableexception.py:90: in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    def unraisable_exception_runtest_hook() -> Generator[None, None, None]:
    with catch_unraisable_exception() as cm:
    try:
    yield
    finally:
    if cm.unraisable:
    if cm.unraisable.err_msg is not None:
    err_msg = cm.unraisable.err_msg
    else:
    err_msg = "Exception ignored in"
    msg = f"{err_msg}: {cm.unraisable.object!r}\n\n"
    msg += "".join(
    traceback.format_exception(
    cm.unraisable.exc_type,
    cm.unraisable.exc_value,
    cm.unraisable.exc_traceback,
    )
    )
    warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))
    E pytest.PytestUnraisableExceptionWarning: Exception ignored in: <function Client.__del__ at 0x7fc604d93560>
    E
    E Traceback (most recent call last):
    E File "/usr/lib/python3/dist-packages/paho/mqtt/client.py", line 874, in __del__
    E self._reset_sockets()
    E File "/usr/lib/python3/dist-packages/paho/mqtt/client.py", line 1133, in _reset_sockets
    E self._sock_close()
    E File "/usr/lib/python3/dist-packages/paho/mqtt/client.py", line 1119, in _sock_close
    E if not self._sock:
    E ^^^^^^^^^^
    E AttributeError: 'Client' object has no attribute '_sock'

    /usr/lib/python3/dist-packages/_pytest/unraisableexception.py:80: PytestUnraisableExceptionWarning
    _____________________________ test_client_id[5-0] ______________________________

    protocol = <ProtocolVersion.V5: 5>, length = 0

    @pytest.mark.parametrize(
    "protocol, length",
    ((ProtocolVersion.V31, 22), (ProtocolVersion.V311, 0), (ProtocolVersion.V5, 0)),
    )
    async def test_client_id(protocol: ProtocolVersion, length: int) -> None:
    client = Client(HOSTNAME, protocol=protocol)

    tests/test_client.py:187:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    self = <asyncio_mqtt.client.Client object at 0x7fc604a3d9d0>
    hostname = 'test.mosquitto.org', port = 1883

    def __init__( # noqa: C901
    self,
    hostname: str,
    port: int = 1883,
    *,
    username: str | None = None,
    password: str | None = None,
    logger: logging.Logger | None = None,
    client_id: str | None = None,
    tls_context: ssl.SSLContext | None = None,
    tls_params: TLSParameters | None = None,
    proxy: ProxySettings | None = None,
    protocol: ProtocolVersion | None = None,
    will: Will | None = None,
    clean_session: bool | None = None,
    transport: str = "tcp",
    keepalive: int = 60,
    bind_address: str = "",
    bind_port: int = 0,
    clean_start: int = mqtt.MQTT_CLEAN_START_FIRST_ONLY,
    properties: Properties | None = None,
    message_retry_set: int = 20,
    socket_options: Iterable[SocketOption] | None = None,
    max_concurrent_outgoing_calls: int | None = None,
    websocket_path: str | None = None,
    websocket_headers: WebSocketHeaders | None = None,
    ):
    self._hostname = hostname
    self._port = port
    self._keepalive = keepalive
    self._bind_address = bind_address
    self._bind_port = bind_port
    self._clean_start = clean_start
    self._properties = properties
    self._loop = asyncio.get_event_loop()
    self._connected: asyncio.Future[int | mqtt.ReasonCodes] = asyncio.Future()
    self._disconnected: asyncio.Future[
    int | mqtt.ReasonCodes | None
    ] = asyncio.Future()
    # Pending subscribe, unsubscribe, and publish calls
    self._pending_subscribes: dict[
    int, asyncio.Future[tuple[int] | list[mqtt.ReasonCodes]]
    ] = {}
    self._pending_unsubscribes: dict[int, asyncio.Event] = {}
    self._pending_publishes: dict[int, asyncio.Event] = {}
    self._pending_calls_threshold: int = 10
    self._misc_task: asyncio.Task[None] | None = None

    # List of all callbacks to call when a message is received
    self._on_message_callbacks: list[Callable[[Message], None]] = []
    self._unfiltered_messages_callback: Callable[
    [mqtt.Client, Any, mqtt.MQTTMessage], None
    ] | None = None

    self._outgoing_calls_sem: asyncio.Semaphore | None
    if max_concurrent_outgoing_calls is not None:
    self._outgoing_calls_sem = asyncio.Semaphore(max_concurrent_outgoing_calls)
    else:
    self._outgoing_calls_sem = None

    if protocol is None:
    protocol = ProtocolVersion.V311

    self._client: mqtt.Client = mqtt.Client(
    client_id=client_id,
    protocol=protocol,
    clean_session=clean_session,
    transport=transport,
    reconnect_on_failure=False,
    )
    E TypeError: Client.__init__() missing 1 required positional argument: 'callback_api_version'

    asyncio_mqtt/client.py:292: TypeError

    During handling of the above exception, another exception occurred:

    cls = <class '_pytest.runner.CallInfo'>
    func = <function call_runtest_hook.<locals>.<lambda> at 0x7fc604ce9120>
    when = 'call'
    reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
    cls,
    func: Callable[[], TResult],
    when: Literal["collect", "setup", "call", "teardown"],
    reraise: Optional[
    Union[Type[BaseException], Tuple[Type[BaseException], ...]]
    ] = None,
    ) -> "CallInfo[TResult]":
    """Call func, wrapping the result in a CallInfo.

    :param func:
    The function to call. Called without arguments.
    :param when:
    The phase in which the function is called.
    :param reraise:
    Exception or exceptions that shall propagate if raised by the
    function, instead of being wrapped in the CallInfo.
    """
    excinfo = None
    start = timing.time()
    precise_start = timing.perf_counter()
    try:
    result: Optional[TResult] = func()

    /usr/lib/python3/dist-packages/_pytest/runner.py:342:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    /usr/lib/python3/dist-packages/_pytest/runner.py:263: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise /usr/lib/python3/dist-packages/pluggy/_hooks.py:501: in __call__
    return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
    /usr/lib/python3/dist-packages/pluggy/_manager.py:119: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult) /usr/lib/python3/dist-packages/_pytest/threadexception.py:87: in pytest_runtest_call
    yield from thread_exception_runtest_hook() /usr/lib/python3/dist-packages/_pytest/threadexception.py:63: in thread_exception_runtest_hook
    yield
    /usr/lib/python3/dist-packages/_pytest/unraisableexception.py:90: in pytest_runtest_call
    yield from unraisable_exception_runtest_hook()
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    def unraisable_exception_runtest_hook() -> Generator[None, None, None]:
    with catch_unraisable_exception() as cm:
    try:
    yield
    finally:
    if cm.unraisable:
    if cm.unraisable.err_msg is not None:
    err_msg = cm.unraisable.err_msg
    else:
    err_msg = "Exception ignored in"
    msg = f"{err_msg}: {cm.unraisable.object!r}\n\n"
    msg += "".join(
    traceback.format_exception(
    cm.unraisable.exc_type,
    cm.unraisable.exc_value,
    cm.unraisable.exc_traceback,
    )
    )
    warnings.warn(pytest.PytestUnraisableExceptionWarning(msg))
    E pytest.PytestUnraisableExceptionWarning: Exception ignored in: <function Client.__del__ at 0x7fc604d93560>
    E
    E Traceback (most recent call last):
    E File "/usr/lib/python3/dist-packages/paho/mqtt/client.py", line 874, in __del__
    E self._reset_sockets()
    E File "/usr/lib/python3/dist-packages/paho/mqtt/client.py", line 1133, in _reset_sockets
    E self._sock_close()
    E File "/usr/lib/python3/dist-packages/paho/mqtt/client.py", line 1119, in _sock_close
    E if not self._sock:
    E ^^^^^^^^^^
    E AttributeError: 'Client' object has no attribute '_sock'

    /usr/lib/python3/dist-packages/_pytest/unraisableexception.py:80: PytestUnraisableExceptionWarning
    _________________ test_mqtt_code_error_reason_codes[2-Success] _________________

    packet_type = 2, a_name = 'Success'

    @pytest.mark.parametrize(
    "packet_type, a_name",
    (
    (PacketTypes.CONNACK, "Success"),
    (PacketTypes.PUBACK, "Success"),
    (PacketTypes.SUBACK, "Granted QoS 1"),
    ),
    )
    def test_mqtt_code_error_reason_codes(packet_type: int, a_name: str) -> None:
    rc = mqtt.ReasonCodes(packet_type, a_name)

    tests/test_error.py:44:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    self = <[AttributeError("'ReasonCodes' object has no attribute 'packetType'") raised in repr()] ReasonCodes object at 0x7fc6046182d0>
    args = (2, 'Success'), kwargs = {}

    def __init__(self, *args, **kwargs):
    warnings.warn("ReasonCodes is deprecated, use ReasonCode (singular) instead",
    category=DeprecationWarning,
    stacklevel=2,
    )
    E DeprecationWarning: ReasonCodes is deprecated, use ReasonCode (singular) instead

    /usr/lib/python3/dist-packages/paho/mqtt/reasoncodes.py:219: DeprecationWarning
    _________________ test_mqtt_code_error_reason_codes[4-Success] _________________

    packet_type = 4, a_name = 'Success'

    @pytest.mark.parametrize(
    "packet_type, a_name",
    (
    (PacketTypes.CONNACK, "Success"),
    (PacketTypes.PUBACK, "Success"),
    (PacketTypes.SUBACK, "Granted QoS 1"),
    ),
    )
    def test_mqtt_code_error_reason_codes(packet_type: int, a_name: str) -> None:
    rc = mqtt.ReasonCodes(packet_type, a_name)

    tests/test_error.py:44:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    self = <[AttributeError("'ReasonCodes' object has no attribute 'packetType'") raised in repr()] ReasonCodes object at 0x7fc604614f90>
    args = (4, 'Success'), kwargs = {}

    def __init__(self, *args, **kwargs):
    warnings.warn("ReasonCodes is deprecated, use ReasonCode (singular) instead",
    category=DeprecationWarning,
    stacklevel=2,
    )
    E DeprecationWarning: ReasonCodes is deprecated, use ReasonCode (singular) instead

    /usr/lib/python3/dist-packages/paho/mqtt/reasoncodes.py:219: DeprecationWarning
    ______________ test_mqtt_code_error_reason_codes[9-Granted QoS 1] ______________

    packet_type = 9, a_name = 'Granted QoS 1'

    @pytest.mark.parametrize(
    "packet_type, a_name",
    (
    (PacketTypes.CONNACK, "Success"),
    (PacketTypes.PUBACK, "Success"),
    (PacketTypes.SUBACK, "Granted QoS 1"),
    ),
    )
    def test_mqtt_code_error_reason_codes(packet_type: int, a_name: str) -> None:
    rc = mqtt.ReasonCodes(packet_type, a_name)

    tests/test_error.py:44:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    self = <[AttributeError("'ReasonCodes' object has no attribute 'packetType'") raised in repr()] ReasonCodes object at 0x7fc604a11cd0>
    args = (9, 'Granted QoS 1'), kwargs = {}

    def __init__(self, *args, **kwargs):
    warnings.warn("ReasonCodes is deprecated, use ReasonCode (singular) instead",
    category=DeprecationWarning,
    stacklevel=2,
    )
    E DeprecationWarning: ReasonCodes is deprecated, use ReasonCode (singular) instead

    /usr/lib/python3/dist-packages/paho/mqtt/reasoncodes.py:219: DeprecationWarning
    _______________ test_mqtt_connect_error_reason_codes[2-Success] ________________

    packet_type = 2, a_name = 'Success'

    @pytest.mark.parametrize(
    "packet_type, a_name",
    (
    (PacketTypes.CONNACK, "Success"),
    (PacketTypes.PUBACK, "Success"),
    (PacketTypes.SUBACK, "Granted QoS 1"),
    ),
    )
    def test_mqtt_connect_error_reason_codes(packet_type: int, a_name: str) -> None:
    rc = mqtt.ReasonCodes(packet_type, a_name)

    tests/test_error.py:71:
    _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    self = <[AttributeError("'ReasonCodes' object has no attribute 'packetType'") raised in repr()] ReasonCodes object at 0x7fc604a33f50>
    args = (2, 'Success'), kwargs = {}

    def __init__(self, *args, **kwargs):
    warnings.warn("ReasonCodes is deprecated, use ReasonCode (singular) instead",
    category=DeprecationWarning,
    stacklevel=2,
    )
    E DeprecationWarning: ReasonCodes is deprecated, use ReasonCode (singular) instead


    [continued in next message]

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)