#!/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 source_locator."""
|
|
import os
|
import shutil
|
import tempfile
|
import unittest
|
from unittest import mock
|
|
from aidegen import constant
|
from aidegen import unittest_constants as uc
|
from aidegen.lib import source_locator
|
|
_MODULE_NAME = 'test'
|
_MODULE_PATH = 'packages/apps/test'
|
_MODULE_INFO = {
|
'path': [_MODULE_PATH],
|
'srcs': [
|
'packages/apps/test/src/main/java/com/android/java.java',
|
'packages/apps/test/tests/com/android/test.java',
|
'packages/apps/test/tests/test.srcjar'
|
],
|
'dependencies': [],
|
'installed': []
|
}
|
_MODULE_DEPTH = 0
|
|
|
# pylint: disable=protected-access
|
# pylint: disable=invalid-name
|
class SourceLocatorUnittests(unittest.TestCase):
|
"""Unit tests for source_locator.py"""
|
|
def test_collect_srcs_paths(self):
|
"""Test _collect_srcs_paths create the source path list."""
|
result_source = set(['packages/apps/test/src/main/java'])
|
result_test = set(['packages/apps/test/tests'])
|
constant.ANDROID_ROOT_PATH = uc.TEST_DATA_PATH
|
module_data = source_locator.ModuleData(_MODULE_NAME, _MODULE_INFO,
|
_MODULE_DEPTH)
|
module_data._collect_srcs_paths()
|
self.assertEqual(module_data.src_dirs, result_source)
|
self.assertEqual(module_data.test_dirs, result_test)
|
|
def test_get_source_folder(self):
|
"""Test _get_source_folder process."""
|
# Test for getting the source path by parse package name from a java.
|
test_java = 'packages/apps/test/src/main/java/com/android/java.java'
|
result_source = 'packages/apps/test/src/main/java'
|
constant.ANDROID_ROOT_PATH = uc.TEST_DATA_PATH
|
module_data = source_locator.ModuleData(_MODULE_NAME, _MODULE_INFO,
|
_MODULE_DEPTH)
|
src_path = module_data._get_source_folder(test_java)
|
self.assertEqual(src_path, result_source)
|
|
# Return path is None if the java file doesn't exist.
|
test_java = 'file_not_exist.java'
|
src_path = module_data._get_source_folder(test_java)
|
self.assertEqual(src_path, None)
|
|
# Return path is None on the java file without package name.
|
test_java = ('packages/apps/test/src/main/java/com/android/'
|
'wrong_package.java')
|
src_path = module_data._get_source_folder(test_java)
|
self.assertEqual(src_path, None)
|
|
def test_append_jar_file(self):
|
"""Test _append_jar_file process."""
|
# Append an existing jar file path to module_data.jar_files.
|
test_jar_file = os.path.join(_MODULE_PATH, 'test.jar')
|
result_jar_list = set([test_jar_file])
|
constant.ANDROID_ROOT_PATH = uc.TEST_DATA_PATH
|
module_data = source_locator.ModuleData(_MODULE_NAME, _MODULE_INFO,
|
_MODULE_DEPTH)
|
module_data._append_jar_file(test_jar_file)
|
self.assertEqual(module_data.jar_files, result_jar_list)
|
|
# Skip if the jar file doesn't exist.
|
test_jar_file = os.path.join(_MODULE_PATH, 'jar_not_exist.jar')
|
module_data.jar_files = set()
|
module_data._append_jar_file(test_jar_file)
|
self.assertEqual(module_data.jar_files, set())
|
|
# Skip if it's not a jar file.
|
test_jar_file = os.path.join(_MODULE_PATH, 'test.java')
|
module_data.jar_files = set()
|
module_data._append_jar_file(test_jar_file)
|
self.assertEqual(module_data.jar_files, set())
|
|
def test_append_jar_from_installed(self):
|
"""Test _append_jar_from_installed handling."""
|
# Test appends the first jar file of 'installed'.
|
module_info = dict(_MODULE_INFO)
|
module_info['installed'] = [
|
os.path.join(_MODULE_PATH, 'test.aar'),
|
os.path.join(_MODULE_PATH, 'test.jar'),
|
os.path.join(_MODULE_PATH, 'tests/test_second.jar')
|
]
|
result_jar_list = set([os.path.join(_MODULE_PATH, 'test.jar')])
|
constant.ANDROID_ROOT_PATH = uc.TEST_DATA_PATH
|
module_data = source_locator.ModuleData(_MODULE_NAME, module_info,
|
_MODULE_DEPTH)
|
module_data._append_jar_from_installed()
|
self.assertEqual(module_data.jar_files, result_jar_list)
|
|
# Test on the jar file path matches the path prefix.
|
module_data.jar_files = set()
|
result_jar_list = set(
|
[os.path.join(_MODULE_PATH, 'tests/test_second.jar')])
|
module_data._append_jar_from_installed(
|
os.path.join(_MODULE_PATH, 'tests/'))
|
self.assertEqual(module_data.jar_files, result_jar_list)
|
|
def test_set_jars_jarfile(self):
|
"""Test _set_jars_jarfile handling."""
|
# Combine the module path with jar file name in 'jars' and then append
|
# it to module_data.jar_files.
|
module_info = dict(_MODULE_INFO)
|
module_info['jars'] = [
|
'test.jar',
|
'src/test.jar', # This jar file doesn't exist.
|
'tests/test_second.jar'
|
]
|
result_jar_list = set([
|
os.path.join(_MODULE_PATH, 'test.jar'),
|
os.path.join(_MODULE_PATH, 'tests/test_second.jar')
|
])
|
constant.ANDROID_ROOT_PATH = uc.TEST_DATA_PATH
|
module_data = source_locator.ModuleData(_MODULE_NAME, module_info,
|
_MODULE_DEPTH)
|
module_data._set_jars_jarfile()
|
self.assertEqual(module_data.jar_files, result_jar_list)
|
|
def test_locate_sources_path(self):
|
"""Test locate_sources_path handling."""
|
# Test collect source path.
|
module_info = dict(_MODULE_INFO)
|
result_src_list = set(['packages/apps/test/src/main/java',
|
'out/target/common/R'])
|
result_test_list = set(['packages/apps/test/tests'])
|
result_jar_list = set()
|
constant.ANDROID_ROOT_PATH = uc.TEST_DATA_PATH
|
module_data = source_locator.ModuleData(_MODULE_NAME, module_info,
|
_MODULE_DEPTH)
|
module_data.locate_sources_path()
|
self.assertEqual(module_data.src_dirs, result_src_list)
|
self.assertEqual(module_data.test_dirs, result_test_list)
|
self.assertEqual(module_data.jar_files, result_jar_list)
|
|
# Test find jar files.
|
jar_file = ('out/soong/.intermediates/packages/apps/test/test/'
|
'android_common/test.jar')
|
module_info['jarjar_rules'] = ['jarjar-rules.txt']
|
module_info['installed'] = [jar_file]
|
result_jar_list = set([jar_file])
|
module_data = source_locator.ModuleData(_MODULE_NAME, module_info,
|
_MODULE_DEPTH)
|
module_data.locate_sources_path()
|
self.assertEqual(module_data.jar_files, result_jar_list)
|
|
# Test find jar by srcjar.
|
module_info = dict(_MODULE_INFO)
|
module_info['srcs'].extend(
|
[('out/soong/.intermediates/packages/apps/test/test/android_common/'
|
'gen/test.srcjar')])
|
module_info['installed'] = [
|
('out/soong/.intermediates/packages/apps/test/test/android_common/'
|
'test.jar')
|
]
|
result_jar_list = set([
|
jar_file,
|
('out/soong/.intermediates/packages/apps/test/test/'
|
'android_common/test.jar')
|
])
|
module_data = source_locator.ModuleData(_MODULE_NAME, module_info,
|
_MODULE_DEPTH)
|
module_data.locate_sources_path()
|
self.assertEqual(module_data.jar_files, result_jar_list)
|
|
def test_collect_jar_by_depth_value(self):
|
"""Test parameter --depth handling."""
|
# Test find jar by module's depth greater than the --depth value from
|
# command line.
|
depth_by_source = 2
|
module_info = dict(_MODULE_INFO)
|
module_info['depth'] = 3
|
module_info['installed'] = [
|
('out/soong/.intermediates/packages/apps/test/test/android_common/'
|
'test.jar')
|
]
|
result_src_list = set()
|
result_jar_list = set(
|
[('out/soong/.intermediates/packages/apps/test/test/'
|
'android_common/test.jar')])
|
constant.ANDROID_ROOT_PATH = uc.TEST_DATA_PATH
|
module_data = source_locator.ModuleData(_MODULE_NAME, module_info,
|
depth_by_source)
|
module_data.locate_sources_path()
|
self.assertEqual(module_data.src_dirs, result_src_list)
|
self.assertEqual(module_data.jar_files, result_jar_list)
|
|
# Test find source folder when module's depth equal to the --depth value
|
# from command line.
|
depth_by_source = 2
|
module_info = dict(_MODULE_INFO)
|
module_info['depth'] = 2
|
result_src_list = set(['packages/apps/test/src/main/java',
|
'out/target/common/R'])
|
result_test_list = set(['packages/apps/test/tests'])
|
result_jar_list = set()
|
module_data = source_locator.ModuleData(_MODULE_NAME, module_info,
|
depth_by_source)
|
module_data.locate_sources_path()
|
self.assertEqual(module_data.src_dirs, result_src_list)
|
self.assertEqual(module_data.test_dirs, result_test_list)
|
self.assertEqual(module_data.jar_files, result_jar_list)
|
|
# Test find source folder when module's depth smaller than the --depth
|
# value from command line.
|
depth_by_source = 3
|
module_info = dict(_MODULE_INFO)
|
module_info['depth'] = 2
|
result_src_list = set(['packages/apps/test/src/main/java',
|
'out/target/common/R'])
|
result_test_list = set(['packages/apps/test/tests'])
|
result_jar_list = set()
|
module_data = source_locator.ModuleData(_MODULE_NAME, module_info,
|
depth_by_source)
|
module_data.locate_sources_path()
|
self.assertEqual(module_data.src_dirs, result_src_list)
|
self.assertEqual(module_data.test_dirs, result_test_list)
|
self.assertEqual(module_data.jar_files, result_jar_list)
|
|
@mock.patch('aidegen.lib.project_info.ProjectInfo')
|
@mock.patch('atest.atest_utils.build')
|
def test_locate_source(self, mock_atest_utils_build, mock_project_info):
|
"""Test locate_source handling."""
|
mock_atest_utils_build.build.return_value = True
|
test_root_path = os.path.join(tempfile.mkdtemp(), 'test')
|
shutil.copytree(uc.TEST_DATA_PATH, test_root_path)
|
constant.ANDROID_ROOT_PATH = test_root_path
|
generated_jar = ('out/soong/.intermediates/packages/apps/test/test/'
|
'android_common/generated.jar')
|
module_info = dict(_MODULE_INFO)
|
module_info['srcs'].extend(
|
[('out/soong/.intermediates/packages/apps/test/test/android_common/'
|
'gen/test.srcjar')])
|
module_info['installed'] = [generated_jar]
|
mock_project_info.dep_modules = {'test': module_info}
|
mock_project_info.source_path = {
|
'source_folder_path': set(),
|
'test_folder_path': set(),
|
'jar_path': set(),
|
'jar_module_path': dict(),
|
}
|
# Show warning when the jar not exists after build the module.
|
result_jar = set()
|
source_locator.locate_source(mock_project_info, False, 0,
|
constant.IDE_INTELLIJ, True)
|
self.assertEqual(mock_project_info.source_path['jar_path'], result_jar)
|
|
# Test on jar exists.
|
jar_abspath = os.path.join(test_root_path, generated_jar)
|
result_jar = set([generated_jar])
|
result_jar_module_path = dict({generated_jar: module_info['path'][0]})
|
try:
|
open(jar_abspath, 'w').close()
|
source_locator.locate_source(mock_project_info, False, 0,
|
constant.IDE_INTELLIJ, False)
|
self.assertEqual(mock_project_info.source_path['jar_path'],
|
result_jar)
|
self.assertEqual(mock_project_info.source_path['jar_module_path'],
|
result_jar_module_path)
|
finally:
|
shutil.rmtree(test_root_path)
|
|
# Test collects source and test folders.
|
result_source = set(['packages/apps/test/src/main/java',
|
'out/target/common/R'])
|
result_test = set(['packages/apps/test/tests'])
|
self.assertEqual(mock_project_info.source_path['source_folder_path'],
|
result_source)
|
self.assertEqual(mock_project_info.source_path['test_folder_path'],
|
result_test)
|
|
# Test loading jar from dependencies parameter.
|
default_jar = os.path.join(_MODULE_PATH, 'test.jar')
|
module_info['dependencies'] = [default_jar]
|
result_jar = set([generated_jar, default_jar])
|
source_locator.locate_source(mock_project_info, False, 0,
|
constant.IDE_INTELLIJ, False)
|
self.assertEqual(mock_project_info.source_path['jar_path'], result_jar)
|
|
|
if __name__ == '__main__':
|
unittest.main()
|