lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Tue, 23 Sep 2014 00:47:32 +0900
From:	Namhyung Kim <namhyung@...il.com>
To:	Masami Hiramatsu <masami.hiramatsu.pt@...achi.com>
Cc:	Shuah Khan <shuah.kh@...sung.com>,
	Tom Zanussi <tom.zanussi@...ux.intel.com>,
	Oleg Nesterov <oleg@...hat.com>,
	Steven Rostedt <rostedt@...dmis.org>,
	Fengguang Wu <fengguang.wu@...el.com>,
	Ingo Molnar <mingo@...nel.org>,
	Linux Kernel Mailing List <linux-kernel@...r.kernel.org>
Subject: Re: [PATCH v4 4/4] ftracetest: Add POSIX.3 standard and XFAIL
 result codes

Hi Masami,

2014-09-18 (목), 12:05 +0000, Masami Hiramatsu:
> Add XFAIL and POSIX 1003.3 standard codes (UNRESOLVED/
> UNTESTED/UNSUPPORTED) as result codes. These are used for the
> results that test case is expected to fail or unsupported
> feature (by config).
> 
> To return these result code, this introduces exit_unresolved,
> exit_untested, exit_unsupported and exit_xfail functions,
> which use real-time signals to notify the result code to
> ftracetest.
> 
> This also set "errexit" option for the testcases, so that
> the tests don't need to exit explicitly.

Looks much better than before!

Thanks,
Namhyung


> 
> Changes in v4:
>  - Remove XPASS and short-names.
>  - Use real-time signals for result code.
>  - Simplify test cases by using errexit option.
>  - Add sample scripts for result code.
> 
> Changes in v3:
>  - Add UNRESOLVED/UNTESTED codes.
>  - Fix to handle undefined codes.
>  - Add a document about return codes.
>  - Fix to show failure logs.
>  - Don't use -e option for echo since dash doesn't support it.
> 
> Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@...achi.com>
> ---
>  tools/testing/selftests/ftrace/README              |   38 ++++++
>  tools/testing/selftests/ftrace/ftracetest          |  122 ++++++++++++++++++--
>  tools/testing/selftests/ftrace/samples/fail.tc     |    4 +
>  tools/testing/selftests/ftrace/samples/pass.tc     |    3 
>  .../testing/selftests/ftrace/samples/unresolved.tc |    4 +
>  .../selftests/ftrace/samples/unsupported.tc        |    3 
>  tools/testing/selftests/ftrace/samples/untested.tc |    3 
>  tools/testing/selftests/ftrace/samples/xfail.tc    |    3 
>  .../selftests/ftrace/test.d/00basic/basic2.tc      |    3 
>  .../selftests/ftrace/test.d/00basic/basic3.tc      |    6 -
>  .../ftrace/test.d/kprobe/add_and_remove.tc         |   12 +-
>  .../selftests/ftrace/test.d/kprobe/busy_check.tc   |   15 +-
>  tools/testing/selftests/ftrace/test.d/template     |    5 +
>  13 files changed, 187 insertions(+), 34 deletions(-)
>  create mode 100644 tools/testing/selftests/ftrace/samples/fail.tc
>  create mode 100644 tools/testing/selftests/ftrace/samples/pass.tc
>  create mode 100644 tools/testing/selftests/ftrace/samples/unresolved.tc
>  create mode 100644 tools/testing/selftests/ftrace/samples/unsupported.tc
>  create mode 100644 tools/testing/selftests/ftrace/samples/untested.tc
>  create mode 100644 tools/testing/selftests/ftrace/samples/xfail.tc
> 
> diff --git a/tools/testing/selftests/ftrace/README b/tools/testing/selftests/ftrace/README
> index ee2cef7..182e76f 100644
> --- a/tools/testing/selftests/ftrace/README
> +++ b/tools/testing/selftests/ftrace/README
> @@ -38,9 +38,45 @@ extension) and rewrite the test description line.
>   * The test cases should run on dash (busybox shell) for testing on
>     minimal cross-build environments.
>  
> + * Note that the tests are run with "set -e" (errexit) option. If any
> +   command fails, the test will be terminated immediately.
> +
> + * The tests can return some result codes instead of pass or fail by
> +   using exit_unresolved, exit_untested, exit_unsupported and exit_xfail.
> +
> +Result code
> +===========
> +
> +Ftracetest supports following result codes.
> +
> + * PASS: The test succeeded as expected. The test which exits with 0 is
> +         counted as passed test.
> +
> + * FAIL: The test failed, but was expected to succeed. The test which exits
> +         with !0 is counted as failed test.
> +
> + * UNRESOLVED: The test produced unclear or intermidiate results.
> +             for example, the test was interrupted
> +                       or the test depends on a previous test, which failed.
> +                       or the test was set up incorrectly
> +             The test which is in above situation, must call exit_unresolved.
> +
> + * UNTESTED: The test was not run, currently just a placeholder.
> +             In this case, the test must call exit_untested.
> +
> + * UNSUPPORTED: The test failed because of lack of feature.
> +               In this case, the test must call exit_unsupported.
> +
> + * XFAIL: The test failed, and was expected to fail.
> +          To return XFAIL, call exit_xfail from the test.
> +
> +There are some sample test scripts for result code under samples/.
> +You can also run samples as below:
> +
> +  # ./ftracetest samples/
> +
>  TODO
>  ====
>  
>   * Fancy colored output :)
>  
> - * Integrate with selftest?
> diff --git a/tools/testing/selftests/ftrace/ftracetest b/tools/testing/selftests/ftrace/ftracetest
> index 02f4e7a..2f7f8da0 100755
> --- a/tools/testing/selftests/ftrace/ftracetest
> +++ b/tools/testing/selftests/ftrace/ftracetest
> @@ -112,22 +112,105 @@ catlog() { #file
>  }
>  
>  # Testcase management
> +# Test result codes - Dejagnu extended code
> +PASS=0	# The test succeeded.
> +FAIL=1	# The test failed, but was expected to succeed.
> +UNRESOLVED=2  # The test produced indeterminate results. (e.g. interrupted)
> +UNTESTED=3    # The test was not run, currently just a placeholder.
> +UNSUPPORTED=4 # The test failed because of lack of feature.
> +XFAIL=5	# The test failed, and was expected to fail.
> +
> +# Accumulations
>  PASSED_CASES=
>  FAILED_CASES=
> +UNRESOLVED_CASES=
> +UNTESTED_CASES=
> +UNSUPPORTED_CASES=
> +XFAILED_CASES=
> +UNDEFINED_CASES=
> +
>  CASENO=0
>  testcase() { # testfile
>    CASENO=$((CASENO+1))
>    prlog -n "[$CASENO]"`grep "^#[ \t]*description:" $1 | cut -f2 -d:`
>  }
> -failed() {
> -  prlog "	[FAIL]"
> -  FAILED_CASES="$FAILED_CASES $CASENO"
> +
> +eval_result() { # retval sigval
> +  local retval=$2
> +  if [ $2 -eq 0 ]; then
> +    test $1 -ne 0 && retval=$FAIL
> +  fi
> +  case $retval in
> +    $PASS)
> +      prlog "	[PASS]"
> +      PASSED_CASES="$PASSED_CASES $CASENO"
> +      return 0
> +    ;;
> +    $FAIL)
> +      prlog "	[FAIL]"
> +      FAILED_CASES="$FAILED_CASES $CASENO"
> +      return 1 # this is a bug.
> +    ;;
> +    $UNRESOLVED)
> +      prlog "	[UNRESOLVED]"
> +      UNRESOLVED_CASES="$UNRESOLVED_CASES $CASENO"
> +      return 1 # this is a kind of bug.. something happened.
> +    ;;
> +    $UNTESTED)
> +      prlog "	[UNTESTED]"
> +      UNTESTED_CASES="$UNTESTED_CASES $CASENO"
> +      return 0
> +    ;;
> +    $UNSUPPORTED)
> +      prlog "	[UNSUPPORTED]"
> +      UNSUPPORTED_CASES="$UNSUPPORTED_CASES $CASENO"
> +      return 0 # this is not a bug
> +    ;;
> +    $XFAIL)
> +      prlog "	[XFAIL]"
> +      XFAILED_CASES="$XFAILED_CASES $CASENO"
> +      return 0
> +    ;;
> +    *)
> +      prlog "	[UNDEFINED]"
> +      UNDEFINED_CASES="$UNDEFINED_CASES $CASENO"
> +      return 1 # this must be a test bug
> +    ;;
> +  esac
> +}
> +
> +# Signal handling for result codes
> +SIG_RESULT=
> +SIG_BASE=36	# Use realtime signals
> +SIG_PID=$$
> +
> +SIG_UNRESOLVED=$((SIG_BASE + UNRESOLVED))
> +exit_unresolved () {
> +  kill -s $SIG_UNRESOLVED $SIG_PID
> +  exit 0
> +}
> +trap 'SIG_RESULT=$UNRESOLVED' $SIG_UNRESOLVED
> +
> +SIG_UNTESTED=$((SIG_BASE + UNTESTED))
> +exit_untested () {
> +  kill -s $SIG_UNTESTED $SIG_PID
> +  exit 0
>  }
> -passed() {
> -  prlog "	[PASS]"
> -  PASSED_CASES="$PASSED_CASES $CASENO"
> +trap 'SIG_RESULT=$UNTESTED' $SIG_UNTESTED
> +
> +SIG_UNSUPPORTED=$((SIG_BASE + UNSUPPORTED))
> +exit_unsupported () {
> +  kill -s $SIG_UNSUPPORTED $SIG_PID
> +  exit 0
>  }
> +trap 'SIG_RESULT=$UNSUPPORTED' $SIG_UNSUPPORTED
>  
> +SIG_XFAIL=$((SIG_BASE + XFAIL))
> +exit_xfail () {
> +  kill -s $SIG_XFAIL $SIG_PID
> +  exit 0
> +}
> +trap 'SIG_RESULT=$XFAIL' $SIG_XFAIL
>  
>  # Run one test case
>  run_test() { # testfile
> @@ -135,14 +218,16 @@ run_test() { # testfile
>    local testlog=`mktemp --tmpdir=$LOG_DIR ${testname}-XXXXXX.log`
>    testcase $1
>    echo "execute: "$1 > $testlog
> -  (cd $TRACING_DIR; set -x ; . $1) >> $testlog 2>&1
> -  ret=$?
> -  if [ $ret -ne 0 ]; then
> -    failed
> -    catlog $testlog
> -  else
> -    passed
> +  SIG_RESULT=0
> +  # setup PID and PPID, $$ is not updated.
> +  (cd $TRACING_DIR; read PID _ < /proc/self/stat ;
> +   set -e; set -x; . $1) >> $testlog 2>&1
> +  eval_result $? $SIG_RESULT
> +  if [ $? -eq 0 ]; then
> +    # Remove test log if the test was done as it was expected.
>      [ $KEEP_LOG -eq 0 ] && rm $testlog
> +  else
> +    catlog $testlog
>    fi
>  }
>  
> @@ -150,8 +235,15 @@ run_test() { # testfile
>  for t in $TEST_CASES; do
>    run_test $t
>  done
> +
>  prlog ""
>  prlog "# of passed: " `echo $PASSED_CASES | wc -w`
>  prlog "# of failed: " `echo $FAILED_CASES | wc -w`
> -
> -test -z "$FAILED_CASES" # if no error, return 0
> +prlog "# of unresolved: " `echo $UNRESOLVED_CASES | wc -w`
> +prlog "# of untested: " `echo $UNTESTED_CASES | wc -w`
> +prlog "# of unsupported: " `echo $UNSUPPORTED_CASES | wc -w`
> +prlog "# of xfailed: " `echo $XFAILED_CASES | wc -w`
> +prlog "# of undefined(test bug): " `echo $UNDEFINED_CASES | wc -w`
> +
> +# if no error, return 0
> +test -z "$FAILED_CASES$UNDEFINED_CASES$UNRESOLVED_CASES"
> diff --git a/tools/testing/selftests/ftrace/samples/fail.tc b/tools/testing/selftests/ftrace/samples/fail.tc
> new file mode 100644
> index 0000000..15e35b9
> --- /dev/null
> +++ b/tools/testing/selftests/ftrace/samples/fail.tc
> @@ -0,0 +1,4 @@
> +#!/bin/sh
> +# description: failure-case example
> +cat non-exist-file
> +echo "this is not executed"
> diff --git a/tools/testing/selftests/ftrace/samples/pass.tc b/tools/testing/selftests/ftrace/samples/pass.tc
> new file mode 100644
> index 0000000..d015493
> --- /dev/null
> +++ b/tools/testing/selftests/ftrace/samples/pass.tc
> @@ -0,0 +1,3 @@
> +#!/bin/sh
> +# description: pass-case example
> +return 0
> diff --git a/tools/testing/selftests/ftrace/samples/unresolved.tc b/tools/testing/selftests/ftrace/samples/unresolved.tc
> new file mode 100644
> index 0000000..41e99d3
> --- /dev/null
> +++ b/tools/testing/selftests/ftrace/samples/unresolved.tc
> @@ -0,0 +1,4 @@
> +#!/bin/sh
> +# description: unresolved-case example
> +trap exit_unresolved INT
> +kill -INT $PID
> diff --git a/tools/testing/selftests/ftrace/samples/unsupported.tc b/tools/testing/selftests/ftrace/samples/unsupported.tc
> new file mode 100644
> index 0000000..45910ff
> --- /dev/null
> +++ b/tools/testing/selftests/ftrace/samples/unsupported.tc
> @@ -0,0 +1,3 @@
> +#!/bin/sh
> +# description: unsupported-case example
> +exit_unsupported
> diff --git a/tools/testing/selftests/ftrace/samples/untested.tc b/tools/testing/selftests/ftrace/samples/untested.tc
> new file mode 100644
> index 0000000..35a4594
> --- /dev/null
> +++ b/tools/testing/selftests/ftrace/samples/untested.tc
> @@ -0,0 +1,3 @@
> +#!/bin/sh
> +# description: untested-case example
> +exit_untested
> diff --git a/tools/testing/selftests/ftrace/samples/xfail.tc b/tools/testing/selftests/ftrace/samples/xfail.tc
> new file mode 100644
> index 0000000..9dd3953
> --- /dev/null
> +++ b/tools/testing/selftests/ftrace/samples/xfail.tc
> @@ -0,0 +1,3 @@
> +#!/bin/sh
> +# description: xfail-case example
> +cat non-exist-file || exit_xfail
> diff --git a/tools/testing/selftests/ftrace/test.d/00basic/basic2.tc b/tools/testing/selftests/ftrace/test.d/00basic/basic2.tc
> index b04f30d..bf9a7b0 100644
> --- a/tools/testing/selftests/ftrace/test.d/00basic/basic2.tc
> +++ b/tools/testing/selftests/ftrace/test.d/00basic/basic2.tc
> @@ -1,6 +1,7 @@
>  #!/bin/sh
>  # description: Basic test for tracers
> +test -f available_tracers
>  for t in `cat available_tracers`; do
> -  echo $t > current_tracer || exit 1
> +  echo $t > current_tracer
>  done
>  echo nop > current_tracer
> diff --git a/tools/testing/selftests/ftrace/test.d/00basic/basic3.tc b/tools/testing/selftests/ftrace/test.d/00basic/basic3.tc
> index 0c1a3a2..bde6625 100644
> --- a/tools/testing/selftests/ftrace/test.d/00basic/basic3.tc
> +++ b/tools/testing/selftests/ftrace/test.d/00basic/basic3.tc
> @@ -1,8 +1,8 @@
>  #!/bin/sh
>  # description: Basic trace clock test
> -[ -f trace_clock ] || exit 1
> +test -f trace_clock
>  for c in `cat trace_clock | tr  -d \[\]`; do
> -  echo $c > trace_clock || exit 1
> -  grep '\['$c'\]' trace_clock || exit 1
> +  echo $c > trace_clock
> +  grep '\['$c'\]' trace_clock
>  done
>  echo local > trace_clock
> diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/add_and_remove.tc b/tools/testing/selftests/ftrace/test.d/kprobe/add_and_remove.tc
> index 5ddfb47..1b8b665 100644
> --- a/tools/testing/selftests/ftrace/test.d/kprobe/add_and_remove.tc
> +++ b/tools/testing/selftests/ftrace/test.d/kprobe/add_and_remove.tc
> @@ -1,11 +1,11 @@
>  #!/bin/sh
>  # description: Kprobe dynamic event - adding and removing
>  
> -[ -f kprobe_events ] || exit 1
> +[ -f kprobe_events ] || exit_unsupported # this is configurable
>  
> -echo 0 > events/enable || exit 1
> -echo > kprobe_events || exit 1
> -echo p:myevent do_fork > kprobe_events || exit 1
> -grep myevent kprobe_events || exit 1
> -[ -d events/kprobes/myevent ] || exit 1
> +echo 0 > events/enable
> +echo > kprobe_events
> +echo p:myevent do_fork > kprobe_events
> +grep myevent kprobe_events
> +test -d events/kprobes/myevent
>  echo > kprobe_events
> diff --git a/tools/testing/selftests/ftrace/test.d/kprobe/busy_check.tc b/tools/testing/selftests/ftrace/test.d/kprobe/busy_check.tc
> index 588fde97..b55c840 100644
> --- a/tools/testing/selftests/ftrace/test.d/kprobe/busy_check.tc
> +++ b/tools/testing/selftests/ftrace/test.d/kprobe/busy_check.tc
> @@ -1,14 +1,13 @@
>  #!/bin/sh
>  # description: Kprobe dynamic event - busy event check
>  
> -[ -f kprobe_events ] || exit 1
> +[ -f kprobe_events ] || exit_unsupported
>  
> -echo 0 > events/enable || exit 1
> -echo > kprobe_events || exit 1
> -echo p:myevent do_fork > kprobe_events || exit 1
> -[ -d events/kprobes/myevent ] || exit 1
> -echo 1 > events/kprobes/myevent/enable || exit 1
> +echo 0 > events/enable
> +echo > kprobe_events
> +echo p:myevent do_fork > kprobe_events
> +test -d events/kprobes/myevent
> +echo 1 > events/kprobes/myevent/enable
>  echo > kprobe_events && exit 1 # this must fail
> -echo 0 > events/kprobes/myevent/enable || exit 1
> +echo 0 > events/kprobes/myevent/enable
>  echo > kprobe_events # this must succeed
> -
> diff --git a/tools/testing/selftests/ftrace/test.d/template b/tools/testing/selftests/ftrace/test.d/template
> index ce5f735..5448f7a 100644
> --- a/tools/testing/selftests/ftrace/test.d/template
> +++ b/tools/testing/selftests/ftrace/test.d/template
> @@ -1,4 +1,9 @@
>  #!/bin/sh
>  # description: %HERE DESCRIBE WHAT THIS DOES%
>  # you have to add ".tc" extention for your testcase file
> +# Note that all tests are run with "errexit" option.
> +
>  exit 0 # Return 0 if the test is passed, otherwise return !0
> +# If the test could not run because of lack of feature, call exit_unsupported
> +# If the test returned unclear results, call exit_unresolved
> +# If the test is a dummy, or a placeholder, call exit_untested
> 
> 


-- 
Regards,
Namhyung Kim


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ