Fix zwave_js config flow server version timeout (#46990)

This commit is contained in:
Martin Hjelmare 2021-02-24 16:22:58 +01:00 committed by GitHub
parent 424526db7e
commit db8f597f10
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 12 deletions

View file

@ -41,6 +41,7 @@ TITLE = "Z-Wave JS"
ADDON_SETUP_TIMEOUT = 5
ADDON_SETUP_TIMEOUT_ROUNDS = 4
SERVER_VERSION_TIMEOUT = 10
ON_SUPERVISOR_SCHEMA = vol.Schema({vol.Optional(CONF_USE_ADDON, default=True): bool})
STEP_USER_DATA_SCHEMA = vol.Schema({vol.Required(CONF_URL, default=DEFAULT_URL): str})
@ -61,16 +62,16 @@ async def validate_input(hass: HomeAssistant, user_input: dict) -> VersionInfo:
async def async_get_version_info(hass: HomeAssistant, ws_address: str) -> VersionInfo:
"""Return Z-Wave JS version info."""
async with timeout(10):
try:
try:
async with timeout(SERVER_VERSION_TIMEOUT):
version_info: VersionInfo = await get_server_version(
ws_address, async_get_clientsession(hass)
)
except (asyncio.TimeoutError, aiohttp.ClientError) as err:
# We don't want to spam the log if the add-on isn't started
# or takes a long time to start.
_LOGGER.debug("Failed to connect to Z-Wave JS server: %s", err)
raise CannotConnect from err
except (asyncio.TimeoutError, aiohttp.ClientError) as err:
# We don't want to spam the log if the add-on isn't started
# or takes a long time to start.
_LOGGER.debug("Failed to connect to Z-Wave JS server: %s", err)
raise CannotConnect from err
return version_info

View file

@ -7,7 +7,7 @@ from zwave_js_server.version import VersionInfo
from homeassistant import config_entries, setup
from homeassistant.components.hassio.handler import HassioAPIError
from homeassistant.components.zwave_js.config_flow import TITLE
from homeassistant.components.zwave_js.config_flow import SERVER_VERSION_TIMEOUT, TITLE
from homeassistant.components.zwave_js.const import DOMAIN
from tests.common import MockConfigEntry
@ -138,7 +138,7 @@ def server_version_side_effect_fixture():
@pytest.fixture(name="get_server_version", autouse=True)
def mock_get_server_version(server_version_side_effect):
def mock_get_server_version(server_version_side_effect, server_version_timeout):
"""Mock server version."""
version_info = VersionInfo(
driver_version="mock-driver-version",
@ -149,10 +149,19 @@ def mock_get_server_version(server_version_side_effect):
"homeassistant.components.zwave_js.config_flow.get_server_version",
side_effect=server_version_side_effect,
return_value=version_info,
) as mock_version:
) as mock_version, patch(
"homeassistant.components.zwave_js.config_flow.SERVER_VERSION_TIMEOUT",
new=server_version_timeout,
):
yield mock_version
@pytest.fixture(name="server_version_timeout")
def mock_server_version_timeout():
"""Patch the timeout for getting server version."""
return SERVER_VERSION_TIMEOUT
@pytest.fixture(name="addon_setup_time", autouse=True)
def mock_addon_setup_time():
"""Mock add-on setup sleep time."""
@ -198,22 +207,30 @@ async def test_manual(hass):
assert result2["result"].unique_id == 1234
async def slow_server_version(*args):
"""Simulate a slow server version."""
await asyncio.sleep(0.1)
@pytest.mark.parametrize(
"url, server_version_side_effect, error",
"url, server_version_side_effect, server_version_timeout, error",
[
(
"not-ws-url",
None,
SERVER_VERSION_TIMEOUT,
"invalid_ws_url",
),
(
"ws://localhost:3000",
asyncio.TimeoutError,
slow_server_version,
0,
"cannot_connect",
),
(
"ws://localhost:3000",
Exception("Boom"),
SERVER_VERSION_TIMEOUT,
"unknown",
),
],