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