From 2c3618e2c7619f7d7545ea561d9b553bd1a62817 Mon Sep 17 00:00:00 2001 From: Jeff Irion Date: Sun, 19 Jul 2020 17:48:08 -0700 Subject: [PATCH] Close androidtv ADB socket connection when Home Assistant stops (#37973) * Close the ADB connection on HA stop * Get the test to pass * Remove unnecessary test code * Register the callback sooner * '_async_stop' -> 'async_close' * 'async_close' method -> '_async_close' function --- .../components/androidtv/media_player.py | 8 ++++++++ .../components/androidtv/test_media_player.py | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/homeassistant/components/androidtv/media_player.py b/homeassistant/components/androidtv/media_player.py index 8971b04c044..6bf44d1a16b 100644 --- a/homeassistant/components/androidtv/media_player.py +++ b/homeassistant/components/androidtv/media_player.py @@ -40,6 +40,7 @@ from homeassistant.const import ( CONF_HOST, CONF_NAME, CONF_PORT, + EVENT_HOMEASSISTANT_STOP, STATE_IDLE, STATE_OFF, STATE_PAUSED, @@ -230,6 +231,13 @@ async def async_setup_platform(hass, config, async_add_entities, discovery_info= ) raise PlatformNotReady + async def _async_close(event): + """Close the ADB socket connection when HA stops.""" + await aftv.adb_close() + + # Close the ADB connection when HA stops + hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _async_close) + device_args = [ aftv, config[CONF_NAME], diff --git a/tests/components/androidtv/test_media_player.py b/tests/components/androidtv/test_media_player.py index adece1430ca..bf16957b07f 100644 --- a/tests/components/androidtv/test_media_player.py +++ b/tests/components/androidtv/test_media_player.py @@ -47,6 +47,7 @@ from homeassistant.const import ( CONF_HOST, CONF_NAME, CONF_PLATFORM, + EVENT_HOMEASSISTANT_STOP, STATE_OFF, STATE_PLAYING, STATE_STANDBY, @@ -1154,3 +1155,22 @@ async def test_services_firetv(hass): await _test_service(hass, entity_id, SERVICE_MEDIA_STOP, "back") await _test_service(hass, entity_id, SERVICE_TURN_OFF, "adb_shell") await _test_service(hass, entity_id, SERVICE_TURN_ON, "adb_shell") + + +async def test_connection_closed_on_ha_stop(hass): + """Test that the ADB socket connection is closed when HA stops.""" + patch_key, entity_id = _setup(CONFIG_ANDROIDTV_ADB_SERVER) + + with patchers.PATCH_ADB_DEVICE_TCP, patchers.patch_connect(True)[patch_key]: + with patchers.patch_shell(SHELL_RESPONSE_OFF)[patch_key]: + assert await async_setup_component( + hass, DOMAIN, CONFIG_ANDROIDTV_ADB_SERVER + ) + await hass.async_block_till_done() + + with patch( + "androidtv.androidtv.androidtv_async.AndroidTVAsync.adb_close" + ) as adb_close: + hass.bus.async_fire(EVENT_HOMEASSISTANT_STOP) + await hass.async_block_till_done() + assert adb_close.called