]> git.ipfire.org Git - thirdparty/mdadm.git/blame - test
tests: add a new test for rdev lifetime
[thirdparty/mdadm.git] / test
CommitLineData
23b7d3b9 1#!/bin/bash
5e7519fa
NB
2#
3# run test suite for mdadm
cbb8d34a 4mdadm=$PWD/mdadm
20d10b4b
ZL
5targetdir="/var/tmp"
6logdir="$targetdir"
7config=/tmp/mdadm.conf
59416da7 8testdir=$PWD/tests
6c33d34d 9devlist=
60381555 10
20d10b4b
ZL
11savelogs=0
12exitonerror=1
28520bf1
LG
13ctrl_c_error=0
14skipbroken=0
a7bfcc71 15loop=1
20d10b4b 16prefix='[0-9][0-9]'
98a92cff 17
20d10b4b 18# use loop devices by default if doesn't specify --dev
7d8a70bf 19DEVTYPE=loop
20d10b4b 20INTEGRITY=yes
7d8a70bf 21LVM_VOLGROUP=mdtest
04c1ca5f 22
9540cc24
N
23# make sure to test local mdmon, not system one
24export MDADM_NO_SYSTEMCTL=1
25
5e7519fa 26# assume md0, md1, md2 exist in /dev
662c349a
ZL
27md0=/dev/md0
28md1=/dev/md1
29md2=/dev/md2
1f48664b
NB
30mdp0=/dev/md_d0
31mdp1=/dev/md_d1
5e7519fa 32
20d10b4b
ZL
33die() {
34 echo -e "\n\tERROR: $* \n"
35 save_log fail
36 exit 2
37}
ed02d9cc 38
d5a221a5 39ctrl_c() {
4d5995c4 40 exitonerror=1
28520bf1 41 ctrl_c_error=1
4d5995c4
GE
42}
43
dab6685f
NB
44# mdadm always adds --quiet, and we want to see any unexpected messages
45mdadm() {
662c349a
ZL
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
20d10b4b
ZL
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
662c349a
ZL
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
dab6685f
NB
81}
82
4e5ce543 83do_test() {
662c349a
ZL
84 _script=$1
85 _basename=`basename $_script`
28520bf1
LG
86 _broken=0
87
662c349a
ZL
88 if [ -f "$_script" ]
89 then
28520bf1
LG
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
662c349a 101 rm -f $targetdir/stderr
662c349a
ZL
102 # this might have been reset: restore the default.
103 echo 2000 > /proc/sys/dev/raid/speed_limit_max
064bd3f5 104 do_clean
662c349a
ZL
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
20d10b4b
ZL
110 dmesg | grep -iq "error\|call trace\|segfault" &&
111 die "dmesg prints errors when testing $_basename!"
662c349a
ZL
112 echo "succeeded"
113 _fail=0
114 else
20d10b4b 115 save_log fail
662c349a 116 _fail=1
28520bf1
LG
117 if [ "$_broken" == "1" ]; then
118 echo " (KNOWN BROKEN TEST: $_broken_msg)"
119 fi
662c349a 120 fi
20d10b4b
ZL
121 [ "$savelogs" == "1" ] &&
122 mv -f $targetdir/log $logdir/$_basename.log
28520bf1
LG
123 [ "$ctrl_c_error" == "1" ] && exit 1
124 [ "$_fail" == "1" -a "$exitonerror" == "1" \
125 -a "$_broken" == "0" ] && exit 1
662c349a 126 fi
4e5ce543
JS
127}
128
129do_help() {
20d10b4b
ZL
130 cat <<-EOF
131 Usage: $0 [options]
25357919 132 Example for disk mode: ./test --dev=disk --disks=/dev/sda{2..15}
20d10b4b
ZL
133 Options:
134 --tests=test1,test2,... Comma separated list of tests to run
6c33d34d 135 --testdir= Specify testdir as tests|clustermd_tests
8403b202 136 --raidtype= raid0|linear|raid1|raid456|raid10|ddf|imsm
20d10b4b
ZL
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
a7bfcc71 142 --loop=N Run tests N times (0 to run forever)
28520bf1
LG
143 --skip-broken Skip tests that are known to be broken
144 --skip-always-broken Skip tests that are known to always fail
25357919
ZL
145 --dev=loop|lvm|ram|disk Use loop devices (default), LVM, RAM or disk
146 --disks= Provide a bunch of physical devices for test
20d10b4b
ZL
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
4e5ce543
JS
153}
154
155parse_args() {
6c33d34d
ZL
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
662c349a
ZL
179 for i in $*
180 do
181 case $i in
20d10b4b 182 [0-9][0-9] )
662c349a
ZL
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 ;;
6c33d34d
ZL
195 --testdir=* )
196 ;;
662c349a 197 --tests=* )
20d10b4b 198 TESTLIST=($(echo ${i##*=} | sed -e 's/,/ /g'))
662c349a 199 ;;
8403b202
ZL
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 )
05e0e58f 209 TESTLIST=($(ls $testdir | grep "[0-9][0-9]r1\|raid1" | grep -vi "r10\|raid10"))
8403b202
ZL
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 ;;
662c349a 230 --logdir=* )
20d10b4b 231 logdir="${i##*=}"
662c349a
ZL
232 ;;
233 --save-logs )
234 savelogs=1
235 ;;
236 --keep-going | --no-error )
237 exitonerror=0
238 ;;
a7bfcc71
LG
239 --loop=* )
240 loop="${i##*=}"
241 ;;
28520bf1
LG
242 --skip-broken )
243 skipbroken=all
244 ;;
245 --skip-always-broken )
246 skipbroken=always
247 ;;
662c349a
ZL
248 --disable-multipath )
249 unset MULTIPATH
250 ;;
251 --disable-integrity )
252 unset INTEGRITY
253 ;;
20d10b4b
ZL
254 --dev=* )
255 case ${i##*=} in
256 loop )
257 DEVTYPE=loop
258 ;;
259 lvm )
260 DEVTYPE=lvm
261 ;;
262 ram )
263 DEVTYPE=ram
264 ;;
25357919
ZL
265 disk )
266 DEVTYPE=disk
267 ;;
20d10b4b
ZL
268 * )
269 echo "Unknown argument: $i"
270 do_help
271 exit 1
272 ;;
273 esac
662c349a 274 ;;
25357919
ZL
275 --disks=* )
276 disks=(${disks[*]} ${i##*=})
277 ;;
662c349a
ZL
278 --volgroup=* )
279 LVM_VOLGROUP=`expr "x$i" : 'x[^=]*=\(.*\)'`
280 ;;
20d10b4b 281 --help | -h )
662c349a
ZL
282 do_help
283 exit 0
284 ;;
20d10b4b 285 * )
662c349a
ZL
286 echo " $0: Unknown argument: $i"
287 do_help
20d10b4b 288 exit 1
662c349a
ZL
289 ;;
290 esac
291 done
4e5ce543
JS
292}
293
20d10b4b 294main() {
20d10b4b 295 do_setup
572d7091 296
20d10b4b
ZL
297 echo "Testing on linux-$(uname -r) kernel"
298 [ "$savelogs" == "1" ] &&
299 echo "Saving logs to $logdir"
60381555 300
a7bfcc71
LG
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
28520bf1
LG
311 case $script in
312 *.broken) ;;
313 *)
314 do_test $script
315 esac
a7bfcc71
LG
316 done
317 fi
318
319 let loop=$loop-1
320 if [ "$loop" == "0" ]; then
321 break
322 fi
323 done
20d10b4b
ZL
324 exit 0
325}
326
327parse_args $@
328main