Print this page
11972 resync smatch
*** 4,18 ****
cd $(dirname "$0")
default_path=".."
default_cmd="sparse \$file"
! tests_list=`find . -name '*.c' | sed -e 's#^\./\(.*\)#\1#' | sort`
prog_name=`basename $0`
if [ ! -x "$default_path/sparse-llvm" ]; then
! disabled_cmds="sparsec sparsei sparse-llvm"
fi
# flags:
# - some tests gave an unexpected result
failed=0
--- 4,19 ----
cd $(dirname "$0")
default_path=".."
default_cmd="sparse \$file"
! default_args="$SPARSE_TEST_ARGS"
! tests_list=""
prog_name=`basename $0`
if [ ! -x "$default_path/sparse-llvm" ]; then
! disabled_cmds="sparsec sparsei sparse-llvm sparse-llvm-dis"
fi
# flags:
# - some tests gave an unexpected result
failed=0
*** 29,41 ****
ko_tests=0
known_ko_tests=0
# defaults to not verbose
[ -z "$V" ] && V=0
! [ $V -eq 0 ] && quiet=1 || quiet=0
##
# get_tag_value(file) - get the 'check-<...>' tags & values
get_tag_value()
{
check_name=""
check_command="$default_cmd"
--- 30,71 ----
ko_tests=0
known_ko_tests=0
# defaults to not verbose
[ -z "$V" ] && V=0
! vquiet=""
! quiet=0
! abort=0
+
##
+ # verbose(string) - prints string if we are in verbose mode
+ verbose()
+ {
+ [ "$V" -eq "1" ] && echo " $1"
+ return 0
+ }
+
+ ##
+ # warning(string) - prints a warning
+ warning()
+ {
+ [ "$quiet" -ne 1 ] && echo "warning: $1"
+ return 0
+ }
+
+ ##
+ # error(string[, die]) - prints an error and exits with value die if given
+ error()
+ {
+ [ "$quiet" -ne 1 ] && echo "error: $1"
+ [ -n "$2" ] && exit $2
+ return 0
+ }
+
+
+ ##
# get_tag_value(file) - get the 'check-<...>' tags & values
get_tag_value()
{
check_name=""
check_command="$default_cmd"
*** 45,54 ****
--- 75,88 ----
check_error_ignore=0
check_output_ignore=0
check_output_contains=0
check_output_excludes=0
check_output_pattern=0
+ check_arch_ignore=""
+ check_arch_only=""
+ check_assert=""
+ check_cpp_if=""
lines=$(grep 'check-[a-z-]*' $1 | \
sed -e 's/^.*\(check-[a-z-]*:*\) *\(.*\)$/\1 \2/')
while read tag val; do
*** 63,73 ****
check-known-to-fail) check_known_to_fail=1 ;;
check-error-ignore) check_error_ignore=1 ;;
check-output-ignore) check_output_ignore=1 ;;
check-output-contains:) check_output_contains=1 ;;
check-output-excludes:) check_output_excludes=1 ;;
! check-output-pattern-) check_output_pattern=1 ;;
esac
done << EOT
$lines
EOT
}
--- 97,125 ----
check-known-to-fail) check_known_to_fail=1 ;;
check-error-ignore) check_error_ignore=1 ;;
check-output-ignore) check_output_ignore=1 ;;
check-output-contains:) check_output_contains=1 ;;
check-output-excludes:) check_output_excludes=1 ;;
! check-output-pattern) check_output_pattern=1 ;;
! check-arch-ignore:) arch=$(uname -m)
! check_arch_ignore="$val" ;;
! check-arch-only:) arch=$(uname -m)
! check_arch_only="$val" ;;
! check-assert:) check_assert="$val" ;;
! check-cpp-if:) check_cpp_if="$val" ;;
!
! check-description:) ;; # ignore
! check-note:) ;; # ignore
! check-warning:) ;; # ignore
! check-error-start) ;; # ignore
! check-error-end) ;; # ignore
! check-output-start) ;; # ignore
! check-output-end) ;; # ignore
! check-should-pass) ;; # ignore, unused annotation
! check-should-fail) ;; # ignore, unused annotation
! check-should-warn) ;; # ignore, unused annotation
! check-*) error "$1: unknown tag '$tag'" 1 ;;
esac
done << EOT
$lines
EOT
}
*** 78,92 ****
--- 130,146 ----
{
ifile="$1"
patt="$2"
ofile="$3"
cmp="$4"
+ msg="$5"
grep "$patt:" "$ifile" | \
sed -e "s/^.*$patt: *\(.*\)$/\1/" | \
while read val; do
grep -s -q "$val" "$ofile"
if [ "$?" $cmp 0 ]; then
+ error " Pattern '$val' unexpectedly $msg"
return 1
fi
done
return $?
*** 97,170 ****
# of the patterns given by ifile's tags?
#
# returns 0 if all present, 1 otherwise
has_each_patterns()
{
! has_patterns "$1" "$2" "$3" -ne
}
##
# has_none_patterns(ifile tag ofile) - does ofile contains some
# of the patterns given by ifile's tags?
#
# returns 1 if any present, 0 otherwise
has_none_patterns()
{
! has_patterns "$1" "$2" "$3" -eq
}
##
! # nbr_patterns(ifile tag ofile) - does ofile contains the
# the patterns given by ifile's tags
# the right number of time?
! nbr_patterns()
{
ifile="$1"
patt="$2"
ofile="$3"
! grep "$patt-[0-9][0-9]*-times:" "$ifile" | \
! sed -e "s/^.*$patt-\([0-9][0-9]*\)-times: *\(.*\)/\1 \2/" | \
! while read nbr pat; do
n=$(grep -s "$pat" "$ofile" | wc -l)
! if [ "$n" -ne "$nbr" ]; then
return 1
fi
done
return $?
}
##
! # verbose(string) - prints string if we are in verbose mode
! verbose()
{
! [ "$V" -eq "1" ] && echo " $1"
return 0
}
- ##
- # error(string[, die]) - prints an error and exits with value die if given
- error()
- {
- [ "$quiet" -ne 1 ] && echo "error: $1"
- [ -n "$2" ] && exit $2
- return 0
- }
do_usage()
{
echo "$prog_name - a tiny automatic testing script"
! echo "Usage: $prog_name [command] [command arguments]"
echo
echo "commands:"
! echo " none runs the whole test suite"
! echo " single file runs the test in 'file'"
! echo " format file [name [cmd]] helps writing a new test case using cmd"
echo
! echo " help prints usage"
}
##
# do_test(file) - tries to validate a test case
#
# it "parses" file, looking for check-* tags and tries to validate
# the test against an expected result
--- 151,256 ----
# of the patterns given by ifile's tags?
#
# returns 0 if all present, 1 otherwise
has_each_patterns()
{
! has_patterns "$1" "$2" "$4" -ne "$3"
}
##
# has_none_patterns(ifile tag ofile) - does ofile contains some
# of the patterns given by ifile's tags?
#
# returns 1 if any present, 0 otherwise
has_none_patterns()
{
! has_patterns "$1" "$2" "$4" -eq "$3"
}
##
! # minmax_patterns(ifile tag ofile) - does ofile contains the
# the patterns given by ifile's tags
# the right number of time?
! minmax_patterns()
{
ifile="$1"
patt="$2"
ofile="$3"
! grep "$patt([0-9-]*\(, *\)*[0-9-]*):" "$ifile" | \
! sed -e "s/^.*$patt(\([0-9]*\)): *\(.*\)/\1 eq \2/" \
! -e "s/^.*$patt(\([0-9-]*\), *\([0-9-]*\)): *\(.*\)/\1 \2 \3/" | \
! while read min max pat; do
n=$(grep -s "$pat" "$ofile" | wc -l)
! if [ "$max" = "eq" ]; then
! if [ "$n" -ne "$min" ]; then
! error " Pattern '$pat' expected $min times but got $n times"
return 1
fi
+ continue
+ fi
+ if [ "$min" != '-' ]; then
+ if [ "$n" -lt "$min" ]; then
+ error " Pattern '$pat' expected min $min times but got $n times"
+ return 1
+ fi
+ fi
+ if [ "$max" != '-' ]; then
+ if [ "$n" -gt "$max" ]; then
+ error " Pattern '$pat' expected max $max times but got $n times"
+ return 1
+ fi
+ fi
done
return $?
}
##
! # arg_file(filename) - checks if filename exists
! arg_file()
{
! [ -z "$1" ] && {
! do_usage
! exit 1
! }
! [ -e "$1" ] || {
! error "Can't open file $1"
! exit 1
! }
return 0
}
+ ##
do_usage()
{
echo "$prog_name - a tiny automatic testing script"
! echo "Usage: $prog_name [option(s)] [command] [arguments]"
echo
+ echo "options:"
+ echo " -a|--abort Abort the tests as soon as one fails."
+ echo " -q|--quiet Be extra quiet while running the tests."
+ echo " --args='...' Add these options to the test command."
+ echo
echo "commands:"
! echo " [file ...] Runs the test suite on the given file(s)."
! echo " If a directory is given, run only those files."
! echo " If no file is given, run the whole testsuite."
! echo " single file Run the test in 'file'."
! echo " format file [name [cmd]] Help writing a new test case using cmd."
echo
! echo " [command] help Print usage."
}
+ disable()
+ {
+ disabled_tests=$(($disabled_tests + 1))
+ if [ -z "$vquiet" ]; then
+ echo " SKIP $1 ($2)"
+ fi
+ }
+
##
# do_test(file) - tries to validate a test case
#
# it "parses" file, looking for check-* tags and tries to validate
# the test against an expected result
*** 175,191 ****
# - 3 if the test is disabled.
do_test()
{
test_failed=0
file="$1"
get_tag_value $file
# can this test be handled by test-suite ?
# (it has to have a check-name key in it)
if [ "$check_name" = "" ]; then
! echo "warning: test '$file' unhandled"
unhandled_tests=$(($unhandled_tests + 1))
return 2
fi
test_name="$check_name"
--- 261,278 ----
# - 3 if the test is disabled.
do_test()
{
test_failed=0
file="$1"
+ quiet=0
get_tag_value $file
# can this test be handled by test-suite ?
# (it has to have a check-name key in it)
if [ "$check_name" = "" ]; then
! warning "$file: test unhandled"
unhandled_tests=$(($unhandled_tests + 1))
return 2
fi
test_name="$check_name"
*** 197,237 ****
# check for disabled commands
set -- $check_command
base_cmd=$1
for i in $disabled_cmds; do
if [ "$i" = "$base_cmd" ] ; then
! disabled_tests=$(($disabled_tests + 1))
! echo " DISABLE $test_name ($file)"
return 3
fi
done
! cmd=`eval echo $default_path/$check_command`
!
echo " TEST $test_name ($file)"
! verbose "Using command : $cmd"
# grab the expected exit value
expected_exit_value=$check_exit_value
verbose "Expecting exit value: $expected_exit_value"
# do we want a timeout?
if [ $check_timeout -ne 0 ]; then
! cmd="timeout -k 1s $check_timeout $cmd"
fi
# grab the actual output & exit value
! $cmd 1> $file.output.got 2> $file.error.got
actual_exit_value=$?
must_fail=$check_known_to_fail
- quiet=0
[ $must_fail -eq 1 ] && [ $V -eq 0 ] && quiet=1
known_ko_tests=$(($known_ko_tests + $must_fail))
! for stream in output error; do
eval ignore=\$check_${stream}_ignore
[ $ignore -eq 1 ] && continue
# grab the expected output
sed -n "/check-$stream-start/,/check-$stream-end/p" $file \
--- 284,360 ----
# check for disabled commands
set -- $check_command
base_cmd=$1
for i in $disabled_cmds; do
if [ "$i" = "$base_cmd" ] ; then
! disable "$test_name" "$file"
return 3
fi
done
+ if [ "$check_arch_ignore" != "" ]; then
+ if echo $arch | egrep -q -w "$check_arch_ignore"; then
+ disable "$test_name" "$file"
+ return 3
+ fi
+ fi
+ if [ "$check_arch_only" != "" ]; then
+ if ! (echo $arch | egrep -q -w "$check_arch_only"); then
+ disable "$test_name" "$file"
+ return 3
+ fi
+ fi
+ if [ "$check_assert" != "" ]; then
+ res=$(../sparse - 2>&1 >/dev/null <<- EOF
+ _Static_assert($check_assert, "$check_assert");
+ EOF
+ )
+ if [ "$res" != "" ]; then
+ disable "$test_name" "$file"
+ return 3
+ fi
+ fi
+ if [ "$check_cpp_if" != "" ]; then
+ res=$(../sparse -E - 2>/dev/null <<- EOF
+ #if !($check_cpp_if)
+ fail
+ #endif
+ EOF
+ )
+ if [ "$res" != "" ]; then
+ disable "$test_name" "$file"
+ return 3
+ fi
+ fi
! if [ -z "$vquiet" ]; then
echo " TEST $test_name ($file)"
+ fi
! verbose "Using command : $(echo "$@")"
# grab the expected exit value
expected_exit_value=$check_exit_value
verbose "Expecting exit value: $expected_exit_value"
# do we want a timeout?
+ pre_cmd=""
if [ $check_timeout -ne 0 ]; then
! pre_cmd="timeout -k 1s $check_timeout"
fi
+ shift
+ # launch the test command and
# grab the actual output & exit value
! eval $pre_cmd $default_path/$base_cmd $default_args "$@" \
! 1> $file.output.got 2> $file.error.got
actual_exit_value=$?
must_fail=$check_known_to_fail
[ $must_fail -eq 1 ] && [ $V -eq 0 ] && quiet=1
known_ko_tests=$(($known_ko_tests + $must_fail))
! for stream in error output; do
eval ignore=\$check_${stream}_ignore
[ $ignore -eq 1 ] && continue
# grab the expected output
sed -n "/check-$stream-start/,/check-$stream-end/p" $file \
*** 252,294 ****
test_failed=1
fi
# verify the 'check-output-contains/excludes' tags
if [ $check_output_contains -eq 1 ]; then
! has_each_patterns "$file" 'check-output-contains' $file.output.got
if [ "$?" -ne "0" ]; then
- error "Actual output doesn't contain some of the expected patterns."
test_failed=1
fi
fi
if [ $check_output_excludes -eq 1 ]; then
! has_none_patterns "$file" 'check-output-excludes' $file.output.got
if [ "$?" -ne "0" ]; then
- error "Actual output contains some patterns which are not expected."
test_failed=1
fi
fi
if [ $check_output_pattern -eq 1 ]; then
! # verify the 'check-output-pattern-X-times' tags
! nbr_patterns "$file" 'check-output-pattern' $file.output.got
if [ "$?" -ne "0" ]; then
- error "Actual output doesn't contain the pattern the expected number."
test_failed=1
fi
fi
- [ "$test_failed" -eq "$must_fail" ] || failed=1
-
if [ "$must_fail" -eq "1" ]; then
if [ "$test_failed" -eq "1" ]; then
! echo "info: test '$file' is known to fail"
else
! echo "error: test '$file' is known to fail but succeed!"
! test_failed=1
fi
fi
if [ "$test_failed" -eq "1" ]; then
ko_tests=$(($ko_tests + 1))
else
ok_tests=$(($ok_tests + 1))
rm -f $file.{error,output}.{expected,got,diff}
--- 375,425 ----
test_failed=1
fi
# verify the 'check-output-contains/excludes' tags
if [ $check_output_contains -eq 1 ]; then
! has_each_patterns "$file" 'check-output-contains' absent $file.output.got
if [ "$?" -ne "0" ]; then
test_failed=1
fi
fi
if [ $check_output_excludes -eq 1 ]; then
! has_none_patterns "$file" 'check-output-excludes' present $file.output.got
if [ "$?" -ne "0" ]; then
test_failed=1
fi
fi
if [ $check_output_pattern -eq 1 ]; then
! # verify the 'check-output-pattern(...)' tags
! minmax_patterns "$file" 'check-output-pattern' $file.output.got
if [ "$?" -ne "0" ]; then
test_failed=1
fi
fi
if [ "$must_fail" -eq "1" ]; then
if [ "$test_failed" -eq "1" ]; then
! [ -z "$vquiet" ] && \
! echo "info: XFAIL: test '$file' is known to fail"
else
! echo "error: XPASS: test '$file' is known to fail but succeed!"
fi
+ else
+ if [ "$test_failed" -eq "1" ]; then
+ echo "error: FAIL: test '$file' failed"
+ else
+ [ "$V" -ne "0" ] && \
+ echo "info: PASS: test '$file' passed"
fi
+ fi
+ if [ "$test_failed" -ne "$must_fail" ]; then
+ [ $abort -eq 1 ] && exit 1
+ test_failed=1
+ failed=1
+ fi
+
if [ "$test_failed" -eq "1" ]; then
ko_tests=$(($ko_tests + 1))
else
ok_tests=$(($ok_tests + 1))
rm -f $file.{error,output}.{expected,got,diff}
*** 300,349 ****
{
for i in $tests_list; do
do_test "$i"
done
# prints some numbers
tests_nr=$(($ok_tests + $ko_tests))
! echo -n "Out of $tests_nr tests, $ok_tests passed, $ko_tests failed"
! echo " ($known_ko_tests of them are known to fail)"
if [ "$unhandled_tests" -ne "0" ]; then
! echo "$unhandled_tests tests could not be handled by $prog_name"
fi
if [ "$disabled_tests" -ne "0" ]; then
! echo "$disabled_tests tests were disabled"
fi
}
##
! # do_format(file[, name[, cmd]]) - helps a test writer to format test-suite tags
do_format()
{
! if [ -z "$2" ]; then
! fname="$1"
! fcmd=$default_cmd
! elif [ -z "$3" ]; then
fname="$2"
! fcmd=$default_cmd
! else
! fname="$2"
fcmd="$3"
! fi
! file="$1"
cmd=`eval echo $default_path/$fcmd`
$cmd 1> $file.output.got 2> $file.error.got
fexit_value=$?
cat <<_EOF
/*
* check-name: $fname
_EOF
if [ "$fcmd" != "$default_cmd" ]; then
echo " * check-command: $fcmd"
fi
if [ "$fexit_value" -ne "0" ]; then
echo " * check-exit-value: $fexit_value"
fi
for stream in output error; do
if [ -s "$file.$stream.got" ]; then
echo " *"
echo " * check-$stream-start"
cat "$file.$stream.got"
--- 431,532 ----
{
for i in $tests_list; do
do_test "$i"
done
+ OK=OK
+ [ $failed -eq 0 ] || OK=KO
+
# prints some numbers
tests_nr=$(($ok_tests + $ko_tests))
! echo "$OK: out of $tests_nr tests, $ok_tests passed, $ko_tests failed"
! if [ "$known_ko_tests" -ne 0 ]; then
! echo " $known_ko_tests of them are known to fail"
! fi
if [ "$unhandled_tests" -ne "0" ]; then
! echo " $unhandled_tests tests could not be handled by $prog_name"
fi
if [ "$disabled_tests" -ne "0" ]; then
! echo " $disabled_tests tests were disabled"
fi
}
##
! do_format_help() {
! echo "Usage: $prog_name [option(s)] [--]format file [name [cmd]]"
! echo
! echo "options:"
! echo " -a append the created test to the input file"
! echo " -f write a test known to fail"
! echo " -l write a test for linearized code"
! echo
! echo "argument(s):"
! echo " file file containing the test case(s)"
! echo " name name for the test case (defaults to file)"
! echo " cmd command to be used (defaults to 'sparse \$file')"
! }
!
! ##
! # do_format([options,] file[, name[, cmd]]) - helps a test writer to format test-suite tags
do_format()
{
! def_cmd="$default_cmd"
! append=0
! linear=0
! fail=0
!
! while [ $# -gt 1 ] ; do
! case "$1" in
! -a)
! append=1 ;;
! -f)
! fail=1 ;;
! -l)
! def_cmd='test-linearize -Wno-decl $file'
! linear=1 ;;
! help|-*)
! do_format_help
! return 0
! ;;
! *) break ;;
! esac
! shift
! continue
! done
!
! arg_file "$1" || return 1
!
! file="$1"
fname="$2"
! [ -z "$fname" ] && fname="$(basename "$1" .c)"
fcmd="$3"
! [ -z "$fcmd" ] && fcmd="$def_cmd"
!
cmd=`eval echo $default_path/$fcmd`
$cmd 1> $file.output.got 2> $file.error.got
fexit_value=$?
+ [ $append != 0 ] && exec >> $file
cat <<_EOF
+
/*
* check-name: $fname
_EOF
if [ "$fcmd" != "$default_cmd" ]; then
echo " * check-command: $fcmd"
fi
if [ "$fexit_value" -ne "0" ]; then
echo " * check-exit-value: $fexit_value"
fi
+ if [ $fail != 0 ]; then
+ echo " * check-known-to-fail"
+ fi
+ if [ $linear != 0 ]; then
+ echo ' *'
+ echo ' * check-output-ignore'
+ echo ' * check-output-contains: xyz\\\\.'
+ echo ' * check-output-excludes: \\\\.'
+ fi
for stream in output error; do
if [ -s "$file.$stream.got" ]; then
echo " *"
echo " * check-$stream-start"
cat "$file.$stream.got"
*** 352,396 ****
done
echo " */"
return 0
}
! ##
! # arg_file(filename) - checks if filename exists
! arg_file()
! {
! [ -z "$1" ] && {
! do_usage
! exit 1
! }
! [ -e "$1" ] || {
! error "Can't open file $1"
! exit 1
! }
! return 0
! }
! case "$1" in
! '')
! do_test_suite
;;
! single)
arg_file "$2"
do_test "$2"
case "$?" in
0) echo "$2 passed !";;
1) echo "$2 failed !";;
2) echo "$2 can't be handled by $prog_name";;
esac
;;
! format)
! arg_file "$2"
! do_format "$2" "$3" "$4"
;;
! help | *)
do_usage
exit 1
;;
- esac
exit $failed
--- 535,596 ----
done
echo " */"
return 0
}
! ## allow flags from environment
! set -- $SPARSE_TEST_FLAGS "$@"
! ## process the flags
! while [ "$#" -gt "0" ]; do
! case "$1" in
! -a|--abort)
! abort=1
;;
! -q|--quiet)
! vquiet=1
! ;;
! --args=*)
! default_args="${1#--args=}";
! ;;
!
! single|--single)
arg_file "$2"
do_test "$2"
case "$?" in
0) echo "$2 passed !";;
1) echo "$2 failed !";;
2) echo "$2 can't be handled by $prog_name";;
esac
+ exit $failed
;;
! format|--format)
! shift
! do_format "$@"
! exit 0
;;
! help)
do_usage
exit 1
;;
+ *.c|*.cdoc)
+ tests_list="$tests_list $1"
+ ;;
+ *)
+ if [ ! -d "$1" ]; then
+ do_usage
+ exit 1
+ fi
+ tests_list="$tests_list $(find "$1" -name '*.c' | sort)"
+ ;;
+ esac
+ shift
+ done
+
+ if [ -z "$tests_list" ]; then
+ tests_list=`find . -name '*.c' | sed -e 's#^\./\(.*\)#\1#' | sort`
+ fi
+
+ do_test_suite
exit $failed