aboutsummaryrefslogblamecommitdiffstats
path: root/test-test/test
blob: e5ace53515b8efb05fd8b41daca43d6cf7fc5604 (plain) (tree)
1
2
3

           
                       





















                                                              
                                                                         
            
                                                                             


          
                 







                                                                                                    
              



                                                                                                   
































                                                                                       






                         






















                                  




          




                                                    



































































































































































































































































                                                 













                                                    













                           
                                  









                           
                                  








                           
                                  









                           

                                  










                           
                                  









                           

                                  













































                                     

                                     


                            


                                          



                                   
                                         
          



        

                                     



                             


                                          



                                   
                                         
          




                    
                                




                        

                                       



                                     
                                                            
          



              

                                           








                                   
                                               
          



              

                                         










                                         
                                               
          
















                                     












                                                                                














                                

                                     

                                       
                                           
          

 














                                                              






















                                  










                                  
 






















































































































                                                                                            


                                                                                                      
                                                                                                    
                                                                                                  
                                                                                     








                                  
                                                                                






                     
#!/bin/bash

cd -- "$(dirname "$0")"
if test -z "$TEST"; then
	TEST=../test
fi
if echo "$TEST" | grep / > /dev/null; then
	b="$PREFIX $(dirname "$TEST")/["
else
	b="$PREFIX ["
fi
t="$PREFIX $TEST"

report ()
{
	if test $1 = 0; then
		printf "\033[1;32mTest %s OK\033[m\n" "$2"
	else
		printf "\033[1;31mTest %s FAILED\033[m\n" "$2"
	fi
}

report_np ()
{
	if test $1 = 0; then
		printf "\033[1;32mTest %s OK (NON-STANDARD)\033[m\n" "$2"
	else
		printf "\033[1;31mTest %s FAILED (NON-STANDARD)\033[m\n" "$2"
	fi
}

report_obsharm ()
{
	if test $1 = 0; then
		printf "\033[1;33mTest %s (obsolescent, harmful) OK (NON-STANDARD)\033[m\n" "$2"
	else
		printf "\033[1;31mTest %s (obsolescent, harmful) FAILED (NON-STANDARD)\033[m\n" "$2"
	fi
}

obsharmless ()
{
	printf "\033[1;32mTest %s (obsolescent, harmful) NOT SUPPORTED (NON-STANDARD)\033[m\n" "$1"
}

report_harm ()
{
	if test $1 = 0; then
		printf "\033[1;33mTest %s (harmful) OK (NON-STANDARD)\033[m\n" "$2"
	else
		printf "\033[1;31mTest %s (harmful) FAILED (NON-STANDARD)\033[m\n" "$2"
	fi
}

harmless ()
{
	printf "\033[1;32mTest %s (harmful) NOT SUPPORTED (NON-STANDARD)\033[m\n" "$1"
}

nosupport ()
{
	printf "\033[1;33mTest %s NOT SUPPORTED (NON-STANDARD)\033[m\n" "$1"
}

supported ()
{
	$t "$@" 2> /dev/null
	test $? -lt 2
}

xsleep ()
{
	python3 <<EOF
import time
time.sleep($1)
EOF
}

T ()
{
    $t "$@" && $b "$@" \]
}

F ()
{
    $t "$@"
    A=$?
    $b "$@" \]
    B=$?
    test $A = 1 && test $B = 1
}

FX ()
{
    $t "$@"
    A=$?
    $b "$@" \]
    B=$?
    test $A -ge 1 && test $B -ge 1
}

FAIL ()
{
    $t "$@"
    A=$?
    $b "$@" \]
    B=$?
    test $A -ge 2 && test $B -ge 2
}


bracket ()
{
	$t -e . \] 2> /dev/null
	A=$?
	$b -e . \] -e . 2> /dev/null
	B=$?
	$b -e . \] && test $A -eq 2 && test $B -eq 2
	report $? "bracket"
}

bflag ()
{
	T -b /dev/sda &&
	F -b /dev/null
	report $? "bflag"
}

cflag ()
{
	T -c /dev/null &&
	F -c /dev/sda
	report $? "cflag"
}

dflag ()
{
	T -d . &&
	F -d test
	report $? "dflag"
}

eflag ()
{
	ln -sf /erefdsghw4th42hwrgb tmp
	T -e /dev/sda &&
	T -e /dev/null &&
	T -e /dev &&
	T -e test &&
	T -e . &&
	F -e /erefdsghw4th42hwrgb &&
	F -e tmp
	report $? "eflag"
	rm tmp
}

fflag ()
{
	ln -sf test tmp
	T -f test &&
	F -f . &&
	F -f /dev/null &&
	T -f tmp
	report $? "fflag"
	rm tmp
}

gflag ()
{
	touch tmp1; rm tmp1
	touch tmp2; rm tmp2
	touch tmp1 tmp2
	chmod 5600 tmp1
	chmod 2600 tmp2
	F -g tmp1 &&
	T -g tmp2
	report $? "gflag"
	rm tmp1 tmp2
}

hflag_1 ()
{
	touch tmp; rm tmp
	ln -sf / tmp
	T -h tmp &&
	F -h /
	report $? "hflag_1"
	rm tmp
}

hflag_2 ()
{
	touch tmp; rm tmp
	ln -sf /3tgrgtrghwhgsh tmp
	T -h tmp &&
	F -h /
	report $? "hflag_2"
	rm tmp
}

kflag ()
{
	touch tmp1; rm tmp1
	touch tmp2; rm tmp2
	touch tmp1 tmp2
	chmod 6600 tmp1
	chmod 1600 tmp2
	F -k tmp1 &&
	T -k tmp2
	report_np $? "kflag"
	rm tmp1 tmp2
}

Lflag_1 ()
{
	touch tmp; rm tmp
	ln -sf / tmp
	T -L tmp &&
	F -L /
	report $? "Lflag_1"
	rm tmp
}

Lflag_2 ()
{
	touch tmp; rm tmp
	ln -sf /3tgrgtrghwhgsh tmp
	T -L tmp &&
	F -L /
	report $? "Lflag_2"
	rm tmp
}

nflag ()
{
	T -n . &&
	F -n ''
	report $? "nflag"
}

pflag ()
{
	touch tmp; rm tmp
	touch tmp
	F -p tmp
	r=$?
	rm tmp
	mkfifo tmp
	test $r = 0 && T -p tmp
	report $? "pflag"
	rm tmp
}

rflag ()
{
	touch tmp; rm tmp
	touch tmp
	chmod 0 tmp
	F -r tmp
	r=$?
	chmod o+r tmp
	test $r = 0 && F -r tmp
	r=$?
	chmod u+r tmp
	test $r = 0 && T -r tmp
	report $? "rflag"
	chmod u+w tmp
	rm tmp
}

sflag ()
{
	touch tmp1; rm tmp1
	touch tmp2; rm tmp2
	touch tmp1
	echo x > tmp2
	F -s tmp1 &&
	T -s tmp2
	report $? "sflag"
	rm tmp1 tmp2
}

tflag ()
{
	T -t 0 < /dev/tty &&
	T -t 4 4>> /dev/tty &&
	F -t 0 < test
	report $? "tflag"
}

uflag ()
{
	touch tmp1; rm tmp1
	touch tmp2; rm tmp2
	touch tmp1 tmp2
	chmod 3600 tmp1
	chmod 4600 tmp2
	F -u tmp1 &&
	T -u tmp2
	report $? "uflag"
	rm tmp1 tmp2
}

wflag ()
{
	touch tmp; rm tmp
	touch tmp
	chmod 0 tmp
	F -w tmp
	r=$?
	chmod o+w tmp
	test $r = 0 && F -w tmp
	r=$?
	chmod u+w tmp
	test $r = 0 && T -w tmp
	report $? "wflag"
	rm tmp
}

xflag_f ()
{
	touch tmp; rm tmp
	touch tmp
	chmod 0 tmp
	F -x tmp
	r=$?
	chmod o+x tmp
	test $r = 0 && F -x tmp
	r=$?
	chmod u+x tmp
	test $r = 0 && T -x tmp
	report $? "xflag_f"
	chmod u+w tmp
	rm tmp
	T -x .
}

xflag_d ()
{
	T -x .
	report $? "xflag_d"
}

zflag ()
{
	T -z '' &&
	F -z .
	report $? "zflag"
}

string ()
{
	touch tmp; rm tmp
	T x &&
	F &&
	F '' &&
	T -1 &&
	T -e &&
	T -n &&
	T -z &&
	$t --help > tmp && ! test -s tmp &&
	$t --version > tmp && ! test -s tmp &&
	$b --help \] > tmp && ! test -s tmp &&
	$b --version \] > tmp && ! test -s tmp &&
	! $t -- -e . 2> /dev/null
	report $? "string"
	rm tmp
}

eq_sign ()
{
	T a = a &&
	F a = b &&
	F 1 = 01 &&
	T a=b
	report $? "eq_sign"
}

eqeq_sign ()
{
	$t a == b 2> /dev/null
	if test $? -eq 2; then
		nosupport "eqeq_sign (redundant)"
	else
		T a == a &&
		F a == b &&
		F 1 == 01 &&
		T a=b
		report_np $? "eqeq_sign (redundant)"
	fi
}

ne_sign ()
{
	T a != b &&
	F a != a &&
	T 1 != 01 &&
	T a!=a
	report $? "ne_sign"
}

eq_flag ()
{
	T 1 -eq 1 &&
	T 1 -eq 01 &&
	F 1 -eq 0 &&
	FX a -eq a 2> /dev/null &&
	T -1 -eq -1 &&
	T 1 -eq +1
	report $? "eq_flag"
}

ne_flag ()
{
	T 1 -ne 2 &&
	F 1 -ne 1 &&
	F 1 -ne 01 &&
	FX a -ne b 2> /dev/null &&
	T -1 -ne -2
	report $? "ne_flag"
}

gt_flag ()
{
	T 2 -gt 1 &&
	T 02 -gt 1 &&
	F 1 -gt 2 &&
	FX b -gt a 2> /dev/null &&
	T -1 -gt -2 &&
	F 1 -gt 1
	report $? "gt_flag"
}

ge_flag ()
{
	T 2 -ge 1 &&
	T 02 -ge 1 &&
	F 1 -ge 2 &&
	FX b -ge a 2> /dev/null &&
	FX a -ge a 2> /dev/null &&
	T -1 -ge -2 &&
	T 1 -ge 1 &&
	T 1 -ge +1
	report $? "ge_flag"
}

lt_flag ()
{
	T 1 -lt 2 &&
	T 1 -lt 02 &&
	F 2 -lt 1 &&
	FX a -lt b 2> /dev/null &&
	T -2 -lt -1 &&
	F 1 -lt 1
	report $? "lt_flag"
}

le_flag ()
{
	T 1 -le 2 &&
	T 1 -le 02 &&
	F 2 -le 1 &&
	FX a -le b 2> /dev/null &&
	FX a -le a 2> /dev/null &&
	T -2 -le -1 &&
	T 1 -le 1 &&
	T +1 -le 1
	report $? "le_flag"
}

ef_flag ()
{
	touch tmp; rm tmp
	touch tmp1; rm tmp1
	touch tmp2; rm tmp2
	touch tmp
	link tmp tmp1
	touch tmp2
	T tmp -ef tmp1 &&
	F tmp -ef tmp2
	r=$?
	rm tmp1
	ln -s tmp tmp1
	test $r = 0 && T tmp -ef tmp1
	report_np $? "ef_flag"
	rm tmp tmp1 tmp2
}

nt_flag ()
{
	touch tmp; rm tmp
	touch tmp
	T tmp -nt /usr &&
	F /usr -nt tmp
	report_np $? "nt_flag"
	rm tmp
}

ot_flag ()
{
	touch tmp; rm tmp
	touch tmp
	F tmp -ot /usr &&
	T /usr -ot tmp
	report_np $? "ot_flag"
	rm tmp
}

aflag ()
{
	if ! supported '' -a ''; then
		obsharmless "aflag"
	else
		T a -a b &&
		F a -a '' &&
		FAIL a -ab 2> /dev/null &&
		FX a -a 2> /dev/null &&
		FX -a a 2> /dev/null &&
		T -z '' -a -n x &&
		F -z '' -a -n '' &&
		F -z x -a -n x &&
		F -z x -a -n ''
		report_obsharm $? "aflag"
	fi
}

oflag ()
{
	if ! supported '' -o ''; then
		obsharmless "oflag"
	else
		T a -o b &&
		T a -o '' &&
		F '' -o '' &&
		FAIL a -ob 2> /dev/null &&
		FX -o a 2> /dev/null &&
		FX a -o 2> /dev/null &&
		T -z '' -o -n x &&
		T -z '' -o -n '' &&
		T -z x -o -n x &&
		F -z x -o -n ''
		report_obsharm $? "oflag"
	fi
}

excl ()
{
	T ! -n '' &&
	FAIL !-n '' 2> /dev/null
	report $? "excl"
}

excl_prec ()
{
	if ! supported ! '' -a ''; then
		obsharmless "excl_prec"
	else
		T -z '' -a ! -n '' &&
		T ! -n '' -a -z '' &&
		F ! '' -a ''
		report_obsharm $? "excl_prec (questionable)"
	fi
}

oflag_aflag ()
{
	if ! supported xx -o xx -a xx; then
		obsharmless "oflag_aflag"
	else
		T xx -o xx -a xx &&
		T xx -o xx -a '' &&
		T xx -o '' -a xx &&
		T xx -o '' -a '' &&
		T '' -o xx -a xx &&
		F '' -o xx -a '' &&
		F '' -o '' -a xx &&
		F '' -o '' -a ''
		report_obsharm $? "oflag_aflag"
	fi
}

parenthesis ()
{
	if ! supported '(' -e / ')'; then
		obsharmless "parenthesis"
	else
		T xx -o \( xx -a xx \) &&
		T xx -o \( xx -a '' \) &&
		T xx -o \( '' -a xx \) &&
		T xx -o \( '' -a '' \) &&
		T '' -o \( xx -a xx \) &&
		F '' -o \( xx -a '' \) &&
		F '' -o \( '' -a xx \) &&
		F '' -o \( '' -a '' \) &&
		T \( xx -a xx \) &&
		F \(xx = xx\)
		report_obsharm $? "parenthesis"
	fi
}

multiexcl ()
{
	T ! ! ! "" 2> /dev/null &&
	F ! ! "" 2> /dev/null
	report $? "multiexcl"
}

multiexcl_many ()
{
	T ! ! ! ! ! "" 2> /dev/null
	report_np $? "multiexcl_many"
}

bigint ()
{
	T 999999999999999999999999999999999999999999999999 -gt 1 2> /dev/null &&
	T 11 -gt 2 &&
	T 9 -gt 1 &&
	T 0 -eq 0 &&
	T -1 -eq -1 &&
	T -1 -lt 0 &&
	T -1 -lt 1 &&
	T 0 -gt -1 &&
	T 0 -eq 0 &&
	T 0 -lt 1 &&
	T 1 -gt -1 &&
	T 1 -gt 0 &&
	T 1 -eq 1
	report $? "bigint"
}

prec ()
{
	touch -- -eq; rm -- -eq
	touch -- -eq
	T -f -eq 2> /dev/null &&
	T -f = -f 2> /dev/null
	report $? "prec"
	rm -- -eq
}

np_prec ()
{
	if ! supported '' -a ''; then
		obsharmless "np_prec"
	else
		T -n -a -n 2> /dev/null
		report_obsharm $? "np_prec"
	fi
}

Sflag ()
{
	touch tmp1; rm tmp1
	touch tmp2; rm tmp2
	touch tmp2
	python3 <<EOF
import socket
socket.socket(socket.AF_UNIX, socket.SOCK_STREAM).bind('tmp1')
EOF
	T -S tmp1 &&
	F -S tmp2
	report $? "Sflag"
	rm tmp1 tmp2
}

Eflag ()
{
	touch tmp1; rm tmp1
	touch tmp2; rm tmp2
	touch tmp3; rm tmp3
	touch tmp2l; rm tmp2l
	touch tmp3l; rm tmp3l
	touch tmp1
	mkdir tmp2
	mkdir tmp3
	touch tmp3/x
	ln -s tmp2 tmp2l
	ln -s tmp3 tmp3l
	F -E tmp1 &&
	T -E tmp2 &&
	F -E tmp3 &&
	T -E tmp2l &&
	F -E tmp3l
	report_np $? "Eflag"
	rm tmp1 tmp2l tmp3l tmp3/x
	rmdir tmp2 tmp3
}

not_eq_not ()
{
	T ! = !
	report $? "not_eq_not"
}

eq_parenthesis ()
{
	F \( = \)
	report $? "eq_parenthesis"
}

lt_sign ()
{
	if ! supported '' \< ''; then
		harmless "lt_sign"
	else
		F '' \< '' &&
		T '' \< a &&
		F a \< '' &&
		F a \< a &&
		T a \< b &&
		F b \< a &&
		T A \< a &&
		F a \< A &&
		T A \< b &&
		F b \< A &&
		F z \< aa &&
		T aa \< z
		report_harm $? "lt_sign"
	fi
}

le_sign ()
{
	if ! supported '' \<= ''; then
		harmless "le_sign"
	else
		T '' \<= '' &&
		T '' \<= a &&
		F a \<= '' &&
		T a \<= a &&
		T a \<= b &&
		F b \<= a &&
		T A \<= a &&
		F a \<= A &&
		T A \<= b &&
		F b \<= A &&
		F z \<= aa &&
		T aa \<= z
		report_harm $? "le_sign"
	fi
}

gt_sign ()
{
	if ! supported '' \> ''; then
		harmless "gt_sign"
	else
		F '' \> '' &&
		F '' \> a &&
		T a \> '' &&
		F a \> a &&
		F a \> b &&
		T b \> a &&
		F A \> a &&
		T a \> A &&
		F A \> b &&
		T b \> A &&
		T z \> aa &&
		F aa \> z
		report_harm $? "gt_sign"
	fi
}

ge_sign ()
{
	if ! supported '' \>= ''; then
		harmless "ge_sign"
	else
		T '' \>= '' &&
		F '' \>= a &&
		T a \>= '' &&
		T a \>= a &&
		F a \>= b &&
		T b \>= a &&
		F A \>= a &&
		T a \>= A &&
		F A \>= b &&
		T b \>= A &&
		T z \>= aa &&
		F aa \>= z
		report_harm $? "ge_sign"
	fi
}

Nflag ()
{
	if ! supported -N "$0"; then
		harmless "Nflag"
	else
		if test -e tmp; then
			rm tmp
		fi
		F -N tmp
		r1=$?
		touch tmp
		xsleep 1.001
		touch -m tmp
		T -N tmp
		r2=$?
		touch -a tmp
		F -N tmp
		r3=$?
		# And for good measure {
		rm tmp
		touch tmp ; touch -a tmp
		F -N tmp
		r4=$?
		xsleep 0.01
		rm tmp
		touch tmp ; touch -a tmp
		F -N tmp
		r5=$?
		# }
		test $r1 = 0 && test $r2 = 0 && test $r3 = 0 && test $r4 = 0 && test $r5 = 0
		report_harm $? "Nflag"
		rm tmp
	fi
}

if test $# = 0; then
	set bracket bflag cflag dflag eflag fflag gflag hflag_1 hflag_2 kflag Lflag_1 Lflag_2 nflag \
	    pflag rflag sflag tflag uflag wflag xflag_f xflag_d zflag string eq_sign ne_sign eq_flag \
	    ne_flag gt_flag ge_flag lt_flag le_flag ef_flag nt_flag ot_flag aflag oflag excl Eflag \
	    excl_prec oflag_aflag parenthesis multiexcl multiexcl_many bigint prec np_prec Sflag \
	    not_eq_not eq_parenthesis eqeq_sign lt_sign le_sign gt_sign ge_sign Nflag
fi
(
for f in $@; do
	$f
done
) | tee result
! grep FAILED < result > /dev/null
ret=$?
if test $ret != 0; then
	if test $(grep FAILED < result | grep -v NON-STANDARD | wc -l) = 0; then
		ret=1
	else
		ret=2
	fi
fi
rm result
exit $ret