Package: src:python-homematicip
Version: 1.1.2-1
Severity: serious
Tags: ftbfs

Dear maintainer:

During a rebuild of all packages in unstable, your package failed to build:

--------------------------------------------------------------------------------
[...]
 debian/rules build
make: pyversions: No such file or directory
py3versions: no X-Python3-Version in control file, using supported versions
dh build --buildsystem=pybuild --with python3
   dh_update_autotools_config -O--buildsystem=pybuild
   dh_autoreconf -O--buildsystem=pybuild
   dh_auto_configure -O--buildsystem=pybuild
   dh_auto_build -O--buildsystem=pybuild
I: pybuild plugin_pyproject:129: Building wheel for python3.12 with "build" 
module
I: pybuild base:311: python3.12 -m build --skip-dependency-check --no-isolation --wheel 
--outdir /<<PKGBUILDDIR>>/.pybuild/cpython3_3.12
* Building wheel...
running bdist_wheel
running build
running build_py

[... snipped ...]

        cancellation, wrap it in shield().
If the wait is cancelled, the task is also cancelled. If the task suppresses the cancellation and returns a value instead,
        that value is returned.
This function is a coroutine.
        """
        # The special case for timeout <= 0 is for the following case:
        #
        # async def test_waitfor():
        #     func_started = False
        #
        #     async def func():
        #         nonlocal func_started
        #         func_started = True
        #
        #     try:
        #         await asyncio.wait_for(func(), 0)
        #     except asyncio.TimeoutError:
        #         assert not func_started
        #     else:
        #         assert False
        #
        # asyncio.run(test_waitfor())
if timeout is not None and timeout <= 0:
            fut = ensure_future(fut)
if fut.done():
                return fut.result()
await _cancel_and_wait(fut)
            try:
                return fut.result()
            except exceptions.CancelledError as exc:
                raise TimeoutError from exc
async with timeouts.timeout(timeout):
          return await fut

/usr/lib/python3.12/asyncio/tasks.py:520:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/websockets/legacy/client.py:670: in 
__await_impl__
    await protocol.wait_closed()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <websockets.legacy.client.WebSocketClientProtocol object at 
0x7fd01c7ff680>

    async def wait_closed(self) -> None:
        """
        Wait until the connection is closed.
This coroutine is identical to the :attr:`closed` attribute, except it
        can be awaited.
This can make it easier to detect connection termination, regardless
        of its cause, in tasks that interact with the WebSocket connection.
"""
      await asyncio.shield(self.connection_lost_waiter)
E       asyncio.exceptions.CancelledError

/usr/lib/python3/dist-packages/websockets/legacy/protocol.py:799: CancelledError

The above exception was the direct cause of the following exception:

self = <homematicip.aio.connection.AsyncConnection object at 0x7fd01c7fd130>

    async def _connect_to_websocket(self):
        try:
          self.socket_connection = await asyncio.wait_for(
                websockets.connect(
                    self._urlWebSocket,
                    extra_headers={
                        ATTR_AUTH_TOKEN: self._auth_token,
                        ATTR_CLIENT_AUTH: self._clientauth_token,
                    },
                ),
                timeout=self.connect_timeout,
            )

src/homematicip/aio/connection.py:114:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.12/asyncio/tasks.py:519: in wait_for
    async with timeouts.timeout(timeout):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <Timeout [expired]>
exc_type = <class 'asyncio.exceptions.CancelledError'>
exc_val = CancelledError(), exc_tb = <traceback object at 0x7fd01bd12ac0>

    async def __aexit__(
        self,
        exc_type: Optional[Type[BaseException]],
        exc_val: Optional[BaseException],
        exc_tb: Optional[TracebackType],
    ) -> Optional[bool]:
        assert self._state in (_State.ENTERED, _State.EXPIRING)
if self._timeout_handler is not None:
            self._timeout_handler.cancel()
            self._timeout_handler = None
if self._state is _State.EXPIRING:
            self._state = _State.EXPIRED
if self._task.uncancel() <= self._cancelling and exc_type is exceptions.CancelledError:
                # Since there are no new cancel requests, we're
                # handling this.
              raise TimeoutError from exc_val
E               TimeoutError

/usr/lib/python3.12/asyncio/timeouts.py:115: TimeoutError

During handling of the above exception, another exception occurred:

simple_server = None
client_connection = <homematicip.aio.connection.AsyncConnection object at 
0x7fd01c7fd130>

    @pytest.mark.asyncio
    async def test_user_disconnect_and_reconnect(simple_server, 
client_connection):
        async def close_connection():
            await asyncio.sleep(2)
            await client_connection.close_websocket_connection()
      listener = await ws_listen(client_connection)

tests/aio_tests/test_connection.py:189:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/aio_tests/test_connection.py:150: in ws_listen
    ws_loop = await connection.ws_connect(on_message=on_message, 
on_error=on_error)
src/homematicip/aio/connection.py:131: in ws_connect
    await self._connect_to_websocket()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <homematicip.aio.connection.AsyncConnection object at 0x7fd01c7fd130>

    async def _connect_to_websocket(self):
        try:
            self.socket_connection = await asyncio.wait_for(
                websockets.connect(
                    self._urlWebSocket,
                    extra_headers={
                        ATTR_AUTH_TOKEN: self._auth_token,
                        ATTR_CLIENT_AUTH: self._clientauth_token,
                    },
                ),
                timeout=self.connect_timeout,
            )
        except asyncio.TimeoutError:
          raise HmipConnectionError("Connecting to hmip ws socket timed out.")
E           homematicip.base.base_connection.HmipConnectionError: Connecting to 
hmip ws socket timed out.

src/homematicip/aio/connection.py:125: HmipConnectionError
_______________________________ test_ws_message ________________________________

self = <websockets.legacy.client.Connect object at 0x7fd01b98b110>

    async def __await_impl__(self) -> WebSocketClientProtocol:
        async with asyncio_timeout(self.open_timeout):
            for _redirects in range(self.MAX_REDIRECTS_ALLOWED):
                _transport, protocol = await self._create_connection()
                try:
                  await protocol.handshake(
                        self._wsuri,
                        origin=protocol.origin,
                        available_extensions=protocol.available_extensions,
                        available_subprotocols=protocol.available_subprotocols,
                        extra_headers=protocol.extra_headers,
                    )

/usr/lib/python3/dist-packages/websockets/legacy/client.py:656:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/websockets/legacy/client.py:316: in handshake
    status_code, response_headers = await self.read_http_response()
/usr/lib/python3/dist-packages/websockets/legacy/client.py:134: in 
read_http_response
    status_code, reason, headers = await read_response(self.reader)
/usr/lib/python3/dist-packages/websockets/legacy/http.py:120: in read_response
    status_line = await read_line(stream)
/usr/lib/python3/dist-packages/websockets/legacy/http.py:194: in read_line
    line = await stream.readline()
/usr/lib/python3.12/asyncio/streams.py:568: in readline
    line = await self.readuntil(sep)
/usr/lib/python3.12/asyncio/streams.py:660: in readuntil
    await self._wait_for_data('readuntil')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <StreamReader limit=32768 transport=<_SelectorSocketTransport fd=22 read=polling 
write=<idle, bufsize=0>>>
func_name = 'readuntil'

    async def _wait_for_data(self, func_name):
        """Wait until feed_data() or feed_eof() is called.
If stream was paused, automatically resume it.
        """
        # StreamReader uses a future to link the protocol feed_data() method
        # to a read coroutine. Running two read coroutines at the same time
        # would have an unexpected behaviour. It would not possible to know
        # which coroutine would get the next data.
        if self._waiter is not None:
            raise RuntimeError(
                f'{func_name}() called while another coroutine is '
                f'already waiting for incoming data')
assert not self._eof, '_wait_for_data after EOF' # Waiting for data while paused will make deadlock, so prevent it.
        # This is essential for readexactly(n) for case when n > self._limit.
        if self._paused:
            self._paused = False
            self._transport.resume_reading()
self._waiter = self._loop.create_future()
        try:
          await self._waiter
E           asyncio.exceptions.CancelledError

/usr/lib/python3.12/asyncio/streams.py:545: CancelledError

During handling of the above exception, another exception occurred:

fut = <websockets.legacy.client.Connect object at 0x7fd01b98b110>, timeout = 20

    async def wait_for(fut, timeout):
        """Wait for the single Future or coroutine to complete, with timeout.
Coroutine will be wrapped in Task. Returns result of the Future or coroutine. When a timeout occurs,
        it cancels the task and raises TimeoutError.  To avoid the task
        cancellation, wrap it in shield().
If the wait is cancelled, the task is also cancelled. If the task suppresses the cancellation and returns a value instead,
        that value is returned.
This function is a coroutine.
        """
        # The special case for timeout <= 0 is for the following case:
        #
        # async def test_waitfor():
        #     func_started = False
        #
        #     async def func():
        #         nonlocal func_started
        #         func_started = True
        #
        #     try:
        #         await asyncio.wait_for(func(), 0)
        #     except asyncio.TimeoutError:
        #         assert not func_started
        #     else:
        #         assert False
        #
        # asyncio.run(test_waitfor())
if timeout is not None and timeout <= 0:
            fut = ensure_future(fut)
if fut.done():
                return fut.result()
await _cancel_and_wait(fut)
            try:
                return fut.result()
            except exceptions.CancelledError as exc:
                raise TimeoutError from exc
async with timeouts.timeout(timeout):
          return await fut

/usr/lib/python3.12/asyncio/tasks.py:520:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3/dist-packages/websockets/legacy/client.py:670: in 
__await_impl__
    await protocol.wait_closed()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <websockets.legacy.client.WebSocketClientProtocol object at 
0x7fd01c7fe570>

    async def wait_closed(self) -> None:
        """
        Wait until the connection is closed.
This coroutine is identical to the :attr:`closed` attribute, except it
        can be awaited.
This can make it easier to detect connection termination, regardless
        of its cause, in tasks that interact with the WebSocket connection.
"""
      await asyncio.shield(self.connection_lost_waiter)
E       asyncio.exceptions.CancelledError

/usr/lib/python3/dist-packages/websockets/legacy/protocol.py:799: CancelledError

The above exception was the direct cause of the following exception:

self = <homematicip.aio.connection.AsyncConnection object at 0x7fd01b98b0e0>

    async def _connect_to_websocket(self):
        try:
          self.socket_connection = await asyncio.wait_for(
                websockets.connect(
                    self._urlWebSocket,
                    extra_headers={
                        ATTR_AUTH_TOKEN: self._auth_token,
                        ATTR_CLIENT_AUTH: self._clientauth_token,
                    },
                ),
                timeout=self.connect_timeout,
            )

src/homematicip/aio/connection.py:114:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.12/asyncio/tasks.py:519: in wait_for
    async with timeouts.timeout(timeout):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <Timeout [expired]>
exc_type = <class 'asyncio.exceptions.CancelledError'>
exc_val = CancelledError(), exc_tb = <traceback object at 0x7fd01c9ce880>

    async def __aexit__(
        self,
        exc_type: Optional[Type[BaseException]],
        exc_val: Optional[BaseException],
        exc_tb: Optional[TracebackType],
    ) -> Optional[bool]:
        assert self._state in (_State.ENTERED, _State.EXPIRING)
if self._timeout_handler is not None:
            self._timeout_handler.cancel()
            self._timeout_handler = None
if self._state is _State.EXPIRING:
            self._state = _State.EXPIRED
if self._task.uncancel() <= self._cancelling and exc_type is exceptions.CancelledError:
                # Since there are no new cancel requests, we're
                # handling this.
              raise TimeoutError from exc_val
E               TimeoutError

/usr/lib/python3.12/asyncio/timeouts.py:115: TimeoutError

During handling of the above exception, another exception occurred:

single_message_server = None
client_connection = <homematicip.aio.connection.AsyncConnection object at 
0x7fd01b98b0e0>

    @pytest.mark.asyncio
    async def test_ws_message(single_message_server, client_connection):
        on_message_mock = Mock()
      listener = await ws_listen(client_connection, on_message=on_message_mock)

tests/aio_tests/test_connection.py:215:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
tests/aio_tests/test_connection.py:150: in ws_listen
    ws_loop = await connection.ws_connect(on_message=on_message, 
on_error=on_error)
src/homematicip/aio/connection.py:131: in ws_connect
    await self._connect_to_websocket()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <homematicip.aio.connection.AsyncConnection object at 0x7fd01b98b0e0>

    async def _connect_to_websocket(self):
        try:
            self.socket_connection = await asyncio.wait_for(
                websockets.connect(
                    self._urlWebSocket,
                    extra_headers={
                        ATTR_AUTH_TOKEN: self._auth_token,
                        ATTR_CLIENT_AUTH: self._clientauth_token,
                    },
                ),
                timeout=self.connect_timeout,
            )
        except asyncio.TimeoutError:
          raise HmipConnectionError("Connecting to hmip ws socket timed out.")
E           homematicip.base.base_connection.HmipConnectionError: Connecting to 
hmip ws socket timed out.

src/homematicip/aio/connection.py:125: HmipConnectionError
=============================== warnings summary ===============================
../../../usr/lib/python3/dist-packages/pytest_asyncio/plugin.py:255
  /usr/lib/python3/dist-packages/pytest_asyncio/plugin.py:255: PytestDeprecationWarning: 
no_ssl_fake_async_auth is asynchronous and explicitly requests the "event_loop" fixture. 
Asynchronous fixtures and test functions should use "asyncio.get_running_loop()" instead.
    warnings.warn(

../../../usr/lib/python3/dist-packages/pytest_asyncio/plugin.py:255
  /usr/lib/python3/dist-packages/pytest_asyncio/plugin.py:255: PytestDeprecationWarning: 
no_ssl_fake_async_home is asynchronous and explicitly requests the "event_loop" fixture. 
Asynchronous fixtures and test functions should use "asyncio.get_running_loop()" instead.
    warnings.warn(

../../../usr/lib/python3/dist-packages/pytest_asyncio/plugin.py:255
  /usr/lib/python3/dist-packages/pytest_asyncio/plugin.py:255: PytestDeprecationWarning: 
client_connection is asynchronous and explicitly requests the "event_loop" fixture. 
Asynchronous fixtures and test functions should use "asyncio.get_running_loop()" instead.
    warnings.warn(

tests/aio_tests/test_async_auth.py::test_async_auth_challenge_no_pin
  /usr/lib/python3/dist-packages/pytest_asyncio/plugin.py:783: 
DeprecationWarning: The event_loop fixture provided by pytest-asyncio has been 
redefined in
  /<<PKGBUILDDIR>>/tests/conftest.py:59
  Replacing the event_loop fixture with a custom implementation is deprecated
  and will lead to errors in the future.
  If you want to request an asyncio event loop with a scope other than function
  scope, use the "scope" argument to the asyncio mark when marking the tests.
  If you want to return different types of event loops, use the 
event_loop_policy
  fixture.
warnings.warn(

tests/aio_tests/test_async_auth.py::test_async_auth_challenge_no_pin
tests/aio_tests/test_async_auth.py::test_async_auth_challenge_no_pin
  /usr/lib/python3/dist-packages/aiohttp/web_urldispatcher.py:202: 
DeprecationWarning: Bare functions are deprecated, use async ones
    warnings.warn(

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
=========================== short test summary info ============================
FAILED tests/aio_tests/test_async_auth.py::test_async_auth_challenge_no_pin
FAILED tests/aio_tests/test_async_device.py::test_acceleration_sensor - Runti...
FAILED tests/aio_tests/test_async_device.py::test_tilt_vibration_sensor - Run...
FAILED tests/aio_tests/test_async_device.py::test_floor_terminal_block - Runt...
FAILED tests/aio_tests/test_async_device.py::test_basic_device_functions - Ru...
FAILED tests/aio_tests/test_async_device.py::test_water_sensor - RuntimeError...
FAILED tests/aio_tests/test_async_device.py::test_din_rail_dimmer_3 - Runtime...
FAILED tests/aio_tests/test_async_device.py::test_din_rail_switch_4 - Runtime...
FAILED 
tests/aio_tests/test_async_device.py::test_brand_switch_notification_light
FAILED tests/aio_tests/test_async_device.py::test_full_flush_shutter - Runtim...
FAILED tests/aio_tests/test_async_device.py::test_full_flush_blind - RuntimeE...
FAILED tests/aio_tests/test_async_device.py::test_din_rail_blind_4 - RuntimeE...
FAILED tests/aio_tests/test_async_device.py::test_door_sensor_tm - RuntimeErr...
FAILED tests/aio_tests/test_async_device.py::test_blind_module - RuntimeError...
FAILED tests/aio_tests/test_async_device.py::test_door_lock_drive - RuntimeEr...
FAILED tests/aio_tests/test_async_device.py::test_multibox_io - RuntimeError:...
FAILED tests/aio_tests/test_async_device.py::test_wired_din_rail_switch_4 - R...
FAILED tests/aio_tests/test_async_device.py::test_async_wired_push_button - R...
FAILED 
tests/aio_tests/test_async_functional_channels.py::test_acceleration_sensor_channel
FAILED tests/aio_tests/test_async_functional_channels.py::test_blind_channel
FAILED 
tests/aio_tests/test_async_functional_channels.py::test_device_base_floor_heating_channel
FAILED 
tests/aio_tests/test_async_functional_channels.py::test_device_operation_lock_channel
FAILED tests/aio_tests/test_async_functional_channels.py::test_door_channel
FAILED tests/aio_tests/test_async_functional_channels.py::test_door_lock_channel
FAILED 
tests/aio_tests/test_async_functional_channels.py::test_impulse_output_channel
FAILED 
tests/aio_tests/test_async_functional_channels.py::test_notification_light_channel
FAILED tests/aio_tests/test_async_functional_channels.py::test_shading_channel
FAILED tests/aio_tests/test_async_functional_channels.py::test_shutter_channel
FAILED tests/aio_tests/test_async_functional_channels.py::test_switch_channel
FAILED 
tests/aio_tests/test_async_functional_channels.py::test_switch_measuring_channel
FAILED 
tests/aio_tests/test_async_functional_channels.py::test_tilt_vibration_sensor_channel
FAILED 
tests/aio_tests/test_async_functional_channels.py::test_wall_mounted_thermostate_pro_channel
FAILED 
tests/aio_tests/test_async_functional_channels.py::test_water_sensor_channel
FAILED tests/aio_tests/test_async_groups.py::test_shutter_profile - RuntimeEr...
FAILED tests/aio_tests/test_async_groups.py::test_extended_linked_shutter_group
FAILED tests/aio_tests/test_async_groups.py::test_hot_water - RuntimeError: T...
FAILED tests/aio_tests/test_async_groups.py::test_switching_alarm_group - Run...
FAILED tests/aio_tests/test_async_groups.py::test_access_control - RuntimeErr...
FAILED 
tests/aio_tests/test_async_groups.py::test_access_authorization_profile_group
FAILED tests/aio_tests/test_async_groups.py::test_indoor_climate_group - Runt...
FAILED tests/aio_tests/test_async_groups.py::test_energy_group - RuntimeError...
FAILED tests/aio_tests/test_async_home.py::test_home_set_location - RuntimeEr...
FAILED tests/aio_tests/test_async_home.py::test_set_pin - RuntimeError: Timeo...
FAILED tests/aio_tests/test_async_home.py::test_indoor_climate_home - Runtime...
FAILED tests/aio_tests/test_async_home.py::test_set_powermeter_unit_price - R...
FAILED tests/aio_tests/test_async_home.py::test_set_timezone - RuntimeError: ...
FAILED tests/aio_tests/test_async_home.py::test_heating_vacation - RuntimeErr...
FAILED tests/aio_tests/test_async_home.py::test_security_setZoneActivationDelay
FAILED 
tests/aio_tests/test_async_home.py::test_security_setIntrusionAlertThroughSmokeDetectors
FAILED tests/aio_tests/test_async_home.py::test_home_getSecurityJournal - Run...
FAILED tests/aio_tests/test_async_home.py::test_home_getOAuthOTK - RuntimeErr...
FAILED tests/aio_tests/test_async_home.py::test_clearconfig - RuntimeError: T...
FAILED tests/aio_tests/test_async_home.py::test_rules - RuntimeError: Timeout...
FAILED tests/aio_tests/test_connection.py::test_ws_no_pong - homematicip.base...
FAILED tests/aio_tests/test_connection.py::test_connection_lost - homematicip...
FAILED tests/aio_tests/test_connection.py::test_user_disconnect_and_reconnect
FAILED tests/aio_tests/test_connection.py::test_ws_message - homematicip.base...
= 57 failed, 170 passed, 36 deselected, 6 warnings, 1 rerun in 125.24s 
(0:02:05) =
make[1]: *** [debian/rules:10: override_dh_auto_test] Error 1
make[1]: Leaving directory '/<<PKGBUILDDIR>>'
make: *** [debian/rules:7: build] Error 2
dpkg-buildpackage: error: debian/rules build subprocess returned exit status 2
--------------------------------------------------------------------------------

The above is just how the build ends and not necessarily the most relevant part.
If required, the full build log is available here:

https://people.debian.org/~sanvila/build-logs/202410/

About the archive rebuild: The build was made on virtual machines from AWS,
using sbuild and a reduced chroot with only build-essential packages.

If you could not reproduce the bug please contact me privately, as I
am willing to provide ssh access to a virtual machine where the bug is
fully reproducible.

If this is really a bug in one of the build-depends, please use
reassign and affects, so that this is still visible in the BTS web
page for this package.

Thanks.

Reply via email to