]> git.ipfire.org Git - thirdparty/mdadm.git/blob - test
imsm: move expand verification code into new function
[thirdparty/mdadm.git] / test
1 #!/bin/bash
2 #
3 # run test suite for mdadm
4 mdadm=$PWD/mdadm
5 targetdir="/var/tmp"
6 logdir="$targetdir"
7 config=/tmp/mdadm.conf
8 testdir=$PWD/tests
9 devlist=
10
11 savelogs=0
12 exitonerror=1
13 ctrl_c_error=0
14 skipbroken=0
15 loop=1
16 prefix='[0-9][0-9]'
17
18 # use loop devices by default if doesn't specify --dev
19 DEVTYPE=loop
20 INTEGRITY=yes
21 LVM_VOLGROUP=mdtest
22
23 # make sure to test local mdmon, not system one
24 export MDADM_NO_SYSTEMCTL=1
25
26 # assume md0, md1, md2 exist in /dev
27 md0=/dev/md0
28 md1=/dev/md1
29 md2=/dev/md2
30 mdp0=/dev/md_d0
31 mdp1=/dev/md_d1
32
33 die() {
34 echo -e "\n\tERROR: $* \n"
35 save_log fail
36 exit 2
37 }
38
39 ctrl_c() {
40 exitonerror=1
41 ctrl_c_error=1
42 }
43
44 # mdadm always adds --quiet, and we want to see any unexpected messages
45 mdadm() {
46 rm -f $targetdir/stderr
47 case $* in
48 *-S* )
49 udevadm settle
50 p=`cat /proc/sys/dev/raid/speed_limit_max`
51 echo 20000 > /proc/sys/dev/raid/speed_limit_max
52 ;;
53 esac
54 case $* in
55 *-C* | *--create* | *-B* | *--build* )
56 # clear superblock every time once creating or
57 # building arrays, because it's always creating
58 # and building array many times in a test case.
59 for args in $*
60 do
61 [[ $args =~ "/dev/" ]] && {
62 [[ $args =~ "md" ]] ||
63 $mdadm --zero $args > /dev/null
64 }
65 done
66 $mdadm 2> $targetdir/stderr --quiet "$@" --auto=yes
67 ;;
68 * )
69 $mdadm 2> $targetdir/stderr --quiet "$@"
70 ;;
71 esac
72 rv=$?
73 case $* in
74 *-S* )
75 udevadm settle
76 echo $p > /proc/sys/dev/raid/speed_limit_max
77 ;;
78 esac
79 cat >&2 $targetdir/stderr
80 return $rv
81 }
82
83 do_test() {
84 _script=$1
85 _basename=`basename $_script`
86 _broken=0
87
88 if [ -f "$_script" ]
89 then
90 if [ -f "${_script}.broken" ]; then
91 _broken=1
92 _broken_msg=$(head -n1 "${_script}.broken" | tr -d '\n')
93 if [ "$skipbroken" == "all" ]; then
94 return
95 elif [ "$skipbroken" == "always" ] &&
96 [[ "$_broken_msg" == *always* ]]; then
97 return
98 fi
99 fi
100
101 rm -f $targetdir/stderr
102 # this might have been reset: restore the default.
103 echo 2000 > /proc/sys/dev/raid/speed_limit_max
104 do_clean
105 # source script in a subshell, so it has access to our
106 # namespace, but cannot change it.
107 echo -ne "$_script... "
108 if ( set -ex ; . $_script ) &> $targetdir/log
109 then
110 dmesg | grep -iq "error\|call trace\|segfault" &&
111 die "dmesg prints errors when testing $_basename!"
112 echo "succeeded"
113 _fail=0
114 else
115 save_log fail
116 _fail=1
117 if [ "$_broken" == "1" ]; then
118 echo " (KNOWN BROKEN TEST: $_broken_msg)"
119 fi
120 fi
121 [ "$savelogs" == "1" ] &&
122 mv -f $targetdir/log $logdir/$_basename.log
123 [ "$ctrl_c_error" == "1" ] && exit 1
124 [ "$_fail" == "1" -a "$exitonerror" == "1" \
125 -a "$_broken" == "0" ] && exit 1
126 fi
127 }
128
129 do_help() {
130 cat <<-EOF
131 Usage: $0 [options]
132 Example for disk mode: ./test --dev=disk --disks=/dev/sda{2..15}
133 Options:
134 --tests=test1,test2,... Comma separated list of tests to run
135 --testdir= Specify testdir as tests|clustermd_tests
136 --raidtype= raid0|linear|raid1|raid456|raid10|ddf|imsm
137 --disable-multipath Disable any tests involving multipath
138 --disable-integrity Disable slow tests of RAID[56] consistency
139 --logdir=directory Directory to save all logfiles in
140 --save-logs Usually use with --logdir together
141 --keep-going | --no-error Don't stop on error, ie. run all tests
142 --loop=N Run tests N times (0 to run forever)
143 --skip-broken Skip tests that are known to be broken
144 --skip-always-broken Skip tests that are known to always fail
145 --dev=loop|lvm|ram|disk Use loop devices (default), LVM, RAM or disk
146 --disks= Provide a bunch of physical devices for test
147 --volgroup=name LVM volume group for LVM test
148 setup Setup test environment and exit
149 cleanup Cleanup test environment
150 prefix Run tests with <prefix>
151 --help | -h Print this usage
152 EOF
153 }
154
155 parse_args() {
156 for i in $*
157 do
158 case $i in
159 --testdir=* )
160 case ${i##*=} in
161 tests )
162 testdir=tests
163 ;;
164 clustermd_tests )
165 testdir=clustermd_tests
166 CLUSTER_CONF="$PWD/$testdir/cluster_conf"
167 ;;
168 * )
169 echo "Unknown argument: $i"
170 do_help
171 exit 1
172 ;;
173 esac
174 ;;
175 esac
176 done
177 [ -z "$testdir" ] && testdir=tests
178 . $testdir/func.sh
179 for i in $*
180 do
181 case $i in
182 [0-9][0-9] )
183 prefix=$i
184 ;;
185 setup )
186 echo "mdadm test environment setup"
187 do_setup
188 trap 0
189 exit 0
190 ;;
191 cleanup )
192 cleanup
193 exit 0
194 ;;
195 --testdir=* )
196 ;;
197 --tests=* )
198 TESTLIST=($(echo ${i##*=} | sed -e 's/,/ /g'))
199 ;;
200 --raidtype=* )
201 case ${i##*=} in
202 raid0 )
203 TESTLIST=($(ls $testdir | grep "[0-9][0-9]r0\|raid0"))
204 ;;
205 linear )
206 TESTLIST=($(ls $testdir | grep "linear"))
207 ;;
208 raid1 )
209 TESTLIST=($(ls $testdir | grep "[0-9][0-9]r1\|raid1" | grep -vi "r10\|raid10"))
210 ;;
211 raid456 )
212 TESTLIST=($(ls $testdir | grep "[0-9][0-9]r[4-6]\|raid[4-6]"))
213 ;;
214 raid10 )
215 TESTLIST=($(ls $testdir | grep "[0-9][0-9]r10\|raid10"))
216 ;;
217 ddf )
218 TESTLIST=($(ls $testdir | grep "[0-9][0-9]ddf"))
219 ;;
220 imsm )
221 TESTLIST=($(ls $testdir | grep "[0-9][0-9]imsm"))
222 ;;
223 * )
224 echo "Unknown argument: $i"
225 do_help
226 exit 1
227 ;;
228 esac
229 ;;
230 --logdir=* )
231 logdir="${i##*=}"
232 ;;
233 --save-logs )
234 savelogs=1
235 ;;
236 --keep-going | --no-error )
237 exitonerror=0
238 ;;
239 --loop=* )
240 loop="${i##*=}"
241 ;;
242 --skip-broken )
243 skipbroken=all
244 ;;
245 --skip-always-broken )
246 skipbroken=always
247 ;;
248 --disable-multipath )
249 unset MULTIPATH
250 ;;
251 --disable-integrity )
252 unset INTEGRITY
253 ;;
254 --dev=* )
255 case ${i##*=} in
256 loop )
257 DEVTYPE=loop
258 ;;
259 lvm )
260 DEVTYPE=lvm
261 ;;
262 ram )
263 DEVTYPE=ram
264 ;;
265 disk )
266 DEVTYPE=disk
267 ;;
268 * )
269 echo "Unknown argument: $i"
270 do_help
271 exit 1
272 ;;
273 esac
274 ;;
275 --disks=* )
276 disks=(${disks[*]} ${i##*=})
277 ;;
278 --volgroup=* )
279 LVM_VOLGROUP=`expr "x$i" : 'x[^=]*=\(.*\)'`
280 ;;
281 --help | -h )
282 do_help
283 exit 0
284 ;;
285 * )
286 echo " $0: Unknown argument: $i"
287 do_help
288 exit 1
289 ;;
290 esac
291 done
292 }
293
294 main() {
295 do_setup
296
297 echo "Testing on linux-$(uname -r) kernel"
298 [ "$savelogs" == "1" ] &&
299 echo "Saving logs to $logdir"
300
301 while true; do
302 if [ "x$TESTLIST" != "x" ]
303 then
304 for script in ${TESTLIST[@]}
305 do
306 do_test $testdir/$script
307 done
308 else
309 for script in $testdir/$prefix $testdir/$prefix*[^~]
310 do
311 case $script in
312 *.broken) ;;
313 *)
314 do_test $script
315 esac
316 done
317 fi
318
319 let loop=$loop-1
320 if [ "$loop" == "0" ]; then
321 break
322 fi
323 done
324 exit 0
325 }
326
327 parse_args $@
328 main