1*053f45beSAndroid Build Coastguard Worker#!/bin/sh 2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0 3*053f45beSAndroid Build Coastguard Worker# 4*053f45beSAndroid Build Coastguard Worker# Runs a set of tests in a given subdirectory. 5*053f45beSAndroid Build Coastguard Workerexport skip_rc=4 6*053f45beSAndroid Build Coastguard Workerexport timeout_rc=124 7*053f45beSAndroid Build Coastguard Workerexport logfile=/dev/stdout 8*053f45beSAndroid Build Coastguard Workerexport per_test_logging= 9*053f45beSAndroid Build Coastguard Worker 10*053f45beSAndroid Build Coastguard Worker# Defaults for "settings" file fields: 11*053f45beSAndroid Build Coastguard Worker# "timeout" how many seconds to let each test run before failing. 12*053f45beSAndroid Build Coastguard Workerexport kselftest_default_timeout=45 13*053f45beSAndroid Build Coastguard Worker 14*053f45beSAndroid Build Coastguard Worker# There isn't a shell-agnostic way to find the path of a sourced file, 15*053f45beSAndroid Build Coastguard Worker# so we must rely on BASE_DIR being set to find other tools. 16*053f45beSAndroid Build Coastguard Workerif [ -z "$BASE_DIR" ]; then 17*053f45beSAndroid Build Coastguard Worker echo "Error: BASE_DIR must be set before sourcing." >&2 18*053f45beSAndroid Build Coastguard Worker exit 1 19*053f45beSAndroid Build Coastguard Workerfi 20*053f45beSAndroid Build Coastguard Worker 21*053f45beSAndroid Build Coastguard WorkerTR_CMD=$(command -v tr) 22*053f45beSAndroid Build Coastguard Worker 23*053f45beSAndroid Build Coastguard Worker# If Perl is unavailable, we must fall back to line-at-a-time prefixing 24*053f45beSAndroid Build Coastguard Worker# with sed instead of unbuffered output. 25*053f45beSAndroid Build Coastguard Workertap_prefix() 26*053f45beSAndroid Build Coastguard Worker{ 27*053f45beSAndroid Build Coastguard Worker if [ ! -x /usr/bin/perl ]; then 28*053f45beSAndroid Build Coastguard Worker sed -e 's/^/# /' 29*053f45beSAndroid Build Coastguard Worker else 30*053f45beSAndroid Build Coastguard Worker "$BASE_DIR"/kselftest/prefix.pl 31*053f45beSAndroid Build Coastguard Worker fi 32*053f45beSAndroid Build Coastguard Worker} 33*053f45beSAndroid Build Coastguard Worker 34*053f45beSAndroid Build Coastguard Workertap_timeout() 35*053f45beSAndroid Build Coastguard Worker{ 36*053f45beSAndroid Build Coastguard Worker # Make sure tests will time out if utility is available. 37*053f45beSAndroid Build Coastguard Worker if [ -x /usr/bin/timeout ] ; then 38*053f45beSAndroid Build Coastguard Worker /usr/bin/timeout --foreground "$kselftest_timeout" $1 39*053f45beSAndroid Build Coastguard Worker else 40*053f45beSAndroid Build Coastguard Worker $1 41*053f45beSAndroid Build Coastguard Worker fi 42*053f45beSAndroid Build Coastguard Worker} 43*053f45beSAndroid Build Coastguard Worker 44*053f45beSAndroid Build Coastguard Workerrun_one() 45*053f45beSAndroid Build Coastguard Worker{ 46*053f45beSAndroid Build Coastguard Worker DIR="$1" 47*053f45beSAndroid Build Coastguard Worker TEST="$2" 48*053f45beSAndroid Build Coastguard Worker NUM="$3" 49*053f45beSAndroid Build Coastguard Worker 50*053f45beSAndroid Build Coastguard Worker BASENAME_TEST=$(basename $TEST) 51*053f45beSAndroid Build Coastguard Worker 52*053f45beSAndroid Build Coastguard Worker # Reset any "settings"-file variables. 53*053f45beSAndroid Build Coastguard Worker export kselftest_timeout="$kselftest_default_timeout" 54*053f45beSAndroid Build Coastguard Worker 55*053f45beSAndroid Build Coastguard Worker # Safe default if tr not available 56*053f45beSAndroid Build Coastguard Worker kselftest_cmd_args_ref="KSELFTEST_ARGS" 57*053f45beSAndroid Build Coastguard Worker 58*053f45beSAndroid Build Coastguard Worker # Optional arguments for this command, possibly defined as an 59*053f45beSAndroid Build Coastguard Worker # environment variable built using the test executable in all 60*053f45beSAndroid Build Coastguard Worker # uppercase and sanitized substituting non acceptable shell 61*053f45beSAndroid Build Coastguard Worker # variable name characters with "_" as in: 62*053f45beSAndroid Build Coastguard Worker # 63*053f45beSAndroid Build Coastguard Worker # KSELFTEST_<UPPERCASE_SANITIZED_TESTNAME>_ARGS="<options>" 64*053f45beSAndroid Build Coastguard Worker # 65*053f45beSAndroid Build Coastguard Worker # e.g. 66*053f45beSAndroid Build Coastguard Worker # 67*053f45beSAndroid Build Coastguard Worker # rtctest --> KSELFTEST_RTCTEST_ARGS="/dev/rtc1" 68*053f45beSAndroid Build Coastguard Worker # 69*053f45beSAndroid Build Coastguard Worker # cpu-on-off-test.sh --> KSELFTEST_CPU_ON_OFF_TEST_SH_ARGS="-a -p 10" 70*053f45beSAndroid Build Coastguard Worker # 71*053f45beSAndroid Build Coastguard Worker if [ -n "$TR_CMD" ]; then 72*053f45beSAndroid Build Coastguard Worker BASENAME_SANITIZED=$(echo "$BASENAME_TEST" | \ 73*053f45beSAndroid Build Coastguard Worker $TR_CMD -d "[:blank:][:cntrl:]" | \ 74*053f45beSAndroid Build Coastguard Worker $TR_CMD -c "[:alnum:]_" "_" | \ 75*053f45beSAndroid Build Coastguard Worker $TR_CMD [:lower:] [:upper:]) 76*053f45beSAndroid Build Coastguard Worker kselftest_cmd_args_ref="KSELFTEST_${BASENAME_SANITIZED}_ARGS" 77*053f45beSAndroid Build Coastguard Worker fi 78*053f45beSAndroid Build Coastguard Worker 79*053f45beSAndroid Build Coastguard Worker # Load per-test-directory kselftest "settings" file. 80*053f45beSAndroid Build Coastguard Worker settings="$BASE_DIR/$DIR/settings" 81*053f45beSAndroid Build Coastguard Worker if [ -r "$settings" ] ; then 82*053f45beSAndroid Build Coastguard Worker while read line ; do 83*053f45beSAndroid Build Coastguard Worker # Skip comments. 84*053f45beSAndroid Build Coastguard Worker if echo "$line" | grep -q '^#'; then 85*053f45beSAndroid Build Coastguard Worker continue 86*053f45beSAndroid Build Coastguard Worker fi 87*053f45beSAndroid Build Coastguard Worker field=$(echo "$line" | cut -d= -f1) 88*053f45beSAndroid Build Coastguard Worker value=$(echo "$line" | cut -d= -f2-) 89*053f45beSAndroid Build Coastguard Worker eval "kselftest_$field"="$value" 90*053f45beSAndroid Build Coastguard Worker done < "$settings" 91*053f45beSAndroid Build Coastguard Worker fi 92*053f45beSAndroid Build Coastguard Worker 93*053f45beSAndroid Build Coastguard Worker TEST_HDR_MSG="selftests: $DIR: $BASENAME_TEST" 94*053f45beSAndroid Build Coastguard Worker echo "# $TEST_HDR_MSG" 95*053f45beSAndroid Build Coastguard Worker if [ ! -e "$TEST" ]; then 96*053f45beSAndroid Build Coastguard Worker echo "# Warning: file $TEST is missing!" 97*053f45beSAndroid Build Coastguard Worker echo "not ok $test_num $TEST_HDR_MSG" 98*053f45beSAndroid Build Coastguard Worker else 99*053f45beSAndroid Build Coastguard Worker eval kselftest_cmd_args="\$${kselftest_cmd_args_ref:-}" 100*053f45beSAndroid Build Coastguard Worker cmd="./$BASENAME_TEST $kselftest_cmd_args" 101*053f45beSAndroid Build Coastguard Worker if [ ! -x "$TEST" ]; then 102*053f45beSAndroid Build Coastguard Worker echo "# Warning: file $TEST is not executable" 103*053f45beSAndroid Build Coastguard Worker 104*053f45beSAndroid Build Coastguard Worker if [ $(head -n 1 "$TEST" | cut -c -2) = "#!" ] 105*053f45beSAndroid Build Coastguard Worker then 106*053f45beSAndroid Build Coastguard Worker interpreter=$(head -n 1 "$TEST" | cut -c 3-) 107*053f45beSAndroid Build Coastguard Worker cmd="$interpreter ./$BASENAME_TEST" 108*053f45beSAndroid Build Coastguard Worker else 109*053f45beSAndroid Build Coastguard Worker echo "not ok $test_num $TEST_HDR_MSG" 110*053f45beSAndroid Build Coastguard Worker return 111*053f45beSAndroid Build Coastguard Worker fi 112*053f45beSAndroid Build Coastguard Worker fi 113*053f45beSAndroid Build Coastguard Worker cd `dirname $TEST` > /dev/null 114*053f45beSAndroid Build Coastguard Worker ((((( tap_timeout "$cmd" 2>&1; echo $? >&3) | 115*053f45beSAndroid Build Coastguard Worker tap_prefix >&4) 3>&1) | 116*053f45beSAndroid Build Coastguard Worker (read xs; exit $xs)) 4>>"$logfile" && 117*053f45beSAndroid Build Coastguard Worker echo "ok $test_num $TEST_HDR_MSG") || 118*053f45beSAndroid Build Coastguard Worker (rc=$?; \ 119*053f45beSAndroid Build Coastguard Worker if [ $rc -eq $skip_rc ]; then \ 120*053f45beSAndroid Build Coastguard Worker echo "ok $test_num $TEST_HDR_MSG # SKIP" 121*053f45beSAndroid Build Coastguard Worker elif [ $rc -eq $timeout_rc ]; then \ 122*053f45beSAndroid Build Coastguard Worker echo "#" 123*053f45beSAndroid Build Coastguard Worker echo "not ok $test_num $TEST_HDR_MSG # TIMEOUT $kselftest_timeout seconds" 124*053f45beSAndroid Build Coastguard Worker else 125*053f45beSAndroid Build Coastguard Worker echo "not ok $test_num $TEST_HDR_MSG # exit=$rc" 126*053f45beSAndroid Build Coastguard Worker fi) 127*053f45beSAndroid Build Coastguard Worker cd - >/dev/null 128*053f45beSAndroid Build Coastguard Worker fi 129*053f45beSAndroid Build Coastguard Worker} 130*053f45beSAndroid Build Coastguard Worker 131*053f45beSAndroid Build Coastguard Workerrun_many() 132*053f45beSAndroid Build Coastguard Worker{ 133*053f45beSAndroid Build Coastguard Worker echo "TAP version 13" 134*053f45beSAndroid Build Coastguard Worker DIR="${PWD#${BASE_DIR}/}" 135*053f45beSAndroid Build Coastguard Worker test_num=0 136*053f45beSAndroid Build Coastguard Worker total=$(echo "$@" | wc -w) 137*053f45beSAndroid Build Coastguard Worker echo "1..$total" 138*053f45beSAndroid Build Coastguard Worker for TEST in "$@"; do 139*053f45beSAndroid Build Coastguard Worker BASENAME_TEST=$(basename $TEST) 140*053f45beSAndroid Build Coastguard Worker test_num=$(( test_num + 1 )) 141*053f45beSAndroid Build Coastguard Worker if [ -n "$per_test_logging" ]; then 142*053f45beSAndroid Build Coastguard Worker logfile="/tmp/$BASENAME_TEST" 143*053f45beSAndroid Build Coastguard Worker cat /dev/null > "$logfile" 144*053f45beSAndroid Build Coastguard Worker fi 145*053f45beSAndroid Build Coastguard Worker run_one "$DIR" "$TEST" "$test_num" 146*053f45beSAndroid Build Coastguard Worker done 147*053f45beSAndroid Build Coastguard Worker} 148