lib/: spdx license conversion
[xfstests-dev.git] / check
diff --git a/check b/check
index f6fb352bcbb9553a45b3f1d0d030d0c8b8b2ee78..f3c8021d94b91eae324010f9a20a93d5f91bf71e 100755 (executable)
--- a/check
+++ b/check
@@ -1,24 +1,9 @@
 #!/bin/bash
-#
-# Control script for QA
-#
+# SPDX-License-Identifier: GPL-2.0
 # Copyright (c) 2000-2002,2006 Silicon Graphics, Inc.  All Rights Reserved.
 #
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License as
-# published by the Free Software Foundation.
-#
-# This program is distributed in the hope that it would be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write the Free Software Foundation,
-# Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-#
+# Control script for QA
 #
-
 tmp=/tmp/$$
 status=0
 needwrap=true
@@ -38,10 +23,12 @@ randomize=false
 export here=`pwd`
 xfile=""
 brief_test_summary=false
-_err_msg=""
 do_report=false
 DUMP_OUTPUT=false
 
+# This is a global variable used to pass test failure text to reporting gunk
+_err_msg=""
+
 # start the initialisation work now
 iam=check
 
@@ -331,10 +318,10 @@ while [ $# -gt 0 ]; do
        shift
 done
 
-# we need common/config, source it after processing args, overlay needs FSTYP
-# set before sourcing common/config
-if ! . ./common/config; then
-       echo "$iam: failed to source common/config"
+# we need common/rc, that also sources common/config. We need to source it
+# after processing args, overlay needs FSTYP set before sourcing common/config
+if ! . ./common/rc; then
+       echo "check: failed to source common/rc"
        exit 1
 fi
 
@@ -374,13 +361,6 @@ elif [ -z "$GROUP_LIST" ]; then
        GROUP_LIST="auto"
 fi
 
-# we need common/rc
-if ! . ./common/rc
-then
-    echo "check: failed to source common/rc"
-    exit 1
-fi
-
 if [ `id -u` -ne 0 ]
 then
     echo "check: QA must be run as root"
@@ -643,78 +623,99 @@ for section in $HOST_OPTIONS_SECTIONS; do
        seqres="$check"
        _check_test_fs
 
-       for seq in $list
-       do
-           err=false
-           _err_msg=""
-           if [ ! -f $seq ]; then
-               # Try to get full name in case the user supplied only seq id
-               # and the test has a name. A bit of hassle to find really
-               # the test and not its sample output or helping files.
-               bname=$(basename $seq)
-               full_seq=$(find $(dirname $seq) -name $bname* -executable |
-                   awk '(NR == 1 || length < length(shortest)) { shortest = $0 }\
-                       END { print shortest }')
-               if [ -f $full_seq ] \
-                   && [ x$(echo $bname | grep -o "^$VALID_TEST_ID") != x ]; then
-                   seq=$full_seq
-               fi
-           fi
+       err=false
+       first_test=true
+       prev_seq=""
+       for seq in $list ; do
+               # Run report for previous test!
+               if $err ; then
+                       bad="$bad $seqnum"
+                       n_bad=`expr $n_bad + 1`
+                       tc_status="fail"
+               fi
+               if $do_report && ! $first_test ; then
+                       if [ $tc_status != "expunge" ] ; then
+                               _make_testcase_report "$prev_seq" "$tc_status"
+                       fi
+               fi
+               first_test=false
+
+               err=false
+               prev_seq="$seq"
+               if [ ! -f $seq ]; then
+                       # Try to get full name in case the user supplied only
+                       # seq id and the test has a name. A bit of hassle to
+                       # find really the test and not its sample output or
+                       # helping files.
+                       bname=$(basename $seq)
+                       full_seq=$(find $(dirname $seq) -name $bname* -executable |
+                               awk '(NR == 1 || length < length(shortest)) { shortest = $0 }\
+                                    END { print shortest }')
+                       if [ -f $full_seq ] && \
+                          [ x$(echo $bname | grep -o "^$VALID_TEST_ID") != x ]; then
+                               seq=$full_seq
+                       fi
+               fi
 
-           # the filename for the test and the name output are different.
-           # we don't include the tests/ directory in the name output.
-           export seqnum=`echo $seq | sed -e "s;$SRC_DIR/;;"`
-
-           # Similarly, the result directory needs to replace the tests/
-           # part of the test location.
-           group=`dirname $seq`
-           if $OPTIONS_HAVE_SECTIONS; then
-               export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;${RESULT_BASE}/$section;"`
-               REPORT_DIR="$RESULT_BASE/$section"
-           else
-               export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;$RESULT_BASE;"`
-               REPORT_DIR="$RESULT_BASE"
-           fi
-           seqres="$REPORT_DIR/$seqnum"
+               # the filename for the test and the name output are different.
+               # we don't include the tests/ directory in the name output.
+               export seqnum=`echo $seq | sed -e "s;$SRC_DIR/;;"`
 
-           mkdir -p $RESULT_DIR
+               # Similarly, the result directory needs to replace the tests/
+               # part of the test location.
+               group=`dirname $seq`
+               if $OPTIONS_HAVE_SECTIONS; then
+                       export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;${RESULT_BASE}/$section;"`
+                       REPORT_DIR="$RESULT_BASE/$section"
+               else
+                       export RESULT_DIR=`echo $group | sed -e "s;$SRC_DIR;$RESULT_BASE;"`
+                       REPORT_DIR="$RESULT_BASE"
+               fi
+               seqres="$REPORT_DIR/$seqnum"
 
-           echo -n "$seqnum"
+               mkdir -p $RESULT_DIR
+               echo -n "$seqnum"
 
-           if $showme; then
-               _expunge_test $seqnum
-               if [ $? -eq 1 ]; then
+               if $showme; then
+                       _expunge_test $seqnum
+                       if [ $? -eq 1 ]; then
+                           tc_status="expunge"
+                           continue
+                       fi
+                       echo
+                       start=0
+                       stop=0
+                       tc_status="list"
+                       n_notrun=`expr $n_notrun + 1`
                        continue
                fi
-               echo
-               start=0
-               stop=0
-               n_notrun=`expr $n_notrun + 1`
-               if $do_report; then
-                       _make_testcase_report "list"
+
+               tc_status="pass"
+               if [ ! -f $seq ]; then
+                       echo " - no such test?"
+                       continue
                fi
-               continue
-           fi
-           tc_status="pass"
-           if [ ! -f $seq ]; then
-               echo " - no such test?"
-           else
+
                # really going to try and run this one
-               #
                rm -f $seqres.out.bad
 
                # check if we really should run it
                _expunge_test $seqnum
                if [ $? -eq 1 ]; then
+                       tc_status="expunge"
                        continue
                fi
 
+               # record that we really tried to run this test.
+               try="$try $seqnum"
+               n_try=`expr $n_try + 1`
+
                # slashes now in names, sed barfs on them so use grep
                lasttime=`grep -w ^$seqnum $check.time | awk '// {print $2}'`
                if [ "X$lasttime" != X ]; then
-                       echo -n " ${lasttime}s ..."
+                       echo -n " ${lasttime}s ... "
                else
-                       echo -n "       "       # prettier output with timestamps.
+                       echo -n "       " # prettier output with timestamps.
                fi
                rm -f core $seqres.notrun
 
@@ -736,90 +737,87 @@ for section in $HOST_OPTIONS_SECTIONS; do
                        ./$seq >$tmp.out 2>&1
                        sts=$?
                fi
-               $timestamp && _timestamp
-               stop=`_wallclock`
 
-               if [ -f core ]
-               then
-                   _err_msg="[dumped core]"
-                   echo -n " $_err_msg"
-                   mv core $RESULT_BASE/$seqnum.core
-                   err=true
+               if [ -f core ]; then
+                       _dump_err_cont "[dumped core]"
+                       mv core $RESULT_BASE/$seqnum.core
+                       err=true
                fi
 
-               if [ -f $seqres.notrun ]
-               then
-                   $timestamp || echo -n " [not run] "
-                   $timestamp && echo " [not run]" && echo -n "        $seqnum -- "
-                   cat $seqres.notrun
-                   notrun="$notrun $seqnum"
-                   n_notrun=`expr $n_notrun + 1`
-                   tc_status="notrun"
-               else
-                   if [ $sts -ne 0 ]
-                   then
-                       _err_msg="[failed, exit status $sts]"
-                       echo -n " $_err_msg"
+               if [ -f $seqres.notrun ]; then
+                       $timestamp && _timestamp
+                       stop=`_wallclock`
+                       $timestamp || echo -n "[not run] "
+                       $timestamp && echo " [not run]" && \
+                                     echo -n " $seqnum -- "
+                       cat $seqres.notrun
+                       notrun="$notrun $seqnum"
+                       n_notrun=`expr $n_notrun + 1`
+                       tc_status="notrun"
+                       continue;
+               fi
+
+               if [ $sts -ne 0 ]; then
+                       _dump_err_cont "[failed, exit status $sts]"
+                       _test_unmount 2> /dev/null
+                       _scratch_unmount 2> /dev/null
                        err=true
-                   fi
-                   if [ ! -f $seq.out ]
-                   then
+               else
+                       # the test apparently passed, so check for corruption
+                       # and log messages that shouldn't be there.
+                       _check_filesystems
+                       _check_dmesg || err=true
+                       _check_kmemleak || err=true
+               fi
+
+               # test ends after all checks are done.
+               $timestamp && _timestamp
+               stop=`_wallclock`
+
+               if [ ! -f $seq.out ]; then
                        _dump_err "no qualified output"
                        err=true
-                   else
-
-                       # coreutils 8.16+ changed quote formats in error messages from
-                       # `foo' to 'foo'. Filter old versions to match the new version.
-                       sed -i "s/\`/\'/g" $tmp.out
-                       if diff $seq.out $tmp.out >/dev/null 2>&1
-                       then
-                           if $err
-                           then
-                               :
-                           else
+                       continue;
+               fi
+
+               # coreutils 8.16+ changed quote formats in error messages
+               # from `foo' to 'foo'. Filter old versions to match the new
+               # version.
+               sed -i "s/\`/\'/g" $tmp.out
+               if diff $seq.out $tmp.out >/dev/null 2>&1 ; then
+                       if ! $err ; then
                                echo "$seqnum `expr $stop - $start`" >>$tmp.time
                                echo -n " `expr $stop - $start`s"
-                           fi
-                           echo ""
-                       else
-                           echo " - output mismatch (see $seqres.out.bad)"
-                           mv $tmp.out $seqres.out.bad
-                           $diff $seq.out $seqres.out.bad | {
-                               if test "$DIFF_LENGTH" -le 0; then
-                                       cat
-                               else
-                                       head -n "$DIFF_LENGTH"
-                                       echo "..."
-                                       echo "(Run '$diff $seq.out $seqres.out.bad'" \
-                                               " to see the entire diff)"
-                               fi; } | \
-                               sed -e 's/^\(.\)/    \1/'
-                           _err_msg="output mismatch (see $diff $seq.out $seqres.out.bad)"
-                           err=true
                        fi
-                   fi
-                   try="$try $seqnum"
-                   n_try=`expr $n_try + 1`
-                   _check_filesystems
-                   _check_dmesg || err=true
-                   _check_kmemleak || err=true
+                       echo ""
+               else
+                       _dump_err "- output mismatch (see $seqres.out.bad)"
+                       mv $tmp.out $seqres.out.bad
+                       $diff $seq.out $seqres.out.bad | {
+                       if test "$DIFF_LENGTH" -le 0; then
+                               cat
+                       else
+                               head -n "$DIFF_LENGTH"
+                               echo "..."
+                               echo "(Run '$diff $seq.out $seqres.out.bad'" \
+                                       " to see the entire diff)"
+                       fi; } | sed -e 's/^\(.\)/    \1/'
+                       err=true
                fi
+       done
 
-           fi
-
-           # come here for each test, except when $showme is true
-           #
-           if $err
-           then
+       # make sure we record the status of the last test we ran.
+       if $err ; then
                bad="$bad $seqnum"
                n_bad=`expr $n_bad + 1`
                tc_status="fail"
-           fi
-           if $do_report; then
-               _make_testcase_report "$tc_status"
-           fi
-           seq="after_$seqnum"
-       done
+       fi
+       if $do_report && ! $first_test ; then
+               if [ $tc_status != "expunge" ] ; then
+                       _make_testcase_report "$prev_seq" "$tc_status"
+               fi
+       fi
+
        sect_stop=`_wallclock`
        interrupt=false
        _wrapup