Skip to content

Commit cb5de0e

Browse files
committed
Convert TTS tests to async (#33517)
* Convert TTS tests to async * Address comments
1 parent 254394e commit cb5de0e

File tree

3 files changed

+515
-546
lines changed

3 files changed

+515
-546
lines changed

homeassistant/components/tts/__init__.py

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ async def async_setup_platform(p_type, p_config=None, discovery_info=None):
133133
hass, p_config, discovery_info
134134
)
135135
else:
136-
provider = await hass.async_add_job(
136+
provider = await hass.async_add_executor_job(
137137
platform.get_engine, hass, p_config, discovery_info
138138
)
139139

@@ -226,41 +226,17 @@ async def async_init_cache(self, use_cache, cache_dir, time_memory, base_url):
226226
self.time_memory = time_memory
227227
self.base_url = base_url
228228

229-
def init_tts_cache_dir(cache_dir):
230-
"""Init cache folder."""
231-
if not os.path.isabs(cache_dir):
232-
cache_dir = self.hass.config.path(cache_dir)
233-
if not os.path.isdir(cache_dir):
234-
_LOGGER.info("Create cache dir %s.", cache_dir)
235-
os.mkdir(cache_dir)
236-
return cache_dir
237-
238229
try:
239-
self.cache_dir = await self.hass.async_add_job(
240-
init_tts_cache_dir, cache_dir
230+
self.cache_dir = await self.hass.async_add_executor_job(
231+
_init_tts_cache_dir, self.hass, cache_dir
241232
)
242233
except OSError as err:
243234
raise HomeAssistantError(f"Can't init cache dir {err}")
244235

245-
def get_cache_files():
246-
"""Return a dict of given engine files."""
247-
cache = {}
248-
249-
folder_data = os.listdir(self.cache_dir)
250-
for file_data in folder_data:
251-
record = _RE_VOICE_FILE.match(file_data)
252-
if record:
253-
key = KEY_PATTERN.format(
254-
record.group(1),
255-
record.group(2),
256-
record.group(3),
257-
record.group(4),
258-
)
259-
cache[key.lower()] = file_data.lower()
260-
return cache
261-
262236
try:
263-
cache_files = await self.hass.async_add_job(get_cache_files)
237+
cache_files = await self.hass.async_add_executor_job(
238+
_get_cache_files, self.cache_dir
239+
)
264240
except OSError as err:
265241
raise HomeAssistantError(f"Can't read cache dir {err}")
266242

@@ -273,13 +249,13 @@ async def async_clear_cache(self):
273249

274250
def remove_files():
275251
"""Remove files from filesystem."""
276-
for _, filename in self.file_cache.items():
252+
for filename in self.file_cache.values():
277253
try:
278254
os.remove(os.path.join(self.cache_dir, filename))
279255
except OSError as err:
280256
_LOGGER.warning("Can't remove cache file '%s': %s", filename, err)
281257

282-
await self.hass.async_add_job(remove_files)
258+
await self.hass.async_add_executor_job(remove_files)
283259
self.file_cache = {}
284260

285261
@callback
@@ -312,6 +288,7 @@ async def async_get_url(
312288
merged_options.update(options)
313289
options = merged_options
314290
options = options or provider.default_options
291+
315292
if options is not None:
316293
invalid_opts = [
317294
opt_name
@@ -378,10 +355,10 @@ def save_speech():
378355
speech.write(data)
379356

380357
try:
381-
await self.hass.async_add_job(save_speech)
358+
await self.hass.async_add_executor_job(save_speech)
382359
self.file_cache[key] = filename
383-
except OSError:
384-
_LOGGER.error("Can't write %s", filename)
360+
except OSError as err:
361+
_LOGGER.error("Can't write %s: %s", filename, err)
385362

386363
async def async_file_to_mem(self, key):
387364
"""Load voice from file cache into memory.
@@ -400,7 +377,7 @@ def load_speech():
400377
return speech.read()
401378

402379
try:
403-
data = await self.hass.async_add_job(load_speech)
380+
data = await self.hass.async_add_executor_job(load_speech)
404381
except OSError:
405382
del self.file_cache[key]
406383
raise HomeAssistantError(f"Can't read {voice_file}")
@@ -506,11 +483,36 @@ async def async_get_tts_audio(self, message, language, options=None):
506483
507484
Return a tuple of file extension and data as bytes.
508485
"""
509-
return await self.hass.async_add_job(
486+
return await self.hass.async_add_executor_job(
510487
ft.partial(self.get_tts_audio, message, language, options=options)
511488
)
512489

513490

491+
def _init_tts_cache_dir(hass, cache_dir):
492+
"""Init cache folder."""
493+
if not os.path.isabs(cache_dir):
494+
cache_dir = hass.config.path(cache_dir)
495+
if not os.path.isdir(cache_dir):
496+
_LOGGER.info("Create cache dir %s", cache_dir)
497+
os.mkdir(cache_dir)
498+
return cache_dir
499+
500+
501+
def _get_cache_files(cache_dir):
502+
"""Return a dict of given engine files."""
503+
cache = {}
504+
505+
folder_data = os.listdir(cache_dir)
506+
for file_data in folder_data:
507+
record = _RE_VOICE_FILE.match(file_data)
508+
if record:
509+
key = KEY_PATTERN.format(
510+
record.group(1), record.group(2), record.group(3), record.group(4),
511+
)
512+
cache[key.lower()] = file_data.lower()
513+
return cache
514+
515+
514516
class TextToSpeechUrlView(HomeAssistantView):
515517
"""TTS view to get a url to a generated speech file."""
516518

tests/common.py

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
from unittest.mock import MagicMock, Mock, patch
1515
import uuid
1616

17+
from aiohttp.test_utils import unused_port as get_test_instance_port # noqa
18+
1719
from homeassistant import auth, config_entries, core as ha, loader
1820
from homeassistant.auth import (
1921
auth_store,
@@ -37,7 +39,6 @@
3739
EVENT_PLATFORM_DISCOVERED,
3840
EVENT_STATE_CHANGED,
3941
EVENT_TIME_CHANGED,
40-
SERVER_PORT,
4142
STATE_OFF,
4243
STATE_ON,
4344
)
@@ -59,7 +60,6 @@
5960
from homeassistant.util.unit_system import METRIC_SYSTEM
6061
import homeassistant.util.yaml.loader as yaml_loader
6162

62-
_TEST_INSTANCE_PORT = SERVER_PORT
6363
_LOGGER = logging.getLogger(__name__)
6464
INSTANCES = []
6565
CLIENT_ID = "https://example.com/app"
@@ -217,18 +217,6 @@ def clear_instance(event):
217217
return hass
218218

219219

220-
def get_test_instance_port():
221-
"""Return unused port for running test instance.
222-
223-
The socket that holds the default port does not get released when we stop
224-
HA in a different test case. Until I have figured out what is going on,
225-
let's run each test on a different port.
226-
"""
227-
global _TEST_INSTANCE_PORT
228-
_TEST_INSTANCE_PORT += 1
229-
return _TEST_INSTANCE_PORT
230-
231-
232220
def async_mock_service(hass, domain, service, schema=None):
233221
"""Set up a fake service & return a calls log list to this service."""
234222
calls = []

0 commit comments

Comments
 (0)