~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/testing/selftests/ftrace/ftracetest

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

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

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php