From f71192266c76ce931c800714853d9302c8bffbce Mon Sep 17 00:00:00 2001 From: Nikolay Martynov Date: Fri, 28 Sep 2018 18:22:29 -0400 Subject: [PATCH] Rework the way multi-jvm tests work To allow some JVMs runs only subset of tests --- .circleci/config.yml | 69 +++++---- .../dd-java-agent-ittests.gradle | 6 + .../akka-http-10.0/akka-http-10.0.gradle | 6 +- .../AkkaHttpClientInstrumentationTest.groovy | 1 - .../couchbase-2.0/couchbase-2.0.gradle | 7 +- .../datastax-cassandra-2.3.gradle | 10 +- .../elasticsearch-rest-5.gradle | 7 +- .../elasticsearch-transport-2.gradle | 8 +- .../elasticsearch-transport-5.3.gradle | 7 +- .../elasticsearch-transport-5.gradle | 7 +- .../elasticsearch-transport-6.gradle | 7 +- .../http-url-connection.gradle | 7 +- .../java-concurrent/java-concurrent.gradle | 6 + .../instrumentation/jdbc/jdbc.gradle | 6 + .../lettuce-5/lettuce-5.gradle | 10 +- .../netty-4.0/netty-4.0.gradle | 7 +- .../netty-4.1/netty-4.1.gradle | 7 +- .../instrumentation/play-2.4/play-2.4.gradle | 7 +- .../ratpack-1.4/ratpack-1.4.gradle | 16 ++- .../sparkjava-2.3/sparkjava-2.3.gradle | 7 +- .../spring-webflux/spring-webflux.gradle | 9 +- dd-trace-java.gradle | 22 ++- gradle/checkstyle.gradle | 1 - gradle/dependencies.gradle | 2 +- gradle/java.gradle | 136 ++++++++++++++---- 25 files changed, 270 insertions(+), 108 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 665308dfda..0f62f72b17 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,12 +13,9 @@ cache_keys: &cache_keys - dd-trace-java-{{ checksum "dd-trace-java.gradle" }}-{{ .Branch }} - dd-trace-java-{{ checksum "dd-trace-java.gradle" }} - jobs: build: <<: *defaults - docker: - - image: circleci/openjdk:8-jdk steps: - checkout @@ -28,7 +25,7 @@ jobs: - run: name: Build Project - command: GRADLE_OPTS="-Dorg.gradle.jvmargs=-Xmx1G -Xms64M" ./gradlew clean :dd-java-agent:shadowJar compileTestGroovy compileTestScala compileTestJava check -x test -x latestDepTest -x traceAgentTest --build-cache --parallel --stacktrace --no-daemon --max-workers=4 + command: GRADLE_OPTS="-Dorg.gradle.jvmargs=-Xmx1G -Xms64M" ./gradlew clean :dd-java-agent:shadowJar compileTestGroovy compileTestScala compileTestJava --build-cache --parallel --stacktrace --no-daemon --max-workers=4 - run: name: Collect Libs @@ -38,14 +35,6 @@ jobs: - store_artifacts: path: ./libs - - run: - name: Collect Reports - when: always - command: .circleci/collect_reports.sh - - - store_artifacts: - path: ./reports - - persist_to_workspace: root: . paths: @@ -54,7 +43,6 @@ jobs: - save_cache: key: dd-trace-java-{{ checksum "dd-trace-java.gradle" }}-{{ .Branch }}-{{ .Revision }} paths: ~/.gradle - background: true default_test_job: &default_test_job @@ -111,7 +99,7 @@ jobs: test_7: <<: *default_test_job environment: - - JAVA7_HOME: /usr/lib/jvm/zulu-7-amd64 + - JAVA_7_HOME: /usr/lib/jvm/zulu-7-amd64 - TEST_TASK: testJava7 - INSTALL_ZULU: zulu-7 @@ -124,28 +112,28 @@ jobs: test_9: <<: *default_test_job environment: - - JAVA9_HOME: /usr/lib/jvm/zulu-9-amd64 - - TEST_TASK: testJava9 latestDepTestJava9 + - JAVA_9_HOME: /usr/lib/jvm/zulu-9-amd64 + - TEST_TASK: testJava9 - INSTALL_ZULU: zulu-9 test_10: <<: *default_test_job environment: - - JAVA10_HOME: /usr/lib/jvm/zulu-10-amd64 - - TEST_TASK: testJava10 latestDepTestJava10 + - JAVA_10_HOME: /usr/lib/jvm/zulu-10-amd64 + - TEST_TASK: testJava10 - INSTALL_ZULU: zulu-10 test_11: <<: *default_test_job environment: - - JAVA11_HOME: /usr/lib/jvm/jdk-11 - - TEST_TASK: testJava11 latestDepTestJava11 + - JAVA_11_HOME: /usr/lib/jvm/jdk-11 + - TEST_TASK: testJava11 - INSTALL_OPENJDK: https://download.java.net/java/ga/jdk11/openjdk-11_linux-x64_bin.tar.gz agent_integration_tests: <<: *defaults docker: - - image: circleci/openjdk:8-jdk + - image: *default_container - image: datadog/docker-dd-agent environment: - DD_APM_ENABLED=true @@ -158,11 +146,7 @@ jobs: at: . - restore_cache: - # Reset the cache approx every release - keys: - - dd-trace-java-{{ checksum "dd-trace-java.gradle" }}-{{ .Branch }}-{{ .Revision }} - - dd-trace-java-{{ checksum "dd-trace-java.gradle" }}-{{ .Branch }} - - dd-trace-java-{{ checksum "dd-trace-java.gradle" }} + <<: *cache_keys - run: name: Run Trace Agent Tests @@ -184,6 +168,30 @@ jobs: - store_test_results: path: ./results + check: + <<: *defaults + + steps: + - checkout + + - attach_workspace: + at: . + + - restore_cache: + <<: *cache_keys + + - run: + name: Build Project + command: GRADLE_OPTS="-Dorg.gradle.jvmargs=-Xmx1G -Xms64M" ./gradlew check -PskipTests --build-cache --parallel --stacktrace --no-daemon --max-workers=4 + + - run: + name: Collect Reports + when: always + command: .circleci/collect_reports.sh + + - store_artifacts: + path: ./reports + scan_versions: <<: *defaults steps: @@ -280,6 +288,13 @@ workflows: tags: only: /.*/ + - check: + requires: + - build + filters: + tags: + only: /.*/ + - scan_versions: requires: - build @@ -295,6 +310,7 @@ workflows: - test_10 - test_11 - agent_integration_tests + - check filters: branches: only: master @@ -309,6 +325,7 @@ workflows: - test_10 - test_11 - agent_integration_tests + - check filters: branches: ignore: /.*/ diff --git a/dd-java-agent-ittests/dd-java-agent-ittests.gradle b/dd-java-agent-ittests/dd-java-agent-ittests.gradle index 5240c687cc..ecfbad45ae 100644 --- a/dd-java-agent-ittests/dd-java-agent-ittests.gradle +++ b/dd-java-agent-ittests/dd-java-agent-ittests.gradle @@ -1,3 +1,9 @@ +// Set properties before any plugins get loaded +project.ext { + // Execute tests on all JVMs, even rare and outdated ones + integrationTests = true +} + apply from: "${rootDir}/gradle/java.gradle" description = 'dd-java-agent-ittests' diff --git a/dd-java-agent/instrumentation/akka-http-10.0/akka-http-10.0.gradle b/dd-java-agent/instrumentation/akka-http-10.0/akka-http-10.0.gradle index 34829de3c3..e030337e7d 100644 --- a/dd-java-agent/instrumentation/akka-http-10.0/akka-http-10.0.gradle +++ b/dd-java-agent/instrumentation/akka-http-10.0/akka-http-10.0.gradle @@ -1,3 +1,8 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 +} + apply from: "${rootDir}/gradle/java.gradle" apply from: "${rootDir}/gradle/test-with-scala.gradle" @@ -58,4 +63,3 @@ dependencies { } test.dependsOn lagomTest -testJava8Minimum += '*Test*.class' diff --git a/dd-java-agent/instrumentation/akka-http-10.0/src/test/groovy/AkkaHttpClientInstrumentationTest.groovy b/dd-java-agent/instrumentation/akka-http-10.0/src/test/groovy/AkkaHttpClientInstrumentationTest.groovy index 6b4eb0b826..2cfba0d1e6 100644 --- a/dd-java-agent/instrumentation/akka-http-10.0/src/test/groovy/AkkaHttpClientInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/akka-http-10.0/src/test/groovy/AkkaHttpClientInstrumentationTest.groovy @@ -170,7 +170,6 @@ class AkkaHttpClientInstrumentationTest extends AgentTestRunner { } - def "#route pool request trace"() { setup: def url = server.address.resolve("/" + route).toURL() diff --git a/dd-java-agent/instrumentation/couchbase-2.0/couchbase-2.0.gradle b/dd-java-agent/instrumentation/couchbase-2.0/couchbase-2.0.gradle index 8632654113..f7d0d30511 100644 --- a/dd-java-agent/instrumentation/couchbase-2.0/couchbase-2.0.gradle +++ b/dd-java-agent/instrumentation/couchbase-2.0/couchbase-2.0.gradle @@ -1,3 +1,8 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 +} + apply from: "${rootDir}/gradle/java.gradle" apply plugin: 'org.unbroken-dome.test-sets' @@ -44,5 +49,3 @@ dependencies { latestDepTestCompile group: 'com.couchbase.client', name: 'java-client', version: '2.6+' latestDepTestCompile group: 'com.couchbase.client', name: 'encryption', version: '+' } - -testJava8Minimum += "**/*.class" diff --git a/dd-java-agent/instrumentation/datastax-cassandra-2.3/datastax-cassandra-2.3.gradle b/dd-java-agent/instrumentation/datastax-cassandra-2.3/datastax-cassandra-2.3.gradle index 8267e4678b..04073f11b2 100644 --- a/dd-java-agent/instrumentation/datastax-cassandra-2.3/datastax-cassandra-2.3.gradle +++ b/dd-java-agent/instrumentation/datastax-cassandra-2.3/datastax-cassandra-2.3.gradle @@ -1,3 +1,10 @@ +// Set properties before any plugins get loaded +ext { + // Test use Cassandra 3 which requires Java 8. (Currently incompatible with Java 9.) + minJavaVersionForTests = JavaVersion.VERSION_1_8 + maxJavaVersionForTests = JavaVersion.VERSION_1_8 +} + muzzle { pass { group = "com.datastax.cassandra" @@ -8,9 +15,6 @@ muzzle { apply from: "${rootDir}/gradle/java.gradle" -// These classes use Cassandra 3 which requires Java 8. (Currently incompatible with Java 9.) -testJava8Only += '**/CassandraClientTest.class' - apply plugin: 'org.unbroken-dome.test-sets' testSets { diff --git a/dd-java-agent/instrumentation/elasticsearch-rest-5/elasticsearch-rest-5.gradle b/dd-java-agent/instrumentation/elasticsearch-rest-5/elasticsearch-rest-5.gradle index 68117fe433..147e8c7fce 100644 --- a/dd-java-agent/instrumentation/elasticsearch-rest-5/elasticsearch-rest-5.gradle +++ b/dd-java-agent/instrumentation/elasticsearch-rest-5/elasticsearch-rest-5.gradle @@ -1,3 +1,8 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 +} + muzzle { pass { group = "org.elasticsearch.client" @@ -9,8 +14,6 @@ muzzle { apply from: "${rootDir}/gradle/java.gradle" -testJava8Minimum += '**/*Test.class' - apply plugin: 'org.unbroken-dome.test-sets' testSets { diff --git a/dd-java-agent/instrumentation/elasticsearch-transport-2/elasticsearch-transport-2.gradle b/dd-java-agent/instrumentation/elasticsearch-transport-2/elasticsearch-transport-2.gradle index e363335d19..d192c6c28f 100644 --- a/dd-java-agent/instrumentation/elasticsearch-transport-2/elasticsearch-transport-2.gradle +++ b/dd-java-agent/instrumentation/elasticsearch-transport-2/elasticsearch-transport-2.gradle @@ -1,3 +1,9 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 + maxJavaVersionForTests = JavaVersion.VERSION_1_8 +} + muzzle { pass { group = "org.elasticsearch" @@ -9,8 +15,6 @@ muzzle { apply from: "${rootDir}/gradle/java.gradle" -testJava8Only += '**/*Test.class' - apply plugin: 'org.unbroken-dome.test-sets' testSets { diff --git a/dd-java-agent/instrumentation/elasticsearch-transport-5.3/elasticsearch-transport-5.3.gradle b/dd-java-agent/instrumentation/elasticsearch-transport-5.3/elasticsearch-transport-5.3.gradle index 91006d9467..33866f50e5 100644 --- a/dd-java-agent/instrumentation/elasticsearch-transport-5.3/elasticsearch-transport-5.3.gradle +++ b/dd-java-agent/instrumentation/elasticsearch-transport-5.3/elasticsearch-transport-5.3.gradle @@ -1,3 +1,8 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 +} + muzzle { pass { group = "org.elasticsearch.client" @@ -15,8 +20,6 @@ muzzle { apply from: "${rootDir}/gradle/java.gradle" -testJava8Minimum += '**/*Test.class' - apply plugin: 'org.unbroken-dome.test-sets' testSets { diff --git a/dd-java-agent/instrumentation/elasticsearch-transport-5/elasticsearch-transport-5.gradle b/dd-java-agent/instrumentation/elasticsearch-transport-5/elasticsearch-transport-5.gradle index cd64732832..911192c694 100644 --- a/dd-java-agent/instrumentation/elasticsearch-transport-5/elasticsearch-transport-5.gradle +++ b/dd-java-agent/instrumentation/elasticsearch-transport-5/elasticsearch-transport-5.gradle @@ -1,3 +1,8 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 +} + muzzle { pass { group = "org.elasticsearch.client" @@ -15,8 +20,6 @@ muzzle { apply from: "${rootDir}/gradle/java.gradle" -testJava8Minimum += '**/*Test.class' - apply plugin: 'org.unbroken-dome.test-sets' testSets { diff --git a/dd-java-agent/instrumentation/elasticsearch-transport-6/elasticsearch-transport-6.gradle b/dd-java-agent/instrumentation/elasticsearch-transport-6/elasticsearch-transport-6.gradle index 77843ad81e..4a3dd56584 100644 --- a/dd-java-agent/instrumentation/elasticsearch-transport-6/elasticsearch-transport-6.gradle +++ b/dd-java-agent/instrumentation/elasticsearch-transport-6/elasticsearch-transport-6.gradle @@ -1,3 +1,8 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 +} + muzzle { pass { group = "org.elasticsearch.client" @@ -15,8 +20,6 @@ muzzle { apply from: "${rootDir}/gradle/java.gradle" -testJava8Minimum += '**/*Test.class' - apply plugin: 'org.unbroken-dome.test-sets' testSets { diff --git a/dd-java-agent/instrumentation/http-url-connection/http-url-connection.gradle b/dd-java-agent/instrumentation/http-url-connection/http-url-connection.gradle index 66e2e36775..520d1b51df 100644 --- a/dd-java-agent/instrumentation/http-url-connection/http-url-connection.gradle +++ b/dd-java-agent/instrumentation/http-url-connection/http-url-connection.gradle @@ -1,3 +1,9 @@ +// Set properties before any plugins get loaded +project.ext { + // Execute tests on all JVMs, even rare and outdated ones + coreJavaInstrumentation = true +} + apply from: "${rootDir}/gradle/java.gradle" dependencies { @@ -10,5 +16,4 @@ dependencies { testCompile project(':dd-java-agent:testing') testCompile group: 'org.springframework', name: 'spring-web', version: '4.3.7.RELEASE' - } diff --git a/dd-java-agent/instrumentation/java-concurrent/java-concurrent.gradle b/dd-java-agent/instrumentation/java-concurrent/java-concurrent.gradle index 5b12ac9edb..facc5f16a2 100644 --- a/dd-java-agent/instrumentation/java-concurrent/java-concurrent.gradle +++ b/dd-java-agent/instrumentation/java-concurrent/java-concurrent.gradle @@ -1,3 +1,9 @@ +// Set properties before any plugins get loaded +project.ext { + // Execute tests on all JVMs, even rare and outdated ones + coreJavaInstrumentation = true +} + apply from: "${rootDir}/gradle/java.gradle" apply from: "${rootDir}/gradle/test-with-scala.gradle" diff --git a/dd-java-agent/instrumentation/jdbc/jdbc.gradle b/dd-java-agent/instrumentation/jdbc/jdbc.gradle index 63af890fcb..3f07652afe 100644 --- a/dd-java-agent/instrumentation/jdbc/jdbc.gradle +++ b/dd-java-agent/instrumentation/jdbc/jdbc.gradle @@ -1,3 +1,9 @@ +// Set properties before any plugins get loaded +project.ext { + // Execute tests on all JVMs, even rare and outdated ones + coreJavaInstrumentation = true +} + apply from: "${rootDir}/gradle/java.gradle" apply plugin: 'org.unbroken-dome.test-sets' diff --git a/dd-java-agent/instrumentation/lettuce-5/lettuce-5.gradle b/dd-java-agent/instrumentation/lettuce-5/lettuce-5.gradle index e2bfebcb60..dccc909d2d 100644 --- a/dd-java-agent/instrumentation/lettuce-5/lettuce-5.gradle +++ b/dd-java-agent/instrumentation/lettuce-5/lettuce-5.gradle @@ -1,3 +1,9 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 + maxJavaVersionForTests = JavaVersion.VERSION_1_8 +} + apply plugin: 'version-scan' muzzle { @@ -62,7 +68,3 @@ configurations.latestDepTestCompile { force group: 'io.lettuce', name: 'lettuce-core', version: '+' } } - -testJava8Only += '**/LettuceAsyncClientTest.class' -testJava8Only += '**/LettuceSyncClientTest.class' -testJava8Only += '**/LettuceReactiveClientTest.class' diff --git a/dd-java-agent/instrumentation/netty-4.0/netty-4.0.gradle b/dd-java-agent/instrumentation/netty-4.0/netty-4.0.gradle index 50d2c311d1..1855c509df 100644 --- a/dd-java-agent/instrumentation/netty-4.0/netty-4.0.gradle +++ b/dd-java-agent/instrumentation/netty-4.0/netty-4.0.gradle @@ -1,3 +1,9 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 + maxJavaVersionForTests = JavaVersion.VERSION_1_8 +} + apply from: "${rootDir}/gradle/java.gradle" muzzle { @@ -59,4 +65,3 @@ configurations.latestDepTestCompile { } } -testJava8Only += '**/*Test.class' diff --git a/dd-java-agent/instrumentation/netty-4.1/netty-4.1.gradle b/dd-java-agent/instrumentation/netty-4.1/netty-4.1.gradle index 54b3acd811..9be85c236e 100644 --- a/dd-java-agent/instrumentation/netty-4.1/netty-4.1.gradle +++ b/dd-java-agent/instrumentation/netty-4.1/netty-4.1.gradle @@ -1,3 +1,9 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 + maxJavaVersionForTests = JavaVersion.VERSION_1_8 +} + apply from: "${rootDir}/gradle/java.gradle" muzzle { @@ -59,4 +65,3 @@ configurations.latestDepTestCompile { } } -testJava8Only += '**/*Test.class' diff --git a/dd-java-agent/instrumentation/play-2.4/play-2.4.gradle b/dd-java-agent/instrumentation/play-2.4/play-2.4.gradle index 1014bab501..f955798638 100644 --- a/dd-java-agent/instrumentation/play-2.4/play-2.4.gradle +++ b/dd-java-agent/instrumentation/play-2.4/play-2.4.gradle @@ -1,3 +1,8 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 +} + apply from: "${rootDir}/gradle/java.gradle" apply from: "${rootDir}/gradle/test-with-scala.gradle" @@ -48,5 +53,3 @@ compileLatestDepTestGroovy { classpath = classpath.plus(files(compileLatestDepTestScala.destinationDir)) dependsOn compileLatestDepTestScala } - -testJava8Minimum += '*Play*Test*' diff --git a/dd-java-agent/instrumentation/ratpack-1.4/ratpack-1.4.gradle b/dd-java-agent/instrumentation/ratpack-1.4/ratpack-1.4.gradle index 59741227a6..54ab260896 100644 --- a/dd-java-agent/instrumentation/ratpack-1.4/ratpack-1.4.gradle +++ b/dd-java-agent/instrumentation/ratpack-1.4/ratpack-1.4.gradle @@ -1,3 +1,9 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 + maxJavaVersionForTests = JavaVersion.VERSION_1_8 +} + apply plugin: 'version-scan' versionScan { @@ -27,9 +33,11 @@ compileMain_java8Java { sourceCompatibility = 1.8 targetCompatibility = 1.8 } -configurations { - main_java8AnnotationProcessor.extendsFrom lombok - main_java8Implementation.extendsFrom lombok +// Note: ideally lombok plugin would do this for us, but currently it doesn't support custom +// source sets. See https://github.com/franzbecker/gradle-lombok/issues/17. +dependencies { + main_java8CompileOnly "org.projectlombok:lombok:${project.lombok.version}" transitive false + main_java8AnnotationProcessor "org.projectlombok:lombok:${project.lombok.version}" transitive false } apply plugin: 'org.unbroken-dome.test-sets' @@ -65,5 +73,3 @@ configurations.latestDepTestCompile { force group: 'io.ratpack', name: 'ratpack-groovy-test', version: '+' } } - -testJava8Only += '**/RatpackTest.class' diff --git a/dd-java-agent/instrumentation/sparkjava-2.3/sparkjava-2.3.gradle b/dd-java-agent/instrumentation/sparkjava-2.3/sparkjava-2.3.gradle index b595445aff..66d5b426eb 100644 --- a/dd-java-agent/instrumentation/sparkjava-2.3/sparkjava-2.3.gradle +++ b/dd-java-agent/instrumentation/sparkjava-2.3/sparkjava-2.3.gradle @@ -1,3 +1,8 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 +} + // building against 2.3 and testing against 2.4 because JettyHandler is available since 2.4 only muzzle { pass { @@ -10,8 +15,6 @@ muzzle { apply from: "${rootDir}/gradle/java.gradle" -testJava8Minimum += '**/SparkJavaBasedTest.class' - apply plugin: 'org.unbroken-dome.test-sets' testSets { diff --git a/dd-java-agent/instrumentation/spring-webflux/spring-webflux.gradle b/dd-java-agent/instrumentation/spring-webflux/spring-webflux.gradle index 398d50b7d3..a3f5e5c497 100644 --- a/dd-java-agent/instrumentation/spring-webflux/spring-webflux.gradle +++ b/dd-java-agent/instrumentation/spring-webflux/spring-webflux.gradle @@ -1,3 +1,9 @@ +// Set properties before any plugins get loaded +ext { + minJavaVersionForTests = JavaVersion.VERSION_1_8 + maxJavaVersionForTests = JavaVersion.VERSION_1_8 +} + muzzle { pass { group = "org.springframework" @@ -77,6 +83,3 @@ configurations.latestDepTestCompile { force group: 'org.springframework.boot', name: 'spring-boot-starter-reactor-netty', version: '+' } } - -testJava8Only += '**/*Test.class' -testJava8Only += '**/*TestApplication.class' diff --git a/dd-trace-java.gradle b/dd-trace-java.gradle index 166d4b1fc3..c17245754e 100644 --- a/dd-trace-java.gradle +++ b/dd-trace-java.gradle @@ -1,19 +1,15 @@ -buildscript { - repositories { - jcenter() - } - dependencies { - classpath "io.franzbecker:gradle-lombok:1.13" - classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.7.3" - classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.1" - classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.14" - classpath "org.unbroken-dome.gradle-plugins:gradle-testsets-plugin:1.5.0" - } -} plugins { + id 'io.franzbecker.gradle-lombok' version '1.13' + id 'com.jfrog.artifactory' version '4.7.5' + id 'com.jfrog.bintray' version '1.8.4' + id 'net.ltgt.errorprone' version '0.0.14' + id 'org.unbroken-dome.test-sets' version '1.5.1' + id 'com.gradle.build-scan' version '1.15.1' - id 'com.github.sherter.google-java-format' version '0.7.1' + // Not applying google java format by default because it gets confused by stray java build + // files in 'workspace' build directory in CI + id 'com.github.sherter.google-java-format' version '0.7.1' apply false id 'com.dorongold.task-tree' version '1.3' } diff --git a/gradle/checkstyle.gradle b/gradle/checkstyle.gradle index b0aad8d2bf..6513d16004 100644 --- a/gradle/checkstyle.gradle +++ b/gradle/checkstyle.gradle @@ -54,7 +54,6 @@ apply plugin: 'com.github.sherter.google-java-format' googleJavaFormat { source = sourceSets*.allJava - include '**/*.java' exclude '**/build/**/*.java' } diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index d5a0142223..e5e2e3b148 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -14,7 +14,7 @@ ext { groovy : groovyVer, junit : "4.12", logback : "1.2.3", - lombok : "1.18.0", + lombok : "1.18.2", bytebuddy : "1.9.0", ] diff --git a/gradle/java.gradle b/gradle/java.gradle index 0840b6049e..cad483c3e6 100644 --- a/gradle/java.gradle +++ b/gradle/java.gradle @@ -1,6 +1,10 @@ apply plugin: 'java' apply plugin: 'groovy' +apply from: "$rootDir/gradle/checkstyle.gradle" +apply from: "$rootDir/gradle/codenarc.gradle" +apply from: "$rootDir/gradle/jacoco.gradle" + sourceCompatibility = 1.7 targetCompatibility = 1.7 @@ -136,43 +140,113 @@ if (project.hasProperty("removeJarVersionNumbers") && removeJarVersionNumbers) { } } +if (project.parent && project.parent.hasProperty("javaExecutableVersionCache")) { + project.ext.javaExecutableVersionCache = project.parent.ext.javaExecutableVersionCache +} else { + project.ext.javaExecutableVersionCache = [:] +} +def getJavaExecutableVersion(String path) { + def cache = project.ext.javaExecutableVersionCache -project.ext.testJava8Only = [] -project.ext.testJava8Minimum = [] - -tasks.withType(Test) { - if (name.endsWith("Java7") || name.endsWith("Java9") || name.endsWith("Java10") || name.endsWith("Java11")) { - return + if (cache.containsKey(path)) { + return cache.get(path) } - - def cloned = it - - [7, 9, 10, 11].each { i -> - def javaHome = System.getenv("JAVA${i}_HOME") - if (javaHome != null) { - def test = task "${cloned.name}Java${i}"(type: cloned.class) { - group = "Verification" - description "Runs $cloned.name under Java ${i}" - executable = "$javaHome/bin/java" - if (i == 7) { - afterEvaluate { - exclude project.testJava8Only - exclude project.testJava8Minimum - } - } else if (i > 8) { - afterEvaluate { - exclude project.testJava8Only - } - } - } - tasks.check.dependsOn test + new ByteArrayOutputStream().withStream { stream -> + exec { + commandLine = [path, "-version"] + errorOutput = stream + } + def matcher = stream.toString() =~ /^(?:java|openjdk) version "([^"]+)"/ + if (matcher) { + def version = JavaVersion.toVersion(matcher.group(1)) + cache.put(path, version) + return version + } else { + throw new GradleScriptException("Cannot determine java version: ${stream.toString}") } } } -apply from: "$rootDir/gradle/checkstyle.gradle" -apply from: "$rootDir/gradle/codenarc.gradle" -apply from: "$rootDir/gradle/jacoco.gradle" +def isJavaVersionAllowed(JavaVersion version) { + if (project.hasProperty('minJavaVersionForTests') && project.getProperty('minJavaVersionForTests').compareTo(version) > 0) { + return false + } + if (project.hasProperty('maxJavaVersionForTests') && project.getProperty('maxJavaVersionForTests').compareTo(version) < 0) { + return false + } + return true +} + + +// JVM names we would like to run complete test suite on +// Note: complete test suite is always run on JVM used for compilation +// Note2: apparently there is no way to have a 'global' variable, so instead we have per project +// attribute that has same value in all projects +project.ext.majorSupportedJVMs = ["7", "11"] + +def isTestingEnabled(String javaName) { + if (javaName in project.majorSupportedJVMs) { + return true + } + if (project.findProperty("coreJavaInstrumentation") || project.findProperty("integrationTests")) { + return true + } + return false +} + +// Disable default test tasks if current JVM doesn't match version requirements +tasks.withType(Test) { + if (name.endsWith("Generated")) { + return + } + + // Always run all tests that are runnable on JVM used for compilation + onlyIf { isJavaVersionAllowed(JavaVersion.current()) } +} + +// Generate tests tasks for all provided JVMs +for (def env : System.getenv().entrySet()) { + def matcher = env.key =~ /JAVA_([^_]+)_HOME/ + if (!matcher) { + continue + } + def javaName = matcher.group(1) + def javaHome = env.value + def javaPath = "$javaHome/bin/java" + def javaVersion = getJavaExecutableVersion(javaPath) + + def parentTask = task "testJava${javaName}"() { + group = 'Verification' + description = "Run tests for Java ${javaName}" + } + tasks.check.dependsOn parentTask + + tasks.withType(Test) { + if (name.endsWith("Generated")) { + return + } + + def clonedTask = it + def newTask = task "${clonedTask.name}Java${javaName}Generated"(type: clonedTask.class) { + description "Runs $clonedTask.name under java ${javaName}" + executable = javaPath + onlyIf { isJavaVersionAllowed(javaVersion) && isTestingEnabled(javaName) } + jacoco { + // Disable jacoco for additional JVM tests to speed things up a bit + enabled = false + } + } + + parentTask.dependsOn newTask + } +} + +// Disable all tests if skipTests property was specified +if (project.hasProperty("skipTests")) { + tasks.withType(Test) { + onlyIf { false } + } +} plugins.withType(BasePlugin) { project.afterEvaluate {