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