xref: /aosp_15_r20/external/linux-kselftest/tools/testing/selftests/ftrace/ftracetest (revision 053f45be4e351dfd5e965df293cd45b779f579ee)
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