| # Copyright 2017 Google Inc. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| from __future__ import absolute_import |
| import os |
| import sys |
| import unittest |
| |
| import mock |
| import runner |
| from utilities import util |
| |
| class TestRunner(unittest.TestCase): |
| |
| def setUp(self): |
| self.mock_device_info = mock.patch( |
| 'utilities.util.GetAndroidDeviceSerialNumbers', |
| autospec=True).start() |
| self.mock_device_info.return_value = ['device_id'] |
| self.mock_choose_appium_dir = mock.patch( |
| 'appium_util.appium_driver_util.ChooseAppiumDirPath', |
| autospec=True).start() |
| self.mock_choose_appium_dir.return_value = '/usr/local/bin' |
| self.mock_choose_appium_client = mock.patch( |
| 'appium_util.appium_driver_util.ChooseAppiumClient', |
| autospec=True).start() |
| self.mock_android_app_info = mock.patch( |
| 'app_info.GetAndroidAppInformation', autospec=True).start() |
| self.mock_android_app_info.return_value.id.return_value = 'fake_package' |
| self.mock_choose_appium_client.return_value = 'appium' |
| self.test_args = ['main', 'Beta', 'Android'] |
| self.args_dict = { |
| 'channel': 'Beta', |
| 'platform': 'Android', |
| 'app_intent': None, |
| 'app_path': os.path.join(os.getcwd(), 'Beta.apk'), |
| 'appium_command': ['appium'], |
| 'appium_dir_path': '/usr/local/bin', |
| 'copy_to_cloud_storage': False, |
| 'device_id': 'device_id', |
| 'gsutil_download': None, |
| 'host_address': '127.0.0.1', |
| 'package_name': None, |
| 'retries': 1, |
| 'report_format': 'html', |
| 'screen_capture_dir': None, |
| 'skip_reset': False, |
| 'test_filter': None, |
| 'test_suite': ['*Beta*.csv'], |
| 'csv': None, |
| 'use_prebuilt_wda': False, |
| 'use_uiautomator2': False, |
| 'verbose': False, |
| 'webview': False, |
| 'xcconfig': None |
| } |
| |
| def tearDown(self): |
| runner._TEMPFILES = util.TempFiles() |
| |
| @mock.patch('logging.error', autospec=True) |
| def testParseArgsNoConnectedDevices(self, mock_logging): |
| self.mock_device_info.return_value = [] |
| with mock.patch.object(sys, 'argv', self.test_args): |
| runner._ParseArgs() |
| self.assertEqual(1, len(mock_logging.mock_calls)) |
| self.assertEqual('No device connected to machine', |
| mock_logging.mock_calls[0][1][0]) |
| |
| @mock.patch('logging.error', autospec=True) |
| def testParseArgsNotFoundDevices(self, mock_logging): |
| self.mock_device_info.return_value = ['device2'] |
| self.test_args.append('-id=device1') |
| with mock.patch.object(sys, 'argv', self.test_args): |
| runner._ParseArgs() |
| self.assertEqual(1, len(mock_logging.mock_calls)) |
| self.assertEqual(''.join(['Device with ID device1 not found in ' |
| 'connected devices [\'device2\']']), |
| mock_logging.mock_calls[0][1][0]) |
| |
| def testParseArgsAppiumCommandNONE(self): |
| self.test_args.append('-appium-command=NONE') |
| self.mock_choose_appium_client.return_value = 'NONE' |
| with mock.patch.object(sys, 'argv', self.test_args): |
| self.assertEqual(None, runner._ParseArgs().appium_command) |
| |
| def testParseArgsAppiumCommands(self): |
| self.test_args.append('-appium-command="appium1 appium2 appium3"') |
| self.mock_choose_appium_client.return_value = 'appium1 appium2 appium3' |
| with mock.patch.object(sys, 'argv', self.test_args): |
| self.assertEqual(['appium1', 'appium2', 'appium3'], |
| runner._ParseArgs().appium_command) |
| |
| def testParseArgsAppiumDirNONE(self): |
| self.test_args.append('-s=NONE') |
| self.mock_choose_appium_dir.return_value = 'NONE' |
| with mock.patch.object(sys, 'argv', self.test_args): |
| self.assertEqual(None, runner._ParseArgs().appium_dir_path) |
| |
| @mock.patch('utilities.gsutil.PullApp', autospec=True) |
| def testParseArgsPackagePull(self, mock_gsutil): |
| mock_gsutil.return_value = '/path/to/apk' |
| self.test_args.append('-p=com.package') |
| with mock.patch.object(sys, 'argv', self.test_args): |
| args = runner._ParseArgs() |
| self.assertEqual(1, len(mock_gsutil.mock_calls)) |
| self.assertEqual('/path/to/apk', args.app_path) |
| self.assertEqual(['/path/to/apk'], runner._TEMPFILES._paths) |
| |
| @mock.patch('device_info.GetAndroidAPILevel', autospec=True) |
| @mock.patch('utilities.util.CheckPackage', autospec=True) |
| @mock.patch('utilities.util.RunADBProcess', autospec=True) |
| def testParseArgsWebViewLessN(self, mock_adb_run, mock_check_package, |
| mock_api_level): |
| mock_check_package.return_value = True |
| mock_api_level.return_value = 22 |
| self.test_args.append('--webview') |
| with mock.patch.object(sys, 'argv', self.test_args): |
| runner._ParseArgs() |
| self.assertEqual(1, len(mock_check_package.mock_calls)) |
| self.assertEqual(1, len(mock_api_level.mock_calls)) |
| self.assertEqual(0, len(mock_adb_run.mock_calls)) |
| |
| @mock.patch('device_info.GetAndroidAPILevel', autospec=True) |
| @mock.patch('utilities.util.CheckPackage', autospec=True) |
| @mock.patch('utilities.util.RunADBProcess', autospec=True) |
| def testParseArgsWebViewN(self, mock_adb_run, mock_check_package, |
| mock_api_level): |
| mock_check_package.return_value = True |
| mock_api_level.return_value = 24 |
| self.test_args.append('--webview') |
| with mock.patch.object(sys, 'argv', self.test_args): |
| runner._ParseArgs() |
| self.assertEqual(1, len(mock_check_package.mock_calls)) |
| self.assertEqual(1, len(mock_api_level.mock_calls)) |
| self.assertEqual(1, len(mock_adb_run.mock_calls)) |
| |
| @mock.patch('device_info.GetAndroidAPILevel', autospec=True) |
| @mock.patch('utilities.util.CheckPackage', autospec=True) |
| @mock.patch('utilities.util.RunADBProcess', autospec=True) |
| def testParseArgsWebViewNWithoutView(self, mock_adb_run, mock_check_package, |
| mock_api_level): |
| mock_check_package.return_value = False |
| mock_api_level.return_value = 24 |
| self.test_args.append('--webview') |
| with mock.patch.object(sys, 'argv', self.test_args): |
| runner._ParseArgs() |
| self.assertEqual(1, len(mock_check_package.mock_calls)) |
| self.assertEqual(1, len(mock_api_level.mock_calls)) |
| self.assertEqual(0, len(mock_adb_run.mock_calls)) |
| |
| @mock.patch.object(runner, '_ParseArgs') |
| @mock.patch('test_util.franky_testsuite.ExecutTests', autospec=True) |
| def testParsseArgs_NumberOfCalls(self, _, mock_parse_args): |
| runner.main() |
| mock_parse_args.assert_called_once_with(None) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |