diff --git a/build.gradle b/build.gradle index df7a04c7de1d..a111eacc4aaf 100755 --- a/build.gradle +++ b/build.gradle @@ -82,16 +82,12 @@ if (name == 'geode') { ext.scriptDir = 'gradle' } -if (project.hasProperty('parallelDunit')) { - def pwd = System.getenv('PWD') - def geodeDir = new File(pwd).getCanonicalPath() - ext.dunitDockerVolumes = ["${geodeDir}":geodeDir] -} apply from: "${scriptDir}/utilities.gradle" apply from: "${scriptDir}/java.gradle" apply from: "${scriptDir}/dependency-resolution.gradle" apply from: "${scriptDir}/test.gradle" +apply from: "${scriptDir}/test-by-category.gradle" apply from: "${scriptDir}/publish.gradle" apply from: "${scriptDir}/code-analysis.gradle" apply from: "${scriptDir}/sonar.gradle" diff --git a/ci/scripts/test-run.sh b/ci/scripts/test-run.sh deleted file mode 100755 index 887e211cf6be..000000000000 --- a/ci/scripts/test-run.sh +++ /dev/null @@ -1,159 +0,0 @@ -#!/usr/local/bin/tini-wrapper /bin/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 - -export TERM=${TERM:-dumb} -export BUILDROOT=$(pwd) -export DEST_DIR=${BUILDROOT}/built-geode -export GRADLE_TASK=${1} -export BASE_FILENAME=${2} -export TMPDIR=${DEST_DIR}/tmp -export GEODE_BUILD=${DEST_DIR}/test -export GEODE_BUILD_VERSION_NUMBER=$(grep "versionNumber *=" geode/gradle.properties | awk -F "=" '{print $2}' | tr -d ' ') - -GEODE_BUILD_VERSION_FILE=${BUILDROOT}/geode-build-version/number -GEODE_PULL_REQUEST_ID_FILE=${BUILDROOT}/geode/.git/id -if [ -e "${GEODE_PULL_REQUEST_ID_FILE}" ]; then - GEODE_PULL_REQUEST_ID=$(cat ${GEODE_PULL_REQUEST_ID_FILE}) -fi - -if [ ! -e "${GEODE_BUILD_VERSION_FILE}" ] && [ -z "${GEODE_PULL_REQUEST_ID}" ]; then - echo "${GEODE_BUILD_VERSION_FILE} file does not exist. Concourse is probably not configured correctly." - exit 1 -fi -if [ -z ${MAINTENANCE_VERSION+x} ]; then - echo "MAINTENANCE_VERSION is unset. Check your pipeline configuration and make sure this script is called properly." - exit 1 -fi - -EMAIL_SUBJECT="${BUILDROOT}/built-geode/subject" -EMAIL_BODY="${BUILDROOT}/built-geode/body" - -echo "Geode unit tests '\${BUILD_PIPELINE_NAME}/\${BUILD_JOB_NAME}' took too long to execute" > $EMAIL_SUBJECT -echo "Pipeline results can be found at:" >$EMAIL_BODY -echo "" >>$EMAIL_BODY -echo "Concourse: \${ATC_EXTERNAL_URL}/teams/\${BUILD_TEAM_NAME}/pipelines/\${BUILD_PIPELINE_NAME}/jobs/\${BUILD_JOB_NAME}/builds/\${BUILD_NAME}" >>$EMAIL_BODY -echo "" >>$EMAIL_BODY - -# Called by trap when the script is exiting -function error_exit() { - echo "Geode unit tests completed in '\${BUILD_PIPELINE_NAME}/\${BUILD_JOB_NAME}' with non-zero exit code" > $EMAIL_SUBJECT - echo "Pipeline results can be found at:" >$EMAIL_BODY - echo "" >>$EMAIL_BODY - echo "Concourse: \${ATC_EXTERNAL_URL}/teams/\${BUILD_TEAM_NAME}/pipelines/\${BUILD_PIPELINE_NAME}/jobs/\${BUILD_JOB_NAME}/builds/\${BUILD_NAME}" >>$EMAIL_BODY - echo "" >>$EMAIL_BODY -} - -trap error_exit ERR -if [ -z "${GEODE_PULL_REQUEST_ID}" ]; then - CONCOURSE_VERSION=$(cat ${GEODE_BUILD_VERSION_FILE}) - CONCOURSE_PRODUCT_VERSION=${CONCOURSE_VERSION%%-*} - GEODE_PRODUCT_VERSION=${GEODE_BUILD_VERSION_NUMBER} - CONCOURSE_BUILD_SLUG=${CONCOURSE_VERSION##*-} - BUILD_ID=${CONCOURSE_VERSION##*.} - FULL_PRODUCT_VERSION=${GEODE_PRODUCT_VERSION}-${CONCOURSE_BUILD_SLUG} - echo "Concourse VERSION is ${CONCOURSE_VERSION}" - echo "Product VERSION is ${FULL_PRODUCT_VERSION}" - echo "Build ID is ${BUILD_ID}" -else - FULL_PRODUCT_VERSION="geode-pr-${GEODE_PULL_REQUEST_ID}" -fi - -printf "\nUsing the following JDK:" -java -version -printf "\n\n" - -directories_file=${DEST_DIR}/artifact_directories -mkdir -p ${TMPDIR} - -echo "TMPDIR = ${TMPDIR}" -echo "GRADLE_TASK = ${GRADLE_TASK}" -echo "BASE_FILENAME = ${BASE_FILENAME}" - -DOCKER_RESOURCE="docker-geode-build-image" -DOCKER_PIDFILE="/var/run/docker.pid" - -if [ -e ${DOCKER_RESOURCE}/rootfs.tar ]; then - if [ -e /usr/local/bin/initdocker ]; then - echo "Initializing Docker environment..." - /usr/local/bin/initdocker || true - - # Stuff like ENV settings don't automatically get imported - CHANGE=() - for i in $(jq -r '.env | .[]' ${DOCKER_RESOURCE}/metadata.json); do - CHANGE+=( $(echo "$i" | awk -F= '{printf("--change \"ENV %s %s\"", $1, $2)}') ) - done - - REPO=$(cat ${DOCKER_RESOURCE}/repository) - echo "Importing Docker image..." - eval "docker import ${CHANGE[@]} ${DOCKER_RESOURCE}/rootfs.tar $REPO" - DUNIT_DOCKER_IMAGE="-PdunitDockerImage=${REPO}" - echo "Docker initialization complete." - fi -fi - -DEFAULT_GRADLE_TASK_OPTIONS="--no-daemon -x javadoc -x spotlessCheck" - -mkdir -p ${GEODE_BUILD} -if [ -v CALL_STACK_TIMEOUT ]; then - geode-ci/ci/scripts/capture-call-stacks.sh ${CALL_STACK_TIMEOUT} & -fi - -pushd geode - tar cf - * | (cd ${GEODE_BUILD}; tar xpf -) -popd - -export FILENAME=${BASE_FILENAME}-${FULL_PRODUCT_VERSION}.tgz - -if [[ -n "${PARALLEL_DUNIT}" && "${PARALLEL_DUNIT}" == "true" ]]; then - PARALLEL_DUNIT="-PparallelDunit" - if [ -n "${DUNIT_PARALLEL_FORKS}" ]; then - DUNIT_PARALLEL_FORKS="-PdunitParallelForks=${DUNIT_PARALLEL_FORKS}" - fi -else - PARALLEL_DUNIT="" - DUNIT_PARALLEL_FORKS="" -fi - -pushd ${GEODE_BUILD} - set +e - echo "Running tests" - set -x -# ./gradlew --no-daemon -x javadoc -x spotlessCheck :geode-assembly:acceptanceTest --tests org.apache.geode.management.internal.cli.commands.PutCommandWithJsonTest - ./gradlew ${PARALLEL_DUNIT} ${DUNIT_PARALLEL_FORKS} ${DUNIT_DOCKER_IMAGE} \ - --system-prop "java.io.tmpdir=${TMPDIR}" ${DEFAULT_GRADLE_TASK_OPTIONS} ${GRADLE_TASK_OPTIONS} ${GRADLE_TASK} - export GRADLE_EXIT_STATUS=$? - set +x -popd - -echo "*************************************************************" -echo "Results information is located in the 'archive-results' task" -echo "*************************************************************" - -echo "GRADLE_EXIT_STATUS is ${GRADLE_EXIT_STATUS}" - - -if [ -e ${DOCKER_PIDFILE} ]; then - kill $(cat ${DOCKER_PIDFILE}) -fi - -if [[ "${GRADLE_EXIT_STATUS}" != "0" && "${GRADLE_TASK}" == "test" ]]; then - error_exit -fi -exit ${GRADLE_EXIT_STATUS} diff --git a/gradle/docker.gradle b/gradle/docker.gradle index c0f28152ed40..ec08ab7a92e8 100644 --- a/gradle/docker.gradle +++ b/gradle/docker.gradle @@ -38,6 +38,13 @@ * The default is 'root'. */ + +if (project.hasProperty('parallelDunit')) { + def pwd = System.getenv('PWD') + def geodeDir = new File(pwd).getCanonicalPath() + ext.dunitDockerVolumes = ["${geodeDir}":geodeDir] +} + def dockerConfig = { maxParallelForks = dunitParallelForks.toInteger() @@ -110,5 +117,9 @@ subprojects { distributedTest.configure(dockerConfig) upgradeTest.configure(dockerConfig) repeatTest.configure(dockerConfig) + integrationTest.configure(dockerConfig) +// ACCEPTANCE TEST NEEDS DOCKER-COMPOSE TO WORK WITHIN DOCKER FIRST +// acceptanceTest.configure(dockerConfig) + uiTest.configure(dockerConfig) } } diff --git a/gradle/test-by-category.gradle b/gradle/test-by-category.gradle new file mode 100644 index 000000000000..02268f1976ec --- /dev/null +++ b/gradle/test-by-category.gradle @@ -0,0 +1,252 @@ +import org.apache.geode.gradle.TestPropertiesWriter + +/* + * 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. + */ + + +subprojects { + dependencies { + testCompile('com.github.stefanbirkner:system-rules:' + project.'system-rules.version') { + exclude module: 'junit-dep' + } + testCompile 'com.google.code.tempus-fugit:tempus-fugit:' + project.'tempus-fugit.version' + testCompile 'org.awaitility:awaitility:' + project.'awaitility.version' + testCompile 'edu.umd.cs.mtc:multithreadedtc:' + project.'multithreadedtc.version' + testCompile 'eu.codearte.catch-exception:catch-exception:' + project.'catch-exception.version' + testCompile 'eu.codearte.catch-exception:catch-throwable:' + project.'catch-throwable.version' + testCompile 'junit:junit:' + project.'junit.version' + testCompile 'org.assertj:assertj-core:' + project.'assertj-core.version' + testCompile 'org.hamcrest:hamcrest-all:' + project.'hamcrest-all.version' + testCompile 'org.jmock:jmock-junit4:' + project.'jmock.version' + testCompile 'org.jmock:jmock-legacy:' + project.'jmock.version' + + testCompile 'org.mockito:mockito-core:' + project.'mockito-core.version' + testCompile 'org.powermock:powermock-core:' + project.'powermock.version' + testCompile 'org.powermock:powermock-module-junit4:' + project.'powermock.version' + testCompile 'org.powermock:powermock-api-mockito2:' + project.'powermock.version' + + testCompile 'pl.pragmatists:JUnitParams:' + project.'JUnitParams.version' + + testRuntime 'cglib:cglib:' + project.'cglib.version' + } + + configurations { + apt + } + + dependencies { + apt files("${rootProject.projectDir}/buildSrc/build/libs/buildSrc.jar") + apt(group: 'junit', name: 'junit', version: project.'junit.version') { + transitive = false + } + // Because EnsureCorrectRunsWithProcessor needs access to + // CategoryWithParameterizedRunnerFactory. The specific version of geode-junit is not important. + apt(group: 'org.apache.geode', name: 'geode-junit', version: '1.3.0') { + transitive = false + } + } + + compileTestJava { + options.annotationProcessorPath = files(configurations['apt']) + } + + test { + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + } + + task securityTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.SecurityTest' + } + + forkEvery 1 + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + + reports.junitXml.destination = file "$buildDir/test-reports-security" + } + + task clientServerTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.ClientServerTest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + reports.junitXml.destination = file "$buildDir/test-reports-security" + } + + task dlockTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.DLockTest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + reports.junitXml.destination = file "$buildDir/test-reports-dlock" + } + + task backwardCompatibilityTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.BackwardCompatibilityTest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + reports.junitXml.destination = file "$buildDir/test-reports-backwardcompatibility" + } + + task clientSubscriptionTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.ClientSubscriptionTest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + reports.junitXml.destination = file "$buildDir/test-reports-client-subscription" + } + task queryTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.OQLQueryTest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + reports.junitXml.destination = file "$buildDir/test-reports-oql-query" + } + + task indexTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.OQLIndexTest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + reports.junitXml.destination = file "$buildDir/test-reports-oql-index" + } + + task functionServiceTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.FunctionServiceTest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + reports.junitXml.destination = file "$buildDir/test-reports-function-service" + } + + task membershipTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.MembershipTest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + reports.junitXml.destination = file "$buildDir/test-reports-membership" + } + task luceneTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.LuceneTest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + reports.junitXml.destination = file "$buildDir/test-reports-lucene" + } + + task aeqTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.AEQTest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + reports.junitXml.destination = file "$buildDir/test-reports-aeq" + } + + + task sessionTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.SessionTest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + reports.junitXml.destination = file "$buildDir/test-reports-session" + } + + task wanTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.WanTest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + reports.junitXml.destination = file "$buildDir/test-reports-wan" + } + + + task redisTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.RedisTest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + forkEvery 1 + reports.junitXml.destination = file "$buildDir/test-reports-redis" + } + + task restAPITest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.RestAPITest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + forkEvery 1 + reports.junitXml.destination = file "$buildDir/test-reports-restAPI" + } + + task serializationTest(type: Test) { + useJUnit { + includeCategories 'org.apache.geode.test.junit.categories.SerializationTest' + excludeCategories 'org.apache.geode.test.junit.categories.FlakyTest' + } + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } + reports.junitXml.destination = file "$buildDir/test-reports-serialization" + } +} \ No newline at end of file diff --git a/gradle/test.gradle b/gradle/test.gradle index 4605697151e1..6dd96f7a5d27 100644 --- a/gradle/test.gradle +++ b/gradle/test.gradle @@ -134,7 +134,7 @@ subprojects { outputs.upToDateWhen{false} } - distributedTest { + performanceTest { useJUnit { if(project.hasProperty("testCategory")) { includeCategories += project.testCategory @@ -143,6 +143,10 @@ subprojects { } forkEvery 1 + + doFirst { + TestPropertiesWriter.writeTestProperties(buildDir, name) + } outputs.upToDateWhen{false} }