18c2ecf20Sopenharmony_ci#!/bin/sh
28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci# ftracetest - Ftrace test shell scripts
58c2ecf20Sopenharmony_ci#
68c2ecf20Sopenharmony_ci# Copyright (C) Hitachi Ltd., 2014
78c2ecf20Sopenharmony_ci#  Written by Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
88c2ecf20Sopenharmony_ci#
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ciusage() { # errno [message]
118c2ecf20Sopenharmony_ci[ ! -z "$2" ] && echo $2
128c2ecf20Sopenharmony_ciecho "Usage: ftracetest [options] [testcase(s)] [testcase-directory(s)]"
138c2ecf20Sopenharmony_ciecho " Options:"
148c2ecf20Sopenharmony_ciecho "		-h|--help  Show help message"
158c2ecf20Sopenharmony_ciecho "		-k|--keep  Keep passed test logs"
168c2ecf20Sopenharmony_ciecho "		-v|--verbose Increase verbosity of test messages"
178c2ecf20Sopenharmony_ciecho "		-vv        Alias of -v -v (Show all results in stdout)"
188c2ecf20Sopenharmony_ciecho "		-vvv       Alias of -v -v -v (Show all commands immediately)"
198c2ecf20Sopenharmony_ciecho "		--fail-unsupported Treat UNSUPPORTED as a failure"
208c2ecf20Sopenharmony_ciecho "		--fail-unresolved Treat UNRESOLVED as a failure"
218c2ecf20Sopenharmony_ciecho "		-d|--debug Debug mode (trace all shell commands)"
228c2ecf20Sopenharmony_ciecho "		-l|--logdir <dir> Save logs on the <dir>"
238c2ecf20Sopenharmony_ciecho "		            If <dir> is -, all logs output in console only"
248c2ecf20Sopenharmony_ciexit $1
258c2ecf20Sopenharmony_ci}
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci# default error
288c2ecf20Sopenharmony_cierr_ret=1
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci# kselftest skip code is 4
318c2ecf20Sopenharmony_cierr_skip=4
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci# umount required
348c2ecf20Sopenharmony_ciUMOUNT_DIR=""
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci# cgroup RT scheduling prevents chrt commands from succeeding, which
378c2ecf20Sopenharmony_ci# induces failures in test wakeup tests.  Disable for the duration of
388c2ecf20Sopenharmony_ci# the tests.
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_cireadonly sched_rt_runtime=/proc/sys/kernel/sched_rt_runtime_us
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_cisched_rt_runtime_orig=$(cat $sched_rt_runtime)
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cisetup() {
458c2ecf20Sopenharmony_ci  echo -1 > $sched_rt_runtime
468c2ecf20Sopenharmony_ci}
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_cicleanup() {
498c2ecf20Sopenharmony_ci  echo $sched_rt_runtime_orig > $sched_rt_runtime
508c2ecf20Sopenharmony_ci  if [ -n "${UMOUNT_DIR}" ]; then
518c2ecf20Sopenharmony_ci    umount ${UMOUNT_DIR} ||:
528c2ecf20Sopenharmony_ci  fi
538c2ecf20Sopenharmony_ci}
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_cierrexit() { # message
568c2ecf20Sopenharmony_ci  echo "Error: $1" 1>&2
578c2ecf20Sopenharmony_ci  cleanup
588c2ecf20Sopenharmony_ci  exit $err_ret
598c2ecf20Sopenharmony_ci}
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci# Ensuring user privilege
628c2ecf20Sopenharmony_ciif [ `id -u` -ne 0 ]; then
638c2ecf20Sopenharmony_ci  errexit "this must be run by root user"
648c2ecf20Sopenharmony_cifi
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_cisetup
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci# Utilities
698c2ecf20Sopenharmony_ciabsdir() { # file_path
708c2ecf20Sopenharmony_ci  (cd `dirname $1`; pwd)
718c2ecf20Sopenharmony_ci}
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_ciabspath() {
748c2ecf20Sopenharmony_ci  echo `absdir $1`/`basename $1`
758c2ecf20Sopenharmony_ci}
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_cifind_testcases() { #directory
788c2ecf20Sopenharmony_ci  echo `find $1 -name \*.tc | sort`
798c2ecf20Sopenharmony_ci}
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ciparse_opts() { # opts
828c2ecf20Sopenharmony_ci  local OPT_TEST_CASES=
838c2ecf20Sopenharmony_ci  local OPT_TEST_DIR=
848c2ecf20Sopenharmony_ci
858c2ecf20Sopenharmony_ci  while [ ! -z "$1" ]; do
868c2ecf20Sopenharmony_ci    case "$1" in
878c2ecf20Sopenharmony_ci    --help|-h)
888c2ecf20Sopenharmony_ci      usage 0
898c2ecf20Sopenharmony_ci    ;;
908c2ecf20Sopenharmony_ci    --keep|-k)
918c2ecf20Sopenharmony_ci      KEEP_LOG=1
928c2ecf20Sopenharmony_ci      shift 1
938c2ecf20Sopenharmony_ci    ;;
948c2ecf20Sopenharmony_ci    --verbose|-v|-vv|-vvv)
958c2ecf20Sopenharmony_ci      if [ $VERBOSE -eq -1 ]; then
968c2ecf20Sopenharmony_ci	usage "--console can not use with --verbose"
978c2ecf20Sopenharmony_ci      fi
988c2ecf20Sopenharmony_ci      VERBOSE=$((VERBOSE + 1))
998c2ecf20Sopenharmony_ci      [ $1 = '-vv' ] && VERBOSE=$((VERBOSE + 1))
1008c2ecf20Sopenharmony_ci      [ $1 = '-vvv' ] && VERBOSE=$((VERBOSE + 2))
1018c2ecf20Sopenharmony_ci      shift 1
1028c2ecf20Sopenharmony_ci    ;;
1038c2ecf20Sopenharmony_ci    --console)
1048c2ecf20Sopenharmony_ci      if [ $VERBOSE -ne 0 ]; then
1058c2ecf20Sopenharmony_ci	usage "--console can not use with --verbose"
1068c2ecf20Sopenharmony_ci      fi
1078c2ecf20Sopenharmony_ci      VERBOSE=-1
1088c2ecf20Sopenharmony_ci      shift 1
1098c2ecf20Sopenharmony_ci    ;;
1108c2ecf20Sopenharmony_ci    --debug|-d)
1118c2ecf20Sopenharmony_ci      DEBUG=1
1128c2ecf20Sopenharmony_ci      shift 1
1138c2ecf20Sopenharmony_ci    ;;
1148c2ecf20Sopenharmony_ci    --stop-fail)
1158c2ecf20Sopenharmony_ci      STOP_FAILURE=1
1168c2ecf20Sopenharmony_ci      shift 1
1178c2ecf20Sopenharmony_ci    ;;
1188c2ecf20Sopenharmony_ci    --fail-unsupported)
1198c2ecf20Sopenharmony_ci      UNSUPPORTED_RESULT=1
1208c2ecf20Sopenharmony_ci      shift 1
1218c2ecf20Sopenharmony_ci    ;;
1228c2ecf20Sopenharmony_ci    --fail-unresolved)
1238c2ecf20Sopenharmony_ci      UNRESOLVED_RESULT=1
1248c2ecf20Sopenharmony_ci      shift 1
1258c2ecf20Sopenharmony_ci    ;;
1268c2ecf20Sopenharmony_ci    --logdir|-l)
1278c2ecf20Sopenharmony_ci      LOG_DIR=$2
1288c2ecf20Sopenharmony_ci      shift 2
1298c2ecf20Sopenharmony_ci    ;;
1308c2ecf20Sopenharmony_ci    *.tc)
1318c2ecf20Sopenharmony_ci      if [ -f "$1" ]; then
1328c2ecf20Sopenharmony_ci        OPT_TEST_CASES="$OPT_TEST_CASES `abspath $1`"
1338c2ecf20Sopenharmony_ci        shift 1
1348c2ecf20Sopenharmony_ci      else
1358c2ecf20Sopenharmony_ci        usage 1 "$1 is not a testcase"
1368c2ecf20Sopenharmony_ci      fi
1378c2ecf20Sopenharmony_ci      ;;
1388c2ecf20Sopenharmony_ci    *)
1398c2ecf20Sopenharmony_ci      if [ -d "$1" ]; then
1408c2ecf20Sopenharmony_ci        OPT_TEST_DIR=`abspath $1`
1418c2ecf20Sopenharmony_ci        OPT_TEST_CASES="$OPT_TEST_CASES `find_testcases $OPT_TEST_DIR`"
1428c2ecf20Sopenharmony_ci        shift 1
1438c2ecf20Sopenharmony_ci      else
1448c2ecf20Sopenharmony_ci        usage 1 "Invalid option ($1)"
1458c2ecf20Sopenharmony_ci      fi
1468c2ecf20Sopenharmony_ci    ;;
1478c2ecf20Sopenharmony_ci    esac
1488c2ecf20Sopenharmony_ci  done
1498c2ecf20Sopenharmony_ci  if [ ! -z "$OPT_TEST_CASES" ]; then
1508c2ecf20Sopenharmony_ci    TEST_CASES=$OPT_TEST_CASES
1518c2ecf20Sopenharmony_ci  fi
1528c2ecf20Sopenharmony_ci}
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_ci# Parameters
1558c2ecf20Sopenharmony_ciTRACING_DIR=`grep tracefs /proc/mounts | cut -f2 -d' ' | head -1`
1568c2ecf20Sopenharmony_ciif [ -z "$TRACING_DIR" ]; then
1578c2ecf20Sopenharmony_ci    DEBUGFS_DIR=`grep debugfs /proc/mounts | cut -f2 -d' ' | head -1`
1588c2ecf20Sopenharmony_ci    if [ -z "$DEBUGFS_DIR" ]; then
1598c2ecf20Sopenharmony_ci	# If tracefs exists, then so does /sys/kernel/tracing
1608c2ecf20Sopenharmony_ci	if [ -d "/sys/kernel/tracing" ]; then
1618c2ecf20Sopenharmony_ci	    mount -t tracefs nodev /sys/kernel/tracing ||
1628c2ecf20Sopenharmony_ci	      errexit "Failed to mount /sys/kernel/tracing"
1638c2ecf20Sopenharmony_ci	    TRACING_DIR="/sys/kernel/tracing"
1648c2ecf20Sopenharmony_ci	    UMOUNT_DIR=${TRACING_DIR}
1658c2ecf20Sopenharmony_ci	# If debugfs exists, then so does /sys/kernel/debug
1668c2ecf20Sopenharmony_ci	elif [ -d "/sys/kernel/debug" ]; then
1678c2ecf20Sopenharmony_ci	    mount -t debugfs nodev /sys/kernel/debug ||
1688c2ecf20Sopenharmony_ci	      errexit "Failed to mount /sys/kernel/debug"
1698c2ecf20Sopenharmony_ci	    TRACING_DIR="/sys/kernel/debug/tracing"
1708c2ecf20Sopenharmony_ci	    UMOUNT_DIR=${TRACING_DIR}
1718c2ecf20Sopenharmony_ci	else
1728c2ecf20Sopenharmony_ci	    err_ret=$err_skip
1738c2ecf20Sopenharmony_ci	    errexit "debugfs and tracefs are not configured in this kernel"
1748c2ecf20Sopenharmony_ci	fi
1758c2ecf20Sopenharmony_ci    else
1768c2ecf20Sopenharmony_ci	TRACING_DIR="$DEBUGFS_DIR/tracing"
1778c2ecf20Sopenharmony_ci    fi
1788c2ecf20Sopenharmony_cifi
1798c2ecf20Sopenharmony_ciif [ ! -d "$TRACING_DIR" ]; then
1808c2ecf20Sopenharmony_ci    err_ret=$err_skip
1818c2ecf20Sopenharmony_ci    errexit "ftrace is not configured in this kernel"
1828c2ecf20Sopenharmony_cifi
1838c2ecf20Sopenharmony_ci
1848c2ecf20Sopenharmony_ciTOP_DIR=`absdir $0`
1858c2ecf20Sopenharmony_ciTEST_DIR=$TOP_DIR/test.d
1868c2ecf20Sopenharmony_ciTEST_CASES=`find_testcases $TEST_DIR`
1878c2ecf20Sopenharmony_ciLOG_DIR=$TOP_DIR/logs/`date +%Y%m%d-%H%M%S`/
1888c2ecf20Sopenharmony_ciKEEP_LOG=0
1898c2ecf20Sopenharmony_ciDEBUG=0
1908c2ecf20Sopenharmony_ciVERBOSE=0
1918c2ecf20Sopenharmony_ciUNSUPPORTED_RESULT=0
1928c2ecf20Sopenharmony_ciUNRESOLVED_RESULT=0
1938c2ecf20Sopenharmony_ciSTOP_FAILURE=0
1948c2ecf20Sopenharmony_ci# Parse command-line options
1958c2ecf20Sopenharmony_ciparse_opts $*
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_ci[ $DEBUG -ne 0 ] && set -x
1988c2ecf20Sopenharmony_ci
1998c2ecf20Sopenharmony_ci# Verify parameters
2008c2ecf20Sopenharmony_ciif [ -z "$TRACING_DIR" -o ! -d "$TRACING_DIR" ]; then
2018c2ecf20Sopenharmony_ci  errexit "No ftrace directory found"
2028c2ecf20Sopenharmony_cifi
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_ci# Preparing logs
2058c2ecf20Sopenharmony_ciif [ "x$LOG_DIR" = "x-" ]; then
2068c2ecf20Sopenharmony_ci  LOG_FILE=
2078c2ecf20Sopenharmony_ci  date
2088c2ecf20Sopenharmony_cielse
2098c2ecf20Sopenharmony_ci  LOG_FILE=$LOG_DIR/ftracetest.log
2108c2ecf20Sopenharmony_ci  mkdir -p $LOG_DIR || errexit "Failed to make a log directory: $LOG_DIR"
2118c2ecf20Sopenharmony_ci  date > $LOG_FILE
2128c2ecf20Sopenharmony_cifi
2138c2ecf20Sopenharmony_ci
2148c2ecf20Sopenharmony_ci# Define text colors
2158c2ecf20Sopenharmony_ci# Check available colors on the terminal, if any
2168c2ecf20Sopenharmony_cincolors=`tput colors 2>/dev/null || echo 0`
2178c2ecf20Sopenharmony_cicolor_reset=
2188c2ecf20Sopenharmony_cicolor_red=
2198c2ecf20Sopenharmony_cicolor_green=
2208c2ecf20Sopenharmony_cicolor_blue=
2218c2ecf20Sopenharmony_ci# If stdout exists and number of colors is eight or more, use them
2228c2ecf20Sopenharmony_ciif [ -t 1 -a "$ncolors" -ge 8 ]; then
2238c2ecf20Sopenharmony_ci  color_reset="\033[0m"
2248c2ecf20Sopenharmony_ci  color_red="\033[31m"
2258c2ecf20Sopenharmony_ci  color_green="\033[32m"
2268c2ecf20Sopenharmony_ci  color_blue="\033[34m"
2278c2ecf20Sopenharmony_cifi
2288c2ecf20Sopenharmony_ci
2298c2ecf20Sopenharmony_cistrip_esc() {
2308c2ecf20Sopenharmony_ci  # busybox sed implementation doesn't accept "\x1B", so use [:cntrl:] instead.
2318c2ecf20Sopenharmony_ci  sed -E "s/[[:cntrl:]]\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
2328c2ecf20Sopenharmony_ci}
2338c2ecf20Sopenharmony_ci
2348c2ecf20Sopenharmony_ciprlog() { # messages
2358c2ecf20Sopenharmony_ci  newline="\n"
2368c2ecf20Sopenharmony_ci  if [ "$1" = "-n" ] ; then
2378c2ecf20Sopenharmony_ci    newline=
2388c2ecf20Sopenharmony_ci    shift
2398c2ecf20Sopenharmony_ci  fi
2408c2ecf20Sopenharmony_ci  printf "$*$newline"
2418c2ecf20Sopenharmony_ci  [ "$LOG_FILE" ] && printf "$*$newline" | strip_esc >> $LOG_FILE
2428c2ecf20Sopenharmony_ci}
2438c2ecf20Sopenharmony_cicatlog() { #file
2448c2ecf20Sopenharmony_ci  cat $1
2458c2ecf20Sopenharmony_ci  [ "$LOG_FILE" ] && cat $1 | strip_esc >> $LOG_FILE
2468c2ecf20Sopenharmony_ci}
2478c2ecf20Sopenharmony_ciprlog "=== Ftrace unit tests ==="
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_ci
2508c2ecf20Sopenharmony_ci# Testcase management
2518c2ecf20Sopenharmony_ci# Test result codes - Dejagnu extended code
2528c2ecf20Sopenharmony_ciPASS=0	# The test succeeded.
2538c2ecf20Sopenharmony_ciFAIL=1	# The test failed, but was expected to succeed.
2548c2ecf20Sopenharmony_ciUNRESOLVED=2  # The test produced indeterminate results. (e.g. interrupted)
2558c2ecf20Sopenharmony_ciUNTESTED=3    # The test was not run, currently just a placeholder.
2568c2ecf20Sopenharmony_ciUNSUPPORTED=4 # The test failed because of lack of feature.
2578c2ecf20Sopenharmony_ciXFAIL=5	# The test failed, and was expected to fail.
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_ci# Accumulations
2608c2ecf20Sopenharmony_ciPASSED_CASES=
2618c2ecf20Sopenharmony_ciFAILED_CASES=
2628c2ecf20Sopenharmony_ciUNRESOLVED_CASES=
2638c2ecf20Sopenharmony_ciUNTESTED_CASES=
2648c2ecf20Sopenharmony_ciUNSUPPORTED_CASES=
2658c2ecf20Sopenharmony_ciXFAILED_CASES=
2668c2ecf20Sopenharmony_ciUNDEFINED_CASES=
2678c2ecf20Sopenharmony_ciTOTAL_RESULT=0
2688c2ecf20Sopenharmony_ci
2698c2ecf20Sopenharmony_ciINSTANCE=
2708c2ecf20Sopenharmony_ciCASENO=0
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_citestcase() { # testfile
2738c2ecf20Sopenharmony_ci  CASENO=$((CASENO+1))
2748c2ecf20Sopenharmony_ci  desc=`grep "^#[ \t]*description:" $1 | cut -f2- -d:`
2758c2ecf20Sopenharmony_ci  prlog -n "[$CASENO]$INSTANCE$desc"
2768c2ecf20Sopenharmony_ci}
2778c2ecf20Sopenharmony_ci
2788c2ecf20Sopenharmony_cicheckreq() { # testfile
2798c2ecf20Sopenharmony_ci  requires=`grep "^#[ \t]*requires:" $1 | cut -f2- -d:`
2808c2ecf20Sopenharmony_ci  # Use eval to pass quoted-patterns correctly.
2818c2ecf20Sopenharmony_ci  eval check_requires "$requires"
2828c2ecf20Sopenharmony_ci}
2838c2ecf20Sopenharmony_ci
2848c2ecf20Sopenharmony_citest_on_instance() { # testfile
2858c2ecf20Sopenharmony_ci  grep -q "^#[ \t]*flags:.*instance" $1
2868c2ecf20Sopenharmony_ci}
2878c2ecf20Sopenharmony_ci
2888c2ecf20Sopenharmony_cieval_result() { # sigval
2898c2ecf20Sopenharmony_ci  case $1 in
2908c2ecf20Sopenharmony_ci    $PASS)
2918c2ecf20Sopenharmony_ci      prlog "	[${color_green}PASS${color_reset}]"
2928c2ecf20Sopenharmony_ci      PASSED_CASES="$PASSED_CASES $CASENO"
2938c2ecf20Sopenharmony_ci      return 0
2948c2ecf20Sopenharmony_ci    ;;
2958c2ecf20Sopenharmony_ci    $FAIL)
2968c2ecf20Sopenharmony_ci      prlog "	[${color_red}FAIL${color_reset}]"
2978c2ecf20Sopenharmony_ci      FAILED_CASES="$FAILED_CASES $CASENO"
2988c2ecf20Sopenharmony_ci      return 1 # this is a bug.
2998c2ecf20Sopenharmony_ci    ;;
3008c2ecf20Sopenharmony_ci    $UNRESOLVED)
3018c2ecf20Sopenharmony_ci      prlog "	[${color_blue}UNRESOLVED${color_reset}]"
3028c2ecf20Sopenharmony_ci      UNRESOLVED_CASES="$UNRESOLVED_CASES $CASENO"
3038c2ecf20Sopenharmony_ci      return $UNRESOLVED_RESULT # depends on use case
3048c2ecf20Sopenharmony_ci    ;;
3058c2ecf20Sopenharmony_ci    $UNTESTED)
3068c2ecf20Sopenharmony_ci      prlog "	[${color_blue}UNTESTED${color_reset}]"
3078c2ecf20Sopenharmony_ci      UNTESTED_CASES="$UNTESTED_CASES $CASENO"
3088c2ecf20Sopenharmony_ci      return 0
3098c2ecf20Sopenharmony_ci    ;;
3108c2ecf20Sopenharmony_ci    $UNSUPPORTED)
3118c2ecf20Sopenharmony_ci      prlog "	[${color_blue}UNSUPPORTED${color_reset}]"
3128c2ecf20Sopenharmony_ci      UNSUPPORTED_CASES="$UNSUPPORTED_CASES $CASENO"
3138c2ecf20Sopenharmony_ci      return $UNSUPPORTED_RESULT # depends on use case
3148c2ecf20Sopenharmony_ci    ;;
3158c2ecf20Sopenharmony_ci    $XFAIL)
3168c2ecf20Sopenharmony_ci      prlog "	[${color_green}XFAIL${color_reset}]"
3178c2ecf20Sopenharmony_ci      XFAILED_CASES="$XFAILED_CASES $CASENO"
3188c2ecf20Sopenharmony_ci      return 0
3198c2ecf20Sopenharmony_ci    ;;
3208c2ecf20Sopenharmony_ci    *)
3218c2ecf20Sopenharmony_ci      prlog "	[${color_blue}UNDEFINED${color_reset}]"
3228c2ecf20Sopenharmony_ci      UNDEFINED_CASES="$UNDEFINED_CASES $CASENO"
3238c2ecf20Sopenharmony_ci      return 1 # this must be a test bug
3248c2ecf20Sopenharmony_ci    ;;
3258c2ecf20Sopenharmony_ci  esac
3268c2ecf20Sopenharmony_ci}
3278c2ecf20Sopenharmony_ci
3288c2ecf20Sopenharmony_ci# Signal handling for result codes
3298c2ecf20Sopenharmony_ciSIG_RESULT=
3308c2ecf20Sopenharmony_ciSIG_BASE=36	# Use realtime signals
3318c2ecf20Sopenharmony_ciSIG_PID=$$
3328c2ecf20Sopenharmony_ci
3338c2ecf20Sopenharmony_ciexit_pass () {
3348c2ecf20Sopenharmony_ci  exit 0
3358c2ecf20Sopenharmony_ci}
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_ciSIG_FAIL=$((SIG_BASE + FAIL))
3388c2ecf20Sopenharmony_ciexit_fail () {
3398c2ecf20Sopenharmony_ci  exit 1
3408c2ecf20Sopenharmony_ci}
3418c2ecf20Sopenharmony_citrap 'SIG_RESULT=$FAIL' $SIG_FAIL
3428c2ecf20Sopenharmony_ci
3438c2ecf20Sopenharmony_ciSIG_UNRESOLVED=$((SIG_BASE + UNRESOLVED))
3448c2ecf20Sopenharmony_ciexit_unresolved () {
3458c2ecf20Sopenharmony_ci  kill -s $SIG_UNRESOLVED $SIG_PID
3468c2ecf20Sopenharmony_ci  exit 0
3478c2ecf20Sopenharmony_ci}
3488c2ecf20Sopenharmony_citrap 'SIG_RESULT=$UNRESOLVED' $SIG_UNRESOLVED
3498c2ecf20Sopenharmony_ci
3508c2ecf20Sopenharmony_ciSIG_UNTESTED=$((SIG_BASE + UNTESTED))
3518c2ecf20Sopenharmony_ciexit_untested () {
3528c2ecf20Sopenharmony_ci  kill -s $SIG_UNTESTED $SIG_PID
3538c2ecf20Sopenharmony_ci  exit 0
3548c2ecf20Sopenharmony_ci}
3558c2ecf20Sopenharmony_citrap 'SIG_RESULT=$UNTESTED' $SIG_UNTESTED
3568c2ecf20Sopenharmony_ci
3578c2ecf20Sopenharmony_ciSIG_UNSUPPORTED=$((SIG_BASE + UNSUPPORTED))
3588c2ecf20Sopenharmony_ciexit_unsupported () {
3598c2ecf20Sopenharmony_ci  kill -s $SIG_UNSUPPORTED $SIG_PID
3608c2ecf20Sopenharmony_ci  exit 0
3618c2ecf20Sopenharmony_ci}
3628c2ecf20Sopenharmony_citrap 'SIG_RESULT=$UNSUPPORTED' $SIG_UNSUPPORTED
3638c2ecf20Sopenharmony_ci
3648c2ecf20Sopenharmony_ciSIG_XFAIL=$((SIG_BASE + XFAIL))
3658c2ecf20Sopenharmony_ciexit_xfail () {
3668c2ecf20Sopenharmony_ci  kill -s $SIG_XFAIL $SIG_PID
3678c2ecf20Sopenharmony_ci  exit 0
3688c2ecf20Sopenharmony_ci}
3698c2ecf20Sopenharmony_citrap 'SIG_RESULT=$XFAIL' $SIG_XFAIL
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_ci__run_test() { # testfile
3728c2ecf20Sopenharmony_ci  # setup PID and PPID, $$ is not updated.
3738c2ecf20Sopenharmony_ci  (cd $TRACING_DIR; read PID _ < /proc/self/stat; set -e; set -x;
3748c2ecf20Sopenharmony_ci   checkreq $1; initialize_ftrace; . $1)
3758c2ecf20Sopenharmony_ci  [ $? -ne 0 ] && kill -s $SIG_FAIL $SIG_PID
3768c2ecf20Sopenharmony_ci}
3778c2ecf20Sopenharmony_ci
3788c2ecf20Sopenharmony_ci# Run one test case
3798c2ecf20Sopenharmony_cirun_test() { # testfile
3808c2ecf20Sopenharmony_ci  local testname=`basename $1`
3818c2ecf20Sopenharmony_ci  testcase $1
3828c2ecf20Sopenharmony_ci  if [ ! -z "$LOG_FILE" ] ; then
3838c2ecf20Sopenharmony_ci    local testlog=`mktemp $LOG_DIR/${CASENO}-${testname}-log.XXXXXX`
3848c2ecf20Sopenharmony_ci  else
3858c2ecf20Sopenharmony_ci    local testlog=/proc/self/fd/1
3868c2ecf20Sopenharmony_ci  fi
3878c2ecf20Sopenharmony_ci  export TMPDIR=`mktemp -d /tmp/ftracetest-dir.XXXXXX`
3888c2ecf20Sopenharmony_ci  export FTRACETEST_ROOT=$TOP_DIR
3898c2ecf20Sopenharmony_ci  echo "execute$INSTANCE: "$1 > $testlog
3908c2ecf20Sopenharmony_ci  SIG_RESULT=0
3918c2ecf20Sopenharmony_ci  if [ $VERBOSE -eq -1 ]; then
3928c2ecf20Sopenharmony_ci    __run_test $1
3938c2ecf20Sopenharmony_ci  elif [ -z "$LOG_FILE" ]; then
3948c2ecf20Sopenharmony_ci    __run_test $1 2>&1
3958c2ecf20Sopenharmony_ci  elif [ $VERBOSE -ge 3 ]; then
3968c2ecf20Sopenharmony_ci    __run_test $1 | tee -a $testlog 2>&1
3978c2ecf20Sopenharmony_ci  elif [ $VERBOSE -eq 2 ]; then
3988c2ecf20Sopenharmony_ci    __run_test $1 2>> $testlog | tee -a $testlog
3998c2ecf20Sopenharmony_ci  else
4008c2ecf20Sopenharmony_ci    __run_test $1 >> $testlog 2>&1
4018c2ecf20Sopenharmony_ci  fi
4028c2ecf20Sopenharmony_ci  eval_result $SIG_RESULT
4038c2ecf20Sopenharmony_ci  if [ $? -eq 0 ]; then
4048c2ecf20Sopenharmony_ci    # Remove test log if the test was done as it was expected.
4058c2ecf20Sopenharmony_ci    [ $KEEP_LOG -eq 0 -a ! -z "$LOG_FILE" ] && rm $testlog
4068c2ecf20Sopenharmony_ci  else
4078c2ecf20Sopenharmony_ci    [ $VERBOSE -eq 1 -o $VERBOSE -eq 2 ] && catlog $testlog
4088c2ecf20Sopenharmony_ci    TOTAL_RESULT=1
4098c2ecf20Sopenharmony_ci  fi
4108c2ecf20Sopenharmony_ci  rm -rf $TMPDIR
4118c2ecf20Sopenharmony_ci}
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ci# load in the helper functions
4148c2ecf20Sopenharmony_ci. $TEST_DIR/functions
4158c2ecf20Sopenharmony_ci
4168c2ecf20Sopenharmony_ci# Main loop
4178c2ecf20Sopenharmony_cifor t in $TEST_CASES; do
4188c2ecf20Sopenharmony_ci  run_test $t
4198c2ecf20Sopenharmony_ci  if [ $STOP_FAILURE -ne 0 -a $TOTAL_RESULT -ne 0 ]; then
4208c2ecf20Sopenharmony_ci    echo "A failure detected. Stop test."
4218c2ecf20Sopenharmony_ci    exit 1
4228c2ecf20Sopenharmony_ci  fi
4238c2ecf20Sopenharmony_cidone
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_ci# Test on instance loop
4268c2ecf20Sopenharmony_ciINSTANCE=" (instance) "
4278c2ecf20Sopenharmony_cifor t in $TEST_CASES; do
4288c2ecf20Sopenharmony_ci  test_on_instance $t || continue
4298c2ecf20Sopenharmony_ci  SAVED_TRACING_DIR=$TRACING_DIR
4308c2ecf20Sopenharmony_ci  export TRACING_DIR=`mktemp -d $TRACING_DIR/instances/ftracetest.XXXXXX`
4318c2ecf20Sopenharmony_ci  run_test $t
4328c2ecf20Sopenharmony_ci  rmdir $TRACING_DIR
4338c2ecf20Sopenharmony_ci  TRACING_DIR=$SAVED_TRACING_DIR
4348c2ecf20Sopenharmony_ci  if [ $STOP_FAILURE -ne 0 -a $TOTAL_RESULT -ne 0 ]; then
4358c2ecf20Sopenharmony_ci    echo "A failure detected. Stop test."
4368c2ecf20Sopenharmony_ci    exit 1
4378c2ecf20Sopenharmony_ci  fi
4388c2ecf20Sopenharmony_cidone
4398c2ecf20Sopenharmony_ci(cd $TRACING_DIR; initialize_ftrace) # for cleanup
4408c2ecf20Sopenharmony_ci
4418c2ecf20Sopenharmony_ciprlog ""
4428c2ecf20Sopenharmony_ciprlog "# of passed: " `echo $PASSED_CASES | wc -w`
4438c2ecf20Sopenharmony_ciprlog "# of failed: " `echo $FAILED_CASES | wc -w`
4448c2ecf20Sopenharmony_ciprlog "# of unresolved: " `echo $UNRESOLVED_CASES | wc -w`
4458c2ecf20Sopenharmony_ciprlog "# of untested: " `echo $UNTESTED_CASES | wc -w`
4468c2ecf20Sopenharmony_ciprlog "# of unsupported: " `echo $UNSUPPORTED_CASES | wc -w`
4478c2ecf20Sopenharmony_ciprlog "# of xfailed: " `echo $XFAILED_CASES | wc -w`
4488c2ecf20Sopenharmony_ciprlog "# of undefined(test bug): " `echo $UNDEFINED_CASES | wc -w`
4498c2ecf20Sopenharmony_ci
4508c2ecf20Sopenharmony_cicleanup
4518c2ecf20Sopenharmony_ci
4528c2ecf20Sopenharmony_ci# if no error, return 0
4538c2ecf20Sopenharmony_ciexit $TOTAL_RESULT
454