Added randomize test option to ./check
[xfstests-dev.git] / common
1 ##/bin/sh 
2 #
3 # Copyright (c) 2000-2005 Silicon Graphics, Inc.  All Rights Reserved.
4 #
5 # common procedures for QA scripts
6 #
7 # $Header: /disk7/depot/linux/pcp/dev/qa/RCS/common,v 2.52 2000/04/05 18:24:51 kenmcd Exp $
8 #
9
10 _setenvironment()
11 {
12     MSGVERB="text:action"
13     export MSGVERB
14 }
15
16 here=`pwd`
17 rm -f $here/$iam.out
18 _setenvironment
19
20 check=${check-true}
21
22 diff=diff
23 if [ ! -z "$DISPLAY" ]
24 then
25     which xdiff >/dev/null 2>&1 && diff=xdiff
26     which gdiff >/dev/null 2>&1 && diff=gdiff
27     which tkdiff >/dev/null 2>&1 && diff=tkdiff
28     which xxdiff >/dev/null 2>&1 && diff=xxdiff
29 fi
30 verbose=false
31 group=false
32 xgroup=false
33 showme=false
34 sortme=false
35 expunge=true
36 have_test_arg=false
37 randomize=false
38 rm -f $tmp.list $tmp.tmp $tmp.sed
39
40 export FSTYP=xfs
41
42 for r
43 do
44
45     if $group
46     then
47         # arg after -g
48         group_list=`sed -n <group -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
49 s/ .*//p
50 }'`
51         if [ -z "$group_list" ]
52         then
53             echo "Group \"$r\" is empty or not defined?"
54             exit 1
55         fi
56         [ ! -s $tmp.list ] && touch $tmp.list
57         for t in $group_list
58         do
59             if grep -s "^$t\$" $tmp.list >/dev/null
60             then
61                 :
62             else
63                 echo "$t" >>$tmp.list
64             fi
65         done
66         group=false
67         continue
68
69     elif $xgroup
70     then
71         # arg after -x
72         [ ! -s $tmp.list ] && ls [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] >$tmp.list 2>/dev/null
73         group_list=`sed -n <group -e 's/$/ /' -e "/^[0-9][0-9][0-9].* $r /"'{
74 s/ .*//p
75 }'`
76         if [ -z "$group_list" ]
77         then
78             echo "Group \"$r\" is empty or not defined?"
79             exit 1
80         fi
81         numsed=0
82         rm -f $tmp.sed
83         for t in $group_list
84         do
85             if [ $numsed -gt 100 ]
86             then
87                 sed -f $tmp.sed <$tmp.list >$tmp.tmp
88                 mv $tmp.tmp $tmp.list
89                 numsed=0
90                 rm -f $tmp.sed
91             fi
92             echo "/^$t\$/d" >>$tmp.sed
93             numsed=`expr $numsed + 1`
94         done
95         sed -f $tmp.sed <$tmp.list >$tmp.tmp
96         mv $tmp.tmp $tmp.list
97         xgroup=false
98         continue
99     fi
100
101     xpand=true
102     case "$r"
103     in
104
105         -\?)    # usage
106             echo "Usage: $0 [options] [testlist]"'
107
108 common options
109     -v                  verbose
110
111 check options
112     -xfs                test XFS
113     -udf                test UDF
114     -nfs                test NFS
115     -g group[,group...] include tests from these groups
116     -l                  line mode diff [xdiff]
117     -n                  show me, do not run tests
118     -q                  quick [deprecated]
119     -T                  output timestamps
120     -x group[,group...] exclude tests from these groups
121     -r                  randomize test order
122 '
123             exit 0
124             ;;
125
126         -udf)   # -udf ... set FSTYP to udf
127             FSTYP=udf
128             xpand=false
129             ;;
130
131         -xfs)   # -xfs ... set FSTYP to xfs
132             FSTYP=xfs
133             xpand=false
134             ;;
135
136         -nfs)   # -nfs ... set FSTYP to nfs
137             FSTYP=nfs
138             xpand=false
139             ;;
140
141         -g)     # -g group ... pick from group file
142             group=true
143             xpand=false
144             ;;
145
146         -l)     # line mode for diff, not gdiff over modems
147             diff=diff
148             xpand=false
149             ;;
150
151         -q)     # "quick", no longer used - always quick :-)
152             xpand=false
153             ;;
154
155         -n)     # show me, don't do it
156             showme=true
157             xpand=false
158             ;;
159         -r)     # randomize test order
160             randomize=true
161             xpand=false
162             ;;
163
164         -T)     # turn on timestamp output
165             timestamp=true
166             xpand=false
167             ;;
168
169         -v)
170             verbose=true
171             xpand=false
172             ;;
173         -x)     # -x group ... exclude from group file
174             xgroup=true
175             xpand=false
176             ;;
177         '[0-9][0-9][0-9] [0-9][0-9][0-9][0-9]')
178             echo "No tests?"
179             status=1
180             exit $status
181             ;;
182
183         [0-9]*-[0-9]*)
184             eval `echo $r | sed -e 's/^/start=/' -e 's/-/ end=/'`
185             ;;
186
187         [0-9]*-)
188             eval `echo $r | sed -e 's/^/start=/' -e 's/-//'`
189             end=`echo [0-9][0-9][0-9] [0-9][0-9][0-9][0-9] | sed -e 's/\[0-9]//g' -e 's/  *$//' -e 's/.* //'`
190             if [ -z "$end" ]
191             then
192                 echo "No tests in range \"$r\"?"
193                 status=1
194                 exit $status
195             fi
196             ;;
197
198         *)
199             start=$r
200             end=$r
201             ;;
202
203     esac
204
205     # get rid of leading 0s as can be interpreted as octal
206     start=`echo $start | sed 's/^0*//'`
207     end=`echo $end | sed 's/^0*//'`
208
209     if $xpand
210     then
211         have_test_arg=true
212         $AWK_PROG </dev/null '
213 BEGIN   { for (t='$start'; t<='$end'; t++) printf "%03d\n",t }' \
214         | while read id
215         do
216             if grep -s "^$id " group >/dev/null
217             then
218                 # in group file ... OK
219                 echo $id >>$tmp.list
220             else
221                 if [ -f expunged ] && $expunge && egrep "^$id([         ]|\$)" expunged >/dev/null
222                 then
223                     # expunged ... will be reported, but not run, later
224                     echo $id >>$tmp.list
225                 else
226                     # oops
227                     echo "$id - unknown test, ignored"
228                 fi
229             fi
230         done
231     fi
232
233 done
234
235 if [ -s $tmp.list ]
236 then
237     # found some valid test numbers ... this is good
238     :
239 else
240     if $have_test_arg
241     then
242         # had test numbers, but none in group file ... do nothing
243         touch $tmp.list
244     else
245         # no test numbers, do everything from group file
246         sed -n -e '/^[0-9][0-9][0-9]*/s/[       ].*//p' <group >$tmp.list
247     fi
248 fi
249
250 # should be sort -n, but this did not work for Linux when this
251 # was ported from IRIX
252 #
253 list=`sort $tmp.list`
254 rm -f $tmp.list $tmp.tmp $tmp.sed
255
256 if $randomize
257 then
258     list=`echo $list | awk -f randomize.awk`
259 fi
260
261 case "$FSTYP" in
262     xfs)
263          [ "$XFS_LOGPRINT_PROG" = "" ] && _fatal "xfs_logprint not found"
264          [ "$XFS_REPAIR_PROG" = "" ] && _fatal "xfs_repair not found"
265          [ "$XFS_CHECK_PROG" = "" ] && _fatal "xfs_check not found"
266          [ "$XFS_DB_PROG" = "" ] && _fatal "xfs_db not found"
267          [ "$MKFS_XFS_PROG" = "" ] && _fatal "mkfs_xfs not found" 
268          ;;
269     udf)
270          [ "$MKFS_UDF_PROG" = "" ] && _fatal "mkfs_udf/mkudffs not found"
271          ;;
272     nfs)
273          ;;
274 esac