diff mbox series

[kvm-unit-tests,v3] tap13: list testcases individually

Message ID 1550852864-56308-1-git-send-email-pbonzini@redhat.com (mailing list archive)
State New, archived
Headers show
Series [kvm-unit-tests,v3] tap13: list testcases individually | expand

Commit Message

Paolo Bonzini Feb. 22, 2019, 4:27 p.m. UTC
From: Stefan Raspl <raspl@linux.ibm.com>

The current tap13 support summarizes testcases on a rather coarse
granularity. Which sort of defeats the purpose, especially in CI
environments, where having results for individual tests to pinpoint
problems helps a lot.

To improve things, this patch makes TAP mode bypass print_result and extract
results for individual testcases as they are sent to the log file.  It then
introduces test case numbers and writes the plan at the end.

One could argue that post-processing the logs is a rather fragile approach.
Which is true - but apparently already the case, see e.g. extract_summary
in scripts/runtime.bash. Plus this is quite cheap, while a proper solution
would require to modify the kernels, so we can e.g. pass in a counter for
the test case number. And we would probably have to come up with reasonable
test case names, while this approach simply derives them from each test
output.

Before:
  $ ./run_tests.sh -t
  TAP version 13
  ok selftest-setup
  ok intercept
  ok emulator
  ok sieve
  ok sthyi
  ok skey
  ok diag10
  ok pfmf
  ok cmm
  ok vector
  ok gs # SKIP
  ok iep # SKIP
  1..12

After:
  $ ./run_tests.sh -t
  TAP version 13
  ok 1 - cmm: privileged: Program interrupt: expected(2)
  ok 2 - cmm: invalid ORC 8: Program interrupt: expected(6)
  ok 3 - diag10: lowcore freeing: 0x0000/0x0000: Program interrupt: expected(6)
  ok 4 - diag10: lowcore freeing: 0x1000/0x1000: Program interrupt: expected(6)
  ok 5 - diag10: lowcore freeing: 0x0000/0x1000: Program interrupt: expected(6)
  ok 6 - diag10: start/end: end < start: Program interrupt: expected(6)
  ok 7 - diag10: start/end: unaligned start: Program interrupt: expected(6)
  ok 8 - diag10: start/end: unaligned end: Program interrupt: expected(6)
  ok 9 - diag10: privileged: Program interrupt: expected(2)
  ok 10 - emulator: spm/ipm: cc=0,key=f: bit 32 and 33 set to zero
  ok 11 - emulator: spm/ipm: cc=0,key=f: bit 0-31, 40-63 unchanged
  ok 12 - emulator: spm/ipm: cc=0,key=f: cc and key applied
  ok 13 - emulator: spm/ipm: cc=1,key=9: bit 32 and 33 set to zero
  1..180
  [...]

Signed-off-by: Stefan Raspl <raspl@linux.ibm.com>
[Almost rewritten, but still giving a lot of credit to Stefan. - Paolo]
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 run_tests.sh         | 59 +++++++++++++++++++++++++++++++++++++++++++---------
 scripts/runtime.bash | 19 +++--------------
 2 files changed, 52 insertions(+), 26 deletions(-)

Comments

Stefan Raspl Feb. 23, 2019, 8:45 a.m. UTC | #1
On 22.02.19 17:27, Paolo Bonzini wrote:
> From: Stefan Raspl <raspl@linux.ibm.com>
> 
> The current tap13 support summarizes testcases on a rather coarse
> granularity. Which sort of defeats the purpose, especially in CI
> environments, where having results for individual tests to pinpoint
> problems helps a lot.
> 
> To improve things, this patch makes TAP mode bypass print_result and extract
> results for individual testcases as they are sent to the log file.  It then
> introduces test case numbers and writes the plan at the end.
> 
> One could argue that post-processing the logs is a rather fragile approach.
> Which is true - but apparently already the case, see e.g. extract_summary
> in scripts/runtime.bash. Plus this is quite cheap, while a proper solution
> would require to modify the kernels, so we can e.g. pass in a counter for
> the test case number. And we would probably have to come up with reasonable
> test case names, while this approach simply derives them from each test
> output.
> 
> Before:
>   $ ./run_tests.sh -t
>   TAP version 13
>   ok selftest-setup
>   ok intercept
>   ok emulator
>   ok sieve
>   ok sthyi
>   ok skey
>   ok diag10
>   ok pfmf
>   ok cmm
>   ok vector
>   ok gs # SKIP
>   ok iep # SKIP
>   1..12
> 
> After:
>   $ ./run_tests.sh -t
>   TAP version 13
>   ok 1 - cmm: privileged: Program interrupt: expected(2)
>   ok 2 - cmm: invalid ORC 8: Program interrupt: expected(6)
>   ok 3 - diag10: lowcore freeing: 0x0000/0x0000: Program interrupt: expected(6)
>   ok 4 - diag10: lowcore freeing: 0x1000/0x1000: Program interrupt: expected(6)
>   ok 5 - diag10: lowcore freeing: 0x0000/0x1000: Program interrupt: expected(6)
>   ok 6 - diag10: start/end: end < start: Program interrupt: expected(6)
>   ok 7 - diag10: start/end: unaligned start: Program interrupt: expected(6)
>   ok 8 - diag10: start/end: unaligned end: Program interrupt: expected(6)
>   ok 9 - diag10: privileged: Program interrupt: expected(2)
>   ok 10 - emulator: spm/ipm: cc=0,key=f: bit 32 and 33 set to zero
>   ok 11 - emulator: spm/ipm: cc=0,key=f: bit 0-31, 40-63 unchanged
>   ok 12 - emulator: spm/ipm: cc=0,key=f: cc and key applied
>   ok 13 - emulator: spm/ipm: cc=1,key=9: bit 32 and 33 set to zero
>   1..180
>   [...]
> 
> Signed-off-by: Stefan Raspl <raspl@linux.ibm.com>
> [Almost rewritten, but still giving a lot of credit to Stefan. - Paolo]
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  run_tests.sh         | 59 +++++++++++++++++++++++++++++++++++++++++++---------
>  scripts/runtime.bash | 19 +++--------------
>  2 files changed, 52 insertions(+), 26 deletions(-)
> 
> diff --git a/run_tests.sh b/run_tests.sh
> index 6b0af19..edfd8a4 100755
> --- a/run_tests.sh
> +++ b/run_tests.sh
> @@ -69,12 +69,50 @@ shift $((OPTIND - 1))
>  only_tests="$*"
>  
>  # RUNTIME_log_file will be configured later
> -RUNTIME_log_stderr () { cat >> $RUNTIME_log_file; }
> +if [[ $tap_output == "no" ]]; then
> +    process_test_output() { cat >> $RUNTIME_log_file; }
> +    postprocess_suite_output() { cat; }
> +else
> +    process_test_output() {
> +        CR=$'\r'
> +        while read -r line; do
> +            line="${line%$CR}"
> +            case "${line:0:4}" in
> +                PASS)
> +                    echo "ok TEST_NUMBER - ${line#??????}" >&3
> +                    ;;
> +                FAIL)
> +                    echo "not ok TEST_NUMBER - ${line#??????}" >&3
> +                    ;;
> +                SKIP)
> +                    echo "ok TEST_NUMBER - ${line#??????} # skip" >&3
> +                    ;;

Nice!
However, you re-use the output of each test in full, e.g.

  ok 104 - intercept: stpx: Program interrupt: expected(4) == received(4)

But that's not a stable testcase name: The "received(4)" might change in case of
an error, that's why I was truncating everything from " ==" onwards. And it
would be nice in CI environments to have stable testcase names, makes things a
bit easier when comparing with previous output.
Could you fix that?
Otherwise, thanks for the credit - would be bizarr if I gave a rev'd &
tested-by, though :O

Ciao,
Stefan
diff mbox series

Patch

diff --git a/run_tests.sh b/run_tests.sh
index 6b0af19..edfd8a4 100755
--- a/run_tests.sh
+++ b/run_tests.sh
@@ -69,12 +69,50 @@  shift $((OPTIND - 1))
 only_tests="$*"
 
 # RUNTIME_log_file will be configured later
-RUNTIME_log_stderr () { cat >> $RUNTIME_log_file; }
+if [[ $tap_output == "no" ]]; then
+    process_test_output() { cat >> $RUNTIME_log_file; }
+    postprocess_suite_output() { cat; }
+else
+    process_test_output() {
+        CR=$'\r'
+        while read -r line; do
+            line="${line%$CR}"
+            case "${line:0:4}" in
+                PASS)
+                    echo "ok TEST_NUMBER - ${line#??????}" >&3
+                    ;;
+                FAIL)
+                    echo "not ok TEST_NUMBER - ${line#??????}" >&3
+                    ;;
+                SKIP)
+                    echo "ok TEST_NUMBER - ${line#??????} # skip" >&3
+                    ;;
+                *)
+                    ;;
+            esac
+            echo "${line}"
+        done >> $RUNTIME_log_file
+    }
+    postprocess_suite_output() {
+        test_number=0
+        while read -r line; do
+            case "${line}" in
+                ok*|"not ok"*)
+                    (( test_number++ ))
+                    echo "${line/TEST_NUMBER/${test_number}}" ;;
+                *) echo "${line}" ;;
+            esac
+        done
+        echo "1..$test_number"
+    }
+fi
+
+RUNTIME_log_stderr () { process_test_output; }
 RUNTIME_log_stdout () {
     if [ "$PRETTY_PRINT_STACKS" = "yes" ]; then
-        ./scripts/pretty_print_stacks.py $1 >> $RUNTIME_log_file
+        ./scripts/pretty_print_stacks.py $1 | process_test_output
     else
-        cat >> $RUNTIME_log_file
+        process_test_output
     fi
 }
 
@@ -84,7 +122,6 @@  function run_task()
 	if [ -z "$testname" ]; then
 		return
 	fi
-	test_number=$((test_number+1))
 
 	while (( $(jobs | wc -l) == $unittest_run_queues )); do
 		# wait for any background test to finish
@@ -110,15 +147,17 @@  mkdir $unittest_log_dir || exit 2
 echo "BUILD_HEAD=$(cat build-head)" > $unittest_log_dir/SUMMARY
 
 if [[ $tap_output == "yes" ]]; then
-    test_number=0
     echo "TAP version 13"
 fi
+
 trap "wait; exit 130" SIGINT
-for_each_unittest $config run_task
+
+(
+   # preserve stdout so that process_test_output output can write TAP to it
+   exec 3>&1
+   test "$tap_output" == "yes" && exec > /dev/null
+   for_each_unittest $config run_task
+) | postprocess_suite_output
 
 # wait until all tasks finish
 wait
-
-if [[ $tap_output == "yes" ]]; then
-    echo "1..$test_number"
-fi
diff --git a/scripts/runtime.bash b/scripts/runtime.bash
index 2f8026d..200d5b6 100644
--- a/scripts/runtime.bash
+++ b/scripts/runtime.bash
@@ -61,23 +61,10 @@  function print_result()
     local summary="$3"
     local reason="$4"
 
-    if [[ $tap_output == "no" ]]; then
-        if [ -z "$reason" ]; then
-            echo "`$status` $testname $summary"
-        else
-            echo "`$status` $testname ($reason)"
-        fi
-        return
-    fi
-
-    if [[ $status == "FAIL" ]]; then
-        echo "not ok $testname $reason"
-    elif [[ $status == "PASS" ]]; then
-        echo "ok $testname"
-    elif [[ $status == "SKIP" ]]; then
-        echo "ok $testname # SKIP $reason"
+    if [ -z "$reason" ]; then
+        echo "`$status` $testname $summary"
     else
-        echo "not ok # TODO unknown test status"
+        echo "`$status` $testname ($reason)"
     fi
 }