Review AndroidTV tests (#69048)
parent
25779a49a4
commit
21f9b19fad
|
@ -73,7 +73,8 @@ SERVICE_DOWNLOAD = "download"
|
||||||
SERVICE_LEARN_SENDEVENT = "learn_sendevent"
|
SERVICE_LEARN_SENDEVENT = "learn_sendevent"
|
||||||
SERVICE_UPLOAD = "upload"
|
SERVICE_UPLOAD = "upload"
|
||||||
|
|
||||||
DEFAULT_NAME = "Android TV"
|
PREFIX_ANDROIDTV = "Android TV"
|
||||||
|
PREFIX_FIRETV = "Fire TV"
|
||||||
|
|
||||||
# Translate from `AndroidTV` / `FireTV` reported state to HA state.
|
# Translate from `AndroidTV` / `FireTV` reported state to HA state.
|
||||||
ANDROIDTV_STATES = {
|
ANDROIDTV_STATES = {
|
||||||
|
@ -93,7 +94,9 @@ async def async_setup_entry(
|
||||||
"""Set up the Android TV entity."""
|
"""Set up the Android TV entity."""
|
||||||
aftv = hass.data[DOMAIN][entry.entry_id][ANDROID_DEV]
|
aftv = hass.data[DOMAIN][entry.entry_id][ANDROID_DEV]
|
||||||
device_class = aftv.DEVICE_CLASS
|
device_class = aftv.DEVICE_CLASS
|
||||||
device_type = "Android TV" if device_class == DEVICE_ANDROIDTV else "Fire TV"
|
device_type = (
|
||||||
|
PREFIX_ANDROIDTV if device_class == DEVICE_ANDROIDTV else PREFIX_FIRETV
|
||||||
|
)
|
||||||
# CONF_NAME may be present in entry.data for configuration imported from YAML
|
# CONF_NAME may be present in entry.data for configuration imported from YAML
|
||||||
device_name = entry.data.get(CONF_NAME) or f"{device_type} {entry.data[CONF_HOST]}"
|
device_name = entry.data.get(CONF_NAME) or f"{device_type} {entry.data[CONF_HOST]}"
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ 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,
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
PROP_ETHMAC,
|
PROP_ETHMAC,
|
||||||
PROP_WIFIMAC,
|
PROP_WIFIMAC,
|
||||||
|
@ -35,8 +36,9 @@ from homeassistant.components.androidtv.const import (
|
||||||
from homeassistant.config_entries import SOURCE_USER
|
from homeassistant.config_entries import SOURCE_USER
|
||||||
from homeassistant.const import CONF_DEVICE_CLASS, CONF_HOST, CONF_PORT
|
from homeassistant.const import CONF_DEVICE_CLASS, CONF_HOST, CONF_PORT
|
||||||
|
|
||||||
|
from .patchers import isfile
|
||||||
|
|
||||||
from tests.common import MockConfigEntry
|
from tests.common import MockConfigEntry
|
||||||
from tests.components.androidtv.patchers import isfile
|
|
||||||
|
|
||||||
ADBKEY = "adbkey"
|
ADBKEY = "adbkey"
|
||||||
ETH_MAC = "a1:b1:c1:d1:e1:f1"
|
ETH_MAC = "a1:b1:c1:d1:e1:f1"
|
||||||
|
@ -49,14 +51,14 @@ VALID_DETECT_RULE = [{"paused": {"media_session_state": 3}}]
|
||||||
CONFIG_PYTHON_ADB = {
|
CONFIG_PYTHON_ADB = {
|
||||||
CONF_HOST: HOST,
|
CONF_HOST: HOST,
|
||||||
CONF_PORT: DEFAULT_PORT,
|
CONF_PORT: DEFAULT_PORT,
|
||||||
CONF_DEVICE_CLASS: "androidtv",
|
CONF_DEVICE_CLASS: DEVICE_ANDROIDTV,
|
||||||
}
|
}
|
||||||
|
|
||||||
# Android TV device with ADB server
|
# Android TV device with ADB server
|
||||||
CONFIG_ADB_SERVER = {
|
CONFIG_ADB_SERVER = {
|
||||||
CONF_HOST: HOST,
|
CONF_HOST: HOST,
|
||||||
CONF_PORT: DEFAULT_PORT,
|
CONF_PORT: DEFAULT_PORT,
|
||||||
CONF_DEVICE_CLASS: "androidtv",
|
CONF_DEVICE_CLASS: DEVICE_ANDROIDTV,
|
||||||
CONF_ADB_SERVER_IP: "127.0.0.1",
|
CONF_ADB_SERVER_IP: "127.0.0.1",
|
||||||
CONF_ADB_SERVER_PORT: DEFAULT_ADB_SERVER_PORT,
|
CONF_ADB_SERVER_PORT: DEFAULT_ADB_SERVER_PORT,
|
||||||
}
|
}
|
||||||
|
@ -133,7 +135,7 @@ async def test_user_adbkey(hass):
|
||||||
with patch(
|
with patch(
|
||||||
CONNECT_METHOD,
|
CONNECT_METHOD,
|
||||||
return_value=(MockConfigDevice(), None),
|
return_value=(MockConfigDevice(), None),
|
||||||
), PATCH_SETUP_ENTRY as mock_setup_entry, PATCH_ISFILE, PATCH_ACCESS:
|
), PATCH_ISFILE, PATCH_ACCESS, PATCH_SETUP_ENTRY as mock_setup_entry:
|
||||||
|
|
||||||
result = await hass.config_entries.flow.async_init(
|
result = await hass.config_entries.flow.async_init(
|
||||||
DOMAIN,
|
DOMAIN,
|
||||||
|
|
|
@ -18,11 +18,15 @@ 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.media_player import (
|
from homeassistant.components.androidtv.media_player import (
|
||||||
ATTR_DEVICE_PATH,
|
ATTR_DEVICE_PATH,
|
||||||
ATTR_LOCAL_PATH,
|
ATTR_LOCAL_PATH,
|
||||||
|
PREFIX_ANDROIDTV,
|
||||||
|
PREFIX_FIRETV,
|
||||||
SERVICE_ADB_COMMAND,
|
SERVICE_ADB_COMMAND,
|
||||||
SERVICE_DOWNLOAD,
|
SERVICE_DOWNLOAD,
|
||||||
SERVICE_LEARN_SENDEVENT,
|
SERVICE_LEARN_SENDEVENT,
|
||||||
|
@ -64,10 +68,13 @@ from homeassistant.const import (
|
||||||
from homeassistant.helpers.entity_component import async_update_entity
|
from homeassistant.helpers.entity_component import async_update_entity
|
||||||
from homeassistant.util import slugify
|
from homeassistant.util import slugify
|
||||||
|
|
||||||
|
from . import patchers
|
||||||
|
|
||||||
from tests.common import MockConfigEntry
|
from tests.common import MockConfigEntry
|
||||||
from tests.components.androidtv import patchers
|
|
||||||
|
|
||||||
CONF_OPTIONS = "options"
|
CONF_OPTIONS = "options"
|
||||||
|
HOST = "127.0.0.1"
|
||||||
|
TEST_ENTITY_NAME = "entity_name"
|
||||||
|
|
||||||
PATCH_ACCESS = patch("homeassistant.components.androidtv.os.access", return_value=True)
|
PATCH_ACCESS = patch("homeassistant.components.androidtv.os.access", return_value=True)
|
||||||
PATCH_ISFILE = patch(
|
PATCH_ISFILE = patch(
|
||||||
|
@ -79,72 +86,62 @@ SHELL_RESPONSE_STANDBY = "1"
|
||||||
|
|
||||||
# Android TV device with Python ADB implementation
|
# Android TV device with Python ADB implementation
|
||||||
CONFIG_ANDROIDTV_PYTHON_ADB = {
|
CONFIG_ANDROIDTV_PYTHON_ADB = {
|
||||||
|
TEST_ENTITY_NAME: f"{PREFIX_ANDROIDTV} {HOST}",
|
||||||
DOMAIN: {
|
DOMAIN: {
|
||||||
CONF_HOST: "127.0.0.1",
|
CONF_HOST: HOST,
|
||||||
CONF_PORT: DEFAULT_PORT,
|
CONF_PORT: DEFAULT_PORT,
|
||||||
CONF_DEVICE_CLASS: "androidtv",
|
CONF_DEVICE_CLASS: DEVICE_ANDROIDTV,
|
||||||
CONF_ADB_SERVER_PORT: DEFAULT_ADB_SERVER_PORT,
|
},
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Android TV device with Python ADB implementation imported from YAML
|
# Android TV device with Python ADB implementation imported from YAML
|
||||||
CONFIG_ANDROIDTV_PYTHON_ADB_YAML = {
|
CONFIG_ANDROIDTV_PYTHON_ADB_YAML = {
|
||||||
|
TEST_ENTITY_NAME: "ADB yaml import",
|
||||||
DOMAIN: {
|
DOMAIN: {
|
||||||
CONF_NAME: "ADB yaml import",
|
CONF_NAME: "ADB yaml import",
|
||||||
**CONFIG_ANDROIDTV_PYTHON_ADB[DOMAIN],
|
**CONFIG_ANDROIDTV_PYTHON_ADB[DOMAIN],
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
# Android TV device with ADB server
|
# Android TV device with ADB server
|
||||||
CONFIG_ANDROIDTV_ADB_SERVER = {
|
CONFIG_ANDROIDTV_ADB_SERVER = {
|
||||||
|
TEST_ENTITY_NAME: f"{PREFIX_ANDROIDTV} {HOST}",
|
||||||
DOMAIN: {
|
DOMAIN: {
|
||||||
CONF_HOST: "127.0.0.1",
|
CONF_HOST: HOST,
|
||||||
CONF_PORT: DEFAULT_PORT,
|
CONF_PORT: DEFAULT_PORT,
|
||||||
CONF_DEVICE_CLASS: "androidtv",
|
CONF_DEVICE_CLASS: DEVICE_ANDROIDTV,
|
||||||
CONF_ADB_SERVER_IP: "127.0.0.1",
|
CONF_ADB_SERVER_IP: HOST,
|
||||||
CONF_ADB_SERVER_PORT: DEFAULT_ADB_SERVER_PORT,
|
CONF_ADB_SERVER_PORT: DEFAULT_ADB_SERVER_PORT,
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
# Fire TV device with Python ADB implementation
|
# Fire TV device with Python ADB implementation
|
||||||
CONFIG_FIRETV_PYTHON_ADB = {
|
CONFIG_FIRETV_PYTHON_ADB = {
|
||||||
|
TEST_ENTITY_NAME: f"{PREFIX_FIRETV} {HOST}",
|
||||||
DOMAIN: {
|
DOMAIN: {
|
||||||
CONF_HOST: "127.0.0.1",
|
CONF_HOST: HOST,
|
||||||
CONF_PORT: DEFAULT_PORT,
|
CONF_PORT: DEFAULT_PORT,
|
||||||
CONF_DEVICE_CLASS: "firetv",
|
CONF_DEVICE_CLASS: DEVICE_FIRETV,
|
||||||
CONF_ADB_SERVER_PORT: DEFAULT_ADB_SERVER_PORT,
|
},
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Fire TV device with ADB server
|
# Fire TV device with ADB server
|
||||||
CONFIG_FIRETV_ADB_SERVER = {
|
CONFIG_FIRETV_ADB_SERVER = {
|
||||||
|
TEST_ENTITY_NAME: f"{PREFIX_FIRETV} {HOST}",
|
||||||
DOMAIN: {
|
DOMAIN: {
|
||||||
CONF_HOST: "127.0.0.1",
|
CONF_HOST: HOST,
|
||||||
CONF_PORT: DEFAULT_PORT,
|
CONF_PORT: DEFAULT_PORT,
|
||||||
CONF_DEVICE_CLASS: "firetv",
|
CONF_DEVICE_CLASS: DEVICE_FIRETV,
|
||||||
CONF_ADB_SERVER_IP: "127.0.0.1",
|
CONF_ADB_SERVER_IP: HOST,
|
||||||
CONF_ADB_SERVER_PORT: DEFAULT_ADB_SERVER_PORT,
|
CONF_ADB_SERVER_PORT: DEFAULT_ADB_SERVER_PORT,
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def _setup(config):
|
def _setup(config):
|
||||||
"""Perform common setup tasks for the tests."""
|
"""Perform common setup tasks for the tests."""
|
||||||
if CONF_ADB_SERVER_IP not in config[DOMAIN]:
|
patch_key = "server" if CONF_ADB_SERVER_IP in config[DOMAIN] else "python"
|
||||||
patch_key = "python"
|
entity_id = f"{MP_DOMAIN}.{slugify(config[TEST_ENTITY_NAME])}"
|
||||||
else:
|
|
||||||
patch_key = "server"
|
|
||||||
|
|
||||||
host = config[DOMAIN][CONF_HOST]
|
|
||||||
# CONF_NAME available for configuration imported from YAML
|
|
||||||
if conf_name := config[DOMAIN].get(CONF_NAME):
|
|
||||||
entity_id = slugify(conf_name)
|
|
||||||
elif config[DOMAIN].get(CONF_DEVICE_CLASS) != "firetv":
|
|
||||||
entity_id = slugify(f"Android TV {host}")
|
|
||||||
else:
|
|
||||||
entity_id = slugify(f"Fire TV {host}")
|
|
||||||
entity_id = f"{MP_DOMAIN}.{entity_id}"
|
|
||||||
|
|
||||||
config_entry = MockConfigEntry(
|
config_entry = MockConfigEntry(
|
||||||
domain=DOMAIN,
|
domain=DOMAIN,
|
||||||
data=config[DOMAIN],
|
data=config[DOMAIN],
|
||||||
|
@ -320,7 +317,7 @@ async def test_sources(hass, config0):
|
||||||
assert state is not None
|
assert state is not None
|
||||||
assert state.state == STATE_OFF
|
assert state.state == STATE_OFF
|
||||||
|
|
||||||
if config[DOMAIN].get(CONF_DEVICE_CLASS) != "firetv":
|
if config[DOMAIN].get(CONF_DEVICE_CLASS) != DEVICE_FIRETV:
|
||||||
patch_update = patchers.patch_androidtv_update(
|
patch_update = patchers.patch_androidtv_update(
|
||||||
"playing",
|
"playing",
|
||||||
"com.app.test1",
|
"com.app.test1",
|
||||||
|
@ -346,7 +343,7 @@ async def test_sources(hass, config0):
|
||||||
assert state.attributes["source"] == "TEST 1"
|
assert state.attributes["source"] == "TEST 1"
|
||||||
assert sorted(state.attributes["source_list"]) == ["TEST 1", "com.app.test2"]
|
assert sorted(state.attributes["source_list"]) == ["TEST 1", "com.app.test2"]
|
||||||
|
|
||||||
if config[DOMAIN].get(CONF_DEVICE_CLASS) != "firetv":
|
if config[DOMAIN].get(CONF_DEVICE_CLASS) != DEVICE_FIRETV:
|
||||||
patch_update = patchers.patch_androidtv_update(
|
patch_update = patchers.patch_androidtv_update(
|
||||||
"playing",
|
"playing",
|
||||||
"com.app.test2",
|
"com.app.test2",
|
||||||
|
@ -399,7 +396,7 @@ async def _test_exclude_sources(hass, config0, expected_sources):
|
||||||
assert state is not None
|
assert state is not None
|
||||||
assert state.state == STATE_OFF
|
assert state.state == STATE_OFF
|
||||||
|
|
||||||
if config[DOMAIN].get(CONF_DEVICE_CLASS) != "firetv":
|
if config[DOMAIN].get(CONF_DEVICE_CLASS) != DEVICE_FIRETV:
|
||||||
patch_update = patchers.patch_androidtv_update(
|
patch_update = patchers.patch_androidtv_update(
|
||||||
"playing",
|
"playing",
|
||||||
"com.app.test1",
|
"com.app.test1",
|
||||||
|
@ -1189,7 +1186,7 @@ async def test_volume_mute(hass):
|
||||||
|
|
||||||
async def test_connection_closed_on_ha_stop(hass):
|
async def test_connection_closed_on_ha_stop(hass):
|
||||||
"""Test that the ADB socket connection is closed when HA stops."""
|
"""Test that the ADB socket connection is closed when HA stops."""
|
||||||
patch_key, entity_id, config_entry = _setup(CONFIG_ANDROIDTV_ADB_SERVER)
|
patch_key, _, config_entry = _setup(CONFIG_ANDROIDTV_ADB_SERVER)
|
||||||
config_entry.add_to_hass(hass)
|
config_entry.add_to_hass(hass)
|
||||||
|
|
||||||
with patchers.PATCH_ADB_DEVICE_TCP, patchers.patch_connect(True)[
|
with patchers.PATCH_ADB_DEVICE_TCP, patchers.patch_connect(True)[
|
||||||
|
|
Loading…
Reference in New Issue