blob: de164f1bcf8fb373d103068bbfbe718b4d1203a5 [file] [log] [blame]
#!/usr/bin/env python
#
# Copyright 2017, 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 cli_translator."""
import unittest
import os
import re
import mock
import atest_error
import cli_translator as cli_t
import constants
import test_finder_handler
import test_mapping
import unittest_constants as uc
import unittest_utils
from test_finders import test_finder_base
# TEST_MAPPING related consts
TEST_MAPPING_DIR = os.path.join(uc.TEST_DATA_DIR, 'test_mapping', 'folder1')
SEARCH_DIR_RE = re.compile(r'^find ([^ ]*).*$')
#pylint: disable=unused-argument
def gettestinfos_side_effect(test_names, test_mapping_test_details=None):
"""Mock return values for _get_test_info."""
test_infos = set()
for test_name in test_names:
if test_name == uc.MODULE_NAME:
test_infos.add(uc.MODULE_INFO)
if test_name == uc.CLASS_NAME:
test_infos.add(uc.CLASS_INFO)
return test_infos
#pylint: disable=protected-access
#pylint: disable=no-self-use
class CLITranslatorUnittests(unittest.TestCase):
"""Unit tests for cli_t.py"""
def setUp(self):
"""Run before execution of every test"""
self.ctr = cli_t.CLITranslator()
@mock.patch.object(test_finder_handler, 'get_find_methods_for_test')
def test_get_test_infos(self, mock_getfindmethods):
"""Test _get_test_infos method."""
ctr = cli_t.CLITranslator()
find_method_return_module_info = lambda x, y: uc.MODULE_INFO
# pylint: disable=invalid-name
find_method_return_module_class_info = (lambda x, test: uc.MODULE_INFO
if test == uc.MODULE_NAME
else uc.CLASS_INFO)
find_method_return_nothing = lambda x, y: None
one_test = [uc.MODULE_NAME]
mult_test = [uc.MODULE_NAME, uc.CLASS_NAME]
# Let's make sure we return what we expect.
expected_test_infos = {uc.MODULE_INFO}
mock_getfindmethods.return_value = [
test_finder_base.Finder(None, find_method_return_module_info)]
unittest_utils.assert_strict_equal(
self, ctr._get_test_infos(one_test), expected_test_infos)
# Check we receive multiple test infos.
expected_test_infos = {uc.MODULE_INFO, uc.CLASS_INFO}
mock_getfindmethods.return_value = [
test_finder_base.Finder(None, find_method_return_module_class_info)]
unittest_utils.assert_strict_equal(
self, ctr._get_test_infos(mult_test), expected_test_infos)
# Let's make sure we raise an error when we have no tests found.
mock_getfindmethods.return_value = [
test_finder_base.Finder(None, find_method_return_nothing)]
self.assertRaises(atest_error.NoTestFoundError, ctr._get_test_infos,
one_test)
# Check the method works for test mapping.
test_detail1 = test_mapping.TestDetail(uc.TEST_MAPPING_TEST)
test_detail2 = test_mapping.TestDetail(uc.TEST_MAPPING_TEST_WITH_OPTION)
expected_test_infos = {uc.MODULE_INFO, uc.CLASS_INFO}
mock_getfindmethods.return_value = [
test_finder_base.Finder(None, find_method_return_module_class_info)]
test_infos = ctr._get_test_infos(
mult_test, [test_detail1, test_detail2])
unittest_utils.assert_strict_equal(
self, test_infos, expected_test_infos)
for test_info in test_infos:
if test_info == uc.MODULE_INFO:
self.assertEqual(
test_detail1.options,
test_info.data[constants.TI_MODULE_ARG])
else:
self.assertEqual(
test_detail2.options,
test_info.data[constants.TI_MODULE_ARG])
@mock.patch.object(cli_t.CLITranslator, '_find_tests_by_test_mapping')
@mock.patch.object(cli_t.CLITranslator, '_get_test_infos',
side_effect=gettestinfos_side_effect)
#pylint: disable=unused-argument
def test_translate(self, _info, mock_testmapping):
"""Test translate method."""
# Check that we can find a class.
targets, test_infos = self.ctr.translate([uc.CLASS_NAME])
unittest_utils.assert_strict_equal(
self, targets, uc.CLASS_BUILD_TARGETS)
unittest_utils.assert_strict_equal(self, test_infos, {uc.CLASS_INFO})
# Check that we get all the build targets we expect.
targets, test_infos = self.ctr.translate([uc.MODULE_NAME,
uc.CLASS_NAME])
unittest_utils.assert_strict_equal(
self, targets, uc.MODULE_CLASS_COMBINED_BUILD_TARGETS)
unittest_utils.assert_strict_equal(self, test_infos, {uc.MODULE_INFO,
uc.CLASS_INFO})
# Check that test mappings feeds into get_test_info properly.
test_detail1 = test_mapping.TestDetail(uc.TEST_MAPPING_TEST)
test_detail2 = test_mapping.TestDetail(uc.TEST_MAPPING_TEST_WITH_OPTION)
mock_testmapping.return_value = ([test_detail1, test_detail2], None)
targets, test_infos = self.ctr.translate([])
unittest_utils.assert_strict_equal(
self, targets, uc.MODULE_CLASS_COMBINED_BUILD_TARGETS)
unittest_utils.assert_strict_equal(self, test_infos, {uc.MODULE_INFO,
uc.CLASS_INFO})
def test_find_tests_by_test_mapping(self):
"""Test _find_tests_by_test_mapping method."""
tests, all_tests = self.ctr._find_tests_by_test_mapping(
path=TEST_MAPPING_DIR, file_name='test_mapping_sample')
expected = set(['test2', 'test1'])
expected_all_tests = {'presubmit': expected,
'postsubmit': set(['test3'])}
self.assertEqual(expected, tests)
self.assertEqual(expected_all_tests, all_tests)
tests, all_tests = self.ctr._find_tests_by_test_mapping(
path=TEST_MAPPING_DIR, test_group=constants.TEST_GROUP_POSTSUBMIT,
file_name='test_mapping_sample')
expected = set(['test1', 'test2', 'test3'])
self.assertEqual(expected, tests)
self.assertEqual(expected_all_tests, all_tests)
if __name__ == '__main__':
unittest.main()