Remove EVENT_TIME_CHANGED and EVENT_TIMER_OUT_OF_SYNC (#69643)
Co-authored-by: Martin Hjelmare <marhje52@gmail.com>
This commit is contained in:
parent
689b347904
commit
fe6a4bfb1d
44 changed files with 397 additions and 839 deletions
|
@ -1,6 +1,5 @@
|
|||
"""Set up some common test helper things."""
|
||||
import asyncio
|
||||
import datetime
|
||||
import functools
|
||||
import logging
|
||||
import socket
|
||||
|
@ -26,8 +25,8 @@ from homeassistant.components.websocket_api.auth import (
|
|||
TYPE_AUTH_REQUIRED,
|
||||
)
|
||||
from homeassistant.components.websocket_api.http import URL
|
||||
from homeassistant.const import ATTR_NOW, EVENT_TIME_CHANGED, HASSIO_USER_NAME
|
||||
from homeassistant.helpers import config_entry_oauth2_flow, event
|
||||
from homeassistant.const import HASSIO_USER_NAME
|
||||
from homeassistant.helpers import config_entry_oauth2_flow
|
||||
from homeassistant.setup import async_setup_component
|
||||
from homeassistant.util import dt as dt_util, location
|
||||
|
||||
|
@ -661,115 +660,6 @@ def mock_async_zeroconf(mock_zeroconf):
|
|||
yield zc
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def legacy_patchable_time():
|
||||
"""Allow time to be patchable by using event listeners instead of asyncio loop."""
|
||||
|
||||
@ha.callback
|
||||
@loader.bind_hass
|
||||
def async_track_point_in_utc_time(hass, action, point_in_time):
|
||||
"""Add a listener that fires once after a specific point in UTC time."""
|
||||
# Ensure point_in_time is UTC
|
||||
point_in_time = event.dt_util.as_utc(point_in_time)
|
||||
|
||||
# Since this is called once, we accept a HassJob so we can avoid
|
||||
# having to figure out how to call the action every time its called.
|
||||
job = action if isinstance(action, ha.HassJob) else ha.HassJob(action)
|
||||
|
||||
@ha.callback
|
||||
def point_in_time_listener(event):
|
||||
"""Listen for matching time_changed events."""
|
||||
now = event.data[ATTR_NOW]
|
||||
|
||||
if now < point_in_time or hasattr(point_in_time_listener, "run"):
|
||||
return
|
||||
|
||||
# Set variable so that we will never run twice.
|
||||
# Because the event bus might have to wait till a thread comes
|
||||
# available to execute this listener it might occur that the
|
||||
# listener gets lined up twice to be executed. This will make
|
||||
# sure the second time it does nothing.
|
||||
setattr(point_in_time_listener, "run", True)
|
||||
async_unsub()
|
||||
|
||||
hass.async_run_hass_job(job, now)
|
||||
|
||||
async_unsub = hass.bus.async_listen(EVENT_TIME_CHANGED, point_in_time_listener)
|
||||
|
||||
return async_unsub
|
||||
|
||||
@ha.callback
|
||||
@loader.bind_hass
|
||||
def async_track_utc_time_change(
|
||||
hass, action, hour=None, minute=None, second=None, local=False
|
||||
):
|
||||
"""Add a listener that will fire if time matches a pattern."""
|
||||
|
||||
job = ha.HassJob(action)
|
||||
# We do not have to wrap the function with time pattern matching logic
|
||||
# if no pattern given
|
||||
if all(val is None for val in (hour, minute, second)):
|
||||
|
||||
@ha.callback
|
||||
def time_change_listener(ev) -> None:
|
||||
"""Fire every time event that comes in."""
|
||||
hass.async_run_hass_job(job, ev.data[ATTR_NOW])
|
||||
|
||||
return hass.bus.async_listen(EVENT_TIME_CHANGED, time_change_listener)
|
||||
|
||||
matching_seconds = event.dt_util.parse_time_expression(second, 0, 59)
|
||||
matching_minutes = event.dt_util.parse_time_expression(minute, 0, 59)
|
||||
matching_hours = event.dt_util.parse_time_expression(hour, 0, 23)
|
||||
|
||||
next_time = None
|
||||
|
||||
def calculate_next(now) -> None:
|
||||
"""Calculate and set the next time the trigger should fire."""
|
||||
nonlocal next_time
|
||||
|
||||
localized_now = event.dt_util.as_local(now) if local else now
|
||||
next_time = event.dt_util.find_next_time_expression_time(
|
||||
localized_now, matching_seconds, matching_minutes, matching_hours
|
||||
)
|
||||
|
||||
# Make sure rolling back the clock doesn't prevent the timer from
|
||||
# triggering.
|
||||
last_now = None
|
||||
|
||||
@ha.callback
|
||||
def pattern_time_change_listener(ev) -> None:
|
||||
"""Listen for matching time_changed events."""
|
||||
nonlocal next_time, last_now
|
||||
|
||||
now = ev.data[ATTR_NOW]
|
||||
|
||||
if last_now is None or now < last_now:
|
||||
# Time rolled back or next time not yet calculated
|
||||
calculate_next(now)
|
||||
|
||||
last_now = now
|
||||
|
||||
if next_time <= now:
|
||||
hass.async_run_hass_job(
|
||||
job, event.dt_util.as_local(now) if local else now
|
||||
)
|
||||
calculate_next(now + datetime.timedelta(seconds=1))
|
||||
|
||||
# We can't use async_track_point_in_utc_time here because it would
|
||||
# break in the case that the system time abruptly jumps backwards.
|
||||
# Our custom last_now logic takes care of resolving that scenario.
|
||||
return hass.bus.async_listen(EVENT_TIME_CHANGED, pattern_time_change_listener)
|
||||
|
||||
with patch(
|
||||
"homeassistant.helpers.event.async_track_point_in_utc_time",
|
||||
async_track_point_in_utc_time,
|
||||
), patch(
|
||||
"homeassistant.helpers.event.async_track_utc_time_change",
|
||||
async_track_utc_time_change,
|
||||
):
|
||||
yield
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def enable_custom_integrations(hass):
|
||||
"""Enable custom integrations defined in the test dir."""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue