qemu-iotests: Support for bochs format
[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 valgrind=false
45 cachemode=false
46 rm -f $tmp.list $tmp.tmp $tmp.sed
47
48 export IMGFMT=raw
49 export IMGFMT_GENERIC=true
50 export IMGPROTO=file
51 export IMGOPTS=""
52 export CACHEMODE="writeback"
53 export QEMU_IO_OPTIONS=""
54 export CACHEMODE_IS_DEFAULT=true
55
56 for r
57 do
58
59     if $group
60     then
61         # arg after -g
62         group_list=`sed -n <group -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
63 s/ .*//p
64 }'`
65         if [ -z "$group_list" ]
66         then
67             echo "Group \"$r\" is empty or not defined?"
68             exit 1
69         fi
70         [ ! -s $tmp.list ] && touch $tmp.list
71         for t in $group_list
72         do
73             if grep -s "^$t\$" $tmp.list >/dev/null
74             then
75                 :
76             else
77                 echo "$t" >>$tmp.list
78             fi
79         done
80         group=false
81         continue
82
83     elif $xgroup
84     then
85         # arg after -x
86         [ ! -s $tmp.list ] && ls [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] >$tmp.list 2>/dev/null
87         group_list=`sed -n <group -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
88 s/ .*//p
89 }'`
90         if [ -z "$group_list" ]
91         then
92             echo "Group \"$r\" is empty or not defined?"
93             exit 1
94         fi
95         numsed=0
96         rm -f $tmp.sed
97         for t in $group_list
98         do
99             if [ $numsed -gt 100 ]
100             then
101                 sed -f $tmp.sed <$tmp.list >$tmp.tmp
102                 mv $tmp.tmp $tmp.list
103                 numsed=0
104                 rm -f $tmp.sed
105             fi
106             echo "/^$t\$/d" >>$tmp.sed
107             numsed=`expr $numsed + 1`
108         done
109         sed -f $tmp.sed <$tmp.list >$tmp.tmp
110         mv $tmp.tmp $tmp.list
111         xgroup=false
112         continue
113
114     elif $imgopts
115     then
116         IMGOPTS="$r"
117         imgopts=false
118         continue
119     elif $cachemode
120     then
121         CACHEMODE="$r"
122         CACHEMODE_IS_DEFAULT=false
123         cachemode=false
124         continue
125     fi
126
127     xpand=true
128     case "$r"
129     in
130
131         -\? | -h | --help)        # usage
132             echo "Usage: $0 [options] [testlist]"'
133
134 common options
135     -v                  verbose
136
137 check options
138     -raw                test raw (default)
139     -bochs              test bochs
140     -cow                test cow
141     -cloop              test cloop
142     -qcow               test qcow
143     -qcow2              test qcow2
144     -qed                test qed
145     -vdi                test vdi
146     -vpc                test vpc
147     -vhdx               test vhdx
148     -vmdk               test vmdk
149     -file               test file (default)
150     -rbd                test rbd
151     -sheepdog           test sheepdog
152     -nbd                test nbd
153     -ssh                test ssh
154     -nfs                test nfs
155     -xdiff              graphical mode diff
156     -nocache            use O_DIRECT on backing file
157     -misalign           misalign memory allocations
158     -n                  show me, do not run tests
159     -o options          -o options to pass to qemu-img create/convert
160     -T                  output timestamps
161     -r                  randomize test order
162     -c mode             cache mode
163
164 testlist options
165     -g group[,group...]        include tests from these groups
166     -x group[,group...]        exclude tests from these groups
167     NNN                        include test NNN
168     NNN-NNN                    include test range (eg. 012-021)
169 '
170             exit 0
171             ;;
172
173         -raw)
174             IMGFMT=raw
175             xpand=false
176             ;;
177
178         -bochs)
179             IMGFMT=bochs
180             IMGFMT_GENERIC=false
181             xpand=false
182             ;;
183
184         -cow)
185             IMGFMT=cow
186             xpand=false
187             ;;
188
189         -cloop)
190             IMGFMT=cloop
191             IMGFMT_GENERIC=false
192             xpand=false
193             ;;
194
195         -qcow)
196             IMGFMT=qcow
197             xpand=false
198             ;;
199
200         -qcow2)
201             IMGFMT=qcow2
202             xpand=false
203             ;;
204
205         -qed)
206             IMGFMT=qed
207             xpand=false
208             ;;
209
210         -vdi)
211             IMGFMT=vdi
212             xpand=false
213             ;;
214
215         -vmdk)
216             IMGFMT=vmdk
217             xpand=false
218             ;;
219
220         -vpc)
221             IMGFMT=vpc
222             xpand=false
223             ;;
224
225         -vhdx)
226             IMGFMT=vhdx
227             xpand=false
228             ;;
229
230         -file)
231             IMGPROTO=file
232             xpand=false
233             ;;
234
235         -rbd)
236             IMGPROTO=rbd
237             xpand=false
238             ;;
239
240         -sheepdog)
241             IMGPROTO=sheepdog
242             xpand=false
243             ;;
244
245         -nbd)
246             IMGPROTO=nbd
247             xpand=false
248             ;;
249
250         -ssh)
251             IMGPROTO=ssh
252             xpand=false
253             ;;
254
255         -nfs)
256             IMGPROTO=nfs
257             xpand=false
258             ;;
259
260         -nocache)
261             CACHEMODE="none"
262             CACHEMODE_IS_DEFAULT=false
263             xpand=false
264             ;;
265
266         -misalign)
267             QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --misalign"
268             xpand=false
269             ;;
270
271         -valgrind)
272             valgrind=true
273             xpand=false
274             ;;
275
276         -g)        # -g group ... pick from group file
277             group=true
278             xpand=false
279             ;;
280
281         -xdiff)        # graphical diff mode
282             xpand=false
283
284             if [ ! -z "$DISPLAY" ]
285             then
286                 which xdiff >/dev/null 2>&1 && diff=xdiff
287                 which gdiff >/dev/null 2>&1 && diff=gdiff
288                 which tkdiff >/dev/null 2>&1 && diff=tkdiff
289                 which xxdiff >/dev/null 2>&1 && diff=xxdiff
290             fi
291             ;;
292
293         -n)        # show me, don't do it
294             showme=true
295             xpand=false
296             ;;
297         -o)
298             imgopts=true
299             xpand=false
300             ;;
301         -c)
302             cachemode=true
303             xpand=false
304             ;;
305         -r)        # randomize test order
306             randomize=true
307             xpand=false
308             ;;
309
310         -T)        # turn on timestamp output
311             timestamp=true
312             xpand=false
313             ;;
314
315         -v)
316             verbose=true
317             xpand=false
318             ;;
319         -x)        # -x group ... exclude from group file
320             xgroup=true
321             xpand=false
322             ;;
323         '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
324             echo "No tests?"
325             status=1
326             exit $status
327             ;;
328
329         [0-9]*-[0-9]*)
330             eval `echo $r | sed -e 's/^/start=/' -e 's/-/ end=/'`
331             ;;
332
333         [0-9]*-)
334             eval `echo $r | sed -e 's/^/start=/' -e 's/-//'`
335             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/.* //'`
336             if [ -z "$end" ]
337             then
338                 echo "No tests in range \"$r\"?"
339                 status=1
340                 exit $status
341             fi
342             ;;
343
344         *)
345             start=$r
346             end=$r
347             ;;
348
349     esac
350
351     # get rid of leading 0s as can be interpreted as octal
352     start=`echo $start | sed 's/^0*//'`
353     end=`echo $end | sed 's/^0*//'`
354
355     if $xpand
356     then
357         have_test_arg=true
358         $AWK_PROG </dev/null '
359 BEGIN        { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
360         | while read id
361         do
362             if grep -s "^$id " group >/dev/null
363             then
364                 # in group file ... OK
365                 echo $id >>$tmp.list
366             else
367                 if [ -f expunged ] && $expunge && egrep "^$id([         ]|\$)" expunged >/dev/null
368                 then
369                     # expunged ... will be reported, but not run, later
370                     echo $id >>$tmp.list
371                 else
372                     # oops
373                     echo "$id - unknown test, ignored"
374                 fi
375             fi
376         done
377     fi
378
379 done
380
381 # Set qemu-io cache mode with $CACHEMODE we have
382 QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --cache $CACHEMODE"
383
384 # Set default options for qemu-img create -o if they were not specified
385 _set_default_imgopts
386
387 if [ -s $tmp.list ]
388 then
389     # found some valid test numbers ... this is good
390     :
391 else
392     if $have_test_arg
393     then
394         # had test numbers, but none in group file ... do nothing
395         touch $tmp.list
396     else
397         # no test numbers, do everything from group file
398         sed -n -e '/^[0-9][0-9][0-9]*/s/[         ].*//p' <group >$tmp.list
399     fi
400 fi
401
402 # should be sort -n, but this did not work for Linux when this
403 # was ported from IRIX
404 #
405 list=`sort $tmp.list`
406 rm -f $tmp.list $tmp.tmp $tmp.sed
407
408 if $randomize
409 then
410     list=`echo $list | awk -f randomize.awk`
411 fi
412
413 [ "$QEMU" = "" ] && _fatal "qemu not found"
414 [ "$QEMU_IMG" = "" ] && _fatal "qemu-img not found"
415 [ "$QEMU_IO" = "" ] && _fatal "qemu-io not found"
416
417 if [ "$IMGPROTO" = "nbd" ] ; then
418     [ "$QEMU_NBD" = "" ] && _fatal "qemu-nbd not found"
419 fi
420
421 if $valgrind; then
422     export REAL_QEMU_IO="$QEMU_IO_PROG"
423     export QEMU_IO_PROG=valgrind_qemu_io
424 fi