qemu-iotests: add ./check -cloop support
[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     -cow                test cow
140     -cloop              test cloop
141     -qcow               test qcow
142     -qcow2              test qcow2
143     -qed                test qed
144     -vdi                test vdi
145     -vpc                test vpc
146     -vhdx               test vhdx
147     -vmdk               test vmdk
148     -file               test file (default)
149     -rbd                test rbd
150     -sheepdog           test sheepdog
151     -nbd                test nbd
152     -ssh                test ssh
153     -nfs                test nfs
154     -xdiff              graphical mode diff
155     -nocache            use O_DIRECT on backing file
156     -misalign           misalign memory allocations
157     -n                  show me, do not run tests
158     -o options          -o options to pass to qemu-img create/convert
159     -T                  output timestamps
160     -r                  randomize test order
161     -c mode             cache mode
162
163 testlist options
164     -g group[,group...]        include tests from these groups
165     -x group[,group...]        exclude tests from these groups
166     NNN                        include test NNN
167     NNN-NNN                    include test range (eg. 012-021)
168 '
169             exit 0
170             ;;
171
172         -raw)
173             IMGFMT=raw
174             xpand=false
175             ;;
176
177         -cow)
178             IMGFMT=cow
179             xpand=false
180             ;;
181
182         -cloop)
183             IMGFMT=cloop
184             IMGFMT_GENERIC=false
185             xpand=false
186             ;;
187
188         -qcow)
189             IMGFMT=qcow
190             xpand=false
191             ;;
192
193         -qcow2)
194             IMGFMT=qcow2
195             xpand=false
196             ;;
197
198         -qed)
199             IMGFMT=qed
200             xpand=false
201             ;;
202
203         -vdi)
204             IMGFMT=vdi
205             xpand=false
206             ;;
207
208         -vmdk)
209             IMGFMT=vmdk
210             xpand=false
211             ;;
212
213         -vpc)
214             IMGFMT=vpc
215             xpand=false
216             ;;
217
218         -vhdx)
219             IMGFMT=vhdx
220             xpand=false
221             ;;
222
223         -file)
224             IMGPROTO=file
225             xpand=false
226             ;;
227
228         -rbd)
229             IMGPROTO=rbd
230             xpand=false
231             ;;
232
233         -sheepdog)
234             IMGPROTO=sheepdog
235             xpand=false
236             ;;
237
238         -nbd)
239             IMGPROTO=nbd
240             xpand=false
241             ;;
242
243         -ssh)
244             IMGPROTO=ssh
245             xpand=false
246             ;;
247
248         -nfs)
249             IMGPROTO=nfs
250             xpand=false
251             ;;
252
253         -nocache)
254             CACHEMODE="none"
255             CACHEMODE_IS_DEFAULT=false
256             xpand=false
257             ;;
258
259         -misalign)
260             QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --misalign"
261             xpand=false
262             ;;
263
264         -valgrind)
265             valgrind=true
266             xpand=false
267             ;;
268
269         -g)        # -g group ... pick from group file
270             group=true
271             xpand=false
272             ;;
273
274         -xdiff)        # graphical diff mode
275             xpand=false
276
277             if [ ! -z "$DISPLAY" ]
278             then
279                 which xdiff >/dev/null 2>&1 && diff=xdiff
280                 which gdiff >/dev/null 2>&1 && diff=gdiff
281                 which tkdiff >/dev/null 2>&1 && diff=tkdiff
282                 which xxdiff >/dev/null 2>&1 && diff=xxdiff
283             fi
284             ;;
285
286         -n)        # show me, don't do it
287             showme=true
288             xpand=false
289             ;;
290         -o)
291             imgopts=true
292             xpand=false
293             ;;
294         -c)
295             cachemode=true
296             xpand=false
297             ;;
298         -r)        # randomize test order
299             randomize=true
300             xpand=false
301             ;;
302
303         -T)        # turn on timestamp output
304             timestamp=true
305             xpand=false
306             ;;
307
308         -v)
309             verbose=true
310             xpand=false
311             ;;
312         -x)        # -x group ... exclude from group file
313             xgroup=true
314             xpand=false
315             ;;
316         '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
317             echo "No tests?"
318             status=1
319             exit $status
320             ;;
321
322         [0-9]*-[0-9]*)
323             eval `echo $r | sed -e 's/^/start=/' -e 's/-/ end=/'`
324             ;;
325
326         [0-9]*-)
327             eval `echo $r | sed -e 's/^/start=/' -e 's/-//'`
328             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/.* //'`
329             if [ -z "$end" ]
330             then
331                 echo "No tests in range \"$r\"?"
332                 status=1
333                 exit $status
334             fi
335             ;;
336
337         *)
338             start=$r
339             end=$r
340             ;;
341
342     esac
343
344     # get rid of leading 0s as can be interpreted as octal
345     start=`echo $start | sed 's/^0*//'`
346     end=`echo $end | sed 's/^0*//'`
347
348     if $xpand
349     then
350         have_test_arg=true
351         $AWK_PROG </dev/null '
352 BEGIN        { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
353         | while read id
354         do
355             if grep -s "^$id " group >/dev/null
356             then
357                 # in group file ... OK
358                 echo $id >>$tmp.list
359             else
360                 if [ -f expunged ] && $expunge && egrep "^$id([         ]|\$)" expunged >/dev/null
361                 then
362                     # expunged ... will be reported, but not run, later
363                     echo $id >>$tmp.list
364                 else
365                     # oops
366                     echo "$id - unknown test, ignored"
367                 fi
368             fi
369         done
370     fi
371
372 done
373
374 # Set qemu-io cache mode with $CACHEMODE we have
375 QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --cache $CACHEMODE"
376
377 # Set default options for qemu-img create -o if they were not specified
378 _set_default_imgopts
379
380 if [ -s $tmp.list ]
381 then
382     # found some valid test numbers ... this is good
383     :
384 else
385     if $have_test_arg
386     then
387         # had test numbers, but none in group file ... do nothing
388         touch $tmp.list
389     else
390         # no test numbers, do everything from group file
391         sed -n -e '/^[0-9][0-9][0-9]*/s/[         ].*//p' <group >$tmp.list
392     fi
393 fi
394
395 # should be sort -n, but this did not work for Linux when this
396 # was ported from IRIX
397 #
398 list=`sort $tmp.list`
399 rm -f $tmp.list $tmp.tmp $tmp.sed
400
401 if $randomize
402 then
403     list=`echo $list | awk -f randomize.awk`
404 fi
405
406 [ "$QEMU" = "" ] && _fatal "qemu not found"
407 [ "$QEMU_IMG" = "" ] && _fatal "qemu-img not found"
408 [ "$QEMU_IO" = "" ] && _fatal "qemu-io not found"
409
410 if [ "$IMGPROTO" = "nbd" ] ; then
411     [ "$QEMU_NBD" = "" ] && _fatal "qemu-nbd not found"
412 fi
413
414 if $valgrind; then
415     export REAL_QEMU_IO="$QEMU_IO_PROG"
416     export QEMU_IO_PROG=valgrind_qemu_io
417 fi