From debb928b3012c7069097902e0ecd214bb332ed6c Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" <nick@koston.org> Date: Sun, 5 Jul 2020 12:27:07 -0500 Subject: [PATCH] Use the main event loop for homekit (#37441) * use hass.loop for homekit * update calls for upstream pr * Bump HAP-python to 2.9.2 --- homeassistant/components/homekit/__init__.py | 10 +++--- .../components/homekit/manifest.json | 2 +- requirements_all.txt | 2 +- requirements_test_all.txt | 2 +- tests/components/homekit/test_homekit.py | 36 +++++++++---------- 5 files changed, 25 insertions(+), 27 deletions(-) diff --git a/homeassistant/components/homekit/__init__.py b/homeassistant/components/homekit/__init__.py index 10532c11da8..0d0531a986e 100644 --- a/homeassistant/components/homekit/__init__.py +++ b/homeassistant/components/homekit/__init__.py @@ -389,6 +389,7 @@ class HomeKit: self.hass, self._entry_id, self._name, + loop=self.hass.loop, address=ip_addr, port=self._port, persist_file=persist_file, @@ -498,6 +499,9 @@ class HomeKit: self._async_register_bridge(dev_reg) await self.hass.async_add_executor_job(self._start, bridged_states) + _LOGGER.debug("Driver start for %s", self._name) + self.hass.add_job(self.driver.start_service) + self.status = STATUS_RUNNING @callback def _async_register_bridge(self, dev_reg): @@ -570,17 +574,13 @@ class HomeKit: self.bridge.xhm_uri(), ) - _LOGGER.debug("Driver start for %s", self._name) - self.hass.add_job(self.driver.start) - self.status = STATUS_RUNNING - async def async_stop(self, *args): """Stop the accessory driver.""" if self.status != STATUS_RUNNING: return self.status = STATUS_STOPPED _LOGGER.debug("Driver stop for %s", self._name) - self.hass.add_job(self.driver.stop) + await self.driver.async_stop() for acc in self.bridge.accessories.values(): acc.async_stop() diff --git a/homeassistant/components/homekit/manifest.json b/homeassistant/components/homekit/manifest.json index 8a5fc90ae07..916a8cbde76 100644 --- a/homeassistant/components/homekit/manifest.json +++ b/homeassistant/components/homekit/manifest.json @@ -3,7 +3,7 @@ "name": "HomeKit", "documentation": "https://www.home-assistant.io/integrations/homekit", "requirements": [ - "HAP-python==2.9.1", + "HAP-python==2.9.2", "fnvhash==0.1.0", "PyQRCode==1.2.1", "base36==0.1.1", diff --git a/requirements_all.txt b/requirements_all.txt index d3c83d2b050..9435e7aa2f5 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -36,7 +36,7 @@ Adafruit-SHT31==1.0.2 # Adafruit_BBIO==1.1.1 # homeassistant.components.homekit -HAP-python==2.9.1 +HAP-python==2.9.2 # homeassistant.components.mastodon Mastodon.py==1.5.1 diff --git a/requirements_test_all.txt b/requirements_test_all.txt index c4d3c067c7c..e57888b3f54 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -4,7 +4,7 @@ -r requirements_test.txt # homeassistant.components.homekit -HAP-python==2.9.1 +HAP-python==2.9.2 # homeassistant.components.plugwise Plugwise_Smile==1.1.0 diff --git a/tests/components/homekit/test_homekit.py b/tests/components/homekit/test_homekit.py index 3bc2c69c084..f281cda0c02 100644 --- a/tests/components/homekit/test_homekit.py +++ b/tests/components/homekit/test_homekit.py @@ -210,6 +210,7 @@ async def test_homekit_setup(hass, hk_driver): hass, entry.entry_id, BRIDGE_NAME, + loop=hass.loop, address=IP_ADDRESS, port=DEFAULT_PORT, persist_file=path, @@ -251,6 +252,7 @@ async def test_homekit_setup_ip_address(hass, hk_driver): hass, entry.entry_id, BRIDGE_NAME, + loop=hass.loop, address="172.0.0.0", port=DEFAULT_PORT, persist_file=path, @@ -288,6 +290,7 @@ async def test_homekit_setup_advertise_ip(hass, hk_driver): hass, entry.entry_id, BRIDGE_NAME, + loop=hass.loop, address="0.0.0.0", port=DEFAULT_PORT, persist_file=path, @@ -494,7 +497,7 @@ async def test_homekit_start(hass, hk_driver, device_reg, debounce_patcher): ) as mock_setup_msg, patch( "pyhap.accessory_driver.AccessoryDriver.add_accessory" ) as hk_driver_add_acc, patch( - "pyhap.accessory_driver.AccessoryDriver.start" + "pyhap.accessory_driver.AccessoryDriver.start_service" ) as hk_driver_start: await homekit.async_start() @@ -527,7 +530,7 @@ async def test_homekit_start(hass, hk_driver, device_reg, debounce_patcher): ) as mock_setup_msg, patch( "pyhap.accessory_driver.AccessoryDriver.add_accessory" ) as hk_driver_add_acc, patch( - "pyhap.accessory_driver.AccessoryDriver.start" + "pyhap.accessory_driver.AccessoryDriver.start_service" ) as hk_driver_start: await homekit.async_start() @@ -574,7 +577,7 @@ async def test_homekit_start_with_a_broken_accessory(hass, hk_driver, debounce_p ) as mock_setup_msg, patch( "pyhap.accessory_driver.AccessoryDriver.add_accessory", ) as hk_driver_add_acc, patch( - "pyhap.accessory_driver.AccessoryDriver.start" + "pyhap.accessory_driver.AccessoryDriver.start_service" ) as hk_driver_start: await homekit.async_start() @@ -607,11 +610,10 @@ async def test_homekit_stop(hass): entry_id=entry.entry_id, ) homekit.driver = Mock() + homekit.driver.async_stop = AsyncMock() homekit.bridge = Mock() homekit.bridge.accessories = {} - await async_init_integration(hass) - assert homekit.status == STATUS_READY await homekit.async_stop() await hass.async_block_till_done() @@ -621,13 +623,13 @@ async def test_homekit_stop(hass): homekit.status = STATUS_STOPPED await homekit.async_stop() await hass.async_block_till_done() - assert homekit.driver.stop.called is False + assert homekit.driver.async_stop.called is False # Test if driver is started homekit.status = STATUS_RUNNING await homekit.async_stop() await hass.async_block_till_done() - assert homekit.driver.stop.called is True + assert homekit.driver.async_stop.called is True async def test_homekit_reset_accessories(hass): @@ -655,7 +657,7 @@ async def test_homekit_reset_accessories(hass): ), patch("pyhap.accessory.Bridge.add_accessory") as mock_add_accessory, patch( "pyhap.accessory_driver.AccessoryDriver.config_changed" ) as hk_driver_config_changed, patch( - "pyhap.accessory_driver.AccessoryDriver.start" + "pyhap.accessory_driver.AccessoryDriver.start_service" ): await async_init_entry(hass, entry) @@ -702,7 +704,7 @@ async def test_homekit_too_many_accessories(hass, hk_driver): hass.states.async_set("light.demo", "on") - with patch("pyhap.accessory_driver.AccessoryDriver.start"), patch( + with patch("pyhap.accessory_driver.AccessoryDriver.start_service"), patch( "pyhap.accessory_driver.AccessoryDriver.add_accessory" ), patch("homeassistant.components.homekit._LOGGER.warning") as mock_warn, patch( f"{PATH_HOMEKIT}.show_setup_message" @@ -916,7 +918,7 @@ async def test_raise_config_entry_not_ready(hass): await hass.async_block_till_done() -async def test_homekit_uses_system_zeroconf(hass, mock_zeroconf): +async def test_homekit_uses_system_zeroconf(hass, hk_driver, mock_zeroconf): """Test HomeKit uses system zeroconf.""" entry = MockConfigEntry( domain=DOMAIN, @@ -925,15 +927,11 @@ async def test_homekit_uses_system_zeroconf(hass, mock_zeroconf): ) system_zc = await zeroconf.async_get_instance(hass) - with patch(f"{PATH_HOMEKIT}.HomeKit.add_bridge_accessory"), patch( - f"{PATH_HOMEKIT}.show_setup_message" - ), patch("pyhap.accessory_driver.AccessoryDriver.add_accessory"), patch( - "pyhap.accessory_driver.AccessoryDriver.start" - ): - entry.add_to_hass(hass) - assert await hass.config_entries.async_setup(entry.entry_id) - await hass.async_block_till_done() - assert hass.data[DOMAIN][entry.entry_id][HOMEKIT].driver.advertiser == system_zc + entry.add_to_hass(hass) + assert await hass.config_entries.async_setup(entry.entry_id) + await hass.async_block_till_done() + assert hass.data[DOMAIN][entry.entry_id][HOMEKIT].driver.advertiser == system_zc + await hass.async_block_till_done() def _write_data(path: str, data: Dict) -> None: -- GitLab