1*4882a593Smuzhiyun#!/usr/bin/env python3 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun# 4*4882a593Smuzhiyun# A collection of tests for tools/testing/kunit/kunit.py 5*4882a593Smuzhiyun# 6*4882a593Smuzhiyun# Copyright (C) 2019, Google LLC. 7*4882a593Smuzhiyun# Author: Brendan Higgins <brendanhiggins@google.com> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyunimport unittest 10*4882a593Smuzhiyunfrom unittest import mock 11*4882a593Smuzhiyun 12*4882a593Smuzhiyunimport tempfile, shutil # Handling test_tmpdir 13*4882a593Smuzhiyun 14*4882a593Smuzhiyunimport json 15*4882a593Smuzhiyunimport os 16*4882a593Smuzhiyun 17*4882a593Smuzhiyunimport kunit_config 18*4882a593Smuzhiyunimport kunit_parser 19*4882a593Smuzhiyunimport kunit_kernel 20*4882a593Smuzhiyunimport kunit_json 21*4882a593Smuzhiyunimport kunit 22*4882a593Smuzhiyun 23*4882a593Smuzhiyuntest_tmpdir = '' 24*4882a593Smuzhiyun 25*4882a593Smuzhiyundef setUpModule(): 26*4882a593Smuzhiyun global test_tmpdir 27*4882a593Smuzhiyun test_tmpdir = tempfile.mkdtemp() 28*4882a593Smuzhiyun 29*4882a593Smuzhiyundef tearDownModule(): 30*4882a593Smuzhiyun shutil.rmtree(test_tmpdir) 31*4882a593Smuzhiyun 32*4882a593Smuzhiyundef get_absolute_path(path): 33*4882a593Smuzhiyun return os.path.join(os.path.dirname(__file__), path) 34*4882a593Smuzhiyun 35*4882a593Smuzhiyunclass KconfigTest(unittest.TestCase): 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun def test_is_subset_of(self): 38*4882a593Smuzhiyun kconfig0 = kunit_config.Kconfig() 39*4882a593Smuzhiyun self.assertTrue(kconfig0.is_subset_of(kconfig0)) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun kconfig1 = kunit_config.Kconfig() 42*4882a593Smuzhiyun kconfig1.add_entry(kunit_config.KconfigEntry('TEST', 'y')) 43*4882a593Smuzhiyun self.assertTrue(kconfig1.is_subset_of(kconfig1)) 44*4882a593Smuzhiyun self.assertTrue(kconfig0.is_subset_of(kconfig1)) 45*4882a593Smuzhiyun self.assertFalse(kconfig1.is_subset_of(kconfig0)) 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun def test_read_from_file(self): 48*4882a593Smuzhiyun kconfig = kunit_config.Kconfig() 49*4882a593Smuzhiyun kconfig_path = get_absolute_path( 50*4882a593Smuzhiyun 'test_data/test_read_from_file.kconfig') 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun kconfig.read_from_file(kconfig_path) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun expected_kconfig = kunit_config.Kconfig() 55*4882a593Smuzhiyun expected_kconfig.add_entry( 56*4882a593Smuzhiyun kunit_config.KconfigEntry('UML', 'y')) 57*4882a593Smuzhiyun expected_kconfig.add_entry( 58*4882a593Smuzhiyun kunit_config.KconfigEntry('MMU', 'y')) 59*4882a593Smuzhiyun expected_kconfig.add_entry( 60*4882a593Smuzhiyun kunit_config.KconfigEntry('TEST', 'y')) 61*4882a593Smuzhiyun expected_kconfig.add_entry( 62*4882a593Smuzhiyun kunit_config.KconfigEntry('EXAMPLE_TEST', 'y')) 63*4882a593Smuzhiyun expected_kconfig.add_entry( 64*4882a593Smuzhiyun kunit_config.KconfigEntry('MK8', 'n')) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun self.assertEqual(kconfig.entries(), expected_kconfig.entries()) 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun def test_write_to_file(self): 69*4882a593Smuzhiyun kconfig_path = os.path.join(test_tmpdir, '.config') 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun expected_kconfig = kunit_config.Kconfig() 72*4882a593Smuzhiyun expected_kconfig.add_entry( 73*4882a593Smuzhiyun kunit_config.KconfigEntry('UML', 'y')) 74*4882a593Smuzhiyun expected_kconfig.add_entry( 75*4882a593Smuzhiyun kunit_config.KconfigEntry('MMU', 'y')) 76*4882a593Smuzhiyun expected_kconfig.add_entry( 77*4882a593Smuzhiyun kunit_config.KconfigEntry('TEST', 'y')) 78*4882a593Smuzhiyun expected_kconfig.add_entry( 79*4882a593Smuzhiyun kunit_config.KconfigEntry('EXAMPLE_TEST', 'y')) 80*4882a593Smuzhiyun expected_kconfig.add_entry( 81*4882a593Smuzhiyun kunit_config.KconfigEntry('MK8', 'n')) 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun expected_kconfig.write_to_file(kconfig_path) 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun actual_kconfig = kunit_config.Kconfig() 86*4882a593Smuzhiyun actual_kconfig.read_from_file(kconfig_path) 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun self.assertEqual(actual_kconfig.entries(), 89*4882a593Smuzhiyun expected_kconfig.entries()) 90*4882a593Smuzhiyun 91*4882a593Smuzhiyunclass KUnitParserTest(unittest.TestCase): 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun def assertContains(self, needle, haystack): 94*4882a593Smuzhiyun for line in haystack: 95*4882a593Smuzhiyun if needle in line: 96*4882a593Smuzhiyun return 97*4882a593Smuzhiyun raise AssertionError('"' + 98*4882a593Smuzhiyun str(needle) + '" not found in "' + str(haystack) + '"!') 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun def test_output_isolated_correctly(self): 101*4882a593Smuzhiyun log_path = get_absolute_path( 102*4882a593Smuzhiyun 'test_data/test_output_isolated_correctly.log') 103*4882a593Smuzhiyun file = open(log_path) 104*4882a593Smuzhiyun result = kunit_parser.isolate_kunit_output(file.readlines()) 105*4882a593Smuzhiyun self.assertContains('TAP version 14', result) 106*4882a593Smuzhiyun self.assertContains(' # Subtest: example', result) 107*4882a593Smuzhiyun self.assertContains(' 1..2', result) 108*4882a593Smuzhiyun self.assertContains(' ok 1 - example_simple_test', result) 109*4882a593Smuzhiyun self.assertContains(' ok 2 - example_mock_test', result) 110*4882a593Smuzhiyun self.assertContains('ok 1 - example', result) 111*4882a593Smuzhiyun file.close() 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun def test_output_with_prefix_isolated_correctly(self): 114*4882a593Smuzhiyun log_path = get_absolute_path( 115*4882a593Smuzhiyun 'test_data/test_pound_sign.log') 116*4882a593Smuzhiyun with open(log_path) as file: 117*4882a593Smuzhiyun result = kunit_parser.isolate_kunit_output(file.readlines()) 118*4882a593Smuzhiyun self.assertContains('TAP version 14', result) 119*4882a593Smuzhiyun self.assertContains(' # Subtest: kunit-resource-test', result) 120*4882a593Smuzhiyun self.assertContains(' 1..5', result) 121*4882a593Smuzhiyun self.assertContains(' ok 1 - kunit_resource_test_init_resources', result) 122*4882a593Smuzhiyun self.assertContains(' ok 2 - kunit_resource_test_alloc_resource', result) 123*4882a593Smuzhiyun self.assertContains(' ok 3 - kunit_resource_test_destroy_resource', result) 124*4882a593Smuzhiyun self.assertContains(' foo bar #', result) 125*4882a593Smuzhiyun self.assertContains(' ok 4 - kunit_resource_test_cleanup_resources', result) 126*4882a593Smuzhiyun self.assertContains(' ok 5 - kunit_resource_test_proper_free_ordering', result) 127*4882a593Smuzhiyun self.assertContains('ok 1 - kunit-resource-test', result) 128*4882a593Smuzhiyun self.assertContains(' foo bar # non-kunit output', result) 129*4882a593Smuzhiyun self.assertContains(' # Subtest: kunit-try-catch-test', result) 130*4882a593Smuzhiyun self.assertContains(' 1..2', result) 131*4882a593Smuzhiyun self.assertContains(' ok 1 - kunit_test_try_catch_successful_try_no_catch', 132*4882a593Smuzhiyun result) 133*4882a593Smuzhiyun self.assertContains(' ok 2 - kunit_test_try_catch_unsuccessful_try_does_catch', 134*4882a593Smuzhiyun result) 135*4882a593Smuzhiyun self.assertContains('ok 2 - kunit-try-catch-test', result) 136*4882a593Smuzhiyun self.assertContains(' # Subtest: string-stream-test', result) 137*4882a593Smuzhiyun self.assertContains(' 1..3', result) 138*4882a593Smuzhiyun self.assertContains(' ok 1 - string_stream_test_empty_on_creation', result) 139*4882a593Smuzhiyun self.assertContains(' ok 2 - string_stream_test_not_empty_after_add', result) 140*4882a593Smuzhiyun self.assertContains(' ok 3 - string_stream_test_get_string', result) 141*4882a593Smuzhiyun self.assertContains('ok 3 - string-stream-test', result) 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun def test_parse_successful_test_log(self): 144*4882a593Smuzhiyun all_passed_log = get_absolute_path( 145*4882a593Smuzhiyun 'test_data/test_is_test_passed-all_passed.log') 146*4882a593Smuzhiyun file = open(all_passed_log) 147*4882a593Smuzhiyun result = kunit_parser.parse_run_tests(file.readlines()) 148*4882a593Smuzhiyun self.assertEqual( 149*4882a593Smuzhiyun kunit_parser.TestStatus.SUCCESS, 150*4882a593Smuzhiyun result.status) 151*4882a593Smuzhiyun file.close() 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun def test_parse_failed_test_log(self): 154*4882a593Smuzhiyun failed_log = get_absolute_path( 155*4882a593Smuzhiyun 'test_data/test_is_test_passed-failure.log') 156*4882a593Smuzhiyun file = open(failed_log) 157*4882a593Smuzhiyun result = kunit_parser.parse_run_tests(file.readlines()) 158*4882a593Smuzhiyun self.assertEqual( 159*4882a593Smuzhiyun kunit_parser.TestStatus.FAILURE, 160*4882a593Smuzhiyun result.status) 161*4882a593Smuzhiyun file.close() 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun def test_no_tests(self): 164*4882a593Smuzhiyun empty_log = get_absolute_path( 165*4882a593Smuzhiyun 'test_data/test_is_test_passed-no_tests_run.log') 166*4882a593Smuzhiyun file = open(empty_log) 167*4882a593Smuzhiyun result = kunit_parser.parse_run_tests( 168*4882a593Smuzhiyun kunit_parser.isolate_kunit_output(file.readlines())) 169*4882a593Smuzhiyun self.assertEqual(0, len(result.suites)) 170*4882a593Smuzhiyun self.assertEqual( 171*4882a593Smuzhiyun kunit_parser.TestStatus.NO_TESTS, 172*4882a593Smuzhiyun result.status) 173*4882a593Smuzhiyun file.close() 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun def test_no_kunit_output(self): 176*4882a593Smuzhiyun crash_log = get_absolute_path( 177*4882a593Smuzhiyun 'test_data/test_insufficient_memory.log') 178*4882a593Smuzhiyun file = open(crash_log) 179*4882a593Smuzhiyun print_mock = mock.patch('builtins.print').start() 180*4882a593Smuzhiyun result = kunit_parser.parse_run_tests( 181*4882a593Smuzhiyun kunit_parser.isolate_kunit_output(file.readlines())) 182*4882a593Smuzhiyun print_mock.assert_any_call(StrContains('no tests run!')) 183*4882a593Smuzhiyun print_mock.stop() 184*4882a593Smuzhiyun file.close() 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun def test_crashed_test(self): 187*4882a593Smuzhiyun crashed_log = get_absolute_path( 188*4882a593Smuzhiyun 'test_data/test_is_test_passed-crash.log') 189*4882a593Smuzhiyun file = open(crashed_log) 190*4882a593Smuzhiyun result = kunit_parser.parse_run_tests(file.readlines()) 191*4882a593Smuzhiyun self.assertEqual( 192*4882a593Smuzhiyun kunit_parser.TestStatus.TEST_CRASHED, 193*4882a593Smuzhiyun result.status) 194*4882a593Smuzhiyun file.close() 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun def test_ignores_prefix_printk_time(self): 197*4882a593Smuzhiyun prefix_log = get_absolute_path( 198*4882a593Smuzhiyun 'test_data/test_config_printk_time.log') 199*4882a593Smuzhiyun with open(prefix_log) as file: 200*4882a593Smuzhiyun result = kunit_parser.parse_run_tests(file.readlines()) 201*4882a593Smuzhiyun self.assertEqual( 202*4882a593Smuzhiyun kunit_parser.TestStatus.SUCCESS, 203*4882a593Smuzhiyun result.status) 204*4882a593Smuzhiyun self.assertEqual('kunit-resource-test', result.suites[0].name) 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun def test_ignores_multiple_prefixes(self): 207*4882a593Smuzhiyun prefix_log = get_absolute_path( 208*4882a593Smuzhiyun 'test_data/test_multiple_prefixes.log') 209*4882a593Smuzhiyun with open(prefix_log) as file: 210*4882a593Smuzhiyun result = kunit_parser.parse_run_tests(file.readlines()) 211*4882a593Smuzhiyun self.assertEqual( 212*4882a593Smuzhiyun kunit_parser.TestStatus.SUCCESS, 213*4882a593Smuzhiyun result.status) 214*4882a593Smuzhiyun self.assertEqual('kunit-resource-test', result.suites[0].name) 215*4882a593Smuzhiyun 216*4882a593Smuzhiyun def test_prefix_mixed_kernel_output(self): 217*4882a593Smuzhiyun mixed_prefix_log = get_absolute_path( 218*4882a593Smuzhiyun 'test_data/test_interrupted_tap_output.log') 219*4882a593Smuzhiyun with open(mixed_prefix_log) as file: 220*4882a593Smuzhiyun result = kunit_parser.parse_run_tests(file.readlines()) 221*4882a593Smuzhiyun self.assertEqual( 222*4882a593Smuzhiyun kunit_parser.TestStatus.SUCCESS, 223*4882a593Smuzhiyun result.status) 224*4882a593Smuzhiyun self.assertEqual('kunit-resource-test', result.suites[0].name) 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun def test_prefix_poundsign(self): 227*4882a593Smuzhiyun pound_log = get_absolute_path('test_data/test_pound_sign.log') 228*4882a593Smuzhiyun with open(pound_log) as file: 229*4882a593Smuzhiyun result = kunit_parser.parse_run_tests(file.readlines()) 230*4882a593Smuzhiyun self.assertEqual( 231*4882a593Smuzhiyun kunit_parser.TestStatus.SUCCESS, 232*4882a593Smuzhiyun result.status) 233*4882a593Smuzhiyun self.assertEqual('kunit-resource-test', result.suites[0].name) 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun def test_kernel_panic_end(self): 236*4882a593Smuzhiyun panic_log = get_absolute_path('test_data/test_kernel_panic_interrupt.log') 237*4882a593Smuzhiyun with open(panic_log) as file: 238*4882a593Smuzhiyun result = kunit_parser.parse_run_tests(file.readlines()) 239*4882a593Smuzhiyun self.assertEqual( 240*4882a593Smuzhiyun kunit_parser.TestStatus.TEST_CRASHED, 241*4882a593Smuzhiyun result.status) 242*4882a593Smuzhiyun self.assertEqual('kunit-resource-test', result.suites[0].name) 243*4882a593Smuzhiyun 244*4882a593Smuzhiyun def test_pound_no_prefix(self): 245*4882a593Smuzhiyun pound_log = get_absolute_path('test_data/test_pound_no_prefix.log') 246*4882a593Smuzhiyun with open(pound_log) as file: 247*4882a593Smuzhiyun result = kunit_parser.parse_run_tests(file.readlines()) 248*4882a593Smuzhiyun self.assertEqual( 249*4882a593Smuzhiyun kunit_parser.TestStatus.SUCCESS, 250*4882a593Smuzhiyun result.status) 251*4882a593Smuzhiyun self.assertEqual('kunit-resource-test', result.suites[0].name) 252*4882a593Smuzhiyun 253*4882a593Smuzhiyunclass KUnitJsonTest(unittest.TestCase): 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun def _json_for(self, log_file): 256*4882a593Smuzhiyun with(open(get_absolute_path(log_file))) as file: 257*4882a593Smuzhiyun test_result = kunit_parser.parse_run_tests(file) 258*4882a593Smuzhiyun json_obj = kunit_json.get_json_result( 259*4882a593Smuzhiyun test_result=test_result, 260*4882a593Smuzhiyun def_config='kunit_defconfig', 261*4882a593Smuzhiyun build_dir=None, 262*4882a593Smuzhiyun json_path='stdout') 263*4882a593Smuzhiyun return json.loads(json_obj) 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun def test_failed_test_json(self): 266*4882a593Smuzhiyun result = self._json_for( 267*4882a593Smuzhiyun 'test_data/test_is_test_passed-failure.log') 268*4882a593Smuzhiyun self.assertEqual( 269*4882a593Smuzhiyun {'name': 'example_simple_test', 'status': 'FAIL'}, 270*4882a593Smuzhiyun result["sub_groups"][1]["test_cases"][0]) 271*4882a593Smuzhiyun 272*4882a593Smuzhiyun def test_crashed_test_json(self): 273*4882a593Smuzhiyun result = self._json_for( 274*4882a593Smuzhiyun 'test_data/test_is_test_passed-crash.log') 275*4882a593Smuzhiyun self.assertEqual( 276*4882a593Smuzhiyun {'name': 'example_simple_test', 'status': 'ERROR'}, 277*4882a593Smuzhiyun result["sub_groups"][1]["test_cases"][0]) 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun def test_no_tests_json(self): 280*4882a593Smuzhiyun result = self._json_for( 281*4882a593Smuzhiyun 'test_data/test_is_test_passed-no_tests_run.log') 282*4882a593Smuzhiyun self.assertEqual(0, len(result['sub_groups'])) 283*4882a593Smuzhiyun 284*4882a593Smuzhiyunclass StrContains(str): 285*4882a593Smuzhiyun def __eq__(self, other): 286*4882a593Smuzhiyun return self in other 287*4882a593Smuzhiyun 288*4882a593Smuzhiyunclass KUnitMainTest(unittest.TestCase): 289*4882a593Smuzhiyun def setUp(self): 290*4882a593Smuzhiyun path = get_absolute_path('test_data/test_is_test_passed-all_passed.log') 291*4882a593Smuzhiyun with open(path) as file: 292*4882a593Smuzhiyun all_passed_log = file.readlines() 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun self.print_mock = mock.patch('builtins.print').start() 295*4882a593Smuzhiyun self.addCleanup(mock.patch.stopall) 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun self.linux_source_mock = mock.Mock() 298*4882a593Smuzhiyun self.linux_source_mock.build_reconfig = mock.Mock(return_value=True) 299*4882a593Smuzhiyun self.linux_source_mock.build_um_kernel = mock.Mock(return_value=True) 300*4882a593Smuzhiyun self.linux_source_mock.run_kernel = mock.Mock(return_value=all_passed_log) 301*4882a593Smuzhiyun 302*4882a593Smuzhiyun def test_config_passes_args_pass(self): 303*4882a593Smuzhiyun kunit.main(['config', '--build_dir=.kunit'], self.linux_source_mock) 304*4882a593Smuzhiyun assert self.linux_source_mock.build_reconfig.call_count == 1 305*4882a593Smuzhiyun assert self.linux_source_mock.run_kernel.call_count == 0 306*4882a593Smuzhiyun 307*4882a593Smuzhiyun def test_build_passes_args_pass(self): 308*4882a593Smuzhiyun kunit.main(['build'], self.linux_source_mock) 309*4882a593Smuzhiyun assert self.linux_source_mock.build_reconfig.call_count == 0 310*4882a593Smuzhiyun self.linux_source_mock.build_um_kernel.assert_called_once_with(False, 8, '.kunit', None) 311*4882a593Smuzhiyun assert self.linux_source_mock.run_kernel.call_count == 0 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun def test_exec_passes_args_pass(self): 314*4882a593Smuzhiyun kunit.main(['exec'], self.linux_source_mock) 315*4882a593Smuzhiyun assert self.linux_source_mock.build_reconfig.call_count == 0 316*4882a593Smuzhiyun assert self.linux_source_mock.run_kernel.call_count == 1 317*4882a593Smuzhiyun self.linux_source_mock.run_kernel.assert_called_once_with(build_dir='.kunit', timeout=300) 318*4882a593Smuzhiyun self.print_mock.assert_any_call(StrContains('Testing complete.')) 319*4882a593Smuzhiyun 320*4882a593Smuzhiyun def test_run_passes_args_pass(self): 321*4882a593Smuzhiyun kunit.main(['run'], self.linux_source_mock) 322*4882a593Smuzhiyun assert self.linux_source_mock.build_reconfig.call_count == 1 323*4882a593Smuzhiyun assert self.linux_source_mock.run_kernel.call_count == 1 324*4882a593Smuzhiyun self.linux_source_mock.run_kernel.assert_called_once_with( 325*4882a593Smuzhiyun build_dir='.kunit', timeout=300) 326*4882a593Smuzhiyun self.print_mock.assert_any_call(StrContains('Testing complete.')) 327*4882a593Smuzhiyun 328*4882a593Smuzhiyun def test_exec_passes_args_fail(self): 329*4882a593Smuzhiyun self.linux_source_mock.run_kernel = mock.Mock(return_value=[]) 330*4882a593Smuzhiyun with self.assertRaises(SystemExit) as e: 331*4882a593Smuzhiyun kunit.main(['exec'], self.linux_source_mock) 332*4882a593Smuzhiyun assert type(e.exception) == SystemExit 333*4882a593Smuzhiyun assert e.exception.code == 1 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun def test_run_passes_args_fail(self): 336*4882a593Smuzhiyun self.linux_source_mock.run_kernel = mock.Mock(return_value=[]) 337*4882a593Smuzhiyun with self.assertRaises(SystemExit) as e: 338*4882a593Smuzhiyun kunit.main(['run'], self.linux_source_mock) 339*4882a593Smuzhiyun assert type(e.exception) == SystemExit 340*4882a593Smuzhiyun assert e.exception.code == 1 341*4882a593Smuzhiyun assert self.linux_source_mock.build_reconfig.call_count == 1 342*4882a593Smuzhiyun assert self.linux_source_mock.run_kernel.call_count == 1 343*4882a593Smuzhiyun self.print_mock.assert_any_call(StrContains(' 0 tests run')) 344*4882a593Smuzhiyun 345*4882a593Smuzhiyun def test_exec_raw_output(self): 346*4882a593Smuzhiyun self.linux_source_mock.run_kernel = mock.Mock(return_value=[]) 347*4882a593Smuzhiyun kunit.main(['exec', '--raw_output'], self.linux_source_mock) 348*4882a593Smuzhiyun assert self.linux_source_mock.run_kernel.call_count == 1 349*4882a593Smuzhiyun for kall in self.print_mock.call_args_list: 350*4882a593Smuzhiyun assert kall != mock.call(StrContains('Testing complete.')) 351*4882a593Smuzhiyun assert kall != mock.call(StrContains(' 0 tests run')) 352*4882a593Smuzhiyun 353*4882a593Smuzhiyun def test_run_raw_output(self): 354*4882a593Smuzhiyun self.linux_source_mock.run_kernel = mock.Mock(return_value=[]) 355*4882a593Smuzhiyun kunit.main(['run', '--raw_output'], self.linux_source_mock) 356*4882a593Smuzhiyun assert self.linux_source_mock.build_reconfig.call_count == 1 357*4882a593Smuzhiyun assert self.linux_source_mock.run_kernel.call_count == 1 358*4882a593Smuzhiyun for kall in self.print_mock.call_args_list: 359*4882a593Smuzhiyun assert kall != mock.call(StrContains('Testing complete.')) 360*4882a593Smuzhiyun assert kall != mock.call(StrContains(' 0 tests run')) 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun def test_exec_timeout(self): 363*4882a593Smuzhiyun timeout = 3453 364*4882a593Smuzhiyun kunit.main(['exec', '--timeout', str(timeout)], self.linux_source_mock) 365*4882a593Smuzhiyun self.linux_source_mock.run_kernel.assert_called_once_with(build_dir='.kunit', timeout=timeout) 366*4882a593Smuzhiyun self.print_mock.assert_any_call(StrContains('Testing complete.')) 367*4882a593Smuzhiyun 368*4882a593Smuzhiyun def test_run_timeout(self): 369*4882a593Smuzhiyun timeout = 3453 370*4882a593Smuzhiyun kunit.main(['run', '--timeout', str(timeout)], self.linux_source_mock) 371*4882a593Smuzhiyun assert self.linux_source_mock.build_reconfig.call_count == 1 372*4882a593Smuzhiyun self.linux_source_mock.run_kernel.assert_called_once_with( 373*4882a593Smuzhiyun build_dir='.kunit', timeout=timeout) 374*4882a593Smuzhiyun self.print_mock.assert_any_call(StrContains('Testing complete.')) 375*4882a593Smuzhiyun 376*4882a593Smuzhiyun def test_run_builddir(self): 377*4882a593Smuzhiyun build_dir = '.kunit' 378*4882a593Smuzhiyun kunit.main(['run', '--build_dir=.kunit'], self.linux_source_mock) 379*4882a593Smuzhiyun assert self.linux_source_mock.build_reconfig.call_count == 1 380*4882a593Smuzhiyun self.linux_source_mock.run_kernel.assert_called_once_with( 381*4882a593Smuzhiyun build_dir=build_dir, timeout=300) 382*4882a593Smuzhiyun self.print_mock.assert_any_call(StrContains('Testing complete.')) 383*4882a593Smuzhiyun 384*4882a593Smuzhiyun def test_config_builddir(self): 385*4882a593Smuzhiyun build_dir = '.kunit' 386*4882a593Smuzhiyun kunit.main(['config', '--build_dir', build_dir], self.linux_source_mock) 387*4882a593Smuzhiyun assert self.linux_source_mock.build_reconfig.call_count == 1 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun def test_build_builddir(self): 390*4882a593Smuzhiyun build_dir = '.kunit' 391*4882a593Smuzhiyun kunit.main(['build', '--build_dir', build_dir], self.linux_source_mock) 392*4882a593Smuzhiyun self.linux_source_mock.build_um_kernel.assert_called_once_with(False, 8, build_dir, None) 393*4882a593Smuzhiyun 394*4882a593Smuzhiyun def test_exec_builddir(self): 395*4882a593Smuzhiyun build_dir = '.kunit' 396*4882a593Smuzhiyun kunit.main(['exec', '--build_dir', build_dir], self.linux_source_mock) 397*4882a593Smuzhiyun self.linux_source_mock.run_kernel.assert_called_once_with(build_dir=build_dir, timeout=300) 398*4882a593Smuzhiyun self.print_mock.assert_any_call(StrContains('Testing complete.')) 399*4882a593Smuzhiyun 400*4882a593Smuzhiyunif __name__ == '__main__': 401*4882a593Smuzhiyun unittest.main() 402