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 164IMGFMT -- $FULL_IMGFMT_DETAILS 165IMGPROTO -- $FULL_IMGPROTO_DETAILS 166PLATFORM -- $FULL_HOST_DETAILS 167SOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER 168 169EOF 170#MKFS_OPTIONS -- $FULL_MKFS_OPTIONS 171#MOUNT_OPTIONS -- $FULL_MOUNT_OPTIONS 172 173seq="check" 174 175[ -n "$TESTS_REMAINING_LOG" ] && echo $list > $TESTS_REMAINING_LOG 176 177for seq in $list 178do 179 err=false 180 echo -n "$seq" 181 if [ -n "$TESTS_REMAINING_LOG" ] ; then 182 sed -e "s/$seq//" -e 's/ / /' -e 's/^ *//' $TESTS_REMAINING_LOG > $TESTS_REMAINING_LOG.tmp 183 mv $TESTS_REMAINING_LOG.tmp $TESTS_REMAINING_LOG 184 sync 185 fi 186 187 if $showme 188 then 189 echo 190 continue 191 elif [ -f expunged ] && $expunge && egrep "^$seq([ ]|\$)" expunged >/dev/null 192 then 193 echo " - expunged" 194 rm -f $seq.out.bad 195 echo "/^$seq\$/d" >>$tmp.expunged 196 elif [ ! -f $seq ] 197 then 198 echo " - no such test?" 199 echo "/^$seq\$/d" >>$tmp.expunged 200 else 201 # really going to try and run this one 202 # 203 rm -f $seq.out.bad 204 lasttime=`sed -n -e "/^$seq /s/.* //p" <check.time` 205 if [ "X$lasttime" != X ]; then 206 echo -n " ${lasttime}s ..." 207 else 208 echo -n " " # prettier output with timestamps. 209 fi 210 rm -f core $seq.notrun 211 212 # for hangcheck ... 213 echo "$seq" >/tmp/check.sts 214 215 start=`_wallclock` 216 $timestamp && echo -n " ["`date "+%T"`"]" 217 [ ! -x $seq ] && chmod u+x $seq # ensure we can run it 218 MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \ 219 ./$seq >$tmp.out 2>&1 220 sts=$? 221 $timestamp && _timestamp 222 stop=`_wallclock` 223 224 if [ -f core ] 225 then 226 echo -n " [dumped core]" 227 mv core $seq.core 228 err=true 229 fi 230 231 if [ -f $seq.notrun ] 232 then 233 $timestamp || echo -n " [not run] " 234 $timestamp && echo " [not run]" && echo -n " $seq -- " 235 cat $seq.notrun 236 notrun="$notrun $seq" 237 else 238 if [ $sts -ne 0 ] 239 then 240 echo -n " [failed, exit status $sts]" 241 err=true 242 fi 243 244 reference=$seq.out 245 if (echo $QEMU_IO_OPTIONS | grep -s -- '--nocache' > /dev/null); then 246 [ -f $seq.out.nocache ] && reference=$seq.out.nocache 247 fi 248 249 if [ ! -f $reference ] 250 then 251 echo " - no qualified output" 252 err=true 253 else 254 if diff -w $reference $tmp.out >/dev/null 2>&1 255 then 256 echo "" 257 if $err 258 then 259 : 260 else 261 echo "$seq `expr $stop - $start`" >>$tmp.time 262 fi 263 else 264 echo " - output mismatch (see $seq.out.bad)" 265 mv $tmp.out $seq.out.bad 266 $diff -w $reference $seq.out.bad 267 err=true 268 fi 269 fi 270 fi 271 272 fi 273 274 # come here for each test, except when $showme is true 275 # 276 if $err 277 then 278 bad="$bad $seq" 279 n_bad=`expr $n_bad + 1` 280 quick=false 281 fi 282 [ -f $seq.notrun ] || try=`expr $try + 1` 283 284 seq="after_$seq" 285done 286 287interrupt=false 288status=`expr $n_bad` 289exit 290