From 74ac16035588c8324ba1ceb564b4205ca03db94b Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Fri, 7 Apr 2017 06:00:58 +0200 Subject: [PATCH] Bugfix time and task coro (#6968) * Bugfix time and task coro * fix also other create_task * fix tests * fix lint in test --- homeassistant/core.py | 22 +++++++++------------- tests/test_core.py | 44 +++++++++++++++++-------------------------- 2 files changed, 26 insertions(+), 40 deletions(-) diff --git a/homeassistant/core.py b/homeassistant/core.py index 7c4ff43bd7a..03cc3d4e9f5 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -31,7 +31,8 @@ from homeassistant.const import ( from homeassistant.exceptions import ( HomeAssistantError, InvalidEntityFormatError) from homeassistant.util.async import ( - run_coroutine_threadsafe, run_callback_threadsafe) + run_coroutine_threadsafe, run_callback_threadsafe, + fire_coroutine_threadsafe) import homeassistant.util as util import homeassistant.util.dt as dt_util import homeassistant.util.location as location @@ -131,7 +132,7 @@ class HomeAssistant(object): def start(self) -> None: """Start home assistant.""" # Register the async start - self.add_job(self.async_start()) + fire_coroutine_threadsafe(self.async_start(), self.loop) # Run forever and catch keyboard interrupt try: @@ -140,7 +141,7 @@ class HomeAssistant(object): self.loop.run_forever() return self.exit_code except KeyboardInterrupt: - self.loop.create_task(self.async_stop()) + fire_coroutine_threadsafe(self.async_stop(), self.loop) self.loop.run_forever() finally: self.loop.close() @@ -246,8 +247,7 @@ class HomeAssistant(object): def stop(self) -> None: """Stop Home Assistant and shuts down all threads.""" - self.loop.call_soon_threadsafe( - self.loop.create_task, self.async_stop()) + fire_coroutine_threadsafe(self.async_stop(), self.loop) @asyncio.coroutine def async_stop(self, exit_code=0) -> None: @@ -1091,17 +1091,13 @@ def _async_create_timer(hass): handle = hass.loop.call_later(slp_seconds, fire_time_event, nxt) - @callback - def start_timer(event): - """Create an async timer.""" - _LOGGER.info("Timer:starting") - hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_timer) - fire_time_event(monotonic()) - @callback def stop_timer(event): """Stop the timer.""" if handle is not None: handle.cancel() - hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, start_timer) + hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_timer) + + _LOGGER.info("Timer:starting") + fire_time_event(monotonic()) diff --git a/tests/test_core.py b/tests/test_core.py index a68373b2ecc..ea7f40aaff7 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -16,8 +16,7 @@ from homeassistant.util.unit_system import (METRIC_SYSTEM) from homeassistant.const import ( __version__, EVENT_STATE_CHANGED, ATTR_FRIENDLY_NAME, CONF_UNIT_SYSTEM, ATTR_NOW, EVENT_TIME_CHANGED, EVENT_HOMEASSISTANT_STOP, - EVENT_HOMEASSISTANT_CLOSE, EVENT_HOMEASSISTANT_START, - EVENT_SERVICE_REGISTERED, EVENT_SERVICE_REMOVED) + EVENT_HOMEASSISTANT_CLOSE, EVENT_SERVICE_REGISTERED, EVENT_SERVICE_REMOVED) from tests.common import get_test_home_assistant @@ -813,28 +812,21 @@ def test_create_timer(mock_monotonic, loop): funcs.append(func) return orig_callback(func) - with patch.object(ha, 'callback', mock_callback): - ha._async_create_timer(hass) - - assert len(funcs) == 3 - fire_time_event, start_timer, stop_timer = funcs - - assert len(hass.bus.async_listen_once.mock_calls) == 1 - event_type, callback = hass.bus.async_listen_once.mock_calls[0][1] - assert event_type == EVENT_HOMEASSISTANT_START - assert callback is start_timer - mock_monotonic.side_effect = 10.2, 10.3 - with patch('homeassistant.core.dt_util.utcnow', - return_value=sentinel.mock_date): - start_timer(None) + with patch.object(ha, 'callback', mock_callback), \ + patch('homeassistant.core.dt_util.utcnow', + return_value=sentinel.mock_date): + ha._async_create_timer(hass) - assert len(hass.bus.async_listen_once.mock_calls) == 2 + assert len(funcs) == 2 + fire_time_event, stop_timer = funcs + + assert len(hass.bus.async_listen_once.mock_calls) == 1 assert len(hass.bus.async_fire.mock_calls) == 1 assert len(hass.loop.call_later.mock_calls) == 1 - event_type, callback = hass.bus.async_listen_once.mock_calls[1][1] + event_type, callback = hass.bus.async_listen_once.mock_calls[0][1] assert event_type == EVENT_HOMEASSISTANT_STOP assert callback is stop_timer @@ -859,17 +851,15 @@ def test_timer_out_of_sync(mock_monotonic, loop): funcs.append(func) return orig_callback(func) - with patch.object(ha, 'callback', mock_callback): - ha._async_create_timer(hass) - - assert len(funcs) == 3 - fire_time_event, start_timer, stop_timer = funcs - mock_monotonic.side_effect = 10.2, 11.3, 11.3 - with patch('homeassistant.core.dt_util.utcnow', - return_value=sentinel.mock_date): - start_timer(None) + with patch.object(ha, 'callback', mock_callback), \ + patch('homeassistant.core.dt_util.utcnow', + return_value=sentinel.mock_date): + ha._async_create_timer(hass) + + assert len(funcs) == 2 + fire_time_event, stop_timer = funcs assert len(hass.loop.call_later.mock_calls) == 1