1c78fd76fSKees Cook#!/bin/sh
2c78fd76fSKees Cook# SPDX-License-Identifier: GPL-2.0+
3c78fd76fSKees Cook
4c78fd76fSKees Cook#
5c78fd76fSKees Cook# Runs an individual test module.
6c78fd76fSKees Cook#
7c78fd76fSKees Cook# kselftest expects a separate executable for each test, this can be
8c78fd76fSKees Cook# created by adding a script like this:
9c78fd76fSKees Cook#
10c78fd76fSKees Cook#   #!/bin/sh
11c78fd76fSKees Cook#   SPDX-License-Identifier: GPL-2.0+
123a019636SMichael Ellerman#   $(dirname $0)/../kselftest/module.sh "description" module_name
13c78fd76fSKees Cook#
14c78fd76fSKees Cook# Example: tools/testing/selftests/lib/printf.sh
15c78fd76fSKees Cook
16c78fd76fSKees Cookdesc=""				# Output prefix.
17c78fd76fSKees Cookmodule=""			# Filename (without the .ko).
18c78fd76fSKees Cookargs=""				# modprobe arguments.
19c78fd76fSKees Cook
20c78fd76fSKees Cookmodprobe="/sbin/modprobe"
21c78fd76fSKees Cook
22c78fd76fSKees Cookmain() {
23c78fd76fSKees Cook    parse_args "$@"
24c78fd76fSKees Cook    assert_root
25c78fd76fSKees Cook    assert_have_module
26c78fd76fSKees Cook    run_module
27c78fd76fSKees Cook}
28c78fd76fSKees Cook
29c78fd76fSKees Cookparse_args() {
30c78fd76fSKees Cook    script=${0##*/}
31c78fd76fSKees Cook
32c78fd76fSKees Cook    if [ $# -lt 2 ]; then
33c78fd76fSKees Cook	echo "Usage: $script <description> <module_name> [FAIL]"
34c78fd76fSKees Cook	exit 1
35c78fd76fSKees Cook    fi
36c78fd76fSKees Cook
37c78fd76fSKees Cook    desc="$1"
38c78fd76fSKees Cook    shift || true
39c78fd76fSKees Cook    module="$1"
40c78fd76fSKees Cook    shift || true
41c78fd76fSKees Cook    args="$@"
42c78fd76fSKees Cook}
43c78fd76fSKees Cook
44c78fd76fSKees Cookassert_root() {
45c78fd76fSKees Cook    if [ ! -w /dev ]; then
46c78fd76fSKees Cook	skip "please run as root"
47c78fd76fSKees Cook    fi
48c78fd76fSKees Cook}
49c78fd76fSKees Cook
50c78fd76fSKees Cookassert_have_module() {
51c78fd76fSKees Cook    if ! $modprobe -q -n $module; then
52c78fd76fSKees Cook	skip "module $module is not found"
53c78fd76fSKees Cook    fi
54c78fd76fSKees Cook}
55c78fd76fSKees Cook
56c78fd76fSKees Cookrun_module() {
57c78fd76fSKees Cook    if $modprobe -q $module $args; then
58c78fd76fSKees Cook	$modprobe -q -r $module
59c78fd76fSKees Cook	say "ok"
60c78fd76fSKees Cook    else
61c78fd76fSKees Cook	fail ""
62c78fd76fSKees Cook    fi
63c78fd76fSKees Cook}
64c78fd76fSKees Cook
65c78fd76fSKees Cooksay() {
66c78fd76fSKees Cook    echo "$desc: $1"
67c78fd76fSKees Cook}
68c78fd76fSKees Cook
69c78fd76fSKees Cook
70c78fd76fSKees Cookfail() {
71c78fd76fSKees Cook    say "$1 [FAIL]" >&2
72c78fd76fSKees Cook    exit 1
73c78fd76fSKees Cook}
74c78fd76fSKees Cook
75c78fd76fSKees Cookskip() {
76c78fd76fSKees Cook    say "$1 [SKIP]" >&2
77c78fd76fSKees Cook    # Kselftest framework requirement - SKIP code is 4.
78c78fd76fSKees Cook    exit 4
79c78fd76fSKees Cook}
80c78fd76fSKees Cook
81c78fd76fSKees Cook#
82c78fd76fSKees Cook# Main script
83c78fd76fSKees Cook#
84c78fd76fSKees Cookmain "$@"
85