xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/ftrace/ftracetest (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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