add opendir alias
[minix.git] / test / fbdtest / test.sh
blob304caf0968f689de615a01c784973ac7f04d0528
1 #!/bin/sh
3 # This test set tests the some of the basic functionality of the Faulty Block
4 # Device driver. It takes a writable device as input - a small (sub)partition
5 # suffices for this purpose. All information on the given device WILL BE LOST,
6 # so USE AT YOUR OWN RISK.
8 # Currently, a reasonable subset of supported read and write fault injection is
9 # tested. Since injection of write faults was the original goal for this
10 # driver, the test set for this part of FBD functionality is relatively large.
12 # Testing of read faults works as follows. First, a known pattern is written to
13 # the actual device. Then FBD is loaded as an overlay over the device. A fault
14 # injection rule is set on FBD, and the disk pattern is read back from the FBD
15 # device (/dev/fbd). FBD is then unloaded. The test succeeds if the pattern
16 # that was read back, matches a certain expected pattern.
18 # Testing of write faults works as follows. First, a known pattern is written
19 # to the actual device. Then FBD is loaded as an overlay over the device. A
20 # fault injection rule is set on FBD, and another pattern is written to the FBD
21 # device (/dev/fbd). FBD is unloaded, and the resulting disk pattern is read
22 # back from the actual device. This resulting pattern should match a certain
23 # expected pattern.
25 # Since all raw block I/O requests go through the root file server, this test
26 # set heavily depends on the behavior of that root file server. It has been
27 # tested with MFS, and may not work with any other file server type. It assumes
28 # that a 4K block size is used, and that the file server translates raw block
29 # requests to aligned 4K-multiples. The test set also makes assumptions about
30 # merging pages in write operations, flushing only upon a sync call, etcetera.
31 # Unfortunately, this dependency on the root file server precludes the test set
32 # from properly exercising all possible options of FBD.
34 RWBLOCKS=./rwblocks
36 devtopair() {
37 label=`awk "/^$(stat -f '%Hr' $1) / "'{print $2}' /proc/dmap`
38 if [ ! -z "$label" ]; then echo "label=$label,minor=`stat -f '%Lr' $1`"; fi
41 if [ ! -b "$1" ]; then
42 echo "usage: $0 device" >&2
43 exit 1
46 PAIR=$(devtopair $1)
47 if [ -z "$PAIR" ]; then
48 echo "driver not found for $1" >&2
49 exit 1
52 if [ ! -x $RWBLOCKS ]; then
53 make || exit 1
56 if [ "`stat -f '%k' /`" != "4096" ]; then
57 echo "The root file system is not using a 4K block size." >&2
58 exit 1
61 read -p "This will overwrite the contents of $1. Are you sure? [y/N] " RESP
62 case $RESP in
63 [yY]*)
66 echo "Hmpf. Okay. Aborting test.."
67 exit 0
68 esac
70 DEV="$1"
71 LAST=
72 SUCCESS=0
73 TOTAL=0
75 read_test() {
76 OPT=
77 if [ "$1" = "-last" -o "$1" = "-notlast" ]; then
78 OPT=$1
79 shift
81 PAT=$1
82 EXP=$2
83 shift 2
84 $RWBLOCKS $DEV $PAT
85 service up /usr/sbin/fbd -dev /dev/fbd -args "$PAIR" || exit 1
86 fbdctl add $@ >/dev/null
87 #fbdctl list
88 RES="`$RWBLOCKS /dev/fbd`"
89 service down fbd
90 echo -n "$RES: "
91 if echo "$RES" | egrep "^$EXP\$" >/dev/null 2>&1; then
92 if [ "$OPT" = "-last" -a "$RES" != "$LAST" ]; then
93 echo FAILURE
94 elif [ "$OPT" = "-notlast" -a "$RES" = "$LAST" ]; then
95 echo FAILURE
96 else
97 echo SUCCESS
98 SUCCESS=`expr $SUCCESS + 1`
99 LAST="$RES"
101 else
102 echo FAILURE
104 TOTAL=`expr $TOTAL + 1`
107 write_test() {
108 OPT=
109 if [ "$1" = "-last" -o "$1" = "-notlast" ]; then
110 OPT=$1
111 shift
113 PAT=$1
114 EXP=$2
115 WS=$3
116 shift 3
117 $RWBLOCKS $DEV UUUUUUUUUUUUUUUU
118 service up /usr/sbin/fbd -dev /dev/fbd -args "$PAIR" || exit 1
119 fbdctl add $@ >/dev/null
120 #fbdctl list
121 $RWBLOCKS /dev/fbd $PAT $WS
122 service down fbd
123 RES="`$RWBLOCKS $DEV`"
124 echo -n "$RES: "
125 if echo "$RES" | egrep "^$EXP\$" >/dev/null 2>&1; then
126 if [ "$OPT" = "-last" -a "$RES" != "$LAST" ]; then
127 echo FAILURE
128 elif [ "$OPT" = "-notlast" -a "$RES" = "$LAST" ]; then
129 echo FAILURE
130 else
131 echo SUCCESS
132 SUCCESS=`expr $SUCCESS + 1`
133 LAST="$RES"
135 else
136 echo FAILURE
138 TOTAL=`expr $TOTAL + 1`
141 read_test AAAAAAAAAAAAAAAA A0AAAAAAAAAAAAAA -a 1000-2000 -r corrupt zero
143 read_test AAAAAAAAAAAAAAAA 'AA[a-z][a-z]AAAAAAAAAAAA' -a 2000-4000 -r corrupt persist
144 read_test -last AAAAAAAAAAAAAAAA 'AA[a-z][a-z]AAAAAAAAAAAA' -a 2000-4000 -r corrupt persist
146 read_test AAAAAAAAAAAAAAAA 'AAAAA[a-z][a-z][a-z]AAAAAAAA' -a 5000-8000 -r corrupt random
147 read_test -notlast AAAAAAAAAAAAAAAA 'AAAAA[a-z][a-z][a-z]AAAAAAAA' -a 5000-8000 -r corrupt random
149 read_test AAAAAAAAAAAAAAAA 'A[a-z]AAAAAAAAAAAAAA' -a 1100-1200 -r corrupt zero
151 read_test AAAAAAAAAAAAAAAA 'AA#AAAAAAAAAAAAA' -a 2000-3000 -r error EIO
152 read_test AAAAAAAAABAAABAA 'AAAAAAAAAB###BAA' -a A800-C800 -r error EIO
154 read_test ABBBAAAAAAAAAAAA 'ABBB#' -a 4000 -r error OK
156 write_test AAAAAAAAAAAAAAAA A0AAAAAAAAAAAAAA 512 -a 1000-2000 -w corrupt zero
157 write_test AAAAAAAAAAAAAAAA A0AAAAAAAAAAAAAA 4096 -a 1000-2000 -w corrupt zero
158 write_test AAAAAAAAAAAAAAAA A0AAAAAAAAAAAAAA 16384 -a 1000-2000 -w corrupt zero
160 write_test AAAAAAAAAAAAAAAA 'AA[a-z][a-z]AAAAAAAAAAAA' 512 -a 2000-4000 -w corrupt persist
161 write_test -last AAAAAAAAAAAAAAAA 'AA[a-z][a-z]AAAAAAAAAAAA' 512 -a 2000-4000 -w corrupt persist
162 write_test -last AAAAAAAAAAAAAAAA 'AA[a-z][a-z]AAAAAAAAAAAA' 4096 -a 2000-4000 -w corrupt persist
163 write_test -last AAAAAAAAAAAAAAAA 'AA[a-z][a-z]AAAAAAAAAAAA' 4096 -a 2000-4000 -w corrupt persist
164 write_test -last AAAAAAAAAAAAAAAA 'AA[a-z][a-z]AAAAAAAAAAAA' 16384 -a 2000-4000 -w corrupt persist
165 write_test -last AAAAAAAAAAAAAAAA 'AA[a-z][a-z]AAAAAAAAAAAA' 16384 -a 2000-4000 -w corrupt persist
167 write_test AAAAAAAAAAAAAAAA 'AAAAA[a-z][a-z][a-z]AAAAAAAA' 512 -a 5000-8000 -w corrupt random
168 write_test -notlast AAAAAAAAAAAAAAAA 'AAAAA[a-z][a-z][a-z]AAAAAAAA' 512 -a 5000-8000 -w corrupt random
169 write_test -notlast AAAAAAAAAAAAAAAA 'AAAAA[a-z][a-z][a-z]AAAAAAAA' 4096 -a 5000-8000 -w corrupt random
170 write_test -notlast AAAAAAAAAAAAAAAA 'AAAAA[a-z][a-z][a-z]AAAAAAAA' 4096 -a 5000-8000 -w corrupt random
171 write_test -notlast AAAAAAAAAAAAAAAA 'AAAAA[a-z][a-z][a-z]AAAAAAAA' 16384 -a 5000-8000 -w corrupt random
172 write_test -notlast AAAAAAAAAAAAAAAA 'AAAAA[a-z][a-z][a-z]AAAAAAAA' 16384 -a 5000-8000 -w corrupt random
174 write_test AAAAAAAAAAAAAAAA 'A[a-z]AAAAAAAAAAAAAA' 512 -a 1100-1200 -w corrupt zero
175 write_test AAAAAAAAAAAAAAAA 'A[a-z]AAAAAAAAAAAAAA' 4096 -a 1100-1200 -w corrupt zero
176 write_test AAAAAAAAAAAAAAAA 'A[a-z]AAAAAAAAAAAAAA' 16384 -a 1100-1200 -w corrupt zero
178 write_test AAAAAAAAAAAAAAAA AAAUUUUUUUUUUUUU 512 -a 3000 -w error EIO
179 write_test AAAAAAAAAAAAAAAA AAAUUUUUUUUUUUUU 4096 -a 3000 -w error EIO
180 write_test AAAAAAAAAAAAAAAA AAAUUUUUUUUUUUUU 16384 -a 3000 -w error EIO
182 write_test AAAAAAAAAAAAABAA AAAAAABAAAAAAUAA 4096 -a D000-E000 -w misdir 6000-7000 4096
183 write_test AAAAAAAAAAAAABAA 'AAAAAA(AB|BA)AAAAAUAA' 4096 -a D000-E000 -w misdir 6000-8000 4096
184 write_test AAAAAAAAAAAAABAA 'AAAAAA(AB|BA)AAAAAUAA' 4096 -a D000-E000 -w misdir 6000-8000 4096
185 write_test AAAAAAAAAAAAABAA 'AAAAAA(AB|BA)AAAAAUAA' 4096 -a D000-E000 -w misdir 6000-8000 4096
187 write_test AAAAAAAAABAAAAAA AAAAAAAAAUAAAAAA 512 -a 9000-A000 -w lost
188 write_test AAAAAAAAABAAAAAA AAAAAAAAAUAAAAAA 4096 -a 9000-A000 -w lost
189 write_test AAAAAAAAABAAAAAA AAAAAAAAUUUUAAAA 16384 -a 9000-A000 -w lost
191 write_test AAAAAAAAAAABAAAA 'AAAAAAAAAAA[a-z]AAAA' 512 -a B000-C000 -w torn 512
192 write_test AAAAAAAAAAABAAAA 'AAAAAAAAAAA[a-z]AAAA' 4096 -a B000-C000 -w torn 512
193 write_test AAAAAAAAAAABAAAA 'AAAAAAAA[a-z]UUUAAAA' 16384 -a B000-C000 -w torn 512
195 write_test AAAAAAAAAAABAAAA AAAAAAAAAAABAAAA 512 -a B000-C000 -w torn 4096
196 write_test AAAAAAAAAAABAAAA AAAAAAAAAAABAAAA 4096 -a B000-C000 -w torn 4096
197 write_test AAAAAAAAAAABAAAA AAAAAAAAAUUUAAAA 16384 -a B000-C000 -w torn 4096
199 echo "$SUCCESS out of $TOTAL tests succeeded."