#!/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()