From 052d7d1e197b0c509a17a5fe86f7b274810a7080 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Thu, 14 Mar 2024 14:56:57 -1000 Subject: [PATCH] Fix scene integration doing blocking I/O in the event loop to import platforms (#113391) --- homeassistant/components/homeassistant/__init__.py | 5 +++++ homeassistant/components/scene/__init__.py | 12 +++++------- tests/components/scene/test_init.py | 12 ++++++++++++ 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/homeassistant/__init__.py b/homeassistant/components/homeassistant/__init__.py index b14194c425f..6d32f175a8a 100644 --- a/homeassistant/components/homeassistant/__init__.py +++ b/homeassistant/components/homeassistant/__init__.py @@ -35,6 +35,11 @@ from homeassistant.helpers.service import ( from homeassistant.helpers.template import async_load_custom_templates from homeassistant.helpers.typing import ConfigType +# The scene integration will do a late import of scene +# so we want to make sure its loaded with the component +# so its already in memory when its imported so the import +# does not do blocking I/O in the event loop. +from . import scene as scene_pre_import # noqa: F401 from .const import ( DATA_EXPOSED_ENTITIES, DATA_STOP_HANDLER, diff --git a/homeassistant/components/scene/__init__.py b/homeassistant/components/scene/__init__.py index ca56f5c8682..ee1937b65c9 100644 --- a/homeassistant/components/scene/__init__.py +++ b/homeassistant/components/scene/__init__.py @@ -32,15 +32,13 @@ def _hass_domain_validator(config: dict[str, Any]) -> dict[str, Any]: def _platform_validator(config: dict[str, Any]) -> dict[str, Any]: """Validate it is a valid platform.""" + platform_name = config[CONF_PLATFORM] try: - platform = importlib.import_module(f".{config[CONF_PLATFORM]}", __name__) + platform = importlib.import_module( + f"homeassistant.components.{platform_name}.scene" + ) except ImportError: - try: - platform = importlib.import_module( - f"homeassistant.components.{config[CONF_PLATFORM]}.scene" - ) - except ImportError: - raise vol.Invalid("Invalid platform specified") from None + raise vol.Invalid("Invalid platform specified") from None if not hasattr(platform, "PLATFORM_SCHEMA"): return config diff --git a/tests/components/scene/test_init.py b/tests/components/scene/test_init.py index 82f29328850..c797c26f35a 100644 --- a/tests/components/scene/test_init.py +++ b/tests/components/scene/test_init.py @@ -262,3 +262,15 @@ async def turn_off_lights(hass, entity_ids): blocking=True, ) await hass.async_block_till_done() + + +async def test_invalid_platform( + hass: HomeAssistant, caplog: pytest.LogCaptureFixture +) -> None: + """Test invalid platform.""" + await async_setup_component( + hass, scene.DOMAIN, {scene.DOMAIN: {"platform": "does_not_exist"}} + ) + await hass.async_block_till_done() + assert "Invalid platform specified" in caplog.text + assert "does_not_exist" in caplog.text