1*cf5a6c84SAndroid Build Coastguard Worker#!/bin/bash 2*cf5a6c84SAndroid Build Coastguard Worker 3*cf5a6c84SAndroid Build Coastguard Worker[ -f testing.sh ] && . testing.sh 4*cf5a6c84SAndroid Build Coastguard Worker 5*cf5a6c84SAndroid Build Coastguard Worker#testing "name" "command" "result" "infile" "stdin" 6*cf5a6c84SAndroid Build Coastguard Worker 7*cf5a6c84SAndroid Build Coastguard Workertestcmd "-- isn't parsed" "-- == -- && echo yes" "yes\n" "" "" 8*cf5a6c84SAndroid Build Coastguard Worker 9*cf5a6c84SAndroid Build Coastguard Worker# Number and position of args is important 10*cf5a6c84SAndroid Build Coastguard Workertestcmd 'no args is false' '; echo $?' '1\n' '' '' 11*cf5a6c84SAndroid Build Coastguard Workertestcmd 'empty string is false' '""; echo $?' '1\n' '' '' 12*cf5a6c84SAndroid Build Coastguard Workertestcmd '1 arg is true if not empty string' '== ; echo $?' '0\n' '' '' 13*cf5a6c84SAndroid Build Coastguard Workertestcmd "1 arg isn't an operand" '-t 2>&1; echo $?' '0\n' '' '' 14*cf5a6c84SAndroid Build Coastguard Workertestcmd '2 args' '-e == ; echo $?' '1\n' '' '' 15*cf5a6c84SAndroid Build Coastguard Workertestcmd '3 args' '-e == -e ; echo $?' '0\n' '' '' 16*cf5a6c84SAndroid Build Coastguard Worker 17*cf5a6c84SAndroid Build Coastguard Worker# parse as operator before parsing as parentheses around one argument 18*cf5a6c84SAndroid Build Coastguard Workertestcmd '' '\( == \) ; echo $?' '1\n' '' '' 19*cf5a6c84SAndroid Build Coastguard Workertestcmd '' '\( == \( ; echo $?' '0\n' '' '' 20*cf5a6c84SAndroid Build Coastguard Workertestcmd '' '\( "" \) ; echo $?' '1\n' '' '' 21*cf5a6c84SAndroid Build Coastguard Workertestcmd '' '\( x \) ; echo $?' '0\n' '' '' 22*cf5a6c84SAndroid Build Coastguard Worker 23*cf5a6c84SAndroid Build Coastguard Worker# TODO: Should also have device and socket files, but requires root 24*cf5a6c84SAndroid Build Coastguard Worker 25*cf5a6c84SAndroid Build Coastguard Workermkdir d 26*cf5a6c84SAndroid Build Coastguard Workertouch f 27*cf5a6c84SAndroid Build Coastguard Workerln -s /dev/null L 28*cf5a6c84SAndroid Build Coastguard Workerecho nonempty > s 29*cf5a6c84SAndroid Build Coastguard Workermkfifo p 30*cf5a6c84SAndroid Build Coastguard Worker 31*cf5a6c84SAndroid Build Coastguard Workertype_test() 32*cf5a6c84SAndroid Build Coastguard Worker{ 33*cf5a6c84SAndroid Build Coastguard Worker for i in d f L s p n 34*cf5a6c84SAndroid Build Coastguard Worker do 35*cf5a6c84SAndroid Build Coastguard Worker "$C" $* $i && echo -n $i 36*cf5a6c84SAndroid Build Coastguard Worker done 37*cf5a6c84SAndroid Build Coastguard Worker} 38*cf5a6c84SAndroid Build Coastguard Worker 39*cf5a6c84SAndroid Build Coastguard Workertesting "-b" "type_test -b" "" "" "" 40*cf5a6c84SAndroid Build Coastguard Workertesting "-c" "type_test -c" "L" "" "" 41*cf5a6c84SAndroid Build Coastguard Workertesting "-d" "type_test -d" "d" "" "" 42*cf5a6c84SAndroid Build Coastguard Workertesting "-e" "type_test -e" "dfLsp" "" "" 43*cf5a6c84SAndroid Build Coastguard Workertesting "-f" "type_test -f" "fs" "" "" 44*cf5a6c84SAndroid Build Coastguard Workertesting "-h" "type_test -h" "L" "" "" 45*cf5a6c84SAndroid Build Coastguard Workertesting "-L" "type_test -L" "L" "" "" 46*cf5a6c84SAndroid Build Coastguard Workertesting "-p" "type_test -p" "p" "" "" 47*cf5a6c84SAndroid Build Coastguard Workertesting "-S" "type_test -S" "" "" "" 48*cf5a6c84SAndroid Build Coastguard Workertesting "-s" "type_test -s" "ds" "" "" 49*cf5a6c84SAndroid Build Coastguard Workertesting "! -e" 'type_test ! -e' "n" "" "" 50*cf5a6c84SAndroid Build Coastguard Worker 51*cf5a6c84SAndroid Build Coastguard Workerrm f L s p 52*cf5a6c84SAndroid Build Coastguard Workerrmdir d 53*cf5a6c84SAndroid Build Coastguard Worker 54*cf5a6c84SAndroid Build Coastguard Worker# Alas can't expand to a redirect, so just test one success/fail 55*cf5a6c84SAndroid Build Coastguard Workertestcmd "-t" '-t 0 < /dev/null; echo $?' '1\n' '' '' 56*cf5a6c84SAndroid Build Coastguard Workertestcmd "-t2" '-t 0 < /dev/ptmx; echo $?' '0\n' '' '' 57*cf5a6c84SAndroid Build Coastguard Worker 58*cf5a6c84SAndroid Build Coastguard Worker# test -rwx each bit position and failure 59*cf5a6c84SAndroid Build Coastguard Workertouch walrus 60*cf5a6c84SAndroid Build Coastguard WorkerMASK=111 61*cf5a6c84SAndroid Build Coastguard Workerfor i in x w r k g u; do 62*cf5a6c84SAndroid Build Coastguard Worker [ $i == k ] && MASK=1000 63*cf5a6c84SAndroid Build Coastguard Worker XX=no 64*cf5a6c84SAndroid Build Coastguard Worker [ $(id -u) -eq 0 ] && [ $i == r -o $i == w ] && XX=yes # Root always has access 65*cf5a6c84SAndroid Build Coastguard Worker # test everything off produces "off" 66*cf5a6c84SAndroid Build Coastguard Worker chmod 000 walrus 67*cf5a6c84SAndroid Build Coastguard Worker testcmd "-$i 0" "-$i walrus && echo yes || echo no" "$XX\n" "" "" 68*cf5a6c84SAndroid Build Coastguard Worker chmod $((7777-$MASK)) walrus 69*cf5a6c84SAndroid Build Coastguard Worker testcmd "-$i inverted" "-$i walrus && echo yes || echo no" "$XX\n" "" "" 70*cf5a6c84SAndroid Build Coastguard Worker MASK=$(($MASK<<1)) 71*cf5a6c84SAndroid Build Coastguard Workerdone 72*cf5a6c84SAndroid Build Coastguard Workerunset MASK 73*cf5a6c84SAndroid Build Coastguard Worker# Test setuid setgid sticky enabled 74*cf5a6c84SAndroid Build Coastguard Workerfor i in uu+s gg+s k+t; do 75*cf5a6c84SAndroid Build Coastguard Worker chmod 000 walrus 76*cf5a6c84SAndroid Build Coastguard Worker chmod ${i:1}+s walrus 77*cf5a6c84SAndroid Build Coastguard Worker testcmd "-${i:0:1}" "-${i:0:1} walrus && echo yes" "yes\n" "" "" 78*cf5a6c84SAndroid Build Coastguard Workerdone 79*cf5a6c84SAndroid Build Coastguard Worker# test each ugo+rwx bit position individually 80*cf5a6c84SAndroid Build Coastguard WorkerXX=no 81*cf5a6c84SAndroid Build Coastguard Worker# Note: chmod 007 means everybody EXCEPT owner/group can access it. (Unix!) 82*cf5a6c84SAndroid Build Coastguard Worker[ $(id -u) -eq 0 ] && XX=yes # Root always has access 83*cf5a6c84SAndroid Build Coastguard Workerfor i in 1 10 100; do for j in x w r; do 84*cf5a6c84SAndroid Build Coastguard Worker chmod $i walrus 85*cf5a6c84SAndroid Build Coastguard Worker 86*cf5a6c84SAndroid Build Coastguard Worker [ $i == 100 ] && XX=yes 87*cf5a6c84SAndroid Build Coastguard Worker testcmd "-$j $i" "-$j walrus && echo yes || echo no" "$XX\n" "" "" 88*cf5a6c84SAndroid Build Coastguard Worker i=$((i<<1)) 89*cf5a6c84SAndroid Build Coastguard Workerdone; done 90*cf5a6c84SAndroid Build Coastguard Workerrm -f walrus 91*cf5a6c84SAndroid Build Coastguard Worker 92*cf5a6c84SAndroid Build Coastguard Worker# Not zero length, zero length, equals, not equals 93*cf5a6c84SAndroid Build Coastguard Workertestcmd "-n" "-n '' || echo yes" "yes\n" "" "" 94*cf5a6c84SAndroid Build Coastguard Workertestcmd "-n2" "-n a && echo yes" "yes\n" "" "" 95*cf5a6c84SAndroid Build Coastguard Workertestcmd "-z" "-z '' && echo yes" "yes\n" "" "" 96*cf5a6c84SAndroid Build Coastguard Workertestcmd "-z2" "-z a || echo yes" "yes\n" "" "" 97*cf5a6c84SAndroid Build Coastguard Workertestcmd "" "a = b || echo yes" "yes\n" "" "" 98*cf5a6c84SAndroid Build Coastguard Workertestcmd "" "'' = '' && echo yes" "yes\n" "" "" 99*cf5a6c84SAndroid Build Coastguard Workertestcmd "a != b" "a != b && echo yes" "yes\n" "" "" 100*cf5a6c84SAndroid Build Coastguard Workertestcmd "a != b" "a != a || echo yes" "yes\n" "" "" 101*cf5a6c84SAndroid Build Coastguard Worker 102*cf5a6c84SAndroid Build Coastguard Workerarith_test() 103*cf5a6c84SAndroid Build Coastguard Worker{ 104*cf5a6c84SAndroid Build Coastguard Worker $C -1 $1 1 && echo -n l 105*cf5a6c84SAndroid Build Coastguard Worker $C 0 $1 0 && echo -n e 106*cf5a6c84SAndroid Build Coastguard Worker $C -3 $1 -5 && echo -n g 107*cf5a6c84SAndroid Build Coastguard Worker} 108*cf5a6c84SAndroid Build Coastguard Worker 109*cf5a6c84SAndroid Build Coastguard Workertesting "-eq" "arith_test -eq" "e" "" "" 110*cf5a6c84SAndroid Build Coastguard Workertesting "-ne" "arith_test -ne" "lg" "" "" 111*cf5a6c84SAndroid Build Coastguard Workertesting "-gt" "arith_test -gt" "g" "" "" 112*cf5a6c84SAndroid Build Coastguard Workertesting "-ge" "arith_test -ge" "eg" "" "" 113*cf5a6c84SAndroid Build Coastguard Workertesting "-lt" "arith_test -lt" "l" "" "" 114*cf5a6c84SAndroid Build Coastguard Workertesting "-le" "arith_test -le" "le" "" "" 115*cf5a6c84SAndroid Build Coastguard Worker 116*cf5a6c84SAndroid Build Coastguard Workertouch oldfile -d 1970-01-01 117*cf5a6c84SAndroid Build Coastguard Workertouch newfile -d 2031-01-01 118*cf5a6c84SAndroid Build Coastguard Worker 119*cf5a6c84SAndroid Build Coastguard Workertestcmd "-ef" "newfile -ef newfile && echo yes" "yes\n" "" "" 120*cf5a6c84SAndroid Build Coastguard Workertestcmd "-ef2" "newfile -ef oldfile || echo no" "no\n" "" "" 121*cf5a6c84SAndroid Build Coastguard Workertestcmd "-ot" "oldfile -ot newfile && echo yes" "yes\n" "" "" 122*cf5a6c84SAndroid Build Coastguard Workertestcmd "-ot2" "oldfile -ot oldfile || echo no" "no\n" "" "" 123*cf5a6c84SAndroid Build Coastguard Workertestcmd "-nt" "newfile -nt oldfile && echo yes" "yes\n" "" "" 124*cf5a6c84SAndroid Build Coastguard Workertestcmd "-nt2" "oldfile -nt newfile || echo no" "no\n" "" "" 125*cf5a6c84SAndroid Build Coastguard Worker 126*cf5a6c84SAndroid Build Coastguard Workertesting "positional" "test -a == -a && echo yes" "yes\n" "" "" 127*cf5a6c84SAndroid Build Coastguard Workertesting "! stacks" 'test \! \! \! \! 2 -eq 2 && echo yes' "yes\n" "" "" 128*cf5a6c84SAndroid Build Coastguard Worker 129*cf5a6c84SAndroid Build Coastguard Worker# bash builtin "test" has these, but /usr/bin/test does not. 130*cf5a6c84SAndroid Build Coastguard Workertesting "<1" 'test abc \< def && echo yes' "yes\n" "" "" 131*cf5a6c84SAndroid Build Coastguard Workertesting "<2" 'test def \< abc || echo yes' "yes\n" "" "" 132*cf5a6c84SAndroid Build Coastguard Workertesting ">1" 'test abc \> def || echo yes' "yes\n" "" "" 133*cf5a6c84SAndroid Build Coastguard Workertesting ">2" 'test def \> abc && echo yes' "yes\n" "" "" 134*cf5a6c84SAndroid Build Coastguard Worker 135*cf5a6c84SAndroid Build Coastguard Worker# toyonly doesn't work with TOYFLAG_NOHELP 136*cf5a6c84SAndroid Build Coastguard Worker# bash only has this for [[ ]] but extra tests to _exclude_ silly... 137*cf5a6c84SAndroid Build Coastguard Worker#toyonly testcmd "=~" 'abc =~ a.c && echo yes' "yes\n" "" "" 138*cf5a6c84SAndroid Build Coastguard Worker#toyonly testcmd "=~ fail" 'abc =~ d.c; echo $?' '1\n' "" "" 139*cf5a6c84SAndroid Build Coastguard Worker#toyonly testcmd "=~ zero length match" 'abc =~ "1*" && echo yes' 'yes\n' '' '' 140*cf5a6c84SAndroid Build Coastguard Worker 141*cf5a6c84SAndroid Build Coastguard Worker# test ! = -o a 142*cf5a6c84SAndroid Build Coastguard Worker# test ! \( = -o a \) 143*cf5a6c84SAndroid Build Coastguard Worker# test \( ! = \) -o a 144*cf5a6c84SAndroid Build Coastguard Worker# test \( \) 145*cf5a6c84SAndroid Build Coastguard Worker 146*cf5a6c84SAndroid Build Coastguard Worker 147*cf5a6c84SAndroid Build Coastguard Worker# -e == -a 148*cf5a6c84SAndroid Build Coastguard Worker# -e == -a -o -d != -o 149*cf5a6c84SAndroid Build Coastguard Worker# \( "x" \) -a \) == \) 150*cf5a6c84SAndroid Build Coastguard Worker# \( ! ! ! -e \) \) 151*cf5a6c84SAndroid Build Coastguard Worker 152*cf5a6c84SAndroid Build Coastguard Worker# // () -a (() -a () -o ()) -o () 153*cf5a6c84SAndroid Build Coastguard Worker# // x -a ( x -o x ) -a x 154*cf5a6c84SAndroid Build Coastguard Worker# // x -o ( x -a x ) -a x -o x 155*cf5a6c84SAndroid Build Coastguard Worker 156*cf5a6c84SAndroid Build Coastguard Worker# trailing ! and ( 157*cf5a6c84SAndroid Build Coastguard Worker# test \( ! ! ! -e \) \) 158*cf5a6c84SAndroid Build Coastguard Worker# test \( \( "" \) -a "" \) -a "" 159*cf5a6c84SAndroid Build Coastguard Worker# test ! 160*cf5a6c84SAndroid Build Coastguard Worker# test \( \) == \) \) -a x 161*cf5a6c84SAndroid Build Coastguard Worker 162*cf5a6c84SAndroid Build Coastguard Worker# test \( "" \) -a \) == \) 163*cf5a6c84SAndroid Build Coastguard Worker# test \( "x" \) -a \) == \) 164*cf5a6c84SAndroid Build Coastguard Worker# test -e == -a 165*cf5a6c84SAndroid Build Coastguard Worker# test \( "" \) 166