mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-12-21 07:51:46 +08:00
969 lines
26 KiB
Bash
Executable File
969 lines
26 KiB
Bash
Executable File
#! /bin/sh
|
|
#
|
|
# Copyright by The HDF Group.
|
|
# Copyright by the Board of Trustees of the University of Illinois.
|
|
# All rights reserved.
|
|
#
|
|
# This file is part of HDF5. The full HDF5 copyright notice, including
|
|
# terms governing use, modification, and redistribution, is contained in
|
|
# the files COPYING and Copyright.html. COPYING can be found at the root
|
|
# of the source code distribution tree; Copyright.html can be found at the
|
|
# root level of an installed copy of the electronic HDF5 document set and
|
|
# is linked from the top-level documents page. It can also be found at
|
|
# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have
|
|
# access to either file, you may request a copy from help@hdfgroup.org.
|
|
#
|
|
|
|
# run the hdf5/bin/snapshot
|
|
# Usage:
|
|
# runtest run the test for the local host
|
|
# runtest <hostname> run the test for <hostname>
|
|
# runtest -all run the test for all predefined hosts
|
|
#
|
|
# Assumptions in knowing where to find the right scripts to execute.
|
|
# 1. assume we are at the top level of the hdf5 source. So, bin/* are
|
|
# where the script files are.
|
|
# 2. after the cvs update is completed, we can go to the snapshot area
|
|
# hdf5 source tree and use the bin/* there.
|
|
# 3. Cannot use the snapshot area scripts from the beginning because
|
|
# for one, the current directory is renamed as previous right after
|
|
# a snapshot release; and for another, some scripts may be changed
|
|
# by the cvs update while it is being used.
|
|
|
|
# local setup
|
|
DEBUGMODE=""
|
|
test -n "$DEBUGMODE" && echo "******** DEBUGMODE is $DEBUGMODE ************"
|
|
WHEREAMI='pwd'
|
|
CMD=
|
|
|
|
# the name of this program
|
|
PROGNAME="bin/runtest $DEBUGMODE"
|
|
|
|
# Setup
|
|
HOSTNAME=`hostname | cut -f1 -d.` # no domain part
|
|
TODAY=`date +%m%d%a`
|
|
WEEKDAY=`date +%a`
|
|
H5VER= # default to current CVS version
|
|
H5VERSION= # default to current CVS version
|
|
n_test=0 # Number of tests ran
|
|
n_pass=0 # Number of tests passed
|
|
n_fail=0 # Number of tests failed
|
|
n_skip=0 # Number of tests skipped
|
|
|
|
# Default to do checkout (only once) and test, no release.
|
|
# Will run test only if there is significant differences from previous version.
|
|
# If srcdir is not used, don't launched multiple tests
|
|
SNAPSHOT="${DEBUGMODE:+echo }bin/snapshot"
|
|
SRCDIR="srcdir"
|
|
# Default standard Snaptest commands
|
|
SNAPCMD="$SRCDIR test clean"
|
|
# Default Standard snaptest command options
|
|
STANDARD_OPT=""
|
|
ENABLE_PARALLEL="--enable-parallel"
|
|
CONFIGNAME=$HOSTNAME # Name used in the SNAPTESTCFG file
|
|
|
|
# test host default as local host.
|
|
TESTHOST=""
|
|
|
|
#################################
|
|
# Function definitions
|
|
#################################
|
|
|
|
# Print messages to stdout
|
|
# Use this to show output heading to stdout
|
|
PRINT()
|
|
{
|
|
echo "$*"
|
|
}
|
|
|
|
# Show seconds since midnight.
|
|
# This is used to calculate seconds elapsed
|
|
SecOfDay()
|
|
{
|
|
set `date '+%H %M %S'`
|
|
t_sec=`expr $1 \* 3600 + $2 \* 60 + $3`
|
|
echo $t_sec
|
|
}
|
|
|
|
# Calculated the elapsed time (in seconds) between the first
|
|
# and second time. If second time is smaller than the first,
|
|
# we assume the clock has passed midnight and calculate appropriately.
|
|
ElapsedTime()
|
|
{
|
|
if [ $2 -lt $1 ]; then
|
|
t_sec=`expr 3600 \* 24 - $1 + $2`
|
|
else
|
|
t_sec=`expr $2 - $1`
|
|
fi
|
|
echo `expr $t_sec / 60`m `expr $t_sec % 60`s
|
|
}
|
|
|
|
# Report errors
|
|
# $1--an error message to be printed
|
|
REPORT_ERR()
|
|
{
|
|
ERRMSG=$1
|
|
# print it with a banner shifted right a bit
|
|
PRINT " *************************************"
|
|
PRINT " `date`"
|
|
PRINT " $ERRMSG"
|
|
PRINT " *************************************"
|
|
# report it in the FAILED-LOG file too
|
|
PRINT "$ERRMSG" >> $FAILEDLOG
|
|
}
|
|
|
|
#
|
|
# Report results of the last test done
|
|
REPORT_RESULT()
|
|
{
|
|
if [ $retcode -eq 0 ]; then
|
|
if [ $skiptest = yes ]; then
|
|
n_skip=`expr $n_skip + 1`
|
|
PRINT "SKIPPED ${HOSTNAME}: $TEST_TYPE" | tee -a $SKIPPEDLOG
|
|
else
|
|
n_pass=`expr $n_pass + 1`
|
|
PRINT "PASSED ${HOSTNAME}: $TEST_TYPE" | tee -a $PASSEDLOG
|
|
fi
|
|
else
|
|
# test failed.
|
|
n_fail=`expr $n_fail + 1`
|
|
REPORT_ERR "****FAILED ${HOSTNAME}: $TEST_TYPE****"
|
|
fi
|
|
}
|
|
|
|
# Print a blank line
|
|
PRINT_BLANK()
|
|
{
|
|
PRINT
|
|
}
|
|
|
|
# Print test trailer
|
|
PRINT_TEST_TRAILER()
|
|
{
|
|
PRINT "*** finished $TEST_TYPE tests for $HOSTNAME ***"
|
|
date; EndTime=`SecOfDay`
|
|
PRINT Total time = `ElapsedTime $StartTime $EndTime`
|
|
PRINT_BLANK
|
|
}
|
|
|
|
# Print trailer summary
|
|
PRINT_TRAILER()
|
|
{
|
|
PRINT "*** finished tests in $HOSTNAME ***"
|
|
date; TotalEndTime=`SecOfDay`
|
|
PRINT "${HOSTNAME}: Ran $n_test($n_pass/$n_fail/$n_skip) $runtest_type, Grand total test time = " \
|
|
"`ElapsedTime $TotalStartTime $TotalEndTime`" | tee -a $TIMELOG
|
|
PRINT_BLANK
|
|
}
|
|
|
|
# Figure out which remote command to use to reach a host.
|
|
# Try ssh first, then rsh since fewer machines support rsh exec.
|
|
# $1--hostname to reach.
|
|
CHECK_RSH()
|
|
{
|
|
# Figure out how to use ping command in this host.
|
|
# Some hosts use "ping host count", some use "ping -c count host".
|
|
# Test "ping -c 3 -w 5" since it has timeout feature.
|
|
# Test "ping -c ..." style before "ping host 3" because some machines
|
|
# that recognize -c treat 'ping localhost 3' as to ping host '3'.
|
|
if [ -z "$PING" ]; then
|
|
if ping -c 3 -w 5 localhost >/dev/null 2>&1; then
|
|
PING='ping -c 3 -w 5'
|
|
PINGCOUNT=
|
|
elif ping -c 3 localhost >/dev/null 2>&1; then
|
|
PING='ping -c 3'
|
|
PINGCOUNT=
|
|
elif ping localhost 3 >/dev/null 2>&1; then
|
|
PING=ping
|
|
PINGCOUNT=3
|
|
else # don't know how to use ping.
|
|
PING=no_ping
|
|
PINGCOUNT=
|
|
fi
|
|
fi
|
|
#
|
|
host=$1
|
|
# Try remote command with host if it responds to ping.
|
|
# Still try it if we don't know how to do ping.
|
|
if [ no_ping = "$PING" ] || $PING $host $PINGCOUNT >/dev/null 2>&1; then
|
|
if ssh $host -n hostname >/dev/null 2>&1; then
|
|
RSH=ssh
|
|
elif rsh $host -n hostname >/dev/null 2>&1; then
|
|
RSH=rsh
|
|
else
|
|
PRINT cannot remote command with $host
|
|
RSH="NoRemoteCommand"
|
|
fi
|
|
else
|
|
RSH="NotReachable"
|
|
fi
|
|
}
|
|
|
|
|
|
# Wait for a file for at most number of minutes
|
|
# $1--the file
|
|
# $2--number of minutes
|
|
# WAIT_STATUS set to:
|
|
# -1 if errors encountered
|
|
# 0 if file found within time limit
|
|
# 1 if file not found within time limit
|
|
WAITFOR()
|
|
{
|
|
wait_file=$1
|
|
nminutes=$2
|
|
if [ -z "$wait_file" -o ! "$nminutes" -ge 0 ]
|
|
then
|
|
PRINT "errors in argument of WAITFOR(): wait_file($1) or nminutes($2)"
|
|
WAIT_STATUS=-1
|
|
return
|
|
fi
|
|
while [ ! -f $wait_file ]; do
|
|
if [ $nminutes -gt 0 ]; then
|
|
PRINT "Wait For $wait_file to appear"
|
|
sleep 60 #sleep 1 minute
|
|
else
|
|
WAIT_STATUS=1
|
|
return
|
|
fi
|
|
nminutes=`expr $nminutes - 1`
|
|
done
|
|
WAIT_STATUS=0
|
|
return
|
|
}
|
|
|
|
|
|
# Wait till a file disappears for at most number of minutes.
|
|
# Useful to wait till a lock is removed by another process.
|
|
# $1--the file
|
|
# $2--number of minutes
|
|
# WAIT_STATUS set to:
|
|
# -1 if errors encountered
|
|
# 0 if file disappears within time limit
|
|
# 1 if file has not disappeared within time limit
|
|
WAITTILL()
|
|
{
|
|
wait_file=$1
|
|
nminutes=$2
|
|
if [ -z "$wait_file" -o ! "$nminutes" -ge 0 ]
|
|
then
|
|
PRINT "errors in argument of WAITTILL(): wait_file($1) or nminutes($2)"
|
|
WAIT_STATUS=-1
|
|
return
|
|
fi
|
|
while [ -f $wait_file ]; do
|
|
if [ $nminutes -gt 0 ]; then
|
|
PRINT "Wait till $wait_file has disappeared"
|
|
sleep 60 #sleep 1 minute
|
|
else
|
|
WAIT_STATUS=1
|
|
return
|
|
fi
|
|
nminutes=`expr $nminutes - 1`
|
|
done
|
|
WAIT_STATUS=0
|
|
return
|
|
}
|
|
|
|
|
|
# Run one snapshot test
|
|
# $*--Types of test being run
|
|
RUNSNAPTEST()
|
|
{
|
|
SNAPCMD_OPT="$STANDARD_OPT" # snapshot test option
|
|
SRCDIRNAME=${HOSTNAME}
|
|
# restore CC, PATH in case they were changed in the last test.
|
|
CC="$CC_SAVED"
|
|
PATH=$PATH_SAVED
|
|
export PATH # DEC OSF1 needs to export PATH explicitly
|
|
TEST_TYPE=$*
|
|
retcode=0
|
|
skiptest=no
|
|
date
|
|
PRINT "*** starting $TEST_TYPE tests in $HOSTNAME ***"
|
|
PRINT "Uname -a: `uname -a`"
|
|
|
|
# Parse the test type and set options accordingly.
|
|
# See comments of SNAPTEST_CONFIG_PARSE().
|
|
while [ $# -gt 0 ]; do
|
|
case $1 in
|
|
-n32) # want -n32 option
|
|
SRCDIRNAME=${SRCDIRNAME}-n32
|
|
CC="cc -n32"
|
|
export CC
|
|
;;
|
|
-64) # want -64 option
|
|
SRCDIRNAME=${SRCDIRNAME}-64
|
|
CC="cc -64"
|
|
export CC
|
|
;;
|
|
parallel) # want parallel test
|
|
SNAPCMD_OPT="$SNAPCMD_OPT $ENABLE_PARALLEL"
|
|
SRCDIRNAME=${SRCDIRNAME}-pp
|
|
;;
|
|
standard) # standard test
|
|
;;
|
|
--*)
|
|
# option for configure
|
|
SNAPCMD_OPT="$SNAPCMD_OPT $1"
|
|
;;
|
|
op-configure)
|
|
# option for configure
|
|
SNAPCMD_OPT="$SNAPCMD_OPT $1 $2"
|
|
shift
|
|
;;
|
|
op-snapshot)
|
|
# option for snapshot
|
|
shift
|
|
SNAPCMD_OPT="$SNAPCMD_OPT $1"
|
|
;;
|
|
setenv)
|
|
# pass them along to snapshot set environment variable
|
|
shift
|
|
SNAPCMD_OPT="$SNAPCMD_OPT setenv $1 $2"
|
|
shift
|
|
;;
|
|
setenvN)
|
|
# set environment variable with $1 values
|
|
# e.g., setenvN 3 x a b c is same as setenv x="a b c".
|
|
# pass them along to snapshot set environment variable
|
|
shift
|
|
envN=$1
|
|
shift
|
|
envname=$1
|
|
SNAPCMD_OPT="$SNAPCMD_OPT setenvN $envN $envname"
|
|
envalue=
|
|
while test $envN -gt 0; do
|
|
shift
|
|
envalue="$envalue $1"
|
|
envN=`expr $envN - 1`
|
|
done
|
|
SNAPCMD_OPT="$SNAPCMD_OPT $envalue"
|
|
;;
|
|
skip)
|
|
# skip this test
|
|
skiptest=yes
|
|
;;
|
|
srcdirname)
|
|
# Use this before using parallel and -n32 since this overrides
|
|
# the others.
|
|
shift
|
|
SRCDIRNAME=$1
|
|
;;
|
|
deploy)
|
|
# deploy the built binary.
|
|
shift
|
|
SNAPCMD_OPT="$SNAPCMD_OPT deploy $1"
|
|
;;
|
|
deploydir)
|
|
# default directory for deployment.
|
|
shift
|
|
SNAPCMD_OPT="$SNAPCMD_OPT deploydir $1"
|
|
;;
|
|
*) # unknown test
|
|
PRINT "$0: unknown type of test ($1)"
|
|
retcode=1
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [ $retcode -ne 0 -o $skiptest = yes ]; then
|
|
errcode=$retcode
|
|
return $retcode
|
|
fi
|
|
|
|
# Track down the zlib software
|
|
ans=`$SNAPYARD/current/bin/locate_sw zlib`
|
|
if [ $? = 0 ]; then
|
|
Z_INC=`echo $ans | cut -f1 -d,`
|
|
Z_LIB=`echo $ans | cut -f2 -d,`
|
|
SNAPCMD_OPT="$SNAPCMD_OPT zlib $Z_INC,$Z_LIB"
|
|
else
|
|
# cannot locate zlib software.
|
|
# continue the test, maybe configure can find it.
|
|
:
|
|
fi
|
|
|
|
if [ -n "${SRCDIRNAME}" ]; then
|
|
SNAPCMD_OPT="$SNAPCMD_OPT srcdirname ${SRCDIRNAME}"
|
|
fi
|
|
|
|
# Setup log file name to save test output
|
|
THIS_MINUTE=`date +%H%M`
|
|
LOGFILE=${LOGBASENAME}/${SRCDIRNAME}_${TODAY}_${THIS_MINUTE}
|
|
PRINT "Running snapshot with output saved in"
|
|
PRINT " $LOGFILE"
|
|
(date; PRINT Hostname=$HOSTNAME) >> $LOGFILE
|
|
|
|
(
|
|
cd $SNAPYARD/current
|
|
$SNAPSHOT $SNAPCMD $SNAPCMD_OPT
|
|
) >> $LOGFILE 2>&1
|
|
retcode=$?
|
|
[ $retcode -ne 0 ] && errcode=$retcode
|
|
|
|
date >> $LOGFILE
|
|
if [ $retcode -ne 0 ]; then
|
|
# Dump the first 10 lines and the last 30 lines of the LOGFILE.
|
|
( ntail=30
|
|
echo =========================
|
|
echo "Dumping logfile of ${HOSTNAME}: $TEST_TYPE"
|
|
echo "Last $ntail lines of $LOGFILE"
|
|
echo =========================
|
|
tail -$ntail $LOGFILE
|
|
echo =========================
|
|
echo Dumping done
|
|
echo =========================
|
|
echo ""
|
|
) >> $FAILEDDETAIL
|
|
fi
|
|
}
|
|
|
|
TIMELIMIT_PARSE()
|
|
{
|
|
# Function returns timeparam for timekeeper via standard out -
|
|
# any debug statements should be 'echo "Debug string" >&2' or timekeeper
|
|
# will declare timeparam to be non-numeric and ignore it.
|
|
while read x y ; do
|
|
# Scan for entry for this weekday.
|
|
xd=`echo $x | cut -f1 -d/`
|
|
if [ "$xd" = ${WEEKDAY} ]; then
|
|
# strip away the weekday/ part.
|
|
timeparam=`echo $x | cut -f2 -d/`
|
|
break
|
|
fi
|
|
case "$x" in
|
|
'' | '#'*)
|
|
# blank or comment lines. Continue.
|
|
;;
|
|
???/*)
|
|
# Ignore any entry not of this weekday.
|
|
;;
|
|
*)
|
|
timeparam="$x"
|
|
;;
|
|
esac
|
|
done
|
|
echo $timeparam
|
|
return
|
|
}
|
|
|
|
# configuration parsing.
|
|
# Taking configuration from input.
|
|
# This should be invoke with configure file as stdin.
|
|
# Syntax of the configure file:
|
|
# All lines started with the # are comment lines and are ignored.
|
|
# Blank lines are ignored too.
|
|
# Each config line starts with a "Scope" followed by test types.
|
|
#
|
|
# Scope can be:
|
|
# standard ... # what the standard test types are.
|
|
# <host>: <test> Do <test> for <host>
|
|
# all: <test> Do <test> for all hosts.
|
|
# <weekday>/... Use this scope if the <weekday> matches.
|
|
# <weekday> can be {Mon,Tue,Wed,Thu,Fri,Sat,Sun}
|
|
# If no <host>: input for a <host>, the standard test is used.
|
|
#
|
|
# Test types:
|
|
# standard tests defined in standard scope.
|
|
# -n32 -n32 mode. Apply to 64/32 bit OS such as IRIX64.
|
|
# parallel parallel mode.
|
|
# op-configure <option> configure option
|
|
# op-snapshot <option> snapshot option
|
|
# --* configure option
|
|
# setenv <name> <value> set environment variable <name> to <value>
|
|
# Pass along to snapshot
|
|
# setenvN <N> <name> <value> ...
|
|
# set environment variable with <N> values
|
|
# e.g., setenvN 3 x a b c is same as setenv x="a b c".
|
|
# Pass along to snapshot.
|
|
# skip skip this test
|
|
# srcdirname <name> use <name> as the build-directory.
|
|
# deploy <name> deploy the built binary at directory <name>.
|
|
# deploydir <name> use <name> as the default directory for deployment.
|
|
SNAPTEST_CONFIG_PARSE()
|
|
{
|
|
while read x y ; do
|
|
# Scan for entry for this weekday.
|
|
xd=`echo $x | cut -f1 -d/`
|
|
if [ "$xd" = ${WEEKDAY} ]; then
|
|
# strip away the weekday/ part.
|
|
x=`echo $x | cut -f2 -d/`
|
|
fi
|
|
case "$x" in
|
|
'' | '#'*)
|
|
# blank or comment lines. Continue.
|
|
;;
|
|
???/*)
|
|
# Ignore any entry not of this weekday.
|
|
;;
|
|
standard)
|
|
#standard configuration
|
|
STANDARD_OPT="$y"
|
|
;;
|
|
all: | ${CONFIGNAME}:)
|
|
# types of test for all hosts or this host
|
|
if [ -n "$TEST_TYPES" ]; then
|
|
TEST_TYPES="$TEST_TYPES ; $y"
|
|
else
|
|
TEST_TYPES="$y"
|
|
fi
|
|
;;
|
|
*:) # ignore types of test for other hosts
|
|
;;
|
|
*) # unknown configuration option
|
|
PRINT $x $y
|
|
PRINT "***Unknown configuration option. Ignored.***"
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
# Snap Test configuration parsing.
|
|
# If TEST_TYPES is not set, set it to do the "standard" test.
|
|
SNAPTEST_CONFIG()
|
|
{
|
|
TEST_TYPES=
|
|
STANDARD_OPT=
|
|
if [ -f $SNAPTESTCFG ]; then
|
|
SNAPTEST_CONFIG_PARSE < $SNAPTESTCFG
|
|
fi
|
|
TEST_TYPES=${TEST_TYPES:-'standard'}
|
|
}
|
|
|
|
|
|
# Show usage page
|
|
USAGE()
|
|
{
|
|
cat <<EOF
|
|
Usage: runtest [-h] [-debug] [-r<version>] [-all] [-nocvs] [-nodiff] [<host> ...]
|
|
-h
|
|
print this help page
|
|
-debug
|
|
turn on debug mode
|
|
-r<version>
|
|
do runtest for <version>
|
|
-all
|
|
launch tests for all pre-defined testing hosts
|
|
-nocvs
|
|
do not do cvs commands
|
|
-nodiff
|
|
do not do diff commands
|
|
-setup
|
|
setup the directory structure for snapshot test
|
|
-configname <name>
|
|
use <name> as hostname in the parsing of the snaptest configure file
|
|
<host>
|
|
launch tests for <host>
|
|
|
|
-all and <host> are contradictory and whichever is specified last, is
|
|
the one to take effect. If neither are given, do the test for the
|
|
local host.
|
|
EOF
|
|
}
|
|
|
|
|
|
# Verify if directory ($1) exists. If not, create it.
|
|
CHECK_DIR()
|
|
{
|
|
dir=$1
|
|
if test ! -e $1; then
|
|
echo mkdir $1
|
|
mkdir $1
|
|
errcode=$?
|
|
elif test ! -d $1; then
|
|
echo $1 is not a directory
|
|
errcode=1
|
|
fi
|
|
}
|
|
|
|
|
|
#################################
|
|
# Main
|
|
#################################
|
|
#################################
|
|
# Set up global variables
|
|
#################################
|
|
retcode=0 # error code of individula task
|
|
errcode=0 # error code of the whole test
|
|
skiptest=no # if test is skipped
|
|
CC_SAVED="$CC" # CC & PATH maybe changed within a test.
|
|
PATH_SAVED=$PATH # These save the original values.
|
|
timelimit=300 # default time limit (minutes) for the timekeeper
|
|
|
|
#################################
|
|
# Parse options
|
|
#################################
|
|
while [ $# -gt 0 ]; do
|
|
case "$1" in
|
|
-h) # help--show usage
|
|
USAGE
|
|
exit 0
|
|
;;
|
|
-debug*)
|
|
# set debug mode
|
|
DEBUGMODE="$1"
|
|
SNAPSHOT="echo bin/snapshot"
|
|
PROGNAME="$PROGNAME $DEBUGMODE"
|
|
PRINT "******** DEBUGMODE is $DEBUGMODE ************"
|
|
;;
|
|
-r*)
|
|
# version string
|
|
H5VER="$1"
|
|
;;
|
|
-all)
|
|
# Test all hosts.
|
|
TESTHOST=-all
|
|
;;
|
|
-nocvs)
|
|
# do not do cvs commands.
|
|
NOCVS=nocvs
|
|
;;
|
|
-nodiff)
|
|
# do not do diff commands.
|
|
NODIFF=nodiff
|
|
;;
|
|
-configname)
|
|
# use <name> as hostname in the parsing of the snaptest configure file.
|
|
shift
|
|
CONFIGNAME=$1
|
|
;;
|
|
-setup)
|
|
# setup the directory structure for snapshot test.
|
|
CMD=setup
|
|
;;
|
|
-*) # Unknow option
|
|
PRINT "Unknown option ($1)"
|
|
USAGE
|
|
exit 1
|
|
;;
|
|
*)
|
|
TESTHOST=$*
|
|
break
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
# setup H5VER if not set yet
|
|
if [ -z "$H5VER" -a -f bin/snapshot_version ]
|
|
then
|
|
. bin/snapshot_version
|
|
fi
|
|
|
|
if [ -n "$H5VER" ]
|
|
then
|
|
H5VERSION=hdf5_`echo $H5VER | sed -e s/-r// -e s/\\\./_/g`
|
|
PROGNAME="$PROGNAME $H5VER"
|
|
else
|
|
H5VERSION=hdf5
|
|
fi
|
|
|
|
#################################
|
|
# Setup snapshot test directories
|
|
#################################
|
|
BASEDIR=${HOME}/snapshots-${H5VERSION}
|
|
# initial processing of setup option if requested
|
|
if test x-$CMD = x-setup; then
|
|
CHECK_DIR $BASEDIR
|
|
test $errcode -ne 0 && exit 1
|
|
elif [ ! -d ${BASEDIR} ]; then
|
|
echo "BASEDIR ($BASEDIR) does not exist"
|
|
exit 1
|
|
fi
|
|
# Show the real physical path rather than the symbolic path
|
|
SNAPYARD=`cd $BASEDIR && /bin/pwd`
|
|
# Log file basename
|
|
LOGDIR=${SNAPYARD}/log
|
|
LOGBASENAME=${LOGDIR}
|
|
PASSEDLOG=${LOGDIR}/PASSED_LOG_${TODAY}
|
|
FAILEDLOG=${LOGDIR}/FAILED_LOG_${TODAY}
|
|
FAILEDDETAIL=${LOGDIR}/FAILED_DETAIL_${TODAY}
|
|
SKIPPEDLOG=${LOGDIR}/SKIPPED_LOG_${TODAY}
|
|
TIMELOG=${LOGDIR}/TIME_LOG_${TODAY}
|
|
TIMEKEEPERLOG=${LOGDIR}/TIMEKEEPER_LOG_${TODAY}
|
|
CVSLOG=${LOGDIR}/CVS_LOG_${TODAY}
|
|
CVSLOG_LOCK=${LOGDIR}/CVS_LOG_LOCK_${TODAY}
|
|
DIFFLOG=${LOGDIR}/DIFF_LOG_${TODAY}
|
|
COPYRIGHT_ERR=${LOGDIR}/COPYRIGHT_ERR_${TODAY}
|
|
# Snap Test hosts and Configuration files
|
|
ALLHOSTSFILE=${SNAPYARD}/allhostfile
|
|
SNAPTESTCFG=${SNAPYARD}/snaptest.cfg
|
|
TIMELIMIT=${SNAPYARD}/timelimit
|
|
TMPFILE="${LOGDIR}/#runtest.${TODAY}.$$"
|
|
|
|
# more processing of setup option if requested
|
|
if test x-$CMD = x-setup; then
|
|
CHECK_DIR $LOGDIR
|
|
test $errcode -ne 0 && exit 1
|
|
CHECK_DIR $LOGDIR/OLD
|
|
test $errcode -ne 0 && exit 1
|
|
CHECK_DIR $SNAPYARD/TestDir
|
|
test $errcode -ne 0 && exit 1
|
|
# create empty test hosts or configure files if non-existing
|
|
for f in $ALLHOSTSFILE $SNAPTESTCFG; do
|
|
if test ! -f $f; then
|
|
echo Creating $f
|
|
touch $f
|
|
fi
|
|
done
|
|
# create or update the current source.
|
|
echo update current source
|
|
$SNAPSHOT checkout
|
|
# setup completed. Exit.
|
|
exit 0
|
|
fi
|
|
|
|
#################################
|
|
# Show some host status numbers
|
|
#################################
|
|
# df sometimes hangs due to file system problems. Invoke it as background
|
|
# process and give it 10 seconds to finish. If it hangs, just continue.
|
|
uptime
|
|
df &
|
|
sleep 10
|
|
|
|
#################################
|
|
# Setup test host(s)
|
|
#################################
|
|
if [ "$TESTHOST" = -all ]; then
|
|
if [ -f $ALLHOSTSFILE ]; then
|
|
TESTHOST=`sed -e '/^#/d;/^ *$/d' $ALLHOSTSFILE`
|
|
else
|
|
PRINT "could not access the all-hosts-file ($ALLHOSTSFILE)"
|
|
USAGE
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
|
|
#################################
|
|
# Setup to print a trailer summary when exiting not via
|
|
# the normal end of the script.
|
|
#################################
|
|
trap PRINT_TRAILER 0
|
|
|
|
#
|
|
TotalStartTime=`SecOfDay`
|
|
|
|
# Process the configuration
|
|
SNAPTEST_CONFIG
|
|
PRINT STANDARD_OPT=$STANDARD_OPT
|
|
PRINT TEST_TYPES=$TEST_TYPES
|
|
PRINT_BLANK
|
|
|
|
# Do a checkout if one has not been done today.
|
|
# Then check MANIFEST file and copyrights noitces.
|
|
if [ -z "$NOCVS" ]; then
|
|
PRINT "Running CVS checkout with output saved in"
|
|
PRINT " $CVSLOG"
|
|
# Set CVS lock first
|
|
touch $CVSLOG_LOCK
|
|
($SNAPSHOT checkout ) >> $CVSLOG 2>&1
|
|
# Save error code and remove the lock
|
|
errcode=$?
|
|
rm -f $CVSLOG_LOCK
|
|
if [ $errcode -ne 0 ]; then
|
|
# test failed.
|
|
REPORT_ERR "****FAILED ${HOSTNAME}: CVS checkout****"
|
|
exit $errcode
|
|
fi
|
|
# ===================
|
|
# Check MANIFEST file
|
|
# ===================
|
|
PRINT Checking MAINFEST file ...
|
|
(cd $SNAPYARD/current; bin/chkmanifest) > $TMPFILE 2>&1
|
|
errcode=$?
|
|
if [ $errcode -eq 0 ]; then
|
|
# test passed.
|
|
cat $TMPFILE
|
|
else
|
|
# test failed.
|
|
REPORT_ERR "****FAILED ${HOSTNAME}: MANIFEST check****"
|
|
( echo =========================
|
|
echo "MANIFEST checking failed output"
|
|
echo =========================
|
|
cat $TMPFILE
|
|
echo =========================
|
|
echo "MANIFEST checking failed output done"
|
|
echo =========================
|
|
echo ""
|
|
) >> $FAILEDDETAIL
|
|
fi
|
|
rm $TMPFILE
|
|
PRINT_BLANK
|
|
# No copyright checking until what need copyright is decided. 2006/4/7.
|
|
if false; then
|
|
# ======================
|
|
# Check Copyright notice
|
|
# ======================
|
|
PRINT Checking Copyrights notices ...
|
|
if (cd $SNAPYARD/current; bin/chkcopyright) > $TMPFILE 2>&1 ; then
|
|
echo Passed.
|
|
else
|
|
# Save the output and report some of it.
|
|
# Do not report it as failed for runtest yet.
|
|
# Send a separate report mail via hardcoding.
|
|
# Need fixes/cleanup later.
|
|
echo "Failed. See detail in another report mail"
|
|
cp $TMPFILE $COPYRIGHT_ERR
|
|
nheadlines=300
|
|
ntaillines=5 # Number of lines in report summary.
|
|
(
|
|
echo =========================
|
|
echo "Copyright checking failed. Showing first $nheadlines lines of output."
|
|
echo "Complete output is in file $COPYRIGHT_ERR"
|
|
echo =========================
|
|
nreportlines=`wc -l < $COPYRIGHT_ERR`
|
|
if [ $nreportlines -le `expr $nheadlines + $ntaillines` ]; then
|
|
# Just print the whole file.
|
|
cat $COPYRIGHT_ERR
|
|
else
|
|
# Show the first $nheadlines plus report summary
|
|
head -$nheadlines $COPYRIGHT_ERR
|
|
echo ...
|
|
tail -$ntaillines $COPYRIGHT_ERR
|
|
fi
|
|
) | Mail -s "${H5VERSION} Copyrights check Failed" hdf5lib
|
|
fi
|
|
rm $TMPFILE
|
|
PRINT_BLANK
|
|
fi
|
|
else
|
|
# make sure the cvs update, if done by another host, has completed.
|
|
# First wait for the presence of $CVSLOG which signals some host
|
|
# has started the cvs update. Then wait for the absense of $CVSLOG_LOCK
|
|
# which signals the host has completed the cvs update.
|
|
WAITFOR $CVSLOG 90
|
|
if [ $WAIT_STATUS -ne 0 ]; then
|
|
errcode=$WAIT_STATUS
|
|
REPORT_ERR "****FAILED ${HOSTNAME}: Time expired waiting CVS update to start****"
|
|
exit $errcode
|
|
fi
|
|
WAITTILL $CVSLOG_LOCK 10
|
|
if [ $WAIT_STATUS -ne 0 ]; then
|
|
errcode=$WAIT_STATUS
|
|
REPORT_ERR "****FAILED ${HOSTNAME}: Time expired waiting CVS update to finish****"
|
|
exit $errcode
|
|
fi
|
|
fi
|
|
|
|
# run a snapshot diff to see if any significant differences between
|
|
# the current and previous versions
|
|
if [ -z "$NODIFF" ]; then
|
|
$SNAPSHOT diff >> $DIFFLOG 2>&1
|
|
errcode=$?
|
|
# check the errcode only if NOT in DEBUG MODE
|
|
if [ -z "$DEBUGMODE" -a $errcode -eq 0 ]; then
|
|
# no need to run test
|
|
PRINT "NO TEST: no significant differences between current and previous versions" |
|
|
tee -a $PASSEDLOG
|
|
exit 0
|
|
fi
|
|
fi
|
|
|
|
# we can use the version of script in SNAPYARD/current now.
|
|
# Don't do the diff or cvs update any more.
|
|
PROGNAME="$SNAPYARD/current/$PROGNAME -nodiff -nocvs"
|
|
|
|
# Decide to do test for the local host or for remote hosts
|
|
if [ -n "$TESTHOST" -a $HOSTNAME != "$TESTHOST" ]; then
|
|
date
|
|
PRINT "*** launching tests from $HOSTNAME ***"
|
|
PRINT_BLANK
|
|
TEST_TYPE="launching"
|
|
cd ${SNAPYARD}/log
|
|
# Fork off timekeeper if concurrent tests will be used.
|
|
if [ -n "$SRCDIR" ]; then
|
|
timelimit=`TIMELIMIT_PARSE < $TIMELIMIT`
|
|
($SNAPYARD/current/bin/timekeeper $timelimit > $TIMEKEEPERLOG 2>&1 &)
|
|
PRINT " Fork off timekeeper $timelimit"
|
|
fi
|
|
runtest_type="hosts"
|
|
for h in $TESTHOST; do
|
|
# Must do CONFIGNAME before $h got changed by the second cut.
|
|
# cut returns the whole string if there is no / in the string
|
|
# at all. But that works okay for the CONFIGNAME too.
|
|
CONFIGNAME=`echo $h | cut -f2 -d/`
|
|
h=`echo $h | cut -f1 -d/`
|
|
n_test=`expr $n_test + 1`
|
|
TMP_OUTPUT="#${h}_${CONFIGNAME}.out"
|
|
(PRINT "=============="
|
|
PRINT "Testing $h"
|
|
PRINT "==============") > $TMP_OUTPUT
|
|
CHECK_RSH $h
|
|
# run the remote shell command with output to $TMP_OUTPUT
|
|
case "$RSH" in
|
|
rsh|ssh)
|
|
CMD="$RSH $h -n $PROGNAME -configname $CONFIGNAME"
|
|
PRINT $CMD
|
|
|
|
# launch concurrent tests only if srcdir is used
|
|
if [ -n "$SRCDIR" ]; then
|
|
$CMD || REPORT_ERR "****FAILED ${h}: Abnormal exit from runtest****" && PRINT_BLANK &
|
|
echo $! > PID.${h}_${CONFIGNAME}
|
|
else
|
|
$CMD || REPORT_ERR "****FAILED ${h}: Abnormal exit from runtest****" && PRINT_BLANK
|
|
fi
|
|
;;
|
|
NoRemoteCommand)
|
|
PRINT $h does not accept Remote Command "(`date`)"
|
|
;;
|
|
NotReachable)
|
|
PRINT $h is not reachable "(`date`)"
|
|
;;
|
|
*)
|
|
PRINT "CHECK_RSH for $h returned unknow result ($RSH)"
|
|
;;
|
|
esac >> $TMP_OUTPUT 2>&1
|
|
done
|
|
# wait for all launched tests to finish, then cat them back out.
|
|
wait
|
|
# Pause a moment in case the timekeeper is terminating processes.
|
|
wait 30
|
|
for h in $TESTHOST; do
|
|
CONFIGNAME=`echo $h | cut -f2 -d/`
|
|
h=`echo $h | cut -f1 -d/`
|
|
TMP_OUTPUT="#${h}_${CONFIGNAME}.out"
|
|
cat $TMP_OUTPUT
|
|
# Verify test script did complete by checking the last lines
|
|
(tail -5 $TMP_OUTPUT | grep -s 'Grand total' > /dev/null 2>&1) ||
|
|
(REPORT_ERR "****FAILED ${h}: snaptest did not complete****" &&
|
|
PRINT_BLANK)
|
|
rm -f $TMP_OUTPUT PID.${h}_${CONFIGNAME}
|
|
done
|
|
exit 0
|
|
fi
|
|
|
|
# run the test(s)
|
|
# Note that first field is cut without -s but all subsequent cut
|
|
# must use -s. If -s is not used at all, a $TEST_TYPES that has
|
|
# no ';' (only 1 test), will pass through intact in all cut. That
|
|
# results in infinite looping.
|
|
# If -s is used with the first field, it will suppress completely
|
|
# a $TYPE_TYPES that has no ';' (only 1 tst ). That results in no
|
|
# test at all.
|
|
# Note that n_test must start as 1.
|
|
#
|
|
n_test=1
|
|
runtest_type="tests"
|
|
TEST="`echo $TEST_TYPES | cut -f$n_test -d';'`"
|
|
while [ -n "$TEST" ]; do
|
|
StartTime=`SecOfDay`
|
|
RUNSNAPTEST $TEST
|
|
REPORT_RESULT
|
|
PRINT_TEST_TRAILER
|
|
|
|
n_test=`expr $n_test + 1`
|
|
TEST="`echo $TEST_TYPES | cut -f$n_test -s -d';'`"
|
|
done
|
|
# dec n_test to show the actual number of tests ran.
|
|
n_test=`expr $n_test - 1`
|
|
|
|
PRINT_TRAILER
|
|
|
|
# disable trailer summary printing since all trailers have been
|
|
# printed and we are exiting normally.
|
|
trap 0
|
|
exit $errcode
|