xref: /OK3568_Linux_fs/kernel/tools/testing/kunit/kunit_tool_test.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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