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