blob: f34256f499296286cff405bfd705cfcea81a91bb [file] [log] [blame]
# 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()