hbase/dev-support/test-util.sh

205 lines
4.7 KiB
Bash
Executable File

#!/usr/bin/env bash
#
#/**
# * Licensed to the Apache Software Foundation (ASF) under one
# * or more contributor license agreements. See the NOTICE file
# * distributed with this work for additional information
# * regarding copyright ownership. The ASF licenses this file
# * to you under the Apache License, Version 2.0 (the
# * "License"); you may not use this file except in compliance
# * with the License. You may obtain a copy of the License at
# *
# * http://www.apache.org/licenses/LICENSE-2.0
# *
# * Unless required by applicable law or agreed to in writing, software
# * distributed under the License is distributed on an "AS IS" BASIS,
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# * See the License for the specific language governing permissions and
# * limitations under the License.
# */
usage()
{
cat << EOF
usage: $0 [options] [test-name...]
Run a set of hbase tests. Individual tests may be specified on the
command line or in a file using -f, with one test per line. Runs all
tests by default. Each specified tests should include the fully
qualified package name.
options:
-h Show this message
-c Run 'mvn clean' before running the tests
-f FILE Run the additional tests listed in the FILE
-u Only run unit tests. Default is to run
unit and integration tests
-n N Run each test N times. Default = 1.
-s N Print N slowest tests
-H Print which tests are hanging (if any)
-e Echo the maven call before running. Default: not enabled
-r Runs remotely, on the build server. Default: not enabled
EOF
}
echoUsage=0
server=0
testFile=
doClean=""
testType=verify
numIters=1
showSlowest=
showHanging=
# normalize path refs for surefire
if [[ "$0" != /* ]]; then
# relative path
scriptDir=`pwd`/$(dirname $0)
else
# absolute path
scriptDir=$(dirname $0)
fi
testDir=$scriptDir/../../../target/surefire-reports
while getopts "hcerHun:s:f:" OPTION
do
case $OPTION in
h)
usage
exit 0
;;
c)
doClean="clean"
;;
H)
showHanging=1
;;
u)
testType=test
;;
n)
numIters=$OPTARG
;;
s)
showSlowest=$OPTARG
;;
f)
testFile=$OPTARG
;;
e)
echoUsage=1
;;
r)
server=1
;;
?)
usage
exit 1
esac
done
testIdx=0
# add tests specified in a file
if [ ! -z $testFile ]; then
exec 3<$testFile
while read <&3 line ; do
if [ ! -z "$line" ]; then
test[$testIdx]="$line"
fi
testIdx=$(($testIdx+1))
done
fi
# add tests specified on cmd line
if [ ! -z $BASH_ARGC ]; then
shift $(($OPTIND - 1))
for (( i = $OPTIND; i <= $BASH_ARGC; i++ ))
do
test[$testIdx]=$1;
testIdx=$(($testIdx+1))
shift
done
fi
echo "Running tests..."
numTests=${#test[@]}
for (( i = 1 ; i <= $numIters; i++ ))
do
if [[ $numTests > 0 ]]; then
#Now loop through each test
for (( j = 0; j < $numTests; j++ ))
do
# Create the general command
cmd="nice -10 mvn $doClean $testType -Dtest=${test[$j]}"
# Add that is should run locally, if not on the server
if [ ${server} -eq 0 ]; then
cmd="${cmd} -P localTests"
fi
# Print the command, if we should
if [ ${echoUsage} -eq 1 ]; then
echo "${cmd}"
fi
# Run the command
$cmd
if [ $? -ne 0 ]; then
echo "${test[$j]} failed, iteration: $i"
exit 1
fi
done
else
echo "EXECUTING ALL TESTS"
# Create the general command
cmd="nice -10 mvn $doClean $testType"
# Add that is should run locally, if not on the server
if [ ${server} -eq 0 ]; then
cmd="${cmd} -P localTests"
fi
# Print the command, if we should
if [ ${echoUsage} -eq 1 ]; then
echo "${cmd}"
fi
#now run the command
$cmd
fi
done
# Print a report of the slowest running tests
if [ ! -z $showSlowest ]; then
testNameIdx=0
for (( i = 0; i < ${#test[@]}; i++ ))
do
testNames[$i]=$testDir/'TEST-'${test[$i]}'.xml'
done
echo "Slowest $showSlowest tests:"
awk '/<testsuite/ { \
gsub(/\"/,""); \
gsub(/>/,""); \
split($7,testname,"="); \
split($3,time,"="); \
print testname[2]"\t"time[2]}' \
${testNames[@]} \
| sort -k2,2rn \
| head -n $showSlowest
fi
# Print a report of tests that hung
if [ ! -z $showHanging ]; then
echo "Hanging tests:"
find $testDir -type f -name *.xml -size 0k \
| xargs basename \
| cut -d"." -f -1
fi