162306a36Sopenharmony_ci#!/bin/sh
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0+
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#
562306a36Sopenharmony_ci# Runs an individual test module.
662306a36Sopenharmony_ci#
762306a36Sopenharmony_ci# kselftest expects a separate executable for each test, this can be
862306a36Sopenharmony_ci# created by adding a script like this:
962306a36Sopenharmony_ci#
1062306a36Sopenharmony_ci#   #!/bin/sh
1162306a36Sopenharmony_ci#   SPDX-License-Identifier: GPL-2.0+
1262306a36Sopenharmony_ci#   $(dirname $0)/../kselftest/module.sh "description" module_name
1362306a36Sopenharmony_ci#
1462306a36Sopenharmony_ci# Example: tools/testing/selftests/lib/printf.sh
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cidesc=""				# Output prefix.
1762306a36Sopenharmony_cimodule=""			# Filename (without the .ko).
1862306a36Sopenharmony_ciargs=""				# modprobe arguments.
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cimodprobe="/sbin/modprobe"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cimain() {
2362306a36Sopenharmony_ci    parse_args "$@"
2462306a36Sopenharmony_ci    assert_root
2562306a36Sopenharmony_ci    assert_have_module
2662306a36Sopenharmony_ci    run_module
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ciparse_args() {
3062306a36Sopenharmony_ci    script=${0##*/}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci    if [ $# -lt 2 ]; then
3362306a36Sopenharmony_ci	echo "Usage: $script <description> <module_name> [FAIL]"
3462306a36Sopenharmony_ci	exit 1
3562306a36Sopenharmony_ci    fi
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci    desc="$1"
3862306a36Sopenharmony_ci    shift || true
3962306a36Sopenharmony_ci    module="$1"
4062306a36Sopenharmony_ci    shift || true
4162306a36Sopenharmony_ci    args="$@"
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ciassert_root() {
4562306a36Sopenharmony_ci    if [ ! -w /dev ]; then
4662306a36Sopenharmony_ci	skip "please run as root"
4762306a36Sopenharmony_ci    fi
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciassert_have_module() {
5162306a36Sopenharmony_ci    if ! $modprobe -q -n $module; then
5262306a36Sopenharmony_ci	skip "module $module is not found"
5362306a36Sopenharmony_ci    fi
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cirun_module() {
5762306a36Sopenharmony_ci    if $modprobe -q $module $args; then
5862306a36Sopenharmony_ci	$modprobe -q -r $module
5962306a36Sopenharmony_ci	say "ok"
6062306a36Sopenharmony_ci    else
6162306a36Sopenharmony_ci	fail ""
6262306a36Sopenharmony_ci    fi
6362306a36Sopenharmony_ci}
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_cisay() {
6662306a36Sopenharmony_ci    echo "$desc: $1"
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cifail() {
7162306a36Sopenharmony_ci    say "$1 [FAIL]" >&2
7262306a36Sopenharmony_ci    exit 1
7362306a36Sopenharmony_ci}
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ciskip() {
7662306a36Sopenharmony_ci    say "$1 [SKIP]" >&2
7762306a36Sopenharmony_ci    # Kselftest framework requirement - SKIP code is 4.
7862306a36Sopenharmony_ci    exit 4
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci#
8262306a36Sopenharmony_ci# Main script
8362306a36Sopenharmony_ci#
8462306a36Sopenharmony_cimain "$@"
85