Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 9 additions & 13 deletions homeassistant/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@
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
Expand Down Expand Up @@ -131,7 +132,7 @@ def is_running(self) -> bool:
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:
Expand All @@ -140,7 +141,7 @@ def start(self) -> None:
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()
Expand Down Expand Up @@ -246,8 +247,7 @@ def async_block_till_done(self):

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:
Expand Down Expand Up @@ -1091,17 +1091,13 @@ def fire_time_event(nxt):

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())
42 changes: 16 additions & 26 deletions tests/test_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,7 @@
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

Expand Down Expand Up @@ -813,28 +812,21 @@ def mock_callback(func):
funcs.append(func)
return orig_callback(func)

with patch.object(ha, 'callback', mock_callback):
mock_monotonic.side_effect = 10.2, 10.3

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) == 3
fire_time_event, start_timer, stop_timer = funcs
assert len(funcs) == 2
fire_time_event, 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)

assert len(hass.bus.async_listen_once.mock_calls) == 2
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

Expand All @@ -859,17 +851,15 @@ def mock_callback(func):
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

Expand Down