[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CABVgOSksQBD4F8UaKE3N8D-_U65w_t+OwchQ1G52YnAb1a4YUg@mail.gmail.com>
Date: Sat, 26 Feb 2022 12:29:19 +0800
From: David Gow <davidgow@...gle.com>
To: Daniel Latypov <dlatypov@...gle.com>
Cc: Brendan Higgins <brendanhiggins@...gle.com>,
Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
KUnit Development <kunit-dev@...glegroups.com>,
"open list:KERNEL SELFTEST FRAMEWORK"
<linux-kselftest@...r.kernel.org>,
Shuah Khan <skhan@...uxfoundation.org>
Subject: Re: [PATCH] kunit: tool: more descriptive metavars/--help output
On Sat, Feb 26, 2022 at 11:31 AM Daniel Latypov <dlatypov@...gle.com> wrote:
>
> Before, our help output contained lines like
> --kconfig_add KCONFIG_ADD
> --qemu_config qemu_config
> --jobs jobs
>
> They're not very helpful.
>
> The former kind come from the automatic 'metavar' we get from argparse,
> the uppsercase version of the flag name.
Nit: "uppsercase" -> "uppercase"
> The latter are where we manually specified metavar as the flag name.
This was at least partly my fault: I didn't know what 'metavar' was
actually supposed to be, so assumed it was the name of the variable
the option set (hence them all being the same).
>
> After:
> --build_dir DIR
> --make_options X=Y
> --kunitconfig KUNITCONFIG
> --kconfig_add CONFIG_X=Y
> --arch ARCH
> --cross_compile PREFIX
> --qemu_config FILE
> --jobs N
> --timeout SECONDS
> --raw_output [{all,kunit}]
> --json [FILE]
>
> This patch tries to make the code more clear by specifying the _type_ of
> input we expect, e.g. --build_dir is a DIR, --qemu_config is a FILE.
> I also switched it to uppercase since it looked more clearly like
> placeholder text that way.
Looks good. I like all of these except possibly KUNITCONFIG, which I
think should probably be FILE, too.
>
> This patch also changes --raw_output to specify `choices` to make it
> more clear what the options are, and this way argparse can validate it
> for us, as shown by the added test case.
Excellent: that's much more discoverable (and the validation will no
doubt be useful).
>
> Signed-off-by: Daniel Latypov <dlatypov@...gle.com>
> ---
Reviewed-by: David Gow <davidgow@...gle.com>
Cheers,
-- David
> tools/testing/kunit/kunit.py | 26 ++++++++++++--------------
> tools/testing/kunit/kunit_tool_test.py | 5 +++++
> 2 files changed, 17 insertions(+), 14 deletions(-)
>
> diff --git a/tools/testing/kunit/kunit.py b/tools/testing/kunit/kunit.py
> index 9274c6355809..566404f5e42a 100755
> --- a/tools/testing/kunit/kunit.py
> +++ b/tools/testing/kunit/kunit.py
> @@ -206,8 +206,6 @@ def parse_tests(request: KunitParseRequest, input_data: Iterable[str]) -> Tuple[
> pass
> elif request.raw_output == 'kunit':
> output = kunit_parser.extract_tap_lines(output)
> - else:
> - print(f'Unknown --raw_output option "{request.raw_output}"', file=sys.stderr)
> for line in output:
> print(line.rstrip())
>
> @@ -281,10 +279,10 @@ def add_common_opts(parser) -> None:
> parser.add_argument('--build_dir',
> help='As in the make command, it specifies the build '
> 'directory.',
> - type=str, default='.kunit', metavar='build_dir')
> + type=str, default='.kunit', metavar='DIR')
> parser.add_argument('--make_options',
> help='X=Y make option, can be repeated.',
> - action='append')
> + action='append', metavar='X=Y')
> parser.add_argument('--alltests',
> help='Run all KUnit tests through allyesconfig',
> action='store_true')
> @@ -292,11 +290,11 @@ def add_common_opts(parser) -> None:
> help='Path to Kconfig fragment that enables KUnit tests.'
> ' If given a directory, (e.g. lib/kunit), "/.kunitconfig" '
> 'will get automatically appended.',
> - metavar='kunitconfig')
> + metavar='KUNITCONFIG')
Is it worth making this something like FILE or PATH instead.
PATH_TO_KUNITCONFIG would be verbose, but this is a path being given,
so just KUNITCONFIG is still a bit useless.
> parser.add_argument('--kconfig_add',
> help='Additional Kconfig options to append to the '
> '.kunitconfig, e.g. CONFIG_KASAN=y. Can be repeated.',
> - action='append')
> + action='append', metavar='CONFIG_X=Y')
>
> parser.add_argument('--arch',
> help=('Specifies the architecture to run tests under. '
> @@ -304,7 +302,7 @@ def add_common_opts(parser) -> None:
> 'string passed to the ARCH make param, '
> 'e.g. i386, x86_64, arm, um, etc. Non-UML '
> 'architectures run on QEMU.'),
> - type=str, default='um', metavar='arch')
> + type=str, default='um', metavar='ARCH')
>
> parser.add_argument('--cross_compile',
> help=('Sets make\'s CROSS_COMPILE variable; it should '
> @@ -316,18 +314,18 @@ def add_common_opts(parser) -> None:
> 'if you have downloaded the microblaze toolchain '
> 'from the 0-day website to a directory in your '
> 'home directory called `toolchains`).'),
> - metavar='cross_compile')
> + metavar='PREFIX')
>
> parser.add_argument('--qemu_config',
> help=('Takes a path to a path to a file containing '
> 'a QemuArchParams object.'),
> - type=str, metavar='qemu_config')
> + type=str, metavar='FILE')
>
> def add_build_opts(parser) -> None:
> parser.add_argument('--jobs',
> help='As in the make command, "Specifies the number of '
> 'jobs (commands) to run simultaneously."',
> - type=int, default=get_default_jobs(), metavar='jobs')
> + type=int, default=get_default_jobs(), metavar='N')
>
> def add_exec_opts(parser) -> None:
> parser.add_argument('--timeout',
> @@ -336,7 +334,7 @@ def add_exec_opts(parser) -> None:
> 'tests.',
> type=int,
> default=300,
> - metavar='timeout')
> + metavar='SECONDS')
> parser.add_argument('filter_glob',
> help='Filter which KUnit test suites/tests run at '
> 'boot-time, e.g. list* or list*.*del_test',
> @@ -346,7 +344,7 @@ def add_exec_opts(parser) -> None:
> metavar='filter_glob')
> parser.add_argument('--kernel_args',
> help='Kernel command-line parameters. Maybe be repeated',
> - action='append')
> + action='append', metavar='')
> parser.add_argument('--run_isolated', help='If set, boot the kernel for each '
> 'individual suite/test. This is can be useful for debugging '
> 'a non-hermetic test, one that might pass/fail based on '
> @@ -357,13 +355,13 @@ def add_exec_opts(parser) -> None:
> def add_parse_opts(parser) -> None:
> parser.add_argument('--raw_output', help='If set don\'t format output from kernel. '
> 'If set to --raw_output=kunit, filters to just KUnit output.',
> - type=str, nargs='?', const='all', default=None)
> + type=str, nargs='?', const='all', default=None, choices=['all', 'kunit'])
> parser.add_argument('--json',
> nargs='?',
> help='Stores test results in a JSON, and either '
> 'prints to stdout or saves to file if a '
> 'filename is specified',
> - type=str, const='stdout', default=None)
> + type=str, const='stdout', default=None, metavar='FILE')
>
> def main(argv, linux=None):
> parser = argparse.ArgumentParser(
> diff --git a/tools/testing/kunit/kunit_tool_test.py b/tools/testing/kunit/kunit_tool_test.py
> index 352369dffbd9..eb2011d12c78 100755
> --- a/tools/testing/kunit/kunit_tool_test.py
> +++ b/tools/testing/kunit/kunit_tool_test.py
> @@ -595,6 +595,11 @@ class KUnitMainTest(unittest.TestCase):
> self.assertNotEqual(call, mock.call(StrContains('Testing complete.')))
> self.assertNotEqual(call, mock.call(StrContains(' 0 tests run')))
>
> + def test_run_raw_output_invalid(self):
> + self.linux_source_mock.run_kernel = mock.Mock(return_value=[])
> + with self.assertRaises(SystemExit) as e:
> + kunit.main(['run', '--raw_output=invalid'], self.linux_source_mock)
> +
> def test_run_raw_output_does_not_take_positional_args(self):
> # --raw_output is a string flag, but we don't want it to consume
> # any positional arguments, only ones after an '='
>
> base-commit: 5debe5bfa02c4c8922bd2d0f82c9c3a70bec8944
> --
> 2.35.1.574.g5d30c73bfb-goog
>
Download attachment "smime.p7s" of type "application/pkcs7-signature" (4003 bytes)
Powered by blists - more mailing lists