Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/sh
0002 # SPDX-License-Identifier: GPL-2.0
0003 #
0004 # Runs a set of tests in a given subdirectory.
0005 export skip_rc=4
0006 export timeout_rc=124
0007 export logfile=/dev/stdout
0008 export per_test_logging=
0009 
0010 # Defaults for "settings" file fields:
0011 # "timeout" how many seconds to let each test run before failing.
0012 export kselftest_default_timeout=45
0013 
0014 # There isn't a shell-agnostic way to find the path of a sourced file,
0015 # so we must rely on BASE_DIR being set to find other tools.
0016 if [ -z "$BASE_DIR" ]; then
0017         echo "Error: BASE_DIR must be set before sourcing." >&2
0018         exit 1
0019 fi
0020 
0021 TR_CMD=$(command -v tr)
0022 
0023 # If Perl is unavailable, we must fall back to line-at-a-time prefixing
0024 # with sed instead of unbuffered output.
0025 tap_prefix()
0026 {
0027         if [ ! -x /usr/bin/perl ]; then
0028                 sed -e 's/^/# /'
0029         else
0030                 "$BASE_DIR"/kselftest/prefix.pl
0031         fi
0032 }
0033 
0034 tap_timeout()
0035 {
0036         # Make sure tests will time out if utility is available.
0037         if [ -x /usr/bin/timeout ] ; then
0038                 /usr/bin/timeout --foreground "$kselftest_timeout" $1
0039         else
0040                 $1
0041         fi
0042 }
0043 
0044 run_one()
0045 {
0046         DIR="$1"
0047         TEST="$2"
0048         NUM="$3"
0049 
0050         BASENAME_TEST=$(basename $TEST)
0051 
0052         # Reset any "settings"-file variables.
0053         export kselftest_timeout="$kselftest_default_timeout"
0054 
0055         # Safe default if tr not available
0056         kselftest_cmd_args_ref="KSELFTEST_ARGS"
0057 
0058         # Optional arguments for this command, possibly defined as an
0059         # environment variable built using the test executable in all
0060         # uppercase and sanitized substituting non acceptable shell
0061         # variable name characters with "_" as in:
0062         #
0063         #       KSELFTEST_<UPPERCASE_SANITIZED_TESTNAME>_ARGS="<options>"
0064         #
0065         # e.g.
0066         #
0067         #       rtctest --> KSELFTEST_RTCTEST_ARGS="/dev/rtc1"
0068         #
0069         #       cpu-on-off-test.sh --> KSELFTEST_CPU_ON_OFF_TEST_SH_ARGS="-a -p 10"
0070         #
0071         if [ -n "$TR_CMD" ]; then
0072                 BASENAME_SANITIZED=$(echo "$BASENAME_TEST" | \
0073                                         $TR_CMD -d "[:blank:][:cntrl:]" | \
0074                                         $TR_CMD -c "[:alnum:]_" "_" | \
0075                                         $TR_CMD [:lower:] [:upper:])
0076                 kselftest_cmd_args_ref="KSELFTEST_${BASENAME_SANITIZED}_ARGS"
0077         fi
0078 
0079         # Load per-test-directory kselftest "settings" file.
0080         settings="$BASE_DIR/$DIR/settings"
0081         if [ -r "$settings" ] ; then
0082                 while read line ; do
0083                         # Skip comments.
0084                         if echo "$line" | grep -q '^#'; then
0085                                 continue
0086                         fi
0087                         field=$(echo "$line" | cut -d= -f1)
0088                         value=$(echo "$line" | cut -d= -f2-)
0089                         eval "kselftest_$field"="$value"
0090                 done < "$settings"
0091         fi
0092 
0093         TEST_HDR_MSG="selftests: $DIR: $BASENAME_TEST"
0094         echo "# $TEST_HDR_MSG"
0095         if [ ! -e "$TEST" ]; then
0096                 echo "# Warning: file $TEST is missing!"
0097                 echo "not ok $test_num $TEST_HDR_MSG"
0098         else
0099                 eval kselftest_cmd_args="\$${kselftest_cmd_args_ref:-}"
0100                 cmd="./$BASENAME_TEST $kselftest_cmd_args"
0101                 if [ ! -x "$TEST" ]; then
0102                         echo "# Warning: file $TEST is not executable"
0103 
0104                         if [ $(head -n 1 "$TEST" | cut -c -2) = "#!" ]
0105                         then
0106                                 interpreter=$(head -n 1 "$TEST" | cut -c 3-)
0107                                 cmd="$interpreter ./$BASENAME_TEST"
0108                         else
0109                                 echo "not ok $test_num $TEST_HDR_MSG"
0110                                 return
0111                         fi
0112                 fi
0113                 cd `dirname $TEST` > /dev/null
0114                 ((((( tap_timeout "$cmd" 2>&1; echo $? >&3) |
0115                         tap_prefix >&4) 3>&1) |
0116                         (read xs; exit $xs)) 4>>"$logfile" &&
0117                 echo "ok $test_num $TEST_HDR_MSG") ||
0118                 (rc=$?; \
0119                 if [ $rc -eq $skip_rc ]; then   \
0120                         echo "ok $test_num $TEST_HDR_MSG # SKIP"
0121                 elif [ $rc -eq $timeout_rc ]; then \
0122                         echo "#"
0123                         echo "not ok $test_num $TEST_HDR_MSG # TIMEOUT $kselftest_timeout seconds"
0124                 else
0125                         echo "not ok $test_num $TEST_HDR_MSG # exit=$rc"
0126                 fi)
0127                 cd - >/dev/null
0128         fi
0129 }
0130 
0131 run_many()
0132 {
0133         echo "TAP version 13"
0134         DIR="${PWD#${BASE_DIR}/}"
0135         test_num=0
0136         total=$(echo "$@" | wc -w)
0137         echo "1..$total"
0138         for TEST in "$@"; do
0139                 BASENAME_TEST=$(basename $TEST)
0140                 test_num=$(( test_num + 1 ))
0141                 if [ -n "$per_test_logging" ]; then
0142                         logfile="/tmp/$BASENAME_TEST"
0143                         cat /dev/null > "$logfile"
0144                 fi
0145                 run_one "$DIR" "$TEST" "$test_num"
0146         done
0147 }