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