Bump adb-shell to 0.1.0 and androidtv to 0.0.36 (#29938)

* Bump adb-shell to 0.1.0 and androidtv to 0.0.36

* Add test for setting up two devices

* Add test_setup_same_device_twice

* Fix test_setup_two_devices

* Fix coverage

* Coverage

* Fix flaky 'test_setup_two_devices'

* Another stab at coverage

* Rename 'address' back to 'host'
This commit is contained in:
Jeff Irion 2019-12-15 02:31:59 -08:00 committed by Fabian Affolter
parent a28545b69b
commit 8a5bce81c8
6 changed files with 96 additions and 28 deletions

View file

@ -3,8 +3,8 @@
"name": "Androidtv",
"documentation": "https://www.home-assistant.io/integrations/androidtv",
"requirements": [
"adb-shell==0.0.9",
"androidtv==0.0.35",
"adb-shell==0.1.0",
"androidtv==0.0.36",
"pure-python-adb==0.2.2.dev0"
],
"dependencies": [],

View file

@ -146,7 +146,8 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
adb_log = f"using Python ADB implementation with adbkey='{adbkey}'"
aftv = setup(
host,
config[CONF_HOST],
config[CONF_PORT],
adbkey,
device_class=config[CONF_DEVICE_CLASS],
state_detection_rules=config[CONF_STATE_DETECTION_RULES],
@ -159,7 +160,8 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
)
aftv = setup(
host,
config[CONF_HOST],
config[CONF_PORT],
config[CONF_ADBKEY],
device_class=config[CONF_DEVICE_CLASS],
state_detection_rules=config[CONF_STATE_DETECTION_RULES],
@ -171,7 +173,8 @@ def setup_platform(hass, config, add_entities, discovery_info=None):
adb_log = f"using ADB server at {config[CONF_ADB_SERVER_IP]}:{config[CONF_ADB_SERVER_PORT]}"
aftv = setup(
host,
config[CONF_HOST],
config[CONF_PORT],
adb_server_ip=config[CONF_ADB_SERVER_IP],
adb_server_port=config[CONF_ADB_SERVER_PORT],
device_class=config[CONF_DEVICE_CLASS],

View file

@ -115,7 +115,7 @@ adafruit-blinka==1.2.1
adafruit-circuitpython-mcp230xx==1.1.2
# homeassistant.components.androidtv
adb-shell==0.0.9
adb-shell==0.1.0
# homeassistant.components.adguard
adguardhome==0.3.0
@ -215,7 +215,7 @@ ambiclimate==0.2.1
amcrest==1.5.3
# homeassistant.components.androidtv
androidtv==0.0.35
androidtv==0.0.36
# homeassistant.components.anel_pwrctrl
anel_pwrctrl-homeassistant==0.0.1.dev2

View file

@ -29,7 +29,7 @@ YesssSMS==0.4.1
abodepy==0.16.7
# homeassistant.components.androidtv
adb-shell==0.0.9
adb-shell==0.1.0
# homeassistant.components.adguard
adguardhome==0.3.0
@ -84,7 +84,7 @@ airly==0.0.2
ambiclimate==0.2.1
# homeassistant.components.androidtv
androidtv==0.0.35
androidtv==0.0.36
# homeassistant.components.apns
apns2==0.3.0

View file

@ -3,11 +3,11 @@
from unittest.mock import mock_open, patch
class AdbDeviceFake:
"""A fake of the `adb_shell.adb_device.AdbDevice` class."""
class AdbDeviceTcpFake:
"""A fake of the `adb_shell.adb_device.AdbDeviceTcp` class."""
def __init__(self, *args, **kwargs):
"""Initialize a fake `adb_shell.adb_device.AdbDevice` instance."""
"""Initialize a fake `adb_shell.adb_device.AdbDeviceTcp` instance."""
self.available = False
def close(self):
@ -74,39 +74,39 @@ class DeviceFake:
def patch_connect(success):
"""Mock the `adb_shell.adb_device.AdbDevice` and `ppadb.client.Client` classes."""
"""Mock the `adb_shell.adb_device.AdbDeviceTcp` and `ppadb.client.Client` classes."""
def connect_success_python(self, *args, **kwargs):
"""Mock the `AdbDeviceFake.connect` method when it succeeds."""
"""Mock the `AdbDeviceTcpFake.connect` method when it succeeds."""
self.available = True
def connect_fail_python(self, *args, **kwargs):
"""Mock the `AdbDeviceFake.connect` method when it fails."""
"""Mock the `AdbDeviceTcpFake.connect` method when it fails."""
raise OSError
if success:
return {
"python": patch(
f"{__name__}.AdbDeviceFake.connect", connect_success_python
f"{__name__}.AdbDeviceTcpFake.connect", connect_success_python
),
"server": patch("androidtv.adb_manager.Client", ClientFakeSuccess),
}
return {
"python": patch(f"{__name__}.AdbDeviceFake.connect", connect_fail_python),
"python": patch(f"{__name__}.AdbDeviceTcpFake.connect", connect_fail_python),
"server": patch("androidtv.adb_manager.Client", ClientFakeFail),
}
def patch_shell(response=None, error=False):
"""Mock the `AdbDeviceFake.shell` and `DeviceFake.shell` methods."""
"""Mock the `AdbDeviceTcpFake.shell` and `DeviceFake.shell` methods."""
def shell_success(self, cmd):
"""Mock the `AdbDeviceFake.shell` and `DeviceFake.shell` methods when they are successful."""
"""Mock the `AdbDeviceTcpFake.shell` and `DeviceFake.shell` methods when they are successful."""
self.shell_cmd = cmd
return response
def shell_fail_python(self, cmd):
"""Mock the `AdbDeviceFake.shell` method when it fails."""
"""Mock the `AdbDeviceTcpFake.shell` method when it fails."""
self.shell_cmd = cmd
raise AttributeError
@ -117,16 +117,16 @@ def patch_shell(response=None, error=False):
if not error:
return {
"python": patch(f"{__name__}.AdbDeviceFake.shell", shell_success),
"python": patch(f"{__name__}.AdbDeviceTcpFake.shell", shell_success),
"server": patch(f"{__name__}.DeviceFake.shell", shell_success),
}
return {
"python": patch(f"{__name__}.AdbDeviceFake.shell", shell_fail_python),
"python": patch(f"{__name__}.AdbDeviceTcpFake.shell", shell_fail_python),
"server": patch(f"{__name__}.DeviceFake.shell", shell_fail_server),
}
PATCH_ADB_DEVICE = patch("androidtv.adb_manager.AdbDevice", AdbDeviceFake)
PATCH_ADB_DEVICE_TCP = patch("androidtv.adb_manager.AdbDeviceTcp", AdbDeviceTcpFake)
PATCH_ANDROIDTV_OPEN = patch("androidtv.adb_manager.open", mock_open())
PATCH_KEYGEN = patch("homeassistant.components.androidtv.media_player.keygen")
PATCH_SIGNER = patch("androidtv.adb_manager.PythonRSASigner")

View file

@ -95,7 +95,7 @@ async def _test_reconnect(hass, caplog, config):
"""
patch_key, entity_id = _setup(hass, config)
with patchers.PATCH_ADB_DEVICE, patchers.patch_connect(True)[
with patchers.PATCH_ADB_DEVICE_TCP, patchers.patch_connect(True)[
patch_key
], patchers.patch_shell("")[
patch_key
@ -166,7 +166,7 @@ async def _test_adb_shell_returns_none(hass, config):
"""
patch_key, entity_id = _setup(hass, config)
with patchers.PATCH_ADB_DEVICE, patchers.patch_connect(True)[
with patchers.PATCH_ADB_DEVICE_TCP, patchers.patch_connect(True)[
patch_key
], patchers.patch_shell("")[
patch_key
@ -274,7 +274,7 @@ async def test_setup_with_adbkey(hass):
config[DOMAIN][CONF_ADBKEY] = hass.config.path("user_provided_adbkey")
patch_key, entity_id = _setup(hass, config)
with patchers.PATCH_ADB_DEVICE, patchers.patch_connect(True)[
with patchers.PATCH_ADB_DEVICE_TCP, patchers.patch_connect(True)[
patch_key
], patchers.patch_shell("")[
patch_key
@ -292,7 +292,7 @@ async def _test_sources(hass, config0):
config[DOMAIN][CONF_APPS] = {"com.app.test1": "TEST 1"}
patch_key, entity_id = _setup(hass, config)
with patchers.PATCH_ADB_DEVICE, patchers.patch_connect(True)[
with patchers.PATCH_ADB_DEVICE_TCP, patchers.patch_connect(True)[
patch_key
], patchers.patch_shell("")[patch_key]:
assert await async_setup_component(hass, DOMAIN, config)
@ -364,7 +364,7 @@ async def _test_select_source(hass, config0, source, expected_arg, method_patch)
config[DOMAIN][CONF_APPS] = {"com.app.test1": "TEST 1"}
patch_key, entity_id = _setup(hass, config)
with patchers.PATCH_ADB_DEVICE, patchers.patch_connect(True)[
with patchers.PATCH_ADB_DEVICE_TCP, patchers.patch_connect(True)[
patch_key
], patchers.patch_shell("")[patch_key]:
assert await async_setup_component(hass, DOMAIN, config)
@ -515,3 +515,68 @@ async def test_firetv_select_source_stop_app_id_no_name(hass):
"com.app.test2",
patchers.PATCH_STOP_APP,
)
async def _test_setup_fail(hass, config):
"""Test that the entity is not created when the ADB connection is not established."""
patch_key, entity_id = _setup(hass, config)
with patchers.PATCH_ADB_DEVICE_TCP, patchers.patch_connect(False)[
patch_key
], patchers.patch_shell("")[
patch_key
], patchers.PATCH_KEYGEN, patchers.PATCH_ANDROIDTV_OPEN, patchers.PATCH_SIGNER:
assert await async_setup_component(hass, DOMAIN, config)
await hass.helpers.entity_component.async_update_entity(entity_id)
state = hass.states.get(entity_id)
assert state is None
return True
async def test_setup_fail_androidtv(hass):
"""Test that the Android TV entity is not created when the ADB connection is not established."""
assert await _test_setup_fail(hass, CONFIG_ANDROIDTV_PYTHON_ADB)
async def test_setup_fail_firetv(hass):
"""Test that the Fire TV entity is not created when the ADB connection is not established."""
assert await _test_setup_fail(hass, CONFIG_FIRETV_PYTHON_ADB)
async def test_setup_two_devices(hass):
"""Test that two devices can be set up."""
config = {
DOMAIN: [
CONFIG_ANDROIDTV_ADB_SERVER[DOMAIN],
CONFIG_FIRETV_ADB_SERVER[DOMAIN].copy(),
]
}
config[DOMAIN][1][CONF_HOST] = "127.0.0.2"
patch_key = "server"
with patchers.PATCH_ADB_DEVICE_TCP, patchers.patch_connect(True)[
patch_key
], patchers.patch_shell("")[patch_key]:
assert await async_setup_component(hass, DOMAIN, config)
for entity_id in ["media_player.android_tv", "media_player.fire_tv"]:
await hass.helpers.entity_component.async_update_entity(entity_id)
state = hass.states.get(entity_id)
assert state is not None
assert state.state == STATE_OFF
async def test_setup_same_device_twice(hass):
"""Test that setup succeeds with a duplicated config entry."""
patch_key = "server"
with patchers.PATCH_ADB_DEVICE_TCP, patchers.patch_connect(True)[
patch_key
], patchers.patch_shell("")[patch_key]:
assert await async_setup_component(hass, DOMAIN, CONFIG_ANDROIDTV_ADB_SERVER)
with patchers.PATCH_ADB_DEVICE_TCP, patchers.patch_connect(True)[
patch_key
], patchers.patch_shell("")[patch_key]:
assert await async_setup_component(hass, DOMAIN, CONFIG_ANDROIDTV_ADB_SERVER)