Add helper method to clear logger overwrites for tests (#143301)

This commit is contained in:
Marc Mueller 2025-04-20 09:28:30 +02:00 committed by GitHub
parent b5b934b8a1
commit a749ecceed
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 31 additions and 22 deletions

View File

@ -24,8 +24,10 @@ from .const import (
SERVICE_SET_LEVEL, SERVICE_SET_LEVEL,
) )
from .helpers import ( from .helpers import (
DATA_LOGGER,
LoggerDomainConfig, LoggerDomainConfig,
LoggerSettings, LoggerSettings,
_clear_logger_overwrites, # noqa: F401
set_default_log_level, set_default_log_level,
set_log_levels, set_log_levels,
) )
@ -54,7 +56,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool:
settings = LoggerSettings(hass, config) settings = LoggerSettings(hass, config)
domain_config = hass.data[DOMAIN] = LoggerDomainConfig({}, settings) domain_config = hass.data[DATA_LOGGER] = LoggerDomainConfig({}, settings)
logging.setLoggerClass(_get_logger_class(domain_config.overrides)) logging.setLoggerClass(_get_logger_class(domain_config.overrides))
websocket_api.async_load_websocket_api(hass) websocket_api.async_load_websocket_api(hass)

View File

@ -9,13 +9,14 @@ from dataclasses import asdict, dataclass
from enum import StrEnum from enum import StrEnum
from functools import lru_cache from functools import lru_cache
import logging import logging
from typing import Any, cast from typing import Any
from homeassistant.const import EVENT_LOGGING_CHANGED from homeassistant.const import EVENT_LOGGING_CHANGED
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.helpers.storage import Store from homeassistant.helpers.storage import Store
from homeassistant.helpers.typing import ConfigType from homeassistant.helpers.typing import ConfigType
from homeassistant.loader import IntegrationNotFound, async_get_integration from homeassistant.loader import IntegrationNotFound, async_get_integration
from homeassistant.util.hass_dict import HassKey
from .const import ( from .const import (
DOMAIN, DOMAIN,
@ -28,6 +29,8 @@ from .const import (
STORAGE_VERSION, STORAGE_VERSION,
) )
DATA_LOGGER: HassKey[LoggerDomainConfig] = HassKey(DOMAIN)
SAVE_DELAY = 15.0 SAVE_DELAY = 15.0
# At startup, we want to save after a long delay to avoid # At startup, we want to save after a long delay to avoid
# saving while the system is still starting up. If the system # saving while the system is still starting up. If the system
@ -39,12 +42,6 @@ SAVE_DELAY = 15.0
SAVE_DELAY_LONG = 180.0 SAVE_DELAY_LONG = 180.0
@callback
def async_get_domain_config(hass: HomeAssistant) -> LoggerDomainConfig:
"""Return the domain config."""
return cast(LoggerDomainConfig, hass.data[DOMAIN])
@callback @callback
def set_default_log_level(hass: HomeAssistant, level: int) -> None: def set_default_log_level(hass: HomeAssistant, level: int) -> None:
"""Set the default log level for components.""" """Set the default log level for components."""
@ -55,7 +52,7 @@ def set_default_log_level(hass: HomeAssistant, level: int) -> None:
@callback @callback
def set_log_levels(hass: HomeAssistant, logpoints: Mapping[str, int]) -> None: def set_log_levels(hass: HomeAssistant, logpoints: Mapping[str, int]) -> None:
"""Set the specified log levels.""" """Set the specified log levels."""
async_get_domain_config(hass).overrides.update(logpoints) hass.data[DATA_LOGGER].overrides.update(logpoints)
for key, value in logpoints.items(): for key, value in logpoints.items():
_set_log_level(logging.getLogger(key), value) _set_log_level(logging.getLogger(key), value)
hass.bus.async_fire(EVENT_LOGGING_CHANGED) hass.bus.async_fire(EVENT_LOGGING_CHANGED)
@ -78,6 +75,12 @@ def _chattiest_log_level(level1: int, level2: int) -> int:
return min(level1, level2) return min(level1, level2)
@callback
def _clear_logger_overwrites(hass: HomeAssistant) -> None:
"""Clear logger overwrites. Used for testing."""
hass.data[DATA_LOGGER].overrides.clear()
async def get_integration_loggers(hass: HomeAssistant, domain: str) -> set[str]: async def get_integration_loggers(hass: HomeAssistant, domain: str) -> set[str]:
"""Get loggers for an integration.""" """Get loggers for an integration."""
loggers: set[str] = {f"homeassistant.components.{domain}"} loggers: set[str] = {f"homeassistant.components.{domain}"}

View File

@ -12,10 +12,10 @@ from homeassistant.setup import async_get_loaded_integrations
from .const import LOGSEVERITY from .const import LOGSEVERITY
from .helpers import ( from .helpers import (
DATA_LOGGER,
LoggerSetting, LoggerSetting,
LogPersistance, LogPersistance,
LogSettingsType, LogSettingsType,
async_get_domain_config,
get_logger, get_logger,
) )
@ -68,7 +68,7 @@ async def handle_integration_log_level(
msg["id"], websocket_api.ERR_NOT_FOUND, "Integration not found" msg["id"], websocket_api.ERR_NOT_FOUND, "Integration not found"
) )
return return
await async_get_domain_config(hass).settings.async_update( await hass.data[DATA_LOGGER].settings.async_update(
hass, hass,
msg["integration"], msg["integration"],
LoggerSetting( LoggerSetting(
@ -93,7 +93,7 @@ async def handle_module_log_level(
hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any] hass: HomeAssistant, connection: ActiveConnection, msg: dict[str, Any]
) -> None: ) -> None:
"""Handle setting integration log level.""" """Handle setting integration log level."""
await async_get_domain_config(hass).settings.async_update( await hass.data[DATA_LOGGER].settings.async_update(
hass, hass,
msg["module"], msg["module"],
LoggerSetting( LoggerSetting(

View File

@ -46,7 +46,11 @@ from homeassistant.components import device_automation, persistent_notification
from homeassistant.components.device_automation import ( # noqa: F401 from homeassistant.components.device_automation import ( # noqa: F401
_async_get_device_automation_capabilities as async_get_device_automation_capabilities, _async_get_device_automation_capabilities as async_get_device_automation_capabilities,
) )
from homeassistant.components.logger import DOMAIN as LOGGER_DOMAIN, SERVICE_SET_LEVEL from homeassistant.components.logger import (
DOMAIN as LOGGER_DOMAIN,
SERVICE_SET_LEVEL,
_clear_logger_overwrites,
)
from homeassistant.config import IntegrationConfigInfo, async_process_component_config from homeassistant.config import IntegrationConfigInfo, async_process_component_config
from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult from homeassistant.config_entries import ConfigEntry, ConfigFlow, ConfigFlowResult
from homeassistant.const import ( from homeassistant.const import (
@ -1708,7 +1712,7 @@ async def async_call_logger_set_level(
) )
await hass.async_block_till_done() await hass.async_block_till_done()
yield yield
hass.data[LOGGER_DOMAIN].overrides.clear() _clear_logger_overwrites(hass)
def import_and_test_deprecated_constant_enum( def import_and_test_deprecated_constant_enum(

View File

@ -4,7 +4,7 @@ import logging
from unittest.mock import patch from unittest.mock import patch
from homeassistant import loader from homeassistant import loader
from homeassistant.components.logger.helpers import async_get_domain_config from homeassistant.components.logger.helpers import DATA_LOGGER
from homeassistant.components.websocket_api import TYPE_RESULT from homeassistant.components.websocket_api import TYPE_RESULT
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.setup import async_setup_component from homeassistant.setup import async_setup_component
@ -76,7 +76,7 @@ async def test_integration_log_level(
assert msg["type"] == TYPE_RESULT assert msg["type"] == TYPE_RESULT
assert msg["success"] assert msg["success"]
assert async_get_domain_config(hass).overrides == { assert hass.data[DATA_LOGGER].overrides == {
"homeassistant.components.websocket_api": logging.DEBUG "homeassistant.components.websocket_api": logging.DEBUG
} }
@ -126,7 +126,7 @@ async def test_custom_integration_log_level(
assert msg["type"] == TYPE_RESULT assert msg["type"] == TYPE_RESULT
assert msg["success"] assert msg["success"]
assert async_get_domain_config(hass).overrides == { assert hass.data[DATA_LOGGER].overrides == {
"homeassistant.components.hue": logging.DEBUG, "homeassistant.components.hue": logging.DEBUG,
"custom_components.hue": logging.DEBUG, "custom_components.hue": logging.DEBUG,
"some_other_logger": logging.DEBUG, "some_other_logger": logging.DEBUG,
@ -182,7 +182,7 @@ async def test_module_log_level(
assert msg["type"] == TYPE_RESULT assert msg["type"] == TYPE_RESULT
assert msg["success"] assert msg["success"]
assert async_get_domain_config(hass).overrides == { assert hass.data[DATA_LOGGER].overrides == {
"homeassistant.components.websocket_api": logging.DEBUG, "homeassistant.components.websocket_api": logging.DEBUG,
"homeassistant.components.other_component": logging.WARNING, "homeassistant.components.other_component": logging.WARNING,
} }
@ -199,7 +199,7 @@ async def test_module_log_level_override(
{"logger": {"logs": {"homeassistant.components.websocket_api": "warning"}}}, {"logger": {"logs": {"homeassistant.components.websocket_api": "warning"}}},
) )
assert async_get_domain_config(hass).overrides == { assert hass.data[DATA_LOGGER].overrides == {
"homeassistant.components.websocket_api": logging.WARNING "homeassistant.components.websocket_api": logging.WARNING
} }
@ -218,7 +218,7 @@ async def test_module_log_level_override(
assert msg["type"] == TYPE_RESULT assert msg["type"] == TYPE_RESULT
assert msg["success"] assert msg["success"]
assert async_get_domain_config(hass).overrides == { assert hass.data[DATA_LOGGER].overrides == {
"homeassistant.components.websocket_api": logging.ERROR "homeassistant.components.websocket_api": logging.ERROR
} }
@ -237,7 +237,7 @@ async def test_module_log_level_override(
assert msg["type"] == TYPE_RESULT assert msg["type"] == TYPE_RESULT
assert msg["success"] assert msg["success"]
assert async_get_domain_config(hass).overrides == { assert hass.data[DATA_LOGGER].overrides == {
"homeassistant.components.websocket_api": logging.DEBUG "homeassistant.components.websocket_api": logging.DEBUG
} }
@ -256,6 +256,6 @@ async def test_module_log_level_override(
assert msg["type"] == TYPE_RESULT assert msg["type"] == TYPE_RESULT
assert msg["success"] assert msg["success"]
assert async_get_domain_config(hass).overrides == { assert hass.data[DATA_LOGGER].overrides == {
"homeassistant.components.websocket_api": logging.NOTSET "homeassistant.components.websocket_api": logging.NOTSET
} }