kselftest: Add test runner creation script
authorTobin C. Harding <tobin@kernel.org>
Fri, 5 Apr 2019 01:58:55 +0000 (12:58 +1100)
committerShuah Khan <shuah@kernel.org>
Mon, 8 Apr 2019 22:44:11 +0000 (16:44 -0600)
Currently if we wish to use kselftest to run tests within a kernel
module we write a small script to load/unload and do error reporting.
There are a bunch of these under tools/testing/selftests/lib/ that are
all identical except for the test name.  We can reduce code duplication
and improve maintainability if we have one version of this.  However
kselftest requires an executable for each test.  We can move all the
script logic to a central script then have each individual test script
call the main script.

Oneliner to call kselftest_module.sh courtesy of Kees, thanks!

Add test runner creation script.  Convert
tools/testing/selftests/lib/*.sh to use new test creation script.

Testing
-------

Configure kselftests for lib/ then build and boot kernel.  Then run
kselftests as follows:

  $ cd /path/to/kernel/tree
  $ sudo make O=$output_path -C tools/testing/selftests TARGETS="lib" run_tests

and also

  $ cd /path/to/kernel/tree
  $ cd tools/testing/selftests
  $ sudo make O=$output_path TARGETS="lib" run_tests

and also

  $ cd /path/to/kernel/tree
  $ cd tools/testing/selftests
  $ sudo make TARGETS="lib" run_tests

Acked-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Tobin C. Harding <tobin@kernel.org>
Signed-off-by: Shuah Khan <shuah@kernel.org>
tools/testing/selftests/kselftest_module.sh [new file with mode: 0755]
tools/testing/selftests/lib/bitmap.sh
tools/testing/selftests/lib/prime_numbers.sh
tools/testing/selftests/lib/printf.sh

diff --git a/tools/testing/selftests/kselftest_module.sh b/tools/testing/selftests/kselftest_module.sh
new file mode 100755 (executable)
index 0000000..18e1c79
--- /dev/null
@@ -0,0 +1,84 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0+
+
+#
+# Runs an individual test module.
+#
+# kselftest expects a separate executable for each test, this can be
+# created by adding a script like this:
+#
+#   #!/bin/sh
+#   SPDX-License-Identifier: GPL-2.0+
+#   $(dirname $0)/../kselftest_module.sh "description" module_name
+#
+# Example: tools/testing/selftests/lib/printf.sh
+
+desc=""                                # Output prefix.
+module=""                      # Filename (without the .ko).
+args=""                                # modprobe arguments.
+
+modprobe="/sbin/modprobe"
+
+main() {
+    parse_args "$@"
+    assert_root
+    assert_have_module
+    run_module
+}
+
+parse_args() {
+    script=${0##*/}
+
+    if [ $# -lt 2 ]; then
+       echo "Usage: $script <description> <module_name> [FAIL]"
+       exit 1
+    fi
+
+    desc="$1"
+    shift || true
+    module="$1"
+    shift || true
+    args="$@"
+}
+
+assert_root() {
+    if [ ! -w /dev ]; then
+       skip "please run as root"
+    fi
+}
+
+assert_have_module() {
+    if ! $modprobe -q -n $module; then
+       skip "module $module is not found"
+    fi
+}
+
+run_module() {
+    if $modprobe -q $module $args; then
+       $modprobe -q -r $module
+       say "ok"
+    else
+       fail ""
+    fi
+}
+
+say() {
+    echo "$desc: $1"
+}
+
+
+fail() {
+    say "$1 [FAIL]" >&2
+    exit 1
+}
+
+skip() {
+    say "$1 [SKIP]" >&2
+    # Kselftest framework requirement - SKIP code is 4.
+    exit 4
+}
+
+#
+# Main script
+#
+main "$@"
index 5a90006d1aea9d5a75cfcc7026e679f863306ac9..5511dddc5c2daf55cade85a4302a2e6e292c1e6d 100755 (executable)
@@ -1,19 +1,3 @@
 #!/bin/sh
 # SPDX-License-Identifier: GPL-2.0
-
-# Kselftest framework requirement - SKIP code is 4.
-ksft_skip=4
-
-# Runs bitmap infrastructure tests using test_bitmap kernel module
-if ! /sbin/modprobe -q -n test_bitmap; then
-       echo "bitmap: module test_bitmap is not found [SKIP]"
-       exit $ksft_skip
-fi
-
-if /sbin/modprobe -q test_bitmap; then
-       /sbin/modprobe -q -r test_bitmap
-       echo "bitmap: ok"
-else
-       echo "bitmap: [FAIL]"
-       exit 1
-fi
+$(dirname $0)/../kselftest_module.sh "bitmap" test_bitmap
index 78e7483c8d6089c0182dace3dd7a8944b7896c3d..43b28f24e453d63880a7c011dc0585b10503dd91 100755 (executable)
@@ -1,19 +1,4 @@
 #!/bin/sh
 # SPDX-License-Identifier: GPL-2.0
 # Checks fast/slow prime_number generation for inconsistencies
-
-# Kselftest framework requirement - SKIP code is 4.
-ksft_skip=4
-
-if ! /sbin/modprobe -q -n prime_numbers; then
-       echo "prime_numbers: module prime_numbers is not found [SKIP]"
-       exit $ksft_skip
-fi
-
-if /sbin/modprobe -q prime_numbers selftest=65536; then
-       /sbin/modprobe -q -r prime_numbers
-       echo "prime_numbers: ok"
-else
-       echo "prime_numbers: [FAIL]"
-       exit 1
-fi
+$(dirname $0)/../kselftest_module.sh "prime numbers" prime_numbers selftest=65536
index 45a23e2d64ad47aac888e7cf62c3ec6e17516451..2ffa61da0296e7ba866bbded157be60d8b3190dc 100755 (executable)
@@ -1,19 +1,4 @@
 #!/bin/sh
 # SPDX-License-Identifier: GPL-2.0
-# Runs printf infrastructure using test_printf kernel module
-
-# Kselftest framework requirement - SKIP code is 4.
-ksft_skip=4
-
-if ! /sbin/modprobe -q -n test_printf; then
-       echo "printf: module test_printf is not found [SKIP]"
-       exit $ksft_skip
-fi
-
-if /sbin/modprobe -q test_printf; then
-       /sbin/modprobe -q -r test_printf
-       echo "printf: ok"
-else
-       echo "printf: [FAIL]"
-       exit 1
-fi
+# Tests the printf infrastructure using test_printf kernel module.
+$(dirname $0)/../kselftest_module.sh "printf" test_printf