| # Copyright (C) 2004 Andrew Beekhof <andrew@beekhof.net> |
| # |
| # This program is free software; you can redistribute it and/or |
| # modify it under the terms of the GNU General Public |
| # License as published by the Free Software Foundation; either |
| # version 2.1 of the License, or (at your option) any later version. |
| # |
| # This software is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| # General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public |
| # License along with this library; if not, write to the Free Software |
| # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| # |
| |
| verbose=0 |
| num_failed=0 |
| num_tests=0 |
| force_local=0 |
| VALGRIND_CMD="" |
| diff_opts="--ignore-all-space --ignore-blank-lines -u -N" |
| |
| if [ "x$0" = "x-bash" ]; then |
| test_home=@abs_top_builddir@/pengine |
| else |
| test_home=`dirname $0` |
| test_name=`basename $0` |
| fi |
| |
| function info() { |
| printf "$*\n" |
| } |
| |
| function error() { |
| printf " * ERROR: $*\n" |
| } |
| |
| function failed() { |
| printf " * FAILED: $*\n" |
| } |
| |
| function show_test() { |
| name=$1; shift |
| printf " Test %-25s $*\n" "$name:" |
| } |
| |
| info "Test home is:\t$test_home" |
| io_dir=$test_home/test10 |
| test_binary=@abs_top_builddir@/tools/crm_simulate |
| PCMK_schema_directory=@abs_top_builddir@/xml |
| |
| |
| failed=$test_home/.regression.failed.diff |
| single_test= |
| |
| while true ; do |
| case "$1" in |
| -V|--verbose) verbose=1; shift;; |
| -v|--valgrind) |
| export G_SLICE=always-malloc |
| VALGRIND_CMD="valgrind -q --gen-suppressions=all --log-file=%q{valgrind_output} --show-reachable=no --leak-check=full --trace-children=no --time-stamp=yes --num-callers=20 --suppressions=@datadir@/@PACKAGE@/tests/valgrind-pcmk.suppressions" |
| test_binary= |
| shift;; |
| --valgrind-dhat) |
| VALGRIND_CMD="valgrind --log-file=%q{valgrind_output} --show-top-n=100 --num-callers=4 --time-stamp=yes --trace-children=no --tool=exp-dhat" |
| test_binary= |
| shift;; |
| --valgrind-skip-output) |
| VALGRIND_SKIP_OUTPUT=1 |
| shift;; |
| --run) single_test="$2"; shift; shift; break;; |
| -b|--binary) test_binary=$2; PCMK_schema_directory=""; shift; shift;; |
| -i|--io-dir) io_dir=$2; shift; shift;; |
| -?|--help) echo "$0 [--binary name] [--force-local]"; shift; exit 0;; |
| --) shift ; break ;; |
| "") break;; |
| *) echo "unknown option: $1"; exit 1;; |
| esac |
| done |
| |
| if [ "x$test_binary" = "x" ]; then |
| test_binary=@sbindir@/crm_simulate |
| PCMK_schema_directory=@CRM_DTD_DIRECTORY@ |
| elif [ ! -x $test_binary ]; then |
| test_binary=@sbindir@/crm_simulate |
| PCMK_schema_directory=@CRM_DTD_DIRECTORY@ |
| fi |
| |
| export PCMK_schema_directory |
| |
| if [ "x$test_binary" = "x" ]; then |
| info "crm_simulate not installed. Aborting." |
| exit 1 |
| fi |
| |
| info "Test binary is:\t$test_binary" |
| info "Schema home is:\t$PCMK_schema_directory" |
| if [ "x$VALGRIND_CMD" != "x" ]; then |
| info "Activating memory testing with valgrind"; |
| fi |
| |
| info " " |
| |
| test_cmd="$VALGRIND_CMD $test_binary" |
| #echo $test_cmd |
| |
| if [ `whoami` != root ]; then |
| declare -x CIB_shadow_dir=/tmp |
| fi |
| |
| function do_test { |
| |
| did_fail=0 |
| expected_rc=0 |
| num_tests=`expr $num_tests + 1` |
| |
| base=$1; shift |
| name=$1; shift |
| |
| input=$io_dir/${base}.xml |
| output=$io_dir/${base}.out |
| expected=$io_dir/${base}.exp |
| |
| dot_png=$io_dir/${base}.png |
| dot_expected=$io_dir/${base}.dot |
| dot_output=$io_dir/${base}.pe.dot |
| |
| scores=$io_dir/${base}.scores |
| score_output=$io_dir/${base}.scores.pe |
| |
| stderr_expected=$io_dir/${base}.stderr |
| stderr_output=$io_dir/${base}.stderr.pe |
| |
| summary=$io_dir/${base}.summary |
| summary_output=$io_dir/${base}.summary.pe |
| |
| valgrind_output=$io_dir/${base}.valgrind |
| export valgrind_output |
| |
| if [ "x$1" = "x--rc" ]; then |
| expected_rc=$2 |
| shift; shift; |
| fi |
| |
| show_test "$base" "$name" |
| |
| if [ ! -f $input ]; then |
| error "No input"; |
| did_fail=1 |
| num_failed=`expr $num_failed + $did_fail` |
| return; |
| fi |
| |
| if [ "$create_mode" != "true" -a ! -f $expected ]; then |
| error "no stored output"; |
| # return; |
| fi |
| |
| # ../admin/crm_verify -X $input |
| if [ ! -z $single_test ]; then |
| echo CIB_shadow_dir=$io_dir $test_cmd -x $input -D $dot_output -G $output -S $* |
| CIB_shadow_dir=$io_dir $test_cmd -x $input -D $dot_output -G $output -S $* 2>&1 | tee $summary_output |
| else |
| CIB_shadow_dir=$io_dir $test_cmd -x $input -S &> $summary_output |
| fi |
| |
| CIB_shadow_dir=$io_dir $test_cmd -x $input -D $dot_output -G $output -SQ -s $* 2> $stderr_output > $score_output |
| rc=$? |
| |
| if [ $rc != $expected_rc ]; then |
| failed "Test returned: $rc"; |
| did_fail=1 |
| echo "CIB_shadow_dir=$io_dir $test_cmd -x $input -D $dot_output -G $output -SQ -s $*" |
| fi |
| |
| if [ -z "$VALGRIND_SKIP_OUTPUT" ]; then |
| if [ -s ${valgrind_output} ]; then |
| error "Valgrind reported errors"; |
| did_fail=1 |
| cat ${valgrind_output} |
| fi |
| rm -f ${valgrind_output} |
| fi |
| |
| if [ -s core ]; then |
| error "Core-file detected: core.${base}"; |
| did_fail=1 |
| rm -f $test_home/core.$base |
| mv core $test_home/core.$base |
| fi |
| |
| if [ -e $stderr_expected ]; then |
| |
| diff $diff_opts $stderr_expected $stderr_output >/dev/null |
| rc2=$? |
| if [ $rc2 != 0 ]; then |
| failed "stderr changed"; |
| diff $diff_opts $stderr_expected $stderr_output 2>/dev/null >> $failed |
| echo "" >> $failed |
| did_fail=1 |
| fi |
| |
| elif [ -s $stderr_output ]; then |
| error "Output was written to stderr" |
| did_fail=1 |
| cat $stderr_output |
| fi |
| rm -f $stderr_output |
| |
| if [ ! -s $output ]; then |
| error "No graph produced"; |
| did_fail=1 |
| num_failed=`expr $num_failed + $did_fail` |
| rm -f $output |
| return; |
| # else |
| # mv $output $output.sed |
| # cat $output.sed | sed 's/id=.[0-9]*.\ //g' >> $output |
| fi |
| |
| if [ ! -s $dot_output ]; then |
| error "No dot-file summary produced"; |
| did_fail=1 |
| num_failed=`expr $num_failed + $did_fail` |
| rm -f $output |
| return; |
| else |
| echo "digraph \"g\" {" > $dot_output.sort |
| LC_ALL=POSIX sort -u $dot_output | grep -v -e ^}$ -e digraph >> $dot_output.sort |
| echo "}" >> $dot_output.sort |
| mv -f $dot_output.sort $dot_output |
| fi |
| |
| if [ ! -s $score_output ]; then |
| error "No allocation scores produced"; |
| did_fail=1 |
| num_failed=`expr $num_failed + $did_fail` |
| rm $output |
| return; |
| else |
| LC_ALL=POSIX sort $score_output > $score_output.sorted |
| mv -f $score_output.sorted $score_output |
| fi |
| |
| if [ "$create_mode" = "true" ]; then |
| cp "$output" "$expected" |
| cp "$dot_output" "$dot_expected" |
| cp "$score_output" "$scores" |
| cp "$summary_output" "$summary" |
| info " Created expected outputs" |
| fi |
| |
| diff $diff_opts $summary $summary_output >/dev/null |
| rc2=$? |
| if [ $rc2 != 0 ]; then |
| failed "summary changed"; |
| diff $diff_opts $summary $summary_output 2>/dev/null >> $failed |
| echo "" >> $failed |
| did_fail=1 |
| fi |
| |
| diff $diff_opts $dot_expected $dot_output >/dev/null |
| rc=$? |
| if [ $rc != 0 ]; then |
| failed "dot-file summary changed"; |
| diff $diff_opts $dot_expected $dot_output 2>/dev/null >> $failed |
| echo "" >> $failed |
| did_fail=1 |
| else |
| rm -f $dot_output |
| fi |
| |
| sed -i -e 's/crm_feature_set="[^"]*"//' -e 's/batch-limit="[0-9]*"//' $expected $output |
| diff $diff_opts $expected $output >/dev/null |
| rc2=$? |
| if [ $rc2 != 0 ]; then |
| failed "xml-file changed"; |
| diff $diff_opts $expected $output 2>/dev/null >> $failed |
| echo "" >> $failed |
| did_fail=1 |
| fi |
| |
| diff $diff_opts $scores $score_output >/dev/null |
| rc=$? |
| if [ $rc != 0 ]; then |
| failed "scores-file changed"; |
| diff $diff_opts $scores $score_output 2>/dev/null >> $failed |
| echo "" >> $failed |
| did_fail=1 |
| fi |
| rm -f $output $score_output $summary_output |
| num_failed=`expr $num_failed + $did_fail` |
| } |
| |
| function test_results { |
| if [ $num_failed != 0 ]; then |
| if [ -s $failed ]; then |
| if [ "$verbose" = "1" ]; then |
| error "Results of $num_failed failed tests (out of $num_tests)...." |
| cat $failed |
| else |
| error "Results of $num_failed failed tests (out of $num_tests) are in $failed...." |
| error "Use $0 -V to display them automatically." |
| fi |
| else |
| error "$num_failed (of $num_tests) tests failed (no diff results)" |
| rm $failed |
| fi |
| fi |
| exit $num_failed |
| } |
| |
| if [ -z $single_test ]; then |
| # zero out the error log |
| > $failed |
| else |
| failed=.single |
| > $failed |
| do_test $single_test "Single shot" $* |
| cat $failed |
| exit $? |
| fi |