mirror of
https://github.com/home-assistant/core.git
synced 2025-07-19 03:07:37 +00:00
Fix zwave_js config flow server version timeout (#46990)
This commit is contained in:
parent
424526db7e
commit
db8f597f10
@ -41,6 +41,7 @@ TITLE = "Z-Wave JS"
|
|||||||
|
|
||||||
ADDON_SETUP_TIMEOUT = 5
|
ADDON_SETUP_TIMEOUT = 5
|
||||||
ADDON_SETUP_TIMEOUT_ROUNDS = 4
|
ADDON_SETUP_TIMEOUT_ROUNDS = 4
|
||||||
|
SERVER_VERSION_TIMEOUT = 10
|
||||||
|
|
||||||
ON_SUPERVISOR_SCHEMA = vol.Schema({vol.Optional(CONF_USE_ADDON, default=True): bool})
|
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})
|
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:
|
async def async_get_version_info(hass: HomeAssistant, ws_address: str) -> VersionInfo:
|
||||||
"""Return Z-Wave JS version info."""
|
"""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(
|
version_info: VersionInfo = await get_server_version(
|
||||||
ws_address, async_get_clientsession(hass)
|
ws_address, async_get_clientsession(hass)
|
||||||
)
|
)
|
||||||
except (asyncio.TimeoutError, aiohttp.ClientError) as err:
|
except (asyncio.TimeoutError, aiohttp.ClientError) as err:
|
||||||
# We don't want to spam the log if the add-on isn't started
|
# We don't want to spam the log if the add-on isn't started
|
||||||
# or takes a long time to start.
|
# or takes a long time to start.
|
||||||
_LOGGER.debug("Failed to connect to Z-Wave JS server: %s", err)
|
_LOGGER.debug("Failed to connect to Z-Wave JS server: %s", err)
|
||||||
raise CannotConnect from err
|
raise CannotConnect from err
|
||||||
|
|
||||||
return version_info
|
return version_info
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ from zwave_js_server.version import VersionInfo
|
|||||||
|
|
||||||
from homeassistant import config_entries, setup
|
from homeassistant import config_entries, setup
|
||||||
from homeassistant.components.hassio.handler import HassioAPIError
|
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 homeassistant.components.zwave_js.const import DOMAIN
|
||||||
|
|
||||||
from tests.common import MockConfigEntry
|
from tests.common import MockConfigEntry
|
||||||
@ -138,7 +138,7 @@ def server_version_side_effect_fixture():
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="get_server_version", autouse=True)
|
@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."""
|
"""Mock server version."""
|
||||||
version_info = VersionInfo(
|
version_info = VersionInfo(
|
||||||
driver_version="mock-driver-version",
|
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",
|
"homeassistant.components.zwave_js.config_flow.get_server_version",
|
||||||
side_effect=server_version_side_effect,
|
side_effect=server_version_side_effect,
|
||||||
return_value=version_info,
|
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
|
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)
|
@pytest.fixture(name="addon_setup_time", autouse=True)
|
||||||
def mock_addon_setup_time():
|
def mock_addon_setup_time():
|
||||||
"""Mock add-on setup sleep time."""
|
"""Mock add-on setup sleep time."""
|
||||||
@ -198,22 +207,30 @@ async def test_manual(hass):
|
|||||||
assert result2["result"].unique_id == 1234
|
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(
|
@pytest.mark.parametrize(
|
||||||
"url, server_version_side_effect, error",
|
"url, server_version_side_effect, server_version_timeout, error",
|
||||||
[
|
[
|
||||||
(
|
(
|
||||||
"not-ws-url",
|
"not-ws-url",
|
||||||
None,
|
None,
|
||||||
|
SERVER_VERSION_TIMEOUT,
|
||||||
"invalid_ws_url",
|
"invalid_ws_url",
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
"ws://localhost:3000",
|
"ws://localhost:3000",
|
||||||
asyncio.TimeoutError,
|
slow_server_version,
|
||||||
|
0,
|
||||||
"cannot_connect",
|
"cannot_connect",
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
"ws://localhost:3000",
|
"ws://localhost:3000",
|
||||||
Exception("Boom"),
|
Exception("Boom"),
|
||||||
|
SERVER_VERSION_TIMEOUT,
|
||||||
"unknown",
|
"unknown",
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user