1*c2e18aaaSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*c2e18aaaSAndroid Build Coastguard Worker# 3*c2e18aaaSAndroid Build Coastguard Worker# Copyright 2018, The Android Open Source Project 4*c2e18aaaSAndroid Build Coastguard Worker# 5*c2e18aaaSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 6*c2e18aaaSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 7*c2e18aaaSAndroid Build Coastguard Worker# You may obtain a copy of the License at 8*c2e18aaaSAndroid Build Coastguard Worker# 9*c2e18aaaSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 10*c2e18aaaSAndroid Build Coastguard Worker# 11*c2e18aaaSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 12*c2e18aaaSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 13*c2e18aaaSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*c2e18aaaSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 15*c2e18aaaSAndroid Build Coastguard Worker# limitations under the License. 16*c2e18aaaSAndroid Build Coastguard Worker 17*c2e18aaaSAndroid Build Coastguard Worker"""Unittests for project_info.""" 18*c2e18aaaSAndroid Build Coastguard Worker 19*c2e18aaaSAndroid Build Coastguard Workerimport logging 20*c2e18aaaSAndroid Build Coastguard Workerimport os 21*c2e18aaaSAndroid Build Coastguard Workerimport shutil 22*c2e18aaaSAndroid Build Coastguard Workerimport tempfile 23*c2e18aaaSAndroid Build Coastguard Workerimport unittest 24*c2e18aaaSAndroid Build Coastguard Workerfrom unittest import mock 25*c2e18aaaSAndroid Build Coastguard Worker 26*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen import constant 27*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen import unittest_constants 28*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import common_util 29*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import project_info 30*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import project_config 31*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import source_locator 32*c2e18aaaSAndroid Build Coastguard Worker 33*c2e18aaaSAndroid Build Coastguard Worker_MODULE_INFO = { 34*c2e18aaaSAndroid Build Coastguard Worker 'm1': { 35*c2e18aaaSAndroid Build Coastguard Worker 'class': ['JAVA_LIBRARIES'], 36*c2e18aaaSAndroid Build Coastguard Worker 'dependencies': ['m2', 'm6'], 37*c2e18aaaSAndroid Build Coastguard Worker 'path': ['m1'] 38*c2e18aaaSAndroid Build Coastguard Worker }, 39*c2e18aaaSAndroid Build Coastguard Worker 'm2': { 40*c2e18aaaSAndroid Build Coastguard Worker 'class': ['JAVA_LIBRARIES'], 41*c2e18aaaSAndroid Build Coastguard Worker 'dependencies': ['m3', 'm4'] 42*c2e18aaaSAndroid Build Coastguard Worker }, 43*c2e18aaaSAndroid Build Coastguard Worker 'm3': { 44*c2e18aaaSAndroid Build Coastguard Worker 'class': ['JAVA_LIBRARIES'], 45*c2e18aaaSAndroid Build Coastguard Worker 'dependencies': [] 46*c2e18aaaSAndroid Build Coastguard Worker }, 47*c2e18aaaSAndroid Build Coastguard Worker 'm4': { 48*c2e18aaaSAndroid Build Coastguard Worker 'class': ['JAVA_LIBRARIES'], 49*c2e18aaaSAndroid Build Coastguard Worker 'dependencies': ['m6'] 50*c2e18aaaSAndroid Build Coastguard Worker }, 51*c2e18aaaSAndroid Build Coastguard Worker 'm5': { 52*c2e18aaaSAndroid Build Coastguard Worker 'class': ['JAVA_LIBRARIES'], 53*c2e18aaaSAndroid Build Coastguard Worker 'dependencies': [] 54*c2e18aaaSAndroid Build Coastguard Worker }, 55*c2e18aaaSAndroid Build Coastguard Worker 'm6': { 56*c2e18aaaSAndroid Build Coastguard Worker 'class': ['JAVA_LIBRARIES'], 57*c2e18aaaSAndroid Build Coastguard Worker 'dependencies': ['m2'] 58*c2e18aaaSAndroid Build Coastguard Worker }, 59*c2e18aaaSAndroid Build Coastguard Worker} 60*c2e18aaaSAndroid Build Coastguard Worker_EXPECT_DEPENDENT_MODULES = { 61*c2e18aaaSAndroid Build Coastguard Worker 'm1': { 62*c2e18aaaSAndroid Build Coastguard Worker 'class': ['JAVA_LIBRARIES'], 63*c2e18aaaSAndroid Build Coastguard Worker 'dependencies': ['m2', 'm6'], 64*c2e18aaaSAndroid Build Coastguard Worker 'path': ['m1'], 65*c2e18aaaSAndroid Build Coastguard Worker 'depth': 0 66*c2e18aaaSAndroid Build Coastguard Worker }, 67*c2e18aaaSAndroid Build Coastguard Worker 'm2': { 68*c2e18aaaSAndroid Build Coastguard Worker 'class': ['JAVA_LIBRARIES'], 69*c2e18aaaSAndroid Build Coastguard Worker 'dependencies': ['m3', 'm4'], 70*c2e18aaaSAndroid Build Coastguard Worker 'depth': 1 71*c2e18aaaSAndroid Build Coastguard Worker }, 72*c2e18aaaSAndroid Build Coastguard Worker 'm3': { 73*c2e18aaaSAndroid Build Coastguard Worker 'class': ['JAVA_LIBRARIES'], 74*c2e18aaaSAndroid Build Coastguard Worker 'dependencies': [], 75*c2e18aaaSAndroid Build Coastguard Worker 'depth': 2 76*c2e18aaaSAndroid Build Coastguard Worker }, 77*c2e18aaaSAndroid Build Coastguard Worker 'm4': { 78*c2e18aaaSAndroid Build Coastguard Worker 'class': ['JAVA_LIBRARIES'], 79*c2e18aaaSAndroid Build Coastguard Worker 'dependencies': ['m6'], 80*c2e18aaaSAndroid Build Coastguard Worker 'depth': 2 81*c2e18aaaSAndroid Build Coastguard Worker }, 82*c2e18aaaSAndroid Build Coastguard Worker 'm6': { 83*c2e18aaaSAndroid Build Coastguard Worker 'class': ['JAVA_LIBRARIES'], 84*c2e18aaaSAndroid Build Coastguard Worker 'dependencies': ['m2'], 85*c2e18aaaSAndroid Build Coastguard Worker 'depth': 1 86*c2e18aaaSAndroid Build Coastguard Worker }, 87*c2e18aaaSAndroid Build Coastguard Worker} 88*c2e18aaaSAndroid Build Coastguard Worker 89*c2e18aaaSAndroid Build Coastguard Worker 90*c2e18aaaSAndroid Build Coastguard Worker# pylint: disable=protected-access 91*c2e18aaaSAndroid Build Coastguard Workerclass ProjectInfoUnittests(unittest.TestCase): 92*c2e18aaaSAndroid Build Coastguard Worker """Unit tests for project_info.py""" 93*c2e18aaaSAndroid Build Coastguard Worker 94*c2e18aaaSAndroid Build Coastguard Worker def setUp(self): 95*c2e18aaaSAndroid Build Coastguard Worker """Initialize arguments for ProjectInfo.""" 96*c2e18aaaSAndroid Build Coastguard Worker self.args = mock.MagicMock() 97*c2e18aaaSAndroid Build Coastguard Worker self.args.module_name = 'm1' 98*c2e18aaaSAndroid Build Coastguard Worker self.args.project_path = '' 99*c2e18aaaSAndroid Build Coastguard Worker self.args.ide = ['j'] 100*c2e18aaaSAndroid Build Coastguard Worker self.args.no_launch = True 101*c2e18aaaSAndroid Build Coastguard Worker self.args.depth = 0 102*c2e18aaaSAndroid Build Coastguard Worker self.args.android_tree = False 103*c2e18aaaSAndroid Build Coastguard Worker self.args.skip_build = True 104*c2e18aaaSAndroid Build Coastguard Worker self.args.targets = ['m1'] 105*c2e18aaaSAndroid Build Coastguard Worker self.args.verbose = False 106*c2e18aaaSAndroid Build Coastguard Worker self.args.ide_installed_path = None 107*c2e18aaaSAndroid Build Coastguard Worker self.args.config_reset = False 108*c2e18aaaSAndroid Build Coastguard Worker self.args.language = ['j'] 109*c2e18aaaSAndroid Build Coastguard Worker 110*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('atest.module_info.ModuleInfo') 111*c2e18aaaSAndroid Build Coastguard Worker def test_get_dep_modules(self, mock_module_info): 112*c2e18aaaSAndroid Build Coastguard Worker """Test get_dep_modules recursively find dependent modules.""" 113*c2e18aaaSAndroid Build Coastguard Worker mock_module_info.name_to_module_info = _MODULE_INFO 114*c2e18aaaSAndroid Build Coastguard Worker mock_module_info.is_module.return_value = True 115*c2e18aaaSAndroid Build Coastguard Worker mock_module_info.get_paths.return_value = ['m1'] 116*c2e18aaaSAndroid Build Coastguard Worker mock_module_info.get_module_names.return_value = ['m1'] 117*c2e18aaaSAndroid Build Coastguard Worker project_info.ProjectInfo.modules_info = mock_module_info 118*c2e18aaaSAndroid Build Coastguard Worker proj_info = project_info.ProjectInfo(self.args.module_name, False) 119*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(proj_info.dep_modules, _EXPECT_DEPENDENT_MODULES) 120*c2e18aaaSAndroid Build Coastguard Worker 121*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_info.ProjectInfo, 122*c2e18aaaSAndroid Build Coastguard Worker '_get_modules_under_project_path') 123*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_info.ProjectInfo, 'get_dep_modules') 124*c2e18aaaSAndroid Build Coastguard Worker def test_init(self, mock_get_deps, mock_get_sub_modules): 125*c2e18aaaSAndroid Build Coastguard Worker """Test init.""" 126*c2e18aaaSAndroid Build Coastguard Worker project_info.ProjectInfo(constant.FRAMEWORK_ALL, False) 127*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_get_deps.called) 128*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_get_sub_modules.called) 129*c2e18aaaSAndroid Build Coastguard Worker 130*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'get_android_root_dir') 131*c2e18aaaSAndroid Build Coastguard Worker def test_get_target_name(self, mock_get_root): 132*c2e18aaaSAndroid Build Coastguard Worker """Test get_target_name with different conditions.""" 133*c2e18aaaSAndroid Build Coastguard Worker mock_get_root.return_value = unittest_constants.TEST_DATA_PATH 134*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual( 135*c2e18aaaSAndroid Build Coastguard Worker project_info.ProjectInfo.get_target_name( 136*c2e18aaaSAndroid Build Coastguard Worker unittest_constants.TEST_MODULE, 137*c2e18aaaSAndroid Build Coastguard Worker unittest_constants.TEST_DATA_PATH), 138*c2e18aaaSAndroid Build Coastguard Worker os.path.basename(unittest_constants.TEST_DATA_PATH)) 139*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual( 140*c2e18aaaSAndroid Build Coastguard Worker project_info.ProjectInfo.get_target_name( 141*c2e18aaaSAndroid Build Coastguard Worker unittest_constants.TEST_MODULE, unittest_constants.TEST_PATH), 142*c2e18aaaSAndroid Build Coastguard Worker unittest_constants.TEST_MODULE) 143*c2e18aaaSAndroid Build Coastguard Worker 144*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('logging.info') 145*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'get_android_root_dir') 146*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('atest.module_info.ModuleInfo') 147*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('atest.atest_utils.build') 148*c2e18aaaSAndroid Build Coastguard Worker def test_locate_source(self, mock_atest_utils_build, mock_module_info, 149*c2e18aaaSAndroid Build Coastguard Worker mock_get_root, mock_info): 150*c2e18aaaSAndroid Build Coastguard Worker """Test locate_source handling.""" 151*c2e18aaaSAndroid Build Coastguard Worker mock_atest_utils_build.build.return_value = True 152*c2e18aaaSAndroid Build Coastguard Worker test_root_path = os.path.join(tempfile.mkdtemp(), 'test') 153*c2e18aaaSAndroid Build Coastguard Worker shutil.copytree(unittest_constants.TEST_DATA_PATH, test_root_path) 154*c2e18aaaSAndroid Build Coastguard Worker mock_get_root.return_value = test_root_path 155*c2e18aaaSAndroid Build Coastguard Worker generated_jar = ('out/soong/.intermediates/packages/apps/test/test/' 156*c2e18aaaSAndroid Build Coastguard Worker 'android_common/generated.jar') 157*c2e18aaaSAndroid Build Coastguard Worker locate_module_info = dict(unittest_constants.MODULE_INFO) 158*c2e18aaaSAndroid Build Coastguard Worker locate_module_info['installed'] = [generated_jar] 159*c2e18aaaSAndroid Build Coastguard Worker mock_module_info.is_module.return_value = True 160*c2e18aaaSAndroid Build Coastguard Worker mock_module_info.get_paths.return_value = [ 161*c2e18aaaSAndroid Build Coastguard Worker unittest_constants.MODULE_PATH 162*c2e18aaaSAndroid Build Coastguard Worker ] 163*c2e18aaaSAndroid Build Coastguard Worker mock_module_info.get_module_names.return_value = [ 164*c2e18aaaSAndroid Build Coastguard Worker unittest_constants.TEST_MODULE 165*c2e18aaaSAndroid Build Coastguard Worker ] 166*c2e18aaaSAndroid Build Coastguard Worker project_config.ProjectConfig(self.args) 167*c2e18aaaSAndroid Build Coastguard Worker project_info_obj = project_info.ProjectInfo( 168*c2e18aaaSAndroid Build Coastguard Worker mock_module_info.get_paths()[0]) 169*c2e18aaaSAndroid Build Coastguard Worker project_info_obj.dep_modules = { 170*c2e18aaaSAndroid Build Coastguard Worker unittest_constants.TEST_MODULE: locate_module_info 171*c2e18aaaSAndroid Build Coastguard Worker } 172*c2e18aaaSAndroid Build Coastguard Worker project_info_obj._init_source_path() 173*c2e18aaaSAndroid Build Coastguard Worker # Show warning when the jar not exists after build the module. 174*c2e18aaaSAndroid Build Coastguard Worker result_jar = set() 175*c2e18aaaSAndroid Build Coastguard Worker project_info_obj.locate_source() 176*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(project_info_obj.source_path['jar_path'], result_jar) 177*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_info.called) 178*c2e18aaaSAndroid Build Coastguard Worker 179*c2e18aaaSAndroid Build Coastguard Worker # Test collects source and test folders. 180*c2e18aaaSAndroid Build Coastguard Worker result_source = {'packages/apps/test/src/main/java'} 181*c2e18aaaSAndroid Build Coastguard Worker result_test = {'packages/apps/test/tests'} 182*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(project_info_obj.source_path['source_folder_path'], 183*c2e18aaaSAndroid Build Coastguard Worker result_source) 184*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(project_info_obj.source_path['test_folder_path'], 185*c2e18aaaSAndroid Build Coastguard Worker result_test) 186*c2e18aaaSAndroid Build Coastguard Worker 187*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_info, 'batch_build_dependencies') 188*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'get_android_root_dir') 189*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('atest.module_info.ModuleInfo') 190*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('atest.atest_utils.build') 191*c2e18aaaSAndroid Build Coastguard Worker def test_locate_source_with_skip_build(self, mock_atest_utils_build, 192*c2e18aaaSAndroid Build Coastguard Worker mock_module_info, mock_get_root, 193*c2e18aaaSAndroid Build Coastguard Worker mock_batch): 194*c2e18aaaSAndroid Build Coastguard Worker """Test locate_source handling.""" 195*c2e18aaaSAndroid Build Coastguard Worker mock_atest_utils_build.build.return_value = True 196*c2e18aaaSAndroid Build Coastguard Worker test_root_path = os.path.join(tempfile.mkdtemp(), 'test') 197*c2e18aaaSAndroid Build Coastguard Worker shutil.copytree(unittest_constants.TEST_DATA_PATH, test_root_path) 198*c2e18aaaSAndroid Build Coastguard Worker mock_get_root.return_value = test_root_path 199*c2e18aaaSAndroid Build Coastguard Worker generated_jar = ('out/soong/.intermediates/packages/apps/test/test/' 200*c2e18aaaSAndroid Build Coastguard Worker 'android_common/generated.jar') 201*c2e18aaaSAndroid Build Coastguard Worker locate_module_info = dict(unittest_constants.MODULE_INFO) 202*c2e18aaaSAndroid Build Coastguard Worker locate_module_info['installed'] = [generated_jar] 203*c2e18aaaSAndroid Build Coastguard Worker mock_module_info.is_module.return_value = True 204*c2e18aaaSAndroid Build Coastguard Worker mock_module_info.get_paths.return_value = [ 205*c2e18aaaSAndroid Build Coastguard Worker unittest_constants.MODULE_PATH 206*c2e18aaaSAndroid Build Coastguard Worker ] 207*c2e18aaaSAndroid Build Coastguard Worker mock_module_info.get_module_names.return_value = [ 208*c2e18aaaSAndroid Build Coastguard Worker unittest_constants.TEST_MODULE 209*c2e18aaaSAndroid Build Coastguard Worker ] 210*c2e18aaaSAndroid Build Coastguard Worker args = mock.MagicMock() 211*c2e18aaaSAndroid Build Coastguard Worker args.module_name = 'm1' 212*c2e18aaaSAndroid Build Coastguard Worker args.project_path = '' 213*c2e18aaaSAndroid Build Coastguard Worker args.ide = ['j'] 214*c2e18aaaSAndroid Build Coastguard Worker args.no_launch = True 215*c2e18aaaSAndroid Build Coastguard Worker args.depth = 0 216*c2e18aaaSAndroid Build Coastguard Worker args.android_tree = False 217*c2e18aaaSAndroid Build Coastguard Worker args.skip_build = True 218*c2e18aaaSAndroid Build Coastguard Worker args.targets = ['m1'] 219*c2e18aaaSAndroid Build Coastguard Worker args.verbose = False 220*c2e18aaaSAndroid Build Coastguard Worker args.ide_installed_path = None 221*c2e18aaaSAndroid Build Coastguard Worker args.config_reset = False 222*c2e18aaaSAndroid Build Coastguard Worker args.language = ['j'] 223*c2e18aaaSAndroid Build Coastguard Worker project_config.ProjectConfig(args) 224*c2e18aaaSAndroid Build Coastguard Worker project_info_obj = project_info.ProjectInfo( 225*c2e18aaaSAndroid Build Coastguard Worker mock_module_info.get_paths()[0]) 226*c2e18aaaSAndroid Build Coastguard Worker project_info_obj.dep_modules = { 227*c2e18aaaSAndroid Build Coastguard Worker unittest_constants.TEST_MODULE: locate_module_info 228*c2e18aaaSAndroid Build Coastguard Worker } 229*c2e18aaaSAndroid Build Coastguard Worker project_info_obj._init_source_path() 230*c2e18aaaSAndroid Build Coastguard Worker project_info_obj.locate_source() 231*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_batch.called) 232*c2e18aaaSAndroid Build Coastguard Worker 233*c2e18aaaSAndroid Build Coastguard Worker args.ide = ['v'] 234*c2e18aaaSAndroid Build Coastguard Worker args.skip_build = False 235*c2e18aaaSAndroid Build Coastguard Worker project_config.ProjectConfig(args) 236*c2e18aaaSAndroid Build Coastguard Worker project_info_obj = project_info.ProjectInfo( 237*c2e18aaaSAndroid Build Coastguard Worker mock_module_info.get_paths()[0]) 238*c2e18aaaSAndroid Build Coastguard Worker project_info_obj.dep_modules = { 239*c2e18aaaSAndroid Build Coastguard Worker unittest_constants.TEST_MODULE: locate_module_info 240*c2e18aaaSAndroid Build Coastguard Worker } 241*c2e18aaaSAndroid Build Coastguard Worker project_info_obj._init_source_path() 242*c2e18aaaSAndroid Build Coastguard Worker project_info_obj.locate_source() 243*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_batch.called) 244*c2e18aaaSAndroid Build Coastguard Worker 245*c2e18aaaSAndroid Build Coastguard Worker def test_separate_build_target(self): 246*c2e18aaaSAndroid Build Coastguard Worker """Test separate_build_target.""" 247*c2e18aaaSAndroid Build Coastguard Worker test_list = ['1', '22', '333', '4444', '55555', '1', '7777777'] 248*c2e18aaaSAndroid Build Coastguard Worker targets = [] 249*c2e18aaaSAndroid Build Coastguard Worker sample = [['1', '22', '333'], ['4444'], ['55555', '1'], ['7777777']] 250*c2e18aaaSAndroid Build Coastguard Worker for start, end in iter( 251*c2e18aaaSAndroid Build Coastguard Worker project_info._separate_build_targets(test_list, 9)): 252*c2e18aaaSAndroid Build Coastguard Worker targets.append(test_list[start:end]) 253*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(targets, sample) 254*c2e18aaaSAndroid Build Coastguard Worker 255*c2e18aaaSAndroid Build Coastguard Worker def test_separate_build_target_with_length_short(self): 256*c2e18aaaSAndroid Build Coastguard Worker """Test separate_build_target with length short.""" 257*c2e18aaaSAndroid Build Coastguard Worker test_list = ['1'] 258*c2e18aaaSAndroid Build Coastguard Worker sample = [['1']] 259*c2e18aaaSAndroid Build Coastguard Worker targets = [] 260*c2e18aaaSAndroid Build Coastguard Worker for start, end in iter( 261*c2e18aaaSAndroid Build Coastguard Worker project_info._separate_build_targets(test_list, 9)): 262*c2e18aaaSAndroid Build Coastguard Worker targets.append(test_list[start:end]) 263*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(targets, sample) 264*c2e18aaaSAndroid Build Coastguard Worker 265*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_info.ProjectInfo, 'locate_source') 266*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('atest.module_info.ModuleInfo') 267*c2e18aaaSAndroid Build Coastguard Worker def test_rebuild_jar_once(self, mock_module_info, mock_locate_source): 268*c2e18aaaSAndroid Build Coastguard Worker """Test rebuild the jar/srcjar only one time.""" 269*c2e18aaaSAndroid Build Coastguard Worker mock_module_info.get_paths.return_value = ['m1'] 270*c2e18aaaSAndroid Build Coastguard Worker project_info.ProjectInfo.modules_info = mock_module_info 271*c2e18aaaSAndroid Build Coastguard Worker proj_info = project_info.ProjectInfo(self.args.module_name, False) 272*c2e18aaaSAndroid Build Coastguard Worker proj_info.locate_source(build=False) 273*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(mock_locate_source.call_count, 1) 274*c2e18aaaSAndroid Build Coastguard Worker proj_info.locate_source(build=True) 275*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(mock_locate_source.call_count, 2) 276*c2e18aaaSAndroid Build Coastguard Worker 277*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('builtins.print') 278*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('builtins.format') 279*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('atest.atest_utils.build') 280*c2e18aaaSAndroid Build Coastguard Worker def test_build_target(self, mock_build, mock_format, mock_print): 281*c2e18aaaSAndroid Build Coastguard Worker """Test _build_target.""" 282*c2e18aaaSAndroid Build Coastguard Worker build_argument = ['-k', 'j'] 283*c2e18aaaSAndroid Build Coastguard Worker test_targets = ['mod_1', 'mod_2'] 284*c2e18aaaSAndroid Build Coastguard Worker build_argument.extend(test_targets) 285*c2e18aaaSAndroid Build Coastguard Worker mock_build.return_value = False 286*c2e18aaaSAndroid Build Coastguard Worker project_info._build_target(test_targets) 287*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_build.called_with((build_argument, True))) 288*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_format.called_with('\n'.join(test_targets))) 289*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_print.called) 290*c2e18aaaSAndroid Build Coastguard Worker mock_print.reset_mock() 291*c2e18aaaSAndroid Build Coastguard Worker mock_format.reset_mock() 292*c2e18aaaSAndroid Build Coastguard Worker mock_build.reset_mock() 293*c2e18aaaSAndroid Build Coastguard Worker 294*c2e18aaaSAndroid Build Coastguard Worker mock_build.return_value = True 295*c2e18aaaSAndroid Build Coastguard Worker project_info._build_target(test_targets) 296*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_build.called_with((build_argument, True))) 297*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_format.called) 298*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_print.called) 299*c2e18aaaSAndroid Build Coastguard Worker mock_print.reset_mock() 300*c2e18aaaSAndroid Build Coastguard Worker mock_format.reset_mock() 301*c2e18aaaSAndroid Build Coastguard Worker mock_build.reset_mock() 302*c2e18aaaSAndroid Build Coastguard Worker 303*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_info, '_build_target') 304*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_info, '_separate_build_targets') 305*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(logging, 'info') 306*c2e18aaaSAndroid Build Coastguard Worker def test_batch_build_dependencies(self, mock_log, mock_sep, mock_build): 307*c2e18aaaSAndroid Build Coastguard Worker """Test batch_build_dependencies.""" 308*c2e18aaaSAndroid Build Coastguard Worker mock_sep.return_value = [(0, 1)] 309*c2e18aaaSAndroid Build Coastguard Worker project_info.batch_build_dependencies({'m1', 'm2'}) 310*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_log.called) 311*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_sep.called) 312*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(mock_build.call_count, 1) 313*c2e18aaaSAndroid Build Coastguard Worker 314*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('os.path.relpath') 315*c2e18aaaSAndroid Build Coastguard Worker def test_get_rel_project_out_soong_jar_path(self, mock_rel): 316*c2e18aaaSAndroid Build Coastguard Worker """Test _get_rel_project_out_soong_jar_path.""" 317*c2e18aaaSAndroid Build Coastguard Worker out_dir = 'a/b/out/soong' 318*c2e18aaaSAndroid Build Coastguard Worker mock_rel.return_value = out_dir 319*c2e18aaaSAndroid Build Coastguard Worker proj_info = project_info.ProjectInfo(self.args.module_name, False) 320*c2e18aaaSAndroid Build Coastguard Worker expected = os.sep.join( 321*c2e18aaaSAndroid Build Coastguard Worker [out_dir, constant.INTERMEDIATES, 'm1']) + os.sep 322*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual( 323*c2e18aaaSAndroid Build Coastguard Worker expected, proj_info._get_rel_project_out_soong_jar_path()) 324*c2e18aaaSAndroid Build Coastguard Worker 325*c2e18aaaSAndroid Build Coastguard Worker def test_update_iml_dep_modules(self): 326*c2e18aaaSAndroid Build Coastguard Worker """Test _update_iml_dep_modules with conditions.""" 327*c2e18aaaSAndroid Build Coastguard Worker project1 = mock.Mock() 328*c2e18aaaSAndroid Build Coastguard Worker project1.source_path = { 329*c2e18aaaSAndroid Build Coastguard Worker 'source_folder_path': [], 'test_folder_path': [], 'r_java_path': [], 330*c2e18aaaSAndroid Build Coastguard Worker 'srcjar_path': [], 'jar_path': [] 331*c2e18aaaSAndroid Build Coastguard Worker } 332*c2e18aaaSAndroid Build Coastguard Worker project1.dependencies = [] 333*c2e18aaaSAndroid Build Coastguard Worker project2 = mock.Mock() 334*c2e18aaaSAndroid Build Coastguard Worker project2.iml_name = 'm2' 335*c2e18aaaSAndroid Build Coastguard Worker project2.rel_out_soong_jar_path = 'out/soong/.intermediates/m2' 336*c2e18aaaSAndroid Build Coastguard Worker project_info.ProjectInfo.projects = [project1, project2] 337*c2e18aaaSAndroid Build Coastguard Worker project_info._update_iml_dep_modules(project1) 338*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual([], project1.dependencies) 339*c2e18aaaSAndroid Build Coastguard Worker project1.source_path = { 340*c2e18aaaSAndroid Build Coastguard Worker 'source_folder_path': [], 'test_folder_path': [], 'r_java_path': [], 341*c2e18aaaSAndroid Build Coastguard Worker 'srcjar_path': [], 342*c2e18aaaSAndroid Build Coastguard Worker 'jar_path': ['out/soong/.intermediates/m2/a/b/any.jar'] 343*c2e18aaaSAndroid Build Coastguard Worker } 344*c2e18aaaSAndroid Build Coastguard Worker project_info._update_iml_dep_modules(project1) 345*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(['m2'], project1.dependencies) 346*c2e18aaaSAndroid Build Coastguard Worker 347*c2e18aaaSAndroid Build Coastguard Worker 348*c2e18aaaSAndroid Build Coastguard Workerclass MultiProjectsInfoUnittests(unittest.TestCase): 349*c2e18aaaSAndroid Build Coastguard Worker """Unit tests for MultiProjectsInfo class.""" 350*c2e18aaaSAndroid Build Coastguard Worker 351*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_info.ProjectInfo, '__init__') 352*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_info.ProjectInfo, 'get_dep_modules') 353*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_info.ProjectInfo, 354*c2e18aaaSAndroid Build Coastguard Worker '_get_robolectric_dep_module') 355*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_info.ProjectInfo, 356*c2e18aaaSAndroid Build Coastguard Worker '_get_modules_under_project_path') 357*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'get_related_paths') 358*c2e18aaaSAndroid Build Coastguard Worker def test_collect_all_dep_modules(self, mock_relpath, mock_sub_modules_path, 359*c2e18aaaSAndroid Build Coastguard Worker mock_robo_module, mock_get_dep_modules, 360*c2e18aaaSAndroid Build Coastguard Worker mock_init): 361*c2e18aaaSAndroid Build Coastguard Worker """Test _collect_all_dep_modules.""" 362*c2e18aaaSAndroid Build Coastguard Worker mock_init.return_value = None 363*c2e18aaaSAndroid Build Coastguard Worker mock_relpath.return_value = ('path/to/sub/module', '') 364*c2e18aaaSAndroid Build Coastguard Worker mock_sub_modules_path.return_value = 'sub_module' 365*c2e18aaaSAndroid Build Coastguard Worker mock_robo_module.return_value = 'robo_module' 366*c2e18aaaSAndroid Build Coastguard Worker expected = set(project_info._CORE_MODULES) 367*c2e18aaaSAndroid Build Coastguard Worker expected.update({'sub_module', 'robo_module'}) 368*c2e18aaaSAndroid Build Coastguard Worker proj = project_info.MultiProjectsInfo(['a']) 369*c2e18aaaSAndroid Build Coastguard Worker proj.project_module_names = set('framework-all') 370*c2e18aaaSAndroid Build Coastguard Worker proj.collect_all_dep_modules() 371*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_get_dep_modules.called_with(expected)) 372*c2e18aaaSAndroid Build Coastguard Worker 373*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(logging, 'debug') 374*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(source_locator, 'ModuleData') 375*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_info.ProjectInfo, '__init__') 376*c2e18aaaSAndroid Build Coastguard Worker def test_gen_folder_base_dependencies(self, mock_init, mock_module_data, 377*c2e18aaaSAndroid Build Coastguard Worker mock_log): 378*c2e18aaaSAndroid Build Coastguard Worker """Test _gen_folder_base_dependencies.""" 379*c2e18aaaSAndroid Build Coastguard Worker mock_init.return_value = None 380*c2e18aaaSAndroid Build Coastguard Worker proj = project_info.MultiProjectsInfo(['a']) 381*c2e18aaaSAndroid Build Coastguard Worker module = mock.Mock() 382*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.return_value = module 383*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.module_path = '' 384*c2e18aaaSAndroid Build Coastguard Worker proj.gen_folder_base_dependencies(mock_module_data) 385*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_log.called) 386*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.module_path = 'a/b' 387*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.src_dirs = ['a/b/c'] 388*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.test_dirs = [] 389*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.r_java_paths = [] 390*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.srcjar_paths = [] 391*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.jar_files = [] 392*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.dep_paths = [] 393*c2e18aaaSAndroid Build Coastguard Worker proj.gen_folder_base_dependencies(mock_module_data) 394*c2e18aaaSAndroid Build Coastguard Worker expected = { 395*c2e18aaaSAndroid Build Coastguard Worker 'a/b': { 396*c2e18aaaSAndroid Build Coastguard Worker 'src_dirs': ['a/b/c'], 397*c2e18aaaSAndroid Build Coastguard Worker 'test_dirs': [], 398*c2e18aaaSAndroid Build Coastguard Worker 'r_java_paths': [], 399*c2e18aaaSAndroid Build Coastguard Worker 'srcjar_paths': [], 400*c2e18aaaSAndroid Build Coastguard Worker 'jar_files': [], 401*c2e18aaaSAndroid Build Coastguard Worker 'dep_paths': [], 402*c2e18aaaSAndroid Build Coastguard Worker } 403*c2e18aaaSAndroid Build Coastguard Worker } 404*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(proj.path_to_sources, expected) 405*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.srcjar_paths = ['x/y.srcjar'] 406*c2e18aaaSAndroid Build Coastguard Worker proj.gen_folder_base_dependencies(mock_module_data) 407*c2e18aaaSAndroid Build Coastguard Worker expected = { 408*c2e18aaaSAndroid Build Coastguard Worker 'a/b': { 409*c2e18aaaSAndroid Build Coastguard Worker 'src_dirs': ['a/b/c'], 410*c2e18aaaSAndroid Build Coastguard Worker 'test_dirs': [], 411*c2e18aaaSAndroid Build Coastguard Worker 'r_java_paths': [], 412*c2e18aaaSAndroid Build Coastguard Worker 'srcjar_paths': ['x/y.srcjar'], 413*c2e18aaaSAndroid Build Coastguard Worker 'jar_files': [], 414*c2e18aaaSAndroid Build Coastguard Worker 'dep_paths': [], 415*c2e18aaaSAndroid Build Coastguard Worker } 416*c2e18aaaSAndroid Build Coastguard Worker } 417*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(proj.path_to_sources, expected) 418*c2e18aaaSAndroid Build Coastguard Worker 419*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(source_locator, 'ModuleData') 420*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_info.ProjectInfo, '__init__') 421*c2e18aaaSAndroid Build Coastguard Worker def test_add_framework_base_path(self, mock_init, mock_module_data): 422*c2e18aaaSAndroid Build Coastguard Worker """Test _gen_folder_base_dependencies.""" 423*c2e18aaaSAndroid Build Coastguard Worker mock_init.return_value = None 424*c2e18aaaSAndroid Build Coastguard Worker proj = project_info.MultiProjectsInfo(['a']) 425*c2e18aaaSAndroid Build Coastguard Worker module = mock.Mock() 426*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.return_value = module 427*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.module_path = 'frameworks/base' 428*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.module_name = 'framework-other' 429*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.src_dirs = ['a/b/c'] 430*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.test_dirs = [] 431*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.r_java_paths = [] 432*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.srcjar_paths = ['x/y.srcjar'] 433*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.jar_files = [] 434*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.dep_paths = [] 435*c2e18aaaSAndroid Build Coastguard Worker proj.gen_folder_base_dependencies(mock_module_data) 436*c2e18aaaSAndroid Build Coastguard Worker expected = { 437*c2e18aaaSAndroid Build Coastguard Worker 'frameworks/base': { 438*c2e18aaaSAndroid Build Coastguard Worker 'dep_paths': [], 439*c2e18aaaSAndroid Build Coastguard Worker 'jar_files': [], 440*c2e18aaaSAndroid Build Coastguard Worker 'r_java_paths': [], 441*c2e18aaaSAndroid Build Coastguard Worker 'src_dirs': ['a/b/c'], 442*c2e18aaaSAndroid Build Coastguard Worker 'srcjar_paths': [], 443*c2e18aaaSAndroid Build Coastguard Worker 'test_dirs': [], 444*c2e18aaaSAndroid Build Coastguard Worker } 445*c2e18aaaSAndroid Build Coastguard Worker } 446*c2e18aaaSAndroid Build Coastguard Worker self.assertDictEqual(proj.path_to_sources, expected) 447*c2e18aaaSAndroid Build Coastguard Worker 448*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(source_locator, 'ModuleData') 449*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_info.ProjectInfo, '__init__') 450*c2e18aaaSAndroid Build Coastguard Worker def test_add_framework_srcjar_path(self, mock_init, mock_module_data): 451*c2e18aaaSAndroid Build Coastguard Worker """Test _gen_folder_base_dependencies.""" 452*c2e18aaaSAndroid Build Coastguard Worker mock_init.return_value = None 453*c2e18aaaSAndroid Build Coastguard Worker proj = project_info.MultiProjectsInfo(['a']) 454*c2e18aaaSAndroid Build Coastguard Worker module = mock.Mock() 455*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.return_value = module 456*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.module_path = 'frameworks/base' 457*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.module_name = 'framework-all' 458*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.src_dirs = ['a/b/c'] 459*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.test_dirs = [] 460*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.r_java_paths = [] 461*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.srcjar_paths = ['x/y.srcjar'] 462*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.jar_files = [] 463*c2e18aaaSAndroid Build Coastguard Worker mock_module_data.dep_paths = [] 464*c2e18aaaSAndroid Build Coastguard Worker proj.gen_folder_base_dependencies(mock_module_data) 465*c2e18aaaSAndroid Build Coastguard Worker expected = { 466*c2e18aaaSAndroid Build Coastguard Worker 'frameworks/base': { 467*c2e18aaaSAndroid Build Coastguard Worker 'dep_paths': [], 468*c2e18aaaSAndroid Build Coastguard Worker 'jar_files': [], 469*c2e18aaaSAndroid Build Coastguard Worker 'r_java_paths': [], 470*c2e18aaaSAndroid Build Coastguard Worker 'src_dirs': ['a/b/c'], 471*c2e18aaaSAndroid Build Coastguard Worker 'srcjar_paths': [], 472*c2e18aaaSAndroid Build Coastguard Worker 'test_dirs': [], 473*c2e18aaaSAndroid Build Coastguard Worker }, 474*c2e18aaaSAndroid Build Coastguard Worker 'frameworks/base/framework_srcjars': { 475*c2e18aaaSAndroid Build Coastguard Worker 'dep_paths': ['frameworks/base'], 476*c2e18aaaSAndroid Build Coastguard Worker 'jar_files': [], 477*c2e18aaaSAndroid Build Coastguard Worker 'r_java_paths': [], 478*c2e18aaaSAndroid Build Coastguard Worker 'src_dirs': [], 479*c2e18aaaSAndroid Build Coastguard Worker 'srcjar_paths': ['x/y.srcjar'], 480*c2e18aaaSAndroid Build Coastguard Worker 'test_dirs': [], 481*c2e18aaaSAndroid Build Coastguard Worker } 482*c2e18aaaSAndroid Build Coastguard Worker } 483*c2e18aaaSAndroid Build Coastguard Worker self.assertDictEqual(proj.path_to_sources, expected) 484*c2e18aaaSAndroid Build Coastguard Worker 485*c2e18aaaSAndroid Build Coastguard Worker 486*c2e18aaaSAndroid Build Coastguard Workerif __name__ == '__main__': 487*c2e18aaaSAndroid Build Coastguard Worker unittest.main() 488