mirror of
https://github.com/HDFGroup/hdf5.git
synced 2024-12-09 07:32:32 +08:00
89fbe00dec
* commit '54957d37f5aa73912763dbb6e308555e863c43f4': Commit copyright header change for src/H5PLpkg.c which was added after running script to make changes. Add new files in release_docs to MANIFEST. Cimmit changes to Makefile.in(s) and H5PL.c that resulted from running autogen.sh. Merge pull request #407 in HDFFV/hdf5 from ~LRKNOX/hdf5_lrk:hdf5_1_10_1 to hdf5_1_10_1 Change copyright headers to replace url referring to file to be removed and replace it with new url for COPYING file.
967 lines
26 KiB
Bash
Executable File
967 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 COPYING file, which can be found at the root of the source code
|
|
# distribution tree, or in https://support.hdfgroup.org/ftp/HDF5/releases.
|
|
# 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
|