0001
0002
0003
0004
0005 export skip_rc=4
0006 export timeout_rc=124
0007 export logfile=/dev/stdout
0008 export per_test_logging=
0009
0010
0011
0012 export kselftest_default_timeout=45
0013
0014
0015
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
0024
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
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
0053 export kselftest_timeout="$kselftest_default_timeout"
0054
0055
0056 kselftest_cmd_args_ref="KSELFTEST_ARGS"
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
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
0080 settings="$BASE_DIR/$DIR/settings"
0081 if [ -r "$settings" ] ; then
0082 while read line ; do
0083
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 }