Skip to content

Commit

Permalink
Fix test shutdown to ensure loop/threads are clean. (home-assistant#3447
Browse files Browse the repository at this point in the history
)

* Fix test shutdown to ensure loop/threads are clean.

We now ensure the loop is closed, it has completed, and the
executer has completed. This ensure all threads are freed
up with any test calling hass.stop().

* Fix lint issue with run_loop
  • Loading branch information
bbangert authored Sep 19, 2016
1 parent 8a99ce7 commit 256062f
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 2 deletions.
1 change: 1 addition & 0 deletions homeassistant/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,7 @@ def async_stop(self) -> None:
self.bus.async_fire(EVENT_HOMEASSISTANT_STOP)
yield from self.loop.run_in_executor(None, self.pool.block_till_done)
yield from self.loop.run_in_executor(None, self.pool.stop)
self.executer.shutdown()
self.state = CoreState.not_running
self.loop.stop()

Expand Down
16 changes: 14 additions & 2 deletions tests/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,17 @@ def get_test_home_assistant(num_threads=None):
loader.prepare(hass)

# FIXME should not be a daemon. Means hass.stop() not called in teardown
threading.Thread(name="LoopThread", target=loop.run_forever,
daemon=True).start()
stop_event = threading.Event()

def run_loop():
loop.run_forever()
loop.close()
stop_event.set()

threading.Thread(name="LoopThread", target=run_loop, daemon=True).start()

orig_start = hass.start
orig_stop = hass.stop

@asyncio.coroutine
def fake_stop():
Expand All @@ -72,7 +79,12 @@ def start_hass():
orig_start()
hass.block_till_done()

def stop_hass():
orig_stop()
stop_event.wait()

hass.start = start_hass
hass.stop = stop_hass

return hass

Expand Down
3 changes: 3 additions & 0 deletions tests/test_bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ def setup_method(self, method):

def teardown_method(self, method):
"""Clean up."""
if method == self.test_from_config_file:
return

dt_util.DEFAULT_TIME_ZONE = ORIG_TIMEZONE
self.hass.stop()
loader._COMPONENT_CACHE = self.backup_cache
Expand Down

0 comments on commit 256062f

Please sign in to comment.