1#!/usr/bin/env python3 2# 3# Copyright 2018, The Android Open Source Project 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16 17"""Unittests for tf_integration_finder.""" 18 19# pylint: disable=line-too-long 20 21import os 22import unittest 23 24from unittest import mock 25 26import constants 27import unittest_constants as uc 28import unittest_utils 29 30from test_finders import test_finder_utils 31from test_finders import test_info 32from test_finders import tf_integration_finder 33from test_runners import atest_tf_test_runner as atf_tr 34 35 36INT_NAME_CLASS = uc.INT_NAME + ':' + uc.FULL_CLASS_NAME 37INT_NAME_METHOD = INT_NAME_CLASS + '#' + uc.METHOD_NAME 38GTF_INT_CONFIG = os.path.join(uc.GTF_INT_DIR, uc.GTF_INT_NAME + '.xml') 39INT_CLASS_INFO = test_info.TestInfo( 40 uc.INT_NAME, 41 atf_tr.AtestTradefedTestRunner.NAME, 42 set(), 43 data={constants.TI_FILTER: frozenset([uc.CLASS_FILTER]), 44 constants.TI_REL_CONFIG: uc.INT_CONFIG}) 45INT_METHOD_INFO = test_info.TestInfo( 46 uc.INT_NAME, 47 atf_tr.AtestTradefedTestRunner.NAME, 48 set(), 49 data={constants.TI_FILTER: frozenset([uc.METHOD_FILTER]), 50 constants.TI_REL_CONFIG: uc.INT_CONFIG}) 51 52 53class TFIntegrationFinderUnittests(unittest.TestCase): 54 """Unit tests for tf_integration_finder.py""" 55 56 def setUp(self): 57 """Set up for testing.""" 58 self.tf_finder = tf_integration_finder.TFIntegrationFinder() 59 self.tf_finder.integration_dirs = [os.path.join(uc.ROOT, uc.INT_DIR), 60 os.path.join(uc.ROOT, uc.GTF_INT_DIR)] 61 self.tf_finder.root_dir = uc.ROOT 62 63 @mock.patch.object(tf_integration_finder.TFIntegrationFinder, 64 '_get_build_targets', return_value=set()) 65 @mock.patch.object(test_finder_utils, 'get_fully_qualified_class_name', 66 return_value=uc.FULL_CLASS_NAME) 67 @mock.patch('subprocess.check_output') 68 @mock.patch('os.path.exists', return_value=True) 69 @mock.patch('os.path.isfile', return_value=False) 70 @mock.patch('os.path.isdir', return_value=False) 71 #pylint: disable=unused-argument 72 def test_find_test_by_integration_name(self, _isdir, _isfile, _path, mock_find, 73 _fcqn, _build): 74 """Test find_test_by_integration_name. 75 76 Note that _isfile is always False since we don't index integration tests. 77 """ 78 mock_find.return_value = os.path.join(uc.ROOT, uc.INT_DIR, uc.INT_NAME + '.xml') 79 t_infos = self.tf_finder.find_test_by_integration_name(uc.INT_NAME) 80 self.assertEqual(len(t_infos), 0) 81 _isdir.return_value = True 82 t_infos = self.tf_finder.find_test_by_integration_name(uc.INT_NAME) 83 unittest_utils.assert_equal_testinfos(self, t_infos[0], uc.INT_INFO) 84 t_infos = self.tf_finder.find_test_by_integration_name(INT_NAME_CLASS) 85 unittest_utils.assert_equal_testinfos(self, t_infos[0], INT_CLASS_INFO) 86 t_infos = self.tf_finder.find_test_by_integration_name(INT_NAME_METHOD) 87 unittest_utils.assert_equal_testinfos(self, t_infos[0], INT_METHOD_INFO) 88 not_fully_qual = uc.INT_NAME + ':' + 'someClass' 89 t_infos = self.tf_finder.find_test_by_integration_name(not_fully_qual) 90 unittest_utils.assert_equal_testinfos(self, t_infos[0], INT_CLASS_INFO) 91 mock_find.return_value = os.path.join(uc.ROOT, uc.GTF_INT_DIR, 92 uc.GTF_INT_NAME + '.xml') 93 t_infos = self.tf_finder.find_test_by_integration_name(uc.GTF_INT_NAME) 94 unittest_utils.assert_equal_testinfos( 95 self, 96 t_infos[0], 97 uc.GTF_INT_INFO) 98 mock_find.return_value = '' 99 self.assertEqual( 100 self.tf_finder.find_test_by_integration_name('NotIntName'), []) 101 102 @mock.patch.dict('os.environ', {constants.ANDROID_BUILD_TOP:'/'}) 103 @mock.patch.object(tf_integration_finder.TFIntegrationFinder, 104 '_get_build_targets', return_value=set()) 105 @mock.patch('os.path.realpath', 106 side_effect=unittest_utils.realpath_side_effect) 107 @mock.patch('os.path.isdir', return_value=True) 108 @mock.patch('os.path.isfile', return_value=True) 109 @mock.patch.object(test_finder_utils, 'find_parent_module_dir') 110 @mock.patch('os.path.exists', return_value=True) 111 def test_find_int_test_by_path(self, _exists, _find, _isfile, _isdir, _real, 112 _build): 113 """Test find_int_test_by_path.""" 114 path = os.path.join(uc.INT_DIR, uc.INT_NAME + '.xml') 115 t_infos = self.tf_finder.find_int_test_by_path(path) 116 unittest_utils.assert_equal_testinfos( 117 self, uc.INT_INFO, t_infos[0]) 118 path = os.path.join(uc.GTF_INT_DIR, uc.GTF_INT_NAME + '.xml') 119 t_infos = self.tf_finder.find_int_test_by_path(path) 120 unittest_utils.assert_equal_testinfos( 121 self, uc.GTF_INT_INFO, t_infos[0]) 122 123 #pylint: disable=protected-access 124 @mock.patch.object(tf_integration_finder.TFIntegrationFinder, 125 '_search_integration_dirs') 126 def test_load_xml_file(self, search): 127 """Test _load_xml_file and _load_include_tags methods.""" 128 search.return_value = [os.path.join(uc.TEST_DATA_DIR, 129 'CtsUiDeviceTestCases.xml')] 130 xml_file = os.path.join(uc.TEST_DATA_DIR, constants.MODULE_CONFIG) 131 xml_root = self.tf_finder._load_xml_file(xml_file) 132 include_tags = xml_root.findall('.//include') 133 self.assertEqual(0, len(include_tags)) 134 option_tags = xml_root.findall('.//option') 135 included = False 136 for tag in option_tags: 137 if tag.attrib['value'].strip() == 'CtsUiDeviceTestCases.apk': 138 included = True 139 self.assertTrue(included) 140 141 142if __name__ == '__main__': 143 unittest.main() 144