Statistics
| Branch: | Revision:

root / tests / qemu-iotests / check @ 5d12aa63

History | View | Annotate | Download (7.2 kB)

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

    
22
tmp=/tmp/$$
23
status=0
24
needwrap=true
25
try=0
26
n_bad=0
27
bad=""
28
notrun=""
29
interrupt=true
30

    
31
# by default don't output timestamps
32
timestamp=${TIMESTAMP:=false}
33

    
34
# generic initialization
35
iam=check
36

    
37
# we need common.config
38
if ! . ./common.config
39
then
40
    echo "$iam: failed to source common.config"
41
    exit 1
42
fi
43

    
44
# we need common.rc
45
if ! . ./common.rc
46
then
47
    echo "check: failed to source common.rc"
48
    exit 1
49
fi
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 }
89
END        { 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

    
132
trap "_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
#
138
rm -rf /tmp/check.pid
139
echo $$ >/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
#
146
rm -rf /tmp/check.sts
147
echo "preamble" >/tmp/check.sts
148

    
149
# don't leave old full output behind on a clean run
150
rm -f check.full
151

    
152
[ -f check.time ] || touch check.time
153

    
154
FULL_IMGFMT_DETAILS=`_full_imgfmt_details`
155
FULL_IMGPROTO_DETAILS=`_full_imgproto_details`
156
FULL_HOST_DETAILS=`_full_platform_details`
157
#FULL_MKFS_OPTIONS=`_scratch_mkfs_options`
158
#FULL_MOUNT_OPTIONS=`_scratch_mount_options`
159

    
160
cat <<EOF
161
QEMU          -- $QEMU
162
QEMU_IMG      -- $QEMU_IMG
163
QEMU_IO       -- $QEMU_IO
164
QEMU_NBD      -- $QEMU_NBD
165
IMGFMT        -- $FULL_IMGFMT_DETAILS
166
IMGPROTO      -- $FULL_IMGPROTO_DETAILS
167
PLATFORM      -- $FULL_HOST_DETAILS
168
SOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER
169

    
170
EOF
171
#MKFS_OPTIONS  -- $FULL_MKFS_OPTIONS
172
#MOUNT_OPTIONS -- $FULL_MOUNT_OPTIONS
173

    
174
seq="check"
175

    
176
[ -n "$TESTS_REMAINING_LOG" ] && echo $list > $TESTS_REMAINING_LOG
177

    
178
for seq in $list
179
do
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"
286
done
287

    
288
interrupt=false
289
status=`expr $n_bad`
290
exit