Add diagnostics test to AndroidTV (#117129)
This commit is contained in:
parent
a3c3f938a7
commit
7f934bafc2
4 changed files with 212 additions and 133 deletions
114
tests/components/androidtv/common.py
Normal file
114
tests/components/androidtv/common.py
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
"""Test code shared between test files."""
|
||||||
|
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
from homeassistant.components.androidtv.const import (
|
||||||
|
CONF_ADB_SERVER_IP,
|
||||||
|
CONF_ADB_SERVER_PORT,
|
||||||
|
CONF_ADBKEY,
|
||||||
|
DEFAULT_ADB_SERVER_PORT,
|
||||||
|
DEFAULT_PORT,
|
||||||
|
DEVICE_ANDROIDTV,
|
||||||
|
DEVICE_FIRETV,
|
||||||
|
DOMAIN,
|
||||||
|
)
|
||||||
|
from homeassistant.components.androidtv.entity import PREFIX_ANDROIDTV, PREFIX_FIRETV
|
||||||
|
from homeassistant.const import CONF_DEVICE_CLASS, CONF_HOST, CONF_NAME, CONF_PORT
|
||||||
|
from homeassistant.util import slugify
|
||||||
|
|
||||||
|
from . import patchers
|
||||||
|
|
||||||
|
from tests.common import MockConfigEntry
|
||||||
|
|
||||||
|
ADB_PATCH_KEY = "patch_key"
|
||||||
|
TEST_ENTITY_NAME = "entity_name"
|
||||||
|
TEST_HOST_NAME = "127.0.0.1"
|
||||||
|
|
||||||
|
SHELL_RESPONSE_OFF = ""
|
||||||
|
SHELL_RESPONSE_STANDBY = "1"
|
||||||
|
|
||||||
|
# Android device with Python ADB implementation
|
||||||
|
CONFIG_ANDROID_PYTHON_ADB = {
|
||||||
|
ADB_PATCH_KEY: patchers.KEY_PYTHON,
|
||||||
|
TEST_ENTITY_NAME: f"{PREFIX_ANDROIDTV} {TEST_HOST_NAME}",
|
||||||
|
DOMAIN: {
|
||||||
|
CONF_HOST: TEST_HOST_NAME,
|
||||||
|
CONF_PORT: DEFAULT_PORT,
|
||||||
|
CONF_DEVICE_CLASS: DEVICE_ANDROIDTV,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
# Android device with Python ADB implementation imported from YAML
|
||||||
|
CONFIG_ANDROID_PYTHON_ADB_YAML = {
|
||||||
|
ADB_PATCH_KEY: patchers.KEY_PYTHON,
|
||||||
|
TEST_ENTITY_NAME: "ADB yaml import",
|
||||||
|
DOMAIN: {
|
||||||
|
CONF_NAME: "ADB yaml import",
|
||||||
|
**CONFIG_ANDROID_PYTHON_ADB[DOMAIN],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
# Android device with Python ADB implementation with custom adbkey
|
||||||
|
CONFIG_ANDROID_PYTHON_ADB_KEY = {
|
||||||
|
ADB_PATCH_KEY: patchers.KEY_PYTHON,
|
||||||
|
TEST_ENTITY_NAME: CONFIG_ANDROID_PYTHON_ADB[TEST_ENTITY_NAME],
|
||||||
|
DOMAIN: {
|
||||||
|
**CONFIG_ANDROID_PYTHON_ADB[DOMAIN],
|
||||||
|
CONF_ADBKEY: "user_provided_adbkey",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
# Android device with ADB server
|
||||||
|
CONFIG_ANDROID_ADB_SERVER = {
|
||||||
|
ADB_PATCH_KEY: patchers.KEY_SERVER,
|
||||||
|
TEST_ENTITY_NAME: f"{PREFIX_ANDROIDTV} {TEST_HOST_NAME}",
|
||||||
|
DOMAIN: {
|
||||||
|
CONF_HOST: TEST_HOST_NAME,
|
||||||
|
CONF_PORT: DEFAULT_PORT,
|
||||||
|
CONF_DEVICE_CLASS: DEVICE_ANDROIDTV,
|
||||||
|
CONF_ADB_SERVER_IP: patchers.ADB_SERVER_HOST,
|
||||||
|
CONF_ADB_SERVER_PORT: DEFAULT_ADB_SERVER_PORT,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fire TV device with Python ADB implementation
|
||||||
|
CONFIG_FIRETV_PYTHON_ADB = {
|
||||||
|
ADB_PATCH_KEY: patchers.KEY_PYTHON,
|
||||||
|
TEST_ENTITY_NAME: f"{PREFIX_FIRETV} {TEST_HOST_NAME}",
|
||||||
|
DOMAIN: {
|
||||||
|
CONF_HOST: TEST_HOST_NAME,
|
||||||
|
CONF_PORT: DEFAULT_PORT,
|
||||||
|
CONF_DEVICE_CLASS: DEVICE_FIRETV,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
# Fire TV device with ADB server
|
||||||
|
CONFIG_FIRETV_ADB_SERVER = {
|
||||||
|
ADB_PATCH_KEY: patchers.KEY_SERVER,
|
||||||
|
TEST_ENTITY_NAME: f"{PREFIX_FIRETV} {TEST_HOST_NAME}",
|
||||||
|
DOMAIN: {
|
||||||
|
CONF_HOST: TEST_HOST_NAME,
|
||||||
|
CONF_PORT: DEFAULT_PORT,
|
||||||
|
CONF_DEVICE_CLASS: DEVICE_FIRETV,
|
||||||
|
CONF_ADB_SERVER_IP: patchers.ADB_SERVER_HOST,
|
||||||
|
CONF_ADB_SERVER_PORT: DEFAULT_ADB_SERVER_PORT,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
CONFIG_ANDROID_DEFAULT = CONFIG_ANDROID_PYTHON_ADB
|
||||||
|
CONFIG_FIRETV_DEFAULT = CONFIG_FIRETV_PYTHON_ADB
|
||||||
|
|
||||||
|
|
||||||
|
def setup_mock_entry(
|
||||||
|
config: dict[str, Any], entity_domain: str
|
||||||
|
) -> tuple[str, str, MockConfigEntry]:
|
||||||
|
"""Prepare mock entry for entities tests."""
|
||||||
|
patch_key = config[ADB_PATCH_KEY]
|
||||||
|
entity_id = f"{entity_domain}.{slugify(config[TEST_ENTITY_NAME])}"
|
||||||
|
config_entry = MockConfigEntry(
|
||||||
|
domain=DOMAIN,
|
||||||
|
data=config[DOMAIN],
|
||||||
|
unique_id="a1:b1:c1:d1:e1:f1",
|
||||||
|
)
|
||||||
|
|
||||||
|
return patch_key, entity_id, config_entry
|
38
tests/components/androidtv/conftest.py
Normal file
38
tests/components/androidtv/conftest.py
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
"""Fixtures for the Android TV integration tests."""
|
||||||
|
|
||||||
|
from collections.abc import Generator
|
||||||
|
from unittest.mock import Mock, patch
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from . import patchers
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def adb_device_tcp_fixture() -> Generator[None, patchers.AdbDeviceTcpAsyncFake, None]:
|
||||||
|
"""Patch ADB Device TCP."""
|
||||||
|
with patch(
|
||||||
|
"androidtv.adb_manager.adb_manager_async.AdbDeviceTcpAsync",
|
||||||
|
patchers.AdbDeviceTcpAsyncFake,
|
||||||
|
):
|
||||||
|
yield
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def load_adbkey_fixture() -> Generator[None, str, None]:
|
||||||
|
"""Patch load_adbkey."""
|
||||||
|
with patch(
|
||||||
|
"homeassistant.components.androidtv.ADBPythonSync.load_adbkey",
|
||||||
|
return_value="signer for testing",
|
||||||
|
):
|
||||||
|
yield
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(autouse=True)
|
||||||
|
def keygen_fixture() -> Generator[None, Mock, None]:
|
||||||
|
"""Patch keygen."""
|
||||||
|
with patch(
|
||||||
|
"homeassistant.components.androidtv.keygen",
|
||||||
|
return_value=Mock(),
|
||||||
|
):
|
||||||
|
yield
|
39
tests/components/androidtv/test_diagnostics.py
Normal file
39
tests/components/androidtv/test_diagnostics.py
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
"""Tests for the diagnostics data provided by the AndroidTV integration."""
|
||||||
|
|
||||||
|
from homeassistant.components.asuswrt.diagnostics import TO_REDACT
|
||||||
|
from homeassistant.components.diagnostics import async_redact_data
|
||||||
|
from homeassistant.components.media_player import DOMAIN as MP_DOMAIN
|
||||||
|
from homeassistant.config_entries import ConfigEntryState
|
||||||
|
from homeassistant.core import HomeAssistant
|
||||||
|
|
||||||
|
from . import patchers
|
||||||
|
from .common import CONFIG_ANDROID_DEFAULT, SHELL_RESPONSE_OFF, setup_mock_entry
|
||||||
|
|
||||||
|
from tests.components.diagnostics import get_diagnostics_for_config_entry
|
||||||
|
from tests.typing import ClientSessionGenerator
|
||||||
|
|
||||||
|
|
||||||
|
async def test_diagnostics(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
hass_client: ClientSessionGenerator,
|
||||||
|
) -> None:
|
||||||
|
"""Test diagnostics."""
|
||||||
|
patch_key, _, mock_config_entry = setup_mock_entry(
|
||||||
|
CONFIG_ANDROID_DEFAULT, MP_DOMAIN
|
||||||
|
)
|
||||||
|
mock_config_entry.add_to_hass(hass)
|
||||||
|
|
||||||
|
with (
|
||||||
|
patchers.patch_connect(True)[patch_key],
|
||||||
|
patchers.patch_shell(SHELL_RESPONSE_OFF)[patch_key],
|
||||||
|
):
|
||||||
|
assert await hass.config_entries.async_setup(mock_config_entry.entry_id)
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
assert mock_config_entry.state is ConfigEntryState.LOADED
|
||||||
|
|
||||||
|
entry_dict = async_redact_data(mock_config_entry.as_dict(), TO_REDACT)
|
||||||
|
result = await get_diagnostics_for_config_entry(
|
||||||
|
hass, hass_client, mock_config_entry
|
||||||
|
)
|
||||||
|
|
||||||
|
assert result["entry"] == entry_dict
|
|
@ -1,10 +1,9 @@
|
||||||
"""The tests for the androidtv platform."""
|
"""The tests for the androidtv platform."""
|
||||||
|
|
||||||
from collections.abc import Generator
|
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import logging
|
import logging
|
||||||
from typing import Any
|
from typing import Any
|
||||||
from unittest.mock import Mock, patch
|
from unittest.mock import patch
|
||||||
|
|
||||||
from adb_shell.exceptions import TcpTimeoutException as AdbShellTimeoutException
|
from adb_shell.exceptions import TcpTimeoutException as AdbShellTimeoutException
|
||||||
from androidtv.constants import APPS as ANDROIDTV_APPS, KEYS
|
from androidtv.constants import APPS as ANDROIDTV_APPS, KEYS
|
||||||
|
@ -12,9 +11,6 @@ from androidtv.exceptions import LockNotAcquiredException
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from homeassistant.components.androidtv.const import (
|
from homeassistant.components.androidtv.const import (
|
||||||
CONF_ADB_SERVER_IP,
|
|
||||||
CONF_ADB_SERVER_PORT,
|
|
||||||
CONF_ADBKEY,
|
|
||||||
CONF_APPS,
|
CONF_APPS,
|
||||||
CONF_EXCLUDE_UNNAMED_APPS,
|
CONF_EXCLUDE_UNNAMED_APPS,
|
||||||
CONF_SCREENCAP,
|
CONF_SCREENCAP,
|
||||||
|
@ -23,11 +19,8 @@ from homeassistant.components.androidtv.const import (
|
||||||
CONF_TURN_ON_COMMAND,
|
CONF_TURN_ON_COMMAND,
|
||||||
DEFAULT_ADB_SERVER_PORT,
|
DEFAULT_ADB_SERVER_PORT,
|
||||||
DEFAULT_PORT,
|
DEFAULT_PORT,
|
||||||
DEVICE_ANDROIDTV,
|
|
||||||
DEVICE_FIRETV,
|
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
)
|
)
|
||||||
from homeassistant.components.androidtv.entity import PREFIX_ANDROIDTV, PREFIX_FIRETV
|
|
||||||
from homeassistant.components.androidtv.media_player import (
|
from homeassistant.components.androidtv.media_player import (
|
||||||
ATTR_DEVICE_PATH,
|
ATTR_DEVICE_PATH,
|
||||||
ATTR_LOCAL_PATH,
|
ATTR_LOCAL_PATH,
|
||||||
|
@ -58,9 +51,6 @@ from homeassistant.const import (
|
||||||
ATTR_COMMAND,
|
ATTR_COMMAND,
|
||||||
ATTR_ENTITY_ID,
|
ATTR_ENTITY_ID,
|
||||||
CONF_DEVICE_CLASS,
|
CONF_DEVICE_CLASS,
|
||||||
CONF_HOST,
|
|
||||||
CONF_NAME,
|
|
||||||
CONF_PORT,
|
|
||||||
EVENT_HOMEASSISTANT_STOP,
|
EVENT_HOMEASSISTANT_STOP,
|
||||||
SERVICE_TURN_OFF,
|
SERVICE_TURN_OFF,
|
||||||
SERVICE_TURN_ON,
|
SERVICE_TURN_ON,
|
||||||
|
@ -75,142 +65,40 @@ from homeassistant.util import slugify
|
||||||
from homeassistant.util.dt import utcnow
|
from homeassistant.util.dt import utcnow
|
||||||
|
|
||||||
from . import patchers
|
from . import patchers
|
||||||
|
from .common import (
|
||||||
|
CONFIG_ANDROID_ADB_SERVER,
|
||||||
|
CONFIG_ANDROID_DEFAULT,
|
||||||
|
CONFIG_ANDROID_PYTHON_ADB,
|
||||||
|
CONFIG_ANDROID_PYTHON_ADB_KEY,
|
||||||
|
CONFIG_ANDROID_PYTHON_ADB_YAML,
|
||||||
|
CONFIG_FIRETV_ADB_SERVER,
|
||||||
|
CONFIG_FIRETV_DEFAULT,
|
||||||
|
CONFIG_FIRETV_PYTHON_ADB,
|
||||||
|
SHELL_RESPONSE_OFF,
|
||||||
|
SHELL_RESPONSE_STANDBY,
|
||||||
|
TEST_ENTITY_NAME,
|
||||||
|
TEST_HOST_NAME,
|
||||||
|
setup_mock_entry,
|
||||||
|
)
|
||||||
|
|
||||||
from tests.common import MockConfigEntry, async_fire_time_changed
|
from tests.common import MockConfigEntry, async_fire_time_changed
|
||||||
from tests.typing import ClientSessionGenerator
|
from tests.typing import ClientSessionGenerator
|
||||||
|
|
||||||
HOST = "127.0.0.1"
|
|
||||||
|
|
||||||
ADB_PATCH_KEY = "patch_key"
|
|
||||||
TEST_ENTITY_NAME = "entity_name"
|
|
||||||
|
|
||||||
MSG_RECONNECT = {
|
MSG_RECONNECT = {
|
||||||
patchers.KEY_PYTHON: (
|
patchers.KEY_PYTHON: (
|
||||||
f"ADB connection to {HOST}:{DEFAULT_PORT} successfully established"
|
f"ADB connection to {TEST_HOST_NAME}:{DEFAULT_PORT} successfully established"
|
||||||
),
|
),
|
||||||
patchers.KEY_SERVER: (
|
patchers.KEY_SERVER: (
|
||||||
f"ADB connection to {HOST}:{DEFAULT_PORT} via ADB server"
|
f"ADB connection to {TEST_HOST_NAME}:{DEFAULT_PORT} via ADB server"
|
||||||
f" {patchers.ADB_SERVER_HOST}:{DEFAULT_ADB_SERVER_PORT} successfully"
|
f" {patchers.ADB_SERVER_HOST}:{DEFAULT_ADB_SERVER_PORT} successfully"
|
||||||
" established"
|
" established"
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
SHELL_RESPONSE_OFF = ""
|
|
||||||
SHELL_RESPONSE_STANDBY = "1"
|
|
||||||
|
|
||||||
# Android device with Python ADB implementation
|
def _setup(config: dict[str, Any]) -> tuple[str, str, MockConfigEntry]:
|
||||||
CONFIG_ANDROID_PYTHON_ADB = {
|
"""Prepare mock entry for the media player tests."""
|
||||||
ADB_PATCH_KEY: patchers.KEY_PYTHON,
|
return setup_mock_entry(config, MP_DOMAIN)
|
||||||
TEST_ENTITY_NAME: f"{PREFIX_ANDROIDTV} {HOST}",
|
|
||||||
DOMAIN: {
|
|
||||||
CONF_HOST: HOST,
|
|
||||||
CONF_PORT: DEFAULT_PORT,
|
|
||||||
CONF_DEVICE_CLASS: DEVICE_ANDROIDTV,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
# Android device with Python ADB implementation imported from YAML
|
|
||||||
CONFIG_ANDROID_PYTHON_ADB_YAML = {
|
|
||||||
ADB_PATCH_KEY: patchers.KEY_PYTHON,
|
|
||||||
TEST_ENTITY_NAME: "ADB yaml import",
|
|
||||||
DOMAIN: {
|
|
||||||
CONF_NAME: "ADB yaml import",
|
|
||||||
**CONFIG_ANDROID_PYTHON_ADB[DOMAIN],
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
# Android device with Python ADB implementation with custom adbkey
|
|
||||||
CONFIG_ANDROID_PYTHON_ADB_KEY = {
|
|
||||||
ADB_PATCH_KEY: patchers.KEY_PYTHON,
|
|
||||||
TEST_ENTITY_NAME: CONFIG_ANDROID_PYTHON_ADB[TEST_ENTITY_NAME],
|
|
||||||
DOMAIN: {
|
|
||||||
**CONFIG_ANDROID_PYTHON_ADB[DOMAIN],
|
|
||||||
CONF_ADBKEY: "user_provided_adbkey",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
# Android device with ADB server
|
|
||||||
CONFIG_ANDROID_ADB_SERVER = {
|
|
||||||
ADB_PATCH_KEY: patchers.KEY_SERVER,
|
|
||||||
TEST_ENTITY_NAME: f"{PREFIX_ANDROIDTV} {HOST}",
|
|
||||||
DOMAIN: {
|
|
||||||
CONF_HOST: HOST,
|
|
||||||
CONF_PORT: DEFAULT_PORT,
|
|
||||||
CONF_DEVICE_CLASS: DEVICE_ANDROIDTV,
|
|
||||||
CONF_ADB_SERVER_IP: patchers.ADB_SERVER_HOST,
|
|
||||||
CONF_ADB_SERVER_PORT: DEFAULT_ADB_SERVER_PORT,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
# Fire TV device with Python ADB implementation
|
|
||||||
CONFIG_FIRETV_PYTHON_ADB = {
|
|
||||||
ADB_PATCH_KEY: patchers.KEY_PYTHON,
|
|
||||||
TEST_ENTITY_NAME: f"{PREFIX_FIRETV} {HOST}",
|
|
||||||
DOMAIN: {
|
|
||||||
CONF_HOST: HOST,
|
|
||||||
CONF_PORT: DEFAULT_PORT,
|
|
||||||
CONF_DEVICE_CLASS: DEVICE_FIRETV,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
# Fire TV device with ADB server
|
|
||||||
CONFIG_FIRETV_ADB_SERVER = {
|
|
||||||
ADB_PATCH_KEY: patchers.KEY_SERVER,
|
|
||||||
TEST_ENTITY_NAME: f"{PREFIX_FIRETV} {HOST}",
|
|
||||||
DOMAIN: {
|
|
||||||
CONF_HOST: HOST,
|
|
||||||
CONF_PORT: DEFAULT_PORT,
|
|
||||||
CONF_DEVICE_CLASS: DEVICE_FIRETV,
|
|
||||||
CONF_ADB_SERVER_IP: patchers.ADB_SERVER_HOST,
|
|
||||||
CONF_ADB_SERVER_PORT: DEFAULT_ADB_SERVER_PORT,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
CONFIG_ANDROID_DEFAULT = CONFIG_ANDROID_PYTHON_ADB
|
|
||||||
CONFIG_FIRETV_DEFAULT = CONFIG_FIRETV_PYTHON_ADB
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
|
||||||
def adb_device_tcp_fixture() -> Generator[None, patchers.AdbDeviceTcpAsyncFake, None]:
|
|
||||||
"""Patch ADB Device TCP."""
|
|
||||||
with patch(
|
|
||||||
"androidtv.adb_manager.adb_manager_async.AdbDeviceTcpAsync",
|
|
||||||
patchers.AdbDeviceTcpAsyncFake,
|
|
||||||
):
|
|
||||||
yield
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
|
||||||
def load_adbkey_fixture() -> Generator[None, str, None]:
|
|
||||||
"""Patch load_adbkey."""
|
|
||||||
with patch(
|
|
||||||
"homeassistant.components.androidtv.ADBPythonSync.load_adbkey",
|
|
||||||
return_value="signer for testing",
|
|
||||||
):
|
|
||||||
yield
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(autouse=True)
|
|
||||||
def keygen_fixture() -> Generator[None, Mock, None]:
|
|
||||||
"""Patch keygen."""
|
|
||||||
with patch(
|
|
||||||
"homeassistant.components.androidtv.keygen",
|
|
||||||
return_value=Mock(),
|
|
||||||
):
|
|
||||||
yield
|
|
||||||
|
|
||||||
|
|
||||||
def _setup(config) -> tuple[str, str, MockConfigEntry]:
|
|
||||||
"""Perform common setup tasks for the tests."""
|
|
||||||
patch_key = config[ADB_PATCH_KEY]
|
|
||||||
entity_id = f"{MP_DOMAIN}.{slugify(config[TEST_ENTITY_NAME])}"
|
|
||||||
config_entry = MockConfigEntry(
|
|
||||||
domain=DOMAIN,
|
|
||||||
data=config[DOMAIN],
|
|
||||||
unique_id="a1:b1:c1:d1:e1:f1",
|
|
||||||
)
|
|
||||||
|
|
||||||
return patch_key, entity_id, config_entry
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue