lin
2025-07-31 065ea569db06206874bbfa18eb25ff6121aec09b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/usr/bin/env python3
#
# Copyright 2018, The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
 
"""Unittests for common_util."""
 
import os
import unittest
from unittest import mock
 
from aidegen.lib.errors import FakeModuleError
from aidegen.lib.errors import NoModuleDefinedInModuleInfoError
from aidegen.lib.errors import ProjectOutsideAndroidRootError
from aidegen.lib.errors import ProjectPathNotExistError
import aidegen.unittest_constants as uc
from aidegen import constant
from aidegen.lib import common_util
from atest import module_info
 
 
#pylint: disable=protected-access
#pylint: disable=invalid-name
class AidegenCommonUtilUnittests(unittest.TestCase):
    """Unit tests for common_util.py"""
 
    @mock.patch.object(module_info.ModuleInfo, 'get_module_names')
    @mock.patch.object(module_info.ModuleInfo, 'get_paths')
    @mock.patch.object(module_info.ModuleInfo, 'is_module')
    def test_get_related_paths(self, mock_is_mod, mock_get, mock_names):
        """Test get_related_paths with different conditions."""
        mock_is_mod.return_value = True
        mock_get.return_value = []
        mod_info = module_info.ModuleInfo()
        self.assertEqual((None, None),
                         common_util.get_related_paths(mod_info,
                                                       uc.TEST_MODULE))
        constant.ANDROID_ROOT_PATH = uc.TEST_PATH
        mock_get.return_value = [uc.TEST_MODULE]
        expected = (uc.TEST_MODULE, os.path.join(uc.TEST_PATH, uc.TEST_MODULE))
        self.assertEqual(
            expected, common_util.get_related_paths(mod_info, uc.TEST_MODULE))
        mock_is_mod.return_value = False
        mock_names.return_value = True
        self.assertEqual(
            expected, common_util.get_related_paths(mod_info, uc.TEST_MODULE))
 
    @mock.patch.object(common_util, 'get_related_paths')
    def test_is_target_android_root(self, mock_get):
        """Test is_target_android_root with different conditions."""
        mock_get.return_value = None, uc.TEST_PATH
        self.assertTrue(
            common_util.is_target_android_root(module_info.ModuleInfo(),
                                               [uc.TEST_MODULE]))
        mock_get.return_value = None, ''
        self.assertFalse(
            common_util.is_target_android_root(module_info.ModuleInfo(),
                                               [uc.TEST_MODULE]))
 
    @mock.patch.object(common_util, 'has_build_target')
    @mock.patch('os.path.isdir')
    @mock.patch.object(common_util, 'get_related_paths')
    def test_check_module(self, mock_get, mock_isdir, mock_has_target):
        """Test if _check_module raises errors with different conditions."""
        mod_info = module_info.ModuleInfo()
        mock_get.return_value = None, None
        with self.assertRaises(FakeModuleError) as ctx:
            common_util._check_module(mod_info, uc.TEST_MODULE)
            expected = common_util.FAKE_MODULE_ERROR.format(uc.TEST_MODULE)
            self.assertEqual(expected, str(ctx.exception))
        constant.ANDROID_ROOT_PATH = uc.TEST_PATH
        mock_get.return_value = None, uc.TEST_MODULE
        with self.assertRaises(ProjectOutsideAndroidRootError) as ctx:
            common_util._check_module(mod_info, uc.TEST_MODULE)
            expected = common_util.OUTSIDE_ROOT_ERROR.format(uc.TEST_MODULE)
            self.assertEqual(expected, str(ctx.exception))
        mock_get.return_value = None, uc.TEST_PATH
        mock_isdir.return_value = False
        with self.assertRaises(ProjectPathNotExistError) as ctx:
            common_util._check_module(mod_info, uc.TEST_MODULE)
            expected = common_util.PATH_NOT_EXISTS_ERROR.format(uc.TEST_MODULE)
            self.assertEqual(expected, str(ctx.exception))
        mock_isdir.return_value = True
        mock_has_target.return_value = False
        mock_get.return_value = None, os.path.join(uc.TEST_PATH, 'test.jar')
        with self.assertRaises(NoModuleDefinedInModuleInfoError) as ctx:
            common_util._check_module(mod_info, uc.TEST_MODULE)
            expected = common_util.NO_MODULE_DEFINED_ERROR.format(
                uc.TEST_MODULE)
            self.assertEqual(expected, str(ctx.exception))
        self.assertEqual(common_util._check_module(mod_info, '', False), False)
        self.assertEqual(common_util._check_module(mod_info, 'nothing', False),
                         False)
 
    @mock.patch.object(common_util, '_check_module')
    def test_check_modules(self, mock_check):
        """Test _check_modules with different module lists."""
        mod_info = module_info.ModuleInfo()
        common_util._check_modules(mod_info, [])
        self.assertEqual(mock_check.call_count, 0)
        common_util._check_modules(mod_info, ['module1', 'module2'])
        self.assertEqual(mock_check.call_count, 2)
        target = 'nothing'
        mock_check.return_value = False
        self.assertEqual(common_util._check_modules(mod_info, [target], False),
                         False)
 
    def test_get_abs_path(self):
        """Test get_abs_path handling."""
        constant.ANDROID_ROOT_PATH = uc.TEST_DATA_PATH
        self.assertEqual(uc.TEST_DATA_PATH, common_util.get_abs_path(''))
        test_path = os.path.join(uc.TEST_DATA_PATH, 'test.jar')
        self.assertEqual(test_path, common_util.get_abs_path(test_path))
        self.assertEqual(test_path, common_util.get_abs_path('test.jar'))
 
    def test_is_target(self):
        """Test is_target handling."""
        self.assertEqual(
            common_util.is_target('packages/apps/tests/test.a', ['.so', '.a']),
            True)
        self.assertEqual(
            common_util.is_target('packages/apps/tests/test.so', ['.so', '.a']),
            True)
        self.assertEqual(
            common_util.is_target('packages/apps/tests/test.jar',
                                  ['.so', '.a']), False)
 
 
if __name__ == '__main__':
    unittest.main()