| """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() |