* Refactor zeroconf setup to be async Most of the setup was calling back to async because we were setting up listeners. Since we only need to jump into the executor to create the zeroconf instance, its much faster to setup in async. In testing this cut the setup time in half or better. * partial revert to after_deps
65 lines
2.1 KiB
Python
65 lines
2.1 KiB
Python
"""Test Zeroconf multiple instance protection."""
|
|
import zeroconf
|
|
|
|
from homeassistant.components.zeroconf import async_get_instance
|
|
from homeassistant.components.zeroconf.usage import install_multiple_zeroconf_catcher
|
|
from homeassistant.setup import async_setup_component
|
|
|
|
from tests.async_mock import Mock, patch
|
|
|
|
DOMAIN = "zeroconf"
|
|
|
|
|
|
async def test_multiple_zeroconf_instances(hass, mock_zeroconf, caplog):
|
|
"""Test creating multiple zeroconf throws without an integration."""
|
|
assert await async_setup_component(hass, DOMAIN, {DOMAIN: {}})
|
|
|
|
zeroconf_instance = await async_get_instance(hass)
|
|
|
|
install_multiple_zeroconf_catcher(zeroconf_instance)
|
|
|
|
new_zeroconf_instance = zeroconf.Zeroconf()
|
|
assert new_zeroconf_instance == zeroconf_instance
|
|
|
|
assert "Zeroconf" in caplog.text
|
|
|
|
|
|
async def test_multiple_zeroconf_instances_gives_shared(hass, mock_zeroconf, caplog):
|
|
"""Test creating multiple zeroconf gives the shared instance to an integration."""
|
|
assert await async_setup_component(hass, DOMAIN, {DOMAIN: {}})
|
|
|
|
zeroconf_instance = await async_get_instance(hass)
|
|
|
|
install_multiple_zeroconf_catcher(zeroconf_instance)
|
|
|
|
correct_frame = Mock(
|
|
filename="/config/custom_components/burncpu/light.py",
|
|
lineno="23",
|
|
line="self.light.is_on",
|
|
)
|
|
with patch(
|
|
"homeassistant.helpers.frame.extract_stack",
|
|
return_value=[
|
|
Mock(
|
|
filename="/home/dev/homeassistant/core.py",
|
|
lineno="23",
|
|
line="do_something()",
|
|
),
|
|
correct_frame,
|
|
Mock(
|
|
filename="/home/dev/homeassistant/components/zeroconf/usage.py",
|
|
lineno="23",
|
|
line="self.light.is_on",
|
|
),
|
|
Mock(
|
|
filename="/home/dev/mdns/lights.py",
|
|
lineno="2",
|
|
line="something()",
|
|
),
|
|
],
|
|
):
|
|
assert zeroconf.Zeroconf() == zeroconf_instance
|
|
|
|
assert "custom_components/burncpu/light.py" in caplog.text
|
|
assert "23" in caplog.text
|
|
assert "self.light.is_on" in caplog.text
|