mirror of
https://github.com/esphome/esphome.git
synced 2026-09-11 15:27:33 +00:00
65 lines
2.4 KiB
Python
65 lines
2.4 KiB
Python
"""Test API server reboot timeout functionality."""
|
|
|
|
import asyncio
|
|
import re
|
|
|
|
import pytest
|
|
|
|
from .types import APIClientConnectedFactory, RunCompiledFunction
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_api_reboot_timeout(
|
|
yaml_config: str,
|
|
run_compiled: RunCompiledFunction,
|
|
) -> None:
|
|
"""Test that the device reboots when no API clients connect within the timeout."""
|
|
loop = asyncio.get_running_loop()
|
|
reboot_future = loop.create_future()
|
|
# The harness port probe always connects without authenticating, so the
|
|
# reboot deterministically reports the unauthenticated form
|
|
reboot_pattern = re.compile(r"none authenticated; rebooting")
|
|
|
|
def check_output(line: str) -> None:
|
|
"""Check output for reboot message."""
|
|
if not reboot_future.done() and reboot_pattern.search(line):
|
|
reboot_future.set_result(True)
|
|
|
|
# Run the device without connecting any API client
|
|
async with run_compiled(yaml_config, line_callback=check_output):
|
|
# Wait for reboot with timeout
|
|
# (0.5s reboot timeout + some margin for processing)
|
|
try:
|
|
await asyncio.wait_for(reboot_future, timeout=2.0)
|
|
except TimeoutError:
|
|
pytest.fail("Device did not reboot within expected timeout")
|
|
|
|
# Test passes if we get here - reboot was detected
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_api_reboot_timeout_after_authenticated_disconnect(
|
|
yaml_config: str,
|
|
run_compiled: RunCompiledFunction,
|
|
api_client_connected: APIClientConnectedFactory,
|
|
) -> None:
|
|
"""An authenticated disconnect resets the flag; the clean branch reboots."""
|
|
loop = asyncio.get_running_loop()
|
|
reboot_future = loop.create_future()
|
|
reboot_pattern = re.compile(r"No clients; rebooting")
|
|
|
|
def check_output(line: str) -> None:
|
|
"""Check output for reboot message."""
|
|
if not reboot_future.done() and reboot_pattern.search(line):
|
|
reboot_future.set_result(True)
|
|
|
|
async with run_compiled(yaml_config, line_callback=check_output):
|
|
# An authenticated session refreshes the watchdog and clears the
|
|
# unauthenticated flag the harness probe set
|
|
async with api_client_connected() as client:
|
|
await client.device_info()
|
|
try:
|
|
await asyncio.wait_for(reboot_future, timeout=5.0)
|
|
except TimeoutError:
|
|
pytest.fail("Device did not reboot within expected timeout")
|