]>
Commit | Line | Data |
---|---|---|
11a82d14 | 1 | #!/usr/bin/env bash |
6bf19c94 CH |
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 | |
e8c212d6 | 16 | # along with this program. If not, see <http://www.gnu.org/licenses/>. |
6bf19c94 CH |
17 | # |
18 | # | |
19 | # Control script for QA | |
20 | # | |
21 | ||
6bf19c94 CH |
22 | status=0 |
23 | needwrap=true | |
24 | try=0 | |
25 | n_bad=0 | |
26 | bad="" | |
27 | notrun="" | |
57ed557f | 28 | casenotrun="" |
6bf19c94 | 29 | interrupt=true |
70ff5b07 | 30 | makecheck=false |
6bf19c94 | 31 | |
e8f8624d HR |
32 | _init_error() |
33 | { | |
4e670492 | 34 | echo "check: $1" >&2 |
e8f8624d HR |
35 | exit 1 |
36 | } | |
37 | ||
38 | if [ -L "$0" ] | |
39 | then | |
40 | # called from the build tree | |
41 | source_iotests=$(dirname "$(readlink "$0")") | |
42 | if [ -z "$source_iotests" ] | |
43 | then | |
44 | _init_error "failed to obtain source tree name from check symlink" | |
45 | fi | |
46 | source_iotests=$(cd "$source_iotests"; pwd) || _init_error "failed to enter source tree" | |
47 | build_iotests=$PWD | |
48 | else | |
49 | # called from the source tree | |
50 | source_iotests=$PWD | |
51 | # this may be an in-tree build (note that in the following code we may not | |
52 | # assume that it truly is and have to test whether the build results | |
53 | # actually exist) | |
54 | build_iotests=$PWD | |
55 | fi | |
56 | ||
57 | build_root="$build_iotests/../.." | |
58 | ||
7fed1a49 HR |
59 | # we need common.env |
60 | if ! . "$build_iotests/common.env" | |
61 | then | |
62 | _init_error "failed to source common.env (make sure the qemu-iotests are run from tests/qemu-iotests in the build tree)" | |
63 | fi | |
64 | ||
6bf19c94 | 65 | # we need common.config |
e8f8624d | 66 | if ! . "$source_iotests/common.config" |
6bf19c94 | 67 | then |
e8f8624d | 68 | _init_error "failed to source common.config" |
6bf19c94 CH |
69 | fi |
70 | ||
09d653e6 PB |
71 | _full_imgfmt_details() |
72 | { | |
73 | if [ -n "$IMGOPTS" ]; then | |
74 | echo "$IMGFMT ($IMGOPTS)" | |
75 | else | |
76 | echo "$IMGFMT" | |
77 | fi | |
78 | } | |
79 | ||
80 | _full_platform_details() | |
81 | { | |
4a9e751f MZ |
82 | os=$(uname -s) |
83 | host=$(hostname -s) | |
84 | kernel=$(uname -r) | |
85 | platform=$(uname -m) | |
09d653e6 PB |
86 | echo "$os/$platform $host $kernel" |
87 | } | |
88 | ||
70ff5b07 AB |
89 | _full_env_details() |
90 | { | |
91 | cat <<EOF | |
92 | QEMU -- "$QEMU_PROG" $QEMU_OPTIONS | |
93 | QEMU_IMG -- "$QEMU_IMG_PROG" $QEMU_IMG_OPTIONS | |
94 | QEMU_IO -- "$QEMU_IO_PROG" $QEMU_IO_OPTIONS | |
95 | QEMU_NBD -- "$QEMU_NBD_PROG" $QEMU_NBD_OPTIONS | |
96 | IMGFMT -- $FULL_IMGFMT_DETAILS | |
97 | IMGPROTO -- $IMGPROTO | |
98 | PLATFORM -- $FULL_HOST_DETAILS | |
99 | TEST_DIR -- $TEST_DIR | |
c7df3f19 | 100 | SOCK_DIR -- $SOCK_DIR |
70ff5b07 AB |
101 | SOCKET_SCM_HELPER -- $SOCKET_SCM_HELPER |
102 | ||
103 | EOF | |
104 | } | |
105 | ||
09d653e6 PB |
106 | # $1 = prog to look for |
107 | set_prog_path() | |
108 | { | |
4a9e751f | 109 | p=$(command -v $1 2> /dev/null) |
09d653e6 | 110 | if [ -n "$p" -a -x "$p" ]; then |
63ca8406 | 111 | type -p "$p" |
09d653e6 PB |
112 | else |
113 | return 1 | |
114 | fi | |
115 | } | |
116 | ||
117 | if [ -z "$TEST_DIR" ]; then | |
e8d81a61 | 118 | TEST_DIR=$PWD/scratch |
09d653e6 | 119 | fi |
c7df3f19 | 120 | mkdir -p "$TEST_DIR" || _init_error 'Failed to create TEST_DIR' |
09d653e6 | 121 | |
c7df3f19 HR |
122 | tmp_sock_dir=false |
123 | if [ -z "$SOCK_DIR" ]; then | |
124 | SOCK_DIR=$(mktemp -d) | |
125 | tmp_sock_dir=true | |
09d653e6 | 126 | fi |
c7df3f19 | 127 | mkdir -p "$SOCK_DIR" || _init_error 'Failed to create SOCK_DIR' |
09d653e6 PB |
128 | |
129 | diff="diff -u" | |
130 | verbose=false | |
131 | debug=false | |
132 | group=false | |
133 | xgroup=false | |
134 | imgopts=false | |
135 | showme=false | |
136 | sortme=false | |
137 | expunge=true | |
138 | have_test_arg=false | |
139 | cachemode=false | |
7156ca48 | 140 | aiomode=false |
09d653e6 PB |
141 | |
142 | tmp="${TEST_DIR}"/$$ | |
143 | rm -f $tmp.list $tmp.tmp $tmp.sed | |
144 | ||
145 | export IMGFMT=raw | |
146 | export IMGFMT_GENERIC=true | |
147 | export IMGPROTO=file | |
148 | export IMGOPTS="" | |
149 | export CACHEMODE="writeback" | |
7156ca48 | 150 | export AIOMODE="threads" |
09d653e6 PB |
151 | export QEMU_IO_OPTIONS="" |
152 | export QEMU_IO_OPTIONS_NO_FMT="" | |
153 | export CACHEMODE_IS_DEFAULT=true | |
09d653e6 PB |
154 | export VALGRIND_QEMU= |
155 | export IMGKEYSECRET= | |
156 | export IMGOPTSSYNTAX=false | |
157 | ||
8803714b EB |
158 | # Save current tty settings, since an aborting qemu call may leave things |
159 | # screwed up | |
160 | STTY_RESTORE= | |
161 | if test -t 0; then | |
162 | STTY_RESTORE=$(stty -g) | |
163 | fi | |
164 | ||
09d653e6 PB |
165 | for r |
166 | do | |
167 | ||
168 | if $group | |
169 | then | |
170 | # arg after -g | |
4a9e751f | 171 | group_list=$(sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{ |
09d653e6 | 172 | s/ .*//p |
4a9e751f | 173 | }') |
09d653e6 PB |
174 | if [ -z "$group_list" ] |
175 | then | |
176 | echo "Group \"$r\" is empty or not defined?" | |
177 | exit 1 | |
178 | fi | |
179 | [ ! -s $tmp.list ] && touch $tmp.list | |
180 | for t in $group_list | |
181 | do | |
182 | if grep -s "^$t\$" $tmp.list >/dev/null | |
183 | then | |
184 | : | |
185 | else | |
186 | echo "$t" >>$tmp.list | |
187 | fi | |
188 | done | |
189 | group=false | |
190 | continue | |
191 | ||
192 | elif $xgroup | |
193 | then | |
194 | # arg after -x | |
195 | # Populate $tmp.list with all tests | |
196 | awk '/^[0-9]{3,}/ {print $1}' "${source_iotests}/group" > $tmp.list 2>/dev/null | |
4a9e751f | 197 | group_list=$(sed -n <"$source_iotests/group" -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{ |
09d653e6 | 198 | s/ .*//p |
4a9e751f | 199 | }') |
09d653e6 PB |
200 | if [ -z "$group_list" ] |
201 | then | |
202 | echo "Group \"$r\" is empty or not defined?" | |
203 | exit 1 | |
204 | fi | |
205 | numsed=0 | |
206 | rm -f $tmp.sed | |
207 | for t in $group_list | |
208 | do | |
209 | if [ $numsed -gt 100 ] | |
210 | then | |
211 | sed -f $tmp.sed <$tmp.list >$tmp.tmp | |
212 | mv $tmp.tmp $tmp.list | |
213 | numsed=0 | |
214 | rm -f $tmp.sed | |
215 | fi | |
216 | echo "/^$t\$/d" >>$tmp.sed | |
4a9e751f | 217 | numsed=$(expr $numsed + 1) |
09d653e6 PB |
218 | done |
219 | sed -f $tmp.sed <$tmp.list >$tmp.tmp | |
220 | mv $tmp.tmp $tmp.list | |
221 | xgroup=false | |
222 | continue | |
223 | ||
224 | elif $imgopts | |
225 | then | |
226 | IMGOPTS="$r" | |
227 | imgopts=false | |
228 | continue | |
229 | elif $cachemode | |
230 | then | |
231 | CACHEMODE="$r" | |
232 | CACHEMODE_IS_DEFAULT=false | |
233 | cachemode=false | |
234 | continue | |
7156ca48 AM |
235 | elif $aiomode |
236 | then | |
237 | AIOMODE="$r" | |
238 | aiomode=false | |
239 | continue | |
09d653e6 PB |
240 | fi |
241 | ||
242 | xpand=true | |
243 | case "$r" | |
244 | in | |
245 | ||
246 | -\? | -h | --help) # usage | |
247 | echo "Usage: $0 [options] [testlist]"' | |
248 | ||
249 | common options | |
250 | -v verbose | |
251 | -d debug | |
252 | ||
253 | image format options | |
254 | -raw test raw (default) | |
255 | -bochs test bochs | |
256 | -cloop test cloop | |
257 | -parallels test parallels | |
258 | -qcow test qcow | |
259 | -qcow2 test qcow2 | |
260 | -qed test qed | |
261 | -vdi test vdi | |
262 | -vpc test vpc | |
263 | -vhdx test vhdx | |
264 | -vmdk test vmdk | |
265 | -luks test luks | |
76f1cf0a | 266 | -dmg test dmg |
09d653e6 PB |
267 | |
268 | image protocol options | |
269 | -file test file (default) | |
270 | -rbd test rbd | |
271 | -sheepdog test sheepdog | |
272 | -nbd test nbd | |
273 | -ssh test ssh | |
274 | -nfs test nfs | |
275 | -vxhs test vxhs | |
276 | ||
277 | other options | |
278 | -xdiff graphical mode diff | |
279 | -nocache use O_DIRECT on backing file | |
280 | -misalign misalign memory allocations | |
281 | -n show me, do not run tests | |
282 | -o options -o options to pass to qemu-img create/convert | |
09d653e6 | 283 | -c mode cache mode |
7156ca48 | 284 | -i mode AIO mode |
70ff5b07 | 285 | -makecheck pretty print output for make check |
09d653e6 PB |
286 | |
287 | testlist options | |
288 | -g group[,group...] include tests from these groups | |
289 | -x group[,group...] exclude tests from these groups | |
290 | NNN include test NNN | |
291 | NNN-NNN include test range (eg. 012-021) | |
292 | ' | |
293 | exit 0 | |
294 | ;; | |
295 | ||
296 | -raw) | |
297 | IMGFMT=raw | |
298 | xpand=false | |
299 | ;; | |
300 | ||
301 | -bochs) | |
302 | IMGFMT=bochs | |
303 | IMGFMT_GENERIC=false | |
304 | xpand=false | |
305 | ;; | |
306 | ||
307 | -cloop) | |
308 | IMGFMT=cloop | |
309 | IMGFMT_GENERIC=false | |
310 | xpand=false | |
311 | ;; | |
312 | ||
313 | -parallels) | |
314 | IMGFMT=parallels | |
09d653e6 PB |
315 | xpand=false |
316 | ;; | |
317 | ||
318 | -qcow) | |
319 | IMGFMT=qcow | |
320 | xpand=false | |
321 | ;; | |
322 | ||
323 | -qcow2) | |
324 | IMGFMT=qcow2 | |
325 | xpand=false | |
326 | ;; | |
327 | ||
328 | -luks) | |
329 | IMGOPTSSYNTAX=true | |
330 | IMGFMT=luks | |
331 | IMGKEYSECRET=123456 | |
332 | xpand=false | |
333 | ;; | |
334 | ||
76f1cf0a YCL |
335 | -dmg) |
336 | IMGFMT=dmg | |
337 | IMGFMT_GENERIC=false | |
338 | xpand=false | |
339 | ;; | |
340 | ||
09d653e6 PB |
341 | -qed) |
342 | IMGFMT=qed | |
343 | xpand=false | |
344 | ;; | |
345 | ||
346 | -vdi) | |
347 | IMGFMT=vdi | |
348 | xpand=false | |
349 | ;; | |
350 | ||
351 | -vmdk) | |
352 | IMGFMT=vmdk | |
353 | xpand=false | |
354 | ;; | |
355 | ||
356 | -vpc) | |
357 | IMGFMT=vpc | |
358 | xpand=false | |
359 | ;; | |
360 | ||
361 | -vhdx) | |
362 | IMGFMT=vhdx | |
363 | xpand=false | |
364 | ;; | |
365 | ||
366 | -file) | |
367 | IMGPROTO=file | |
368 | xpand=false | |
369 | ;; | |
370 | ||
371 | -rbd) | |
372 | IMGPROTO=rbd | |
373 | xpand=false | |
374 | ;; | |
375 | ||
376 | -sheepdog) | |
377 | IMGPROTO=sheepdog | |
378 | xpand=false | |
379 | ;; | |
380 | ||
381 | -nbd) | |
382 | IMGPROTO=nbd | |
383 | xpand=false | |
384 | ;; | |
385 | ||
386 | -vxhs) | |
387 | IMGPROTO=vxhs | |
388 | xpand=false | |
389 | ;; | |
390 | ||
391 | -ssh) | |
392 | IMGPROTO=ssh | |
393 | xpand=false | |
394 | ;; | |
395 | ||
396 | -nfs) | |
397 | IMGPROTO=nfs | |
398 | xpand=false | |
399 | ;; | |
400 | ||
401 | -nocache) | |
402 | CACHEMODE="none" | |
403 | CACHEMODE_IS_DEFAULT=false | |
404 | xpand=false | |
405 | ;; | |
406 | ||
407 | -misalign) | |
408 | QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --misalign" | |
409 | xpand=false | |
410 | ;; | |
411 | ||
412 | -valgrind) | |
413 | VALGRIND_QEMU='y' | |
414 | xpand=false | |
415 | ;; | |
416 | ||
417 | -g) # -g group ... pick from group file | |
418 | group=true | |
419 | xpand=false | |
420 | ;; | |
421 | ||
422 | -xdiff) # graphical diff mode | |
423 | xpand=false | |
424 | ||
425 | if [ ! -z "$DISPLAY" ] | |
426 | then | |
427 | command -v xdiff >/dev/null 2>&1 && diff=xdiff | |
428 | command -v gdiff >/dev/null 2>&1 && diff=gdiff | |
429 | command -v tkdiff >/dev/null 2>&1 && diff=tkdiff | |
430 | command -v xxdiff >/dev/null 2>&1 && diff=xxdiff | |
431 | fi | |
432 | ;; | |
70ff5b07 AB |
433 | -makecheck) # makecheck friendly output |
434 | makecheck=true | |
435 | xpand=false | |
436 | ;; | |
09d653e6 PB |
437 | -n) # show me, don't do it |
438 | showme=true | |
439 | xpand=false | |
440 | ;; | |
441 | -o) | |
442 | imgopts=true | |
443 | xpand=false | |
444 | ;; | |
445 | -c) | |
446 | cachemode=true | |
447 | xpand=false | |
448 | ;; | |
7156ca48 AM |
449 | -i) |
450 | aiomode=true | |
451 | xpand=false | |
452 | ;; | |
70ff5b07 | 453 | -T) # deprecated timestamp option |
09d653e6 PB |
454 | xpand=false |
455 | ;; | |
09d653e6 PB |
456 | -v) |
457 | verbose=true | |
458 | xpand=false | |
459 | ;; | |
460 | -d) | |
461 | debug=true | |
462 | xpand=false | |
463 | ;; | |
464 | -x) # -x group ... exclude from group file | |
465 | xgroup=true | |
466 | xpand=false | |
467 | ;; | |
468 | '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]') | |
469 | echo "No tests?" | |
470 | status=1 | |
471 | exit $status | |
472 | ;; | |
473 | ||
474 | [0-9]*-[0-9]*) | |
4a9e751f | 475 | eval $(echo $r | sed -e 's/^/start=/' -e 's/-/ end=/') |
09d653e6 PB |
476 | ;; |
477 | ||
478 | [0-9]*-) | |
4a9e751f MZ |
479 | eval $(echo $r | sed -e 's/^/start=/' -e 's/-//') |
480 | 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/.* //') | |
09d653e6 PB |
481 | if [ -z "$end" ] |
482 | then | |
483 | echo "No tests in range \"$r\"?" | |
484 | status=1 | |
485 | exit $status | |
486 | fi | |
487 | ;; | |
488 | ||
489 | *) | |
490 | start=$r | |
491 | end=$r | |
492 | ;; | |
493 | ||
494 | esac | |
495 | ||
496 | # get rid of leading 0s as can be interpreted as octal | |
4a9e751f MZ |
497 | start=$(echo $start | sed 's/^0*//') |
498 | end=$(echo $end | sed 's/^0*//') | |
09d653e6 PB |
499 | |
500 | if $xpand | |
501 | then | |
502 | have_test_arg=true | |
503 | awk </dev/null ' | |
504 | BEGIN { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \ | |
505 | | while read id | |
506 | do | |
bf75d752 | 507 | if grep -s "^$id\( \|\$\)" "$source_iotests/group" >/dev/null |
09d653e6 PB |
508 | then |
509 | # in group file ... OK | |
510 | echo $id >>$tmp.list | |
511 | else | |
512 | if [ -f expunged ] && $expunge && egrep "^$id([ ]|\$)" expunged >/dev/null | |
513 | then | |
514 | # expunged ... will be reported, but not run, later | |
515 | echo $id >>$tmp.list | |
516 | else | |
517 | # oops | |
518 | if [ "$start" == "$end" -a "$id" == "$end" ] | |
519 | then | |
520 | echo "$id - unknown test" | |
521 | exit 1 | |
522 | else | |
523 | echo "$id - unknown test, ignored" | |
524 | fi | |
525 | fi | |
526 | fi | |
527 | done || exit 1 | |
528 | fi | |
529 | ||
530 | done | |
531 | ||
532 | # Set qemu-io cache mode with $CACHEMODE we have | |
533 | QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --cache $CACHEMODE" | |
7156ca48 AM |
534 | # Set qemu-io aio mode with $AIOMODE we have |
535 | QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS --aio $AIOMODE" | |
09d653e6 PB |
536 | |
537 | QEMU_IO_OPTIONS_NO_FMT="$QEMU_IO_OPTIONS" | |
538 | if [ "$IMGOPTSSYNTAX" != "true" ]; then | |
539 | QEMU_IO_OPTIONS="$QEMU_IO_OPTIONS -f $IMGFMT" | |
540 | fi | |
541 | ||
542 | # Set default options for qemu-img create -o if they were not specified | |
543 | if [ "$IMGFMT" == "qcow2" ] && ! (echo "$IMGOPTS" | grep "compat=" > /dev/null); then | |
544 | IMGOPTS=$(_optstr_add "$IMGOPTS" "compat=1.1") | |
545 | fi | |
546 | if [ "$IMGFMT" == "luks" ] && ! (echo "$IMGOPTS" | grep "iter-time=" > /dev/null); then | |
547 | IMGOPTS=$(_optstr_add "$IMGOPTS" "iter-time=10") | |
548 | fi | |
549 | ||
550 | if [ -z "$SAMPLE_IMG_DIR" ]; then | |
551 | SAMPLE_IMG_DIR="$source_iotests/sample_images" | |
552 | fi | |
553 | ||
554 | export TEST_DIR | |
c7df3f19 | 555 | export SOCK_DIR |
09d653e6 PB |
556 | export SAMPLE_IMG_DIR |
557 | ||
558 | if [ -s $tmp.list ] | |
559 | then | |
560 | # found some valid test numbers ... this is good | |
561 | : | |
562 | else | |
563 | if $have_test_arg | |
564 | then | |
565 | # had test numbers, but none in group file ... do nothing | |
566 | touch $tmp.list | |
567 | else | |
568 | # no test numbers, do everything from group file | |
bf75d752 | 569 | sed -n -e '/^[0-9][0-9][0-9]*/s/^\([0-9]*\).*/\1/p' <"$source_iotests/group" >$tmp.list |
09d653e6 PB |
570 | fi |
571 | fi | |
572 | ||
573 | # should be sort -n, but this did not work for Linux when this | |
574 | # was ported from IRIX | |
575 | # | |
4a9e751f | 576 | list=$(sort $tmp.list) |
09d653e6 PB |
577 | rm -f $tmp.list $tmp.tmp $tmp.sed |
578 | ||
579 | if [ -z "$QEMU_PROG" ] | |
580 | then | |
581 | if [ -x "$build_iotests/qemu" ]; then | |
582 | export QEMU_PROG="$build_iotests/qemu" | |
96914159 LD |
583 | elif [ -x "$build_root/${qemu_arch}-softmmu/qemu-system-${qemu_arch}" ]; then |
584 | export QEMU_PROG="$build_root/${qemu_arch}-softmmu/qemu-system-${qemu_arch}" | |
09d653e6 PB |
585 | else |
586 | pushd "$build_root" > /dev/null | |
587 | for binary in *-softmmu/qemu-system-* | |
588 | do | |
589 | if [ -x "$binary" ] | |
590 | then | |
591 | export QEMU_PROG="$build_root/$binary" | |
592 | break | |
593 | fi | |
594 | done | |
595 | popd > /dev/null | |
596 | [ "$QEMU_PROG" = "" ] && _init_error "qemu not found" | |
597 | fi | |
598 | fi | |
63ca8406 | 599 | export QEMU_PROG="$(type -p "$QEMU_PROG")" |
09d653e6 | 600 | |
4a715461 TH |
601 | case "$QEMU_PROG" in |
602 | *qemu-system-arm|*qemu-system-aarch64) | |
75ab574b | 603 | export QEMU_OPTIONS="-nodefaults -display none -machine virt -accel qtest" |
4a715461 TH |
604 | ;; |
605 | *qemu-system-tricore) | |
75ab574b | 606 | export QEMU_OPTIONS="-nodefaults -display none -machine tricore_testboard -accel qtest" |
4a715461 TH |
607 | ;; |
608 | *) | |
75ab574b | 609 | export QEMU_OPTIONS="-nodefaults -display none -accel qtest" |
4a715461 TH |
610 | ;; |
611 | esac | |
612 | ||
09d653e6 PB |
613 | if [ -z "$QEMU_IMG_PROG" ]; then |
614 | if [ -x "$build_iotests/qemu-img" ]; then | |
615 | export QEMU_IMG_PROG="$build_iotests/qemu-img" | |
616 | elif [ -x "$build_root/qemu-img" ]; then | |
617 | export QEMU_IMG_PROG="$build_root/qemu-img" | |
618 | else | |
619 | _init_error "qemu-img not found" | |
620 | fi | |
621 | fi | |
63ca8406 | 622 | export QEMU_IMG_PROG="$(type -p "$QEMU_IMG_PROG")" |
09d653e6 PB |
623 | |
624 | if [ -z "$QEMU_IO_PROG" ]; then | |
625 | if [ -x "$build_iotests/qemu-io" ]; then | |
626 | export QEMU_IO_PROG="$build_iotests/qemu-io" | |
627 | elif [ -x "$build_root/qemu-io" ]; then | |
628 | export QEMU_IO_PROG="$build_root/qemu-io" | |
629 | else | |
630 | _init_error "qemu-io not found" | |
631 | fi | |
632 | fi | |
63ca8406 | 633 | export QEMU_IO_PROG="$(type -p "$QEMU_IO_PROG")" |
09d653e6 PB |
634 | |
635 | if [ -z $QEMU_NBD_PROG ]; then | |
636 | if [ -x "$build_iotests/qemu-nbd" ]; then | |
637 | export QEMU_NBD_PROG="$build_iotests/qemu-nbd" | |
638 | elif [ -x "$build_root/qemu-nbd" ]; then | |
639 | export QEMU_NBD_PROG="$build_root/qemu-nbd" | |
640 | else | |
641 | _init_error "qemu-nbd not found" | |
642 | fi | |
643 | fi | |
63ca8406 | 644 | export QEMU_NBD_PROG="$(type -p "$QEMU_NBD_PROG")" |
09d653e6 PB |
645 | |
646 | if [ -z "$QEMU_VXHS_PROG" ]; then | |
4a9e751f | 647 | export QEMU_VXHS_PROG="$(set_prog_path qnio_server)" |
09d653e6 PB |
648 | fi |
649 | ||
650 | if [ -x "$build_iotests/socket_scm_helper" ] | |
651 | then | |
652 | export SOCKET_SCM_HELPER="$build_iotests/socket_scm_helper" | |
653 | fi | |
654 | ||
c69719fc KW |
655 | python_usable=false |
656 | if $PYTHON -c 'import sys; sys.exit(0 if sys.version_info >= (3,6) else 1)' | |
657 | then | |
cd205828 TH |
658 | # Our python framework also requires virtio-blk |
659 | if "$QEMU_PROG" -M none -device help | grep -q virtio-blk >/dev/null 2>&1 | |
660 | then | |
661 | python_usable=true | |
662 | else | |
663 | python_unusable_because="Missing virtio-blk in QEMU binary" | |
664 | fi | |
665 | else | |
666 | python_unusable_because="Unsupported Python version" | |
c69719fc KW |
667 | fi |
668 | ||
09d653e6 PB |
669 | default_machine=$($QEMU_PROG -machine help | sed -n '/(default)/ s/ .*//p') |
670 | default_alias_machine=$($QEMU_PROG -machine help | \ | |
671 | sed -n "/(alias of $default_machine)/ { s/ .*//p; q; }") | |
672 | if [[ "$default_alias_machine" ]]; then | |
673 | default_machine="$default_alias_machine" | |
674 | fi | |
675 | ||
676 | export QEMU_DEFAULT_MACHINE="$default_machine" | |
89004368 | 677 | |
36bd4228 DB |
678 | TIMESTAMP_FILE=check.time-$IMGPROTO-$IMGFMT |
679 | ||
6bf19c94 CH |
680 | _wallclock() |
681 | { | |
9ee4b6f8 | 682 | date "+%H %M %S" | awk '{ print $1*3600 + $2*60 + $3 }' |
6bf19c94 CH |
683 | } |
684 | ||
6bf19c94 CH |
685 | _wrapup() |
686 | { | |
6bf19c94 CH |
687 | if $showme |
688 | then | |
79e40ab1 | 689 | : |
6bf19c94 CH |
690 | elif $needwrap |
691 | then | |
36bd4228 | 692 | if [ -f $TIMESTAMP_FILE -a -f $tmp.time ] |
79e40ab1 | 693 | then |
36bd4228 | 694 | cat $TIMESTAMP_FILE $tmp.time \ |
9ee4b6f8 | 695 | | awk ' |
79e40ab1 KW |
696 | { t[$1] = $2 } |
697 | END { if (NR > 0) { | |
698 | for (i in t) print i " " t[i] | |
699 | } | |
700 | }' \ | |
701 | | sort -n >$tmp.out | |
36bd4228 | 702 | mv $tmp.out $TIMESTAMP_FILE |
79e40ab1 KW |
703 | fi |
704 | ||
705 | if [ -f $tmp.expunged ] | |
706 | then | |
4a9e751f MZ |
707 | notrun=$(wc -l <$tmp.expunged | sed -e 's/ *//g') |
708 | try=$(expr $try - $notrun) | |
709 | list=$(echo "$list" | sed -f $tmp.expunged) | |
79e40ab1 KW |
710 | fi |
711 | ||
712 | echo "" >>check.log | |
713 | date >>check.log | |
714 | echo $list | fmt | sed -e 's/^/ /' >>check.log | |
715 | $interrupt && echo "Interrupted!" >>check.log | |
716 | ||
717 | if [ ! -z "$notrun" ] | |
718 | then | |
719 | echo "Not run:$notrun" | |
720 | echo "Not run:$notrun" >>check.log | |
721 | fi | |
57ed557f AS |
722 | if [ ! -z "$casenotrun" ] |
723 | then | |
724 | echo "Some cases not run in:$casenotrun" | |
725 | echo "Some cases not run in:$casenotrun" >>check.log | |
726 | fi | |
6bf19c94 | 727 | if [ ! -z "$n_bad" -a $n_bad != 0 ] |
79e40ab1 KW |
728 | then |
729 | echo "Failures:$bad" | |
4ee5f4be | 730 | echo "Failed $n_bad of $try iotests" |
79e40ab1 | 731 | echo "Failures:$bad" | fmt >>check.log |
4ee5f4be | 732 | echo "Failed $n_bad of $try iotests" >>check.log |
79e40ab1 | 733 | else |
4ee5f4be TH |
734 | echo "Passed all $try iotests" |
735 | echo "Passed all $try iotests" >>check.log | |
79e40ab1 KW |
736 | fi |
737 | needwrap=false | |
6bf19c94 CH |
738 | fi |
739 | ||
8803714b EB |
740 | if test -n "$STTY_RESTORE"; then |
741 | stty $STTY_RESTORE | |
742 | fi | |
0145b4e1 SS |
743 | rm -f "${TEST_DIR}"/*.out "${TEST_DIR}"/*.err "${TEST_DIR}"/*.time |
744 | rm -f "${TEST_DIR}"/check.pid "${TEST_DIR}"/check.sts | |
6bf19c94 | 745 | rm -f $tmp.* |
c7df3f19 HR |
746 | |
747 | if $tmp_sock_dir | |
748 | then | |
749 | rm -rf "$SOCK_DIR" | |
750 | fi | |
6bf19c94 CH |
751 | } |
752 | ||
753 | trap "_wrapup; exit \$status" 0 1 2 3 15 | |
754 | ||
70ff5b07 AB |
755 | # Report the test start and results. For makecheck we want to pretty |
756 | # print the whole report at the end of the execution. | |
757 | # args: $seq, $starttime, $lasttime | |
758 | _report_test_start() | |
759 | { | |
760 | if ! $makecheck; then | |
761 | if [ -n "$3" ]; then | |
762 | local lasttime=" (last: $3s)" | |
763 | fi | |
764 | printf "%-8s %-10s [%s] %4s%-14s\r" "$1" "..." "$2" "..." "$lasttime" | |
765 | fi | |
766 | } | |
767 | # args:$seq $status $starttime $lasttime $thistime $details | |
768 | _report_test_result() | |
769 | { | |
770 | local status lasttime thistime | |
771 | if $makecheck; then | |
772 | if [ -n "$2" ] && [ "$2" != "pass" ]; then | |
773 | status=" [$2]" | |
774 | fi | |
775 | printf " TEST iotest-$IMGFMT: %s%s\n" "$1" "$status" | |
776 | return | |
777 | fi | |
778 | ||
779 | if [ -n "$4" ]; then | |
780 | lasttime=" (last: $4s)" | |
781 | fi | |
782 | if [ -n "$5" ]; then | |
783 | thistime=" $5s" | |
784 | fi | |
785 | case "$2" in | |
786 | "pass") status=$(printf "\e[32m%-10s\e[0m" "$2") ;; | |
787 | "fail") status=$(printf "\e[1m\e[31m%-10s\e[0m" "$2") ;; | |
788 | "not run") status=$(printf "\e[33m%-10s\e[0m" "$2") ;; | |
789 | *) status=$(printf "%-10s" "$2") ;; | |
790 | esac | |
791 | ||
792 | printf "%-8s %s [%s] [%s] %4s%-14s %s\n" "$1" "$status" "$3" "$(date '+%T')" "$thistime" "$lasttime" "$6" | |
793 | } | |
794 | ||
36bd4228 | 795 | [ -f $TIMESTAMP_FILE ] || touch $TIMESTAMP_FILE |
6bf19c94 | 796 | |
4a9e751f MZ |
797 | FULL_IMGFMT_DETAILS=$(_full_imgfmt_details) |
798 | FULL_HOST_DETAILS=$(_full_platform_details) | |
6bf19c94 | 799 | |
70ff5b07 AB |
800 | if ! $makecheck; then |
801 | _full_env_details | |
802 | fi | |
6bf19c94 CH |
803 | |
804 | seq="check" | |
805 | ||
806 | [ -n "$TESTS_REMAINING_LOG" ] && echo $list > $TESTS_REMAINING_LOG | |
807 | ||
808 | for seq in $list | |
809 | do | |
70ff5b07 AB |
810 | err=false # error flag |
811 | printdiff=false # show diff to reference output? | |
812 | status="" # test result summary | |
813 | results="" # test result details | |
835d689d | 814 | thistime="" # time the test took |
70ff5b07 | 815 | |
6bf19c94 CH |
816 | if [ -n "$TESTS_REMAINING_LOG" ] ; then |
817 | sed -e "s/$seq//" -e 's/ / /' -e 's/^ *//' $TESTS_REMAINING_LOG > $TESTS_REMAINING_LOG.tmp | |
818 | mv $TESTS_REMAINING_LOG.tmp $TESTS_REMAINING_LOG | |
819 | sync | |
820 | fi | |
821 | ||
70ff5b07 AB |
822 | lasttime=$(sed -n -e "/^$seq /s/.* //p" <$TIMESTAMP_FILE) |
823 | starttime=$(date "+%T") | |
824 | _report_test_start $seq $starttime $lasttime | |
825 | ||
6bf19c94 CH |
826 | if $showme |
827 | then | |
70ff5b07 | 828 | status="not run" |
79e40ab1 | 829 | elif [ -f expunged ] && $expunge && egrep "^$seq([ ]|\$)" expunged >/dev/null |
6bf19c94 | 830 | then |
70ff5b07 AB |
831 | status="not run" |
832 | results="expunged" | |
79e40ab1 KW |
833 | rm -f $seq.out.bad |
834 | echo "/^$seq\$/d" >>$tmp.expunged | |
e8f8624d | 835 | elif [ ! -f "$source_iotests/$seq" ] |
6bf19c94 | 836 | then |
70ff5b07 AB |
837 | status="not run" |
838 | results="no such test?" | |
79e40ab1 | 839 | echo "/^$seq\$/d" >>$tmp.expunged |
6bf19c94 | 840 | else |
79e40ab1 KW |
841 | # really going to try and run this one |
842 | # | |
843 | rm -f $seq.out.bad | |
79e40ab1 | 844 | rm -f core $seq.notrun |
57ed557f | 845 | rm -f $seq.casenotrun |
79e40ab1 | 846 | |
4a9e751f | 847 | start=$(_wallclock) |
ea81ca9d | 848 | |
351aa270 | 849 | if [ "$(head -n 1 "$source_iotests/$seq")" == "#!/usr/bin/env python3" ]; then |
c69719fc KW |
850 | if $python_usable; then |
851 | run_command="$PYTHON $seq" | |
852 | else | |
853 | run_command="false" | |
cd205828 | 854 | echo "$python_unusable_because" > $seq.notrun |
c69719fc | 855 | fi |
ea81ca9d HR |
856 | else |
857 | run_command="./$seq" | |
858 | fi | |
e8f8624d | 859 | export OUTPUT_DIR=$PWD |
aa4f592a FZ |
860 | if $debug; then |
861 | (cd "$source_iotests"; | |
862 | MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \ | |
863 | $run_command -d 2>&1 | tee $tmp.out) | |
864 | else | |
865 | (cd "$source_iotests"; | |
866 | MALLOC_PERTURB_=${MALLOC_PERTURB_:-$(($RANDOM % 255 + 1))} \ | |
867 | $run_command >$tmp.out 2>&1) | |
868 | fi | |
79e40ab1 | 869 | sts=$? |
4a9e751f | 870 | stop=$(_wallclock) |
79e40ab1 KW |
871 | |
872 | if [ -f core ] | |
873 | then | |
79e40ab1 | 874 | mv core $seq.core |
70ff5b07 AB |
875 | status="fail" |
876 | results="[dumped core] $seq.core" | |
79e40ab1 KW |
877 | err=true |
878 | fi | |
879 | ||
880 | if [ -f $seq.notrun ] | |
881 | then | |
70ff5b07 AB |
882 | # overwrites timestamp output |
883 | status="not run" | |
884 | results="$(cat $seq.notrun)" | |
79e40ab1 KW |
885 | else |
886 | if [ $sts -ne 0 ] | |
887 | then | |
70ff5b07 AB |
888 | status="fail" |
889 | results=$(printf %s "[failed, exit status $sts]") | |
79e40ab1 KW |
890 | err=true |
891 | fi | |
8f94b077 | 892 | |
e8f8624d | 893 | reference="$source_iotests/$seq.out" |
e166b414 BT |
894 | reference_machine="$source_iotests/$seq.$QEMU_DEFAULT_MACHINE.out" |
895 | if [ -f "$reference_machine" ]; then | |
896 | reference="$reference_machine" | |
897 | fi | |
898 | ||
217a0683 SH |
899 | reference_format="$source_iotests/$seq.out.$IMGFMT" |
900 | if [ -f "$reference_format" ]; then | |
901 | reference="$reference_format" | |
902 | fi | |
903 | ||
3baa8449 | 904 | if [ "$CACHEMODE" = "none" ]; then |
e8f8624d | 905 | [ -f "$source_iotests/$seq.out.nocache" ] && reference="$source_iotests/$seq.out.nocache" |
8f94b077 KW |
906 | fi |
907 | ||
e8f8624d | 908 | if [ ! -f "$reference" ] |
79e40ab1 | 909 | then |
70ff5b07 | 910 | status="fail" |
d44abcc0 | 911 | results="no qualified output" |
79e40ab1 KW |
912 | err=true |
913 | else | |
e8f8624d | 914 | if diff -w "$reference" $tmp.out >/dev/null 2>&1 |
79e40ab1 | 915 | then |
70ff5b07 AB |
916 | if ! $err; then |
917 | status="pass" | |
918 | thistime=$(expr $stop - $start) | |
919 | echo "$seq $thistime" >>$tmp.time | |
79e40ab1 KW |
920 | fi |
921 | else | |
79e40ab1 | 922 | mv $tmp.out $seq.out.bad |
70ff5b07 AB |
923 | status="fail" |
924 | results="output mismatch (see $seq.out.bad)" | |
925 | printdiff=true | |
79e40ab1 KW |
926 | err=true |
927 | fi | |
928 | fi | |
929 | fi | |
57ed557f AS |
930 | if [ -f $seq.casenotrun ] |
931 | then | |
932 | cat $seq.casenotrun | |
933 | casenotrun="$casenotrun $seq" | |
934 | fi | |
6bf19c94 CH |
935 | fi |
936 | ||
937 | # come here for each test, except when $showme is true | |
938 | # | |
70ff5b07 AB |
939 | _report_test_result $seq "$status" "$starttime" "$lasttime" "$thistime" "$results" |
940 | case "$status" in | |
941 | "pass") | |
942 | try=$(expr $try + 1) | |
943 | ;; | |
944 | "fail") | |
945 | try=$(expr $try + 1) | |
946 | if $makecheck; then | |
947 | _full_env_details | |
948 | fi | |
949 | if $printdiff; then | |
950 | $diff -w "$reference" "$PWD"/$seq.out.bad | |
951 | fi | |
952 | bad="$bad $seq" | |
953 | n_bad=$(expr $n_bad + 1) | |
954 | quick=false | |
955 | ;; | |
956 | "not run") | |
957 | notrun="$notrun $seq" | |
958 | ;; | |
959 | esac | |
79e40ab1 | 960 | |
6bf19c94 CH |
961 | seq="after_$seq" |
962 | done | |
963 | ||
964 | interrupt=false | |
4a9e751f | 965 | status=$(expr $n_bad) |
6bf19c94 | 966 | exit |