root / tests / qemu-iotests / common.filter @ 5d12aa63
History | View | Annotate | Download (4.3 kB)
1 |
#!/bin/bash |
---|---|
2 |
# |
3 |
# Copyright (C) 2009 Red Hat, Inc. |
4 |
# Copyright (c) 2000-2001 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 |
# standard filters |
20 |
# |
21 |
|
22 |
# Checks that given_value is in range of correct_value +/- tolerance. |
23 |
# Tolerance can be an absolute value or a percentage of the correct value |
24 |
# (see examples with tolerances below). |
25 |
# Outputs suitable message to stdout if it's not in range. |
26 |
# |
27 |
# A verbose option, -v, may be used as the LAST argument |
28 |
# |
29 |
# e.g. |
30 |
# foo: 0.0298 = 0.03 +/- 5% |
31 |
# _within_tolerance "foo" 0.0298 0.03 5% |
32 |
# |
33 |
# foo: 0.0298 = 0.03 +/- 0.01 |
34 |
# _within_tolerance "foo" 0.0298 0.03 0.01 |
35 |
# |
36 |
# foo: 0.0298 = 0.03 -0.01 +0.002 |
37 |
# _within_tolerance "foo" 0.0298 0.03 0.01 0.002 |
38 |
# |
39 |
# foo: verbose output of 0.0298 = 0.03 +/- 5% |
40 |
# _within_tolerance "foo" 0.0298 0.03 5% -v |
41 |
_within_tolerance() |
42 |
{ |
43 |
_name=$1 |
44 |
_given_val=$2 |
45 |
_correct_val=$3 |
46 |
_mintol=$4 |
47 |
_maxtol=$_mintol |
48 |
_verbose=0 |
49 |
_debug=false |
50 |
|
51 |
# maxtol arg is optional |
52 |
# verbose arg is optional |
53 |
if [ $# -ge 5 ] |
54 |
then |
55 |
if [ "$5" = "-v" ] |
56 |
then |
57 |
_verbose=1 |
58 |
else |
59 |
_maxtol=$5 |
60 |
fi |
61 |
fi |
62 |
if [ $# -ge 6 ] |
63 |
then |
64 |
[ "$6" = "-v" ] && _verbose=1 |
65 |
fi |
66 |
|
67 |
# find min with or without % |
68 |
_mintolerance=`echo $_mintol | sed -e 's/%//'` |
69 |
if [ $_mintol = $_mintolerance ] |
70 |
then |
71 |
_min=`echo "scale=5; $_correct_val-$_mintolerance" | bc` |
72 |
else |
73 |
_min=`echo "scale=5; $_correct_val-$_mintolerance*0.01*$_correct_val" | bc` |
74 |
fi |
75 |
|
76 |
# find max with or without % |
77 |
_maxtolerance=`echo $_maxtol | sed -e 's/%//'` |
78 |
if [ $_maxtol = $_maxtolerance ] |
79 |
then |
80 |
_max=`echo "scale=5; $_correct_val+$_maxtolerance" | bc` |
81 |
else |
82 |
_max=`echo "scale=5; $_correct_val+$_maxtolerance*0.01*$_correct_val" | bc` |
83 |
fi |
84 |
|
85 |
$_debug && echo "min = $_min" |
86 |
$_debug && echo "max = $_max" |
87 |
|
88 |
cat <<EOF >$tmp.bc.1 |
89 |
scale=5; |
90 |
if ($_min <= $_given_val) 1; |
91 |
if ($_min > $_given_val) 0; |
92 |
EOF |
93 |
|
94 |
cat <<EOF >$tmp.bc.2 |
95 |
scale=5; |
96 |
if ($_given_val <= $_max) 1; |
97 |
if ($_given_val > $_max) 0; |
98 |
EOF |
99 |
|
100 |
_above_min=`bc <$tmp.bc.1` |
101 |
_below_max=`bc <$tmp.bc.2` |
102 |
|
103 |
rm -f $tmp.bc.[12] |
104 |
|
105 |
_in_range=`expr $_above_min \& $_below_max` |
106 |
|
107 |
# fix up min, max precision for output |
108 |
# can vary for 5.3, 6.2 |
109 |
_min=`echo $_min | sed -e 's/0*$//'` # get rid of trailling zeroes |
110 |
_max=`echo $_max | sed -e 's/0*$//'` # get rid of trailling zeroes |
111 |
|
112 |
if [ $_in_range -eq 1 ] |
113 |
then |
114 |
[ $_verbose -eq 1 ] && echo $_name is in range |
115 |
return 0 |
116 |
else |
117 |
[ $_verbose -eq 1 ] && echo $_name has value of $_given_val |
118 |
[ $_verbose -eq 1 ] && echo $_name is NOT in range $_min .. $_max |
119 |
return 1 |
120 |
fi |
121 |
} |
122 |
|
123 |
# ctime(3) dates |
124 |
# |
125 |
_filter_date() |
126 |
{ |
127 |
sed \ |
128 |
-e 's/[A-Z][a-z][a-z] [A-z][a-z][a-z] *[0-9][0-9]* [0-9][0-9]:[0-9][0-9]:[0-9][0-9] [0-9][0-9][0-9][0-9]$/DATE/' |
129 |
} |
130 |
|
131 |
# replace occurrences of the actual TEST_DIR value with TEST_DIR |
132 |
_filter_testdir() |
133 |
{ |
134 |
sed -e "s#$TEST_DIR#TEST_DIR#g" |
135 |
} |
136 |
|
137 |
# replace occurrences of the actual IMGFMT value with IMGFMT |
138 |
_filter_imgfmt() |
139 |
{ |
140 |
sed -e "s#$IMGFMT#IMGFMT#g" |
141 |
} |
142 |
|
143 |
# Removes \r from messages |
144 |
_filter_win32() |
145 |
{ |
146 |
sed -e 's/\r//g' |
147 |
} |
148 |
|
149 |
# sanitize qemu-io output |
150 |
_filter_qemu_io() |
151 |
{ |
152 |
_filter_win32 | sed -e "s/[0-9]* ops\; [0-9/:. sec]* ([0-9/.inf]* [EPTGMKiBbytes]*\/sec and [0-9/.inf]* ops\/sec)/X ops\; XX:XX:XX.X (XXX YYY\/sec and XXX ops\/sec)/" \ |
153 |
-e "s/qemu-io> //g" |
154 |
} |
155 |
|
156 |
# replace occurrences of QEMU_PROG with "qemu" |
157 |
_filter_qemu() |
158 |
{ |
159 |
sed -e "s#\\(^\\|(qemu) \\)$(basename $QEMU_PROG):#\1QEMU_PROG:#" \ |
160 |
-e 's#^QEMU [0-9]\+\.[0-9]\+\.[0-9]\+ monitor#QEMU X.Y.Z monitor#' \ |
161 |
-e $'s#\r##' # QEMU monitor uses \r\n line endings |
162 |
} |
163 |
|
164 |
# replace problematic QMP output like timestamps |
165 |
_filter_qmp() |
166 |
{ |
167 |
_filter_win32 | \ |
168 |
sed -e 's#\("\(micro\)\?seconds": \)[0-9]\+#\1 TIMESTAMP#g' \ |
169 |
-e 's#^{"QMP":.*}$#QMP_VERSION#' |
170 |
} |
171 |
|
172 |
# make sure this script returns success |
173 |
/bin/true |