2018-09-17 20:08:09 +00:00
|
|
|
"""Test UPnP/IGD setup process."""
|
2018-08-29 19:19:04 +00:00
|
|
|
|
2018-09-07 22:11:23 +00:00
|
|
|
from ipaddress import ip_address
|
2018-08-29 19:19:04 +00:00
|
|
|
from unittest.mock import patch, MagicMock
|
|
|
|
|
|
|
|
from homeassistant.setup import async_setup_component
|
2018-09-17 20:08:09 +00:00
|
|
|
from homeassistant.components import upnp
|
|
|
|
from homeassistant.components.upnp.device import Device
|
2018-08-29 19:19:04 +00:00
|
|
|
from homeassistant.const import EVENT_HOMEASSISTANT_STOP
|
|
|
|
|
|
|
|
from tests.common import MockConfigEntry
|
2018-10-23 19:52:01 +00:00
|
|
|
from tests.common import MockDependency
|
2018-08-29 19:19:04 +00:00
|
|
|
from tests.common import mock_coro
|
|
|
|
|
|
|
|
|
2018-09-07 22:11:23 +00:00
|
|
|
class MockDevice(Device):
|
|
|
|
"""Mock device for Device."""
|
|
|
|
|
|
|
|
def __init__(self, udn):
|
|
|
|
"""Initializer."""
|
2019-08-12 14:42:12 +00:00
|
|
|
device = MagicMock()
|
|
|
|
device.manufacturer = "mock-manuf"
|
|
|
|
device.name = "mock-name"
|
|
|
|
super().__init__(device)
|
2018-09-07 22:11:23 +00:00
|
|
|
self._udn = udn
|
|
|
|
self.added_port_mappings = []
|
|
|
|
self.removed_port_mappings = []
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
async def async_create_device(cls, hass, ssdp_description):
|
|
|
|
"""Return self."""
|
2019-07-31 19:25:30 +00:00
|
|
|
return cls("UDN")
|
2018-09-07 22:11:23 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
def udn(self):
|
|
|
|
"""Get the UDN."""
|
|
|
|
return self._udn
|
|
|
|
|
2019-07-31 19:25:30 +00:00
|
|
|
async def _async_add_port_mapping(self, external_port, local_ip, internal_port):
|
2018-09-07 22:11:23 +00:00
|
|
|
"""Add a port mapping."""
|
|
|
|
entry = [external_port, local_ip, internal_port]
|
|
|
|
self.added_port_mappings.append(entry)
|
|
|
|
|
|
|
|
async def _async_delete_port_mapping(self, external_port):
|
|
|
|
"""Remove a port mapping."""
|
|
|
|
entry = external_port
|
|
|
|
self.removed_port_mappings.append(entry)
|
|
|
|
|
|
|
|
|
2018-08-30 14:38:43 +00:00
|
|
|
async def test_async_setup_entry_default(hass):
|
2018-08-29 19:19:04 +00:00
|
|
|
"""Test async_setup_entry."""
|
2019-07-31 19:25:30 +00:00
|
|
|
udn = "uuid:device_1"
|
2018-12-21 17:25:23 +00:00
|
|
|
entry = MockConfigEntry(domain=upnp.DOMAIN)
|
2018-08-30 14:38:43 +00:00
|
|
|
|
2018-10-23 19:52:01 +00:00
|
|
|
config = {
|
2019-07-31 19:25:30 +00:00
|
|
|
"http": {},
|
|
|
|
"discovery": {},
|
2018-10-23 19:52:01 +00:00
|
|
|
# no upnp
|
|
|
|
}
|
2019-07-31 19:25:30 +00:00
|
|
|
with MockDependency("netdisco.discovery"), patch(
|
|
|
|
"homeassistant.components.upnp.get_local_ip", return_value="192.168.1.10"
|
|
|
|
):
|
|
|
|
await async_setup_component(hass, "http", config)
|
|
|
|
await async_setup_component(hass, "upnp", config)
|
2018-10-23 19:52:01 +00:00
|
|
|
await hass.async_block_till_done()
|
2018-08-29 19:19:04 +00:00
|
|
|
|
2018-09-17 20:08:09 +00:00
|
|
|
# mock homeassistant.components.upnp.device.Device
|
2018-10-23 19:52:01 +00:00
|
|
|
mock_device = MockDevice(udn)
|
2019-07-31 19:25:30 +00:00
|
|
|
discovery_infos = [{"udn": udn, "ssdp_description": "http://192.168.1.1/desc.xml"}]
|
|
|
|
with patch.object(Device, "async_create_device") as create_device, patch.object(
|
|
|
|
Device, "async_discover"
|
|
|
|
) as async_discover: # noqa:E125
|
2018-12-21 17:25:23 +00:00
|
|
|
|
2018-10-23 19:52:01 +00:00
|
|
|
create_device.return_value = mock_coro(return_value=mock_device)
|
2018-12-21 17:25:23 +00:00
|
|
|
async_discover.return_value = mock_coro(return_value=discovery_infos)
|
|
|
|
|
|
|
|
assert await upnp.async_setup_entry(hass, entry) is True
|
2018-08-30 14:38:43 +00:00
|
|
|
|
2018-12-21 17:25:23 +00:00
|
|
|
# ensure device is stored/used
|
2019-07-31 19:25:30 +00:00
|
|
|
assert hass.data[upnp.DOMAIN]["devices"][udn] == mock_device
|
2018-08-30 14:38:43 +00:00
|
|
|
|
2018-12-21 17:25:23 +00:00
|
|
|
hass.bus.async_fire(EVENT_HOMEASSISTANT_STOP)
|
|
|
|
await hass.async_block_till_done()
|
2018-08-30 14:38:43 +00:00
|
|
|
|
2018-10-23 19:52:01 +00:00
|
|
|
# ensure no port-mappings created or removed
|
|
|
|
assert not mock_device.added_port_mappings
|
|
|
|
assert not mock_device.removed_port_mappings
|
2018-08-30 14:38:43 +00:00
|
|
|
|
|
|
|
|
2018-10-01 16:25:54 +00:00
|
|
|
async def test_async_setup_entry_port_mapping(hass):
|
2018-08-30 14:38:43 +00:00
|
|
|
"""Test async_setup_entry."""
|
2018-12-21 17:25:23 +00:00
|
|
|
# pylint: disable=invalid-name
|
2019-07-31 19:25:30 +00:00
|
|
|
udn = "uuid:device_1"
|
2018-12-21 17:25:23 +00:00
|
|
|
entry = MockConfigEntry(domain=upnp.DOMAIN)
|
2018-08-29 19:19:04 +00:00
|
|
|
|
2018-10-23 19:52:01 +00:00
|
|
|
config = {
|
2019-07-31 19:25:30 +00:00
|
|
|
"http": {},
|
|
|
|
"discovery": {},
|
|
|
|
"upnp": {"port_mapping": True, "ports": {"hass": "hass"}},
|
2018-10-23 19:52:01 +00:00
|
|
|
}
|
2019-07-31 19:25:30 +00:00
|
|
|
with MockDependency("netdisco.discovery"), patch(
|
|
|
|
"homeassistant.components.upnp.get_local_ip", return_value="192.168.1.10"
|
|
|
|
):
|
|
|
|
await async_setup_component(hass, "http", config)
|
|
|
|
await async_setup_component(hass, "upnp", config)
|
2018-10-23 19:52:01 +00:00
|
|
|
await hass.async_block_till_done()
|
2018-08-29 19:19:04 +00:00
|
|
|
|
2018-09-07 22:11:23 +00:00
|
|
|
mock_device = MockDevice(udn)
|
2019-07-31 19:25:30 +00:00
|
|
|
discovery_infos = [{"udn": udn, "ssdp_description": "http://192.168.1.1/desc.xml"}]
|
|
|
|
with patch.object(Device, "async_create_device") as create_device, patch.object(
|
|
|
|
Device, "async_discover"
|
|
|
|
) as async_discover: # noqa:E125
|
2018-12-21 17:25:23 +00:00
|
|
|
|
2018-10-23 19:52:01 +00:00
|
|
|
create_device.return_value = mock_coro(return_value=mock_device)
|
2018-12-21 17:25:23 +00:00
|
|
|
async_discover.return_value = mock_coro(return_value=discovery_infos)
|
2018-08-29 19:19:04 +00:00
|
|
|
|
2018-10-23 19:52:01 +00:00
|
|
|
assert await upnp.async_setup_entry(hass, entry) is True
|
2018-09-07 22:11:23 +00:00
|
|
|
|
2018-10-23 19:52:01 +00:00
|
|
|
# ensure device is stored/used
|
2019-07-31 19:25:30 +00:00
|
|
|
assert hass.data[upnp.DOMAIN]["devices"][udn] == mock_device
|
2018-08-30 14:38:43 +00:00
|
|
|
|
2018-10-23 19:52:01 +00:00
|
|
|
# ensure add-port-mapping-methods called
|
|
|
|
assert mock_device.added_port_mappings == [
|
2019-07-31 19:25:30 +00:00
|
|
|
[8123, ip_address("192.168.1.10"), 8123]
|
2018-10-23 19:52:01 +00:00
|
|
|
]
|
2018-08-29 19:19:04 +00:00
|
|
|
|
2018-10-23 19:52:01 +00:00
|
|
|
hass.bus.async_fire(EVENT_HOMEASSISTANT_STOP)
|
|
|
|
await hass.async_block_till_done()
|
2018-09-07 22:11:23 +00:00
|
|
|
|
|
|
|
# ensure delete-port-mapping-methods called
|
|
|
|
assert mock_device.removed_port_mappings == [8123]
|