blob: dd75d6bf75c0450dd21aecbfc272d2f66e717f9b [file] [log] [blame]
#!/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.
#
set -e
BASE_DIR=$(pwd)
SOURCE="${BASH_SOURCE[0]}"
while [[ -h "$SOURCE" ]]; do # resolve $SOURCE until the file is no longer a symlink
SCRIPTDIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
SOURCE="$(readlink "$SOURCE")"
[[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
done
SCRIPTDIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
function changes_for_path() {
pushd geode >> /dev/null
local path="$1" # only expand once in the line below
# Get the last release tag on the branch
local releaseTag=$(git describe --abbrev=0 --tags)
local releaseBase=$(git rev-list -n 1 $releaseTag) || exit $?
if [[ "${releaseBase}" == "" ]]; then
echo "Could not determine release base. Exiting..."
exit 1
fi
git diff --name-only ${releaseBase} -- $path
popd >> /dev/null
}
UNIT_TEST_CHANGES=$(changes_for_path '*/src/test/java') || exit $?
INTEGRATION_TEST_CHANGES=$(changes_for_path '*/src/integrationTest/java') || exit $?
DISTRIBUTED_TEST_CHANGES=$(changes_for_path '*/src/distributedTest/java') || exit $?
ACCEPTANCE_TEST_CHANGES=$(changes_for_path '*/src/acceptanceTest/java') || exit $?
UPGRADE_TEST_CHANGES=$(changes_for_path '*/src/upgradeTest/java') || exit $?
CHANGED_FILES_ARRAY=( $UNIT_TEST_CHANGES $INTEGRATION_TEST_CHANGES $DISTRIBUTED_TEST_CHANGES $ACCEPTANCE_TEST_CHANGES $UPGRADE_TEST_CHANGES )
NUM_CHANGED_FILES=${#CHANGED_FILES_ARRAY[@]}
echo "${NUM_CHANGED_FILES} changed tests"
if [[ "${NUM_CHANGED_FILES}" -eq 0 ]]
then
echo "No changed test files, nothing to test."
exit 0
fi
if [[ "${NUM_CHANGED_FILES}" -gt 25 ]]
then
echo "${NUM_CHANGED_FILES} is too many changed tests to stress test. Allowing this job to pass without stress testing."
exit 0
fi
TEST_TARGETS=""
function append_to_test_targets() {
local target="$1"
local files="$2"
if [[ -n "$files" ]]
then
TEST_TARGETS="$TEST_TARGETS $target"
for FILENAME in $files
do
SHORT_NAME=$(basename $FILENAME)
SHORT_NAME="${SHORT_NAME%.java}"
TEST_TARGETS="$TEST_TARGETS --tests $SHORT_NAME"
done
fi
}
append_to_test_targets "repeatUnitTest" "$UNIT_TEST_CHANGES"
append_to_test_targets "repeatIntegrationTest" "$INTEGRATION_TEST_CHANGES"
append_to_test_targets "repeatDistributedTest" "$DISTRIBUTED_TEST_CHANGES"
append_to_test_targets "repeatUpgradeTest" "$UPGRADE_TEST_CHANGES"
# Acceptance tests cannot currently run in parallel, so do not stress these tests
#append_to_test_targets "repeatAcceptanceTest" "$ACCEPTANCE_TEST_CHANGES"
export GRADLE_TASK="compileTestJava compileIntegrationTestJava compileDistributedTestJava $TEST_TARGETS"
export GRADLE_TASK_OPTIONS="--no-parallel -Prepeat=50 -PfailOnNoMatchingTests=false"
echo "---------------------------------------------------"
echo "GRADLE_TASK_OPTIONS=${GRADLE_TASK_OPTIONS}"
echo "GRADLE_TASK=${GRADLE_TASK}"
echo "---------------------------------------------------"
REPODIR=$(cd geode; git rev-parse --show-toplevel)
if [[ ${PARALLEL_GRADLE:-"true"} == "true" ]]; then
PARALLEL_GRADLE="--parallel"
else
PARALLEL_GRADLE="--no-parallel"
fi
DEFAULT_GRADLE_TASK_OPTIONS="${PARALLEL_GRADLE} --console=plain --no-daemon"
GRADLE_SKIP_TASK_OPTIONS="-x javadoc -x spotlessCheck -x rat"
if [[ -n "${PARALLEL_DUNIT}" && "${PARALLEL_DUNIT}" == "true" ]]; then
PARALLEL_DUNIT="-PparallelDunit -PdunitDockerUser=geode"
if [ -n "${DUNIT_PARALLEL_FORKS}" ]; then
DUNIT_PARALLEL_FORKS="-PdunitParallelForks=${DUNIT_PARALLEL_FORKS}"
fi
else
PARALLEL_DUNIT=""
DUNIT_PARALLEL_FORKS=""
fi
case $ARTIFACT_SLUG in
windows*)
JAVA_BUILD_PATH=C:/java${JAVA_BUILD_VERSION}
JAVA_TEST_PATH=C:/java${JAVA_TEST_VERSION}
SEP=";"
;;
*)
JAVA_BUILD_PATH=/usr/lib/jvm/java-${JAVA_BUILD_VERSION}-openjdk-amd64
JAVA_TEST_PATH=/usr/lib/jvm/java-${JAVA_TEST_VERSION}-openjdk-amd64
SEP="&&"
;;
esac
GRADLE_ARGS=" \
-PcompileJVM=${JAVA_BUILD_PATH} \
-PcompileJVMVer=${JAVA_BUILD_VERSION} \
-PtestJVM=${JAVA_TEST_PATH} \
-PtestJVMVer=${JAVA_TEST_VERSION} \
${PARALLEL_DUNIT} \
${DUNIT_PARALLEL_FORKS} \
-PdunitDockerImage=\$(docker images --format '{{.Repository}}:{{.Tag}}' | grep test-container) \
${DEFAULT_GRADLE_TASK_OPTIONS} \
${GRADLE_SKIP_TASK_OPTIONS} \
${GRADLE_TASK} \
${GRADLE_TASK_OPTIONS} \
${GRADLE_GLOBAL_ARGS}"
EXEC_COMMAND="bash -c 'echo Building with: $SEP \
${JAVA_BUILD_PATH}/bin/java -version $SEP \
echo Testing with: $SEP \
${JAVA_TEST_PATH}/bin/java -version $SEP \
cd geode $SEP \
cp gradlew gradlewStrict $SEP \
sed -e 's/JAVA_HOME/GRADLE_JVM/g' -i.bak gradlewStrict $SEP \
GRADLE_JVM=${JAVA_BUILD_PATH} ./gradlewStrict ${GRADLE_ARGS}'"
echo "${EXEC_COMMAND}"
eval "${EXEC_COMMAND}"
# Cleanup
# Make sure all test containers are stopped and removed when tests are finished
DOCKER_CONTAINERS=$(sudo docker ps -a -q 2> /dev/null)
if [ -n "${DOCKER_CONTAINERS}" ]; then
docker stop ${DOCKER_CONTAINERS} > /dev/null
echo -e "Removing containers with ID:"
docker rm ${DOCKER_CONTAINERS}
fi