1*053f45beSAndroid Build Coastguard Worker#!/bin/sh 2*053f45beSAndroid Build Coastguard Worker# SPDX-License-Identifier: GPL-2.0-only 3*053f45beSAndroid Build Coastguard Worker 4*053f45beSAndroid Build Coastguard Worker# ftracetest - Ftrace test shell scripts 5*053f45beSAndroid Build Coastguard Worker# 6*053f45beSAndroid Build Coastguard Worker# Copyright (C) Hitachi Ltd., 2014 7*053f45beSAndroid Build Coastguard Worker# Written by Masami Hiramatsu <[email protected]> 8*053f45beSAndroid Build Coastguard Worker# 9*053f45beSAndroid Build Coastguard Worker 10*053f45beSAndroid Build Coastguard Workerusage() { # errno [message] 11*053f45beSAndroid Build Coastguard Worker[ ! -z "$2" ] && echo $2 12*053f45beSAndroid Build Coastguard Workerecho "Usage: ftracetest [options] [testcase(s)] [testcase-directory(s)]" 13*053f45beSAndroid Build Coastguard Workerecho " Options:" 14*053f45beSAndroid Build Coastguard Workerecho " -h|--help Show help message" 15*053f45beSAndroid Build Coastguard Workerecho " -k|--keep Keep passed test logs" 16*053f45beSAndroid Build Coastguard Workerecho " -v|--verbose Increase verbosity of test messages" 17*053f45beSAndroid Build Coastguard Workerecho " -vv Alias of -v -v (Show all results in stdout)" 18*053f45beSAndroid Build Coastguard Workerecho " -vvv Alias of -v -v -v (Show all commands immediately)" 19*053f45beSAndroid Build Coastguard Workerecho " --fail-unsupported Treat UNSUPPORTED as a failure" 20*053f45beSAndroid Build Coastguard Workerecho " --fail-unresolved Treat UNRESOLVED as a failure" 21*053f45beSAndroid Build Coastguard Workerecho " -d|--debug Debug mode (trace all shell commands)" 22*053f45beSAndroid Build Coastguard Workerecho " -l|--logdir <dir> Save logs on the <dir>" 23*053f45beSAndroid Build Coastguard Workerecho " If <dir> is -, all logs output in console only" 24*053f45beSAndroid Build Coastguard Workerexit $1 25*053f45beSAndroid Build Coastguard Worker} 26*053f45beSAndroid Build Coastguard Worker 27*053f45beSAndroid Build Coastguard Worker# default error 28*053f45beSAndroid Build Coastguard Workererr_ret=1 29*053f45beSAndroid Build Coastguard Worker 30*053f45beSAndroid Build Coastguard Worker# kselftest skip code is 4 31*053f45beSAndroid Build Coastguard Workererr_skip=4 32*053f45beSAndroid Build Coastguard Worker 33*053f45beSAndroid Build Coastguard Worker# cgroup RT scheduling prevents chrt commands from succeeding, which 34*053f45beSAndroid Build Coastguard Worker# induces failures in test wakeup tests. Disable for the duration of 35*053f45beSAndroid Build Coastguard Worker# the tests. 36*053f45beSAndroid Build Coastguard Worker 37*053f45beSAndroid Build Coastguard Workerreadonly sched_rt_runtime=/proc/sys/kernel/sched_rt_runtime_us 38*053f45beSAndroid Build Coastguard Worker 39*053f45beSAndroid Build Coastguard Workersched_rt_runtime_orig=$(cat $sched_rt_runtime) 40*053f45beSAndroid Build Coastguard Worker 41*053f45beSAndroid Build Coastguard Workersetup() { 42*053f45beSAndroid Build Coastguard Worker echo -1 > $sched_rt_runtime 43*053f45beSAndroid Build Coastguard Worker} 44*053f45beSAndroid Build Coastguard Worker 45*053f45beSAndroid Build Coastguard Workercleanup() { 46*053f45beSAndroid Build Coastguard Worker echo $sched_rt_runtime_orig > $sched_rt_runtime 47*053f45beSAndroid Build Coastguard Worker} 48*053f45beSAndroid Build Coastguard Worker 49*053f45beSAndroid Build Coastguard Workererrexit() { # message 50*053f45beSAndroid Build Coastguard Worker echo "Error: $1" 1>&2 51*053f45beSAndroid Build Coastguard Worker cleanup 52*053f45beSAndroid Build Coastguard Worker exit $err_ret 53*053f45beSAndroid Build Coastguard Worker} 54*053f45beSAndroid Build Coastguard Worker 55*053f45beSAndroid Build Coastguard Worker# Ensuring user privilege 56*053f45beSAndroid Build Coastguard Workerif [ `id -u` -ne 0 ]; then 57*053f45beSAndroid Build Coastguard Worker errexit "this must be run by root user" 58*053f45beSAndroid Build Coastguard Workerfi 59*053f45beSAndroid Build Coastguard Worker 60*053f45beSAndroid Build Coastguard Workersetup 61*053f45beSAndroid Build Coastguard Worker 62*053f45beSAndroid Build Coastguard Worker# Utilities 63*053f45beSAndroid Build Coastguard Workerabsdir() { # file_path 64*053f45beSAndroid Build Coastguard Worker (cd `dirname $1`; pwd) 65*053f45beSAndroid Build Coastguard Worker} 66*053f45beSAndroid Build Coastguard Worker 67*053f45beSAndroid Build Coastguard Workerabspath() { 68*053f45beSAndroid Build Coastguard Worker echo `absdir $1`/`basename $1` 69*053f45beSAndroid Build Coastguard Worker} 70*053f45beSAndroid Build Coastguard Worker 71*053f45beSAndroid Build Coastguard Workerfind_testcases() { #directory 72*053f45beSAndroid Build Coastguard Worker echo `find $1 -name \*.tc | sort` 73*053f45beSAndroid Build Coastguard Worker} 74*053f45beSAndroid Build Coastguard Worker 75*053f45beSAndroid Build Coastguard Workerparse_opts() { # opts 76*053f45beSAndroid Build Coastguard Worker local OPT_TEST_CASES= 77*053f45beSAndroid Build Coastguard Worker local OPT_TEST_DIR= 78*053f45beSAndroid Build Coastguard Worker 79*053f45beSAndroid Build Coastguard Worker while [ ! -z "$1" ]; do 80*053f45beSAndroid Build Coastguard Worker case "$1" in 81*053f45beSAndroid Build Coastguard Worker --help|-h) 82*053f45beSAndroid Build Coastguard Worker usage 0 83*053f45beSAndroid Build Coastguard Worker ;; 84*053f45beSAndroid Build Coastguard Worker --keep|-k) 85*053f45beSAndroid Build Coastguard Worker KEEP_LOG=1 86*053f45beSAndroid Build Coastguard Worker shift 1 87*053f45beSAndroid Build Coastguard Worker ;; 88*053f45beSAndroid Build Coastguard Worker --verbose|-v|-vv|-vvv) 89*053f45beSAndroid Build Coastguard Worker if [ $VERBOSE -eq -1 ]; then 90*053f45beSAndroid Build Coastguard Worker usage "--console can not use with --verbose" 91*053f45beSAndroid Build Coastguard Worker fi 92*053f45beSAndroid Build Coastguard Worker VERBOSE=$((VERBOSE + 1)) 93*053f45beSAndroid Build Coastguard Worker [ $1 = '-vv' ] && VERBOSE=$((VERBOSE + 1)) 94*053f45beSAndroid Build Coastguard Worker [ $1 = '-vvv' ] && VERBOSE=$((VERBOSE + 2)) 95*053f45beSAndroid Build Coastguard Worker shift 1 96*053f45beSAndroid Build Coastguard Worker ;; 97*053f45beSAndroid Build Coastguard Worker --console) 98*053f45beSAndroid Build Coastguard Worker if [ $VERBOSE -ne 0 ]; then 99*053f45beSAndroid Build Coastguard Worker usage "--console can not use with --verbose" 100*053f45beSAndroid Build Coastguard Worker fi 101*053f45beSAndroid Build Coastguard Worker VERBOSE=-1 102*053f45beSAndroid Build Coastguard Worker shift 1 103*053f45beSAndroid Build Coastguard Worker ;; 104*053f45beSAndroid Build Coastguard Worker --debug|-d) 105*053f45beSAndroid Build Coastguard Worker DEBUG=1 106*053f45beSAndroid Build Coastguard Worker shift 1 107*053f45beSAndroid Build Coastguard Worker ;; 108*053f45beSAndroid Build Coastguard Worker --stop-fail) 109*053f45beSAndroid Build Coastguard Worker STOP_FAILURE=1 110*053f45beSAndroid Build Coastguard Worker shift 1 111*053f45beSAndroid Build Coastguard Worker ;; 112*053f45beSAndroid Build Coastguard Worker --fail-unsupported) 113*053f45beSAndroid Build Coastguard Worker UNSUPPORTED_RESULT=1 114*053f45beSAndroid Build Coastguard Worker shift 1 115*053f45beSAndroid Build Coastguard Worker ;; 116*053f45beSAndroid Build Coastguard Worker --fail-unresolved) 117*053f45beSAndroid Build Coastguard Worker UNRESOLVED_RESULT=1 118*053f45beSAndroid Build Coastguard Worker shift 1 119*053f45beSAndroid Build Coastguard Worker ;; 120*053f45beSAndroid Build Coastguard Worker --logdir|-l) 121*053f45beSAndroid Build Coastguard Worker LOG_DIR=$2 122*053f45beSAndroid Build Coastguard Worker shift 2 123*053f45beSAndroid Build Coastguard Worker ;; 124*053f45beSAndroid Build Coastguard Worker *.tc) 125*053f45beSAndroid Build Coastguard Worker if [ -f "$1" ]; then 126*053f45beSAndroid Build Coastguard Worker OPT_TEST_CASES="$OPT_TEST_CASES `abspath $1`" 127*053f45beSAndroid Build Coastguard Worker shift 1 128*053f45beSAndroid Build Coastguard Worker else 129*053f45beSAndroid Build Coastguard Worker usage 1 "$1 is not a testcase" 130*053f45beSAndroid Build Coastguard Worker fi 131*053f45beSAndroid Build Coastguard Worker ;; 132*053f45beSAndroid Build Coastguard Worker *) 133*053f45beSAndroid Build Coastguard Worker if [ -d "$1" ]; then 134*053f45beSAndroid Build Coastguard Worker OPT_TEST_DIR=`abspath $1` 135*053f45beSAndroid Build Coastguard Worker OPT_TEST_CASES="$OPT_TEST_CASES `find_testcases $OPT_TEST_DIR`" 136*053f45beSAndroid Build Coastguard Worker shift 1 137*053f45beSAndroid Build Coastguard Worker else 138*053f45beSAndroid Build Coastguard Worker usage 1 "Invalid option ($1)" 139*053f45beSAndroid Build Coastguard Worker fi 140*053f45beSAndroid Build Coastguard Worker ;; 141*053f45beSAndroid Build Coastguard Worker esac 142*053f45beSAndroid Build Coastguard Worker done 143*053f45beSAndroid Build Coastguard Worker if [ ! -z "$OPT_TEST_CASES" ]; then 144*053f45beSAndroid Build Coastguard Worker TEST_CASES=$OPT_TEST_CASES 145*053f45beSAndroid Build Coastguard Worker fi 146*053f45beSAndroid Build Coastguard Worker} 147*053f45beSAndroid Build Coastguard Worker 148*053f45beSAndroid Build Coastguard Worker# Parameters 149*053f45beSAndroid Build Coastguard WorkerTRACING_DIR=`grep tracefs /proc/mounts | cut -f2 -d' ' | head -1` 150*053f45beSAndroid Build Coastguard Workerif [ -z "$TRACING_DIR" ]; then 151*053f45beSAndroid Build Coastguard Worker DEBUGFS_DIR=`grep debugfs /proc/mounts | cut -f2 -d' ' | head -1` 152*053f45beSAndroid Build Coastguard Worker if [ -z "$DEBUGFS_DIR" ]; then 153*053f45beSAndroid Build Coastguard Worker # If tracefs exists, then so does /sys/kernel/tracing 154*053f45beSAndroid Build Coastguard Worker if [ -d "/sys/kernel/tracing" ]; then 155*053f45beSAndroid Build Coastguard Worker mount -t tracefs nodev /sys/kernel/tracing || 156*053f45beSAndroid Build Coastguard Worker errexit "Failed to mount /sys/kernel/tracing" 157*053f45beSAndroid Build Coastguard Worker TRACING_DIR="/sys/kernel/tracing" 158*053f45beSAndroid Build Coastguard Worker # If debugfs exists, then so does /sys/kernel/debug 159*053f45beSAndroid Build Coastguard Worker elif [ -d "/sys/kernel/debug" ]; then 160*053f45beSAndroid Build Coastguard Worker mount -t debugfs nodev /sys/kernel/debug || 161*053f45beSAndroid Build Coastguard Worker errexit "Failed to mount /sys/kernel/debug" 162*053f45beSAndroid Build Coastguard Worker TRACING_DIR="/sys/kernel/debug/tracing" 163*053f45beSAndroid Build Coastguard Worker else 164*053f45beSAndroid Build Coastguard Worker err_ret=$err_skip 165*053f45beSAndroid Build Coastguard Worker errexit "debugfs and tracefs are not configured in this kernel" 166*053f45beSAndroid Build Coastguard Worker fi 167*053f45beSAndroid Build Coastguard Worker else 168*053f45beSAndroid Build Coastguard Worker TRACING_DIR="$DEBUGFS_DIR/tracing" 169*053f45beSAndroid Build Coastguard Worker fi 170*053f45beSAndroid Build Coastguard Workerfi 171*053f45beSAndroid Build Coastguard Workerif [ ! -d "$TRACING_DIR" ]; then 172*053f45beSAndroid Build Coastguard Worker err_ret=$err_skip 173*053f45beSAndroid Build Coastguard Worker errexit "ftrace is not configured in this kernel" 174*053f45beSAndroid Build Coastguard Workerfi 175*053f45beSAndroid Build Coastguard Worker 176*053f45beSAndroid Build Coastguard WorkerTOP_DIR=`absdir $0` 177*053f45beSAndroid Build Coastguard WorkerTEST_DIR=$TOP_DIR/test.d 178*053f45beSAndroid Build Coastguard WorkerTEST_CASES=`find_testcases $TEST_DIR` 179*053f45beSAndroid Build Coastguard WorkerLOG_DIR=$TOP_DIR/logs/`date +%Y%m%d-%H%M%S`/ 180*053f45beSAndroid Build Coastguard WorkerKEEP_LOG=0 181*053f45beSAndroid Build Coastguard WorkerDEBUG=0 182*053f45beSAndroid Build Coastguard WorkerVERBOSE=0 183*053f45beSAndroid Build Coastguard WorkerUNSUPPORTED_RESULT=0 184*053f45beSAndroid Build Coastguard WorkerUNRESOLVED_RESULT=0 185*053f45beSAndroid Build Coastguard WorkerSTOP_FAILURE=0 186*053f45beSAndroid Build Coastguard Worker# Parse command-line options 187*053f45beSAndroid Build Coastguard Workerparse_opts $* 188*053f45beSAndroid Build Coastguard Worker 189*053f45beSAndroid Build Coastguard Worker[ $DEBUG -ne 0 ] && set -x 190*053f45beSAndroid Build Coastguard Worker 191*053f45beSAndroid Build Coastguard Worker# Verify parameters 192*053f45beSAndroid Build Coastguard Workerif [ -z "$TRACING_DIR" -o ! -d "$TRACING_DIR" ]; then 193*053f45beSAndroid Build Coastguard Worker errexit "No ftrace directory found" 194*053f45beSAndroid Build Coastguard Workerfi 195*053f45beSAndroid Build Coastguard Worker 196*053f45beSAndroid Build Coastguard Worker# Preparing logs 197*053f45beSAndroid Build Coastguard Workerif [ "x$LOG_DIR" = "x-" ]; then 198*053f45beSAndroid Build Coastguard Worker LOG_FILE= 199*053f45beSAndroid Build Coastguard Worker date 200*053f45beSAndroid Build Coastguard Workerelse 201*053f45beSAndroid Build Coastguard Worker LOG_FILE=$LOG_DIR/ftracetest.log 202*053f45beSAndroid Build Coastguard Worker mkdir -p $LOG_DIR || errexit "Failed to make a log directory: $LOG_DIR" 203*053f45beSAndroid Build Coastguard Worker date > $LOG_FILE 204*053f45beSAndroid Build Coastguard Workerfi 205*053f45beSAndroid Build Coastguard Worker 206*053f45beSAndroid Build Coastguard Worker# Define text colors 207*053f45beSAndroid Build Coastguard Worker# Check available colors on the terminal, if any 208*053f45beSAndroid Build Coastguard Workerncolors=`tput colors 2>/dev/null || echo 0` 209*053f45beSAndroid Build Coastguard Workercolor_reset= 210*053f45beSAndroid Build Coastguard Workercolor_red= 211*053f45beSAndroid Build Coastguard Workercolor_green= 212*053f45beSAndroid Build Coastguard Workercolor_blue= 213*053f45beSAndroid Build Coastguard Worker# If stdout exists and number of colors is eight or more, use them 214*053f45beSAndroid Build Coastguard Workerif [ -t 1 -a "$ncolors" -ge 8 ]; then 215*053f45beSAndroid Build Coastguard Worker color_reset="\033[0m" 216*053f45beSAndroid Build Coastguard Worker color_red="\033[31m" 217*053f45beSAndroid Build Coastguard Worker color_green="\033[32m" 218*053f45beSAndroid Build Coastguard Worker color_blue="\033[34m" 219*053f45beSAndroid Build Coastguard Workerfi 220*053f45beSAndroid Build Coastguard Worker 221*053f45beSAndroid Build Coastguard Workerstrip_esc() { 222*053f45beSAndroid Build Coastguard Worker # busybox sed implementation doesn't accept "\x1B", so use [:cntrl:] instead. 223*053f45beSAndroid Build Coastguard Worker sed -E "s/[[:cntrl:]]\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" 224*053f45beSAndroid Build Coastguard Worker} 225*053f45beSAndroid Build Coastguard Worker 226*053f45beSAndroid Build Coastguard Workerprlog() { # messages 227*053f45beSAndroid Build Coastguard Worker newline="\n" 228*053f45beSAndroid Build Coastguard Worker if [ "$1" = "-n" ] ; then 229*053f45beSAndroid Build Coastguard Worker newline= 230*053f45beSAndroid Build Coastguard Worker shift 231*053f45beSAndroid Build Coastguard Worker fi 232*053f45beSAndroid Build Coastguard Worker printf "$*$newline" 233*053f45beSAndroid Build Coastguard Worker [ "$LOG_FILE" ] && printf "$*$newline" | strip_esc >> $LOG_FILE 234*053f45beSAndroid Build Coastguard Worker} 235*053f45beSAndroid Build Coastguard Workercatlog() { #file 236*053f45beSAndroid Build Coastguard Worker cat $1 237*053f45beSAndroid Build Coastguard Worker [ "$LOG_FILE" ] && cat $1 | strip_esc >> $LOG_FILE 238*053f45beSAndroid Build Coastguard Worker} 239*053f45beSAndroid Build Coastguard Workerprlog "=== Ftrace unit tests ===" 240*053f45beSAndroid Build Coastguard Worker 241*053f45beSAndroid Build Coastguard Worker 242*053f45beSAndroid Build Coastguard Worker# Testcase management 243*053f45beSAndroid Build Coastguard Worker# Test result codes - Dejagnu extended code 244*053f45beSAndroid Build Coastguard WorkerPASS=0 # The test succeeded. 245*053f45beSAndroid Build Coastguard WorkerFAIL=1 # The test failed, but was expected to succeed. 246*053f45beSAndroid Build Coastguard WorkerUNRESOLVED=2 # The test produced indeterminate results. (e.g. interrupted) 247*053f45beSAndroid Build Coastguard WorkerUNTESTED=3 # The test was not run, currently just a placeholder. 248*053f45beSAndroid Build Coastguard WorkerUNSUPPORTED=4 # The test failed because of lack of feature. 249*053f45beSAndroid Build Coastguard WorkerXFAIL=5 # The test failed, and was expected to fail. 250*053f45beSAndroid Build Coastguard Worker 251*053f45beSAndroid Build Coastguard Worker# Accumulations 252*053f45beSAndroid Build Coastguard WorkerPASSED_CASES= 253*053f45beSAndroid Build Coastguard WorkerFAILED_CASES= 254*053f45beSAndroid Build Coastguard WorkerUNRESOLVED_CASES= 255*053f45beSAndroid Build Coastguard WorkerUNTESTED_CASES= 256*053f45beSAndroid Build Coastguard WorkerUNSUPPORTED_CASES= 257*053f45beSAndroid Build Coastguard WorkerXFAILED_CASES= 258*053f45beSAndroid Build Coastguard WorkerUNDEFINED_CASES= 259*053f45beSAndroid Build Coastguard WorkerTOTAL_RESULT=0 260*053f45beSAndroid Build Coastguard Worker 261*053f45beSAndroid Build Coastguard WorkerINSTANCE= 262*053f45beSAndroid Build Coastguard WorkerCASENO=0 263*053f45beSAndroid Build Coastguard Worker 264*053f45beSAndroid Build Coastguard Workertestcase() { # testfile 265*053f45beSAndroid Build Coastguard Worker CASENO=$((CASENO+1)) 266*053f45beSAndroid Build Coastguard Worker desc=`grep "^#[ \t]*description:" $1 | cut -f2- -d:` 267*053f45beSAndroid Build Coastguard Worker prlog -n "[$CASENO]$INSTANCE$desc" 268*053f45beSAndroid Build Coastguard Worker} 269*053f45beSAndroid Build Coastguard Worker 270*053f45beSAndroid Build Coastguard Workercheckreq() { # testfile 271*053f45beSAndroid Build Coastguard Worker requires=`grep "^#[ \t]*requires:" $1 | cut -f2- -d:` 272*053f45beSAndroid Build Coastguard Worker # Use eval to pass quoted-patterns correctly. 273*053f45beSAndroid Build Coastguard Worker eval check_requires "$requires" 274*053f45beSAndroid Build Coastguard Worker} 275*053f45beSAndroid Build Coastguard Worker 276*053f45beSAndroid Build Coastguard Workertest_on_instance() { # testfile 277*053f45beSAndroid Build Coastguard Worker grep -q "^#[ \t]*flags:.*instance" $1 278*053f45beSAndroid Build Coastguard Worker} 279*053f45beSAndroid Build Coastguard Worker 280*053f45beSAndroid Build Coastguard Workereval_result() { # sigval 281*053f45beSAndroid Build Coastguard Worker case $1 in 282*053f45beSAndroid Build Coastguard Worker $PASS) 283*053f45beSAndroid Build Coastguard Worker prlog " [${color_green}PASS${color_reset}]" 284*053f45beSAndroid Build Coastguard Worker PASSED_CASES="$PASSED_CASES $CASENO" 285*053f45beSAndroid Build Coastguard Worker return 0 286*053f45beSAndroid Build Coastguard Worker ;; 287*053f45beSAndroid Build Coastguard Worker $FAIL) 288*053f45beSAndroid Build Coastguard Worker prlog " [${color_red}FAIL${color_reset}]" 289*053f45beSAndroid Build Coastguard Worker FAILED_CASES="$FAILED_CASES $CASENO" 290*053f45beSAndroid Build Coastguard Worker return 1 # this is a bug. 291*053f45beSAndroid Build Coastguard Worker ;; 292*053f45beSAndroid Build Coastguard Worker $UNRESOLVED) 293*053f45beSAndroid Build Coastguard Worker prlog " [${color_blue}UNRESOLVED${color_reset}]" 294*053f45beSAndroid Build Coastguard Worker UNRESOLVED_CASES="$UNRESOLVED_CASES $CASENO" 295*053f45beSAndroid Build Coastguard Worker return $UNRESOLVED_RESULT # depends on use case 296*053f45beSAndroid Build Coastguard Worker ;; 297*053f45beSAndroid Build Coastguard Worker $UNTESTED) 298*053f45beSAndroid Build Coastguard Worker prlog " [${color_blue}UNTESTED${color_reset}]" 299*053f45beSAndroid Build Coastguard Worker UNTESTED_CASES="$UNTESTED_CASES $CASENO" 300*053f45beSAndroid Build Coastguard Worker return 0 301*053f45beSAndroid Build Coastguard Worker ;; 302*053f45beSAndroid Build Coastguard Worker $UNSUPPORTED) 303*053f45beSAndroid Build Coastguard Worker prlog " [${color_blue}UNSUPPORTED${color_reset}]" 304*053f45beSAndroid Build Coastguard Worker UNSUPPORTED_CASES="$UNSUPPORTED_CASES $CASENO" 305*053f45beSAndroid Build Coastguard Worker return $UNSUPPORTED_RESULT # depends on use case 306*053f45beSAndroid Build Coastguard Worker ;; 307*053f45beSAndroid Build Coastguard Worker $XFAIL) 308*053f45beSAndroid Build Coastguard Worker prlog " [${color_green}XFAIL${color_reset}]" 309*053f45beSAndroid Build Coastguard Worker XFAILED_CASES="$XFAILED_CASES $CASENO" 310*053f45beSAndroid Build Coastguard Worker return 0 311*053f45beSAndroid Build Coastguard Worker ;; 312*053f45beSAndroid Build Coastguard Worker *) 313*053f45beSAndroid Build Coastguard Worker prlog " [${color_blue}UNDEFINED${color_reset}]" 314*053f45beSAndroid Build Coastguard Worker UNDEFINED_CASES="$UNDEFINED_CASES $CASENO" 315*053f45beSAndroid Build Coastguard Worker return 1 # this must be a test bug 316*053f45beSAndroid Build Coastguard Worker ;; 317*053f45beSAndroid Build Coastguard Worker esac 318*053f45beSAndroid Build Coastguard Worker} 319*053f45beSAndroid Build Coastguard Worker 320*053f45beSAndroid Build Coastguard Worker# Signal handling for result codes 321*053f45beSAndroid Build Coastguard WorkerSIG_RESULT= 322*053f45beSAndroid Build Coastguard WorkerSIG_BASE=36 # Use realtime signals 323*053f45beSAndroid Build Coastguard WorkerSIG_PID=$$ 324*053f45beSAndroid Build Coastguard Worker 325*053f45beSAndroid Build Coastguard Workerexit_pass () { 326*053f45beSAndroid Build Coastguard Worker exit 0 327*053f45beSAndroid Build Coastguard Worker} 328*053f45beSAndroid Build Coastguard Worker 329*053f45beSAndroid Build Coastguard WorkerSIG_FAIL=$((SIG_BASE + FAIL)) 330*053f45beSAndroid Build Coastguard Workerexit_fail () { 331*053f45beSAndroid Build Coastguard Worker exit 1 332*053f45beSAndroid Build Coastguard Worker} 333*053f45beSAndroid Build Coastguard Workertrap 'SIG_RESULT=$FAIL' $SIG_FAIL 334*053f45beSAndroid Build Coastguard Worker 335*053f45beSAndroid Build Coastguard WorkerSIG_UNRESOLVED=$((SIG_BASE + UNRESOLVED)) 336*053f45beSAndroid Build Coastguard Workerexit_unresolved () { 337*053f45beSAndroid Build Coastguard Worker kill -s $SIG_UNRESOLVED $SIG_PID 338*053f45beSAndroid Build Coastguard Worker exit 0 339*053f45beSAndroid Build Coastguard Worker} 340*053f45beSAndroid Build Coastguard Workertrap 'SIG_RESULT=$UNRESOLVED' $SIG_UNRESOLVED 341*053f45beSAndroid Build Coastguard Worker 342*053f45beSAndroid Build Coastguard WorkerSIG_UNTESTED=$((SIG_BASE + UNTESTED)) 343*053f45beSAndroid Build Coastguard Workerexit_untested () { 344*053f45beSAndroid Build Coastguard Worker kill -s $SIG_UNTESTED $SIG_PID 345*053f45beSAndroid Build Coastguard Worker exit 0 346*053f45beSAndroid Build Coastguard Worker} 347*053f45beSAndroid Build Coastguard Workertrap 'SIG_RESULT=$UNTESTED' $SIG_UNTESTED 348*053f45beSAndroid Build Coastguard Worker 349*053f45beSAndroid Build Coastguard WorkerSIG_UNSUPPORTED=$((SIG_BASE + UNSUPPORTED)) 350*053f45beSAndroid Build Coastguard Workerexit_unsupported () { 351*053f45beSAndroid Build Coastguard Worker kill -s $SIG_UNSUPPORTED $SIG_PID 352*053f45beSAndroid Build Coastguard Worker exit 0 353*053f45beSAndroid Build Coastguard Worker} 354*053f45beSAndroid Build Coastguard Workertrap 'SIG_RESULT=$UNSUPPORTED' $SIG_UNSUPPORTED 355*053f45beSAndroid Build Coastguard Worker 356*053f45beSAndroid Build Coastguard WorkerSIG_XFAIL=$((SIG_BASE + XFAIL)) 357*053f45beSAndroid Build Coastguard Workerexit_xfail () { 358*053f45beSAndroid Build Coastguard Worker kill -s $SIG_XFAIL $SIG_PID 359*053f45beSAndroid Build Coastguard Worker exit 0 360*053f45beSAndroid Build Coastguard Worker} 361*053f45beSAndroid Build Coastguard Workertrap 'SIG_RESULT=$XFAIL' $SIG_XFAIL 362*053f45beSAndroid Build Coastguard Worker 363*053f45beSAndroid Build Coastguard Worker__run_test() { # testfile 364*053f45beSAndroid Build Coastguard Worker # setup PID and PPID, $$ is not updated. 365*053f45beSAndroid Build Coastguard Worker (cd $TRACING_DIR; read PID _ < /proc/self/stat; set -e; set -x; 366*053f45beSAndroid Build Coastguard Worker checkreq $1; initialize_ftrace; . $1) 367*053f45beSAndroid Build Coastguard Worker [ $? -ne 0 ] && kill -s $SIG_FAIL $SIG_PID 368*053f45beSAndroid Build Coastguard Worker} 369*053f45beSAndroid Build Coastguard Worker 370*053f45beSAndroid Build Coastguard Worker# Run one test case 371*053f45beSAndroid Build Coastguard Workerrun_test() { # testfile 372*053f45beSAndroid Build Coastguard Worker local testname=`basename $1` 373*053f45beSAndroid Build Coastguard Worker testcase $1 374*053f45beSAndroid Build Coastguard Worker if [ ! -z "$LOG_FILE" ] ; then 375*053f45beSAndroid Build Coastguard Worker local testlog=`mktemp $LOG_DIR/${CASENO}-${testname}-log.XXXXXX` 376*053f45beSAndroid Build Coastguard Worker else 377*053f45beSAndroid Build Coastguard Worker local testlog=/proc/self/fd/1 378*053f45beSAndroid Build Coastguard Worker fi 379*053f45beSAndroid Build Coastguard Worker export TMPDIR=`mktemp -d /tmp/ftracetest-dir.XXXXXX` 380*053f45beSAndroid Build Coastguard Worker export FTRACETEST_ROOT=$TOP_DIR 381*053f45beSAndroid Build Coastguard Worker echo "execute$INSTANCE: "$1 > $testlog 382*053f45beSAndroid Build Coastguard Worker SIG_RESULT=0 383*053f45beSAndroid Build Coastguard Worker if [ $VERBOSE -eq -1 ]; then 384*053f45beSAndroid Build Coastguard Worker __run_test $1 385*053f45beSAndroid Build Coastguard Worker elif [ -z "$LOG_FILE" ]; then 386*053f45beSAndroid Build Coastguard Worker __run_test $1 2>&1 387*053f45beSAndroid Build Coastguard Worker elif [ $VERBOSE -ge 3 ]; then 388*053f45beSAndroid Build Coastguard Worker __run_test $1 | tee -a $testlog 2>&1 389*053f45beSAndroid Build Coastguard Worker elif [ $VERBOSE -eq 2 ]; then 390*053f45beSAndroid Build Coastguard Worker __run_test $1 2>> $testlog | tee -a $testlog 391*053f45beSAndroid Build Coastguard Worker else 392*053f45beSAndroid Build Coastguard Worker __run_test $1 >> $testlog 2>&1 393*053f45beSAndroid Build Coastguard Worker fi 394*053f45beSAndroid Build Coastguard Worker eval_result $SIG_RESULT 395*053f45beSAndroid Build Coastguard Worker if [ $? -eq 0 ]; then 396*053f45beSAndroid Build Coastguard Worker # Remove test log if the test was done as it was expected. 397*053f45beSAndroid Build Coastguard Worker [ $KEEP_LOG -eq 0 -a ! -z "$LOG_FILE" ] && rm $testlog 398*053f45beSAndroid Build Coastguard Worker else 399*053f45beSAndroid Build Coastguard Worker [ $VERBOSE -eq 1 -o $VERBOSE -eq 2 ] && catlog $testlog 400*053f45beSAndroid Build Coastguard Worker TOTAL_RESULT=1 401*053f45beSAndroid Build Coastguard Worker fi 402*053f45beSAndroid Build Coastguard Worker rm -rf $TMPDIR 403*053f45beSAndroid Build Coastguard Worker} 404*053f45beSAndroid Build Coastguard Worker 405*053f45beSAndroid Build Coastguard Worker# load in the helper functions 406*053f45beSAndroid Build Coastguard Worker. $TEST_DIR/functions 407*053f45beSAndroid Build Coastguard Worker 408*053f45beSAndroid Build Coastguard Worker# Main loop 409*053f45beSAndroid Build Coastguard Workerfor t in $TEST_CASES; do 410*053f45beSAndroid Build Coastguard Worker run_test $t 411*053f45beSAndroid Build Coastguard Worker if [ $STOP_FAILURE -ne 0 -a $TOTAL_RESULT -ne 0 ]; then 412*053f45beSAndroid Build Coastguard Worker echo "A failure detected. Stop test." 413*053f45beSAndroid Build Coastguard Worker exit 1 414*053f45beSAndroid Build Coastguard Worker fi 415*053f45beSAndroid Build Coastguard Workerdone 416*053f45beSAndroid Build Coastguard Worker 417*053f45beSAndroid Build Coastguard Worker# Test on instance loop 418*053f45beSAndroid Build Coastguard WorkerINSTANCE=" (instance) " 419*053f45beSAndroid Build Coastguard Workerfor t in $TEST_CASES; do 420*053f45beSAndroid Build Coastguard Worker test_on_instance $t || continue 421*053f45beSAndroid Build Coastguard Worker SAVED_TRACING_DIR=$TRACING_DIR 422*053f45beSAndroid Build Coastguard Worker export TRACING_DIR=`mktemp -d $TRACING_DIR/instances/ftracetest.XXXXXX` 423*053f45beSAndroid Build Coastguard Worker run_test $t 424*053f45beSAndroid Build Coastguard Worker rmdir $TRACING_DIR 425*053f45beSAndroid Build Coastguard Worker TRACING_DIR=$SAVED_TRACING_DIR 426*053f45beSAndroid Build Coastguard Worker if [ $STOP_FAILURE -ne 0 -a $TOTAL_RESULT -ne 0 ]; then 427*053f45beSAndroid Build Coastguard Worker echo "A failure detected. Stop test." 428*053f45beSAndroid Build Coastguard Worker exit 1 429*053f45beSAndroid Build Coastguard Worker fi 430*053f45beSAndroid Build Coastguard Workerdone 431*053f45beSAndroid Build Coastguard Worker(cd $TRACING_DIR; finish_ftrace) # for cleanup 432*053f45beSAndroid Build Coastguard Worker 433*053f45beSAndroid Build Coastguard Workerprlog "" 434*053f45beSAndroid Build Coastguard Workerprlog "# of passed: " `echo $PASSED_CASES | wc -w` 435*053f45beSAndroid Build Coastguard Workerprlog "# of failed: " `echo $FAILED_CASES | wc -w` 436*053f45beSAndroid Build Coastguard Workerprlog "# of unresolved: " `echo $UNRESOLVED_CASES | wc -w` 437*053f45beSAndroid Build Coastguard Workerprlog "# of untested: " `echo $UNTESTED_CASES | wc -w` 438*053f45beSAndroid Build Coastguard Workerprlog "# of unsupported: " `echo $UNSUPPORTED_CASES | wc -w` 439*053f45beSAndroid Build Coastguard Workerprlog "# of xfailed: " `echo $XFAILED_CASES | wc -w` 440*053f45beSAndroid Build Coastguard Workerprlog "# of undefined(test bug): " `echo $UNDEFINED_CASES | wc -w` 441*053f45beSAndroid Build Coastguard Worker 442*053f45beSAndroid Build Coastguard Workercleanup 443*053f45beSAndroid Build Coastguard Worker 444*053f45beSAndroid Build Coastguard Worker# if no error, return 0 445*053f45beSAndroid Build Coastguard Workerexit $TOTAL_RESULT 446