xref: /aosp_15_r20/tools/asuite/aidegen/project/project_splitter_unittest.py (revision c2e18aaa1096c836b086f94603d04f4eb9cf37f5)
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