hadoop/hadoop-tools/hadoop-azure/dev-support/testrun-scripts/testsupport.sh
2024-04-12 17:52:47 +01:00

211 lines
6.7 KiB
Bash

#!/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.
resourceDir=src/test/resources/
accountSettingsFolderName=accountSettings
combtestfile=$resourceDir
combtestfile+=abfs-combination-test-configs.xml
logdir=dev-support/testlogs/
# Regex to filter out final test stats
testresultsregex="Tests run: [0-9]+, Failures: [0-9]+, Errors: [0-9]+, Skipped: [0-9]+$"
# Regex to filter out the test that failed due to unexpected output or error.
failedTestRegex1="<<< FAILURE!$"
# Regex to filter out the test that failed due to runtime exception.
failedTestRegex2="<<< ERROR!$"
# Regex to remove the formatting used by mvn output for better regex matching.
removeFormattingRegex="s/\x1b\[[0-9;]*m//g"
accountConfigFileSuffix="_settings.xml"
separatorbar1="============================================================"
separatorbar2="------------------------------"
testOutputLogFolder=$logdir
testlogfilename=combinationTestLogFile
fullRunStartTime=$(date +%s)
STARTTIME=$(date +%s)
ENDTIME=$(date +%s)
outputFormatOn="\033[0;95m"
outputFormatOff="\033[0m"
triggerRun()
{
echo ' '
combination=$1
accountName=$2
runTest=$3
processcount=$4
cleanUpTestContainers=$5
if [ -z "$accountName" ]; then
logOutput "ERROR: Test account not configured. Re-run the script and choose SET_OR_CHANGE_TEST_ACCOUNT to configure the test account."
exit 1;
fi
accountConfigFile=$accountSettingsFolderName/$accountName$accountConfigFileSuffix
rm -rf $combtestfile
cat > $combtestfile << ENDOFFILE
<configuration>
</configuration>
ENDOFFILE
propertiessize=${#PROPERTIES[@]}
valuessize=${#VALUES[@]}
if [ "$propertiessize" -ne "$valuessize" ]; then
logOutput "Exiting. Number of properties and values differ for $combination"
exit 1
fi
echo "$separatorbar1"
echo "$combination"
echo "$separatorbar1"
# First include the account specific configurations.
xmlstarlet ed -P -L -s /configuration -t elem -n include -v "" $combtestfile
xmlstarlet ed -P -L -i /configuration/include -t attr -n href -v "$accountConfigFile" $combtestfile
xmlstarlet ed -P -L -i /configuration/include -t attr -n xmlns -v "http://www.w3.org/2001/XInclude" $combtestfile
# Override the combination specific configurations.
for ((i = 0; i < propertiessize; i++)); do
key=${PROPERTIES[$i]}
val=${VALUES[$i]}
echo "Combination specific property setting: [ key=$key , value=$val ]"
changeconf "$key" "$val"
done
formatxml "$combtestfile"
echo ' '
echo "Activated [$combtestfile] - for account: $accountName for combination $combination"
testlogfilename="$testOutputLogFolder/Test-Logs-$combination.txt"
touch "$testlogfilename"
if [ "$runTest" == true ]
then
STARTTIME=$(date +%s)
echo "Running test for combination $combination on account $accountName [ProcessCount=$processcount]"
logOutput "Test run report can be seen in $testlogfilename"
mvn -T 1C -Dparallel-tests=abfs -Dscale -DtestsThreadCount="$processcount" verify >> "$testlogfilename" || true
# Remove the formatting used by mvn output for better regex matching.
sed -i "$removeFormattingRegex" "$testlogfilename"
ENDTIME=$(date +%s)
summary
fi
if [ "$cleanUpTestContainers" == true ]
then
mvn test -Dtest=org.apache.hadoop.fs.azurebfs.utils.CleanupTestContainers >> "$testlogfilename" || true
if grep -q "There are test failures" "$testlogfilename";
then logOutput "ERROR: All test containers could not be deleted. Detailed error cause in $testlogfilename"
pcregrep -M "$testresultsregex" "$testlogfilename"
exit 0
fi
logOutput "Delete test containers - complete. Test run logs in - $testlogfilename"
fi
}
summary() {
{
echo ""
echo "$separatorbar1"
echo "$combination"
echo "$separatorbar1"
summarycontent
} >> "$aggregatedTestResult"
printf "\n----- Test results -----\n"
summarycontent
secondstaken=$((ENDTIME - STARTTIME))
mins=$((secondstaken / 60))
secs=$((secondstaken % 60))
printf "\nTime taken: %s mins %s secs.\n" "$mins" "$secs"
logOutput "For Error details refer to Test run report in: $testlogfilename"
logOutput "Consolidated test result is saved in: $aggregatedTestResult"
echo "$separatorbar2"
}
summarycontent() {
output=$(pcregrep -M "$failedTestRegex1" "$testlogfilename" || true)
if [ -n "$output" ]; then
echo "$output"
fi
output=$(pcregrep -M "$failedTestRegex2" "$testlogfilename" || true)
if [ -n "$output" ]; then
echo ""
echo "$output"
fi
output=$(pcregrep -M "$testresultsregex" "$testlogfilename" || true)
if [ -n "$output" ]; then
echo ""
echo "$output"
fi
}
checkdependencies() {
if ! [ "$(command -v pcregrep)" ]; then
logOutput "Exiting. pcregrep is required to run the script."
exit 1
fi
if ! [ "$(command -v xmlstarlet)" ]; then
logOutput "Exiting. xmlstarlet is required to run the script."
exit 1
fi
}
formatxml() {
xmlstarlet fo -s 2 "$1" > "$1.tmp"
mv "$1.tmp" "$1"
}
changeconf() {
xmlstarlet ed -P -L -d "/configuration/property[name='$1']" "$combtestfile"
xmlstarlet ed -P -L -s /configuration -t elem -n propertyTMP -v "" -s /configuration/propertyTMP -t elem -n name -v "$1" -r /configuration/propertyTMP -v property "$combtestfile"
if ! xmlstarlet ed -P -L -s "/configuration/property[name='$1']" -t elem -n value -v "$2" "$combtestfile"
then
logOutput "Exiting. Changing config property failed."
exit 1
fi
}
init() {
checkdependencies
if ! mvn clean install -DskipTests
then
echo ""
echo "Exiting. Build failed."
exit 1
fi
starttime=$(date +"%Y-%m-%d_%H-%M-%S")
testOutputLogFolder+=$starttime
mkdir -p "$testOutputLogFolder"
aggregatedTestResult="$testOutputLogFolder/Test-Results.txt"
}
printAggregate() {
echo :::: AGGREGATED TEST RESULT ::::
cat "$aggregatedTestResult"
fullRunEndTime=$(date +%s)
fullRunTimeInSecs=$((fullRunEndTime - fullRunStartTime))
mins=$((fullRunTimeInSecs / 60))
secs=$((fullRunTimeInSecs % 60))
printf "\nTime taken: %s mins %s secs.\n" "$mins" "$secs"
}
logOutput() {
echo -e "$outputFormatOn" "$1" "$outputFormatOff"
}