blob: 951c80a7debdd0ebf960732818caf4ad84d0b8ce [file] [log] [blame]
"""Unittest Lab exercise to test implementation of "Synonym Dictionary"."""
import os
import unittest
from unittest import mock
from mobly.controllers import android_device
from mobly.controllers.android_device_lib import adb
from mobly.snippet import errors as snippet_errors
from ui_automator import errors
from ui_automator import ui_automator
class UIAutomatorTest(unittest.TestCase):
def setUp(self):
"""This method will be run before each of the test methods in the class."""
super().setUp()
self.ui_automator = ui_automator.UIAutomator()
self.mock_android_device = mock.patch.object(
android_device, 'AndroidDevice'
).start()
@mock.patch.object(android_device, 'get_all_instances', autospec=True)
def test_load_device_raises_an_error_when_adb_not_installed(
self, mock_get_all_instances
):
mock_get_all_instances.side_effect = adb.AdbError(
cmd='adb devices',
stdout='fake_msg',
stderr='adb command not found',
ret_code=1,
)
with self.assertRaisesRegex(
errors.AdbError,
r'Please install adb and add it to your PATH environment variable\.',
):
self.ui_automator.load_device()
@mock.patch.object(
android_device, 'get_all_instances', autospec=True, return_value=[]
)
def test_load_device_no_android_device_error(
self, unused_mock_get_all_instances
):
with self.assertRaises(errors.NoAndroidDeviceError):
self.ui_automator.load_device()
@mock.patch.object(
android_device, 'get_all_instances', autospec=True, return_value=[1, 2]
)
def test_load_device_success(self, unused_mock_get_all_instances):
with self.assertLogs() as cm:
self.ui_automator.load_device()
self.assertEqual(cm.output, ['INFO:root:connected device: [1]'])
def test_load_snippet_without_load_device_raises_error(self):
with self.assertRaises(errors.NoAndroidDeviceError):
self.ui_automator.load_snippet()
@mock.patch.object(android_device, 'get_all_instances', autospec=True)
def test_load_snippet_success(self, mock_get_all_instances):
mock_get_all_instances.return_value = [self.mock_android_device]
self.ui_automator.load_device()
self.ui_automator.load_snippet()
@mock.patch.object(android_device, 'get_all_instances', autospec=True)
def test_load_snippet_fails_with_server_start_pre_check_error(
self, mock_get_all_instances
):
self.mock_android_device.load_snippet.side_effect = (
snippet_errors.ServerStartPreCheckError('fake_ad', 'fake_msg')
)
mock_get_all_instances.return_value = [self.mock_android_device]
self.ui_automator.load_device()
with self.assertRaises(errors.AndroidDeviceNotReadyError):
self.ui_automator.load_snippet()
@mock.patch.object(android_device, 'get_all_instances', autospec=True)
def test_load_snippet_fails_with_server_start_error(
self, mock_get_all_instances
):
self.mock_android_device.load_snippet.side_effect = (
snippet_errors.ServerStartError('fake_ad', 'fake_msg')
)
mock_get_all_instances.return_value = [self.mock_android_device]
self.ui_automator.load_device()
with self.assertRaises(errors.AndroidDeviceNotReadyError):
self.ui_automator.load_snippet()
@mock.patch.object(android_device, 'get_all_instances', autospec=True)
def test_load_snippet_fails_with_protocol_error(self, mock_get_all_instances):
self.mock_android_device.load_snippet.side_effect = (
snippet_errors.ProtocolError('fake_ad', 'fake_msg')
)
mock_get_all_instances.return_value = [self.mock_android_device]
self.ui_automator.load_device()
with self.assertRaises(errors.AndroidDeviceNotReadyError):
self.ui_automator.load_snippet()
@mock.patch.object(android_device, 'get_all_instances', autospec=True)
def test_load_snippet_fails_with_snippet_error(self, mock_get_all_instances):
self.mock_android_device.load_snippet.side_effect = (
android_device.SnippetError('fake_device', 'fake_msg')
)
mock_get_all_instances.return_value = [self.mock_android_device]
self.ui_automator.load_device()
with self.assertLogs(level='DEBUG') as cm:
self.ui_automator.load_snippet()
self.assertEqual(
cm.output,
[
"DEBUG:root:'fake_device'::Service<SnippetManagementService>"
' fake_msg'
],
)
@mock.patch.object(android_device, 'get_all_instances', autospec=True)
@mock.patch.object(
os.path, 'dirname', autospec=True, return_value='/path/to/'
)
def test_load_snippet_installs_apk_when_apk_is_not_installed(
self, mock_dirname, mock_get_all_instances
):
self.mock_android_device.adb.shell.return_value = (
b'package:installed.apk\n'
)
mock_get_all_instances.return_value = [self.mock_android_device]
self.ui_automator.load_device()
self.ui_automator.load_snippet()
self.mock_android_device.adb.install.assert_called_once_with(
['-r', '-g', '/path/to/android/app/snippet-0.0.0.apk']
)
mock_dirname.assert_called_once()
@mock.patch.object(android_device, 'get_all_instances', autospec=True)
@mock.patch.object(os.path, 'dirname', autospec=True)
def test_load_snippet_should_not_install_apk_when_apk_is_installed(
self, mock_dirname, mock_get_all_instances
):
self.mock_android_device.adb.shell.return_value = (
b'package:com.chip.interop.moblysnippet'
)
mock_get_all_instances.return_value = [self.mock_android_device]
self.ui_automator.load_device()
self.ui_automator.load_snippet()
self.mock_android_device.adb.install.assert_not_called()
mock_dirname.assert_not_called()
if __name__ == '__main__':
unittest.main()