blob: 69cae6c3419684ad5885d374d3e53f6798912a15 [file] [log] [blame]
mikehoranbe9102f2017-08-04 16:04:03 -07001#!/usr/bin/env python
2#
3# Copyright 2017, The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17"""Unittests for cli_translator."""
18
19import unittest
mikehoran1e50d2b2017-08-28 14:00:46 -070020import os
mikehoran9e62c292018-01-31 12:05:19 -080021import re
mikehoranbe9102f2017-08-04 16:04:03 -070022import mock
23
24import cli_translator as cli_t
Dan Shi7a8e1ad2018-04-12 11:01:07 -070025import constants
Kevin Cheng8b2c94c2017-12-18 14:43:26 -080026import test_finder_handler
Dan Shicdbda552018-05-18 23:31:33 -070027import test_mapping
Kevin Cheng8b2c94c2017-12-18 14:43:26 -080028import unittest_constants as uc
Kevin Cheng7edb0b92017-12-14 15:00:25 -080029import unittest_utils
Kevin Cheng8b2c94c2017-12-18 14:43:26 -080030from test_finders import test_finder_base
mikehoranbe9102f2017-08-04 16:04:03 -070031
Dan Shid6881bb2017-10-12 15:13:25 -070032# TEST_MAPPING related consts
Dan Shie4e267f2018-06-01 11:31:57 -070033TEST_MAPPING_TOP_DIR = os.path.join(uc.TEST_DATA_DIR, 'test_mapping')
34TEST_MAPPING_DIR = os.path.join(TEST_MAPPING_TOP_DIR, 'folder1')
35TEST_1 = test_mapping.TestDetail({'name': 'test1'})
36TEST_2 = test_mapping.TestDetail({'name': 'test2'})
37TEST_3 = test_mapping.TestDetail({'name': 'test3'})
38TEST_4 = test_mapping.TestDetail({'name': 'test4'})
Dan Shi350e7472018-06-19 12:25:32 -070039TEST_5 = test_mapping.TestDetail({'name': 'test5'})
40TEST_6 = test_mapping.TestDetail({'name': 'test6'})
41TEST_7 = test_mapping.TestDetail({'name': 'test7'})
42TEST_8 = test_mapping.TestDetail({'name': 'test8'})
43TEST_9 = test_mapping.TestDetail({'name': 'test9'})
44TEST_10 = test_mapping.TestDetail({'name': 'test10'})
Dan Shid6881bb2017-10-12 15:13:25 -070045
mikehoran9e62c292018-01-31 12:05:19 -080046SEARCH_DIR_RE = re.compile(r'^find ([^ ]*).*$')
47
mikehoran58a68c42017-08-30 13:18:21 -070048
Dan Shicdbda552018-05-18 23:31:33 -070049#pylint: disable=unused-argument
50def gettestinfos_side_effect(test_names, test_mapping_test_details=None):
Kevin Cheng09c2a2c2017-12-15 12:52:46 -080051 """Mock return values for _get_test_info."""
Kevin Cheng8b2c94c2017-12-18 14:43:26 -080052 test_infos = set()
53 for test_name in test_names:
54 if test_name == uc.MODULE_NAME:
55 test_infos.add(uc.MODULE_INFO)
56 if test_name == uc.CLASS_NAME:
57 test_infos.add(uc.CLASS_INFO)
58 return test_infos
mikehoran58a68c42017-08-30 13:18:21 -070059
mikehoran9e62c292018-01-31 12:05:19 -080060
mikehoranbe9102f2017-08-04 16:04:03 -070061#pylint: disable=protected-access
mikehoran43ed32d2017-08-18 17:13:36 -070062#pylint: disable=no-self-use
mikehoranbe9102f2017-08-04 16:04:03 -070063class CLITranslatorUnittests(unittest.TestCase):
64 """Unit tests for cli_t.py"""
65
66 def setUp(self):
67 """Run before execution of every test"""
Kevin Cheng8b2c94c2017-12-18 14:43:26 -080068 self.ctr = cli_t.CLITranslator()
mikehoranbe9102f2017-08-04 16:04:03 -070069
Dan Shi0ddd3e42018-05-30 11:24:30 -070070 # Create a mock of args.
71 self.args = mock.Mock
72 self.args.tests = []
73 # Test mapping related args
74 self.args.test_mapping = False
75 self.args.include_subdirs = False
Simran Basi2cc996e2018-10-09 12:19:25 -070076 self.ctr.mod_info = mock.Mock
77 self.ctr.mod_info.name_to_module_info = {}
Dan Shi0ddd3e42018-05-30 11:24:30 -070078
Jim Tangae8eb442018-10-29 16:42:33 +080079 def tearDown(self):
80 """Run after execution of every test"""
81 reload(uc)
82
Kevin Cheng8b2c94c2017-12-18 14:43:26 -080083 @mock.patch.object(test_finder_handler, 'get_find_methods_for_test')
84 def test_get_test_infos(self, mock_getfindmethods):
85 """Test _get_test_infos method."""
86 ctr = cli_t.CLITranslator()
87 find_method_return_module_info = lambda x, y: uc.MODULE_INFO
88 # pylint: disable=invalid-name
89 find_method_return_module_class_info = (lambda x, test: uc.MODULE_INFO
90 if test == uc.MODULE_NAME
91 else uc.CLASS_INFO)
92 find_method_return_nothing = lambda x, y: None
93 one_test = [uc.MODULE_NAME]
94 mult_test = [uc.MODULE_NAME, uc.CLASS_NAME]
mikehoran43ed32d2017-08-18 17:13:36 -070095
Kevin Cheng8b2c94c2017-12-18 14:43:26 -080096 # Let's make sure we return what we expect.
97 expected_test_infos = {uc.MODULE_INFO}
98 mock_getfindmethods.return_value = [
nelsonli34997d52018-08-17 09:43:28 +080099 test_finder_base.Finder(None, find_method_return_module_info, None)]
Kevin Cheng8b2c94c2017-12-18 14:43:26 -0800100 unittest_utils.assert_strict_equal(
101 self, ctr._get_test_infos(one_test), expected_test_infos)
102
103 # Check we receive multiple test infos.
104 expected_test_infos = {uc.MODULE_INFO, uc.CLASS_INFO}
105 mock_getfindmethods.return_value = [
nelsonli34997d52018-08-17 09:43:28 +0800106 test_finder_base.Finder(None, find_method_return_module_class_info,
107 None)]
Kevin Cheng8b2c94c2017-12-18 14:43:26 -0800108 unittest_utils.assert_strict_equal(
109 self, ctr._get_test_infos(mult_test), expected_test_infos)
110
nelsonlic4a71452018-09-13 14:10:30 +0800111 # Check return null set when we have no tests found.
Kevin Cheng8b2c94c2017-12-18 14:43:26 -0800112 mock_getfindmethods.return_value = [
nelsonli34997d52018-08-17 09:43:28 +0800113 test_finder_base.Finder(None, find_method_return_nothing, None)]
nelsonlic4a71452018-09-13 14:10:30 +0800114 null_test_info = set()
115 self.assertEqual(null_test_info, ctr._get_test_infos(one_test))
116 self.assertEqual(null_test_info, ctr._get_test_infos(mult_test))
Kevin Cheng8b2c94c2017-12-18 14:43:26 -0800117
Dan Shicdbda552018-05-18 23:31:33 -0700118 # Check the method works for test mapping.
119 test_detail1 = test_mapping.TestDetail(uc.TEST_MAPPING_TEST)
120 test_detail2 = test_mapping.TestDetail(uc.TEST_MAPPING_TEST_WITH_OPTION)
121 expected_test_infos = {uc.MODULE_INFO, uc.CLASS_INFO}
122 mock_getfindmethods.return_value = [
nelsonli34997d52018-08-17 09:43:28 +0800123 test_finder_base.Finder(None, find_method_return_module_class_info,
124 None)]
Dan Shicdbda552018-05-18 23:31:33 -0700125 test_infos = ctr._get_test_infos(
126 mult_test, [test_detail1, test_detail2])
127 unittest_utils.assert_strict_equal(
128 self, test_infos, expected_test_infos)
129 for test_info in test_infos:
130 if test_info == uc.MODULE_INFO:
131 self.assertEqual(
132 test_detail1.options,
133 test_info.data[constants.TI_MODULE_ARG])
134 else:
135 self.assertEqual(
136 test_detail2.options,
137 test_info.data[constants.TI_MODULE_ARG])
138
Kevin Cheng8b2c94c2017-12-18 14:43:26 -0800139 @mock.patch.object(cli_t.CLITranslator, '_get_test_infos',
140 side_effect=gettestinfos_side_effect)
Dan Shi0ddd3e42018-05-30 11:24:30 -0700141 def test_translate_class(self, _info):
142 """Test translate method for tests by class name."""
Kevin Cheng8b2c94c2017-12-18 14:43:26 -0800143 # Check that we can find a class.
Dan Shi0ddd3e42018-05-30 11:24:30 -0700144 self.args.tests = [uc.CLASS_NAME]
145 targets, test_infos = self.ctr.translate(self.args)
Dan Shi7a8e1ad2018-04-12 11:01:07 -0700146 unittest_utils.assert_strict_equal(
147 self, targets, uc.CLASS_BUILD_TARGETS)
Kevin Cheng8b2c94c2017-12-18 14:43:26 -0800148 unittest_utils.assert_strict_equal(self, test_infos, {uc.CLASS_INFO})
mikehoranbe9102f2017-08-04 16:04:03 -0700149
Dan Shi0ddd3e42018-05-30 11:24:30 -0700150 @mock.patch.object(cli_t.CLITranslator, '_get_test_infos',
151 side_effect=gettestinfos_side_effect)
152 def test_translate_module(self, _info):
153 """Test translate method for tests by module or class name."""
Kevin Cheng8b2c94c2017-12-18 14:43:26 -0800154 # Check that we get all the build targets we expect.
Dan Shi0ddd3e42018-05-30 11:24:30 -0700155 self.args.tests = [uc.MODULE_NAME, uc.CLASS_NAME]
156 targets, test_infos = self.ctr.translate(self.args)
Dan Shi7a8e1ad2018-04-12 11:01:07 -0700157 unittest_utils.assert_strict_equal(
158 self, targets, uc.MODULE_CLASS_COMBINED_BUILD_TARGETS)
Kevin Cheng8b2c94c2017-12-18 14:43:26 -0800159 unittest_utils.assert_strict_equal(self, test_infos, {uc.MODULE_INFO,
160 uc.CLASS_INFO})
161
Dan Shi0ddd3e42018-05-30 11:24:30 -0700162 @mock.patch.object(cli_t.CLITranslator, '_find_tests_by_test_mapping')
163 @mock.patch.object(cli_t.CLITranslator, '_get_test_infos',
164 side_effect=gettestinfos_side_effect)
165 def test_translate_test_mapping(self, _info, mock_testmapping):
166 """Test translate method for tests in test mapping."""
Kevin Cheng8b2c94c2017-12-18 14:43:26 -0800167 # Check that test mappings feeds into get_test_info properly.
Dan Shicdbda552018-05-18 23:31:33 -0700168 test_detail1 = test_mapping.TestDetail(uc.TEST_MAPPING_TEST)
169 test_detail2 = test_mapping.TestDetail(uc.TEST_MAPPING_TEST_WITH_OPTION)
170 mock_testmapping.return_value = ([test_detail1, test_detail2], None)
Dan Shi0ddd3e42018-05-30 11:24:30 -0700171 self.args.tests = []
172 targets, test_infos = self.ctr.translate(self.args)
Dan Shi7a8e1ad2018-04-12 11:01:07 -0700173 unittest_utils.assert_strict_equal(
174 self, targets, uc.MODULE_CLASS_COMBINED_BUILD_TARGETS)
Kevin Cheng8b2c94c2017-12-18 14:43:26 -0800175 unittest_utils.assert_strict_equal(self, test_infos, {uc.MODULE_INFO,
176 uc.CLASS_INFO})
177
Dan Shie4e267f2018-06-01 11:31:57 -0700178 @mock.patch.object(cli_t.CLITranslator, '_find_tests_by_test_mapping')
179 @mock.patch.object(cli_t.CLITranslator, '_get_test_infos',
180 side_effect=gettestinfos_side_effect)
181 def test_translate_test_mapping_all(self, _info, mock_testmapping):
182 """Test translate method for tests in test mapping."""
183 # Check that test mappings feeds into get_test_info properly.
184 test_detail1 = test_mapping.TestDetail(uc.TEST_MAPPING_TEST)
185 test_detail2 = test_mapping.TestDetail(uc.TEST_MAPPING_TEST_WITH_OPTION)
186 mock_testmapping.return_value = ([test_detail1, test_detail2], None)
187 self.args.tests = ['src_path:all']
188 self.args.test_mapping = True
189 targets, test_infos = self.ctr.translate(self.args)
190 unittest_utils.assert_strict_equal(
191 self, targets, uc.MODULE_CLASS_COMBINED_BUILD_TARGETS)
192 unittest_utils.assert_strict_equal(self, test_infos, {uc.MODULE_INFO,
193 uc.CLASS_INFO})
194
195 def test_find_tests_by_test_mapping_presubmit(self):
196 """Test _find_tests_by_test_mapping method to locate presubmit tests."""
Dan Shi350e7472018-06-19 12:25:32 -0700197 os_environ_mock = {constants.ANDROID_BUILD_TOP: uc.TEST_DATA_DIR}
198 with mock.patch.dict('os.environ', os_environ_mock, clear=True):
199 tests, all_tests = self.ctr._find_tests_by_test_mapping(
200 path=TEST_MAPPING_DIR, file_name='test_mapping_sample',
201 checked_files=set())
202 expected = set([TEST_1, TEST_2, TEST_5, TEST_7, TEST_9])
Dan Shi7a8e1ad2018-04-12 11:01:07 -0700203 expected_all_tests = {'presubmit': expected,
Dan Shi350e7472018-06-19 12:25:32 -0700204 'postsubmit': set(
205 [TEST_3, TEST_6, TEST_8, TEST_10]),
Dan Shie4e267f2018-06-01 11:31:57 -0700206 'other_group': set([TEST_4])}
Dan Shi7a8e1ad2018-04-12 11:01:07 -0700207 self.assertEqual(expected, tests)
208 self.assertEqual(expected_all_tests, all_tests)
Dan Shid6881bb2017-10-12 15:13:25 -0700209
Dan Shie4e267f2018-06-01 11:31:57 -0700210 def test_find_tests_by_test_mapping_postsubmit(self):
Dan Shi350e7472018-06-19 12:25:32 -0700211 """Test _find_tests_by_test_mapping method to locate postsubmit tests.
212 """
213 os_environ_mock = {constants.ANDROID_BUILD_TOP: uc.TEST_DATA_DIR}
214 with mock.patch.dict('os.environ', os_environ_mock, clear=True):
215 tests, all_tests = self.ctr._find_tests_by_test_mapping(
216 path=TEST_MAPPING_DIR,
217 test_group=constants.TEST_GROUP_POSTSUBMIT,
218 file_name='test_mapping_sample', checked_files=set())
219 expected_presubmit = set([TEST_1, TEST_2, TEST_5, TEST_7, TEST_9])
220 expected = set(
221 [TEST_1, TEST_2, TEST_3, TEST_5, TEST_6, TEST_7, TEST_8, TEST_9,
222 TEST_10])
Dan Shie4e267f2018-06-01 11:31:57 -0700223 expected_all_tests = {'presubmit': expected_presubmit,
Dan Shi350e7472018-06-19 12:25:32 -0700224 'postsubmit': set(
225 [TEST_3, TEST_6, TEST_8, TEST_10]),
Dan Shie4e267f2018-06-01 11:31:57 -0700226 'other_group': set([TEST_4])}
Dan Shi7a8e1ad2018-04-12 11:01:07 -0700227 self.assertEqual(expected, tests)
228 self.assertEqual(expected_all_tests, all_tests)
Dan Shid6881bb2017-10-12 15:13:25 -0700229
Dan Shie4e267f2018-06-01 11:31:57 -0700230 def test_find_tests_by_test_mapping_all_group(self):
Dan Shi350e7472018-06-19 12:25:32 -0700231 """Test _find_tests_by_test_mapping method to locate postsubmit tests.
232 """
233 os_environ_mock = {constants.ANDROID_BUILD_TOP: uc.TEST_DATA_DIR}
234 with mock.patch.dict('os.environ', os_environ_mock, clear=True):
235 tests, all_tests = self.ctr._find_tests_by_test_mapping(
236 path=TEST_MAPPING_DIR, test_group=constants.TEST_GROUP_ALL,
237 file_name='test_mapping_sample', checked_files=set())
238 expected_presubmit = set([TEST_1, TEST_2, TEST_5, TEST_7, TEST_9])
239 expected = set([
240 TEST_1, TEST_2, TEST_3, TEST_4, TEST_5, TEST_6, TEST_7, TEST_8,
241 TEST_9, TEST_10])
Dan Shie4e267f2018-06-01 11:31:57 -0700242 expected_all_tests = {'presubmit': expected_presubmit,
Dan Shi350e7472018-06-19 12:25:32 -0700243 'postsubmit': set(
244 [TEST_3, TEST_6, TEST_8, TEST_10]),
Dan Shie4e267f2018-06-01 11:31:57 -0700245 'other_group': set([TEST_4])}
246 self.assertEqual(expected, tests)
247 self.assertEqual(expected_all_tests, all_tests)
248
249 def test_find_tests_by_test_mapping_include_subdir(self):
250 """Test _find_tests_by_test_mapping method to include sub directory."""
Dan Shi350e7472018-06-19 12:25:32 -0700251 os_environ_mock = {constants.ANDROID_BUILD_TOP: uc.TEST_DATA_DIR}
252 with mock.patch.dict('os.environ', os_environ_mock, clear=True):
253 tests, all_tests = self.ctr._find_tests_by_test_mapping(
254 path=TEST_MAPPING_TOP_DIR, file_name='test_mapping_sample',
255 include_subdirs=True, checked_files=set())
256 expected = set([TEST_1, TEST_2, TEST_5, TEST_7, TEST_9])
Dan Shie4e267f2018-06-01 11:31:57 -0700257 expected_all_tests = {'presubmit': expected,
Dan Shi350e7472018-06-19 12:25:32 -0700258 'postsubmit': set([
259 TEST_3, TEST_6, TEST_8, TEST_10]),
Dan Shie4e267f2018-06-01 11:31:57 -0700260 'other_group': set([TEST_4])}
261 self.assertEqual(expected, tests)
262 self.assertEqual(expected_all_tests, all_tests)
263
264
mikehoranbe9102f2017-08-04 16:04:03 -0700265if __name__ == '__main__':
266 unittest.main()