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