1#!/bin/bash 2# 3# Copyright (C) 2009 Red Hat, Inc. 4# Copyright (c) 2000-2002,2006 Silicon Graphics, Inc. All Rights Reserved. 5# 6# This program is free software; you can redistribute it and/or 7# modify it under the terms of the GNU General Public License as 8# published by the Free Software Foundation. 9# 10# This program is distributed in the hope that it would be useful, 11# but WITHOUT ANY WARRANTY; without even the implied warranty of 12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13# GNU General Public License for more details. 14# 15# You should have received a copy of the GNU General Public License 16# along with this program. If not, see <http://www.gnu.org/licenses/>. 17# 18# 19# Control script for QA 20# 21 22tmp=/tmp/$$ 23status=0 24needwrap=true 25try=0 26n_bad=0 27bad="" 28notrun="" 29interrupt=true 30 31# by default don't output timestamps 32timestamp=${TIMESTAMP:=false} 33 34# generic initialization 35iam=check 36 37# we need common.config 38if ! . ./common.config 39then 40 echo "$iam: failed to source common.config" 41 exit 1 42fi 43 44# we need common.rc 45if ! . ./common.rc 46then 47 echo "check: failed to source common.rc" 48 exit 1 49fi 50 51# we need common 52. ./common 53 54#if [ `id -u` -ne 0 ] 55#then 56# echo "check: QA must be run as root" 57# exit 1 58#fi 59 60_wallclock() 61{ 62 date "+%H %M %S" | $AWK_PROG '{ print $1*3600 + $2*60 + $3 }' 63} 64 65_timestamp() 66{ 67 now=`date "+%T"` 68 echo -n " [$now]" 69} 70 71_wrapup() 72{ 73 # for hangcheck ... 74 # remove files that were used by hangcheck 75 # 76 [ -f /tmp/check.pid ] && rm -rf /tmp/check.pid 77 [ -f /tmp/check.sts ] && rm -rf /tmp/check.sts 78 79 if $showme 80 then 81 : 82 elif $needwrap 83 then 84 if [ -f check.time -a -f $tmp.time ] 85 then 86 cat check.time $tmp.time \ 87 | $AWK_PROG ' 88 { t[$1] = $2 } 89END { if (NR > 0) { 90 for (i in t) print i " " t[i] 91 } 92 }' \ 93 | sort -n >$tmp.out 94 mv $tmp.out check.time 95 fi 96 97 if [ -f $tmp.expunged ] 98 then 99 notrun=`wc -l <$tmp.expunged | sed -e 's/ *//g'` 100 try=`expr $try - $notrun` 101 list=`echo "$list" | sed -f $tmp.expunged` 102 fi 103 104 echo "" >>check.log 105 date >>check.log 106 echo $list | fmt | sed -e 's/^/ /' >>check.log 107 $interrupt && echo "Interrupted!" >>check.log 108 109 if [ ! -z "$notrun" ] 110 then 111 echo "Not run:$notrun" 112 echo "Not run:$notrun" >>check.log 113 fi 114 if [ ! -z "$n_bad" -a $n_bad != 0 ] 115 then 116 echo "Failures:$bad" 117 echo "Failed $n_bad of $try tests" 118 echo "Failures:$bad" | fmt >>check.log 119 echo "Failed $n_bad of $try tests" >>check.log 120 else 121 echo "Passed all $try tests" 122 echo "Passed all $try tests" >>check.log 123 fi 124 needwrap=false 125 fi 126 127 rm -f /tmp/*.out /tmp/*.err /tmp/*.time 128 rm -f /tmp/check.pid /tmp/check.sts 129 rm -f $tmp.* 130} 131 132trap "_wrapup; exit \$status" 0 1 2 3 15 133 134# for hangcheck ... 135# Save pid of check in a well known place, so that hangcheck can be sure it 136# has the right pid (getting the pid from ps output is not reliable enough). 137# 138rm -rf /tmp/check.pid 139echo $$ >/tmp/check.pid 140 141# for hangcheck ... 142# Save the status of check in a well known place, so that hangcheck can be 143# sure to know where check is up to (getting test number from ps output is 144# not reliable enough since the trace stuff has been introduced). 145# 146rm -rf /tmp/check.sts 147echo "preamble" >/tmp/check.sts 148 149# don't leave old full output behind on a clean run 150rm -f check.full 151 152[ -f check.time ] || touch check.time 153 154FULL_IMGFMT_DETAILS=`_full_imgfmt_details` 155FULL_IMGPROTO_DETAILS=`_full_imgproto_details` 156FULL_HOST_DETAILS=`_full_platform_details` 157#FULL_MKFS_OPTIONS=`_scratch_mkfs_options` 158#FULL_MOUNT_OPTIONS=`_scratch_mount_options` 159 160cat <<EOF 161QEMU -- $QEMU 162QEMU_IMG -- $QEMU_IMG 163QEMU_IO -- $QEMU_IO 164QEMU_NBD -- $QEMU_NBD 165IMGFMT -- $FULL_IMGFMT_DETAILS 166IMGPROTO -- $FULL_IMGPROTO_DETAILS 167PLATFORM -- $FULL_HOST_DETAILS 168SOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER 169 170EOF 171#MKFS_OPTIONS -- $FULL_MKFS_OPTIONS 172#MOUNT_OPTIONS -- $FULL_MOUNT_OPTIONS 173 174seq="check" 175 176[ -n "$TESTS_REMAINING_LOG" ] && echo $list > $TESTS_REMAINING_LOG 177 178for seq in $list 179do 180 err=false 181 echo -n "$seq" 182 if [ -n "$TESTS_REMAINING_LOG" ] ; then 183 sed -e "s/$seq//" -e 's/ / /' -e 's/^ *//' $TESTS_REMAINING_LOG > $TESTS_REMAINING_LOG.tmp 184 mv $TESTS_REMAINING_LOG.tmp $TESTS_REMAINING_LOG 185 sync 186 fi 187 188 if $showme 189 then 190 echo 191 continue 192 elif [ -f expunged ] && $expunge && egrep "^$seq([ ]|\$)" expunged >/dev/null 193 then 194 echo " - expunged" 195 rm -f $seq.out.bad 196 echo "/^$seq\$/d" >>$tmp.expunged 197 elif [ ! -f $seq ] 198 then 199 echo " - no such test?" 200 echo "/^$seq\$/d" >>$tmp.expunged 201 else 202 # really going to try and run this one 203 # 204 rm -f $seq.out.bad 205 lasttime=`sed -n -e "/^$seq /s/.* //p" <check.time` 206 if [ "X$lasttime" != X ]; then 207 echo -n " ${lasttime}s ..." 208 else 209 echo -n " " # prettier output with timestamps. 210 fi 211 rm -f core $seq.notrun 212 213 # for hangcheck ... 214 echo "$seq" >/tmp/check.sts 215 216 start=`_wallclock` 217 $timestamp && echo -n " ["`date "+%T"`"]" 218 [ ! -x $seq ] && chmod u+x $seq # ensure we can run it 219 MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \ 220 ./$seq >$tmp.out 2>&1 221 sts=$? 222 $timestamp && _timestamp 223 stop=`_wallclock` 224 225 if [ -f core ] 226 then 227 echo -n " [dumped core]" 228 mv core $seq.core 229 err=true 230 fi 231 232 if [ -f $seq.notrun ] 233 then 234 $timestamp || echo -n " [not run] " 235 $timestamp && echo " [not run]" && echo -n " $seq -- " 236 cat $seq.notrun 237 notrun="$notrun $seq" 238 else 239 if [ $sts -ne 0 ] 240 then 241 echo -n " [failed, exit status $sts]" 242 err=true 243 fi 244 245 reference=$seq.out 246 if [ "$CACHEMODE" = "none" ]; then 247 [ -f $seq.out.nocache ] && reference=$seq.out.nocache 248 fi 249 250 if [ ! -f $reference ] 251 then 252 echo " - no qualified output" 253 err=true 254 else 255 if diff -w $reference $tmp.out >/dev/null 2>&1 256 then 257 echo "" 258 if $err 259 then 260 : 261 else 262 echo "$seq `expr $stop - $start`" >>$tmp.time 263 fi 264 else 265 echo " - output mismatch (see $seq.out.bad)" 266 mv $tmp.out $seq.out.bad 267 $diff -w $reference $seq.out.bad 268 err=true 269 fi 270 fi 271 fi 272 273 fi 274 275 # come here for each test, except when $showme is true 276 # 277 if $err 278 then 279 bad="$bad $seq" 280 n_bad=`expr $n_bad + 1` 281 quick=false 282 fi 283 [ -f $seq.notrun ] || try=`expr $try + 1` 284 285 seq="after_$seq" 286done 287 288interrupt=false 289status=`expr $n_bad` 290exit 291