lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<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

Powered by Openwall GNU/*/Linux Powered by OpenVZ