129921a8fSScott Kruger 229921a8fSScott Kruger 329921a8fSScott Krugerscriptname=`basename $0` 429921a8fSScott Krugerrundir=${scriptname%.sh} 5*0a091e3eSScott KrugerTIMEOUT=60 629921a8fSScott Kruger 729921a8fSScott Krugerif test "$PWD"!=`dirname $0`; then 829921a8fSScott Kruger cd `dirname $0` 929921a8fSScott Krugerfi 1029921a8fSScott Krugermkdir -p ${rundir} 11d7871bd4SScott Krugerif test -n "${runfiles}"; then 122666df57SScott Kruger cp ${runfiles} ${rundir} 13d7871bd4SScott Krugerfi 1429921a8fSScott Krugercd ${rundir} 1529921a8fSScott Kruger 1629921a8fSScott Kruger# 1729921a8fSScott Kruger# Method to print out general and script specific options 1829921a8fSScott Kruger# 1929921a8fSScott Krugerprint_usage() { 2029921a8fSScott Kruger 2129921a8fSScott Krugercat >&2 <<EOF 2229921a8fSScott KrugerUsage: $0 [options] 2329921a8fSScott Kruger 2429921a8fSScott KrugerOPTIONS 2529921a8fSScott Kruger -a <args> ......... Override default arguments 2629921a8fSScott Kruger -c <cleanup> ...... Cleanup (remove generated files) 27e53dc769SScott Kruger -d ................ Launch in debugger 2829921a8fSScott Kruger -e <args> ......... Add extra arguments to default 292f2809e3SToby Isaac -f ................ force attempt to run test that would otherwise be skipped 3029921a8fSScott Kruger -h ................ help: print this message 3129921a8fSScott Kruger -n <integer> ...... Override the number of processors to use 32ba2c5286SScott Kruger -j ................ Pass -j to petscdiff (just use diff) 33ba2c5286SScott Kruger -J <arg> .......... Pass -J to petscdiff (just use diff with arg) 34ba2c5286SScott Kruger -m ................ Update results using petscdiff 35*0a091e3eSScott Kruger -t ................ Override the default timeout (default=$TIMEOUT sec) 36b047ed2bSScott Kruger -V ................ run Valgrind 3729921a8fSScott Kruger -v ................ Verbose: Print commands 3829921a8fSScott KrugerEOF 3929921a8fSScott Kruger 4029921a8fSScott Kruger if declare -f extrausage > /dev/null; then extrausage; fi 4129921a8fSScott Kruger exit $1 4229921a8fSScott Kruger} 4329921a8fSScott Kruger### 4429921a8fSScott Kruger## Arguments for overriding things 4529921a8fSScott Kruger# 4629921a8fSScott Krugerverbose=false 4729921a8fSScott Krugercleanup=false 48e53dc769SScott Krugerdebugger=false 492f2809e3SToby Isaacforce=false 50d4417257SScott Krugerdiff_flags="" 51*0a091e3eSScott Krugerwhile getopts "a:cde:fhjJ:mn:t:vV" arg 5229921a8fSScott Krugerdo 5329921a8fSScott Kruger case $arg in 54ba2c5286SScott Kruger a ) args="$OPTARG" ;; 5529921a8fSScott Kruger c ) cleanup=true ;; 56e53dc769SScott Kruger d ) debugger=true ;; 57ba2c5286SScott Kruger e ) extra_args="$OPTARG" ;; 582f2809e3SToby Isaac f ) force=true ;; 5929921a8fSScott Kruger h ) print_usage; exit ;; 60ba2c5286SScott Kruger n ) nsize="$OPTARG" ;; 61ba2c5286SScott Kruger j ) diff_flags="-j" ;; 62ba2c5286SScott Kruger J ) diff_flags="-J $OPTARG" ;; 63ba2c5286SScott Kruger m ) diff_flags="-m" ;; 64*0a091e3eSScott Kruger t ) TIMEOUT=$OPTARG ;; 65b047ed2bSScott Kruger V ) mpiexec="petsc_mpiexec_valgrind $mpiexec" ;; 6629921a8fSScott Kruger v ) verbose=true ;; 6729921a8fSScott Kruger *) # To take care of any extra args 6829921a8fSScott Kruger if test -n "$OPTARG"; then 6929921a8fSScott Kruger eval $arg=\"$OPTARG\" 7029921a8fSScott Kruger else 7129921a8fSScott Kruger eval $arg=found 7229921a8fSScott Kruger fi 7329921a8fSScott Kruger ;; 7429921a8fSScott Kruger esac 7529921a8fSScott Krugerdone 7629921a8fSScott Krugershift $(( $OPTIND - 1 )) 7729921a8fSScott Kruger 78*0a091e3eSScott Kruger# Individual tests can extend the default 79*0a091e3eSScott KrugerTIMEOUT=$((TIMEOUT*timeoutfactor)) 80*0a091e3eSScott Kruger 8129921a8fSScott Krugerif test -n "$extra_args"; then 8229921a8fSScott Kruger args="$args $extra_args" 8329921a8fSScott Krugerfi 84e53dc769SScott Krugerif $debugger; then 85e53dc769SScott Kruger args="-start_in_debugger $args" 86e53dc769SScott Krugerfi 87e53dc769SScott Kruger 8829921a8fSScott Kruger 8929921a8fSScott Kruger# Init 9029921a8fSScott Krugersuccess=0; failed=0; failures=""; rmfiles="" 9129921a8fSScott Krugertotal=0 9229921a8fSScott Krugertodo=-1; skip=-1 93*0a091e3eSScott Krugerjob_level=0 9429921a8fSScott Kruger 9529921a8fSScott Krugerfunction petsc_testrun() { 9629921a8fSScott Kruger # First arg = Basic command 9729921a8fSScott Kruger # Second arg = stdout file 9829921a8fSScott Kruger # Third arg = stderr file 9929921a8fSScott Kruger # Fourth arg = label for reporting 10029921a8fSScott Kruger # Fifth arg = Filter 10129921a8fSScott Kruger rmfiles="${rmfiles} $2 $3" 10229921a8fSScott Kruger tlabel=$4 10329921a8fSScott Kruger filter=$5 104*0a091e3eSScott Kruger job_control=true 10529921a8fSScott Kruger cmd="$1 > $2 2> $3" 106*0a091e3eSScott Kruger if test -n "$filter"; then 1071b548e17SScott Kruger if test "${filter:0:6}"=="Error:"; then 108*0a091e3eSScott Kruger job_control=false # redirection error method causes job control probs 1091b548e17SScott Kruger filter=${filter##Error:} 110*0a091e3eSScott Kruger cmd="$1 2>&1 | cat > $2 2> $3" 11129921a8fSScott Kruger fi 1121b548e17SScott Kruger fi 113a8eefe41SScott Kruger echo $cmd > ${tlabel}.sh; chmod 755 ${tlabel}.sh 1147a853109SScott Kruger 115*0a091e3eSScott Kruger kill_job=false 116*0a091e3eSScott Kruger if $job_control; then 117*0a091e3eSScott Kruger # The action: 118*0a091e3eSScott Kruger eval "($cmd) &" 119*0a091e3eSScott Kruger pid=$! 120*0a091e3eSScott Kruger # Put a watcher process in that will kill a job that exceeds limit 121*0a091e3eSScott Kruger $petsc_dir/config/watchtime.sh $pid $TIMEOUT & 122*0a091e3eSScott Kruger watcher=$! 123*0a091e3eSScott Kruger 124*0a091e3eSScott Kruger # See if the job we want finishes 125*0a091e3eSScott Kruger wait $pid 2> /dev/null 126*0a091e3eSScott Kruger cmd_res=$? 127*0a091e3eSScott Kruger if ps -p $watcher > /dev/null; then 128*0a091e3eSScott Kruger # Keep processes tidy by killing watcher 129*0a091e3eSScott Kruger kill -s PIPE $watcher 130*0a091e3eSScott Kruger wait $watcher 2>/dev/null # Wait used here to capture the kill message 131*0a091e3eSScott Kruger else 132*0a091e3eSScott Kruger # Timeout 133*0a091e3eSScott Kruger cmd_res=1 134*0a091e3eSScott Kruger echo "Exceeded timeout limit of $TIMEOUT s" > $3 135*0a091e3eSScott Kruger fi 136*0a091e3eSScott Kruger else 137*0a091e3eSScott Kruger # The action -- assume no timeout needed 138*0a091e3eSScott Kruger eval $cmd 139*0a091e3eSScott Kruger # We are testing error codes so just make it pass 140*0a091e3eSScott Kruger cmd_res=0 141*0a091e3eSScott Kruger fi 142*0a091e3eSScott Kruger 143*0a091e3eSScott Kruger # Handle filters separately and assume no timeout check needed 144*0a091e3eSScott Kruger if test -n "$filter"; then 145*0a091e3eSScott Kruger cmd="cat $2 | $filter > $2.tmp 2>> $3 && mv $2.tmp $2" 146*0a091e3eSScott Kruger echo $cmd >> ${tlabel}.sh 147*0a091e3eSScott Kruger eval "$cmd" 148*0a091e3eSScott Kruger let cmd_res+=$? 149*0a091e3eSScott Kruger fi 150*0a091e3eSScott Kruger 151*0a091e3eSScott Kruger # Report errors 1527a853109SScott Kruger if test $cmd_res == 0; then 15302afe9ecSJed Brown if "${verbose}"; then 154*0a091e3eSScott Kruger printf "ok $tlabel $cmd\n" | tee -a ${testlogfile} 15502afe9ecSJed Brown else 156*0a091e3eSScott Kruger printf "ok $tlabel\n" | tee -a ${testlogfile} 15702afe9ecSJed Brown fi 15829921a8fSScott Kruger let success=$success+1 15929921a8fSScott Kruger else 16064ca018dSScott Kruger if "${verbose}"; then 161*0a091e3eSScott Kruger printf "not ok $tlabel $cmd\n" | tee -a ${testlogfile} 16264ca018dSScott Kruger else 163*0a091e3eSScott Kruger printf "not ok $tlabel\n" | tee -a ${testlogfile} 16464ca018dSScott Kruger fi 165*0a091e3eSScott Kruger awk '{print "#\t" $0}' < $3 | tee -a ${testlogfile} 16629921a8fSScott Kruger let failed=$failed+1 16729921a8fSScott Kruger failures="$failures $tlabel" 16829921a8fSScott Kruger fi 16929921a8fSScott Kruger let total=$success+$failed 1707a853109SScott Kruger return $cmd_res 17129921a8fSScott Kruger} 17229921a8fSScott Kruger 17329921a8fSScott Krugerfunction petsc_testend() { 17429921a8fSScott Kruger logfile=$1/counts/${label}.counts 17529921a8fSScott Kruger logdir=`dirname $logfile` 17629921a8fSScott Kruger if ! test -d "$logdir"; then 17729921a8fSScott Kruger mkdir -p $logdir 17829921a8fSScott Kruger fi 17929921a8fSScott Kruger if ! test -e "$logfile"; then 18029921a8fSScott Kruger touch $logfile 18129921a8fSScott Kruger fi 18229921a8fSScott Kruger printf "total $total\n" > $logfile 18329921a8fSScott Kruger printf "success $success\n" >> $logfile 18429921a8fSScott Kruger printf "failed $failed\n" >> $logfile 18529921a8fSScott Kruger printf "failures $failures\n" >> $logfile 18629921a8fSScott Kruger if test ${todo} -gt 0; then 18729921a8fSScott Kruger printf "todo $todo\n" >> $logfile 18829921a8fSScott Kruger fi 18929921a8fSScott Kruger if test ${skip} -gt 0; then 19029921a8fSScott Kruger printf "skip $skip\n" >> $logfile 19129921a8fSScott Kruger fi 19229921a8fSScott Kruger if $cleanup; then 19329921a8fSScott Kruger echo "Cleaning up" 19429921a8fSScott Kruger /bin/rm -f $rmfiles 19529921a8fSScott Kruger fi 19629921a8fSScott Kruger} 197296e37cfSJed Brown 19826646c0bSSatish Balayfunction petsc_mpiexec_valgrind() { 19926646c0bSSatish Balay mpiexec=$1;shift 20026646c0bSSatish Balay npopt=$1;shift 20126646c0bSSatish Balay np=$1;shift 20226646c0bSSatish Balay 20326646c0bSSatish Balay valgrind="valgrind -q --tool=memcheck --leak-check=yes --num-callers=20 --track-origins=yes --suppressions=$petsc_dir/bin/maint/petsc-val.supp" 20426646c0bSSatish Balay $mpiexec $npopt $np $valgrind $* 20526646c0bSSatish Balay} 206296e37cfSJed Brownexport LC_ALL=C 207