1*25da2beaSAndroid Build Coastguard Worker#!/usr/bin/env bash 2*25da2beaSAndroid Build Coastguard Worker 3*25da2beaSAndroid Build Coastguard WorkerTESTS=("$@") 4*25da2beaSAndroid Build Coastguard WorkerRET=0 5*25da2beaSAndroid Build Coastguard WorkerTIMEOUT=60 6*25da2beaSAndroid Build Coastguard WorkerDMESG_FILTER="cat" 7*25da2beaSAndroid Build Coastguard WorkerTEST_DIR=$(dirname "$0") 8*25da2beaSAndroid Build Coastguard WorkerFAILED="" 9*25da2beaSAndroid Build Coastguard WorkerSKIPPED="" 10*25da2beaSAndroid Build Coastguard WorkerTIMED_OUT="" 11*25da2beaSAndroid Build Coastguard WorkerTEST_FILES="" 12*25da2beaSAndroid Build Coastguard Workerdeclare -A TEST_MAP 13*25da2beaSAndroid Build Coastguard Worker 14*25da2beaSAndroid Build Coastguard Worker# Only use /dev/kmsg if running as root 15*25da2beaSAndroid Build Coastguard WorkerDO_KMSG="1" 16*25da2beaSAndroid Build Coastguard Worker[ "$(id -u)" != "0" ] && DO_KMSG="0" 17*25da2beaSAndroid Build Coastguard Worker 18*25da2beaSAndroid Build Coastguard Worker# Include config.local if exists and check TEST_FILES for valid devices 19*25da2beaSAndroid Build Coastguard Workerif [ -f "$TEST_DIR/config.local" ]; then 20*25da2beaSAndroid Build Coastguard Worker # shellcheck source=/dev/null disable=SC1091 21*25da2beaSAndroid Build Coastguard Worker . "$TEST_DIR/config.local" 22*25da2beaSAndroid Build Coastguard Worker for dev in $TEST_FILES; do 23*25da2beaSAndroid Build Coastguard Worker if [ ! -e "$dev" ]; then 24*25da2beaSAndroid Build Coastguard Worker echo "Test file $dev not valid" 25*25da2beaSAndroid Build Coastguard Worker exit 1 26*25da2beaSAndroid Build Coastguard Worker fi 27*25da2beaSAndroid Build Coastguard Worker done 28*25da2beaSAndroid Build Coastguard Worker for dev in "${TEST_MAP[@]}"; do 29*25da2beaSAndroid Build Coastguard Worker if [ ! -e "$dev" ]; then 30*25da2beaSAndroid Build Coastguard Worker echo "Test file in map $dev not valid" 31*25da2beaSAndroid Build Coastguard Worker exit 1 32*25da2beaSAndroid Build Coastguard Worker fi 33*25da2beaSAndroid Build Coastguard Worker done 34*25da2beaSAndroid Build Coastguard Workerfi 35*25da2beaSAndroid Build Coastguard Worker 36*25da2beaSAndroid Build Coastguard Worker_check_dmesg() 37*25da2beaSAndroid Build Coastguard Worker{ 38*25da2beaSAndroid Build Coastguard Worker local dmesg_marker="$1" 39*25da2beaSAndroid Build Coastguard Worker local seqres="$2.seqres" 40*25da2beaSAndroid Build Coastguard Worker 41*25da2beaSAndroid Build Coastguard Worker if [ "$DO_KMSG" -eq 0 ]; then 42*25da2beaSAndroid Build Coastguard Worker return 0 43*25da2beaSAndroid Build Coastguard Worker fi 44*25da2beaSAndroid Build Coastguard Worker 45*25da2beaSAndroid Build Coastguard Worker dmesg | bash -c "$DMESG_FILTER" | grep -A 9999 "$dmesg_marker" >"${seqres}.dmesg" 46*25da2beaSAndroid Build Coastguard Worker grep -q -e "kernel BUG at" \ 47*25da2beaSAndroid Build Coastguard Worker -e "WARNING:" \ 48*25da2beaSAndroid Build Coastguard Worker -e "BUG:" \ 49*25da2beaSAndroid Build Coastguard Worker -e "Oops:" \ 50*25da2beaSAndroid Build Coastguard Worker -e "possible recursive locking detected" \ 51*25da2beaSAndroid Build Coastguard Worker -e "Internal error" \ 52*25da2beaSAndroid Build Coastguard Worker -e "INFO: suspicious RCU usage" \ 53*25da2beaSAndroid Build Coastguard Worker -e "INFO: possible circular locking dependency detected" \ 54*25da2beaSAndroid Build Coastguard Worker -e "general protection fault:" \ 55*25da2beaSAndroid Build Coastguard Worker -e "blktests failure" \ 56*25da2beaSAndroid Build Coastguard Worker "${seqres}.dmesg" 57*25da2beaSAndroid Build Coastguard Worker # shellcheck disable=SC2181 58*25da2beaSAndroid Build Coastguard Worker if [[ $? -eq 0 ]]; then 59*25da2beaSAndroid Build Coastguard Worker return 1 60*25da2beaSAndroid Build Coastguard Worker else 61*25da2beaSAndroid Build Coastguard Worker rm -f "${seqres}.dmesg" 62*25da2beaSAndroid Build Coastguard Worker return 0 63*25da2beaSAndroid Build Coastguard Worker fi 64*25da2beaSAndroid Build Coastguard Worker} 65*25da2beaSAndroid Build Coastguard Worker 66*25da2beaSAndroid Build Coastguard Workerrun_test() 67*25da2beaSAndroid Build Coastguard Worker{ 68*25da2beaSAndroid Build Coastguard Worker local test_name="$1" 69*25da2beaSAndroid Build Coastguard Worker local dev="$2" 70*25da2beaSAndroid Build Coastguard Worker local test_exec=("./$test_name") 71*25da2beaSAndroid Build Coastguard Worker local test_string="$test_name" 72*25da2beaSAndroid Build Coastguard Worker local out_name="$test_name" 73*25da2beaSAndroid Build Coastguard Worker 74*25da2beaSAndroid Build Coastguard Worker # Specify test string to print 75*25da2beaSAndroid Build Coastguard Worker if [ -n "$dev" ]; then 76*25da2beaSAndroid Build Coastguard Worker test_exec+=("$dev") 77*25da2beaSAndroid Build Coastguard Worker test_string="$test_name $dev" 78*25da2beaSAndroid Build Coastguard Worker local suffix 79*25da2beaSAndroid Build Coastguard Worker suffix=$(basename "$dev") 80*25da2beaSAndroid Build Coastguard Worker out_name="$out_name.$suffix" 81*25da2beaSAndroid Build Coastguard Worker fi 82*25da2beaSAndroid Build Coastguard Worker 83*25da2beaSAndroid Build Coastguard Worker # Log start of the test 84*25da2beaSAndroid Build Coastguard Worker if [ "$DO_KMSG" -eq 1 ]; then 85*25da2beaSAndroid Build Coastguard Worker local dmesg_marker="Running test $test_string:" 86*25da2beaSAndroid Build Coastguard Worker echo "$dmesg_marker" > /dev/kmsg 87*25da2beaSAndroid Build Coastguard Worker else 88*25da2beaSAndroid Build Coastguard Worker local dmesg_marker="" 89*25da2beaSAndroid Build Coastguard Worker fi 90*25da2beaSAndroid Build Coastguard Worker printf "Running test %-55s" "$test_string" 91*25da2beaSAndroid Build Coastguard Worker 92*25da2beaSAndroid Build Coastguard Worker # Do we have to exclude the test ? 93*25da2beaSAndroid Build Coastguard Worker echo "$TEST_EXCLUDE" | grep -w "$test_name" > /dev/null 2>&1 94*25da2beaSAndroid Build Coastguard Worker # shellcheck disable=SC2181 95*25da2beaSAndroid Build Coastguard Worker if [ $? -eq 0 ]; then 96*25da2beaSAndroid Build Coastguard Worker echo "Test skipped" 97*25da2beaSAndroid Build Coastguard Worker SKIPPED="$SKIPPED <$test_string>" 98*25da2beaSAndroid Build Coastguard Worker return 99*25da2beaSAndroid Build Coastguard Worker fi 100*25da2beaSAndroid Build Coastguard Worker 101*25da2beaSAndroid Build Coastguard Worker # Run the test 102*25da2beaSAndroid Build Coastguard Worker T_START=$(date +%s) 103*25da2beaSAndroid Build Coastguard Worker timeout -s INT -k $TIMEOUT $TIMEOUT "${test_exec[@]}" 104*25da2beaSAndroid Build Coastguard Worker local status=$? 105*25da2beaSAndroid Build Coastguard Worker T_END=$(date +%s) 106*25da2beaSAndroid Build Coastguard Worker 107*25da2beaSAndroid Build Coastguard Worker if [ -e ./core ]; then 108*25da2beaSAndroid Build Coastguard Worker mv core "core-$test_name" 109*25da2beaSAndroid Build Coastguard Worker fi 110*25da2beaSAndroid Build Coastguard Worker 111*25da2beaSAndroid Build Coastguard Worker # Check test status 112*25da2beaSAndroid Build Coastguard Worker if [ "$status" -eq 124 ]; then 113*25da2beaSAndroid Build Coastguard Worker echo "Test $test_name timed out (may not be a failure)" 114*25da2beaSAndroid Build Coastguard Worker TIMED_OUT="$TIMED_OUT <$test_string>" 115*25da2beaSAndroid Build Coastguard Worker elif [ "$status" -ne 0 ]; then 116*25da2beaSAndroid Build Coastguard Worker echo "Test $test_name failed with ret $status" 117*25da2beaSAndroid Build Coastguard Worker FAILED="$FAILED <$test_string>" 118*25da2beaSAndroid Build Coastguard Worker RET=1 119*25da2beaSAndroid Build Coastguard Worker elif ! _check_dmesg "$dmesg_marker" "$test_name"; then 120*25da2beaSAndroid Build Coastguard Worker echo "Test $test_name failed dmesg check" 121*25da2beaSAndroid Build Coastguard Worker FAILED="$FAILED <$test_string>" 122*25da2beaSAndroid Build Coastguard Worker RET=1 123*25da2beaSAndroid Build Coastguard Worker else 124*25da2beaSAndroid Build Coastguard Worker if [ -f "output/$out_name" ]; then 125*25da2beaSAndroid Build Coastguard Worker T_PREV=$(cat "output/$out_name") 126*25da2beaSAndroid Build Coastguard Worker else 127*25da2beaSAndroid Build Coastguard Worker T_PREV="" 128*25da2beaSAndroid Build Coastguard Worker fi 129*25da2beaSAndroid Build Coastguard Worker T_DIFF=$((T_END-T_START)) 130*25da2beaSAndroid Build Coastguard Worker if [ -n "$T_PREV" ]; then 131*25da2beaSAndroid Build Coastguard Worker echo "$T_DIFF sec [$T_PREV]" 132*25da2beaSAndroid Build Coastguard Worker else 133*25da2beaSAndroid Build Coastguard Worker echo "$T_DIFF sec" 134*25da2beaSAndroid Build Coastguard Worker fi 135*25da2beaSAndroid Build Coastguard Worker echo $T_DIFF > "output/$out_name" 136*25da2beaSAndroid Build Coastguard Worker fi 137*25da2beaSAndroid Build Coastguard Worker} 138*25da2beaSAndroid Build Coastguard Worker 139*25da2beaSAndroid Build Coastguard Worker# Run all specified tests 140*25da2beaSAndroid Build Coastguard Workerfor tst in "${TESTS[@]}"; do 141*25da2beaSAndroid Build Coastguard Worker if [ ! -d output ]; then 142*25da2beaSAndroid Build Coastguard Worker mkdir -p output 143*25da2beaSAndroid Build Coastguard Worker fi 144*25da2beaSAndroid Build Coastguard Worker if [ -z "${TEST_MAP[$tst]}" ]; then 145*25da2beaSAndroid Build Coastguard Worker run_test "$tst" 146*25da2beaSAndroid Build Coastguard Worker if [ -n "$TEST_FILES" ]; then 147*25da2beaSAndroid Build Coastguard Worker for dev in $TEST_FILES; do 148*25da2beaSAndroid Build Coastguard Worker run_test "$tst" "$dev" 149*25da2beaSAndroid Build Coastguard Worker done 150*25da2beaSAndroid Build Coastguard Worker fi 151*25da2beaSAndroid Build Coastguard Worker else 152*25da2beaSAndroid Build Coastguard Worker run_test "$tst" "${TEST_MAP[$tst]}" 153*25da2beaSAndroid Build Coastguard Worker fi 154*25da2beaSAndroid Build Coastguard Workerdone 155*25da2beaSAndroid Build Coastguard Worker 156*25da2beaSAndroid Build Coastguard Workerif [ -n "$SKIPPED" ]; then 157*25da2beaSAndroid Build Coastguard Worker echo "Tests skipped: $SKIPPED" 158*25da2beaSAndroid Build Coastguard Workerfi 159*25da2beaSAndroid Build Coastguard Worker 160*25da2beaSAndroid Build Coastguard Workerif [ -n "$TIMED_OUT" ]; then 161*25da2beaSAndroid Build Coastguard Worker echo "Tests timed out: $TIMED_OUT" 162*25da2beaSAndroid Build Coastguard Workerfi 163*25da2beaSAndroid Build Coastguard Worker 164*25da2beaSAndroid Build Coastguard Workerif [ "${RET}" -ne 0 ]; then 165*25da2beaSAndroid Build Coastguard Worker echo "Tests failed: $FAILED" 166*25da2beaSAndroid Build Coastguard Worker exit $RET 167*25da2beaSAndroid Build Coastguard Workerelse 168*25da2beaSAndroid Build Coastguard Worker echo "All tests passed" 169*25da2beaSAndroid Build Coastguard Worker exit 0 170*25da2beaSAndroid Build Coastguard Workerfi 171