Upgrade to upstream v1.1.0.
[sdk/emulator/qemu.git] / tests / qemu-iotests / common
1 #!/bin/bash
2 #
3 # Copyright (C) 2009 Red Hat, Inc.
4 # Copyright (c) 2000-2005 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 # common procedures for QA scripts
20 #
21
22 _setenvironment()
23 {
24     MSGVERB="text:action"
25     export MSGVERB
26 }
27
28 here=`pwd`
29 rm -f $here/$iam.out
30 _setenvironment
31
32 check=${check-true}
33
34 diff="diff -u"
35 verbose=false
36 group=false
37 xgroup=false
38 imgopts=false
39 showme=false
40 sortme=false
41 expunge=true
42 have_test_arg=false
43 randomize=false
44 rm -f $tmp.list $tmp.tmp $tmp.sed
45
46 export IMGFMT=raw
47 export IMGPROTO=file
48 export IMGOPTS=""
49 export QEMU_IO_OPTIONS=""
50
51 for r
52 do
53
54     if $group
55     then
56         # arg after -g
57         group_list=`sed -n <group -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
58 s/ .*//p
59 }'`
60         if [ -z "$group_list" ]
61         then
62             echo "Group \"$r\" is empty or not defined?"
63             exit 1
64         fi
65         [ ! -s $tmp.list ] && touch $tmp.list
66         for t in $group_list
67         do
68             if grep -s "^$t\$" $tmp.list >/dev/null
69             then
70                 :
71             else
72                 echo "$t" >>$tmp.list
73             fi
74         done
75         group=false
76         continue
77
78     elif $xgroup
79     then
80         # arg after -x
81         [ ! -s $tmp.list ] && ls [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] >$tmp.list 2>/dev/null
82         group_list=`sed -n <group -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
83 s/ .*//p
84 }'`
85         if [ -z "$group_list" ]
86         then
87             echo "Group \"$r\" is empty or not defined?"
88             exit 1
89         fi
90         numsed=0
91         rm -f $tmp.sed
92         for t in $group_list
93         do
94             if [ $numsed -gt 100 ]
95             then
96                 sed -f $tmp.sed <$tmp.list >$tmp.tmp
97                 mv $tmp.tmp $tmp.list
98                 numsed=0
99                 rm -f $tmp.sed
100             fi
101             echo "/^$t\$/d" >>$tmp.sed
102             numsed=`expr $numsed + 1`
103         done
104         sed -f $tmp.sed <$tmp.list >$tmp.tmp
105         mv $tmp.tmp $tmp.list
106         xgroup=false
107         continue
108
109     elif $imgopts
110     then
111         IMGOPTS="$r"
112         imgopts=false
113         continue
114
115     fi
116
117     xpand=true
118     case "$r"
119     in
120
121         -\? | -h | --help)      # usage
122             echo "Usage: $0 [options] [testlist]"'
123
124 common options
125     -v                  verbose
126
127 check options
128     -raw                test raw (default)
129     -cow                test cow
130     -qcow               test qcow
131     -qcow2              test qcow2
132     -qed                test qed
133     -vdi                test vdi
134     -vpc                test vpc
135     -vmdk               test vmdk
136     -rbd                test rbd
137     -sheepdog           test sheepdog
138     -xdiff              graphical mode diff
139     -nocache            use O_DIRECT on backing file
140     -misalign           misalign memory allocations
141     -n                  show me, do not run tests
142     -o options          -o options to pass to qemu-img create/convert
143     -T                  output timestamps
144     -r                  randomize test order
145     
146 testlist options
147     -g group[,group...] include tests from these groups
148     -x group[,group...] exclude tests from these groups
149     NNN                 include test NNN
150     NNN-NNN             include test range (eg. 012-021)
151 '
152             exit 0
153             ;;
154
155         -raw)
156             IMGFMT=raw
157             xpand=false
158             ;;
159
160         -cow)
161             IMGFMT=cow
162             xpand=false
163             ;;
164
165         -qcow)
166             IMGFMT=qcow
167             xpand=false
168             ;;
169
170         -qcow2)
171             IMGFMT=qcow2
172             xpand=false
173             ;;
174
175         -qed)
176             IMGFMT=qed
177             xpand=false
178             ;;
179
180         -vdi)
181             IMGFMT=vdi
182             xpand=false
183             ;;
184
185         -vmdk)
186             IMGFMT=vmdk
187             xpand=false
188             ;;
189
190         -vpc)
191             IMGFMT=vpc
192             xpand=false
193             ;;
194
195         -rbd)
196             IMGPROTO=rbd
197             xpand=false
198             ;;
199
200         -sheepdog)
201             IMGPROTO=sheepdog
202             xpand=false
203             ;;
204
205         -nocache)
206             QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --nocache"
207             xpand=false
208             ;;
209
210         -misalign)
211             QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --misalign"
212             xpand=false
213             ;;
214
215         -g)     # -g group ... pick from group file
216             group=true
217             xpand=false
218             ;;
219
220         -xdiff) # graphical diff mode
221             xpand=false
222
223             if [ ! -z "$DISPLAY" ]
224             then
225                 which xdiff >/dev/null 2>&1 && diff=xdiff
226                 which gdiff >/dev/null 2>&1 && diff=gdiff
227                 which tkdiff >/dev/null 2>&1 && diff=tkdiff
228                 which xxdiff >/dev/null 2>&1 && diff=xxdiff
229             fi
230             ;;
231
232         -n)     # show me, don't do it
233             showme=true
234             xpand=false
235             ;;
236         -o)
237             imgopts=true
238             xpand=false
239             ;;
240         -r)     # randomize test order
241             randomize=true
242             xpand=false
243             ;;
244
245         -T)     # turn on timestamp output
246             timestamp=true
247             xpand=false
248             ;;
249
250         -v)
251             verbose=true
252             xpand=false
253             ;;
254         -x)     # -x group ... exclude from group file
255             xgroup=true
256             xpand=false
257             ;;
258         '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
259             echo "No tests?"
260             status=1
261             exit $status
262             ;;
263
264         [0-9]*-[0-9]*)
265             eval `echo $r | sed -e 's/^/start=/' -e 's/-/ end=/'`
266             ;;
267
268         [0-9]*-)
269             eval `echo $r | sed -e 's/^/start=/' -e 's/-//'`
270             end=`echo [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] | sed -e 's/\[0-9]//g' -e 's/  *$//' -e 's/.* //'`
271             if [ -z "$end" ]
272             then
273                 echo "No tests in range \"$r\"?"
274                 status=1
275                 exit $status
276             fi
277             ;;
278
279         *)
280             start=$r
281             end=$r
282             ;;
283
284     esac
285
286     # get rid of leading 0s as can be interpreted as octal
287     start=`echo $start | sed 's/^0*//'`
288     end=`echo $end | sed 's/^0*//'`
289
290     if $xpand
291     then
292         have_test_arg=true
293         $AWK_PROG </dev/null '
294 BEGIN   { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
295         | while read id
296         do
297             if grep -s "^$id " group >/dev/null
298             then
299                 # in group file ... OK
300                 echo $id >>$tmp.list
301             else
302                 if [ -f expunged ] && $expunge && egrep "^$id([         ]|\$)" expunged >/dev/null
303                 then
304                     # expunged ... will be reported, but not run, later
305                     echo $id >>$tmp.list
306                 else
307                     # oops
308                     echo "$id - unknown test, ignored"
309                 fi
310             fi
311         done
312     fi
313
314 done
315
316 # Set default options for qemu-img create -o if they were not specified
317 _set_default_imgopts
318
319 if [ -s $tmp.list ]
320 then
321     # found some valid test numbers ... this is good
322     :
323 else
324     if $have_test_arg
325     then
326         # had test numbers, but none in group file ... do nothing
327         touch $tmp.list
328     else
329         # no test numbers, do everything from group file
330         sed -n -e '/^[0-9][0-9][0-9]*/s/[       ].*//p' <group >$tmp.list
331     fi
332 fi
333
334 # should be sort -n, but this did not work for Linux when this
335 # was ported from IRIX
336 #
337 list=`sort $tmp.list`
338 rm -f $tmp.list $tmp.tmp $tmp.sed
339
340 if $randomize
341 then
342     list=`echo $list | awk -f randomize.awk`
343 fi
344
345 [ "$QEMU" = "" ] && _fatal "qemu not found"
346 [ "$QEMU_IMG" = "" ] && _fatal "qemu-img not found"
347 [ "$QEMU_IO" = "" ] && _fatal "qemu-img not found"