162306a36Sopenharmony_ci#!/bin/sh
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci# ftracetest - Ftrace test shell scripts
562306a36Sopenharmony_ci#
662306a36Sopenharmony_ci# Copyright (C) Hitachi Ltd., 2014
762306a36Sopenharmony_ci#  Written by Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
862306a36Sopenharmony_ci#
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciusage() { # errno [message]
1162306a36Sopenharmony_ci[ ! -z "$2" ] && echo $2
1262306a36Sopenharmony_ciecho "Usage: ftracetest [options] [testcase(s)] [testcase-directory(s)]"
1362306a36Sopenharmony_ciecho " Options:"
1462306a36Sopenharmony_ciecho "		-h|--help  Show help message"
1562306a36Sopenharmony_ciecho "		-k|--keep  Keep passed test logs"
1662306a36Sopenharmony_ciecho "		-K|--ktap  Output in KTAP format"
1762306a36Sopenharmony_ciecho "		-v|--verbose Increase verbosity of test messages"
1862306a36Sopenharmony_ciecho "		-vv        Alias of -v -v (Show all results in stdout)"
1962306a36Sopenharmony_ciecho "		-vvv       Alias of -v -v -v (Show all commands immediately)"
2062306a36Sopenharmony_ciecho "		--fail-unsupported Treat UNSUPPORTED as a failure"
2162306a36Sopenharmony_ciecho "		--fail-unresolved Treat UNRESOLVED as a failure"
2262306a36Sopenharmony_ciecho "		-d|--debug Debug mode (trace all shell commands)"
2362306a36Sopenharmony_ciecho "		-l|--logdir <dir> Save logs on the <dir>"
2462306a36Sopenharmony_ciecho "		            If <dir> is -, all logs output in console only"
2562306a36Sopenharmony_ciexit $1
2662306a36Sopenharmony_ci}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci# default error
2962306a36Sopenharmony_cierr_ret=1
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci# kselftest skip code is 4
3262306a36Sopenharmony_cierr_skip=4
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci# umount required
3562306a36Sopenharmony_ciUMOUNT_DIR=""
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci# cgroup RT scheduling prevents chrt commands from succeeding, which
3862306a36Sopenharmony_ci# induces failures in test wakeup tests.  Disable for the duration of
3962306a36Sopenharmony_ci# the tests.
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cireadonly sched_rt_runtime=/proc/sys/kernel/sched_rt_runtime_us
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cisched_rt_runtime_orig=$(cat $sched_rt_runtime)
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cisetup() {
4662306a36Sopenharmony_ci  echo -1 > $sched_rt_runtime
4762306a36Sopenharmony_ci}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cicleanup() {
5062306a36Sopenharmony_ci  echo $sched_rt_runtime_orig > $sched_rt_runtime
5162306a36Sopenharmony_ci  if [ -n "${UMOUNT_DIR}" ]; then
5262306a36Sopenharmony_ci    umount ${UMOUNT_DIR} ||:
5362306a36Sopenharmony_ci  fi
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cierrexit() { # message
5762306a36Sopenharmony_ci  echo "Error: $1" 1>&2
5862306a36Sopenharmony_ci  cleanup
5962306a36Sopenharmony_ci  exit $err_ret
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci# Ensuring user privilege
6362306a36Sopenharmony_ciif [ `id -u` -ne 0 ]; then
6462306a36Sopenharmony_ci  errexit "this must be run by root user"
6562306a36Sopenharmony_cifi
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cisetup
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci# Utilities
7062306a36Sopenharmony_ciabsdir() { # file_path
7162306a36Sopenharmony_ci  (cd `dirname $1`; pwd)
7262306a36Sopenharmony_ci}
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ciabspath() {
7562306a36Sopenharmony_ci  echo `absdir $1`/`basename $1`
7662306a36Sopenharmony_ci}
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cifind_testcases() { #directory
7962306a36Sopenharmony_ci  echo `find $1 -name \*.tc | sort`
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ciparse_opts() { # opts
8362306a36Sopenharmony_ci  local OPT_TEST_CASES=
8462306a36Sopenharmony_ci  local OPT_TEST_DIR=
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci  while [ ! -z "$1" ]; do
8762306a36Sopenharmony_ci    case "$1" in
8862306a36Sopenharmony_ci    --help|-h)
8962306a36Sopenharmony_ci      usage 0
9062306a36Sopenharmony_ci    ;;
9162306a36Sopenharmony_ci    --keep|-k)
9262306a36Sopenharmony_ci      KEEP_LOG=1
9362306a36Sopenharmony_ci      shift 1
9462306a36Sopenharmony_ci    ;;
9562306a36Sopenharmony_ci    --ktap|-K)
9662306a36Sopenharmony_ci      KTAP=1
9762306a36Sopenharmony_ci      shift 1
9862306a36Sopenharmony_ci    ;;
9962306a36Sopenharmony_ci    --verbose|-v|-vv|-vvv)
10062306a36Sopenharmony_ci      if [ $VERBOSE -eq -1 ]; then
10162306a36Sopenharmony_ci	usage "--console can not use with --verbose"
10262306a36Sopenharmony_ci      fi
10362306a36Sopenharmony_ci      VERBOSE=$((VERBOSE + 1))
10462306a36Sopenharmony_ci      [ $1 = '-vv' ] && VERBOSE=$((VERBOSE + 1))
10562306a36Sopenharmony_ci      [ $1 = '-vvv' ] && VERBOSE=$((VERBOSE + 2))
10662306a36Sopenharmony_ci      shift 1
10762306a36Sopenharmony_ci    ;;
10862306a36Sopenharmony_ci    --console)
10962306a36Sopenharmony_ci      if [ $VERBOSE -ne 0 ]; then
11062306a36Sopenharmony_ci	usage "--console can not use with --verbose"
11162306a36Sopenharmony_ci      fi
11262306a36Sopenharmony_ci      VERBOSE=-1
11362306a36Sopenharmony_ci      shift 1
11462306a36Sopenharmony_ci    ;;
11562306a36Sopenharmony_ci    --debug|-d)
11662306a36Sopenharmony_ci      DEBUG=1
11762306a36Sopenharmony_ci      shift 1
11862306a36Sopenharmony_ci    ;;
11962306a36Sopenharmony_ci    --stop-fail)
12062306a36Sopenharmony_ci      STOP_FAILURE=1
12162306a36Sopenharmony_ci      shift 1
12262306a36Sopenharmony_ci    ;;
12362306a36Sopenharmony_ci    --fail-unsupported)
12462306a36Sopenharmony_ci      UNSUPPORTED_RESULT=1
12562306a36Sopenharmony_ci      shift 1
12662306a36Sopenharmony_ci    ;;
12762306a36Sopenharmony_ci    --fail-unresolved)
12862306a36Sopenharmony_ci      UNRESOLVED_RESULT=1
12962306a36Sopenharmony_ci      shift 1
13062306a36Sopenharmony_ci    ;;
13162306a36Sopenharmony_ci    --logdir|-l)
13262306a36Sopenharmony_ci      LOG_DIR=$2
13362306a36Sopenharmony_ci      LINK_PTR=
13462306a36Sopenharmony_ci      shift 2
13562306a36Sopenharmony_ci    ;;
13662306a36Sopenharmony_ci    *.tc)
13762306a36Sopenharmony_ci      if [ -f "$1" ]; then
13862306a36Sopenharmony_ci        OPT_TEST_CASES="$OPT_TEST_CASES `abspath $1`"
13962306a36Sopenharmony_ci        shift 1
14062306a36Sopenharmony_ci      else
14162306a36Sopenharmony_ci        usage 1 "$1 is not a testcase"
14262306a36Sopenharmony_ci      fi
14362306a36Sopenharmony_ci      ;;
14462306a36Sopenharmony_ci    *)
14562306a36Sopenharmony_ci      if [ -d "$1" ]; then
14662306a36Sopenharmony_ci        OPT_TEST_DIR=`abspath $1`
14762306a36Sopenharmony_ci        OPT_TEST_CASES="$OPT_TEST_CASES `find_testcases $OPT_TEST_DIR`"
14862306a36Sopenharmony_ci        shift 1
14962306a36Sopenharmony_ci      else
15062306a36Sopenharmony_ci        usage 1 "Invalid option ($1)"
15162306a36Sopenharmony_ci      fi
15262306a36Sopenharmony_ci    ;;
15362306a36Sopenharmony_ci    esac
15462306a36Sopenharmony_ci  done
15562306a36Sopenharmony_ci  if [ ! -z "$OPT_TEST_CASES" ]; then
15662306a36Sopenharmony_ci    TEST_CASES=$OPT_TEST_CASES
15762306a36Sopenharmony_ci  fi
15862306a36Sopenharmony_ci}
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci# Parameters
16162306a36Sopenharmony_ciTRACING_DIR=`grep tracefs /proc/mounts | cut -f2 -d' ' | head -1`
16262306a36Sopenharmony_ciif [ -z "$TRACING_DIR" ]; then
16362306a36Sopenharmony_ci    DEBUGFS_DIR=`grep debugfs /proc/mounts | cut -f2 -d' ' | head -1`
16462306a36Sopenharmony_ci    if [ -z "$DEBUGFS_DIR" ]; then
16562306a36Sopenharmony_ci	# If tracefs exists, then so does /sys/kernel/tracing
16662306a36Sopenharmony_ci	if [ -d "/sys/kernel/tracing" ]; then
16762306a36Sopenharmony_ci	    mount -t tracefs nodev /sys/kernel/tracing ||
16862306a36Sopenharmony_ci	      errexit "Failed to mount /sys/kernel/tracing"
16962306a36Sopenharmony_ci	    TRACING_DIR="/sys/kernel/tracing"
17062306a36Sopenharmony_ci	    UMOUNT_DIR=${TRACING_DIR}
17162306a36Sopenharmony_ci	# If debugfs exists, then so does /sys/kernel/debug
17262306a36Sopenharmony_ci	elif [ -d "/sys/kernel/debug" ]; then
17362306a36Sopenharmony_ci	    mount -t debugfs nodev /sys/kernel/debug ||
17462306a36Sopenharmony_ci	      errexit "Failed to mount /sys/kernel/debug"
17562306a36Sopenharmony_ci	    TRACING_DIR="/sys/kernel/debug/tracing"
17662306a36Sopenharmony_ci	    UMOUNT_DIR=${TRACING_DIR}
17762306a36Sopenharmony_ci	else
17862306a36Sopenharmony_ci	    err_ret=$err_skip
17962306a36Sopenharmony_ci	    errexit "debugfs and tracefs are not configured in this kernel"
18062306a36Sopenharmony_ci	fi
18162306a36Sopenharmony_ci    else
18262306a36Sopenharmony_ci	TRACING_DIR="$DEBUGFS_DIR/tracing"
18362306a36Sopenharmony_ci    fi
18462306a36Sopenharmony_cifi
18562306a36Sopenharmony_ciif [ ! -d "$TRACING_DIR" ]; then
18662306a36Sopenharmony_ci    err_ret=$err_skip
18762306a36Sopenharmony_ci    errexit "ftrace is not configured in this kernel"
18862306a36Sopenharmony_cifi
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ciTOP_DIR=`absdir $0`
19162306a36Sopenharmony_ciTEST_DIR=$TOP_DIR/test.d
19262306a36Sopenharmony_ciTEST_CASES=`find_testcases $TEST_DIR`
19362306a36Sopenharmony_ciLOG_TOP_DIR=$TOP_DIR/logs
19462306a36Sopenharmony_ciLOG_DATE=`date +%Y%m%d-%H%M%S`
19562306a36Sopenharmony_ciLOG_DIR=$LOG_TOP_DIR/$LOG_DATE/
19662306a36Sopenharmony_ciLINK_PTR=$LOG_TOP_DIR/latest
19762306a36Sopenharmony_ciKEEP_LOG=0
19862306a36Sopenharmony_ciKTAP=0
19962306a36Sopenharmony_ciDEBUG=0
20062306a36Sopenharmony_ciVERBOSE=0
20162306a36Sopenharmony_ciUNSUPPORTED_RESULT=0
20262306a36Sopenharmony_ciUNRESOLVED_RESULT=0
20362306a36Sopenharmony_ciSTOP_FAILURE=0
20462306a36Sopenharmony_ci# Parse command-line options
20562306a36Sopenharmony_ciparse_opts $*
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci[ $DEBUG -ne 0 ] && set -x
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci# Verify parameters
21062306a36Sopenharmony_ciif [ -z "$TRACING_DIR" -o ! -d "$TRACING_DIR" ]; then
21162306a36Sopenharmony_ci  errexit "No ftrace directory found"
21262306a36Sopenharmony_cifi
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci# Preparing logs
21562306a36Sopenharmony_ciif [ "x$LOG_DIR" = "x-" ]; then
21662306a36Sopenharmony_ci  LOG_FILE=
21762306a36Sopenharmony_ci  date
21862306a36Sopenharmony_cielse
21962306a36Sopenharmony_ci  LOG_FILE=$LOG_DIR/ftracetest.log
22062306a36Sopenharmony_ci  mkdir -p $LOG_DIR || errexit "Failed to make a log directory: $LOG_DIR"
22162306a36Sopenharmony_ci  date > $LOG_FILE
22262306a36Sopenharmony_ci  if [ "x-$LINK_PTR" != "x-" ]; then
22362306a36Sopenharmony_ci    unlink $LINK_PTR
22462306a36Sopenharmony_ci    ln -fs $LOG_DATE $LINK_PTR
22562306a36Sopenharmony_ci  fi
22662306a36Sopenharmony_cifi
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci# Define text colors
22962306a36Sopenharmony_ci# Check available colors on the terminal, if any
23062306a36Sopenharmony_cincolors=`tput colors 2>/dev/null || echo 0`
23162306a36Sopenharmony_cicolor_reset=
23262306a36Sopenharmony_cicolor_red=
23362306a36Sopenharmony_cicolor_green=
23462306a36Sopenharmony_cicolor_blue=
23562306a36Sopenharmony_ci# If stdout exists and number of colors is eight or more, use them
23662306a36Sopenharmony_ciif [ -t 1 -a "$ncolors" -ge 8 ]; then
23762306a36Sopenharmony_ci  color_reset="\033[0m"
23862306a36Sopenharmony_ci  color_red="\033[31m"
23962306a36Sopenharmony_ci  color_green="\033[32m"
24062306a36Sopenharmony_ci  color_blue="\033[34m"
24162306a36Sopenharmony_cifi
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_cistrip_esc() {
24462306a36Sopenharmony_ci  # busybox sed implementation doesn't accept "\x1B", so use [:cntrl:] instead.
24562306a36Sopenharmony_ci  sed -E "s/[[:cntrl:]]\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
24662306a36Sopenharmony_ci}
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ciprlog() { # messages
24962306a36Sopenharmony_ci  newline="\n"
25062306a36Sopenharmony_ci  if [ "$1" = "-n" ] ; then
25162306a36Sopenharmony_ci    newline=
25262306a36Sopenharmony_ci    shift
25362306a36Sopenharmony_ci  fi
25462306a36Sopenharmony_ci  [ "$KTAP" != "1" ] && printf "$*$newline"
25562306a36Sopenharmony_ci  [ "$LOG_FILE" ] && printf "$*$newline" | strip_esc >> $LOG_FILE
25662306a36Sopenharmony_ci}
25762306a36Sopenharmony_cicatlog() { #file
25862306a36Sopenharmony_ci  cat $1
25962306a36Sopenharmony_ci  [ "$LOG_FILE" ] && cat $1 | strip_esc >> $LOG_FILE
26062306a36Sopenharmony_ci}
26162306a36Sopenharmony_ciprlog "=== Ftrace unit tests ==="
26262306a36Sopenharmony_ci
26362306a36Sopenharmony_ci
26462306a36Sopenharmony_ci# Testcase management
26562306a36Sopenharmony_ci# Test result codes - Dejagnu extended code
26662306a36Sopenharmony_ciPASS=0	# The test succeeded.
26762306a36Sopenharmony_ciFAIL=1	# The test failed, but was expected to succeed.
26862306a36Sopenharmony_ciUNRESOLVED=2  # The test produced indeterminate results. (e.g. interrupted)
26962306a36Sopenharmony_ciUNTESTED=3    # The test was not run, currently just a placeholder.
27062306a36Sopenharmony_ciUNSUPPORTED=4 # The test failed because of lack of feature.
27162306a36Sopenharmony_ciXFAIL=5	# The test failed, and was expected to fail.
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci# Accumulations
27462306a36Sopenharmony_ciPASSED_CASES=
27562306a36Sopenharmony_ciFAILED_CASES=
27662306a36Sopenharmony_ciUNRESOLVED_CASES=
27762306a36Sopenharmony_ciUNTESTED_CASES=
27862306a36Sopenharmony_ciUNSUPPORTED_CASES=
27962306a36Sopenharmony_ciXFAILED_CASES=
28062306a36Sopenharmony_ciUNDEFINED_CASES=
28162306a36Sopenharmony_ciTOTAL_RESULT=0
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ciINSTANCE=
28462306a36Sopenharmony_ciCASENO=0
28562306a36Sopenharmony_ciCASENAME=
28662306a36Sopenharmony_ci
28762306a36Sopenharmony_citestcase() { # testfile
28862306a36Sopenharmony_ci  CASENO=$((CASENO+1))
28962306a36Sopenharmony_ci  CASENAME=`grep "^#[ \t]*description:" $1 | cut -f2- -d:`
29062306a36Sopenharmony_ci}
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_cicheckreq() { # testfile
29362306a36Sopenharmony_ci  requires=`grep "^#[ \t]*requires:" $1 | cut -f2- -d:`
29462306a36Sopenharmony_ci  # Use eval to pass quoted-patterns correctly.
29562306a36Sopenharmony_ci  eval check_requires "$requires"
29662306a36Sopenharmony_ci}
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_citest_on_instance() { # testfile
29962306a36Sopenharmony_ci  grep -q "^#[ \t]*flags:.*instance" $1
30062306a36Sopenharmony_ci}
30162306a36Sopenharmony_ci
30262306a36Sopenharmony_ciktaptest() { # result comment
30362306a36Sopenharmony_ci  if [ "$KTAP" != "1" ]; then
30462306a36Sopenharmony_ci    return
30562306a36Sopenharmony_ci  fi
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci  local result=
30862306a36Sopenharmony_ci  if [ "$1" = "1" ]; then
30962306a36Sopenharmony_ci    result="ok"
31062306a36Sopenharmony_ci  else
31162306a36Sopenharmony_ci    result="not ok"
31262306a36Sopenharmony_ci  fi
31362306a36Sopenharmony_ci  shift
31462306a36Sopenharmony_ci
31562306a36Sopenharmony_ci  local comment=$*
31662306a36Sopenharmony_ci  if [ "$comment" != "" ]; then
31762306a36Sopenharmony_ci    comment="# $comment"
31862306a36Sopenharmony_ci  fi
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci  echo $result $CASENO $INSTANCE$CASENAME $comment
32162306a36Sopenharmony_ci}
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_cieval_result() { # sigval
32462306a36Sopenharmony_ci  case $1 in
32562306a36Sopenharmony_ci    $PASS)
32662306a36Sopenharmony_ci      prlog "	[${color_green}PASS${color_reset}]"
32762306a36Sopenharmony_ci      ktaptest 1
32862306a36Sopenharmony_ci      PASSED_CASES="$PASSED_CASES $CASENO"
32962306a36Sopenharmony_ci      return 0
33062306a36Sopenharmony_ci    ;;
33162306a36Sopenharmony_ci    $FAIL)
33262306a36Sopenharmony_ci      prlog "	[${color_red}FAIL${color_reset}]"
33362306a36Sopenharmony_ci      ktaptest 0
33462306a36Sopenharmony_ci      FAILED_CASES="$FAILED_CASES $CASENO"
33562306a36Sopenharmony_ci      return 1 # this is a bug.
33662306a36Sopenharmony_ci    ;;
33762306a36Sopenharmony_ci    $UNRESOLVED)
33862306a36Sopenharmony_ci      prlog "	[${color_blue}UNRESOLVED${color_reset}]"
33962306a36Sopenharmony_ci      ktaptest 0 UNRESOLVED
34062306a36Sopenharmony_ci      UNRESOLVED_CASES="$UNRESOLVED_CASES $CASENO"
34162306a36Sopenharmony_ci      return $UNRESOLVED_RESULT # depends on use case
34262306a36Sopenharmony_ci    ;;
34362306a36Sopenharmony_ci    $UNTESTED)
34462306a36Sopenharmony_ci      prlog "	[${color_blue}UNTESTED${color_reset}]"
34562306a36Sopenharmony_ci      ktaptest 1 SKIP
34662306a36Sopenharmony_ci      UNTESTED_CASES="$UNTESTED_CASES $CASENO"
34762306a36Sopenharmony_ci      return 0
34862306a36Sopenharmony_ci    ;;
34962306a36Sopenharmony_ci    $UNSUPPORTED)
35062306a36Sopenharmony_ci      prlog "	[${color_blue}UNSUPPORTED${color_reset}]"
35162306a36Sopenharmony_ci      ktaptest 1 SKIP
35262306a36Sopenharmony_ci      UNSUPPORTED_CASES="$UNSUPPORTED_CASES $CASENO"
35362306a36Sopenharmony_ci      return $UNSUPPORTED_RESULT # depends on use case
35462306a36Sopenharmony_ci    ;;
35562306a36Sopenharmony_ci    $XFAIL)
35662306a36Sopenharmony_ci      prlog "	[${color_green}XFAIL${color_reset}]"
35762306a36Sopenharmony_ci      ktaptest 1 XFAIL
35862306a36Sopenharmony_ci      XFAILED_CASES="$XFAILED_CASES $CASENO"
35962306a36Sopenharmony_ci      return 0
36062306a36Sopenharmony_ci    ;;
36162306a36Sopenharmony_ci    *)
36262306a36Sopenharmony_ci      prlog "	[${color_blue}UNDEFINED${color_reset}]"
36362306a36Sopenharmony_ci      ktaptest 0 error
36462306a36Sopenharmony_ci      UNDEFINED_CASES="$UNDEFINED_CASES $CASENO"
36562306a36Sopenharmony_ci      return 1 # this must be a test bug
36662306a36Sopenharmony_ci    ;;
36762306a36Sopenharmony_ci  esac
36862306a36Sopenharmony_ci}
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci# Signal handling for result codes
37162306a36Sopenharmony_ciSIG_RESULT=
37262306a36Sopenharmony_ciSIG_BASE=36	# Use realtime signals
37362306a36Sopenharmony_ciSIG_PID=$$
37462306a36Sopenharmony_ci
37562306a36Sopenharmony_ciexit_pass () {
37662306a36Sopenharmony_ci  exit 0
37762306a36Sopenharmony_ci}
37862306a36Sopenharmony_ci
37962306a36Sopenharmony_ciSIG_FAIL=$((SIG_BASE + FAIL))
38062306a36Sopenharmony_ciexit_fail () {
38162306a36Sopenharmony_ci  exit 1
38262306a36Sopenharmony_ci}
38362306a36Sopenharmony_citrap 'SIG_RESULT=$FAIL' $SIG_FAIL
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ciSIG_UNRESOLVED=$((SIG_BASE + UNRESOLVED))
38662306a36Sopenharmony_ciexit_unresolved () {
38762306a36Sopenharmony_ci  kill -s $SIG_UNRESOLVED $SIG_PID
38862306a36Sopenharmony_ci  exit 0
38962306a36Sopenharmony_ci}
39062306a36Sopenharmony_citrap 'SIG_RESULT=$UNRESOLVED' $SIG_UNRESOLVED
39162306a36Sopenharmony_ci
39262306a36Sopenharmony_ciSIG_UNTESTED=$((SIG_BASE + UNTESTED))
39362306a36Sopenharmony_ciexit_untested () {
39462306a36Sopenharmony_ci  kill -s $SIG_UNTESTED $SIG_PID
39562306a36Sopenharmony_ci  exit 0
39662306a36Sopenharmony_ci}
39762306a36Sopenharmony_citrap 'SIG_RESULT=$UNTESTED' $SIG_UNTESTED
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_ciSIG_UNSUPPORTED=$((SIG_BASE + UNSUPPORTED))
40062306a36Sopenharmony_ciexit_unsupported () {
40162306a36Sopenharmony_ci  kill -s $SIG_UNSUPPORTED $SIG_PID
40262306a36Sopenharmony_ci  exit 0
40362306a36Sopenharmony_ci}
40462306a36Sopenharmony_citrap 'SIG_RESULT=$UNSUPPORTED' $SIG_UNSUPPORTED
40562306a36Sopenharmony_ci
40662306a36Sopenharmony_ciSIG_XFAIL=$((SIG_BASE + XFAIL))
40762306a36Sopenharmony_ciexit_xfail () {
40862306a36Sopenharmony_ci  kill -s $SIG_XFAIL $SIG_PID
40962306a36Sopenharmony_ci  exit 0
41062306a36Sopenharmony_ci}
41162306a36Sopenharmony_citrap 'SIG_RESULT=$XFAIL' $SIG_XFAIL
41262306a36Sopenharmony_ci
41362306a36Sopenharmony_ci__run_test() { # testfile
41462306a36Sopenharmony_ci  # setup PID and PPID, $$ is not updated.
41562306a36Sopenharmony_ci  (cd $TRACING_DIR; read PID _ < /proc/self/stat; set -e; set -x;
41662306a36Sopenharmony_ci   checkreq $1; initialize_ftrace; . $1)
41762306a36Sopenharmony_ci  [ $? -ne 0 ] && kill -s $SIG_FAIL $SIG_PID
41862306a36Sopenharmony_ci}
41962306a36Sopenharmony_ci
42062306a36Sopenharmony_ci# Run one test case
42162306a36Sopenharmony_cirun_test() { # testfile
42262306a36Sopenharmony_ci  local testname=`basename $1`
42362306a36Sopenharmony_ci  testcase $1
42462306a36Sopenharmony_ci  prlog -n "[$CASENO]$INSTANCE$CASENAME"
42562306a36Sopenharmony_ci  if [ ! -z "$LOG_FILE" ] ; then
42662306a36Sopenharmony_ci    local testlog=`mktemp $LOG_DIR/${CASENO}-${testname}-log.XXXXXX`
42762306a36Sopenharmony_ci  else
42862306a36Sopenharmony_ci    local testlog=/proc/self/fd/1
42962306a36Sopenharmony_ci  fi
43062306a36Sopenharmony_ci  export TMPDIR=`mktemp -d /tmp/ftracetest-dir.XXXXXX`
43162306a36Sopenharmony_ci  export FTRACETEST_ROOT=$TOP_DIR
43262306a36Sopenharmony_ci  echo "execute$INSTANCE: "$1 > $testlog
43362306a36Sopenharmony_ci  SIG_RESULT=0
43462306a36Sopenharmony_ci  if [ $VERBOSE -eq -1 ]; then
43562306a36Sopenharmony_ci    __run_test $1
43662306a36Sopenharmony_ci  elif [ -z "$LOG_FILE" ]; then
43762306a36Sopenharmony_ci    __run_test $1 2>&1
43862306a36Sopenharmony_ci  elif [ $VERBOSE -ge 3 ]; then
43962306a36Sopenharmony_ci    __run_test $1 | tee -a $testlog 2>&1
44062306a36Sopenharmony_ci  elif [ $VERBOSE -eq 2 ]; then
44162306a36Sopenharmony_ci    __run_test $1 2>> $testlog | tee -a $testlog
44262306a36Sopenharmony_ci  else
44362306a36Sopenharmony_ci    __run_test $1 >> $testlog 2>&1
44462306a36Sopenharmony_ci  fi
44562306a36Sopenharmony_ci  eval_result $SIG_RESULT
44662306a36Sopenharmony_ci  if [ $? -eq 0 ]; then
44762306a36Sopenharmony_ci    # Remove test log if the test was done as it was expected.
44862306a36Sopenharmony_ci    [ $KEEP_LOG -eq 0 -a ! -z "$LOG_FILE" ] && rm $testlog
44962306a36Sopenharmony_ci  else
45062306a36Sopenharmony_ci    [ $VERBOSE -eq 1 -o $VERBOSE -eq 2 ] && catlog $testlog
45162306a36Sopenharmony_ci    TOTAL_RESULT=1
45262306a36Sopenharmony_ci  fi
45362306a36Sopenharmony_ci  rm -rf $TMPDIR
45462306a36Sopenharmony_ci}
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_ci# load in the helper functions
45762306a36Sopenharmony_ci. $TEST_DIR/functions
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_ciif [ "$KTAP" = "1" ]; then
46062306a36Sopenharmony_ci  echo "TAP version 13"
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_ci  casecount=`echo $TEST_CASES | wc -w`
46362306a36Sopenharmony_ci  for t in $TEST_CASES; do
46462306a36Sopenharmony_ci    test_on_instance $t || continue
46562306a36Sopenharmony_ci    casecount=$((casecount+1))
46662306a36Sopenharmony_ci  done
46762306a36Sopenharmony_ci  echo "1..${casecount}"
46862306a36Sopenharmony_cifi
46962306a36Sopenharmony_ci
47062306a36Sopenharmony_ci# Main loop
47162306a36Sopenharmony_cifor t in $TEST_CASES; do
47262306a36Sopenharmony_ci  run_test $t
47362306a36Sopenharmony_ci  if [ $STOP_FAILURE -ne 0 -a $TOTAL_RESULT -ne 0 ]; then
47462306a36Sopenharmony_ci    echo "A failure detected. Stop test."
47562306a36Sopenharmony_ci    exit 1
47662306a36Sopenharmony_ci  fi
47762306a36Sopenharmony_cidone
47862306a36Sopenharmony_ci
47962306a36Sopenharmony_ci# Test on instance loop
48062306a36Sopenharmony_ciINSTANCE=" (instance) "
48162306a36Sopenharmony_cifor t in $TEST_CASES; do
48262306a36Sopenharmony_ci  test_on_instance $t || continue
48362306a36Sopenharmony_ci  SAVED_TRACING_DIR=$TRACING_DIR
48462306a36Sopenharmony_ci  export TRACING_DIR=`mktemp -d $TRACING_DIR/instances/ftracetest.XXXXXX`
48562306a36Sopenharmony_ci  run_test $t
48662306a36Sopenharmony_ci  rmdir $TRACING_DIR
48762306a36Sopenharmony_ci  TRACING_DIR=$SAVED_TRACING_DIR
48862306a36Sopenharmony_ci  if [ $STOP_FAILURE -ne 0 -a $TOTAL_RESULT -ne 0 ]; then
48962306a36Sopenharmony_ci    echo "A failure detected. Stop test."
49062306a36Sopenharmony_ci    exit 1
49162306a36Sopenharmony_ci  fi
49262306a36Sopenharmony_cidone
49362306a36Sopenharmony_ci(cd $TRACING_DIR; finish_ftrace) # for cleanup
49462306a36Sopenharmony_ci
49562306a36Sopenharmony_ciprlog ""
49662306a36Sopenharmony_ciprlog "# of passed: " `echo $PASSED_CASES | wc -w`
49762306a36Sopenharmony_ciprlog "# of failed: " `echo $FAILED_CASES | wc -w`
49862306a36Sopenharmony_ciprlog "# of unresolved: " `echo $UNRESOLVED_CASES | wc -w`
49962306a36Sopenharmony_ciprlog "# of untested: " `echo $UNTESTED_CASES | wc -w`
50062306a36Sopenharmony_ciprlog "# of unsupported: " `echo $UNSUPPORTED_CASES | wc -w`
50162306a36Sopenharmony_ciprlog "# of xfailed: " `echo $XFAILED_CASES | wc -w`
50262306a36Sopenharmony_ciprlog "# of undefined(test bug): " `echo $UNDEFINED_CASES | wc -w`
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_ciif [ "$KTAP" = "1" ]; then
50562306a36Sopenharmony_ci  echo -n "# Totals:"
50662306a36Sopenharmony_ci  echo -n " pass:"`echo $PASSED_CASES | wc -w`
50762306a36Sopenharmony_ci  echo -n " faii:"`echo $FAILED_CASES | wc -w`
50862306a36Sopenharmony_ci  echo -n " xfail:"`echo $XFAILED_CASES | wc -w`
50962306a36Sopenharmony_ci  echo -n " xpass:0"
51062306a36Sopenharmony_ci  echo -n " skip:"`echo $UNTESTED_CASES $UNSUPPORTED_CASES | wc -w`
51162306a36Sopenharmony_ci  echo -n " error:"`echo $UNRESOLVED_CASES $UNDEFINED_CASES | wc -w`
51262306a36Sopenharmony_ci  echo
51362306a36Sopenharmony_cifi
51462306a36Sopenharmony_ci
51562306a36Sopenharmony_cicleanup
51662306a36Sopenharmony_ci
51762306a36Sopenharmony_ci# if no error, return 0
51862306a36Sopenharmony_ciexit $TOTAL_RESULT
519