Skip to content

Commit 6cb51a1

Browse files
dlatypovshuahkh
authored andcommitted
kunit: tool: add --kernel_args to allow setting module params
kunit.py currently does not make it possible for users to specify module parameters (/kernel arguments more generally) unless one directly tweaks the kunit.py code itself. This hasn't mattered much so far, but this would make it easier to port existing tests that expose module parameters over to KUnit and/or let current KUnit tests take advantage of them. Tested using an kunit internal parameter: $ ./tools/testing/kunit/kunit.py run --kunitconfig=lib/kunit \ --kernel_args=kunit.filter_glob=kunit_status ... Testing complete. 2 tests run. 0 failed. 0 crashed. 0 skipped. Signed-off-by: Daniel Latypov <dlatypov@google.com> Reviewed-by: David Gow <davidgow@google.com> Reviewed-by: Brendan Higgins <brendanhiggins@google.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org>
1 parent 1195505 commit 6cb51a1

3 files changed

Lines changed: 36 additions & 10 deletions

File tree

Documentation/dev-tools/kunit/running_tips.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,16 @@ file ``.kunitconfig``, you can just pass in the dir, e.g.
8080
automagically, but tests could theoretically depend on incompatible
8181
options, so handling that would be tricky.
8282

83+
Setting kernel commandline parameters
84+
-------------------------------------
85+
86+
You can use ``--kernel_args`` to pass arbitrary kernel arguments, e.g.
87+
88+
.. code-block:: bash
89+
90+
$ ./tools/testing/kunit/kunit.py run --kernel_args=param=42 --kernel_args=param2=false
91+
92+
8393
Generating code coverage reports under UML
8494
------------------------------------------
8595

tools/testing/kunit/kunit.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@
3030
['jobs', 'build_dir', 'alltests',
3131
'make_options'])
3232
KunitExecRequest = namedtuple('KunitExecRequest',
33-
['timeout', 'build_dir', 'alltests', 'filter_glob'])
33+
['timeout', 'build_dir', 'alltests',
34+
'filter_glob', 'kernel_args'])
3435
KunitParseRequest = namedtuple('KunitParseRequest',
3536
['raw_output', 'input_data', 'build_dir', 'json'])
3637
KunitRequest = namedtuple('KunitRequest', ['raw_output','timeout', 'jobs',
3738
'build_dir', 'alltests', 'filter_glob',
38-
'json', 'make_options'])
39+
'kernel_args', 'json', 'make_options'])
3940

4041
KernelDirectoryPath = sys.argv[0].split('tools/testing/kunit/')[0]
4142

@@ -94,6 +95,7 @@ def exec_tests(linux: kunit_kernel.LinuxSourceTree,
9495
kunit_parser.print_with_timestamp('Starting KUnit Kernel ...')
9596
test_start = time.time()
9697
result = linux.run_kernel(
98+
args=request.kernel_args,
9799
timeout=None if request.alltests else request.timeout,
98100
filter_glob=request.filter_glob,
99101
build_dir=request.build_dir)
@@ -152,7 +154,8 @@ def run_tests(linux: kunit_kernel.LinuxSourceTree,
152154
return build_result
153155

154156
exec_request = KunitExecRequest(request.timeout, request.build_dir,
155-
request.alltests, request.filter_glob)
157+
request.alltests, request.filter_glob,
158+
request.kernel_args)
156159
exec_result = exec_tests(linux, exec_request)
157160
if exec_result.status != KunitStatus.SUCCESS:
158161
return exec_result
@@ -238,6 +241,9 @@ def add_exec_opts(parser) -> None:
238241
nargs='?',
239242
default='',
240243
metavar='filter_glob')
244+
parser.add_argument('--kernel_args',
245+
help='Kernel command-line parameters. Maybe be repeated',
246+
action='append')
241247

242248
def add_parse_opts(parser) -> None:
243249
parser.add_argument('--raw_output', help='don\'t format output from kernel',
@@ -309,6 +315,7 @@ def main(argv, linux=None):
309315
cli_args.build_dir,
310316
cli_args.alltests,
311317
cli_args.filter_glob,
318+
cli_args.kernel_args,
312319
cli_args.json,
313320
cli_args.make_options)
314321
result = run_tests(linux, request)
@@ -363,7 +370,8 @@ def main(argv, linux=None):
363370
exec_request = KunitExecRequest(cli_args.timeout,
364371
cli_args.build_dir,
365372
cli_args.alltests,
366-
cli_args.filter_glob)
373+
cli_args.filter_glob,
374+
cli_args.kernel_args)
367375
exec_result = exec_tests(linux, exec_request)
368376
parse_request = KunitParseRequest(cli_args.raw_output,
369377
exec_result.result,

tools/testing/kunit/kunit_tool_test.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -356,15 +356,15 @@ def test_exec_passes_args_pass(self):
356356
self.assertEqual(self.linux_source_mock.build_reconfig.call_count, 0)
357357
self.assertEqual(self.linux_source_mock.run_kernel.call_count, 1)
358358
self.linux_source_mock.run_kernel.assert_called_once_with(
359-
build_dir='.kunit', filter_glob='', timeout=300)
359+
args=None, build_dir='.kunit', filter_glob='', timeout=300)
360360
self.print_mock.assert_any_call(StrContains('Testing complete.'))
361361

362362
def test_run_passes_args_pass(self):
363363
kunit.main(['run'], self.linux_source_mock)
364364
self.assertEqual(self.linux_source_mock.build_reconfig.call_count, 1)
365365
self.assertEqual(self.linux_source_mock.run_kernel.call_count, 1)
366366
self.linux_source_mock.run_kernel.assert_called_once_with(
367-
build_dir='.kunit', filter_glob='', timeout=300)
367+
args=None, build_dir='.kunit', filter_glob='', timeout=300)
368368
self.print_mock.assert_any_call(StrContains('Testing complete.'))
369369

370370
def test_exec_passes_args_fail(self):
@@ -403,23 +403,23 @@ def test_exec_timeout(self):
403403
timeout = 3453
404404
kunit.main(['exec', '--timeout', str(timeout)], self.linux_source_mock)
405405
self.linux_source_mock.run_kernel.assert_called_once_with(
406-
build_dir='.kunit', filter_glob='', timeout=timeout)
406+
args=None, build_dir='.kunit', filter_glob='', timeout=timeout)
407407
self.print_mock.assert_any_call(StrContains('Testing complete.'))
408408

409409
def test_run_timeout(self):
410410
timeout = 3453
411411
kunit.main(['run', '--timeout', str(timeout)], self.linux_source_mock)
412412
self.assertEqual(self.linux_source_mock.build_reconfig.call_count, 1)
413413
self.linux_source_mock.run_kernel.assert_called_once_with(
414-
build_dir='.kunit', filter_glob='', timeout=timeout)
414+
args=None, build_dir='.kunit', filter_glob='', timeout=timeout)
415415
self.print_mock.assert_any_call(StrContains('Testing complete.'))
416416

417417
def test_run_builddir(self):
418418
build_dir = '.kunit'
419419
kunit.main(['run', '--build_dir=.kunit'], self.linux_source_mock)
420420
self.assertEqual(self.linux_source_mock.build_reconfig.call_count, 1)
421421
self.linux_source_mock.run_kernel.assert_called_once_with(
422-
build_dir=build_dir, filter_glob='', timeout=300)
422+
args=None, build_dir=build_dir, filter_glob='', timeout=300)
423423
self.print_mock.assert_any_call(StrContains('Testing complete.'))
424424

425425
def test_config_builddir(self):
@@ -436,7 +436,7 @@ def test_exec_builddir(self):
436436
build_dir = '.kunit'
437437
kunit.main(['exec', '--build_dir', build_dir], self.linux_source_mock)
438438
self.linux_source_mock.run_kernel.assert_called_once_with(
439-
build_dir=build_dir, filter_glob='', timeout=300)
439+
args=None, build_dir=build_dir, filter_glob='', timeout=300)
440440
self.print_mock.assert_any_call(StrContains('Testing complete.'))
441441

442442
@mock.patch.object(kunit_kernel, 'LinuxSourceTree')
@@ -461,5 +461,13 @@ def test_config_kunitconfig(self, mock_linux_init):
461461
cross_compile=None,
462462
qemu_config_path=None)
463463

464+
def test_run_kernel_args(self):
465+
kunit.main(['run', '--kernel_args=a=1', '--kernel_args=b=2'], self.linux_source_mock)
466+
self.assertEqual(self.linux_source_mock.build_reconfig.call_count, 1)
467+
self.linux_source_mock.run_kernel.assert_called_once_with(
468+
args=['a=1','b=2'], build_dir='.kunit', filter_glob='', timeout=300)
469+
self.print_mock.assert_any_call(StrContains('Testing complete.'))
470+
471+
464472
if __name__ == '__main__':
465473
unittest.main()

0 commit comments

Comments
 (0)