diff mbox series

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

Message ID 20200316072626.24037-1-liuhangbin@gmail.com
State New
Headers show
Series [RFC,PATCHv2] selftests/run_kselftest.sh: make each test individually selectable | expand

Commit Message

Hangbin Liu March 16, 2020, 7:26 a.m. UTC
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@gmail.com>
---
 Documentation/dev-tools/kselftest.rst |  4 +++
 tools/testing/selftests/Makefile      | 48 +++++++++++++++++++++------
 tools/testing/selftests/lib.mk        |  2 +-
 3 files changed, 43 insertions(+), 11 deletions(-)

Comments

Hangbin Liu Sept. 10, 2020, 1:20 a.m. UTC | #1
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@gmail.com> 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@gmail.com>

> ---

>  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

>
Shuah Khan Sept. 10, 2020, 2:10 p.m. UTC | #2
On 9/9/20 7:20 PM, Hangbin Liu wrote:
> Hi Shuah,

> 

> What do you think of this change? Any comments?

> If you are OK, I can rebase the patch and repost it.

> 

> Thanks


Looks like a good addition to me. Please rebase and send
the patch to everybody get_maintainers.pl recommends.

thanks,
-- Shuah
diff mbox series

Patch

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.