keycloak-scim/testsuite/performance/stress-test.sh

118 lines
3.3 KiB
Bash
Raw Normal View History

2018-03-26 16:05:29 +00:00
#!/bin/bash
BASEDIR=$(cd "$(dirname "$0")"; pwd)
cd $BASEDIR
. ./stress-test-config.sh
MVN=${MVN:-mvn}
PROVISIONING_PARAMETERS=${PROVISIONING_PARAMETERS:-}
PROVISION_COMMAND="$MVN verify -P provision,import-dump $PROVISIONING_PARAMETERS -Ddataset=$dataset"
TEARDOWN_COMMAND="$MVN verify -P teardown"
function runCommand {
echo " $1"
echo
if ! $debug; then eval "$1"; fi
}
function runTest {
# use specified warmUpPeriod only in the first iteration, or if provisioning is enabled
if [[ $i == 0 || $provisioning == true ]]; then
warmUpParameter="-DwarmUpPeriod=$warmUpPeriod ";
else
warmUpParameter="-DwarmUpPeriod=0 ";
fi
if [[ $sequentialUsersFrom == -1 || $provisioning == true ]]; then
sequentialUsers=$sequentialUsersFrom
else
sequentialUsers=`echo "$sequentialUsersFrom * ( $i + 1 )" | bc`
fi
TEST_COMMAND="$MVN verify -Ptest $@ -Ddataset=$dataset $warmUpParameter -DfilterResults=true -DsequentialUsersFrom=$sequentialUsers -DusersPerSec=$usersPerSec"
echo "ITERATION: $(( i+1 )) / $maxIterations $ITERATION_INFO"
echo
if $provisioning; then
runCommand "$PROVISION_COMMAND"
if [[ $? != 0 ]]; then
echo "Provisioning failed."
runCommand "$TEARDOWN_COMMAND" || break
break
fi
runCommand "$TEST_COMMAND"
export testResult=$?
runCommand "$TEARDOWN_COMMAND" || exit 1
else
runCommand "$TEST_COMMAND"
export testResult=$?
fi
[[ $testResult != 0 ]] && echo "Test exit code: $testResult"
}
echo "Starting ${algorithm} stress test"
echo
usersPerSecTop=0
case "${algorithm}" in
incremental)
for (( i=0; i < $maxIterations; i++)); do
usersPerSec=`echo "$usersPerSec0 + $i * $incrementFactor" | bc`
runTest $@
if [[ $testResult == 0 ]]; then
usersPerSecTop=$usersPerSec
else
echo "INFO: Last iteration failed. Stopping the loop."
break
fi
done
;;
bisection)
for (( i=0; i < $maxIterations; i++)); do
intervalSize=`echo "$highPoint - $lowPoint" | bc`
usersPerSec=`echo "$lowPoint + $intervalSize * 0.5" | bc`
if [[ `echo "$intervalSize < $tolerance" | bc` == 1 ]]; then echo "INFO: intervalSize < tolerance. Stopping the loop."; break; fi
if [[ `echo "$intervalSize < 0" | bc` == 1 ]]; then echo "ERROR: Invalid state: lowPoint > highPoint. Stopping the loop."; exit 1; fi
ITERATION_INFO="L: $lowPoint H: $highPoint intervalSize: $intervalSize tolerance: $tolerance"
runTest $@
if [[ $testResult == 0 ]]; then
usersPerSecTop=$usersPerSec
echo "INFO: Last iteration succeeded. Continuing with the upper half of the interval."
lowPoint=$usersPerSec
else
echo "INFO: Last iteration failed. Continuing with the lower half of the interval."
highPoint=$usersPerSec
fi
done
;;
*)
echo "Algorithm '${algorithm}' not supported."
exit 1
;;
esac
echo "Highest load with passing test: $usersPerSecTop users per second"