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