Пример #1
0
 def test_disconnect_response(self):
     """Test string representation of KNX/IP DisconnectResponse."""
     disconnect_response = DisconnectResponse()
     disconnect_response.communication_channel_id = 23
     assert (
         str(disconnect_response) ==
         '<DisconnectResponse communication_channel_id="23" status_code="ErrorCode.E_NO_ERROR" />'
     )
Пример #2
0
 def test_disconnect_response(self):
     """Test string representation of KNX/IP DisconnectResponse."""
     xknx = XKNX(loop=self.loop)
     disconnect_response = DisconnectResponse(xknx)
     disconnect_response.communication_channel_id = 23
     self.assertEqual(
         str(disconnect_response),
         '<DisconnectResponse CommunicationChannelID="23" status_code="ErrorCode.E_NO_ERROR" />')
Пример #3
0
 def test_disconnect_response(self):
     """Test string representation of KNX/IP DisconnectResponse."""
     xknx = XKNX(loop=self.loop)
     disconnect_response = DisconnectResponse(xknx)
     disconnect_response.communication_channel_id = 23
     self.assertEqual(
         str(disconnect_response),
         '<DisconnectResponse CommunicationChannelID="23" status_code="ErrorCode.E_NO_ERROR" />')
Пример #4
0
 def _disconnect_request_received(
         self, disconnect_request: DisconnectRequest) -> None:
     """Handle incoming disconnect request."""
     logger.warning("Received DisconnectRequest from tunnelling sever.")
     # We should not receive DisconnectRequest for other communication_channels
     # If we do we close our communication_channel before reconnection.
     if disconnect_request.communication_channel_id == self.communication_channel:
         disconnect_response = DisconnectResponse(
             communication_channel_id=self.communication_channel, )
         self.transport.send(KNXIPFrame.init_from_body(disconnect_response))
         self.communication_channel = None
     self._tunnel_lost()
Пример #5
0
    def test_disconnect_response(self):
        """Test parsing and streaming DisconnectResponse KNX/IP packet."""
        raw = bytes((0x06, 0x10, 0x02, 0x0A, 0x00, 0x08, 0x15, 0x25))
        knxipframe = KNXIPFrame()
        knxipframe.from_knx(raw)

        assert isinstance(knxipframe.body, DisconnectResponse)

        assert knxipframe.body.communication_channel_id == 21
        assert knxipframe.body.status_code == ErrorCode.E_NO_MORE_UNIQUE_CONNECTIONS

        disconnect_response = DisconnectResponse(
            communication_channel_id=21,
            status_code=ErrorCode.E_NO_MORE_UNIQUE_CONNECTIONS,
        )
        knxipframe2 = KNXIPFrame.init_from_body(disconnect_response)

        assert knxipframe2.to_knx() == raw
Пример #6
0
    def test_disconnect_response(self):
        """Test parsing and streaming DisconnectResponse KNX/IP packet."""
        raw = (0x06, 0x10, 0x02, 0x0A, 0x00, 0x08, 0x15, 0x25)
        xknx = XKNX()
        knxipframe = KNXIPFrame(xknx)
        knxipframe.from_knx(raw)

        self.assertTrue(isinstance(knxipframe.body, DisconnectResponse))

        self.assertEqual(knxipframe.body.communication_channel_id, 21)
        self.assertEqual(
            knxipframe.body.status_code, ErrorCode.E_NO_MORE_UNIQUE_CONNECTIONS
        )

        disconnect_response = DisconnectResponse(
            xknx,
            communication_channel_id=21,
            status_code=ErrorCode.E_NO_MORE_UNIQUE_CONNECTIONS,
        )
        knxipframe2 = KNXIPFrame.init_from_body(disconnect_response)

        self.assertEqual(knxipframe2.to_knx(), list(raw))
Пример #7
0
    async def test_tunnel_connect_send_disconnect(
        self, time_travel, route_back, data_endpoint_addr, local_endpoint
    ):
        """Test initiating a tunnelling connection."""
        local_addr = ("192.168.1.1", 12345)
        remote_addr = ("192.168.1.2", 3671)
        self.tunnel.route_back = route_back
        gateway_data_endpoint = (
            HPAI(*data_endpoint_addr) if data_endpoint_addr else HPAI()
        )
        self.tunnel.transport.connect = AsyncMock()
        self.tunnel.transport.getsockname = Mock(return_value=local_addr)
        self.tunnel.transport.send = Mock()
        self.tunnel.transport.stop = Mock()

        # Connect
        connect_request = ConnectRequest(
            control_endpoint=local_endpoint,
            data_endpoint=local_endpoint,
        )
        connect_frame = KNXIPFrame.init_from_body(connect_request)

        connection_task = asyncio.create_task(self.tunnel.connect())
        await time_travel(0)
        self.tunnel.transport.connect.assert_called_once()
        self.tunnel.transport.send.assert_called_once_with(connect_frame)

        connect_response_frame = KNXIPFrame.init_from_body(
            ConnectResponse(
                communication_channel=23,
                data_endpoint=gateway_data_endpoint,
                identifier=7,
            )
        )
        self.tunnel.transport.handle_knxipframe(connect_response_frame, remote_addr)
        await connection_task
        assert self.tunnel._data_endpoint_addr == data_endpoint_addr
        assert self.tunnel._src_address == IndividualAddress(7)

        # Send - use data endpoint
        self.tunnel.transport.send.reset_mock()
        test_telegram = Telegram(payload=GroupValueWrite(DPTArray((1,))))
        test_telegram_frame = KNXIPFrame.init_from_body(
            TunnellingRequest(
                communication_channel_id=23,
                sequence_counter=0,
                cemi=CEMIFrame.init_from_telegram(
                    test_telegram,
                    code=CEMIMessageCode.L_DATA_REQ,
                    src_addr=IndividualAddress(7),
                ),
            )
        )
        asyncio.create_task(self.tunnel.send_telegram(test_telegram))
        await time_travel(0)
        self.tunnel.transport.send.assert_called_once_with(
            test_telegram_frame, addr=data_endpoint_addr
        )
        # skip ack and confirmation

        # Disconnect
        self.tunnel.transport.send.reset_mock()
        disconnect_request = DisconnectRequest(
            communication_channel_id=23,
            control_endpoint=local_endpoint,
        )
        disconnect_frame = KNXIPFrame.init_from_body(disconnect_request)

        disconnection_task = asyncio.create_task(self.tunnel.disconnect())
        await time_travel(0)
        self.tunnel.transport.send.assert_called_once_with(disconnect_frame)

        disconnect_response_frame = KNXIPFrame.init_from_body(
            DisconnectResponse(communication_channel_id=23)
        )
        self.tunnel.transport.handle_knxipframe(disconnect_response_frame, remote_addr)
        await disconnection_task
        assert self.tunnel._data_endpoint_addr is None
        self.tunnel.transport.stop.assert_called_once()