#!/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. testresourcesdir=src/test/resources combconfsdir=$testresourcesdir/combinationConfigFiles combtestfile=$testresourcesdir/abfs-combination-test-configs.xml logdir=dev-support/testlogs testresultsregex="Results:(\n|.)*?Tests run:" testresultsfilename= starttime= threadcount= defaultthreadcount=8 properties= values= validate() { if [ -z "$threadcount" ] ; then threadcount=$defaultthreadcount fi numberegex='^[0-9]+$' if ! [[ $threadcount =~ $numberegex ]] ; then echo "Exiting. The script param (threadcount) should be a number" exit -1 fi if [ -z "$combination" ]; then echo "Exiting. combination cannot be empty" exit -1 fi propertiessize=${#properties[@]} valuessize=${#values[@]} if [ "$propertiessize" -lt 1 ] || [ "$valuessize" -lt 1 ] || [ "$propertiessize" -ne "$valuessize" ]; then echo "Exiting. Both properties and values arrays has to be populated and of same size. Please check for combination $combination" exit -1 fi for filename in "${combinations[@]}"; do if [[ ! -f "$combconfsdir/$filename.xml" ]]; then echo "Exiting. Combination config file ($combconfsdir/$combination.xml) does not exist." exit -1 fi done } checkdependencies() { if ! [ "$(command -v pcregrep)" ]; then echo "Exiting. pcregrep is required to run the script." exit -1 fi if ! [ "$(command -v xmlstarlet)" ]; then echo "Exiting. xmlstarlet is required to run the script." exit -1 fi } cleancombinationconfigs() { rm -rf $combconfsdir mkdir -p $combconfsdir } generateconfigs() { combconffile="$combconfsdir/$combination.xml" rm -rf "$combconffile" cat > "$combconffile" << ENDOFFILE ENDOFFILE propertiessize=${#properties[@]} valuessize=${#values[@]} if [ "$propertiessize" -ne "$valuessize" ]; then echo "Exiting. Number of properties and values differ for $combination" exit -1 fi for ((i = 0; i < propertiessize; i++)); do key=${properties[$i]} val=${values[$i]} changeconf "$key" "$val" done formatxml "$combconffile" } formatxml() { xmlstarlet fo -s 2 "$1" > "$1.tmp" mv "$1.tmp" "$1" } setactiveconf() { if [[ ! -f "$combconfsdir/$combination.xml" ]]; then echo "Exiting. Combination config file ($combconfsdir/$combination.xml) does not exist." exit -1 fi rm -rf $combtestfile cat > $combtestfile << ENDOFFILE ENDOFFILE xmlstarlet ed -P -L -s /configuration -t elem -n include -v "" $combtestfile xmlstarlet ed -P -L -i /configuration/include -t attr -n href -v "combinationConfigFiles/$combination.xml" $combtestfile xmlstarlet ed -P -L -i /configuration/include -t attr -n xmlns -v "http://www.w3.org/2001/XInclude" $combtestfile formatxml $combtestfile } changeconf() { xmlstarlet ed -P -L -d "/configuration/property[name='$1']" "$combconffile" 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 "$combconffile" if ! xmlstarlet ed -P -L -s "/configuration/property[name='$1']" -t elem -n value -v "$2" "$combconffile" then echo "Exiting. Changing config property failed." exit -1 fi } summary() { { echo "" echo "$combination" echo "========================" pcregrep -M "$testresultsregex" "$testlogfilename" } >> "$testresultsfilename" printf "\n----- Test results -----\n" pcregrep -M "$testresultsregex" "$testlogfilename" secondstaken=$((ENDTIME - STARTTIME)) mins=$((secondstaken / 60)) secs=$((secondstaken % 60)) printf "\nTime taken: %s mins %s secs.\n" "$mins" "$secs" echo "Find test logs for the combination ($combination) in: $testlogfilename" echo "Find consolidated test results in: $testresultsfilename" echo "----------" } init() { checkdependencies if ! mvn clean install -DskipTests then echo "" echo "Exiting. Build failed." exit -1 fi starttime=$(date +"%Y-%m-%d_%H-%M-%S") mkdir -p "$logdir" testresultsfilename="$logdir/$starttime/Test-Results.txt" if [[ -z "$combinations" ]]; then combinations=( $( ls $combconfsdir/*.xml )) fi } runtests() { parseoptions "$@" validate if [ -z "$starttime" ]; then init fi shopt -s nullglob for combconffile in "${combinations[@]}"; do STARTTIME=$(date +%s) combination=$(basename "$combconffile" .xml) mkdir -p "$logdir/$starttime" testlogfilename="$logdir/$starttime/Test-Logs-$combination.txt" printf "\nRunning the combination: %s..." "$combination" setactiveconf mvn -T 1C -Dparallel-tests=abfs -Dscale -DtestsThreadCount=$threadcount verify >> "$testlogfilename" || true ENDTIME=$(date +%s) summary done } begin() { cleancombinationconfigs } parseoptions() { runactivate=0 runtests=0 while getopts ":c:a:t:" option; do case "${option}" in a) if [[ "$runactivate" -eq "1" ]]; then echo "-a Option is not multivalued" exit 1 fi runactivate=1 combination=$(basename "$OPTARG" .xml) ;; c) runtests=1 combination=$(basename "$OPTARG" .xml) combinations+=("$combination") ;; t) threadcount=$OPTARG ;; *|?|h) if [[ -z "$combinations" ]]; then combinations=( $( ls $combconfsdir/*.xml )) fi combstr="" for combconffile in "${combinations[@]}"; do combname=$(basename "$combconffile" .xml) combstr="${combname}, ${combstr}" done combstr=${combstr:0:-2} echo "Usage: $0 [-n] [-a COMBINATION_NAME] [-c COMBINATION_NAME] [-t THREAD_COUNT]" echo "" echo "Where:" echo " -a COMBINATION_NAME Specify the combination name which needs to be activated." echo " Configured combinations: ${combstr}" echo " -c COMBINATION_NAME Specify the combination name for test runs" echo " -t THREAD_COUNT Specify the thread count" exit 1 ;; esac done if [[ "$runactivate" -eq "1" && "$runtests" -eq "1" ]]; then echo "Both activate (-a option) and test run combinations (-c option) cannot be specified together" exit 1 fi if [[ "$runactivate" -eq "1" ]]; then setactiveconf exit 0 fi }