]>
Commit | Line | Data |
---|---|---|
23b7d3b9 | 1 | #!/bin/bash |
5e7519fa NB |
2 | # |
3 | # run test suite for mdadm | |
cbb8d34a ZL |
4 | |
5 | . tests/func.sh | |
6 | ||
7 | mdadm=$PWD/mdadm | |
60381555 | 8 | testdir="tests" |
20d10b4b ZL |
9 | targetdir="/var/tmp" |
10 | logdir="$targetdir" | |
11 | config=/tmp/mdadm.conf | |
60381555 | 12 | |
20d10b4b ZL |
13 | savelogs=0 |
14 | exitonerror=1 | |
15 | prefix='[0-9][0-9]' | |
98a92cff | 16 | |
20d10b4b | 17 | # use loop devices by default if doesn't specify --dev |
7d8a70bf | 18 | DEVTYPE=loop |
20d10b4b | 19 | INTEGRITY=yes |
7d8a70bf | 20 | LVM_VOLGROUP=mdtest |
04c1ca5f | 21 | |
9540cc24 N |
22 | # make sure to test local mdmon, not system one |
23 | export MDADM_NO_SYSTEMCTL=1 | |
24 | ||
5e7519fa | 25 | # assume md0, md1, md2 exist in /dev |
662c349a ZL |
26 | md0=/dev/md0 |
27 | md1=/dev/md1 | |
28 | md2=/dev/md2 | |
1f48664b NB |
29 | mdp0=/dev/md_d0 |
30 | mdp1=/dev/md_d1 | |
5e7519fa | 31 | |
20d10b4b ZL |
32 | die() { |
33 | echo -e "\n\tERROR: $* \n" | |
34 | save_log fail | |
35 | exit 2 | |
36 | } | |
ed02d9cc | 37 | |
d5a221a5 | 38 | ctrl_c() { |
4d5995c4 GE |
39 | exitonerror=1 |
40 | } | |
41 | ||
dab6685f NB |
42 | # mdadm always adds --quiet, and we want to see any unexpected messages |
43 | mdadm() { | |
662c349a ZL |
44 | rm -f $targetdir/stderr |
45 | case $* in | |
46 | *-S* ) | |
47 | udevadm settle | |
48 | p=`cat /proc/sys/dev/raid/speed_limit_max` | |
49 | echo 20000 > /proc/sys/dev/raid/speed_limit_max | |
50 | ;; | |
51 | esac | |
52 | case $* in | |
20d10b4b ZL |
53 | *-C* | *--create* | *-B* | *--build* ) |
54 | # clear superblock every time once creating or | |
55 | # building arrays, because it's always creating | |
56 | # and building array many times in a test case. | |
57 | for args in $* | |
58 | do | |
59 | [[ $args =~ "/dev/" ]] && { | |
60 | [[ $args =~ "md" ]] || | |
61 | $mdadm --zero $args > /dev/null | |
62 | } | |
63 | done | |
662c349a ZL |
64 | $mdadm 2> $targetdir/stderr --quiet "$@" --auto=yes |
65 | ;; | |
66 | * ) | |
67 | $mdadm 2> $targetdir/stderr --quiet "$@" | |
68 | ;; | |
69 | esac | |
70 | rv=$? | |
71 | case $* in | |
72 | *-S* ) | |
73 | udevadm settle | |
74 | echo $p > /proc/sys/dev/raid/speed_limit_max | |
75 | ;; | |
76 | esac | |
77 | cat >&2 $targetdir/stderr | |
78 | return $rv | |
dab6685f NB |
79 | } |
80 | ||
4e5ce543 | 81 | do_test() { |
662c349a ZL |
82 | _script=$1 |
83 | _basename=`basename $_script` | |
84 | if [ -f "$_script" ] | |
85 | then | |
86 | rm -f $targetdir/stderr | |
87 | # stop all arrays, just incase some script left an array active. | |
88 | $mdadm -Ssq 2> /dev/null | |
89 | mdadm --zero $devlist 2> /dev/null | |
662c349a ZL |
90 | # this might have been reset: restore the default. |
91 | echo 2000 > /proc/sys/dev/raid/speed_limit_max | |
92 | # source script in a subshell, so it has access to our | |
93 | # namespace, but cannot change it. | |
94 | echo -ne "$_script... " | |
95 | if ( set -ex ; . $_script ) &> $targetdir/log | |
96 | then | |
20d10b4b ZL |
97 | dmesg | grep -iq "error\|call trace\|segfault" && |
98 | die "dmesg prints errors when testing $_basename!" | |
662c349a ZL |
99 | echo "succeeded" |
100 | _fail=0 | |
101 | else | |
20d10b4b | 102 | save_log fail |
662c349a ZL |
103 | _fail=1 |
104 | fi | |
20d10b4b ZL |
105 | [ "$savelogs" == "1" ] && |
106 | mv -f $targetdir/log $logdir/$_basename.log | |
107 | [ "$_fail" == "1" -a "$exitonerror" == "1" ] && exit 1 | |
662c349a | 108 | fi |
4e5ce543 JS |
109 | } |
110 | ||
111 | do_help() { | |
20d10b4b ZL |
112 | cat <<-EOF |
113 | Usage: $0 [options] | |
25357919 | 114 | Example for disk mode: ./test --dev=disk --disks=/dev/sda{2..15} |
20d10b4b ZL |
115 | Options: |
116 | --tests=test1,test2,... Comma separated list of tests to run | |
8403b202 | 117 | --raidtype= raid0|linear|raid1|raid456|raid10|ddf|imsm |
20d10b4b ZL |
118 | --disable-multipath Disable any tests involving multipath |
119 | --disable-integrity Disable slow tests of RAID[56] consistency | |
120 | --logdir=directory Directory to save all logfiles in | |
121 | --save-logs Usually use with --logdir together | |
122 | --keep-going | --no-error Don't stop on error, ie. run all tests | |
25357919 ZL |
123 | --dev=loop|lvm|ram|disk Use loop devices (default), LVM, RAM or disk |
124 | --disks= Provide a bunch of physical devices for test | |
20d10b4b ZL |
125 | --volgroup=name LVM volume group for LVM test |
126 | setup Setup test environment and exit | |
127 | cleanup Cleanup test environment | |
128 | prefix Run tests with <prefix> | |
129 | --help | -h Print this usage | |
130 | EOF | |
4e5ce543 JS |
131 | } |
132 | ||
133 | parse_args() { | |
662c349a ZL |
134 | for i in $* |
135 | do | |
136 | case $i in | |
20d10b4b | 137 | [0-9][0-9] ) |
662c349a ZL |
138 | prefix=$i |
139 | ;; | |
140 | setup ) | |
141 | echo "mdadm test environment setup" | |
142 | do_setup | |
143 | trap 0 | |
144 | exit 0 | |
145 | ;; | |
146 | cleanup ) | |
147 | cleanup | |
148 | exit 0 | |
149 | ;; | |
150 | --tests=* ) | |
20d10b4b | 151 | TESTLIST=($(echo ${i##*=} | sed -e 's/,/ /g')) |
662c349a | 152 | ;; |
8403b202 ZL |
153 | --raidtype=* ) |
154 | case ${i##*=} in | |
155 | raid0 ) | |
156 | TESTLIST=($(ls $testdir | grep "[0-9][0-9]r0\|raid0")) | |
157 | ;; | |
158 | linear ) | |
159 | TESTLIST=($(ls $testdir | grep "linear")) | |
160 | ;; | |
161 | raid1 ) | |
162 | TESTLIST=($(ls $testdir | grep "[0-9][0-9]r1\|raid1" | grep -vi raid10)) | |
163 | ;; | |
164 | raid456 ) | |
165 | TESTLIST=($(ls $testdir | grep "[0-9][0-9]r[4-6]\|raid[4-6]")) | |
166 | ;; | |
167 | raid10 ) | |
168 | TESTLIST=($(ls $testdir | grep "[0-9][0-9]r10\|raid10")) | |
169 | ;; | |
170 | ddf ) | |
171 | TESTLIST=($(ls $testdir | grep "[0-9][0-9]ddf")) | |
172 | ;; | |
173 | imsm ) | |
174 | TESTLIST=($(ls $testdir | grep "[0-9][0-9]imsm")) | |
175 | ;; | |
176 | * ) | |
177 | echo "Unknown argument: $i" | |
178 | do_help | |
179 | exit 1 | |
180 | ;; | |
181 | esac | |
182 | ;; | |
662c349a | 183 | --logdir=* ) |
20d10b4b | 184 | logdir="${i##*=}" |
662c349a ZL |
185 | ;; |
186 | --save-logs ) | |
187 | savelogs=1 | |
188 | ;; | |
189 | --keep-going | --no-error ) | |
190 | exitonerror=0 | |
191 | ;; | |
192 | --disable-multipath ) | |
193 | unset MULTIPATH | |
194 | ;; | |
195 | --disable-integrity ) | |
196 | unset INTEGRITY | |
197 | ;; | |
20d10b4b ZL |
198 | --dev=* ) |
199 | case ${i##*=} in | |
200 | loop ) | |
201 | DEVTYPE=loop | |
202 | ;; | |
203 | lvm ) | |
204 | DEVTYPE=lvm | |
205 | ;; | |
206 | ram ) | |
207 | DEVTYPE=ram | |
208 | ;; | |
25357919 ZL |
209 | disk ) |
210 | DEVTYPE=disk | |
211 | ;; | |
20d10b4b ZL |
212 | * ) |
213 | echo "Unknown argument: $i" | |
214 | do_help | |
215 | exit 1 | |
216 | ;; | |
217 | esac | |
662c349a | 218 | ;; |
25357919 ZL |
219 | --disks=* ) |
220 | disks=(${disks[*]} ${i##*=}) | |
221 | ;; | |
662c349a ZL |
222 | --volgroup=* ) |
223 | LVM_VOLGROUP=`expr "x$i" : 'x[^=]*=\(.*\)'` | |
224 | ;; | |
20d10b4b | 225 | --help | -h ) |
662c349a ZL |
226 | do_help |
227 | exit 0 | |
228 | ;; | |
20d10b4b | 229 | * ) |
662c349a ZL |
230 | echo " $0: Unknown argument: $i" |
231 | do_help | |
20d10b4b | 232 | exit 1 |
662c349a ZL |
233 | ;; |
234 | esac | |
235 | done | |
4e5ce543 JS |
236 | } |
237 | ||
20d10b4b | 238 | main() { |
20d10b4b | 239 | do_setup |
572d7091 | 240 | |
20d10b4b ZL |
241 | echo "Testing on linux-$(uname -r) kernel" |
242 | [ "$savelogs" == "1" ] && | |
243 | echo "Saving logs to $logdir" | |
244 | if [ "x$TESTLIST" != "x" ] | |
245 | then | |
246 | for script in ${TESTLIST[@]} | |
247 | do | |
248 | do_test $testdir/$script | |
249 | done | |
250 | else | |
251 | for script in $testdir/$prefix $testdir/$prefix*[^~] | |
252 | do | |
253 | do_test $script | |
254 | done | |
255 | fi | |
60381555 | 256 | |
20d10b4b ZL |
257 | exit 0 |
258 | } | |
259 | ||
260 | parse_args $@ | |
261 | main |