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} 14*80a579ceSSatish Balayif test -n "${runfiles}"; then 15*80a579ceSSatish Balay for runfile in ${runfiles}; do 16*80a579ceSSatish Balay subdir=`dirname ${runfile}` 17*80a579ceSSatish Balay mkdir -p ${rundir}/${subdir} 18*80a579ceSSatish Balay cp -r ${runfile} ${rundir}/${subdir} 19*80a579ceSSatish 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 430a091e3eSScott Kruger -t ................ Override the default timeout (default=$TIMEOUT sec) 44b047ed2bSScott Kruger -V ................ run Valgrind 4529921a8fSScott Kruger -v ................ Verbose: Print commands 4629921a8fSScott KrugerEOF 4729921a8fSScott Kruger 4829921a8fSScott Kruger if declare -f extrausage > /dev/null; then extrausage; fi 4929921a8fSScott Kruger exit $1 5029921a8fSScott Kruger} 5129921a8fSScott Kruger### 5229921a8fSScott Kruger## Arguments for overriding things 5329921a8fSScott Kruger# 5429921a8fSScott Krugerverbose=false 5529921a8fSScott Krugercleanup=false 56e53dc769SScott Krugerdebugger=false 572f2809e3SToby Isaacforce=false 58d4417257SScott Krugerdiff_flags="" 59f50802fbSScott Krugerwhile getopts "a:cde:fhjJ:mMn:t:vV" arg 6029921a8fSScott Krugerdo 6129921a8fSScott Kruger case $arg in 62ba2c5286SScott Kruger a ) args="$OPTARG" ;; 6329921a8fSScott Kruger c ) cleanup=true ;; 64e53dc769SScott Kruger d ) debugger=true ;; 65ba2c5286SScott Kruger e ) extra_args="$OPTARG" ;; 662f2809e3SToby Isaac f ) force=true ;; 6729921a8fSScott Kruger h ) print_usage; exit ;; 68ba2c5286SScott Kruger n ) nsize="$OPTARG" ;; 69ba2c5286SScott Kruger j ) diff_flags="-j" ;; 70ba2c5286SScott Kruger J ) diff_flags="-J $OPTARG" ;; 71ba2c5286SScott Kruger m ) diff_flags="-m" ;; 72f50802fbSScott Kruger M ) diff_flags="-M" ;; 730a091e3eSScott Kruger t ) TIMEOUT=$OPTARG ;; 74b047ed2bSScott Kruger V ) mpiexec="petsc_mpiexec_valgrind $mpiexec" ;; 7529921a8fSScott Kruger v ) verbose=true ;; 7629921a8fSScott Kruger *) # To take care of any extra args 7729921a8fSScott Kruger if test -n "$OPTARG"; then 7829921a8fSScott Kruger eval $arg=\"$OPTARG\" 7929921a8fSScott Kruger else 8029921a8fSScott Kruger eval $arg=found 8129921a8fSScott Kruger fi 8229921a8fSScott Kruger ;; 8329921a8fSScott Kruger esac 8429921a8fSScott Krugerdone 8529921a8fSScott Krugershift $(( $OPTIND - 1 )) 8629921a8fSScott Kruger 870a091e3eSScott Kruger# Individual tests can extend the default 880a091e3eSScott KrugerTIMEOUT=$((TIMEOUT*timeoutfactor)) 89bbf1c217SScott KrugerSTARTTIME=`date +%s` 900a091e3eSScott Kruger 9129921a8fSScott Krugerif test -n "$extra_args"; then 9229921a8fSScott Kruger args="$args $extra_args" 9329921a8fSScott Krugerfi 94e53dc769SScott Krugerif $debugger; then 95e53dc769SScott Kruger args="-start_in_debugger $args" 96e53dc769SScott Krugerfi 97e53dc769SScott Kruger 9829921a8fSScott Kruger 9929921a8fSScott Kruger# Init 10029921a8fSScott Krugersuccess=0; failed=0; failures=""; rmfiles="" 10129921a8fSScott Krugertotal=0 10229921a8fSScott Krugertodo=-1; skip=-1 1030a091e3eSScott Krugerjob_level=0 10429921a8fSScott Kruger 10529921a8fSScott Krugerfunction petsc_testrun() { 10629921a8fSScott Kruger # First arg = Basic command 10729921a8fSScott Kruger # Second arg = stdout file 10829921a8fSScott Kruger # Third arg = stderr file 10929921a8fSScott Kruger # Fourth arg = label for reporting 11029921a8fSScott Kruger # Fifth arg = Filter 11129921a8fSScott Kruger rmfiles="${rmfiles} $2 $3" 11229921a8fSScott Kruger tlabel=$4 11329921a8fSScott Kruger filter=$5 1140a091e3eSScott Kruger job_control=true 11529921a8fSScott Kruger cmd="$1 > $2 2> $3" 1160a091e3eSScott Kruger if test -n "$filter"; then 1171b548e17SScott Kruger if test "${filter:0:6}"=="Error:"; then 1180a091e3eSScott Kruger job_control=false # redirection error method causes job control probs 1191b548e17SScott Kruger filter=${filter##Error:} 120fb2b1c94SScott Kruger cmd="$1 2>&1 | cat > $2" 12129921a8fSScott Kruger fi 1221b548e17SScott Kruger fi 1231263882eSScott Kruger echo "$cmd" > ${tlabel}.sh; chmod 755 ${tlabel}.sh 1247a853109SScott Kruger 1250a091e3eSScott Kruger if $job_control; then 1260a091e3eSScott Kruger # The action: 1270a091e3eSScott Kruger eval "($cmd) &" 1280a091e3eSScott Kruger pid=$! 1290a091e3eSScott Kruger # Put a watcher process in that will kill a job that exceeds limit 130c173c275SScott Kruger $config_dir/watchtime.sh $pid $TIMEOUT & 1310a091e3eSScott Kruger watcher=$! 1320a091e3eSScott Kruger 1330a091e3eSScott Kruger # See if the job we want finishes 1340a091e3eSScott Kruger wait $pid 2> /dev/null 1350a091e3eSScott Kruger cmd_res=$? 1360a091e3eSScott Kruger if ps -p $watcher > /dev/null; then 1370a091e3eSScott Kruger # Keep processes tidy by killing watcher 1386ff014a0SScott Kruger pkill -13 -P $watcher 1390a091e3eSScott Kruger wait $watcher 2>/dev/null # Wait used here to capture the kill message 1400a091e3eSScott Kruger else 1410a091e3eSScott Kruger # Timeout 1420a091e3eSScott Kruger cmd_res=1 1430a091e3eSScott Kruger echo "Exceeded timeout limit of $TIMEOUT s" > $3 1440a091e3eSScott Kruger fi 1450a091e3eSScott Kruger else 1460a091e3eSScott Kruger # The action -- assume no timeout needed 1471263882eSScott Kruger eval "$cmd" 1480a091e3eSScott Kruger # We are testing error codes so just make it pass 1490a091e3eSScott Kruger cmd_res=0 1500a091e3eSScott Kruger fi 1510a091e3eSScott Kruger 1520a091e3eSScott Kruger # Handle filters separately and assume no timeout check needed 1530a091e3eSScott Kruger if test -n "$filter"; then 1540a091e3eSScott Kruger cmd="cat $2 | $filter > $2.tmp 2>> $3 && mv $2.tmp $2" 1551263882eSScott Kruger echo "$cmd" >> ${tlabel}.sh 1560a091e3eSScott Kruger eval "$cmd" 1570a091e3eSScott Kruger fi 1580a091e3eSScott Kruger 1590a091e3eSScott Kruger # Report errors 1607a853109SScott Kruger if test $cmd_res == 0; then 16102afe9ecSJed Brown if "${verbose}"; then 1620a091e3eSScott Kruger printf "ok $tlabel $cmd\n" | tee -a ${testlogfile} 16302afe9ecSJed Brown else 1640a091e3eSScott Kruger printf "ok $tlabel\n" | tee -a ${testlogfile} 16502afe9ecSJed Brown fi 16629921a8fSScott Kruger let success=$success+1 16729921a8fSScott Kruger else 16864ca018dSScott Kruger if "${verbose}"; then 1690a091e3eSScott Kruger printf "not ok $tlabel $cmd\n" | tee -a ${testlogfile} 17064ca018dSScott Kruger else 1710a091e3eSScott Kruger printf "not ok $tlabel\n" | tee -a ${testlogfile} 17264ca018dSScott Kruger fi 1737be205c7SScott Kruger # We've had tests fail but stderr->stdout. Fix with this test. 1747be205c7SScott Kruger if test -s $3; then 1750a091e3eSScott Kruger awk '{print "#\t" $0}' < $3 | tee -a ${testlogfile} 1767be205c7SScott Kruger else 1777be205c7SScott Kruger awk '{print "#\t" $0}' < $2 | tee -a ${testlogfile} 1787be205c7SScott Kruger fi 17929921a8fSScott Kruger let failed=$failed+1 18029921a8fSScott Kruger failures="$failures $tlabel" 18129921a8fSScott Kruger fi 18229921a8fSScott Kruger let total=$success+$failed 1837a853109SScott Kruger return $cmd_res 18429921a8fSScott Kruger} 18529921a8fSScott Kruger 18629921a8fSScott Krugerfunction petsc_testend() { 18729921a8fSScott Kruger logfile=$1/counts/${label}.counts 18829921a8fSScott Kruger logdir=`dirname $logfile` 18929921a8fSScott Kruger if ! test -d "$logdir"; then 19029921a8fSScott Kruger mkdir -p $logdir 19129921a8fSScott Kruger fi 19229921a8fSScott Kruger if ! test -e "$logfile"; then 19329921a8fSScott Kruger touch $logfile 19429921a8fSScott Kruger fi 19529921a8fSScott Kruger printf "total $total\n" > $logfile 19629921a8fSScott Kruger printf "success $success\n" >> $logfile 19729921a8fSScott Kruger printf "failed $failed\n" >> $logfile 19829921a8fSScott Kruger printf "failures $failures\n" >> $logfile 19929921a8fSScott Kruger if test ${todo} -gt 0; then 20029921a8fSScott Kruger printf "todo $todo\n" >> $logfile 20129921a8fSScott Kruger fi 20229921a8fSScott Kruger if test ${skip} -gt 0; then 20329921a8fSScott Kruger printf "skip $skip\n" >> $logfile 20429921a8fSScott Kruger fi 205bbf1c217SScott Kruger ENDTIME=`date +%s` 206bbf1c217SScott Kruger printf "time $(($ENDTIME - $STARTTIME))\n" >> $logfile 20729921a8fSScott Kruger if $cleanup; then 20829921a8fSScott Kruger echo "Cleaning up" 20929921a8fSScott Kruger /bin/rm -f $rmfiles 21029921a8fSScott Kruger fi 21129921a8fSScott Kruger} 212296e37cfSJed Brown 21326646c0bSSatish Balayfunction petsc_mpiexec_valgrind() { 21426646c0bSSatish Balay mpiexec=$1;shift 21526646c0bSSatish Balay npopt=$1;shift 21626646c0bSSatish Balay np=$1;shift 21726646c0bSSatish Balay 218c173c275SScott Kruger valgrind="valgrind -q --tool=memcheck --leak-check=yes --num-callers=20 --track-origins=yes --suppressions=$petsc_bindir/maint/petsc-val.supp" 219c173c275SScott Kruger 22026646c0bSSatish Balay $mpiexec $npopt $np $valgrind $* 22126646c0bSSatish Balay} 222296e37cfSJed Brownexport LC_ALL=C 223