Re: [RFC PATCHv2] selftests/run_kselftest.sh: make each test individually selectable

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Shuah,

What do you think of this change? Any comments?
If you are OK, I can rebase the patch and repost it.

Thanks
Hangbin

On Mon, 16 Mar 2020 at 15:26, Hangbin Liu <liuhangbin@xxxxxxxxx> wrote:
>
> Currently, after generating run_kselftest.sh, there is no way to choose
> which test we could run. All the tests are listed together and we have
> to run all every time. This patch enhanced the run_kselftest.sh to make
> the tests individually selectable. e.g.
>
>   $ ./run_kselftest.sh -t "bpf size timers"
>
> Note: I use `tr -s "/-" "_"` to cover the path name to function name in
> tests. e.g. networking/timestamping -> networking_timestamping.
>
> Before the patch:
>
> $ cat run_kselftest.sh
> \#!/bin/sh
> BASE_DIR=$(realpath $(dirname $0))
> cd $BASE_DIR
> . ./kselftest/runner.sh
> ROOT=$PWD
> if [ "$1" = "--summary" ]; then
>   logfile=$BASE_DIR/output.log
>   cat /dev/null > $logfile
> fi
> [ -w /dev/kmsg ] && echo "kselftest: Running tests in android" >> /dev/kmsg
> cd android
> run_many        \
>         "run.sh"
> cd $ROOT
> ...<snip>...
> [ -w /dev/kmsg ] && echo "kselftest: Running tests in zram" >> /dev/kmsg
> cd zram
> run_many        \
>         "zram.sh"
> cd $ROOT
>
> After the patch:
> $ cat run_kselftest.sh
> \#!/bin/sh
> BASE_DIR=$(realpath $(dirname $0))
> . ./kselftest/runner.sh
> TESTS="android ...<snip>... zram"
>
> run_android()
> {
>         [ -w /dev/kmsg ] && echo "kselftest: Running tests in android" >> /dev/kmsg
>         cd android
>         run_many        \
>                 "run.sh"
>         cd $ROOT
> }
>
> ...<snip>...
>
> run_zram()
> {
>         [ -w /dev/kmsg ] && echo "kselftest: Running tests in zram" >> /dev/kmsg
>         cd zram
>         run_many        \
>                 "zram.sh"
>         cd $ROOT
> }
>
> usage()
> {
>         cat <<EOF
> usage: ${0##*/} OPTS
>         -s | --summary          Only print summary info and put detailed log in output.log
>         -t | --tests            Test name you want to run specifically
>         -h | --help             Show this usage info
> EOF
> }
>
> while true; do
>         case "$1" in
>         -s | --summary ) logfile=$BASE_DIR/output.log; cat /dev/null > $logfile; shift ;;
>         -t | --tests ) TESTS=$2; shift 2 ;;
>         -h | --help ) usage; exit 0;;
>         "" ) break;;
>         * ) usage; exit 1;;
>         esac
> done
>
> cd $BASE_DIR
> ROOT=$PWD
> for test in $TESTS; do
>         run_$test
> done
>
> v2: update document and commit description.
>
> Signed-off-by: Hangbin Liu <liuhangbin@xxxxxxxxx>
> ---
>  Documentation/dev-tools/kselftest.rst |  4 +++
>  tools/testing/selftests/Makefile      | 48 +++++++++++++++++++++------
>  tools/testing/selftests/lib.mk        |  2 +-
>  3 files changed, 43 insertions(+), 11 deletions(-)
>
> diff --git a/Documentation/dev-tools/kselftest.rst b/Documentation/dev-tools/kselftest.rst
> index 61ae13c44f91..e856713a1deb 100644
> --- a/Documentation/dev-tools/kselftest.rst
> +++ b/Documentation/dev-tools/kselftest.rst
> @@ -151,6 +151,10 @@ note some tests will require root privileges::
>     $ cd kselftest
>     $ ./run_kselftest.sh
>
> +Or you can run some specific test cases in the installed Kselftests by::
> +
> +   $ ./run_kselftest.sh -t "bpf size timers"
> +
>  Contributing new tests
>  ======================
>
> diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
> index be22dbe94a4c..5481ea0634cf 100644
> --- a/tools/testing/selftests/Makefile
> +++ b/tools/testing/selftests/Makefile
> @@ -212,13 +212,9 @@ ifdef INSTALL_PATH
>         @# Ask all targets to emit their test scripts
>         echo "#!/bin/sh" > $(ALL_SCRIPT)
>         echo "BASE_DIR=\$$(realpath \$$(dirname \$$0))" >> $(ALL_SCRIPT)
> -       echo "cd \$$BASE_DIR" >> $(ALL_SCRIPT)
>         echo ". ./kselftest/runner.sh" >> $(ALL_SCRIPT)
> -       echo "ROOT=\$$PWD" >> $(ALL_SCRIPT)
> -       echo "if [ \"\$$1\" = \"--summary\" ]; then" >> $(ALL_SCRIPT)
> -       echo "  logfile=\$$BASE_DIR/output.log" >> $(ALL_SCRIPT)
> -       echo "  cat /dev/null > \$$logfile" >> $(ALL_SCRIPT)
> -       echo "fi" >> $(ALL_SCRIPT)
> +       echo "TESTS=\"$(TARGETS)\"" | tr -s "/-" "_" >> $(ALL_SCRIPT)
> +       echo "" >> $(ALL_SCRIPT);
>
>         @# While building run_kselftest.sh skip also non-existent TARGET dirs:
>         @# they could be the result of a build failure and should NOT be
> @@ -226,15 +222,47 @@ ifdef INSTALL_PATH
>         for TARGET in $(TARGETS); do \
>                 BUILD_TARGET=$$BUILD/$$TARGET;  \
>                 [ ! -d $(INSTALL_PATH)/$$TARGET ] && echo "Skipping non-existent dir: $$TARGET" && continue; \
> -               echo "[ -w /dev/kmsg ] && echo \"kselftest: Running tests in $$TARGET\" >> /dev/kmsg" >> $(ALL_SCRIPT); \
> -               echo "cd $$TARGET" >> $(ALL_SCRIPT); \
> -               echo -n "run_many" >> $(ALL_SCRIPT); \
> +               echo "run_$$TARGET()" | tr -s "/-" "_" >> $(ALL_SCRIPT); \
> +               echo "{" >> $(ALL_SCRIPT); \
> +               echo -e "\t[ -w /dev/kmsg ] && echo \"kselftest: Running tests in $$TARGET\" >> /dev/kmsg" >> $(ALL_SCRIPT); \
> +               echo -e "\tcd $$TARGET" >> $(ALL_SCRIPT); \
> +               echo -en "\trun_many" >> $(ALL_SCRIPT); \
>                 echo -n "Emit Tests for $$TARGET\n"; \
>                 $(MAKE) -s --no-print-directory OUTPUT=$$BUILD_TARGET -C $$TARGET emit_tests >> $(ALL_SCRIPT); \
>                 echo "" >> $(ALL_SCRIPT);           \
> -               echo "cd \$$ROOT" >> $(ALL_SCRIPT); \
> +               echo -e "\tcd \$$ROOT" >> $(ALL_SCRIPT); \
> +               echo "}" >> $(ALL_SCRIPT); \
> +               echo "" >> $(ALL_SCRIPT); \
>         done;
>
> +       echo "usage()" >> $(ALL_SCRIPT);
> +       echo "{" >> $(ALL_SCRIPT);
> +       echo -e "\tcat <<EOF" >> $(ALL_SCRIPT);
> +       echo "usage: \$${0##*/} OPTS" >> $(ALL_SCRIPT);
> +       echo -e "\t-s | --summary\t\tOnly print summary info and put detailed log in output.log" >> $(ALL_SCRIPT);
> +       echo -e "\t-t | --tests\t\tTest name you want to run specifically" >> $(ALL_SCRIPT);
> +       echo -e "\t-h | --help\t\tShow this usage info" >> $(ALL_SCRIPT);
> +       echo "EOF" >> $(ALL_SCRIPT);
> +       echo "}" >> $(ALL_SCRIPT);
> +       echo "" >> $(ALL_SCRIPT);
> +
> +       echo "while true; do" >> $(ALL_SCRIPT);
> +       echo -e "\tcase \"\$$1\" in" >> $(ALL_SCRIPT);
> +       echo -e "\t-s | --summary ) logfile=\$$BASE_DIR/output.log; cat /dev/null > \$$logfile; shift ;;" >> $(ALL_SCRIPT);
> +       echo -e "\t-t | --tests ) TESTS=\$$2; shift 2 ;;" >> $(ALL_SCRIPT);
> +       echo -e "\t-h | --help ) usage; exit 0;;" >> $(ALL_SCRIPT);
> +       echo -e "\t\"\" ) break;;" >> $(ALL_SCRIPT);
> +       echo -e "\t* ) usage; exit 1;;" >> $(ALL_SCRIPT);
> +       echo -e "\tesac" >> $(ALL_SCRIPT);
> +       echo "done" >> $(ALL_SCRIPT);
> +       echo "" >> $(ALL_SCRIPT);
> +
> +       echo "cd \$$BASE_DIR" >> $(ALL_SCRIPT)
> +       echo "ROOT=\$$PWD" >> $(ALL_SCRIPT)
> +
> +       echo "for test in \$$TESTS; do" >> $(ALL_SCRIPT); \
> +       echo -e "\trun_\$$test" >> $(ALL_SCRIPT); \
> +       echo "done" >> $(ALL_SCRIPT); \
>         chmod u+x $(ALL_SCRIPT)
>  else
>         $(error Error: set INSTALL_PATH to use install)
> diff --git a/tools/testing/selftests/lib.mk b/tools/testing/selftests/lib.mk
> index 1c8a1963d03f..2dc5a0cca6f3 100644
> --- a/tools/testing/selftests/lib.mk
> +++ b/tools/testing/selftests/lib.mk
> @@ -107,7 +107,7 @@ emit_tests:
>         for TEST in $(TEST_GEN_PROGS) $(TEST_CUSTOM_PROGS) $(TEST_PROGS); do \
>                 BASENAME_TEST=`basename $$TEST`;        \
>                 echo "  \\";                            \
> -               echo -n "       \"$$BASENAME_TEST\"";   \
> +               echo -ne "\t\t\"$$BASENAME_TEST\"";     \
>         done;                                           \
>
>  # define if isn't already. It is undefined in make O= case.
> --
> 2.19.2
>



[Index of Archives]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux