diff --git a/homeassistant/core.py b/homeassistant/core.py index 899bed064ed..320e857ac9e 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -164,15 +164,16 @@ class HomeAssistant(object): self.bus.async_fire(EVENT_HOMEASSISTANT_START) try: + # only block for EVENT_HOMEASSISTANT_START listener + self.async_stop_track_tasks() with timeout(TIMEOUT_EVENT_START, loop=self.loop): - yield from self.async_stop_track_tasks() + yield from self.async_block_till_done() except asyncio.TimeoutError: _LOGGER.warning( 'Something is blocking Home Assistant from wrapping up the ' 'start up phase. We\'re going to continue anyway. Please ' 'report the following info at http://bit.ly/2ogP58T : %s', ', '.join(self.config.components)) - self._track_task = False self.state = CoreState.running _async_create_timer(self) @@ -218,10 +219,9 @@ class HomeAssistant(object): """Track tasks so you can wait for all tasks to be done.""" self._track_task = True - @asyncio.coroutine + @callback def async_stop_track_tasks(self): - """Track tasks so you can wait for all tasks to be done.""" - yield from self.async_block_till_done() + """Stop track tasks so you can't wait for all tasks to be done.""" self._track_task = False @callback @@ -246,8 +246,6 @@ class HomeAssistant(object): @asyncio.coroutine def async_block_till_done(self): """Block till all pending work is done.""" - assert self._track_task, 'Not tracking tasks' - # To flush out any call_soon_threadsafe yield from asyncio.sleep(0, loop=self.loop) diff --git a/tests/common.py b/tests/common.py index 9dc077dc3f7..03a4de235d7 100644 --- a/tests/common.py +++ b/tests/common.py @@ -122,8 +122,7 @@ def async_test_home_assistant(loop): # 1. We only mock time during tests # 2. We want block_till_done that is called inside stop_track_tasks with patch('homeassistant.core._async_create_timer'), \ - patch.object(hass, 'async_stop_track_tasks', - hass.async_block_till_done): + patch.object(hass, 'async_stop_track_tasks'): yield from orig_start() hass.async_start = mock_async_start diff --git a/tests/test_core.py b/tests/test_core.py index b2fca047292..89ae6c5f651 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -901,7 +901,6 @@ def test_start_taking_too_long(loop, caplog): patch('homeassistant.core._async_create_timer') as mock_timer: yield from hass.async_start() - assert not hass._track_task assert hass.state == ha.CoreState.running assert len(mock_timer.mock_calls) == 1 assert mock_timer.mock_calls[0][1][0] is hass @@ -910,3 +909,19 @@ def test_start_taking_too_long(loop, caplog): finally: yield from hass.async_stop() assert hass.state == ha.CoreState.not_running + + +@asyncio.coroutine +def test_track_task_functions(loop): + """Test function to start/stop track task and initial state.""" + hass = ha.HomeAssistant(loop=loop) + try: + assert hass._track_task + + hass.async_stop_track_tasks() + assert not hass._track_task + + hass.async_track_tasks() + assert hass._track_task + finally: + yield from hass.async_stop()