1*c2e18aaaSAndroid Build Coastguard Worker#!/usr/bin/env python3 2*c2e18aaaSAndroid Build Coastguard Worker# 3*c2e18aaaSAndroid Build Coastguard Worker# Copyright 2020 - 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_splitter.""" 18*c2e18aaaSAndroid Build Coastguard Worker 19*c2e18aaaSAndroid Build Coastguard Workerimport os 20*c2e18aaaSAndroid Build Coastguard Workerimport shutil 21*c2e18aaaSAndroid Build Coastguard Workerimport tempfile 22*c2e18aaaSAndroid Build Coastguard Workerimport unittest 23*c2e18aaaSAndroid Build Coastguard Workerfrom unittest import mock 24*c2e18aaaSAndroid Build Coastguard Worker 25*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen import constant 26*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen import unittest_constants 27*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.idea import iml 28*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import common_util 29*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import project_config 30*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.lib import project_info 31*c2e18aaaSAndroid Build Coastguard Workerfrom aidegen.project import project_splitter 32*c2e18aaaSAndroid Build Coastguard Worker 33*c2e18aaaSAndroid Build Coastguard Worker 34*c2e18aaaSAndroid Build Coastguard Worker# pylint: disable=protected-access 35*c2e18aaaSAndroid Build Coastguard Workerclass ProjectSplitterUnittest(unittest.TestCase): 36*c2e18aaaSAndroid Build Coastguard Worker """Unit tests for ProjectSplitter class.""" 37*c2e18aaaSAndroid Build Coastguard Worker 38*c2e18aaaSAndroid Build Coastguard Worker _TEST_DIR = None 39*c2e18aaaSAndroid Build Coastguard Worker _TEST_PATH = unittest_constants.TEST_DATA_PATH 40*c2e18aaaSAndroid Build Coastguard Worker _SAMPLE_EXCLUDE_FOLDERS = [ 41*c2e18aaaSAndroid Build Coastguard Worker '\n <excludeFolder url="file://%s/.idea" />' % _TEST_PATH, 42*c2e18aaaSAndroid Build Coastguard Worker '\n <excludeFolder url="file://%s/out" />' % _TEST_PATH, 43*c2e18aaaSAndroid Build Coastguard Worker ] 44*c2e18aaaSAndroid Build Coastguard Worker 45*c2e18aaaSAndroid Build Coastguard Worker def setUp(self): 46*c2e18aaaSAndroid Build Coastguard Worker """Prepare the testdata related data.""" 47*c2e18aaaSAndroid Build Coastguard Worker projects = [] 48*c2e18aaaSAndroid Build Coastguard Worker targets = ['a', 'b', 'c', 'framework'] 49*c2e18aaaSAndroid Build Coastguard Worker ProjectSplitterUnittest._TEST_DIR = tempfile.mkdtemp() 50*c2e18aaaSAndroid Build Coastguard Worker for i, target in enumerate(targets): 51*c2e18aaaSAndroid Build Coastguard Worker with mock.patch.object(project_info, 'ProjectInfo') as proj_info: 52*c2e18aaaSAndroid Build Coastguard Worker projects.append(proj_info(target, i == 0)) 53*c2e18aaaSAndroid Build Coastguard Worker projects[0].project_relative_path = 'src1' 54*c2e18aaaSAndroid Build Coastguard Worker projects[0].source_path = { 55*c2e18aaaSAndroid Build Coastguard Worker 'source_folder_path': {'src1', 'src2', 'other1'}, 56*c2e18aaaSAndroid Build Coastguard Worker 'test_folder_path': {'src1/tests'}, 57*c2e18aaaSAndroid Build Coastguard Worker 'jar_path': {'jar1.jar'}, 58*c2e18aaaSAndroid Build Coastguard Worker 'jar_module_path': {}, 59*c2e18aaaSAndroid Build Coastguard Worker 'r_java_path': set(), 60*c2e18aaaSAndroid Build Coastguard Worker 'srcjar_path': {'srcjar1.srcjar'} 61*c2e18aaaSAndroid Build Coastguard Worker } 62*c2e18aaaSAndroid Build Coastguard Worker projects[1].project_relative_path = 'src2' 63*c2e18aaaSAndroid Build Coastguard Worker projects[1].source_path = { 64*c2e18aaaSAndroid Build Coastguard Worker 'source_folder_path': {'src2', 'src2/src3', 'src2/lib', 'other2'}, 65*c2e18aaaSAndroid Build Coastguard Worker 'test_folder_path': {'src2/tests'}, 66*c2e18aaaSAndroid Build Coastguard Worker 'jar_path': set(), 67*c2e18aaaSAndroid Build Coastguard Worker 'jar_module_path': {}, 68*c2e18aaaSAndroid Build Coastguard Worker 'r_java_path': set(), 69*c2e18aaaSAndroid Build Coastguard Worker 'srcjar_path': {'srcjar2.srcjar'} 70*c2e18aaaSAndroid Build Coastguard Worker } 71*c2e18aaaSAndroid Build Coastguard Worker projects[2].project_relative_path = 'src2/src3' 72*c2e18aaaSAndroid Build Coastguard Worker projects[2].source_path = { 73*c2e18aaaSAndroid Build Coastguard Worker 'source_folder_path': {'src2/src3', 'src2/lib'}, 74*c2e18aaaSAndroid Build Coastguard Worker 'test_folder_path': {'src2/src3/tests'}, 75*c2e18aaaSAndroid Build Coastguard Worker 'jar_path': {'jar3.jar'}, 76*c2e18aaaSAndroid Build Coastguard Worker 'jar_module_path': {}, 77*c2e18aaaSAndroid Build Coastguard Worker 'r_java_path': set(), 78*c2e18aaaSAndroid Build Coastguard Worker 'srcjar_path': {'srcjar3.srcjar'} 79*c2e18aaaSAndroid Build Coastguard Worker } 80*c2e18aaaSAndroid Build Coastguard Worker projects[3].project_relative_path = 'frameworks/base' 81*c2e18aaaSAndroid Build Coastguard Worker projects[3].source_path = { 82*c2e18aaaSAndroid Build Coastguard Worker 'source_folder_path': set(), 83*c2e18aaaSAndroid Build Coastguard Worker 'test_folder_path': set(), 84*c2e18aaaSAndroid Build Coastguard Worker 'jar_path': set(), 85*c2e18aaaSAndroid Build Coastguard Worker 'jar_module_path': {}, 86*c2e18aaaSAndroid Build Coastguard Worker 'r_java_path': set(), 87*c2e18aaaSAndroid Build Coastguard Worker 'srcjar_path': {'framework.srcjar', 'other.srcjar'} 88*c2e18aaaSAndroid Build Coastguard Worker } 89*c2e18aaaSAndroid Build Coastguard Worker with mock.patch.object(project_config.ProjectConfig, 90*c2e18aaaSAndroid Build Coastguard Worker 'get_instance') as proj_cfg: 91*c2e18aaaSAndroid Build Coastguard Worker config = mock.Mock() 92*c2e18aaaSAndroid Build Coastguard Worker config.full_repo = False 93*c2e18aaaSAndroid Build Coastguard Worker proj_cfg.return_value = config 94*c2e18aaaSAndroid Build Coastguard Worker self.split_projs = project_splitter.ProjectSplitter(projects) 95*c2e18aaaSAndroid Build Coastguard Worker 96*c2e18aaaSAndroid Build Coastguard Worker def tearDown(self): 97*c2e18aaaSAndroid Build Coastguard Worker """Clear the testdata related path.""" 98*c2e18aaaSAndroid Build Coastguard Worker self.split_projs = None 99*c2e18aaaSAndroid Build Coastguard Worker shutil.rmtree(ProjectSplitterUnittest._TEST_DIR) 100*c2e18aaaSAndroid Build Coastguard Worker iml.IMLGenerator.USED_NAME_CACHE.clear() 101*c2e18aaaSAndroid Build Coastguard Worker 102*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'get_android_root_dir') 103*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_config.ProjectConfig, 'get_instance') 104*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('builtins.any') 105*c2e18aaaSAndroid Build Coastguard Worker def test_init(self, mock_any, mock_project, mock_root): 106*c2e18aaaSAndroid Build Coastguard Worker """Test initialize the attributes.""" 107*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(len(self.split_projs._projects), 4) 108*c2e18aaaSAndroid Build Coastguard Worker mock_any.return_value = False 109*c2e18aaaSAndroid Build Coastguard Worker mock_root.return_value = ProjectSplitterUnittest._TEST_DIR 110*c2e18aaaSAndroid Build Coastguard Worker with mock.patch.object(project_info, 'ProjectInfo') as proj_info: 111*c2e18aaaSAndroid Build Coastguard Worker config = mock.Mock() 112*c2e18aaaSAndroid Build Coastguard Worker config.full_repo = False 113*c2e18aaaSAndroid Build Coastguard Worker mock_project.return_value = config 114*c2e18aaaSAndroid Build Coastguard Worker project = project_splitter.ProjectSplitter(proj_info(['a'], True)) 115*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(project._framework_exist) 116*c2e18aaaSAndroid Build Coastguard Worker config.full_repo = True 117*c2e18aaaSAndroid Build Coastguard Worker project = project_splitter.ProjectSplitter(proj_info(['a'], True)) 118*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(project._full_repo_iml, 119*c2e18aaaSAndroid Build Coastguard Worker os.path.basename( 120*c2e18aaaSAndroid Build Coastguard Worker ProjectSplitterUnittest._TEST_DIR)) 121*c2e18aaaSAndroid Build Coastguard Worker 122*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_splitter.ProjectSplitter, 123*c2e18aaaSAndroid Build Coastguard Worker '_remove_duplicate_sources') 124*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_splitter.ProjectSplitter, 125*c2e18aaaSAndroid Build Coastguard Worker '_keep_local_sources') 126*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_splitter.ProjectSplitter, 127*c2e18aaaSAndroid Build Coastguard Worker '_collect_all_srcs') 128*c2e18aaaSAndroid Build Coastguard Worker def test_revise_source_folders(self, mock_copy_srcs, mock_keep_srcs, 129*c2e18aaaSAndroid Build Coastguard Worker mock_remove_srcs): 130*c2e18aaaSAndroid Build Coastguard Worker """Test revise_source_folders.""" 131*c2e18aaaSAndroid Build Coastguard Worker self.split_projs.revise_source_folders() 132*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_copy_srcs.called) 133*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_keep_srcs.called) 134*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_remove_srcs.called) 135*c2e18aaaSAndroid Build Coastguard Worker 136*c2e18aaaSAndroid Build Coastguard Worker def test_collect_all_srcs(self): 137*c2e18aaaSAndroid Build Coastguard Worker """Test _collect_all_srcs.""" 138*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._collect_all_srcs() 139*c2e18aaaSAndroid Build Coastguard Worker sources = self.split_projs._all_srcs 140*c2e18aaaSAndroid Build Coastguard Worker expected_srcs = {'src1', 'src2', 'src2/src3', 'src2/lib', 'other1', 141*c2e18aaaSAndroid Build Coastguard Worker 'other2'} 142*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(sources['source_folder_path'], expected_srcs) 143*c2e18aaaSAndroid Build Coastguard Worker expected_tests = {'src1/tests', 'src2/tests', 'src2/src3/tests'} 144*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(sources['test_folder_path'], expected_tests) 145*c2e18aaaSAndroid Build Coastguard Worker 146*c2e18aaaSAndroid Build Coastguard Worker def test_keep_local_sources(self): 147*c2e18aaaSAndroid Build Coastguard Worker """Test _keep_local_sources.""" 148*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._collect_all_srcs() 149*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._keep_local_sources() 150*c2e18aaaSAndroid Build Coastguard Worker srcs1 = self.split_projs._projects[0].source_path 151*c2e18aaaSAndroid Build Coastguard Worker srcs2 = self.split_projs._projects[1].source_path 152*c2e18aaaSAndroid Build Coastguard Worker srcs3 = self.split_projs._projects[2].source_path 153*c2e18aaaSAndroid Build Coastguard Worker all_srcs = self.split_projs._all_srcs 154*c2e18aaaSAndroid Build Coastguard Worker expected_srcs1 = {'src1'} 155*c2e18aaaSAndroid Build Coastguard Worker expected_srcs2 = {'src2', 'src2/src3', 'src2/lib'} 156*c2e18aaaSAndroid Build Coastguard Worker expected_srcs3 = {'src2/src3'} 157*c2e18aaaSAndroid Build Coastguard Worker expected_all_srcs = {'other1', 'other2'} 158*c2e18aaaSAndroid Build Coastguard Worker expected_all_tests = set() 159*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(srcs1['source_folder_path'], expected_srcs1) 160*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(srcs2['source_folder_path'], expected_srcs2) 161*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(srcs3['source_folder_path'], expected_srcs3) 162*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(all_srcs['source_folder_path'], expected_all_srcs) 163*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(all_srcs['test_folder_path'], expected_all_tests) 164*c2e18aaaSAndroid Build Coastguard Worker 165*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object( 166*c2e18aaaSAndroid Build Coastguard Worker project_splitter, '_remove_child_duplicate_sources_from_parent') 167*c2e18aaaSAndroid Build Coastguard Worker def test_remove_duplicate_sources(self, mock_remove): 168*c2e18aaaSAndroid Build Coastguard Worker """Test _remove_duplicate_sources.""" 169*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._collect_all_srcs() 170*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._keep_local_sources() 171*c2e18aaaSAndroid Build Coastguard Worker mock_remove.return_value = set() 172*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._remove_duplicate_sources() 173*c2e18aaaSAndroid Build Coastguard Worker srcs2 = self.split_projs._projects[1].source_path 174*c2e18aaaSAndroid Build Coastguard Worker srcs3 = self.split_projs._projects[2].source_path 175*c2e18aaaSAndroid Build Coastguard Worker expected_srcs2 = {'src2', 'src2/lib'} 176*c2e18aaaSAndroid Build Coastguard Worker expected_srcs3 = {'src2/src3'} 177*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(srcs2['source_folder_path'], expected_srcs2) 178*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(srcs3['source_folder_path'], expected_srcs3) 179*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_remove.called) 180*c2e18aaaSAndroid Build Coastguard Worker 181*c2e18aaaSAndroid Build Coastguard Worker def test_get_dependencies(self): 182*c2e18aaaSAndroid Build Coastguard Worker """Test get_dependencies.""" 183*c2e18aaaSAndroid Build Coastguard Worker iml.IMLGenerator.USED_NAME_CACHE.clear() 184*c2e18aaaSAndroid Build Coastguard Worker self.split_projs.get_dependencies() 185*c2e18aaaSAndroid Build Coastguard Worker dep1 = ['framework_srcjars', 'base', 'src2', 'dependencies'] 186*c2e18aaaSAndroid Build Coastguard Worker dep2 = ['framework_srcjars', 'base', 'dependencies'] 187*c2e18aaaSAndroid Build Coastguard Worker dep3 = ['framework_srcjars', 'base', 'src2', 'dependencies'] 188*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.split_projs._projects[0].dependencies, dep1) 189*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.split_projs._projects[1].dependencies, dep2) 190*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self.split_projs._projects[2].dependencies, dep3) 191*c2e18aaaSAndroid Build Coastguard Worker 192*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(iml.IMLGenerator, 'create') 193*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_splitter.ProjectSplitter, 194*c2e18aaaSAndroid Build Coastguard Worker '_get_permission_defined_source_path') 195*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_splitter.ProjectSplitter, 196*c2e18aaaSAndroid Build Coastguard Worker '_remove_permission_definition_srcjar_path') 197*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'get_android_root_dir') 198*c2e18aaaSAndroid Build Coastguard Worker def test_gen_framework_srcjars_iml( 199*c2e18aaaSAndroid Build Coastguard Worker self, mock_root, mock_remove, mock_get, mock_create_iml): 200*c2e18aaaSAndroid Build Coastguard Worker """Test gen_framework_srcjars_iml.""" 201*c2e18aaaSAndroid Build Coastguard Worker mock_root.return_value = self._TEST_DIR 202*c2e18aaaSAndroid Build Coastguard Worker mock_get.return_value = 'aapt2/R' 203*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._projects[0].dep_modules = { 204*c2e18aaaSAndroid Build Coastguard Worker 'framework-all': { 205*c2e18aaaSAndroid Build Coastguard Worker 'module_name': 'framework-all', 206*c2e18aaaSAndroid Build Coastguard Worker 'path': ['frameworks/base'], 207*c2e18aaaSAndroid Build Coastguard Worker 'srcjars': ['framework.srcjar'], 208*c2e18aaaSAndroid Build Coastguard Worker 'iml_name': 'framework_srcjars' 209*c2e18aaaSAndroid Build Coastguard Worker } 210*c2e18aaaSAndroid Build Coastguard Worker } 211*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._framework_exist = False 212*c2e18aaaSAndroid Build Coastguard Worker self.split_projs.gen_framework_srcjars_iml() 213*c2e18aaaSAndroid Build Coastguard Worker srcjar_dict = {constant.KEY_DEP_SRCS: True, constant.KEY_SRCJARS: True, 214*c2e18aaaSAndroid Build Coastguard Worker constant.KEY_DEPENDENCIES: True} 215*c2e18aaaSAndroid Build Coastguard Worker mock_create_iml.assert_called_with(srcjar_dict) 216*c2e18aaaSAndroid Build Coastguard Worker expected_srcjars = [ 217*c2e18aaaSAndroid Build Coastguard Worker 'other.srcjar', 218*c2e18aaaSAndroid Build Coastguard Worker 'srcjar1.srcjar', 219*c2e18aaaSAndroid Build Coastguard Worker 'srcjar2.srcjar', 220*c2e18aaaSAndroid Build Coastguard Worker 'srcjar3.srcjar', 221*c2e18aaaSAndroid Build Coastguard Worker ] 222*c2e18aaaSAndroid Build Coastguard Worker expected_path = os.path.join(self._TEST_DIR, 223*c2e18aaaSAndroid Build Coastguard Worker 'frameworks/base/framework_srcjars.iml') 224*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._framework_exist = True 225*c2e18aaaSAndroid Build Coastguard Worker self.split_projs.revise_source_folders() 226*c2e18aaaSAndroid Build Coastguard Worker mock_get.return_value = None 227*c2e18aaaSAndroid Build Coastguard Worker iml_path = self.split_projs.gen_framework_srcjars_iml() 228*c2e18aaaSAndroid Build Coastguard Worker srcjars = self.split_projs._all_srcs['srcjar_path'] 229*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(sorted(list(srcjars)), expected_srcjars) 230*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(iml_path, expected_path) 231*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_remove.called) 232*c2e18aaaSAndroid Build Coastguard Worker srcjar_dict = {constant.KEY_SRCJARS: True, 233*c2e18aaaSAndroid Build Coastguard Worker constant.KEY_DEPENDENCIES: True} 234*c2e18aaaSAndroid Build Coastguard Worker mock_create_iml.assert_called_with(srcjar_dict) 235*c2e18aaaSAndroid Build Coastguard Worker 236*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_splitter.ProjectSplitter, '_unzip_all_scrjars') 237*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(iml.IMLGenerator, 'create') 238*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'get_android_root_dir') 239*c2e18aaaSAndroid Build Coastguard Worker def test_gen_dependencies_iml(self, mock_root, mock_create_iml, mock_unzip): 240*c2e18aaaSAndroid Build Coastguard Worker """Test _gen_dependencies_iml.""" 241*c2e18aaaSAndroid Build Coastguard Worker mock_root.return_value = self._TEST_DIR 242*c2e18aaaSAndroid Build Coastguard Worker self.split_projs.revise_source_folders() 243*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._framework_exist = False 244*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._gen_dependencies_iml() 245*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_unzip.called) 246*c2e18aaaSAndroid Build Coastguard Worker mock_unzip.mock_reset() 247*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._framework_exist = True 248*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._gen_dependencies_iml() 249*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_create_iml.called) 250*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_unzip.called) 251*c2e18aaaSAndroid Build Coastguard Worker 252*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_splitter.ProjectSplitter, '_unzip_all_scrjars') 253*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_splitter, 'get_exclude_content') 254*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_config.ProjectConfig, 'get_instance') 255*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(iml.IMLGenerator, 'create') 256*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'get_android_root_dir') 257*c2e18aaaSAndroid Build Coastguard Worker def test_gen_projects_iml(self, mock_root, mock_create_iml, mock_project, 258*c2e18aaaSAndroid Build Coastguard Worker mock_get_excludes, mock_unzip): 259*c2e18aaaSAndroid Build Coastguard Worker """Test gen_projects_iml.""" 260*c2e18aaaSAndroid Build Coastguard Worker mock_root.return_value = self._TEST_DIR 261*c2e18aaaSAndroid Build Coastguard Worker config = mock.Mock() 262*c2e18aaaSAndroid Build Coastguard Worker mock_project.return_value = config 263*c2e18aaaSAndroid Build Coastguard Worker config.exclude_paths = [] 264*c2e18aaaSAndroid Build Coastguard Worker self.split_projs.revise_source_folders() 265*c2e18aaaSAndroid Build Coastguard Worker self.split_projs.gen_projects_iml() 266*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_create_iml.called) 267*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_unzip.called) 268*c2e18aaaSAndroid Build Coastguard Worker mock_unzip.mock_reset() 269*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_get_excludes.called) 270*c2e18aaaSAndroid Build Coastguard Worker config.exclude_paths = ['a'] 271*c2e18aaaSAndroid Build Coastguard Worker self.split_projs.gen_projects_iml() 272*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_get_excludes.called) 273*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_unzip.called) 274*c2e18aaaSAndroid Build Coastguard Worker 275*c2e18aaaSAndroid Build Coastguard Worker def test_get_exclude_content(self): 276*c2e18aaaSAndroid Build Coastguard Worker """Test get_exclude_content.""" 277*c2e18aaaSAndroid Build Coastguard Worker exclude_folders = project_splitter.get_exclude_content(self._TEST_PATH) 278*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(self._SAMPLE_EXCLUDE_FOLDERS, exclude_folders) 279*c2e18aaaSAndroid Build Coastguard Worker 280*c2e18aaaSAndroid Build Coastguard Worker def test_remove_child_duplicate_sources_from_parent(self): 281*c2e18aaaSAndroid Build Coastguard Worker """Test _remove_child_duplicate_sources_from_parent with conditions.""" 282*c2e18aaaSAndroid Build Coastguard Worker child = mock.Mock() 283*c2e18aaaSAndroid Build Coastguard Worker child.project_relative_path = 'c/d' 284*c2e18aaaSAndroid Build Coastguard Worker root = 'a/b' 285*c2e18aaaSAndroid Build Coastguard Worker parent_sources = ['a/b/d/e', 'a/b/e/f'] 286*c2e18aaaSAndroid Build Coastguard Worker result = project_splitter._remove_child_duplicate_sources_from_parent( 287*c2e18aaaSAndroid Build Coastguard Worker child, parent_sources, root) 288*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(set(), result) 289*c2e18aaaSAndroid Build Coastguard Worker parent_sources = ['a/b/c/d/e', 'a/b/e/f'] 290*c2e18aaaSAndroid Build Coastguard Worker result = project_splitter._remove_child_duplicate_sources_from_parent( 291*c2e18aaaSAndroid Build Coastguard Worker child, parent_sources, root) 292*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual({'a/b/c/d/e'}, result) 293*c2e18aaaSAndroid Build Coastguard Worker 294*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('os.path.relpath') 295*c2e18aaaSAndroid Build Coastguard Worker def test_get_rel_project_soong_paths(self, mock_rel): 296*c2e18aaaSAndroid Build Coastguard Worker """Test _get_rel_project_soong_paths.""" 297*c2e18aaaSAndroid Build Coastguard Worker mock_rel.return_value = 'out/soong' 298*c2e18aaaSAndroid Build Coastguard Worker expected = [ 299*c2e18aaaSAndroid Build Coastguard Worker 'out/soong/.intermediates/src1/', 300*c2e18aaaSAndroid Build Coastguard Worker 'out/soong/.intermediates/src2/', 301*c2e18aaaSAndroid Build Coastguard Worker 'out/soong/.intermediates/src2/src3/', 302*c2e18aaaSAndroid Build Coastguard Worker 'out/soong/.intermediates/frameworks/base/' 303*c2e18aaaSAndroid Build Coastguard Worker ] 304*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual( 305*c2e18aaaSAndroid Build Coastguard Worker expected, self.split_projs._get_rel_project_soong_paths()) 306*c2e18aaaSAndroid Build Coastguard Worker 307*c2e18aaaSAndroid Build Coastguard Worker def test_get_real_dependencies_jars(self): 308*c2e18aaaSAndroid Build Coastguard Worker """Test _get_real_dependencies_jars with conditions.""" 309*c2e18aaaSAndroid Build Coastguard Worker expected = ['a/b/c/d'] 310*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(expected, project_splitter._get_real_dependencies_jars( 311*c2e18aaaSAndroid Build Coastguard Worker [], expected)) 312*c2e18aaaSAndroid Build Coastguard Worker expected = ['a/b/c/d.jar'] 313*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(expected, project_splitter._get_real_dependencies_jars( 314*c2e18aaaSAndroid Build Coastguard Worker ['a/e'], expected)) 315*c2e18aaaSAndroid Build Coastguard Worker expected = ['a/b/c/d.jar'] 316*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual([], project_splitter._get_real_dependencies_jars( 317*c2e18aaaSAndroid Build Coastguard Worker ['a/b'], expected)) 318*c2e18aaaSAndroid Build Coastguard Worker expected = ['a/b/c/d.srcjar'] 319*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(expected, project_splitter._get_real_dependencies_jars( 320*c2e18aaaSAndroid Build Coastguard Worker ['a/b'], expected)) 321*c2e18aaaSAndroid Build Coastguard Worker expected = ['a/b/c/gen'] 322*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(expected, project_splitter._get_real_dependencies_jars( 323*c2e18aaaSAndroid Build Coastguard Worker ['a/b'], expected)) 324*c2e18aaaSAndroid Build Coastguard Worker 325*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'get_android_root_dir') 326*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'get_soong_out_path') 327*c2e18aaaSAndroid Build Coastguard Worker def test_get_permission_aapt2_rel_path(self, mock_soong, mock_root): 328*c2e18aaaSAndroid Build Coastguard Worker """Test _get_permission_aapt2_rel_path.""" 329*c2e18aaaSAndroid Build Coastguard Worker mock_soong.return_value = 'a/b/out/soong' 330*c2e18aaaSAndroid Build Coastguard Worker mock_root.return_value = 'a/b' 331*c2e18aaaSAndroid Build Coastguard Worker expected = ('out/soong/.intermediates/frameworks/base/core/res/' 332*c2e18aaaSAndroid Build Coastguard Worker 'framework-res/android_common/gen/aapt2/R') 333*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual( 334*c2e18aaaSAndroid Build Coastguard Worker expected, project_splitter._get_permission_aapt2_rel_path()) 335*c2e18aaaSAndroid Build Coastguard Worker 336*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'get_android_root_dir') 337*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'get_soong_out_path') 338*c2e18aaaSAndroid Build Coastguard Worker def test_get_permission_r_srcjar_rel_path(self, mock_soong, mock_root): 339*c2e18aaaSAndroid Build Coastguard Worker """Test _get_permission_r_srcjar_rel_path.""" 340*c2e18aaaSAndroid Build Coastguard Worker mock_soong.return_value = 'a/b/out/soong' 341*c2e18aaaSAndroid Build Coastguard Worker mock_root.return_value = 'a/b' 342*c2e18aaaSAndroid Build Coastguard Worker expected = ('out/soong/.intermediates/frameworks/base/core/res/' 343*c2e18aaaSAndroid Build Coastguard Worker 'framework-res/android_common/gen/android/R.srcjar') 344*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual( 345*c2e18aaaSAndroid Build Coastguard Worker expected, project_splitter._get_permission_r_srcjar_rel_path()) 346*c2e18aaaSAndroid Build Coastguard Worker 347*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_splitter, '_get_permission_r_srcjar_rel_path') 348*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(project_splitter, '_get_permission_aapt2_rel_path') 349*c2e18aaaSAndroid Build Coastguard Worker def test_remove_permission_definition_srcjar_path( 350*c2e18aaaSAndroid Build Coastguard Worker self, mock_get_aapt2, mock_get_r_srcjar): 351*c2e18aaaSAndroid Build Coastguard Worker """Test _remove_permission_definition_srcjar_path with conditions.""" 352*c2e18aaaSAndroid Build Coastguard Worker expected_srcjars = [ 353*c2e18aaaSAndroid Build Coastguard Worker 'other.srcjar', 354*c2e18aaaSAndroid Build Coastguard Worker 'srcjar1.srcjar', 355*c2e18aaaSAndroid Build Coastguard Worker 'srcjar2.srcjar', 356*c2e18aaaSAndroid Build Coastguard Worker 'srcjar3.srcjar', 357*c2e18aaaSAndroid Build Coastguard Worker ] 358*c2e18aaaSAndroid Build Coastguard Worker mock_get_aapt2.return_value = 'none/aapt2/R' 359*c2e18aaaSAndroid Build Coastguard Worker mock_get_r_srcjar.return_value = 'none.srcjar' 360*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._all_srcs['srcjar_path'] = expected_srcjars 361*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._remove_permission_definition_srcjar_path() 362*c2e18aaaSAndroid Build Coastguard Worker srcjars = self.split_projs._all_srcs['srcjar_path'] 363*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(sorted(list(srcjars)), expected_srcjars) 364*c2e18aaaSAndroid Build Coastguard Worker 365*c2e18aaaSAndroid Build Coastguard Worker expected_srcjars = [ 366*c2e18aaaSAndroid Build Coastguard Worker 'other.srcjar', 367*c2e18aaaSAndroid Build Coastguard Worker 'srcjar2.srcjar', 368*c2e18aaaSAndroid Build Coastguard Worker 'srcjar3.srcjar', 369*c2e18aaaSAndroid Build Coastguard Worker ] 370*c2e18aaaSAndroid Build Coastguard Worker mock_get_r_srcjar.return_value = 'srcjar1.srcjar' 371*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._all_srcs['srcjar_path'] = expected_srcjars 372*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._remove_permission_definition_srcjar_path() 373*c2e18aaaSAndroid Build Coastguard Worker srcjars = self.split_projs._all_srcs['srcjar_path'] 374*c2e18aaaSAndroid Build Coastguard Worker self.assertEqual(sorted(list(srcjars)), expected_srcjars) 375*c2e18aaaSAndroid Build Coastguard Worker 376*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('os.path.join') 377*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'unzip_file') 378*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('shutil.rmtree') 379*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('os.path.isfile') 380*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('os.path.isdir') 381*c2e18aaaSAndroid Build Coastguard Worker def test_get_permission_defined_source_path( 382*c2e18aaaSAndroid Build Coastguard Worker self, mock_is_dir, mock_is_file, mock_rmtree, mock_unzip, 383*c2e18aaaSAndroid Build Coastguard Worker mock_join): 384*c2e18aaaSAndroid Build Coastguard Worker """Test _get_permission_defined_source_path function.""" 385*c2e18aaaSAndroid Build Coastguard Worker mock_is_dir.return_value = True 386*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._get_permission_defined_source_path() 387*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_is_file.called) 388*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_join.called) 389*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_rmtree.called) 390*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_unzip.called) 391*c2e18aaaSAndroid Build Coastguard Worker mock_is_dir.return_value = False 392*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._get_permission_defined_source_path() 393*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_is_file.called) 394*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_join.called) 395*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_rmtree.called) 396*c2e18aaaSAndroid Build Coastguard Worker self.assertTrue(mock_unzip.called) 397*c2e18aaaSAndroid Build Coastguard Worker 398*c2e18aaaSAndroid Build Coastguard Worker @mock.patch.object(common_util, 'unzip_file') 399*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('shutil.rmtree') 400*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('os.path.join') 401*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('os.path.dirname') 402*c2e18aaaSAndroid Build Coastguard Worker @mock.patch('os.path.isdir') 403*c2e18aaaSAndroid Build Coastguard Worker def test_unzip_all_scrjars( 404*c2e18aaaSAndroid Build Coastguard Worker self, mock_is_dir, mock_dirname, mock_join, mock_rmtree, 405*c2e18aaaSAndroid Build Coastguard Worker mock_unzip): 406*c2e18aaaSAndroid Build Coastguard Worker """Test _unzip_all_scrjars function.""" 407*c2e18aaaSAndroid Build Coastguard Worker mock_is_dir.return_value = True 408*c2e18aaaSAndroid Build Coastguard Worker self.split_projs._unzip_all_scrjars() 409*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_dirname.called) 410*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_join.called) 411*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_rmtree.called) 412*c2e18aaaSAndroid Build Coastguard Worker self.assertFalse(mock_unzip.called) 413*c2e18aaaSAndroid Build Coastguard Worker 414*c2e18aaaSAndroid Build Coastguard Worker 415*c2e18aaaSAndroid Build Coastguard Workerif __name__ == '__main__': 416*c2e18aaaSAndroid Build Coastguard Worker unittest.main() 417