Don't crash when firing event for timer for unregistered device (#118132)

pull/118171/head
Paulus Schoutsen 2024-05-26 07:08:00 -04:00 committed by GitHub
parent 6697cf07a6
commit 4a3808c08e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 40 additions and 5 deletions

View File

@ -292,7 +292,8 @@ class TimerManager:
timer.cancel()
self.handlers[timer.device_id](TimerEventType.CANCELLED, timer)
if timer.device_id in self.handlers:
self.handlers[timer.device_id](TimerEventType.CANCELLED, timer)
_LOGGER.debug(
"Timer cancelled: id=%s, name=%s, seconds_left=%s, device_id=%s",
timer_id,
@ -320,7 +321,8 @@ class TimerManager:
name=f"Timer {timer_id}",
)
self.handlers[timer.device_id](TimerEventType.UPDATED, timer)
if timer.device_id in self.handlers:
self.handlers[timer.device_id](TimerEventType.UPDATED, timer)
if seconds > 0:
log_verb = "increased"
@ -357,7 +359,8 @@ class TimerManager:
task = self.timer_tasks.pop(timer_id)
task.cancel()
self.handlers[timer.device_id](TimerEventType.UPDATED, timer)
if timer.device_id in self.handlers:
self.handlers[timer.device_id](TimerEventType.UPDATED, timer)
_LOGGER.debug(
"Timer paused: id=%s, name=%s, seconds_left=%s, device_id=%s",
timer_id,
@ -382,7 +385,8 @@ class TimerManager:
name=f"Timer {timer.id}",
)
self.handlers[timer.device_id](TimerEventType.UPDATED, timer)
if timer.device_id in self.handlers:
self.handlers[timer.device_id](TimerEventType.UPDATED, timer)
_LOGGER.debug(
"Timer unpaused: id=%s, name=%s, seconds_left=%s, device_id=%s",
timer_id,
@ -397,7 +401,8 @@ class TimerManager:
timer.finish()
self.handlers[timer.device_id](TimerEventType.FINISHED, timer)
if timer.device_id in self.handlers:
self.handlers[timer.device_id](TimerEventType.FINISHED, timer)
_LOGGER.debug(
"Timer finished: id=%s, name=%s, device_id=%s",
timer_id,

View File

@ -971,6 +971,36 @@ async def test_timers_not_supported(hass: HomeAssistant) -> None:
language=hass.config.language,
)
# Start a timer
@callback
def handle_timer(event_type: TimerEventType, timer: TimerInfo) -> None:
pass
device_id = "test_device"
unregister = timer_manager.register_handler(device_id, handle_timer)
timer_id = timer_manager.start_timer(
device_id,
hours=None,
minutes=5,
seconds=None,
language=hass.config.language,
)
# Unregister handler so device no longer "supports" timers
unregister()
# All operations on the timer should not crash
timer_manager.add_time(timer_id, 1)
timer_manager.remove_time(timer_id, 1)
timer_manager.pause_timer(timer_id)
timer_manager.unpause_timer(timer_id)
timer_manager.cancel_timer(timer_id)
async def test_timer_status_with_names(hass: HomeAssistant, init_components) -> None:
"""Test getting the status of named timers."""