Cleanup ServiceInfo compatibility (#60540)
Co-authored-by: epenet <epenet@users.noreply.github.com> Co-authored-by: J. Nick Koston <nick@koston.org>
This commit is contained in:
parent
ddd22398f2
commit
141688e210
10 changed files with 1 additions and 412 deletions
|
@ -52,14 +52,11 @@ from homeassistant.helpers.event import (
|
||||||
async_track_state_added_domain,
|
async_track_state_added_domain,
|
||||||
async_track_time_interval,
|
async_track_time_interval,
|
||||||
)
|
)
|
||||||
from homeassistant.helpers.frame import report
|
|
||||||
from homeassistant.helpers.typing import ConfigType
|
from homeassistant.helpers.typing import ConfigType
|
||||||
from homeassistant.loader import DHCPMatcher, async_get_dhcp
|
from homeassistant.loader import DHCPMatcher, async_get_dhcp
|
||||||
from homeassistant.util.async_ import run_callback_threadsafe
|
from homeassistant.util.async_ import run_callback_threadsafe
|
||||||
from homeassistant.util.network import is_invalid, is_link_local, is_loopback
|
from homeassistant.util.network import is_invalid, is_link_local, is_loopback
|
||||||
|
|
||||||
from .const import DOMAIN
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from scapy.packet import Packet
|
from scapy.packet import Packet
|
||||||
from scapy.sendrecv import AsyncSniffer
|
from scapy.sendrecv import AsyncSniffer
|
||||||
|
@ -86,36 +83,6 @@ class DhcpServiceInfo(BaseServiceInfo):
|
||||||
hostname: str
|
hostname: str
|
||||||
macaddress: str
|
macaddress: str
|
||||||
|
|
||||||
def __getitem__(self, name: str) -> Any:
|
|
||||||
"""
|
|
||||||
Enable method for compatibility reason.
|
|
||||||
|
|
||||||
Deprecated, and will be removed in version 2022.6.
|
|
||||||
"""
|
|
||||||
report(
|
|
||||||
f"accessed discovery_info['{name}'] instead of discovery_info.{name}; "
|
|
||||||
"this will fail in version 2022.6",
|
|
||||||
exclude_integrations={DOMAIN},
|
|
||||||
error_if_core=False,
|
|
||||||
)
|
|
||||||
return getattr(self, name)
|
|
||||||
|
|
||||||
def get(self, name: str, default: Any = None) -> Any:
|
|
||||||
"""
|
|
||||||
Enable method for compatibility reason.
|
|
||||||
|
|
||||||
Deprecated, and will be removed in version 2022.6.
|
|
||||||
"""
|
|
||||||
report(
|
|
||||||
f"accessed discovery_info.get('{name}') instead of discovery_info.{name}; "
|
|
||||||
"this will fail in version 2022.6",
|
|
||||||
exclude_integrations={DOMAIN},
|
|
||||||
error_if_core=False,
|
|
||||||
)
|
|
||||||
if hasattr(self, name):
|
|
||||||
return getattr(self, name)
|
|
||||||
return default
|
|
||||||
|
|
||||||
|
|
||||||
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
|
async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
|
||||||
"""Set up the dhcp component."""
|
"""Set up the dhcp component."""
|
||||||
|
|
|
@ -54,7 +54,6 @@ from homeassistant.helpers import config_validation as cv, event, template
|
||||||
from homeassistant.helpers.device_registry import DeviceEntry
|
from homeassistant.helpers.device_registry import DeviceEntry
|
||||||
from homeassistant.helpers.dispatcher import async_dispatcher_connect, dispatcher_send
|
from homeassistant.helpers.dispatcher import async_dispatcher_connect, dispatcher_send
|
||||||
from homeassistant.helpers.entity import Entity
|
from homeassistant.helpers.entity import Entity
|
||||||
from homeassistant.helpers.frame import report
|
|
||||||
from homeassistant.helpers.typing import ConfigType, TemplateVarsType
|
from homeassistant.helpers.typing import ConfigType, TemplateVarsType
|
||||||
from homeassistant.loader import bind_hass
|
from homeassistant.loader import bind_hass
|
||||||
from homeassistant.util import dt as dt_util
|
from homeassistant.util import dt as dt_util
|
||||||
|
@ -419,20 +418,6 @@ class MqttServiceInfo(BaseServiceInfo):
|
||||||
subscribed_topic: str
|
subscribed_topic: str
|
||||||
timestamp: dt.datetime
|
timestamp: dt.datetime
|
||||||
|
|
||||||
def __getitem__(self, name: str) -> Any:
|
|
||||||
"""
|
|
||||||
Allow property access by name for compatibility reason.
|
|
||||||
|
|
||||||
Deprecated, and will be removed in version 2022.6.
|
|
||||||
"""
|
|
||||||
report(
|
|
||||||
f"accessed discovery_info['{name}'] instead of discovery_info.{name}; "
|
|
||||||
"this will fail in version 2022.6",
|
|
||||||
exclude_integrations={DOMAIN},
|
|
||||||
error_if_core=False,
|
|
||||||
)
|
|
||||||
return getattr(self, name)
|
|
||||||
|
|
||||||
|
|
||||||
def publish(
|
def publish(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
|
|
|
@ -25,7 +25,6 @@ from homeassistant.data_entry_flow import BaseServiceInfo
|
||||||
from homeassistant.helpers import discovery_flow
|
from homeassistant.helpers import discovery_flow
|
||||||
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
from homeassistant.helpers.aiohttp_client import async_get_clientsession
|
||||||
from homeassistant.helpers.event import async_track_time_interval
|
from homeassistant.helpers.event import async_track_time_interval
|
||||||
from homeassistant.helpers.frame import report
|
|
||||||
from homeassistant.helpers.typing import ConfigType
|
from homeassistant.helpers.typing import ConfigType
|
||||||
from homeassistant.loader import async_get_ssdp, bind_hass
|
from homeassistant.loader import async_get_ssdp, bind_hass
|
||||||
|
|
||||||
|
@ -111,63 +110,6 @@ class SsdpServiceInfo(
|
||||||
):
|
):
|
||||||
"""Prepared info from ssdp/upnp entries."""
|
"""Prepared info from ssdp/upnp entries."""
|
||||||
|
|
||||||
def __getitem__(self, name: str) -> Any:
|
|
||||||
"""
|
|
||||||
Allow property access by name for compatibility reason.
|
|
||||||
|
|
||||||
Deprecated, and will be removed in version 2022.6.
|
|
||||||
"""
|
|
||||||
report(
|
|
||||||
f"accessed discovery_info['{name}'] instead of discovery_info.{name}, "
|
|
||||||
f"discovery_info.upnp['{name}'] "
|
|
||||||
f"or discovery_info.ssdp_headers['{name}']; "
|
|
||||||
"this will fail in version 2022.6",
|
|
||||||
exclude_integrations={DOMAIN},
|
|
||||||
error_if_core=False,
|
|
||||||
)
|
|
||||||
# Use a property if it is available, fallback to upnp data
|
|
||||||
if hasattr(self, name):
|
|
||||||
return getattr(self, name)
|
|
||||||
if name in self.ssdp_headers and name not in self.upnp:
|
|
||||||
return self.ssdp_headers.get(name)
|
|
||||||
return self.upnp[name]
|
|
||||||
|
|
||||||
def get(self, name: str, default: Any = None) -> Any:
|
|
||||||
"""
|
|
||||||
Enable method for compatibility reason.
|
|
||||||
|
|
||||||
Deprecated, and will be removed in version 2022.6.
|
|
||||||
"""
|
|
||||||
report(
|
|
||||||
f"accessed discovery_info.get('{name}') instead of discovery_info.{name}, "
|
|
||||||
f"discovery_info.upnp.get('{name}') "
|
|
||||||
f"or discovery_info.ssdp_headers.get('{name}'); "
|
|
||||||
"this will fail in version 2022.6",
|
|
||||||
exclude_integrations={DOMAIN},
|
|
||||||
error_if_core=False,
|
|
||||||
)
|
|
||||||
if hasattr(self, name):
|
|
||||||
return getattr(self, name)
|
|
||||||
return self.upnp.get(name, self.ssdp_headers.get(name, default))
|
|
||||||
|
|
||||||
def __contains__(self, name: str) -> bool:
|
|
||||||
"""
|
|
||||||
Enable method for compatibility reason.
|
|
||||||
|
|
||||||
Deprecated, and will be removed in version 2022.6.
|
|
||||||
"""
|
|
||||||
report(
|
|
||||||
f"accessed discovery_info.__contains__('{name}') "
|
|
||||||
f"instead of discovery_info.upnp.__contains__('{name}') "
|
|
||||||
f"or discovery_info.ssdp_headers.__contains__('{name}'); "
|
|
||||||
"this will fail in version 2022.6",
|
|
||||||
exclude_integrations={DOMAIN},
|
|
||||||
error_if_core=False,
|
|
||||||
)
|
|
||||||
if hasattr(self, name):
|
|
||||||
return getattr(self, name) is not None
|
|
||||||
return name in self.upnp or name in self.ssdp_headers
|
|
||||||
|
|
||||||
|
|
||||||
SsdpChange = Enum("SsdpChange", "ALIVE BYEBYE UPDATE")
|
SsdpChange = Enum("SsdpChange", "ALIVE BYEBYE UPDATE")
|
||||||
SsdpCallback = Callable[[SsdpServiceInfo, SsdpChange], Awaitable]
|
SsdpCallback = Callable[[SsdpServiceInfo, SsdpChange], Awaitable]
|
||||||
|
|
|
@ -6,7 +6,7 @@ import fnmatch
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
from typing import TYPE_CHECKING, Any
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from serial.tools.list_ports import comports
|
from serial.tools.list_ports import comports
|
||||||
from serial.tools.list_ports_common import ListPortInfo
|
from serial.tools.list_ports_common import ListPortInfo
|
||||||
|
@ -20,7 +20,6 @@ from homeassistant.core import Event, HomeAssistant, callback
|
||||||
from homeassistant.data_entry_flow import BaseServiceInfo
|
from homeassistant.data_entry_flow import BaseServiceInfo
|
||||||
from homeassistant.helpers import discovery_flow, system_info
|
from homeassistant.helpers import discovery_flow, system_info
|
||||||
from homeassistant.helpers.debounce import Debouncer
|
from homeassistant.helpers.debounce import Debouncer
|
||||||
from homeassistant.helpers.frame import report
|
|
||||||
from homeassistant.helpers.typing import ConfigType
|
from homeassistant.helpers.typing import ConfigType
|
||||||
from homeassistant.loader import async_get_usb
|
from homeassistant.loader import async_get_usb
|
||||||
|
|
||||||
|
@ -47,20 +46,6 @@ class UsbServiceInfo(BaseServiceInfo):
|
||||||
manufacturer: str | None
|
manufacturer: str | None
|
||||||
description: str | None
|
description: str | None
|
||||||
|
|
||||||
def __getitem__(self, name: str) -> Any:
|
|
||||||
"""
|
|
||||||
Allow property access by name for compatibility reason.
|
|
||||||
|
|
||||||
Deprecated, and will be removed in version 2022.6.
|
|
||||||
"""
|
|
||||||
report(
|
|
||||||
f"accessed discovery_info['{name}'] instead of discovery_info.{name}; "
|
|
||||||
"this will fail in version 2022.6",
|
|
||||||
exclude_integrations={DOMAIN},
|
|
||||||
error_if_core=False,
|
|
||||||
)
|
|
||||||
return getattr(self, name)
|
|
||||||
|
|
||||||
|
|
||||||
def human_readable_device_name(
|
def human_readable_device_name(
|
||||||
device: str,
|
device: str,
|
||||||
|
|
|
@ -30,7 +30,6 @@ from homeassistant.core import Event, HomeAssistant, callback
|
||||||
from homeassistant.data_entry_flow import BaseServiceInfo
|
from homeassistant.data_entry_flow import BaseServiceInfo
|
||||||
from homeassistant.helpers import discovery_flow
|
from homeassistant.helpers import discovery_flow
|
||||||
import homeassistant.helpers.config_validation as cv
|
import homeassistant.helpers.config_validation as cv
|
||||||
from homeassistant.helpers.frame import report
|
|
||||||
from homeassistant.helpers.network import NoURLAvailableError, get_url
|
from homeassistant.helpers.network import NoURLAvailableError, get_url
|
||||||
from homeassistant.helpers.typing import ConfigType
|
from homeassistant.helpers.typing import ConfigType
|
||||||
from homeassistant.loader import (
|
from homeassistant.loader import (
|
||||||
|
@ -108,36 +107,6 @@ class ZeroconfServiceInfo(BaseServiceInfo):
|
||||||
name: str
|
name: str
|
||||||
properties: dict[str, Any]
|
properties: dict[str, Any]
|
||||||
|
|
||||||
def __getitem__(self, name: str) -> Any:
|
|
||||||
"""
|
|
||||||
Enable method for compatibility reason.
|
|
||||||
|
|
||||||
Deprecated, and will be removed in version 2022.6.
|
|
||||||
"""
|
|
||||||
report(
|
|
||||||
f"accessed discovery_info['{name}'] instead of discovery_info.{name}; "
|
|
||||||
"this will fail in version 2022.6",
|
|
||||||
exclude_integrations={DOMAIN},
|
|
||||||
error_if_core=False,
|
|
||||||
)
|
|
||||||
return getattr(self, name)
|
|
||||||
|
|
||||||
def get(self, name: str, default: Any = None) -> Any:
|
|
||||||
"""
|
|
||||||
Enable method for compatibility reason.
|
|
||||||
|
|
||||||
Deprecated, and will be removed in version 2022.6.
|
|
||||||
"""
|
|
||||||
report(
|
|
||||||
f"accessed discovery_info.get('{name}') instead of discovery_info.{name}; "
|
|
||||||
"this will fail in version 2022.6",
|
|
||||||
exclude_integrations={DOMAIN},
|
|
||||||
error_if_core=False,
|
|
||||||
)
|
|
||||||
if hasattr(self, name):
|
|
||||||
return getattr(self, name)
|
|
||||||
return default
|
|
||||||
|
|
||||||
|
|
||||||
@bind_hass
|
@bind_hass
|
||||||
async def async_get_instance(hass: HomeAssistant) -> HaZeroconf:
|
async def async_get_instance(hass: HomeAssistant) -> HaZeroconf:
|
||||||
|
|
|
@ -3,7 +3,6 @@ import datetime
|
||||||
import threading
|
import threading
|
||||||
from unittest.mock import MagicMock, patch
|
from unittest.mock import MagicMock, patch
|
||||||
|
|
||||||
import pytest
|
|
||||||
from scapy import arch # pylint: disable=unused-import # noqa: F401
|
from scapy import arch # pylint: disable=unused-import # noqa: F401
|
||||||
from scapy.error import Scapy_Exception
|
from scapy.error import Scapy_Exception
|
||||||
from scapy.layers.dhcp import DHCP
|
from scapy.layers.dhcp import DHCP
|
||||||
|
@ -973,27 +972,3 @@ async def test_aiodiscover_finds_new_hosts_after_interval(hass):
|
||||||
hostname="connect",
|
hostname="connect",
|
||||||
macaddress="b8b7f16db533",
|
macaddress="b8b7f16db533",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("mock_integration_frame")
|
|
||||||
async def test_service_info_compatibility(hass, caplog):
|
|
||||||
"""Test compatibility with old-style dict.
|
|
||||||
|
|
||||||
To be removed in 2022.6
|
|
||||||
"""
|
|
||||||
discovery_info = dhcp.DhcpServiceInfo(
|
|
||||||
ip="192.168.210.56",
|
|
||||||
hostname="connect",
|
|
||||||
macaddress="b8b7f16db533",
|
|
||||||
)
|
|
||||||
|
|
||||||
with patch("homeassistant.helpers.frame._REPORTED_INTEGRATIONS", set()):
|
|
||||||
assert discovery_info["ip"] == "192.168.210.56"
|
|
||||||
assert "Detected integration that accessed discovery_info['ip']" in caplog.text
|
|
||||||
|
|
||||||
with patch("homeassistant.helpers.frame._REPORTED_INTEGRATIONS", set()):
|
|
||||||
assert discovery_info.get("ip") == "192.168.210.56"
|
|
||||||
assert "Detected integration that accessed discovery_info.get('ip')" in caplog.text
|
|
||||||
|
|
||||||
assert discovery_info.get("ip", "fallback_host") == "192.168.210.56"
|
|
||||||
assert discovery_info.get("invalid_key", "fallback_host") == "fallback_host"
|
|
||||||
|
|
|
@ -2380,26 +2380,6 @@ async def test_publish_json_from_template(hass, mqtt_mock):
|
||||||
assert mqtt_mock.async_publish.call_args[0][1] == test_str
|
assert mqtt_mock.async_publish.call_args[0][1] == test_str
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("mock_integration_frame")
|
|
||||||
async def test_service_info_compatibility(hass, caplog):
|
|
||||||
"""Test compatibility with old-style dict.
|
|
||||||
|
|
||||||
To be removed in 2022.6
|
|
||||||
"""
|
|
||||||
discovery_info = mqtt.MqttServiceInfo(
|
|
||||||
topic="tasmota/discovery/DC4F220848A2/config",
|
|
||||||
payload="",
|
|
||||||
qos=0,
|
|
||||||
retain=False,
|
|
||||||
subscribed_topic="tasmota/discovery/#",
|
|
||||||
timestamp=None,
|
|
||||||
)
|
|
||||||
|
|
||||||
with patch("homeassistant.helpers.frame._REPORTED_INTEGRATIONS", set()):
|
|
||||||
assert discovery_info["topic"] == "tasmota/discovery/DC4F220848A2/config"
|
|
||||||
assert "Detected integration that accessed discovery_info['topic']" in caplog.text
|
|
||||||
|
|
||||||
|
|
||||||
async def test_subscribe_connection_status(hass, mqtt_mock, mqtt_client_mock):
|
async def test_subscribe_connection_status(hass, mqtt_mock, mqtt_client_mock):
|
||||||
"""Test connextion status subscription."""
|
"""Test connextion status subscription."""
|
||||||
mqtt_connected_calls = []
|
mqtt_connected_calls = []
|
||||||
|
|
|
@ -75,17 +75,6 @@ async def test_ssdp_flow_dispatched_on_st(mock_get_ssdp, hass, caplog, mock_flow
|
||||||
assert mock_call_data.x_homeassistant_matching_domains == {"mock-domain"}
|
assert mock_call_data.x_homeassistant_matching_domains == {"mock-domain"}
|
||||||
assert mock_call_data.upnp == {ssdp.ATTR_UPNP_UDN: "uuid:mock-udn"}
|
assert mock_call_data.upnp == {ssdp.ATTR_UPNP_UDN: "uuid:mock-udn"}
|
||||||
assert "Failed to fetch ssdp data" not in caplog.text
|
assert "Failed to fetch ssdp data" not in caplog.text
|
||||||
# Compatibility with old dict access (to be removed after 2022.6)
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_ST] == "mock-st"
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_LOCATION] == "http://1.1.1.1"
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_USN] == "uuid:mock-udn::mock-st"
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_SERVER] == "mock-server"
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_EXT] == ""
|
|
||||||
assert mock_call_data[ssdp.ATTR_UPNP_UDN] == "uuid:mock-udn"
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_UDN] == ANY
|
|
||||||
assert mock_call_data["_timestamp"] == ANY
|
|
||||||
assert mock_call_data[ssdp.ATTR_HA_MATCHING_DOMAINS] == {"mock-domain"}
|
|
||||||
# End compatibility checks
|
|
||||||
|
|
||||||
|
|
||||||
@patch(
|
@patch(
|
||||||
|
@ -129,17 +118,6 @@ async def test_ssdp_flow_dispatched_on_manufacturer_url(
|
||||||
assert mock_call_data.x_homeassistant_matching_domains == {"mock-domain"}
|
assert mock_call_data.x_homeassistant_matching_domains == {"mock-domain"}
|
||||||
assert mock_call_data.upnp == {ssdp.ATTR_UPNP_UDN: "uuid:mock-udn"}
|
assert mock_call_data.upnp == {ssdp.ATTR_UPNP_UDN: "uuid:mock-udn"}
|
||||||
assert "Failed to fetch ssdp data" not in caplog.text
|
assert "Failed to fetch ssdp data" not in caplog.text
|
||||||
# Compatibility with old dict access (to be removed after 2022.6)
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_ST] == "mock-st"
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_LOCATION] == "http://1.1.1.1"
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_USN] == "uuid:mock-udn::mock-st"
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_SERVER] == "mock-server"
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_EXT] == ""
|
|
||||||
assert mock_call_data[ssdp.ATTR_UPNP_UDN] == "uuid:mock-udn"
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_UDN] == ANY
|
|
||||||
assert mock_call_data["_timestamp"] == ANY
|
|
||||||
assert mock_call_data[ssdp.ATTR_HA_MATCHING_DOMAINS] == {"mock-domain"}
|
|
||||||
# End compatibility checks
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("mock_get_source_ip")
|
@pytest.mark.usefixtures("mock_get_source_ip")
|
||||||
|
@ -426,18 +404,6 @@ async def test_discovery_from_advertisement_sets_ssdp_st(
|
||||||
ssdp.ATTR_UPNP_DEVICE_TYPE: "Paulus",
|
ssdp.ATTR_UPNP_DEVICE_TYPE: "Paulus",
|
||||||
ssdp.ATTR_UPNP_UDN: "uuid:mock-udn",
|
ssdp.ATTR_UPNP_UDN: "uuid:mock-udn",
|
||||||
}
|
}
|
||||||
# Compatibility with old dict access (to be removed after 2022.6)
|
|
||||||
assert discovery_info[ssdp.ATTR_SSDP_LOCATION] == "http://1.1.1.1"
|
|
||||||
assert discovery_info[ssdp.ATTR_SSDP_NT] == "mock-st"
|
|
||||||
# Set by ssdp component, not in original advertisement.
|
|
||||||
assert discovery_info[ssdp.ATTR_SSDP_ST] == "mock-st"
|
|
||||||
assert discovery_info[ssdp.ATTR_SSDP_USN] == "uuid:mock-udn::mock-st"
|
|
||||||
assert discovery_info[ssdp.ATTR_UPNP_UDN] == "uuid:mock-udn"
|
|
||||||
assert discovery_info[ssdp.ATTR_UPNP_DEVICE_TYPE] == "Paulus"
|
|
||||||
assert discovery_info[ssdp.ATTR_SSDP_UDN] == ANY
|
|
||||||
assert discovery_info["nts"] == "ssdp:alive"
|
|
||||||
assert discovery_info["_timestamp"] == ANY
|
|
||||||
# End compatibility checks
|
|
||||||
|
|
||||||
|
|
||||||
@patch(
|
@patch(
|
||||||
|
@ -547,25 +513,6 @@ async def test_scan_with_registered_callback(
|
||||||
ssdp.ATTR_UPNP_DEVICE_TYPE: "Paulus",
|
ssdp.ATTR_UPNP_DEVICE_TYPE: "Paulus",
|
||||||
ssdp.ATTR_UPNP_UDN: "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL",
|
ssdp.ATTR_UPNP_UDN: "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL",
|
||||||
}
|
}
|
||||||
# Compatibility with old dict access (to be removed after 2022.6)
|
|
||||||
assert mock_call_data[ssdp.ATTR_UPNP_DEVICE_TYPE] == "Paulus"
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_EXT] == ""
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_LOCATION] == "http://1.1.1.1"
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_SERVER] == "mock-server"
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_ST] == "mock-st"
|
|
||||||
assert (
|
|
||||||
mock_call_data[ssdp.ATTR_SSDP_USN]
|
|
||||||
== "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL::mock-st"
|
|
||||||
)
|
|
||||||
assert (
|
|
||||||
mock_call_data[ssdp.ATTR_UPNP_UDN]
|
|
||||||
== "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL"
|
|
||||||
)
|
|
||||||
assert mock_call_data["x-rincon-bootseq"] == "55"
|
|
||||||
assert mock_call_data[ssdp.ATTR_SSDP_UDN] == ANY
|
|
||||||
assert mock_call_data["_timestamp"] == ANY
|
|
||||||
assert mock_call_data[ssdp.ATTR_HA_MATCHING_DOMAINS] == set()
|
|
||||||
# End of compatibility checks
|
|
||||||
assert "Failed to callback info" in caplog.text
|
assert "Failed to callback info" in caplog.text
|
||||||
|
|
||||||
async_integration_callback_from_cache = AsyncMock()
|
async_integration_callback_from_cache = AsyncMock()
|
||||||
|
@ -622,23 +569,6 @@ async def test_getting_existing_headers(
|
||||||
ssdp.ATTR_UPNP_DEVICE_TYPE: "Paulus",
|
ssdp.ATTR_UPNP_DEVICE_TYPE: "Paulus",
|
||||||
ssdp.ATTR_UPNP_UDN: "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL",
|
ssdp.ATTR_UPNP_UDN: "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL",
|
||||||
}
|
}
|
||||||
# Compatibility with old dict access (to be removed after 2022.6)
|
|
||||||
assert discovery_info_by_st[ssdp.ATTR_SSDP_EXT] == ""
|
|
||||||
assert discovery_info_by_st[ssdp.ATTR_SSDP_LOCATION] == "http://1.1.1.1"
|
|
||||||
assert discovery_info_by_st[ssdp.ATTR_SSDP_SERVER] == "mock-server"
|
|
||||||
assert discovery_info_by_st[ssdp.ATTR_SSDP_ST] == "mock-st"
|
|
||||||
assert (
|
|
||||||
discovery_info_by_st[ssdp.ATTR_SSDP_USN]
|
|
||||||
== "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL::urn:mdx-netflix-com:service:target:3"
|
|
||||||
)
|
|
||||||
assert (
|
|
||||||
discovery_info_by_st[ssdp.ATTR_UPNP_UDN]
|
|
||||||
== "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL"
|
|
||||||
)
|
|
||||||
assert discovery_info_by_st[ssdp.ATTR_UPNP_DEVICE_TYPE] == "Paulus"
|
|
||||||
assert discovery_info_by_st[ssdp.ATTR_SSDP_UDN] == ANY
|
|
||||||
assert discovery_info_by_st["_timestamp"] == ANY
|
|
||||||
# End of compatibility checks
|
|
||||||
|
|
||||||
discovery_info_by_udn = await ssdp.async_get_discovery_info_by_udn(
|
discovery_info_by_udn = await ssdp.async_get_discovery_info_by_udn(
|
||||||
hass, "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL"
|
hass, "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL"
|
||||||
|
@ -658,23 +588,6 @@ async def test_getting_existing_headers(
|
||||||
ssdp.ATTR_UPNP_DEVICE_TYPE: "Paulus",
|
ssdp.ATTR_UPNP_DEVICE_TYPE: "Paulus",
|
||||||
ssdp.ATTR_UPNP_UDN: "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL",
|
ssdp.ATTR_UPNP_UDN: "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL",
|
||||||
}
|
}
|
||||||
# Compatibility with old dict access (to be removed after 2022.6)
|
|
||||||
assert discovery_info_by_udn[ssdp.ATTR_SSDP_EXT] == ""
|
|
||||||
assert discovery_info_by_udn[ssdp.ATTR_SSDP_LOCATION] == "http://1.1.1.1"
|
|
||||||
assert discovery_info_by_udn[ssdp.ATTR_SSDP_SERVER] == "mock-server"
|
|
||||||
assert discovery_info_by_udn[ssdp.ATTR_SSDP_ST] == "mock-st"
|
|
||||||
assert (
|
|
||||||
discovery_info_by_udn[ssdp.ATTR_SSDP_USN]
|
|
||||||
== "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL::urn:mdx-netflix-com:service:target:3"
|
|
||||||
)
|
|
||||||
assert (
|
|
||||||
discovery_info_by_udn[ssdp.ATTR_UPNP_UDN]
|
|
||||||
== "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL"
|
|
||||||
)
|
|
||||||
assert discovery_info_by_udn[ssdp.ATTR_UPNP_DEVICE_TYPE] == "Paulus"
|
|
||||||
assert discovery_info_by_udn[ssdp.ATTR_SSDP_UDN] == ANY
|
|
||||||
assert discovery_info_by_udn["_timestamp"] == ANY
|
|
||||||
# End of compatibility checks
|
|
||||||
|
|
||||||
discovery_info_by_udn_st = await ssdp.async_get_discovery_info_by_udn_st(
|
discovery_info_by_udn_st = await ssdp.async_get_discovery_info_by_udn_st(
|
||||||
hass, "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL", "mock-st"
|
hass, "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL", "mock-st"
|
||||||
|
@ -693,23 +606,6 @@ async def test_getting_existing_headers(
|
||||||
ssdp.ATTR_UPNP_DEVICE_TYPE: "Paulus",
|
ssdp.ATTR_UPNP_DEVICE_TYPE: "Paulus",
|
||||||
ssdp.ATTR_UPNP_UDN: "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL",
|
ssdp.ATTR_UPNP_UDN: "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL",
|
||||||
}
|
}
|
||||||
# Compatibility with old dict access (to be removed after 2022.6)
|
|
||||||
assert discovery_info_by_udn_st[ssdp.ATTR_SSDP_EXT] == ""
|
|
||||||
assert discovery_info_by_udn_st[ssdp.ATTR_SSDP_LOCATION] == "http://1.1.1.1"
|
|
||||||
assert discovery_info_by_udn_st[ssdp.ATTR_SSDP_SERVER] == "mock-server"
|
|
||||||
assert discovery_info_by_udn_st[ssdp.ATTR_SSDP_ST] == "mock-st"
|
|
||||||
assert (
|
|
||||||
discovery_info_by_udn_st[ssdp.ATTR_SSDP_USN]
|
|
||||||
== "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL::urn:mdx-netflix-com:service:target:3"
|
|
||||||
)
|
|
||||||
assert (
|
|
||||||
discovery_info_by_udn_st[ssdp.ATTR_UPNP_UDN]
|
|
||||||
== "uuid:TIVRTLSR7ANF-D6E-1557809135086-RETAIL"
|
|
||||||
)
|
|
||||||
assert discovery_info_by_udn_st[ssdp.ATTR_UPNP_DEVICE_TYPE] == "Paulus"
|
|
||||||
assert discovery_info_by_udn_st[ssdp.ATTR_SSDP_UDN] == ANY
|
|
||||||
assert discovery_info_by_udn_st["_timestamp"] == ANY
|
|
||||||
# End of compatibility checks
|
|
||||||
|
|
||||||
assert (
|
assert (
|
||||||
await ssdp.async_get_discovery_info_by_udn_st(hass, "wrong", "mock-st") is None
|
await ssdp.async_get_discovery_info_by_udn_st(hass, "wrong", "mock-st") is None
|
||||||
|
@ -845,61 +741,3 @@ async def test_ipv4_does_additional_search_for_sonos(
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
assert ssdp_listener.async_search.call_args[1] == {}
|
assert ssdp_listener.async_search.call_args[1] == {}
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("mock_integration_frame")
|
|
||||||
async def test_service_info_compatibility(hass, caplog):
|
|
||||||
"""Test compatibility with old-style dict.
|
|
||||||
|
|
||||||
To be removed in 2022.6
|
|
||||||
"""
|
|
||||||
discovery_info = ssdp.SsdpServiceInfo(
|
|
||||||
ssdp_st="mock-st",
|
|
||||||
ssdp_location="http://1.1.1.1",
|
|
||||||
ssdp_usn="uuid:mock-udn::mock-st",
|
|
||||||
ssdp_server="mock-server",
|
|
||||||
ssdp_ext="",
|
|
||||||
ssdp_headers=_ssdp_headers(
|
|
||||||
{
|
|
||||||
"st": "mock-st",
|
|
||||||
"location": "http://1.1.1.1",
|
|
||||||
"usn": "uuid:mock-udn::mock-st",
|
|
||||||
"server": "mock-server",
|
|
||||||
"ext": "",
|
|
||||||
}
|
|
||||||
),
|
|
||||||
upnp={ssdp.ATTR_UPNP_DEVICE_TYPE: "ABC"},
|
|
||||||
)
|
|
||||||
|
|
||||||
with patch("homeassistant.helpers.frame._REPORTED_INTEGRATIONS", set()):
|
|
||||||
assert discovery_info["ssdp_st"] == "mock-st"
|
|
||||||
assert "Detected integration that accessed discovery_info['ssdp_st']" in caplog.text
|
|
||||||
|
|
||||||
with patch("homeassistant.helpers.frame._REPORTED_INTEGRATIONS", set()):
|
|
||||||
assert discovery_info.get("ssdp_location") == "http://1.1.1.1"
|
|
||||||
assert (
|
|
||||||
"Detected integration that accessed discovery_info.get('ssdp_location')"
|
|
||||||
in caplog.text
|
|
||||||
)
|
|
||||||
|
|
||||||
with patch("homeassistant.helpers.frame._REPORTED_INTEGRATIONS", set()):
|
|
||||||
assert "ssdp_usn" in discovery_info
|
|
||||||
assert (
|
|
||||||
"Detected integration that accessed discovery_info.__contains__('ssdp_usn')"
|
|
||||||
in caplog.text
|
|
||||||
)
|
|
||||||
|
|
||||||
# Root item
|
|
||||||
assert discovery_info["ssdp_usn"] == "uuid:mock-udn::mock-st"
|
|
||||||
assert discovery_info.get("ssdp_usn") == "uuid:mock-udn::mock-st"
|
|
||||||
assert "ssdp_usn" in discovery_info
|
|
||||||
|
|
||||||
# SSDP header
|
|
||||||
assert discovery_info["st"] == "mock-st"
|
|
||||||
assert discovery_info.get("st") == "mock-st"
|
|
||||||
assert "st" in discovery_info
|
|
||||||
|
|
||||||
# UPnP item
|
|
||||||
assert discovery_info[ssdp.ATTR_UPNP_DEVICE_TYPE] == "ABC"
|
|
||||||
assert discovery_info.get(ssdp.ATTR_UPNP_DEVICE_TYPE) == "ABC"
|
|
||||||
assert ssdp.ATTR_UPNP_DEVICE_TYPE in discovery_info
|
|
||||||
|
|
|
@ -833,24 +833,3 @@ def test_human_readable_device_name():
|
||||||
assert "Silicon Labs" in name
|
assert "Silicon Labs" in name
|
||||||
assert "10C4" in name
|
assert "10C4" in name
|
||||||
assert "8A2A" in name
|
assert "8A2A" in name
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("mock_integration_frame")
|
|
||||||
async def test_service_info_compatibility(hass, caplog):
|
|
||||||
"""Test compatibility with old-style dict.
|
|
||||||
|
|
||||||
To be removed in 2022.6
|
|
||||||
"""
|
|
||||||
discovery_info = usb.UsbServiceInfo(
|
|
||||||
device=slae_sh_device.device,
|
|
||||||
vid=12345,
|
|
||||||
pid=12345,
|
|
||||||
serial_number=slae_sh_device.serial_number,
|
|
||||||
manufacturer=slae_sh_device.manufacturer,
|
|
||||||
description=slae_sh_device.description,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Ensure first call get logged
|
|
||||||
with patch("homeassistant.helpers.frame._REPORTED_INTEGRATIONS", set()):
|
|
||||||
assert discovery_info["vid"] == 12345
|
|
||||||
assert "Detected integration that accessed discovery_info['vid']" in caplog.text
|
|
||||||
|
|
|
@ -3,7 +3,6 @@ from ipaddress import ip_address
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from unittest.mock import call, patch
|
from unittest.mock import call, patch
|
||||||
|
|
||||||
import pytest
|
|
||||||
from zeroconf import InterfaceChoice, IPVersion, ServiceStateChange
|
from zeroconf import InterfaceChoice, IPVersion, ServiceStateChange
|
||||||
from zeroconf.asyncio import AsyncServiceInfo
|
from zeroconf.asyncio import AsyncServiceInfo
|
||||||
|
|
||||||
|
@ -1116,33 +1115,3 @@ async def test_no_name(hass, mock_async_zeroconf):
|
||||||
register_call = mock_async_zeroconf.async_register_service.mock_calls[-1]
|
register_call = mock_async_zeroconf.async_register_service.mock_calls[-1]
|
||||||
info = register_call.args[0]
|
info = register_call.args[0]
|
||||||
assert info.name == "Home._home-assistant._tcp.local."
|
assert info.name == "Home._home-assistant._tcp.local."
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.usefixtures("mock_integration_frame")
|
|
||||||
async def test_service_info_compatibility(hass, caplog):
|
|
||||||
"""Test compatibility with old-style dict.
|
|
||||||
|
|
||||||
To be removed in 2022.6
|
|
||||||
"""
|
|
||||||
discovery_info = zeroconf.ZeroconfServiceInfo(
|
|
||||||
host="mock_host",
|
|
||||||
addresses=["mock_host"],
|
|
||||||
port=None,
|
|
||||||
hostname="mock_hostname",
|
|
||||||
type="mock_type",
|
|
||||||
name="mock_name",
|
|
||||||
properties={},
|
|
||||||
)
|
|
||||||
|
|
||||||
with patch("homeassistant.helpers.frame._REPORTED_INTEGRATIONS", set()):
|
|
||||||
assert discovery_info["host"] == "mock_host"
|
|
||||||
assert "Detected integration that accessed discovery_info['host']" in caplog.text
|
|
||||||
|
|
||||||
with patch("homeassistant.helpers.frame._REPORTED_INTEGRATIONS", set()):
|
|
||||||
assert discovery_info.get("host") == "mock_host"
|
|
||||||
assert (
|
|
||||||
"Detected integration that accessed discovery_info.get('host')" in caplog.text
|
|
||||||
)
|
|
||||||
|
|
||||||
assert discovery_info.get("host", "fallback_host") == "mock_host"
|
|
||||||
assert discovery_info.get("invalid_key", "fallback_host") == "fallback_host"
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue