du(1): -A should not affect block size
[unleashed.git] / usr / src / lib / libshell / common / tests / bracket.sh
blobf43e10ed036660d0d58ef073f82e09dbf37ddd34
1 ########################################################################
2 # #
3 # This software is part of the ast package #
4 # Copyright (c) 1982-2010 AT&T Intellectual Property #
5 # and is licensed under the #
6 # Common Public License, Version 1.0 #
7 # by AT&T Intellectual Property #
8 # #
9 # A copy of the License is available at #
10 # http://www.opensource.org/licenses/cpl1.0.txt #
11 # (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) #
12 # #
13 # Information and Software Systems Research #
14 # AT&T Research #
15 # Florham Park NJ #
16 # #
17 # David Korn <dgk@research.att.com> #
18 # #
19 ########################################################################
20 function err_exit
22 print -u2 -n "\t"
23 print -u2 -r ${Command}[$1]: "${@:2}"
24 let Errors+=1
26 alias err_exit='err_exit $LINENO'
28 Command=${0##*/}
29 integer Errors=0
31 tmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
32 trap "cd /; rm -rf $tmp" EXIT
34 null=''
35 if [[ ! -z $null ]]
36 then err_exit "-z: null string should be of zero length"
38 file=$tmp/original
39 newer_file=$tmp/newer
40 if [[ -z $file ]]
41 then err_exit "-z: $file string should not be of zero length"
43 if [[ -a $file ]]
44 then err_exit "-a: $file shouldn't exist"
46 > $file
47 if [[ ! -a $file ]]
48 then err_exit "-a: $file should exist"
50 chmod 777 $file
51 if [[ ! -r $file ]]
52 then err_exit "-r: $file should be readable"
54 if [[ ! -w $file ]]
55 then err_exit "-w: $file should be writable"
57 if [[ ! -w $file ]]
58 then err_exit "-x: $file should be executable"
60 if [[ ! -w $file || ! -r $file ]]
61 then err_exit "-rw: $file should be readable/writable"
63 if [[ -s $file ]]
64 then err_exit "-s: $file should be of zero size"
66 if [[ ! -f $file ]]
67 then err_exit "-f: $file should be an ordinary file"
69 if [[ -d $file ]]
70 then err_exit "-f: $file should not be a directory file"
72 if [[ ! -d . ]]
73 then err_exit "-d: . should not be a directory file"
75 if [[ -f /dev/null ]]
76 then err_exit "-f: /dev/null should not be an ordinary file"
78 chmod 000 $file
79 if [[ -r $file ]]
80 then err_exit "-r: $file should not be readable"
82 if [[ ! -O $file ]]
83 then err_exit "-r: $file should be owned by me"
85 if [[ -w $file ]]
86 then err_exit "-w: $file should not be writable"
88 if [[ -w $file ]]
89 then err_exit "-x: $file should not be executable"
91 if [[ -w $file || -r $file ]]
92 then err_exit "-rw: $file should not be readable/writable"
94 if [[ -z x && -z x || ! -z x ]]
95 then :
96 else err_exit " wrong precedence"
98 if [[ -z x && (-z x || ! -z x) ]]
99 then err_exit " () grouping not working"
101 if [[ foo < bar ]]
102 then err_exit "foo comes before bar"
104 [[ . -ef $(pwd) ]] || err_exit ". is not $PWD"
105 set -o allexport
106 [[ -o allexport ]] || err_exit '-o: did not set allexport option'
107 if [[ -n $null ]]
108 then err_exit "'$null' has non-zero length"
110 if [[ ! -r /dev/fd/0 ]]
111 then err_exit "/dev/fd/0 not open for reading"
113 if [[ ! -w /dev/fd/2 ]]
114 then err_exit "/dev/fd/2 not open for writing"
116 sleep 1
117 > $newer_file
118 if [[ ! $file -ot $newer_file ]]
119 then err_exit "$file should be older than $newer_file"
121 if [[ $file -nt $newer_file ]]
122 then err_exit "$newer_file should be newer than $file"
124 if [[ $file != $tmp/* ]]
125 then err_exit "$file should match $tmp/*"
127 if [[ $file = $tmp'/*' ]]
128 then err_exit "$file should not equal $tmp'/*'"
130 [[ ! ( ! -z $null && ! -z x) ]] || err_exit "negation and grouping"
131 [[ -z '' || -z '' || -z '' ]] || err_exit "three ors not working"
132 [[ -z '' && -z '' && -z '' ]] || err_exit "three ors not working"
133 (exit 8)
134 if [[ $? -ne 8 || $? -ne 8 ]]
135 then err_exit 'value $? within [[...]]'
137 x='(x'
138 if [[ '(x' != '('* ]]
139 then err_exit " '(x' does not match '('* within [[...]]"
141 if [[ '(x' != "("* ]]
142 then err_exit ' "(x" does not match "("* within [[...]]'
144 if [[ '(x' != \(* ]]
145 then err_exit ' "(x" does not match \(* within [[...]]'
147 if [[ 'x(' != *'(' ]]
148 then err_exit " 'x(' does not match '('* within [[...]]"
150 if [[ 'x&' != *'&' ]]
151 then err_exit " 'x&' does not match '&'* within [[...]]"
153 if [[ 'xy' = *'*' ]]
154 then err_exit " 'xy' matches *'*' within [[...]]"
156 if [[ 3 > 4 ]]
157 then err_exit '3 < 4'
159 if [[ 4 < 3 ]]
160 then err_exit '3 > 4'
162 if [[ 3x > 4x ]]
163 then err_exit '3x < 4x'
165 x='bin|dev|?'
166 cd /
167 if [[ $(print $x) != "$x" ]]
168 then err_exit 'extended pattern matching on command arguments'
170 if [[ dev != $x ]]
171 then err_exit 'extended pattern matching not working on variables'
173 if [[ -u $SHELL ]]
174 then err_exit "setuid on $SHELL"
176 if [[ -g $SHELL ]]
177 then err_exit "setgid on $SHELL"
179 test -d . -a '(' ! -f . ')' || err_exit 'test not working'
180 if [[ '!' != ! ]]
181 then err_exit 'quoting unary operator not working'
183 test \( -n x \) -o \( -n y \) 2> /dev/null || err_exit 'test ( -n x ) -o ( -n y) not working'
184 test \( -n x \) -o -n y 2> /dev/null || err_exit 'test ( -n x ) -o -n y not working'
185 chmod 600 $file
186 exec 4> $file
187 print -u4 foobar
188 if [[ ! -s $file ]]
189 then err_exit "-s: $file should be non-zero"
191 exec 4>&-
192 if [[ 011 -ne 11 ]]
193 then err_exit "leading zeros in arithmetic compares not ignored"
196 set -x
197 [[ foo > bar ]]
198 } 2> /dev/null || { set +x; err_exit "foo<bar with -x enabled" ;}
199 set +x
201 eval "[[ (a) ]]"
202 ) 2> /dev/null || err_exit "[[ (a) ]] not working"
203 > $file
204 chmod 4755 "$file"
205 if test -u $file && test ! -u $file
206 then err_exit "test ! -u suidfile not working"
208 for i in '(' ')' '[' ']'
209 do [[ $i == $i ]] || err_exit "[[ $i != $i ]]"
210 done
212 [[ aaaa == {4}(a) ]] || err_exit 'aaaa != {4}(a)'
213 [[ aaaa == {2,5}(a) ]] || err_exit 'aaaa != {2,4}(a)'
214 [[ abcdcdabcd == {3,6}(ab|cd) ]] || err_exit 'abcdcdabcd == {3,4}(ab|cd)'
215 [[ abcdcdabcde == {5}(ab|cd)e ]] || err_exit 'abcdcdabcd == {5}(ab|cd)e'
216 ) || err_exit 'errors with {..}(...) patterns'
217 [[ D290.2003.02.16.temp == D290.+(2003.02.16).temp* ]] || err_exit 'pattern match bug with +(...)'
218 rm -rf $file
220 [[ -N $file ]] && err_exit 'test -N $tmp/*: st_mtime>st_atime after creat'
221 sleep 2
222 print 'hello world'
223 [[ -N $file ]] || err_exit 'test -N $tmp/*: st_mtime<=st_atime after write'
224 sleep 2
225 read
226 [[ -N $file ]] && err_exit 'test -N $tmp/*: st_mtime>st_atime after read'
227 } > $file < $file
228 if rm -rf "$file" && ln -s / "$file"
229 then [[ -L "$file" ]] || err_exit '-L not working'
230 [[ -L "$file"/ ]] && err_exit '-L with file/ not working'
232 $SHELL -c 't=1234567890; [[ $t == @({10}(\d)) ]]' 2> /dev/null || err_exit ' @({10}(\d)) pattern not working'
233 $SHELL -c '[[ att_ == ~(E)(att|cus)_.* ]]' 2> /dev/null || err_exit ' ~(E)(att|cus)_* pattern not working'
234 $SHELL -c '[[ att_ =~ (att|cus)_.* ]]' 2> /dev/null || err_exit ' =~ ere not working'
235 $SHELL -c '[[ abc =~ a(b)c ]]' 2> /dev/null || err_exit '[[ abc =~ a(b)c ]] fails'
236 $SHELL -xc '[[ abc =~ \babc\b ]]' 2> /dev/null || err_exit '[[ abc =~ \babc\b ]] fails'
237 [[ abc == ~(E)\babc\b ]] || err_exit '\b not preserved for ere when not in ()'
238 [[ abc == ~(iEi)\babc\b ]] || err_exit '\b not preserved for ~(iEi) when not in ()'
240 e=$($SHELL -c '[ -z "" -a -z "" ]' 2>&1)
241 [[ $e ]] && err_exit "[ ... ] compatibility check failed -- $e"
242 i=hell
243 [[ hell0 == $i[0] ]] || err_exit 'pattern $i[0] interpreded as array ref'
244 test '(' = ')' && err_exit '"test ( = )" should not be true'
245 [[ $($SHELL -c 'case F in ~(Eilr)[a-z0-9#]) print ok;;esac' 2> /dev/null) == ok ]] || err_exit '~(Eilr) not working in case command'
246 [[ $($SHELL -c "case Q in ~(Fi)q | \$'\E') print ok;;esac" 2> /dev/null) == ok ]] || err_exit '~(Fi)q | \E not working in case command'
248 for l in C en_US.ISO8859-15
249 do [[ $($SHELL -c "LC_COLLATE=$l" 2>&1) ]] && continue
250 export LC_COLLATE=$l
251 set -- \
252 'A' 0 1 1 0 1 1 1 0 0 1 0 0 \
253 'Z' 0 1 1 0 1 1 1 0 0 1 0 0 \
254 '/' 0 0 0 0 0 0 1 1 1 1 1 1 \
255 '.' 0 0 0 0 0 0 1 1 1 1 1 1 \
256 '_' 0 0 0 0 0 0 1 1 1 1 1 1 \
257 '-' 1 1 1 1 1 1 0 0 0 0 0 0 \
258 '%' 0 0 0 0 0 0 1 1 1 1 1 1 \
259 '@' 0 0 0 0 0 0 1 1 1 1 1 1 \
260 '!' 0 0 0 0 0 0 1 1 1 1 1 1 \
261 '^' 0 0 0 0 0 0 1 1 1 1 1 1 \
262 # retain this line #
263 while (( $# >= 13 ))
264 do c=$1
265 shift
266 for p in \
267 '[![.-.]]' \
268 '[![.-.][:upper:]]' \
269 '[![.-.]A-Z]' \
270 '[!-]' \
271 '[!-[:upper:]]' \
272 '[!-A-Z]' \
273 '[[.-.]]' \
274 '[[.-.][:upper:]]' \
275 '[[.-.]A-Z]' \
276 '[-]' \
277 '[-[:upper:]]' \
278 '[-A-Z]' \
279 # retain this line #
280 do e=$1
281 shift
282 [[ $c == $p ]]
283 g=$?
284 [[ $g == $e ]] || err_exit "[[ '$c' == $p ]] for LC_COLLATE=$l failed -- expected $e, got $g"
285 done
286 done
287 done
288 integer n
289 if ( : < /dev/tty ) 2>/dev/null && exec {n}< /dev/tty
290 then [[ -t $n ]] || err_exit "[[ -t n ]] fails when n > 9"
292 foo=([1]=a [2]=b [3]=c)
293 [[ -v foo[1] ]] || err_exit 'foo[1] should be set'
294 [[ ${foo[1]+x} ]] || err_exit '${foo[1]+x} should be x'
295 [[ ${foo[@]+x} ]] || err_exit '${foo[@]+x} should be x'
296 unset foo[1]
297 [[ -v foo[1] ]] && err_exit 'foo[1] should not be set'
298 [[ ${foo[1]+x} ]] && err_exit '${foo[1]+x} should be empty'
299 bar=(a b c)
300 [[ -v bar[1] ]] || err_exit 'bar[1] should be set'
301 [[ ${bar[1]+x} ]] || err_exit '${foo[1]+x} should be x'
302 unset bar[1]
303 [[ ${bar[1]+x} ]] && err_exit '${foo[1]+x} should be empty'
304 [[ -v bar ]] || err_exit 'bar should be set'
305 [[ -v bar[1] ]] && err_exit 'bar[1] should not be set'
306 integer z=( 1 2 4)
307 [[ -v z[1] ]] || err_exit 'z[1] should be set'
308 unset z[1]
309 [[ -v z[1] ]] && err_exit 'z[1] should not be set'
310 typeset -si y=( 1 2 4)
311 [[ -v y[6] ]] && err_exit 'y[6] should not be set'
312 [[ -v y[1] ]] || err_exit 'y[1] should be set'
313 unset y[1]
314 [[ -v y[1] ]] && err_exit 'y[1] should not be set'
315 x=abc
316 [[ -v x[0] ]] || err_exit 'x[0] should be set'
317 [[ ${x[0]+x} ]] || err_exit print '${x[0]+x} should be x'
318 [[ -v x[3] ]] && err_exit 'x[3] should not be set'
319 [[ ${x[3]+x} ]] && err_exit '${x[0]+x} should be Empty'
320 unset x
321 [[ ${x[@]+x} ]] && err_exit '${x[@]+x} should be Empty'
322 unset x y z foo bar
323 exit $((Errors))