| #!/usr/bin/env python3 |
| # |
| # Copyright 2019, 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 native_util.""" |
| |
| import os |
| import unittest |
| from unittest import mock |
| |
| from aidegen import unittest_constants |
| from aidegen.lib import common_util |
| from aidegen.lib import native_module_info |
| from aidegen.lib import native_util |
| |
| |
| # pylint: disable=protected-access |
| # pylint: disable=invalid-name |
| class AidegenNativeUtilUnittests(unittest.TestCase): |
| """Unit tests for native_util.py""" |
| |
| @mock.patch.object(native_util, '_check_native_project_exists') |
| @mock.patch.object(native_util, '_check_java_file_exists') |
| @mock.patch.object(common_util, 'get_related_paths') |
| def test_analyze_native_and_java_projects( |
| self, mock_get_related, mock_check_java, mock_check_native): |
| """Test analyze_native_and_java_projects function.""" |
| mock_get_related.return_value = None, None |
| mock_check_java.return_value = True |
| mock_check_native.return_value = True |
| targets = ['a'] |
| self.assertEqual((targets, targets), |
| native_util._analyze_native_and_java_projects( |
| None, None, targets)) |
| mock_check_native.return_value = False |
| self.assertEqual((targets, []), |
| native_util._analyze_native_and_java_projects( |
| None, None, targets)) |
| mock_check_java.return_value = False |
| mock_check_native.return_value = True |
| self.assertEqual(([], targets), |
| native_util._analyze_native_and_java_projects( |
| None, None, targets)) |
| |
| def test_check_native_project_exists(self): |
| """Test _check_native_project_exists function.""" |
| rel_path = 'a/b' |
| path_to_module_info = {'a/b/c': {}} |
| self.assertTrue( |
| native_util._check_native_project_exists(path_to_module_info, |
| rel_path)) |
| rel_path = 'a/b/c/d' |
| self.assertFalse( |
| native_util._check_native_project_exists(path_to_module_info, |
| rel_path)) |
| |
| def test_find_parent(self): |
| """Test _find_parent function with conditions.""" |
| current_parent = None |
| abs_path = 'a/b/c/d' |
| expected = abs_path |
| result = native_util._find_parent(abs_path, current_parent) |
| self.assertEqual(result, expected) |
| current_parent = 'a/b/c/d/e' |
| result = native_util._find_parent(abs_path, current_parent) |
| self.assertEqual(result, expected) |
| current_parent = 'a/b/c' |
| expected = current_parent |
| result = native_util._find_parent(abs_path, current_parent) |
| self.assertEqual(result, expected) |
| current_parent = 'a/b/f' |
| expected = 'a/b' |
| result = native_util._find_parent(abs_path, current_parent) |
| self.assertEqual(result, expected) |
| |
| @mock.patch.object(native_module_info.NativeModuleInfo, |
| '_load_module_info_file') |
| @mock.patch.object(native_util, '_find_parent') |
| @mock.patch.object(common_util, 'get_related_paths') |
| def test_get_merged_native_target_is_module( |
| self, mock_get_related, mock_find_parent, mock_load_info): |
| """Test _get_merged_native_target function if the target is a module.""" |
| mock_get_related.return_value = 'c/d', 'a/b/c/d' |
| parent = 'a/b' |
| mock_find_parent.return_value = parent |
| targets = ['multiarch'] |
| expected = (parent, targets) |
| mock_load_info.return_value = ( |
| None, unittest_constants.CC_NAME_TO_MODULE_INFO) |
| cc_mod_info = native_module_info.NativeModuleInfo() |
| new_parent, new_targets = native_util._get_merged_native_target( |
| cc_mod_info, targets) |
| result = (new_parent, new_targets) |
| self.assertEqual(result, expected) |
| |
| @mock.patch.object(native_module_info.NativeModuleInfo, |
| '_load_module_info_file') |
| @mock.patch.object(native_util, '_find_parent') |
| @mock.patch.object(common_util, 'get_related_paths') |
| def test_get_merged_native_target_is_path(self, mock_get_related, |
| mock_find_parent, mock_load_info): |
| """Test _get_merged_native_target function if the target is a path.""" |
| parent = 'a/b' |
| rel_path = 'shared/path/to/be/used2' |
| mock_get_related.return_value = rel_path, os.path.join(parent, rel_path) |
| mock_find_parent.return_value = parent |
| mock_load_info.return_value = ( |
| None, unittest_constants.CC_NAME_TO_MODULE_INFO) |
| targets = [rel_path] |
| result_targets = unittest_constants.TESTABLE_MODULES_WITH_SHARED_PATH |
| expected = (parent, result_targets) |
| cc_mod_info = native_module_info.NativeModuleInfo() |
| new_parent, new_targets = native_util._get_merged_native_target( |
| cc_mod_info, targets) |
| result = (new_parent, new_targets) |
| self.assertEqual(result, expected) |
| |
| |
| def test_filter_out_modules(self): |
| """Test _filter_out_modules with conditions.""" |
| targets = ['shared/path/to/be/used2'] |
| result = ([], targets) |
| self.assertEqual( |
| result, native_util._filter_out_modules(targets, lambda x: False)) |
| targets = ['multiarch'] |
| result = (targets, []) |
| self.assertEqual( |
| result, native_util._filter_out_modules(targets, lambda x: True)) |
| |
| @mock.patch.object(native_util, '_analyze_native_and_java_projects') |
| @mock.patch.object(native_util, '_filter_out_modules') |
| def test_get_native_and_java_projects(self, mock_fil, mock_ana): |
| """Test get_native_and_java_projects handling.""" |
| targets = ['multiarch'] |
| mock_fil.return_value = [], targets |
| cc_mod_info = mock.Mock() |
| cc_mod_info.is_module = mock.Mock() |
| cc_mod_info.is_module.return_value = True |
| at_mod_info = mock.Mock() |
| at_mod_info.is_module = mock.Mock() |
| at_mod_info.is_module.return_value = True |
| mock_ana.return_value = [], targets |
| native_util.get_native_and_java_projects( |
| at_mod_info, cc_mod_info, targets) |
| self.assertEqual(mock_fil.call_count, 2) |
| self.assertEqual(mock_ana.call_count, 1) |
| |
| @mock.patch('os.walk') |
| def test_check_java_file_exists(self, mock_walk): |
| """Test _check_java_file_exists with conditions.""" |
| root_dir = 'a/path/to/dir' |
| folder = 'path/to/dir' |
| target = 'test.java' |
| abs_path = os.path.join(root_dir, folder) |
| mock_walk.return_value = [(root_dir, [folder], [target])] |
| self.assertTrue(native_util._check_java_file_exists(abs_path)) |
| target = 'test.cpp' |
| mock_walk.return_value = [(root_dir, [folder], [target])] |
| self.assertFalse(native_util._check_java_file_exists(abs_path)) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |