| #!/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 test_runner_handler.""" |
| |
| # pylint: disable=protected-access |
| |
| import unittest |
| import mock |
| |
| import atest_error |
| import test_runner_handler |
| from metrics import metrics |
| from test_finders import test_info |
| from test_runners import test_runner_base as tr_base |
| |
| FAKE_TR_NAME_A = 'FakeTestRunnerA' |
| FAKE_TR_NAME_B = 'FakeTestRunnerB' |
| MISSING_TR_NAME = 'MissingTestRunner' |
| FAKE_TR_A_REQS = {'fake_tr_A_req1', 'fake_tr_A_req2'} |
| FAKE_TR_B_REQS = {'fake_tr_B_req1', 'fake_tr_B_req2'} |
| MODULE_NAME_A = 'ModuleNameA' |
| MODULE_NAME_A_AGAIN = 'ModuleNameA_AGAIN' |
| MODULE_NAME_B = 'ModuleNameB' |
| MODULE_NAME_B_AGAIN = 'ModuleNameB_AGAIN' |
| MODULE_INFO_A = test_info.TestInfo(MODULE_NAME_A, FAKE_TR_NAME_A, set()) |
| MODULE_INFO_A_AGAIN = test_info.TestInfo(MODULE_NAME_A_AGAIN, FAKE_TR_NAME_A, |
| set()) |
| MODULE_INFO_B = test_info.TestInfo(MODULE_NAME_B, FAKE_TR_NAME_B, set()) |
| MODULE_INFO_B_AGAIN = test_info.TestInfo(MODULE_NAME_B_AGAIN, FAKE_TR_NAME_B, |
| set()) |
| BAD_TESTINFO = test_info.TestInfo('bad_name', MISSING_TR_NAME, set()) |
| |
| class FakeTestRunnerA(tr_base.TestRunnerBase): |
| """Fake test runner A.""" |
| |
| NAME = FAKE_TR_NAME_A |
| EXECUTABLE = 'echo' |
| |
| def run_tests(self, test_infos, extra_args, reporter): |
| return 0 |
| |
| def host_env_check(self): |
| pass |
| |
| def get_test_runner_build_reqs(self): |
| return FAKE_TR_A_REQS |
| |
| def generate_run_commands(self, test_infos, extra_args, port=None): |
| return ['fake command'] |
| |
| |
| class FakeTestRunnerB(FakeTestRunnerA): |
| """Fake test runner B.""" |
| |
| NAME = FAKE_TR_NAME_B |
| |
| def run_tests(self, test_infos, extra_args, reporter): |
| return 1 |
| |
| def get_test_runner_build_reqs(self): |
| return FAKE_TR_B_REQS |
| |
| |
| class TestRunnerHandlerUnittests(unittest.TestCase): |
| """Unit tests for test_runner_handler.py""" |
| |
| _TEST_RUNNERS = { |
| FakeTestRunnerA.NAME: FakeTestRunnerA, |
| FakeTestRunnerB.NAME: FakeTestRunnerB, |
| } |
| |
| def setUp(self): |
| mock.patch('test_runner_handler._get_test_runners', |
| return_value=self._TEST_RUNNERS).start() |
| |
| def tearDown(self): |
| mock.patch.stopall() |
| |
| def test_group_tests_by_test_runners(self): |
| """Test that we properly group tests by test runners.""" |
| # Happy path testing. |
| test_infos = [MODULE_INFO_A, MODULE_INFO_A_AGAIN, MODULE_INFO_B, |
| MODULE_INFO_B_AGAIN] |
| want_list = [(FakeTestRunnerA, [MODULE_INFO_A, MODULE_INFO_A_AGAIN]), |
| (FakeTestRunnerB, [MODULE_INFO_B, MODULE_INFO_B_AGAIN])] |
| self.assertEqual( |
| want_list, |
| test_runner_handler.group_tests_by_test_runners(test_infos)) |
| |
| # Let's make sure we fail as expected. |
| self.assertRaises( |
| atest_error.UnknownTestRunnerError, |
| test_runner_handler.group_tests_by_test_runners, [BAD_TESTINFO]) |
| |
| def test_get_test_runner_reqs(self): |
| """Test that we get all the reqs from the test runners.""" |
| test_infos = [MODULE_INFO_A, MODULE_INFO_B] |
| want_set = FAKE_TR_A_REQS | FAKE_TR_B_REQS |
| empty_module_info = None |
| self.assertEqual( |
| want_set, |
| test_runner_handler.get_test_runner_reqs(empty_module_info, |
| test_infos)) |
| |
| @mock.patch.object(metrics, 'RunnerFinishEvent') |
| def test_run_all_tests(self, _mock_runner_finish): |
| """Test that the return value as we expected.""" |
| results_dir = "" |
| extra_args = [] |
| # Tests both run_tests return 0 |
| test_infos = [MODULE_INFO_A, MODULE_INFO_A_AGAIN] |
| self.assertEqual( |
| 0, |
| test_runner_handler.run_all_tests( |
| results_dir, test_infos, extra_args)[0]) |
| # Tests both run_tests return 1 |
| test_infos = [MODULE_INFO_B, MODULE_INFO_B_AGAIN] |
| self.assertEqual( |
| 1, |
| test_runner_handler.run_all_tests( |
| results_dir, test_infos, extra_args)[0]) |
| # Tests with on run_tests return 0, the other return 1 |
| test_infos = [MODULE_INFO_A, MODULE_INFO_B] |
| self.assertEqual( |
| 1, |
| test_runner_handler.run_all_tests( |
| results_dir, test_infos, extra_args)[0]) |
| |
| if __name__ == '__main__': |
| unittest.main() |