Skip to content

Commit 9f57cc7

Browse files
dlatypovshuahkh
authored andcommitted
kunit: tool: add --kconfig_add to allow easily tweaking kunitconfigs
E.g. run tests but with KASAN $ ./tools/testing/kunit/kunit.py run --arch=x86_64 --kconfig_add=CONFIG_KASAN=y This also works with --kunitconfig $ ./tools/testing/kunit/kunit.py run --arch=x86_64 --kunitconfig=fs/ext4 --kconfig_add=CONFIG_KASAN=y This flag is inspired by TuxMake's --kconfig-add, see https://gitlab.com/Linaro/tuxmake#examples. Our version just uses "_" as the delimiter for consistency with pre-existing flags like --build_dir, --make_options, --kernel_args, etc. Note: this does make it easier to run into a pre-existing edge case: $ ./tools/testing/kunit/kunit.py run --arch=x86_64 --kconfig_add=CONFIG_KASAN=y $ ./tools/testing/kunit/kunit.py run --arch=x86_64 This second invocation ^ still has KASAN enabled! kunit.py won't call olddefconfig if our current .config is already a superset of the provided kunitconfig. Signed-off-by: Daniel Latypov <[email protected]> Reviewed-by: David Gow <[email protected]> Reviewed-by: Brendan Higgins <[email protected]> Signed-off-by: Shuah Khan <[email protected]>
1 parent 9897849 commit 9f57cc7

File tree

3 files changed

+31
-0
lines changed

3 files changed

+31
-0
lines changed

tools/testing/kunit/kunit.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,10 @@ def add_common_opts(parser) -> None:
280280
' If given a directory, (e.g. lib/kunit), "/.kunitconfig" '
281281
'will get automatically appended.',
282282
metavar='kunitconfig')
283+
parser.add_argument('--kconfig_add',
284+
help='Additional Kconfig options to append to the '
285+
'.kunitconfig, e.g. CONFIG_KASAN=y. Can be repeated.',
286+
action='append')
283287

284288
parser.add_argument('--arch',
285289
help=('Specifies the architecture to run tests under. '
@@ -398,6 +402,7 @@ def main(argv, linux=None):
398402
if not linux:
399403
linux = kunit_kernel.LinuxSourceTree(cli_args.build_dir,
400404
kunitconfig_path=cli_args.kunitconfig,
405+
kconfig_add=cli_args.kconfig_add,
401406
arch=cli_args.arch,
402407
cross_compile=cli_args.cross_compile,
403408
qemu_config_path=cli_args.qemu_config)
@@ -423,6 +428,7 @@ def main(argv, linux=None):
423428
if not linux:
424429
linux = kunit_kernel.LinuxSourceTree(cli_args.build_dir,
425430
kunitconfig_path=cli_args.kunitconfig,
431+
kconfig_add=cli_args.kconfig_add,
426432
arch=cli_args.arch,
427433
cross_compile=cli_args.cross_compile,
428434
qemu_config_path=cli_args.qemu_config)
@@ -439,6 +445,7 @@ def main(argv, linux=None):
439445
if not linux:
440446
linux = kunit_kernel.LinuxSourceTree(cli_args.build_dir,
441447
kunitconfig_path=cli_args.kunitconfig,
448+
kconfig_add=cli_args.kconfig_add,
442449
arch=cli_args.arch,
443450
cross_compile=cli_args.cross_compile,
444451
qemu_config_path=cli_args.qemu_config)
@@ -457,6 +464,7 @@ def main(argv, linux=None):
457464
if not linux:
458465
linux = kunit_kernel.LinuxSourceTree(cli_args.build_dir,
459466
kunitconfig_path=cli_args.kunitconfig,
467+
kconfig_add=cli_args.kconfig_add,
460468
arch=cli_args.arch,
461469
cross_compile=cli_args.cross_compile,
462470
qemu_config_path=cli_args.qemu_config)

tools/testing/kunit/kunit_kernel.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ def __init__(
224224
build_dir: str,
225225
load_config=True,
226226
kunitconfig_path='',
227+
kconfig_add: Optional[List[str]]=None,
227228
arch=None,
228229
cross_compile=None,
229230
qemu_config_path=None) -> None:
@@ -249,6 +250,10 @@ def __init__(
249250
shutil.copyfile(DEFAULT_KUNITCONFIG_PATH, kunitconfig_path)
250251

251252
self._kconfig = kunit_config.parse_file(kunitconfig_path)
253+
if kconfig_add:
254+
kconfig = kunit_config.parse_from_string('\n'.join(kconfig_add))
255+
self._kconfig.merge_in_entries(kconfig)
256+
252257

253258
def clean(self) -> bool:
254259
try:

tools/testing/kunit/kunit_tool_test.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,10 @@ def test_dir_kunitconfig(self):
389389
pass
390390
kunit_kernel.LinuxSourceTree('', kunitconfig_path=dir)
391391

392+
def test_kconfig_add(self):
393+
tree = kunit_kernel.LinuxSourceTree('', kconfig_add=['CONFIG_NOT_REAL=y'])
394+
self.assertIn(kunit_config.KconfigEntry('NOT_REAL', 'y'), tree._kconfig.entries())
395+
392396
def test_invalid_arch(self):
393397
with self.assertRaisesRegex(kunit_kernel.ConfigError, 'not a valid arch, options are.*x86_64'):
394398
kunit_kernel.LinuxSourceTree('', arch='invalid')
@@ -601,6 +605,7 @@ def test_run_kunitconfig(self, mock_linux_init):
601605
# Just verify that we parsed and initialized it correctly here.
602606
mock_linux_init.assert_called_once_with('.kunit',
603607
kunitconfig_path='mykunitconfig',
608+
kconfig_add=None,
604609
arch='um',
605610
cross_compile=None,
606611
qemu_config_path=None)
@@ -612,6 +617,19 @@ def test_config_kunitconfig(self, mock_linux_init):
612617
# Just verify that we parsed and initialized it correctly here.
613618
mock_linux_init.assert_called_once_with('.kunit',
614619
kunitconfig_path='mykunitconfig',
620+
kconfig_add=None,
621+
arch='um',
622+
cross_compile=None,
623+
qemu_config_path=None)
624+
625+
@mock.patch.object(kunit_kernel, 'LinuxSourceTree')
626+
def test_run_kconfig_add(self, mock_linux_init):
627+
mock_linux_init.return_value = self.linux_source_mock
628+
kunit.main(['run', '--kconfig_add=CONFIG_KASAN=y', '--kconfig_add=CONFIG_KCSAN=y'])
629+
# Just verify that we parsed and initialized it correctly here.
630+
mock_linux_init.assert_called_once_with('.kunit',
631+
kunitconfig_path=None,
632+
kconfig_add=['CONFIG_KASAN=y', 'CONFIG_KCSAN=y'],
615633
arch='um',
616634
cross_compile=None,
617635
qemu_config_path=None)

0 commit comments

Comments
 (0)