129921a8fSScott Kruger 229921a8fSScott Kruger 329921a8fSScott Krugerscriptname=`basename $0` 429921a8fSScott Krugerrundir=${scriptname%.sh} 534929e0eSSatish BalayTIMEOUT=60 629921a8fSScott Kruger 729921a8fSScott Krugerif test "$PWD"!=`dirname $0`; then 829921a8fSScott Kruger cd `dirname $0` 929921a8fSScott Krugerfi 106c91caf2SScott Krugerif test -d "${rundir}" && test -n "${rundir}"; then 1147e61e69SScott Kruger rm -f ${rundir}/*.tmp ${rundir}/*.err ${rundir}/*.out 126c91caf2SScott Krugerfi 1329921a8fSScott Krugermkdir -p ${rundir} 1480a579ceSSatish Balayif test -n "${runfiles}"; then 1580a579ceSSatish Balay for runfile in ${runfiles}; do 1680a579ceSSatish Balay subdir=`dirname ${runfile}` 1780a579ceSSatish Balay mkdir -p ${rundir}/${subdir} 1880a579ceSSatish Balay cp -r ${runfile} ${rundir}/${subdir} 1980a579ceSSatish Balay done 20d7871bd4SScott Krugerfi 2129921a8fSScott Krugercd ${rundir} 2229921a8fSScott Kruger 2329921a8fSScott Kruger# 2429921a8fSScott Kruger# Method to print out general and script specific options 2529921a8fSScott Kruger# 2629921a8fSScott Krugerprint_usage() { 2729921a8fSScott Kruger 2829921a8fSScott Krugercat >&2 <<EOF 2929921a8fSScott KrugerUsage: $0 [options] 3029921a8fSScott Kruger 3129921a8fSScott KrugerOPTIONS 3229921a8fSScott Kruger -a <args> ......... Override default arguments 3329921a8fSScott Kruger -c <cleanup> ...... Cleanup (remove generated files) 34e53dc769SScott Kruger -d ................ Launch in debugger 3529921a8fSScott Kruger -e <args> ......... Add extra arguments to default 362f2809e3SToby Isaac -f ................ force attempt to run test that would otherwise be skipped 3729921a8fSScott Kruger -h ................ help: print this message 3829921a8fSScott Kruger -n <integer> ...... Override the number of processors to use 39ba2c5286SScott Kruger -j ................ Pass -j to petscdiff (just use diff) 40ba2c5286SScott Kruger -J <arg> .......... Pass -J to petscdiff (just use diff with arg) 41ba2c5286SScott Kruger -m ................ Update results using petscdiff 42f50802fbSScott Kruger -M ................ Update alt files using petscdiff 43*5e361860SScott Kruger -o <arg> .......... Output format: 'interactive', 'err_only' 440a091e3eSScott Kruger -t ................ Override the default timeout (default=$TIMEOUT sec) 45b047ed2bSScott Kruger -V ................ run Valgrind 4629921a8fSScott Kruger -v ................ Verbose: Print commands 4729921a8fSScott KrugerEOF 4829921a8fSScott Kruger 4929921a8fSScott Kruger if declare -f extrausage > /dev/null; then extrausage; fi 5029921a8fSScott Kruger exit $1 5129921a8fSScott Kruger} 5229921a8fSScott Kruger### 5329921a8fSScott Kruger## Arguments for overriding things 5429921a8fSScott Kruger# 55*5e361860SScott Krugeroutput_fmt="interactive" 5629921a8fSScott Krugerverbose=false 5729921a8fSScott Krugercleanup=false 58e53dc769SScott Krugerdebugger=false 592f2809e3SToby Isaacforce=false 60d4417257SScott Krugerdiff_flags="" 61*5e361860SScott Krugerwhile getopts "a:cde:fhjJ:mMn:o:t:vV" arg 6229921a8fSScott Krugerdo 6329921a8fSScott Kruger case $arg in 64ba2c5286SScott Kruger a ) args="$OPTARG" ;; 6529921a8fSScott Kruger c ) cleanup=true ;; 66e53dc769SScott Kruger d ) debugger=true ;; 67ba2c5286SScott Kruger e ) extra_args="$OPTARG" ;; 682f2809e3SToby Isaac f ) force=true ;; 6929921a8fSScott Kruger h ) print_usage; exit ;; 70ba2c5286SScott Kruger n ) nsize="$OPTARG" ;; 71ba2c5286SScott Kruger j ) diff_flags="-j" ;; 72ba2c5286SScott Kruger J ) diff_flags="-J $OPTARG" ;; 73ba2c5286SScott Kruger m ) diff_flags="-m" ;; 74f50802fbSScott Kruger M ) diff_flags="-M" ;; 75*5e361860SScott Kruger o ) output_fmt=$OPTARG ;; 760a091e3eSScott Kruger t ) TIMEOUT=$OPTARG ;; 77b047ed2bSScott Kruger V ) mpiexec="petsc_mpiexec_valgrind $mpiexec" ;; 7829921a8fSScott Kruger v ) verbose=true ;; 7929921a8fSScott Kruger *) # To take care of any extra args 8029921a8fSScott Kruger if test -n "$OPTARG"; then 8129921a8fSScott Kruger eval $arg=\"$OPTARG\" 8229921a8fSScott Kruger else 8329921a8fSScott Kruger eval $arg=found 8429921a8fSScott Kruger fi 8529921a8fSScott Kruger ;; 8629921a8fSScott Kruger esac 8729921a8fSScott Krugerdone 8829921a8fSScott Krugershift $(( $OPTIND - 1 )) 8929921a8fSScott Kruger 900a091e3eSScott Kruger# Individual tests can extend the default 9175ea7643SJed Brownexport MPIEXEC_TIMEOUT=$((TIMEOUT*timeoutfactor)) 92bbf1c217SScott KrugerSTARTTIME=`date +%s` 930a091e3eSScott Kruger 9429921a8fSScott Krugerif test -n "$extra_args"; then 9529921a8fSScott Kruger args="$args $extra_args" 9629921a8fSScott Krugerfi 97e53dc769SScott Krugerif $debugger; then 98e53dc769SScott Kruger args="-start_in_debugger $args" 99e53dc769SScott Krugerfi 100e53dc769SScott Kruger 10129921a8fSScott Kruger 10229921a8fSScott Kruger# Init 10329921a8fSScott Krugersuccess=0; failed=0; failures=""; rmfiles="" 10429921a8fSScott Krugertotal=0 10529921a8fSScott Krugertodo=-1; skip=-1 1060a091e3eSScott Krugerjob_level=0 10729921a8fSScott Kruger 108*5e361860SScott Krugerfunction petsc_report_tapoutput() { 109*5e361860SScott Kruger notornot=$1 110*5e361860SScott Kruger test_label=$2 111*5e361860SScott Kruger comment=$3 112*5e361860SScott Kruger if test -n "$comment"; then 113*5e361860SScott Kruger comment=" # ${comment}" 114*5e361860SScott Kruger fi 115*5e361860SScott Kruger 116*5e361860SScott Kruger tap_message="${notornot} ok ${test_label}${comment}" 117*5e361860SScott Kruger 118*5e361860SScott Kruger # Log messages 119*5e361860SScott Kruger printf "${tap_message}\n" >> ${testlogtapfile} 120*5e361860SScott Kruger 121*5e361860SScott Kruger if test ${output_fmt} == "err_only"; then 122*5e361860SScott Kruger if test -n "${notornot}"; then 123*5e361860SScott Kruger printf "${tap_message}\n" | tee -a ${testlogerrfile} 124*5e361860SScott Kruger fi 125*5e361860SScott Kruger else 126*5e361860SScott Kruger printf "${tap_message}\n" 127*5e361860SScott Kruger fi 128*5e361860SScott Kruger} 129*5e361860SScott Kruger 13029921a8fSScott Krugerfunction petsc_testrun() { 13129921a8fSScott Kruger # First arg = Basic command 13229921a8fSScott Kruger # Second arg = stdout file 13329921a8fSScott Kruger # Third arg = stderr file 13429921a8fSScott Kruger # Fourth arg = label for reporting 13529921a8fSScott Kruger # Fifth arg = Filter 13629921a8fSScott Kruger rmfiles="${rmfiles} $2 $3" 13729921a8fSScott Kruger tlabel=$4 13829921a8fSScott Kruger filter=$5 13929921a8fSScott Kruger cmd="$1 > $2 2> $3" 1400a091e3eSScott Kruger if test -n "$filter"; then 1411b548e17SScott Kruger if test "${filter:0:6}"=="Error:"; then 1421b548e17SScott Kruger filter=${filter##Error:} 143fb2b1c94SScott Kruger cmd="$1 2>&1 | cat > $2" 14429921a8fSScott Kruger fi 1451b548e17SScott Kruger fi 1461263882eSScott Kruger echo "$cmd" > ${tlabel}.sh; chmod 755 ${tlabel}.sh 1477a853109SScott Kruger 148d8e31410SScott Kruger eval "{ time -p $cmd ; } 2>> timing.out" 149679e9f5cSJed Brown cmd_res=$? 1500da08ecbSSatish Balay touch "$2" "$3" 151984117c4SJed Brown # ETIMEDOUT=110 on most systems (used by Open MPI 3.0). MPICH uses 152984117c4SJed Brown # 255. Earlier Open MPI returns 1 but outputs about MPIEXEC_TIMEOUT. 1537c0e31c5SScott Kruger if [ $cmd_res -eq 110 -o $cmd_res -eq 255 ] || \ 15448237715SSatish Balay fgrep -q -s 'APPLICATION TIMED OUT' "$2" "$3" || \ 1558fb2ab26SSatish Balay fgrep -q -s MPIEXEC_TIMEOUT "$2" "$3" || \ 1568fb2ab26SSatish Balay fgrep -q -s 'APPLICATION TERMINATED WITH THE EXIT STRING: job ending due to timeout' "$2" "$3" || \ 1578fb2ab26SSatish Balay grep -q -s "Timeout after [0-9]* seconds. Terminating job" "$2" "$3"; then 158984117c4SJed Brown timed_out=1 1597c0e31c5SScott Kruger # If timed out, then ensure non-zero error code 1607c0e31c5SScott Kruger if [ $cmd_res -eq 0 ]; then 1617c0e31c5SScott Kruger cmd_res=1 1627c0e31c5SScott Kruger fi 163984117c4SJed Brown fi 1640a091e3eSScott Kruger 1650a091e3eSScott Kruger # Handle filters separately and assume no timeout check needed 1660a091e3eSScott Kruger if test -n "$filter"; then 167a755a26cSJunchao Zhang cmd="cat $2 | $filter > $2.tmp 2>> $3 ; mv $2.tmp $2" 1681263882eSScott Kruger echo "$cmd" >> ${tlabel}.sh 1690a091e3eSScott Kruger eval "$cmd" 1700a091e3eSScott Kruger fi 1710a091e3eSScott Kruger 1720a091e3eSScott Kruger # Report errors 173*5e361860SScott Kruger comment="" 1747a853109SScott Kruger if test $cmd_res == 0; then 17502afe9ecSJed Brown if "${verbose}"; then 176*5e361860SScott Kruger comment="${cmd}" 17702afe9ecSJed Brown fi 178*5e361860SScott Kruger petsc_report_tapoutput "" "$tlabel" "$comment" 17929921a8fSScott Kruger let success=$success+1 18029921a8fSScott Kruger else 1814d9d3ee5SSatish Balay if [ -n "$timed_out" ]; then 182*5e361860SScott Kruger comment="Exceeded timeout limit of $MPIEXEC_TIMEOUT s" 1834d9d3ee5SSatish Balay else 184*5e361860SScott Kruger comment="Error code: ${cmd_res}" 18564ca018dSScott Kruger fi 186*5e361860SScott Kruger petsc_report_tapoutput "not" "$tlabel" "$comment" 187*5e361860SScott Kruger 188*5e361860SScott Kruger # Report errors in detail 189*5e361860SScott Kruger if [ -z "$timed_out" ]; then 1907be205c7SScott Kruger # We've had tests fail but stderr->stdout. Fix with this test. 1917be205c7SScott Kruger if test -s $3; then 192*5e361860SScott Kruger awk '{print "#\t" $0}' < $3 | tee -a ${testlogerrfile} 1937be205c7SScott Kruger else 194*5e361860SScott Kruger awk '{print "#\t" $0}' < $2 | tee -a ${testlogerrfile} 1957be205c7SScott Kruger fi 196984117c4SJed Brown fi 19729921a8fSScott Kruger let failed=$failed+1 19829921a8fSScott Kruger failures="$failures $tlabel" 19929921a8fSScott Kruger fi 20029921a8fSScott Kruger let total=$success+$failed 2017a853109SScott Kruger return $cmd_res 20229921a8fSScott Kruger} 20329921a8fSScott Kruger 20429921a8fSScott Krugerfunction petsc_testend() { 20529921a8fSScott Kruger logfile=$1/counts/${label}.counts 20629921a8fSScott Kruger logdir=`dirname $logfile` 20729921a8fSScott Kruger if ! test -d "$logdir"; then 20829921a8fSScott Kruger mkdir -p $logdir 20929921a8fSScott Kruger fi 21029921a8fSScott Kruger if ! test -e "$logfile"; then 21129921a8fSScott Kruger touch $logfile 21229921a8fSScott Kruger fi 21329921a8fSScott Kruger printf "total $total\n" > $logfile 21429921a8fSScott Kruger printf "success $success\n" >> $logfile 21529921a8fSScott Kruger printf "failed $failed\n" >> $logfile 21629921a8fSScott Kruger printf "failures $failures\n" >> $logfile 21729921a8fSScott Kruger if test ${todo} -gt 0; then 21829921a8fSScott Kruger printf "todo $todo\n" >> $logfile 21929921a8fSScott Kruger fi 22029921a8fSScott Kruger if test ${skip} -gt 0; then 22129921a8fSScott Kruger printf "skip $skip\n" >> $logfile 22229921a8fSScott Kruger fi 223bbf1c217SScott Kruger ENDTIME=`date +%s` 2249b757ad5SKarl Rupp timing=`touch timing.out && egrep '(user|sys)' timing.out | awk '{if( sum1 == "" || $2 > sum1 ) { sum1=sprintf("%.2f",$2) } ; sum2 += sprintf("%.2f",$2)} END {printf "%.2f %.2f\n",sum1,sum2}'` 225521be42fSScott Kruger printf "time $timing\n" >> $logfile 22629921a8fSScott Kruger if $cleanup; then 22729921a8fSScott Kruger echo "Cleaning up" 22829921a8fSScott Kruger /bin/rm -f $rmfiles 22929921a8fSScott Kruger fi 23029921a8fSScott Kruger} 231296e37cfSJed Brown 23226646c0bSSatish Balayfunction petsc_mpiexec_valgrind() { 23326646c0bSSatish Balay mpiexec=$1;shift 23426646c0bSSatish Balay npopt=$1;shift 23526646c0bSSatish Balay np=$1;shift 23626646c0bSSatish Balay 237c173c275SScott Kruger valgrind="valgrind -q --tool=memcheck --leak-check=yes --num-callers=20 --track-origins=yes --suppressions=$petsc_bindir/maint/petsc-val.supp" 238c173c275SScott Kruger 23926646c0bSSatish Balay $mpiexec $npopt $np $valgrind $* 24026646c0bSSatish Balay} 241296e37cfSJed Brownexport LC_ALL=C 242