diff --git a/build.gradle.kts b/build.gradle.kts index 31b09e2f160..2c9f31d3cf3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,21 +2,23 @@ import com.diffplug.gradle.spotless.SpotlessExtension import datadog.gradle.plugin.ci.testAggregate plugins { - id("datadog.gradle-debug") + kotlin("jvm") version libs.versions.kotlin.plugin apply false + + id("datadog.ci-jobs") + id("datadog.config-inversion-linter") id("datadog.dependency-locking") - id("datadog.tracer-version") id("datadog.dump-hanged-test") - id("config-inversion-linter") - id("datadog.ci-jobs") + id("datadog.gradle-debug") + id("datadog.groovy-spock") + id("datadog.tracer-version") id("com.diffplug.spotless") version "6.13.0" id("com.github.spotbugs") version "5.0.14" + id("com.gradleup.shadow") version "8.3.6" apply false id("de.thetaphi.forbiddenapis") version "3.8" id("io.github.gradle-nexus.publish-plugin") version "2.0.0" - id("com.gradleup.shadow") version "8.3.6" apply false id("me.champeau.jmh") version "0.7.3" apply false id("org.gradle.playframework") version "0.13" apply false - kotlin("jvm") version libs.versions.kotlin.plugin apply false } description = "dd-trace-java" diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index e6011a3c7a8..acadcfdd9dc 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -13,35 +13,47 @@ java { } gradlePlugin { + // Sorted list of plugins: plugins { - create("instrument-plugin") { - id = "instrument" - implementationClass = "InstrumentPlugin" - } - create("muzzle-plugin") { - id = "muzzle" - implementationClass = "datadog.gradle.plugin.muzzle.MuzzlePlugin" - } create("call-site-instrumentation-plugin") { id = "call-site-instrumentation" implementationClass = "datadog.gradle.plugin.csi.CallSiteInstrumentationPlugin" } - create("tracer-version-plugin") { - id = "datadog.tracer-version" - implementationClass = "datadog.gradle.plugin.version.TracerVersionPlugin" - } + create("dump-hanged-test-plugin") { id = "datadog.dump-hanged-test" implementationClass = "datadog.gradle.plugin.dump.DumpHangedTestPlugin" } + + create("groovy-spock-plugin") { + id = "datadog.groovy-spock" + implementationClass = "datadog.gradle.plugin.config.groovy.GroovySpockConventionPlugin" + } + + create("instrument-plugin") { + id = "instrument" + implementationClass = "InstrumentPlugin" + } + + create("muzzle-plugin") { + id = "muzzle" + implementationClass = "datadog.gradle.plugin.muzzle.MuzzlePlugin" + } + create("supported-config-generation") { - id = "supported-config-generator" + id = "datadog.supported-config-generator" implementationClass = "datadog.gradle.plugin.config.SupportedConfigPlugin" } + create("supported-config-linter") { - id = "config-inversion-linter" + id = "datadog.config-inversion-linter" implementationClass = "datadog.gradle.plugin.config.ConfigInversionLinter" } + + create("tracer-version-plugin") { + id = "datadog.tracer-version" + implementationClass = "datadog.gradle.plugin.version.TracerVersionPlugin" + } } } @@ -76,6 +88,10 @@ dependencies { implementation("com.fasterxml.jackson.core:jackson-core") compileOnly(libs.develocity) + + // We have to use Spock with Groovy3 as Gradle 8.x bundled with Groovy3. + // TODO: We can refactor `buildSrc` folder to not use Groovy at all. + testImplementation(libs.spock.core.groovy3) } tasks.compileKotlin { @@ -86,10 +102,6 @@ testing { @Suppress("UnstableApiUsage") suites { val test by getting(JvmTestSuite::class) { - dependencies { - implementation(libs.groovy) - implementation(libs.spock.core) - } targets.configureEach { testTask.configure { enabled = project.hasProperty("runBuildSrcTests") diff --git a/buildSrc/call-site-instrumentation-plugin/build.gradle.kts b/buildSrc/call-site-instrumentation-plugin/build.gradle.kts index 8b8793e721c..11901c16fd5 100644 --- a/buildSrc/call-site-instrumentation-plugin/build.gradle.kts +++ b/buildSrc/call-site-instrumentation-plugin/build.gradle.kts @@ -32,11 +32,12 @@ dependencies { implementation("org.freemarker", "freemarker", "2.3.30") implementation(libs.asm) implementation(libs.asm.tree) - implementation("com.github.javaparser", "javaparser-symbol-solver-core", "3.24.4") + implementation(libs.javaparser.solver) testImplementation(libs.bytebuddy) - testImplementation(libs.groovy) - testImplementation(libs.bundles.spock) + testImplementation(libs.groovy4) + testImplementation(libs.spock.core.groovy4) + testImplementation(libs.objenesis) testImplementation("javax.servlet", "javax.servlet-api", "3.0.1") testImplementation("com.github.spotbugs", "spotbugs-annotations", "4.2.0") } diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/config/groovy/GroovySpockConventionPlugin.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/config/groovy/GroovySpockConventionPlugin.kt new file mode 100644 index 00000000000..9ef7c930231 --- /dev/null +++ b/buildSrc/src/main/kotlin/datadog/gradle/plugin/config/groovy/GroovySpockConventionPlugin.kt @@ -0,0 +1,70 @@ +package datadog.gradle.plugin.config.groovy + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.artifacts.VersionCatalogsExtension +import org.gradle.api.plugins.JavaLibraryPlugin +import org.gradle.api.plugins.JavaPlugin + +@Suppress("unused") +class GroovySpockConventionPlugin : Plugin { + override fun apply(project: Project) { + if (project == project.rootProject) { + project.subprojects { + this.pluginManager.apply(GroovySpockConventionPlugin::class.java) + } + return + } + + val extension = project.extensions.create("groovySpock", GroovySpockExtension::class.java) + + project.plugins.withType(JavaPlugin::class.java) { + configure(project, extension) + } + + project.plugins.withType(JavaLibraryPlugin::class.java) { + configure(project, extension) + } + } + + private fun configure( + project: Project, + extension: GroovySpockExtension + ) { + // TODO: check `afterEvaluate` is really needed. + project.afterEvaluate { + val groovyAlias = when (val groovyVersion = extension.groovyVersion.get()) { + 3 -> "groovy3" + 4 -> "groovy4" + else -> error("Unsupported groovyVersion=$groovyVersion (only 3 or 4 supported)") + } + + val catalogs = project.extensions.getByType(VersionCatalogsExtension::class.java).named("libs") + + fun findLibrary(alias: String) = catalogs.findLibrary(alias) + .orElseThrow { IllegalArgumentException("Library not found in catalog for alias: $alias") } + + val defaultLibs = listOf( + findLibrary(groovyAlias), + findLibrary("$groovyAlias-json"), + findLibrary("spock-core-$groovyAlias"), + findLibrary("objenesis") + ) + + fun configureDependencies(cfg: String, deps: List) = + deps.forEach { project.dependencies.add(cfg, it) } + + val configurations = extension.configurations + + if (configurations.isEmpty()) { + // If nothing configured, setup default configuration, suitable in most cases. + configureDependencies("testImplementation", defaultLibs) + } else { + configurations.forEach { (cfg, deps) -> + configureDependencies(cfg, defaultLibs) + deps.forEach { project.dependencies.add(cfg, it) } + } + } + } + } +} diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/config/groovy/GroovySpockExtension.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/config/groovy/GroovySpockExtension.kt new file mode 100644 index 00000000000..b851c54cfea --- /dev/null +++ b/buildSrc/src/main/kotlin/datadog/gradle/plugin/config/groovy/GroovySpockExtension.kt @@ -0,0 +1,28 @@ +package datadog.gradle.plugin.config.groovy + +import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.Property +import java.util.concurrent.ConcurrentHashMap +import javax.inject.Inject + +/** + * Configuration for Groovy and Spock. + */ +abstract class GroovySpockExtension @Inject constructor( + objects: ObjectFactory +) { + internal val configurations: MutableMap> = ConcurrentHashMap() + + internal val groovyVersion: Property = + objects.property(Int::class.java) + .convention(4) + + fun groovyVersion(version: Int) { + groovyVersion.set(version) + } + + fun configureDependencies(taskName: String, vararg dependencies: Any) { + configurations.computeIfAbsent(taskName) { mutableListOf() }.addAll(dependencies) + } +} + diff --git a/dd-java-agent/agent-ci-visibility/civisibility-instrumentation-test-fixtures/build.gradle b/dd-java-agent/agent-ci-visibility/civisibility-instrumentation-test-fixtures/build.gradle index dec74075fae..0bbe98a04f7 100644 --- a/dd-java-agent/agent-ci-visibility/civisibility-instrumentation-test-fixtures/build.gradle +++ b/dd-java-agent/agent-ci-visibility/civisibility-instrumentation-test-fixtures/build.gradle @@ -1,6 +1,10 @@ apply from: "$rootDir/gradle/java.gradle" apply from: "$rootDir/gradle/version.gradle" +groovySpock { + configureDependencies("compileOnly") +} + dependencies { api project(':dd-java-agent:instrumentation-testing') api project(':dd-java-agent:agent-ci-visibility:civisibility-test-fixtures') diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/build.gradle b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/build.gradle index 9dae3654dd3..1aecedd9722 100644 --- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/build.gradle +++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/build.gradle @@ -1,6 +1,10 @@ apply from: "$rootDir/gradle/java.gradle" apply from: "$rootDir/gradle/version.gradle" +groovySpock { + configureDependencies("compileOnly") +} + dependencies { api project(':dd-java-agent:agent-ci-visibility') api project(':dd-java-agent:testing') @@ -11,5 +15,7 @@ dependencies { api libs.jackson.databind api group: 'org.msgpack', name: 'jackson-dataformat-msgpack', version: '0.9.6' api group: 'org.xmlunit', name: 'xmlunit-core', version: '2.10.3' + + compileOnly libs.junit.jupiter } diff --git a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy index a77570a2721..9de2d23024c 100644 --- a/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy +++ b/dd-java-agent/agent-ci-visibility/civisibility-test-fixtures/src/main/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy @@ -11,6 +11,7 @@ import datadog.trace.api.DDSpanTypes import datadog.trace.api.civisibility.config.LibraryCapability import datadog.trace.api.civisibility.config.TestFQN import datadog.trace.core.DDSpan +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings import freemarker.core.Environment import freemarker.core.InvalidReferenceException import freemarker.template.Template @@ -367,6 +368,7 @@ abstract class CiVisibilityTestUtils { return compiledPaths } + @SuppressFBWarnings("UPM_UNCALLED_PRIVATE_METHOD") private static DynamicPath path(String rawPath, boolean unique = true) { return new DynamicPath(rawPath, JsonPath.compile(rawPath), unique) } diff --git a/dd-java-agent/agent-iast/build.gradle b/dd-java-agent/agent-iast/build.gradle index 707af32464e..c13f7c876d0 100644 --- a/dd-java-agent/agent-iast/build.gradle +++ b/dd-java-agent/agent-iast/build.gradle @@ -34,6 +34,10 @@ protobuf { } } +groovySpock { + configureDependencies("testImplementation", libs.groovy4.yaml) +} + dependencies { api libs.slf4j @@ -50,7 +54,6 @@ dependencies { testImplementation project(':dd-java-agent:agent-bootstrap') testImplementation libs.bytebuddy testImplementation('org.skyscreamer:jsonassert:1.5.1') - testImplementation libs.groovy.yaml testImplementation libs.guava testImplementation group: 'io.grpc', name: 'grpc-core', version: grpcVersion diff --git a/dd-java-agent/agent-iast/iast-test-fixtures/build.gradle b/dd-java-agent/agent-iast/iast-test-fixtures/build.gradle index e822e95efcc..dba1d134b2c 100644 --- a/dd-java-agent/agent-iast/iast-test-fixtures/build.gradle +++ b/dd-java-agent/agent-iast/iast-test-fixtures/build.gradle @@ -1,6 +1,10 @@ apply from: "$rootDir/gradle/java.gradle" apply from: "$rootDir/gradle/version.gradle" +groovySpock { + configureDependencies("compileOnly") +} + dependencies { api project(':dd-java-agent:agent-iast') api project(':dd-java-agent:instrumentation-testing') diff --git a/dd-java-agent/agent-iast/src/test/groovy/com/datadog/iast/taint/HashCodeTest.groovy b/dd-java-agent/agent-iast/src/test/groovy/com/datadog/iast/taint/HashCodeTest.groovy index 86e300108e4..668a1c91806 100644 --- a/dd-java-agent/agent-iast/src/test/groovy/com/datadog/iast/taint/HashCodeTest.groovy +++ b/dd-java-agent/agent-iast/src/test/groovy/com/datadog/iast/taint/HashCodeTest.groovy @@ -1,6 +1,7 @@ package com.datadog.iast.taint import datadog.trace.test.util.DDSpecification +import groovy.transform.CompileStatic import spock.lang.IgnoreIf import spock.lang.Shared @@ -51,6 +52,7 @@ class HashCodeTest extends DDSpecification { } } + @CompileStatic // Workaround to avoid NPE in Groovy 4 `org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache()` method. private static List genHashCodes(final int n) { (1..n).collect { System.identityHashCode(Double.toString(Math.random())) diff --git a/dd-java-agent/agent-iast/src/test/groovy/com/datadog/iast/taint/ObjectGen.groovy b/dd-java-agent/agent-iast/src/test/groovy/com/datadog/iast/taint/ObjectGen.groovy index a08038be898..99e85e66735 100644 --- a/dd-java-agent/agent-iast/src/test/groovy/com/datadog/iast/taint/ObjectGen.groovy +++ b/dd-java-agent/agent-iast/src/test/groovy/com/datadog/iast/taint/ObjectGen.groovy @@ -2,9 +2,12 @@ package com.datadog.iast.taint import static TaintedMap.POSITIVE_MASK +import groovy.transform.CompileStatic + /** * Generate objects to test {@link TaintedMap}. */ +@CompileStatic // Workaround to avoid java.lang.AbstractMethodError with Groovy 4. class ObjectGen { final int capacity @@ -36,7 +39,8 @@ class ObjectGen { } } - def genBucket(int nObjects, Closure isValid) { + // Have to return specific type to avoid java.lang.AbstractMethodError with Groovy 4. + List genBucket(int nObjects, Closure isValid) { assert nObjects > 0 while (true) { for (int i = 0; i < capacity; i++) { diff --git a/dd-java-agent/appsec/appsec-test-fixtures/build.gradle b/dd-java-agent/appsec/appsec-test-fixtures/build.gradle index 7adb94080e9..9a7f7fb206a 100644 --- a/dd-java-agent/appsec/appsec-test-fixtures/build.gradle +++ b/dd-java-agent/appsec/appsec-test-fixtures/build.gradle @@ -1,9 +1,15 @@ apply from: "$rootDir/gradle/java.gradle" apply from: "$rootDir/gradle/version.gradle" +groovySpock { + configureDependencies("compileOnly") +} + dependencies { api project(':dd-java-agent:appsec') api project(':dd-java-agent:instrumentation-testing') + + compileOnly(libs.junit.jupiter) } configurations.named('api') { diff --git a/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/ddwaf/WAFModuleSpecification.groovy b/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/ddwaf/WAFModuleSpecification.groovy index 7589dd06a91..bb5ddefdafa 100644 --- a/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/ddwaf/WAFModuleSpecification.groovy +++ b/dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/ddwaf/WAFModuleSpecification.groovy @@ -785,8 +785,8 @@ class WAFModuleSpecification extends DDSpecification { stackTrace.language == 'java' stackTrace.message == 'Exploit detected' stackTrace.frames.size() >= 1 - stackTrace.frames[0].class_name == 'org.codehaus.groovy.runtime.callsite.CallSiteArray' - stackTrace.frames[0].function == 'defaultCall' + stackTrace.frames[0].class_name == 'org.codehaus.groovy.vmplugin.v8.IndyInterface' // With Groovy 3 it was 'org.codehaus.groovy.runtime.callsite.CallSiteArray' + stackTrace.frames[0].function == 'fromCache' // With Groovy 3 it was 'defaultCall' } diff --git a/dd-java-agent/instrumentation-testing/build.gradle b/dd-java-agent/instrumentation-testing/build.gradle index d4b3e247854..72559847b44 100644 --- a/dd-java-agent/instrumentation-testing/build.gradle +++ b/dd-java-agent/instrumentation-testing/build.gradle @@ -1,10 +1,14 @@ apply from: "$rootDir/gradle/java.gradle" +groovySpock { + configureDependencies("compileOnly") + configureDependencies("testImplementation") +} + dependencies { api libs.bytebuddy api libs.bytebuddyagent api libs.slf4j - api libs.bundles.spock api libs.bundles.test.logging api libs.guava @@ -12,6 +16,7 @@ dependencies { implementation project(':dd-java-agent:agent-debugger') + implementation(libs.junit.jupiter) implementation "org.junit.platform:junit-platform-runner:${libs.versions.junit.platform.get()}" testImplementation project(':dd-java-agent:instrumentation:trace-annotation') diff --git a/dd-java-agent/instrumentation/aerospike-4.0/build.gradle b/dd-java-agent/instrumentation/aerospike-4.0/build.gradle index f38182ab4bd..089a0d085d2 100644 --- a/dd-java-agent/instrumentation/aerospike-4.0/build.gradle +++ b/dd-java-agent/instrumentation/aerospike-4.0/build.gradle @@ -39,3 +39,5 @@ dependencies { tasks.withType(Test).configureEach { usesService(testcontainersLimit) } + +configureGroovyCompiler(21, "compileLatestDepTestGroovy", "compileLatestDepForkedTestGroovy") diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/CompletableFutureTest.groovy b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/CompletableFutureTest.groovy index 022ac7e169a..cd4626964a7 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/CompletableFutureTest.groovy +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/CompletableFutureTest.groovy @@ -127,7 +127,7 @@ class CompletableFutureTest extends InstrumentationSpecification { // The parent and the child spans can finish out of order since they run // on different threads concurrently trace(2) { - def pIndex = span(0).isRootSpan() ? 0 : 1 + def pIndex = span(0).checkRootSpan() ? 0 : 1 def cIndex = 1 - pIndex basicSpan(it, pIndex, "parent") basicSpan(it, cIndex, "child", span(pIndex)) diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/CrossedContextTest.groovy b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/CrossedContextTest.groovy index b3eb6690e92..26cc83c4a5f 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/CrossedContextTest.groovy +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/CrossedContextTest.groovy @@ -60,7 +60,7 @@ class CrossedContextTest extends InstrumentationSpecification { then: for (List trace : TEST_WRITER) { assert trace.size() == 2 - DDSpan parent = trace.find({ it.isRootSpan() }) + DDSpan parent = trace.find({ it.checkRootSpan() }) assert null != parent DDSpan child = trace.find({ it.getParentId() == parent.getSpanId() }) assert null != child @@ -121,7 +121,7 @@ class CrossedContextTest extends InstrumentationSpecification { then: for (List trace : TEST_WRITER) { assert trace.size() == 2 - DDSpan parent = trace.find({ it.isRootSpan() }) + DDSpan parent = trace.find({ it.checkRootSpan() }) assert null != parent DDSpan child = trace.find({ it.getParentId() == parent.getSpanId() }) assert null != child diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/executor/RecursiveThreadPoolPropagationTest.groovy b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/executor/RecursiveThreadPoolPropagationTest.groovy index 957bf8cb1da..e50a9fb5209 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/executor/RecursiveThreadPoolPropagationTest.groovy +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/executor/RecursiveThreadPoolPropagationTest.groovy @@ -346,7 +346,7 @@ class RecursiveThreadPoolPropagationTest extends InstrumentationSpecification { List trace = TEST_WRITER.get(0) assert trace.size() == depth for (DDSpan span : sortByDepth(trace)) { - orphanCount += span.isRootSpan() ? 1 : 0 + orphanCount += span.checkRootSpan() ? 1 : 0 assert String.valueOf(i++) == span.getOperationName() } assert orphanCount == 1 diff --git a/dd-java-agent/instrumentation/java/java-lang/java-lang-15.0/build.gradle b/dd-java-agent/instrumentation/java/java-lang/java-lang-15.0/build.gradle index 73a218b252a..39ae38c7a4a 100644 --- a/dd-java-agent/instrumentation/java/java-lang/java-lang-15.0/build.gradle +++ b/dd-java-agent/instrumentation/java/java-lang/java-lang-15.0/build.gradle @@ -28,6 +28,7 @@ csi { addTestSuiteForDir('latestDepTest', 'test') dependencies { + testImplementation(libs.javaparser) testRuntimeOnly project(':dd-java-agent:instrumentation:iast-instrumenter') } diff --git a/dd-java-agent/instrumentation/java/java-nio-1.8/src/test/groovy/DirectAllocationTrackingTest.groovy b/dd-java-agent/instrumentation/java/java-nio-1.8/src/test/groovy/DirectAllocationTrackingTest.groovy index f73585a46e6..1583d6c9555 100644 --- a/dd-java-agent/instrumentation/java/java-nio-1.8/src/test/groovy/DirectAllocationTrackingTest.groovy +++ b/dd-java-agent/instrumentation/java/java-nio-1.8/src/test/groovy/DirectAllocationTrackingTest.groovy @@ -53,12 +53,12 @@ class DirectAllocationTrackingTest extends InstrumentationSpecification { def sample = directAllocations.find({ it.getEventType().name.equals("datadog.DirectAllocationSample")}) sample.getLong("allocated") == 20 sample.getString("source") == "MMAP" - sample.getString("allocatingClass") == "org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite" + sample.getString("allocatingClass") == "org.codehaus.groovy.vmplugin.v8.IndyInterface" // With Groovy 3 it was "org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite" sample.getLong("spanId") == expectedSpanId.get() def total = directAllocations.find({ it.getEventType().name.equals("datadog.DirectAllocationTotal")}) total.getLong("allocated") == 20 total.getString("source") == "MMAP" - total.getString("allocatingClass") == "org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite" + total.getString("allocatingClass") == "org.codehaus.groovy.vmplugin.v8.IndyInterface" // With Groovy 3 it was "org.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite" cleanup: recording.close() @@ -80,12 +80,12 @@ class DirectAllocationTrackingTest extends InstrumentationSpecification { def sample = directAllocations.find({ it.getEventType().name.equals("datadog.DirectAllocationSample")}) sample.getLong("allocated") == 10 sample.getString("source") == "ALLOCATE_DIRECT" - sample.getString("allocatingClass") == "java_nio_ByteBuffer\$allocateDirect" + sample.getString("allocatingClass") == "org.codehaus.groovy.vmplugin.v8.IndyInterface" // With Groovy 3 it was "java_nio_ByteBuffer\$allocateDirect" sample.getLong("spanId") == expectedSpanId.get() def total = directAllocations.find({ it.getEventType().name.equals("datadog.DirectAllocationTotal")}) total.getLong("allocated") == 10 total.getString("source") == "ALLOCATE_DIRECT" - total.getString("allocatingClass") == "java_nio_ByteBuffer\$allocateDirect" + total.getString("allocatingClass") == "org.codehaus.groovy.vmplugin.v8.IndyInterface"// With Groovy 3 it was "java_nio_ByteBuffer\$allocateDirect" cleanup: recording.close() diff --git a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-10.0/build.gradle b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-10.0/build.gradle index 00ddd8c272a..2084a6c6c32 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-10.0/build.gradle +++ b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-10.0/build.gradle @@ -32,6 +32,13 @@ tasks.named("compileMain_java11Java", JavaCompile) { configureCompiler(it, 11, JavaVersion.VERSION_1_8) } +configureGroovyCompiler(11, + "compileTestGroovy", + "compileJetty11TestGroovy", + "compileLatestDepTestGroovy", + "compileJetty10LatestDepTestGroovy" + ) + dependencies { main_java11CompileOnly group: 'org.eclipse.jetty', name: 'jetty-client', version: '10.0.0' main_java11Implementation(project(':dd-java-agent:instrumentation:jetty:jetty-client:jetty-client-common')) { diff --git a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-12.0/build.gradle b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-12.0/build.gradle index bcb1bd91020..1b3a39c9ce7 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-12.0/build.gradle +++ b/dd-java-agent/instrumentation/jetty/jetty-client/jetty-client-12.0/build.gradle @@ -20,6 +20,8 @@ tasks.named("compileMain_java17Java", JavaCompile) { configureCompiler(it, 17, JavaVersion.VERSION_17) } +configureGroovyCompiler(17, "compileTestGroovy", "compileLatestDepTestGroovy") + configurations.matching { it.name.startsWith('test') || it.name.startsWith('latestDepTest') }.configureEach { it.resolutionStrategy { force group: 'org.slf4j', name: 'slf4j-api', version: libs.versions.slf4j.get() diff --git a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-11.0/build.gradle b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-11.0/build.gradle index 111367c055c..a63d122489e 100644 --- a/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-11.0/build.gradle +++ b/dd-java-agent/instrumentation/jetty/jetty-server/jetty-server-11.0/build.gradle @@ -17,6 +17,10 @@ tracerJava { addTestSuiteForDir('latestDepTest', 'test') addTestSuiteForDir('latestDepForkedTest', 'test') +groovySpock { + configureDependencies("testFixturesCompileOnly") +} + dependencies { main_java11CompileOnly ("org.eclipse.jetty:jetty-server:11.0.0") { exclude group: 'org.slf4j', module: 'slf4j-api' diff --git a/dd-java-agent/instrumentation/junit/junit-5.3/build.gradle b/dd-java-agent/instrumentation/junit/junit-5.3/build.gradle index 1ac51576c01..2ffc55913e3 100644 --- a/dd-java-agent/instrumentation/junit/junit-5.3/build.gradle +++ b/dd-java-agent/instrumentation/junit/junit-5.3/build.gradle @@ -74,3 +74,5 @@ tasks.named("latestDepTest", Test) { minJavaVersion = JavaVersion.VERSION_17 } } + +configureGroovyCompiler(17, "compileLatestDepTestGroovy") diff --git a/dd-java-agent/instrumentation/junit/junit-5.3/junit-5.8/build.gradle b/dd-java-agent/instrumentation/junit/junit-5.3/junit-5.8/build.gradle index 5f1711a3cba..657d467c9cb 100644 --- a/dd-java-agent/instrumentation/junit/junit-5.3/junit-5.8/build.gradle +++ b/dd-java-agent/instrumentation/junit/junit-5.3/junit-5.8/build.gradle @@ -66,3 +66,5 @@ tasks.named("latestDepTest", Test) { minJavaVersion = JavaVersion.VERSION_17 } } + +configureGroovyCompiler(17, "compileLatestDepTestGroovy") diff --git a/dd-java-agent/instrumentation/junit/junit-5.3/spock-junit-5/build.gradle b/dd-java-agent/instrumentation/junit/junit-5.3/spock-junit-5/build.gradle index ca5404400de..048b630a2db 100644 --- a/dd-java-agent/instrumentation/junit/junit-5.3/spock-junit-5/build.gradle +++ b/dd-java-agent/instrumentation/junit/junit-5.3/spock-junit-5/build.gradle @@ -17,6 +17,11 @@ muzzle { addTestSuiteForDir('latestDepTest', 'test') +groovySpock { + // Must use Groovy 3, as `spock-core` of version `2.0` exists only for Groovy 3. + groovyVersion(3) +} + dependencies { implementation project(':dd-java-agent:instrumentation:junit:junit-5.3') @@ -32,6 +37,12 @@ dependencies { latestDepTestImplementation group: 'org.spockframework', name: 'spock-core', version: '2.+' } +configurations { + testImplementation { + exclude group: 'org.apache.groovy' + } +} + configurations.matching({ it.name.startsWith('test') }).configureEach({ it.resolutionStrategy { force group: 'org.junit.platform', name: 'junit-platform-launcher', version: libs.versions.junit.platform.get() diff --git a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/build.gradle b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/build.gradle index 73755150c0c..68c2e621c99 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/build.gradle +++ b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/build.gradle @@ -20,11 +20,15 @@ apply from: "$rootDir/gradle/java.gradle" addTestSuite('latestDepTest') addTestSuite('iastLatestDepTest3') +groovySpock { + // This module still needs Spock with JUnit4. + configureDependencies("testImplementation", libs.spock.junit4.groovy4) +} + dependencies { compileOnly group: 'org.apache.kafka', name: 'kafka-clients', version: '0.11.0.0' implementation project(':dd-java-agent:instrumentation:kafka:kafka-common') - testImplementation libs.spock.junit4 // This module still needs Spock with JUnit4. testImplementation group: 'org.apache.kafka', name: 'kafka-clients', version: '0.11.0.0' testImplementation group: 'org.springframework.kafka', name: 'spring-kafka', version: '1.3.3.RELEASE' testImplementation group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '1.3.3.RELEASE' diff --git a/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/build.gradle b/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/build.gradle index f8bd3970654..b800544d7d9 100644 --- a/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/build.gradle +++ b/dd-java-agent/instrumentation/kafka/kafka-streams-0.11/build.gradle @@ -11,6 +11,11 @@ apply from: "$rootDir/gradle/java.gradle" addTestSuite('latestDepTest') +groovySpock { + // This module still needs Spock with JUnit4. + configureDependencies("testImplementation", libs.spock.junit4.groovy4) +} + dependencies { compileOnly group: 'org.apache.kafka', name: 'kafka-streams', version: '0.11.0.0' @@ -26,7 +31,6 @@ dependencies { // Include latest version of kafka itself along with latest version of client libs. // This seems to help with jar compatibility hell. - latestDepTestImplementation libs.spock.junit4 // This module still needs Spock with JUnit4. latestDepTestImplementation group: 'org.apache.kafka', name: 'kafka_2.13', version: '2.+' latestDepTestImplementation group: 'org.apache.kafka', name: 'kafka-clients', version: '2.+' latestDepTestImplementation group: 'org.apache.kafka', name: 'kafka-streams', version: '2.+' diff --git a/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle b/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle index 453ab37dfe6..314ca874e21 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle +++ b/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle @@ -36,6 +36,10 @@ kotlin { } } +groovySpock { + configureDependencies("testFixturesApi") +} + addTestSuite('latestDepTest') tasks.named("compileTestFixturesGroovy", GroovyCompile) { diff --git a/dd-java-agent/instrumentation/liberty-20/build.gradle b/dd-java-agent/instrumentation/liberty-20/build.gradle index 05aaa11b0a6..7f7e0bb1645 100644 --- a/dd-java-agent/instrumentation/liberty-20/build.gradle +++ b/dd-java-agent/instrumentation/liberty-20/build.gradle @@ -28,6 +28,10 @@ def unpackOpenLiberty = tasks.register('unpackOpenLiberty', UnpackOpenLiberty) { } def filterLogbackClassic = tasks.register('filterLogbackClassic', Sync) +groovySpock { + configureDependencies("testImplementation", libs.groovy4.xml) +} + dependencies { zipped group: 'io.openliberty', name: 'openliberty-runtime', version: '21.0.0.3', ext: 'zip' testLogging libs.bundles.test.logging @@ -50,15 +54,10 @@ dependencies { add("webappImplementation", testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0'))) { transitive = false } - // use the above instead of: - // webappImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0')) - // because using testFixtures() causes some early evaluation of dependencies - webappRuntimeOnly libs.groovy } configurations.named("testRuntimeOnly") { exclude group: 'ch.qos.logback', module: 'logback-classic' - exclude group: 'org.codehaus.groovy', module: 'groovy-servlet' } configurations.named("webappRuntimeClasspath") { exclude group: 'ch.qos.logback', module: 'logback-classic' diff --git a/dd-java-agent/instrumentation/liberty-23/build.gradle b/dd-java-agent/instrumentation/liberty-23/build.gradle index 99707c31d38..e76f78fd3fb 100644 --- a/dd-java-agent/instrumentation/liberty-23/build.gradle +++ b/dd-java-agent/instrumentation/liberty-23/build.gradle @@ -32,6 +32,10 @@ def unpackOpenLiberty = tasks.register('unpackOpenLiberty', UnpackOpenLiberty) { def filterLogbackClassic = tasks.register('filterLogbackClassic', Sync) def shadowJar = tasks.named("shadowJar", ShadowJar) +groovySpock { + configureDependencies("testImplementation", libs.groovy4.xml) +} + dependencies { zipped group: 'io.openliberty', name: 'openliberty-runtime', version: '22.0.0.1', ext: 'zip' testLogging libs.bundles.test.logging @@ -57,15 +61,10 @@ dependencies { add("webappImplementation", testFixtures(project(':dd-java-agent:instrumentation:servlet:jakarta-servlet-5.0'))) { transitive = false } - // use the above instead of: - // webappImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:jakarta-servlet-5.0')) - // because using testFixtures() causes some early evaluation of dependencies - webappRuntimeOnly libs.groovy } configurations.named("testRuntimeOnly") { exclude group: 'ch.qos.logback', module: 'logback-classic' - exclude group: 'org.codehaus.groovy', module: 'groovy-servlet' } configurations.named("webappRuntimeClasspath") { exclude group: 'ch.qos.logback', module: 'logback-classic' diff --git a/dd-java-agent/instrumentation/ratpack-1.5/build.gradle b/dd-java-agent/instrumentation/ratpack-1.5/build.gradle index 38ed3cbd41f..2b4012800c3 100644 --- a/dd-java-agent/instrumentation/ratpack-1.5/build.gradle +++ b/dd-java-agent/instrumentation/ratpack-1.5/build.gradle @@ -18,8 +18,12 @@ dependencies { compileOnly group: 'com.github.spotbugs', name: 'spotbugs-annotations', version: '4.2.0' testImplementation project(':dd-java-agent:instrumentation:netty:netty-4.1') - testImplementation group: 'io.ratpack', name: 'ratpack-groovy-test', version: '1.5.0' + testImplementation(group: 'io.ratpack', name: 'ratpack-groovy-test', version: '1.5.0') { + exclude group: 'org.codehaus.groovy' + } testImplementation 'com.sun.activation:jakarta.activation:1.2.2' testImplementation project(':dd-java-agent:appsec:appsec-test-fixtures') - latestDepTestImplementation group: 'io.ratpack', name: 'ratpack-groovy-test', version: '1.+' + latestDepTestImplementation(group: 'io.ratpack', name: 'ratpack-groovy-test', version: '1.+') { + exclude group: 'org.codehaus.groovy' + } } diff --git a/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/build.gradle b/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/build.gradle index 9d05c66c564..424cb9e0f9e 100644 --- a/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/build.gradle +++ b/dd-java-agent/instrumentation/resteasy/resteasy-appsec-3.0/build.gradle @@ -28,6 +28,12 @@ tasks.named("test", Test) { configurations.configureEach { resolutionStrategy.deactivateDependencyLocking() } + +groovySpock { + configureDependencies("testFixturesApi") + configureDependencies("testImplementation") +} + dependencies { compileOnly group: 'org.jboss.resteasy', name: 'resteasy-jaxrs', version: '3.0.0.Final' compileOnly group: 'org.jboss.resteasy', name: 'resteasy-multipart-provider', version: '3.0.0.Final' diff --git a/dd-java-agent/instrumentation/rs/jax-rs/jax-rs-annotations/jax-rs-annotations-1/build.gradle b/dd-java-agent/instrumentation/rs/jax-rs/jax-rs-annotations/jax-rs-annotations-1/build.gradle index 7d1844129c7..8c238c3f250 100644 --- a/dd-java-agent/instrumentation/rs/jax-rs/jax-rs-annotations/jax-rs-annotations-1/build.gradle +++ b/dd-java-agent/instrumentation/rs/jax-rs/jax-rs-annotations/jax-rs-annotations-1/build.gradle @@ -13,10 +13,14 @@ muzzle { apply from: "$rootDir/gradle/java.gradle" +groovySpock { + // This module still needs Spock with JUnit4. + configureDependencies("testImplementation", libs.spock.junit4.groovy4) +} + dependencies { compileOnly group: 'javax.ws.rs', name: 'jsr311-api', version: '1.1.1' - testImplementation libs.spock.junit4 // This module still needs Spock with JUnit4. testImplementation group: 'io.dropwizard', name: 'dropwizard-testing', version: '0.7.1' testImplementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.2.3' } diff --git a/dd-java-agent/instrumentation/selenium/build.gradle b/dd-java-agent/instrumentation/selenium/build.gradle index d4b61ef822f..ae0013aae91 100644 --- a/dd-java-agent/instrumentation/selenium/build.gradle +++ b/dd-java-agent/instrumentation/selenium/build.gradle @@ -17,6 +17,10 @@ muzzle { addTestSuite('latestDepTest') +groovySpock { + configureDependencies("testFixturesApi") +} + dependencies { compileOnly group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.141.59' diff --git a/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/build.gradle b/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/build.gradle index 51bd98be5ab..45159e1b7ea 100644 --- a/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/build.gradle +++ b/dd-java-agent/instrumentation/servlet/jakarta-servlet-5.0/build.gradle @@ -50,6 +50,10 @@ tasks.register('relocatedJavaxJar', ShadowJar) { includeEmptyDirs = false } +groovySpock { + configureDependencies("testFixturesApi") +} + dependencies { implementation files(relocatedJavaxJar.outputs.files) compileOnly group: 'jakarta.servlet', name: 'jakarta.servlet-api', version: '5.0.0' diff --git a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/build.gradle b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/build.gradle index f1146605c33..8acccbacd6e 100644 --- a/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/build.gradle +++ b/dd-java-agent/instrumentation/servlet/javax-servlet/javax-servlet-3.0/build.gradle @@ -30,6 +30,10 @@ apply plugin: 'call-site-instrumentation' addTestSuiteForDir('latestDepTest', 'test') addTestSuiteForDir('latestDepForkedTest', 'test') +groovySpock { + configureDependencies("testFixturesApi") +} + dependencies { testRuntimeOnly project(':dd-java-agent:instrumentation:iast-instrumenter') diff --git a/dd-java-agent/instrumentation/spark/build.gradle b/dd-java-agent/instrumentation/spark/build.gradle index b3b9965c9d0..f5399f1bb44 100644 --- a/dd-java-agent/instrumentation/spark/build.gradle +++ b/dd-java-agent/instrumentation/spark/build.gradle @@ -6,6 +6,11 @@ apply from: "$rootDir/gradle/java.gradle" configurations.configureEach { resolutionStrategy.deactivateDependencyLocking() } + +groovySpock { + configureDependencies("testFixturesApi") +} + dependencies { compileOnly group: 'org.apache.spark', name: 'spark-core_2.12', version: '2.4.0' compileOnly group: 'org.apache.spark', name: 'spark-sql_2.12', version: '2.4.0' diff --git a/dd-java-agent/instrumentation/spring/spring-boot-1.3/build.gradle b/dd-java-agent/instrumentation/spring/spring-boot-1.3/build.gradle index 26dd765c94b..ba97aabefed 100644 --- a/dd-java-agent/instrumentation/spring/spring-boot-1.3/build.gradle +++ b/dd-java-agent/instrumentation/spring/spring-boot-1.3/build.gradle @@ -25,7 +25,7 @@ addTestSuiteExtendingForDir("boot2LatestDepForkedTest", "boot2LatestDepTest", "t addTestSuiteExtendingForDir("boot3ForkedTest", "boot3Test", "test") addTestSuiteExtendingForDir("latestDepForkedTest", "latestDepTest", "test") -configureGroovyCompiler(17, "compileLatestDepTestGroovy", "compileBoot3TestGroovy") +configureGroovyCompiler(17, "compileLatestDepTestGroovy", "compileBoot3TestGroovy", "compileBoot3ForkedTestGroovy", "compileLatestDepForkedTestGroovy") dependencies { implementation project(':dd-java-agent:instrumentation:span-origin') diff --git a/dd-java-agent/instrumentation/spring/spring-cloud-zuul-2.0/build.gradle b/dd-java-agent/instrumentation/spring/spring-cloud-zuul-2.0/build.gradle index daf520accae..9b046989361 100644 --- a/dd-java-agent/instrumentation/spring/spring-cloud-zuul-2.0/build.gradle +++ b/dd-java-agent/instrumentation/spring/spring-cloud-zuul-2.0/build.gradle @@ -24,6 +24,10 @@ tasks.named("compileJava", JavaCompile) { } } +groovySpock { + configureDependencies("testImplementation", libs.spock.spring.groovy4) +} + dependencies { compileOnly group: 'org.springframework.cloud', name: 'spring-cloud-netflix-zuul', version: '2.0.0.RELEASE' compileOnly group: 'com.netflix.zuul', name: 'zuul-core', version: '1.3.1' // "optional" dependency of ^^ @@ -37,8 +41,6 @@ dependencies { testImplementation project(':dd-java-agent:instrumentation:apache-httpclient:apache-httpclient-4.0') testImplementation project(':dd-java-agent:instrumentation:http-url-connection') - testImplementation libs.spock.spring - // These two version sets are compatible together: testImplementation enforcedPlatform('org.springframework.boot:spring-boot-dependencies:2.3.5.RELEASE') { exclude group: 'net.bytebuddy', module: 'byte-buddy' // we don't want this shared dependency pinned diff --git a/dd-java-agent/instrumentation/spring/spring-data-1.8/build.gradle b/dd-java-agent/instrumentation/spring/spring-data-1.8/build.gradle index 2cbe98f0ee8..9cd4ea24b3a 100644 --- a/dd-java-agent/instrumentation/spring/spring-data-1.8/build.gradle +++ b/dd-java-agent/instrumentation/spring/spring-data-1.8/build.gradle @@ -29,6 +29,10 @@ testJvmConstraints { addTestSuiteForDir('latestDepTest', 'test') +groovySpock { + configureDependencies("testImplementation", libs.spock.spring.groovy4) +} + // DQH - API changes that impact instrumentation occurred in spring-data-commons in March 2014. // For now, that limits support to spring-data-commons 1.9.0 (maybe 1.8.0). // For testing, chose a couple spring-data modules that are old enough to work with 1.9.0. @@ -37,7 +41,6 @@ dependencies { compileOnly(group: 'org.springframework', name: 'spring-aop', version: '1.2') implementation project(':dd-java-agent:agent-debugger:debugger-bootstrap') - testImplementation libs.spock.spring testImplementation group: 'org.springframework', name: 'spring-test', version: '3.0.0.RELEASE' // JPA dependencies diff --git a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/build.gradle b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/build.gradle index 68163949547..9a5a5415c4a 100644 --- a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/build.gradle +++ b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/build.gradle @@ -60,7 +60,6 @@ muzzle { apply from: "$rootDir/gradle/java.gradle" - addTestSuiteForDir('latestDepTest', 'test') addTestSuiteForDir('latestBoot20Test', 'bootTest') addTestSuiteForDir('latestBoot24Test', 'bootTest') @@ -76,6 +75,10 @@ configurations { latestIast3TestImplementation.extendsFrom(iastTestImplementation) } +groovySpock { + configureDependencies("testImplementation", libs.spock.spring.groovy4) +} + dependencies { compileOnly group: 'org.springframework', name: 'spring-webflux', version: '5.0.0.RELEASE' compileOnly group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.4' @@ -86,7 +89,6 @@ dependencies { testImplementation project(':dd-java-agent:instrumentation:reactor-core-3.1') testImplementation project(':dd-java-agent:instrumentation:reactive-streams') testImplementation project(':dd-java-agent:instrumentation:reactor-netty-1') - testImplementation libs.spock.spring testImplementation group: 'org.springframework', name: 'spring-webflux', version: '5.0.0.RELEASE' testImplementation group: 'io.projectreactor.ipc', name: 'reactor-netty', version: '0.7.0.RELEASE' diff --git a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-6.0/build.gradle b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-6.0/build.gradle index 74aa20688cd..1c23f66cd5f 100644 --- a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-6.0/build.gradle +++ b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-6.0/build.gradle @@ -23,6 +23,13 @@ tasks.named("iastTest", Test) { jvmArgs '--add-opens', 'java.base/java.util=ALL-UNNAMED' } +groovySpock { + configureDependencies("testImplementation", libs.spock.spring.groovy4) + configureDependencies("bootTestImplementation", libs.spock.spring.groovy4) + configureDependencies("latestDepBootTestImplementation", libs.spock.spring.groovy4) + configureDependencies("iastTestImplementation", libs.spock.spring.groovy4) +} + dependencies { testImplementation project(':dd-java-agent:instrumentation:spring:spring-webflux:spring-webflux-5.0') testImplementation project(':dd-java-agent:instrumentation:trace-annotation') @@ -32,7 +39,6 @@ dependencies { testImplementation project(':dd-java-agent:instrumentation:reactive-streams') testImplementation project(':dd-java-agent:instrumentation:reactor-netty-1') - testImplementation libs.spock.spring testImplementation group: 'org.springframework', name: 'spring-webflux', version: '6.0.0' testImplementation group: 'io.projectreactor.netty', name: 'reactor-netty', version: '1.1.3' testImplementation group: 'org.springframework', name: 'spring-test', version: '6.0.0' @@ -45,12 +51,10 @@ dependencies { bootTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '3.0.0' bootTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '3.0.0' bootTestImplementation project(':dd-java-agent:instrumentation:spring:spring-webflux:spring-webflux-5.0') - bootTestImplementation libs.spock.spring latestDepBootTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '3.+' latestDepBootTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '3.+' latestDepBootTestImplementation project(':dd-java-agent:instrumentation:spring:spring-webflux:spring-webflux-5.0') - latestDepBootTestImplementation libs.spock.spring iastTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-reactor-netty', version: '3.0.0' iastTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-json', version: '3.0.0' @@ -63,6 +67,5 @@ dependencies { iastTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '3.0.0' iastTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-reactor-netty', version: '3.0.0' iastTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-json', version: '3.0.0' - iastTestImplementation libs.spock.spring } diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/build.gradle b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/build.gradle index b4271d94180..b34a9e8d469 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/build.gradle +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-3.1/build.gradle @@ -36,6 +36,10 @@ apply from: "$rootDir/gradle/java.gradle" addTestSuite("latestDepTest") addTestSuiteExtendingForDir("latestDepForkedTest", "latestDepTest", "latestDepTest") +groovySpock { + configureDependencies("testImplementation", libs.spock.spring.groovy4) +} + dependencies { compileOnly group: 'org.springframework', name: 'spring-webmvc', version: '3.1.0.RELEASE' compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0' @@ -66,8 +70,6 @@ dependencies { testImplementation group: 'javax.validation', name: 'validation-api', version: '1.1.0.Final' testImplementation group: 'org.hibernate', name: 'hibernate-validator', version: '5.4.2.Final' - testImplementation libs.spock.spring - testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '1.5.17.RELEASE' testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.5.17.RELEASE' testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-websocket', version: '1.5.17.RELEASE' diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/build.gradle b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/build.gradle index baf8bcea1f1..45057a62adc 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/build.gradle +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-5.3/build.gradle @@ -10,6 +10,10 @@ muzzle { apply from: "$rootDir/gradle/java.gradle" apply plugin: 'call-site-instrumentation' +groovySpock { + configureDependencies("testImplementation", libs.spock.spring.groovy4) +} + dependencies { compileOnly group: 'org.springframework', name: 'spring-webmvc', version: '5.3.23' compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1' @@ -21,8 +25,6 @@ dependencies { testImplementation project(':dd-java-agent:instrumentation:servlet:javax-servlet:javax-servlet-3.0') testImplementation project(':dd-java-agent:instrumentation:spring:spring-webmvc:spring-webmvc-3.1') - testImplementation libs.spock.spring - testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.7.5' testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.7.5' diff --git a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/build.gradle b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/build.gradle index f7b6603d1f3..1c3e4dfdf9a 100644 --- a/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/build.gradle +++ b/dd-java-agent/instrumentation/spring/spring-webmvc/spring-webmvc-6.0/build.gradle @@ -27,6 +27,10 @@ tasks.withType(GroovyCompile).configureEach { groovyOptions.setParameters(true) } +groovySpock { + configureDependencies("testImplementation", libs.spock.spring.groovy4) +} + dependencies { main_java17CompileOnly(group: 'org.springframework', name: 'spring-webmvc', version: '6.0.0') main_java17CompileOnly group: 'jakarta.servlet', name: 'jakarta.servlet-api', version: '5.0.0' @@ -47,8 +51,6 @@ dependencies { testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:jakarta-websocket-2.0') testImplementation project(':dd-java-agent:instrumentation:servlet:jakarta-servlet-5.0') - testImplementation libs.spock.spring - testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '3.0.0' testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '3.0.0' testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '3.0.0' diff --git a/dd-java-agent/instrumentation/synapse-3.0/build.gradle b/dd-java-agent/instrumentation/synapse-3.0/build.gradle index a8c0c4dd48c..81cb4f2a9c2 100644 --- a/dd-java-agent/instrumentation/synapse-3.0/build.gradle +++ b/dd-java-agent/instrumentation/synapse-3.0/build.gradle @@ -18,6 +18,10 @@ configurations.configureEach { exclude group: 'org.wso2.uri.template', module: 'wso2-uri-templates' } +groovySpock { + configureDependencies("testImplementation", libs.groovy4.templates) +} + dependencies { compileOnly group: 'org.apache.synapse', name: 'synapse-nhttp-transport', version: '3.0.0' diff --git a/dd-java-agent/instrumentation/testng/build.gradle b/dd-java-agent/instrumentation/testng/build.gradle index 36966fc9165..e4d800d5f25 100644 --- a/dd-java-agent/instrumentation/testng/build.gradle +++ b/dd-java-agent/instrumentation/testng/build.gradle @@ -4,12 +4,17 @@ plugins { apply from: "$rootDir/gradle/java.gradle" +groovySpock { + configureDependencies("testFixturesApi") +} + dependencies { compileOnly group: 'org.testng', name: 'testng', version: '6.4' testFixturesApi project(':dd-java-agent:agent-ci-visibility:civisibility-instrumentation-test-fixtures') testFixturesImplementation group: 'org.testng', name: 'testng', version: '6.4' + testFixturesImplementation libs.junit.jupiter testFixturesApi group: 'org.apache.maven', name: 'maven-artifact', version: '3.9.9' } diff --git a/dd-java-agent/instrumentation/undertow/undertow-2.2/build.gradle b/dd-java-agent/instrumentation/undertow/undertow-2.2/build.gradle index e3abc5e9c39..489cdac95d4 100644 --- a/dd-java-agent/instrumentation/undertow/undertow-2.2/build.gradle +++ b/dd-java-agent/instrumentation/undertow/undertow-2.2/build.gradle @@ -58,3 +58,4 @@ tasks.named("latestDepForkedTest", Test) { } } +configureGroovyCompiler(11, "compileLatestDepTestGroovy", "compileLatestDepForkedTestGroovy") diff --git a/dd-java-agent/testing/build.gradle b/dd-java-agent/testing/build.gradle index 1780cd406ad..f2861132417 100644 --- a/dd-java-agent/testing/build.gradle +++ b/dd-java-agent/testing/build.gradle @@ -31,11 +31,14 @@ configurations.named('api') { exclude group: 'org.snakeyaml', module: 'snakeyaml-engine' // we vendor this in the agent jar } +groovySpock { + configureDependencies("compileOnly") +} + dependencies { api libs.bytebuddy api libs.bytebuddyagent api libs.slf4j - api libs.bundles.spock api libs.bundles.test.logging api libs.guava @@ -48,8 +51,6 @@ dependencies { api project(':utils:test-utils') api project(':utils:time-utils') - api libs.groovy - implementation "org.junit.platform:junit-platform-runner:${libs.versions.junit.platform.get()}" implementation project(':dd-java-agent:appsec') } diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/TestHttpServer.groovy b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/TestHttpServer.groovy index ea140c777f1..90f40c56907 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/TestHttpServer.groovy +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/server/http/TestHttpServer.groovy @@ -6,6 +6,7 @@ import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext import datadog.trace.bootstrap.instrumentation.api.Tags import datadog.trace.core.DDSpan import edu.umd.cs.findbugs.annotations.SuppressFBWarnings +import groovy.transform.CompileStatic import org.eclipse.jetty.http.HttpMethod import org.eclipse.jetty.http.HttpVersion import org.eclipse.jetty.server.Handler @@ -316,6 +317,7 @@ class TestHttpServer implements AutoCloseable { this.prefix = prefix.startsWith("/") ? prefix : "/" + prefix } + @CompileStatic // Groovy 4: workaround to avoid `groovy.lang.MissingMethodException`. @Override void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { if (target.startsWith(prefix)) { @@ -488,7 +490,7 @@ class TestHttpServer implements AutoCloseable { } void send(byte[] body) { - sendWithType(DEFAULT_TYPE, body) + sendWithType(DEFAULT_TYPE, (byte[]) body) // Groovy 4 has stricter coercions rules. } void sendWithType(String contentType, byte[] body) { diff --git a/dd-smoke-tests/appsec/build.gradle b/dd-smoke-tests/appsec/build.gradle index f5a54e7985a..35f68c71d58 100644 --- a/dd-smoke-tests/appsec/build.gradle +++ b/dd-smoke-tests/appsec/build.gradle @@ -2,6 +2,10 @@ apply from: "$rootDir/gradle/java.gradle" description = 'appsec-smoke-tests' +groovySpock { + configureDependencies("compileOnly") +} + dependencies { api project(':dd-smoke-tests') } diff --git a/dd-smoke-tests/backend-mock/build.gradle b/dd-smoke-tests/backend-mock/build.gradle index 94fe5563ee6..8e0b5b1814f 100644 --- a/dd-smoke-tests/backend-mock/build.gradle +++ b/dd-smoke-tests/backend-mock/build.gradle @@ -1,6 +1,10 @@ apply from: "$rootDir/gradle/java.gradle" description = 'Mock Datadog backend used by smoke tests.' +groovySpock { + configureDependencies("compileOnly") +} + dependencies { implementation project(':dd-smoke-tests') api project(':dd-java-agent:agent-ci-visibility:civisibility-test-fixtures') diff --git a/dd-smoke-tests/build.gradle b/dd-smoke-tests/build.gradle index 630c7a83014..6c6bb83337b 100644 --- a/dd-smoke-tests/build.gradle +++ b/dd-smoke-tests/build.gradle @@ -4,11 +4,16 @@ apply from: "$rootDir/gradle/java.gradle" description = 'dd-smoke-tests' +groovySpock { + configureDependencies("compileOnly") +} + dependencies { - api libs.bundles.spock api libs.okhttp api project(':dd-java-agent:testing') api project(':utils:test-agent-utils:decoder') + + compileOnly(libs.junit.jupiter) } tasks.withType(GroovyCompile).configureEach { diff --git a/dd-smoke-tests/gradle/build.gradle b/dd-smoke-tests/gradle/build.gradle index d0b0139f25c..46fb37a44ff 100644 --- a/dd-smoke-tests/gradle/build.gradle +++ b/dd-smoke-tests/gradle/build.gradle @@ -5,11 +5,24 @@ plugins { apply from: "$rootDir/gradle/java.gradle" description = 'Gradle Daemon Instrumentation Smoke Tests.' +groovySpock { + // Gradle 8.x uses Groovy 3. + groovyVersion(3) +} + dependencies { testImplementation gradleTestKit() testImplementation project(':dd-smoke-tests:backend-mock') testImplementation project(':internal-api') - testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-test-fixtures') + testImplementation(project(':dd-java-agent:agent-ci-visibility:civisibility-test-fixtures')) { + exclude group: "org.spockframework", module: "spock-core" + } +} + +configurations { + testImplementation { + exclude group: 'org.apache.groovy' + } } tasks.named("test", Test) { diff --git a/dd-smoke-tests/iast-propagation/build.gradle b/dd-smoke-tests/iast-propagation/build.gradle index 93e5f5a8a08..8abb3ec8cd6 100644 --- a/dd-smoke-tests/iast-propagation/build.gradle +++ b/dd-smoke-tests/iast-propagation/build.gradle @@ -33,11 +33,14 @@ tasks.named("shadowJar", ShadowJar) { configurations = [project.configurations.runtimeClasspath] } +groovySpock { + configureDependencies("implementation") +} + dependencies { implementation project(':dd-trace-api') implementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.5.4' implementation libs.scala - implementation libs.groovy implementation libs.kotlin testImplementation project(':dd-smoke-tests') diff --git a/dd-smoke-tests/iast-util/build.gradle b/dd-smoke-tests/iast-util/build.gradle index ab33dca3efd..f8a1af578f9 100644 --- a/dd-smoke-tests/iast-util/build.gradle +++ b/dd-smoke-tests/iast-util/build.gradle @@ -6,6 +6,10 @@ apply from: "$rootDir/gradle/java.gradle" description = 'iast-smoke-tests-utils' +groovySpock { + configureDependencies("testFixturesApi") +} + dependencies { api project(':dd-smoke-tests') compileOnly group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '1.5.18.RELEASE' diff --git a/dd-smoke-tests/iast-util/iast-util-17/build.gradle b/dd-smoke-tests/iast-util/iast-util-17/build.gradle index 7f194b74922..7bf95d4aa11 100644 --- a/dd-smoke-tests/iast-util/iast-util-17/build.gradle +++ b/dd-smoke-tests/iast-util/iast-util-17/build.gradle @@ -19,6 +19,7 @@ dependencies { compileOnly group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: '2.2.0.RELEASE' testFixturesImplementation testFixtures(project(":dd-smoke-tests:iast-util")) + testFixturesImplementation(libs.javaparser) } tasks.named("compileJava", JavaCompile) { diff --git a/dd-smoke-tests/rum/build.gradle b/dd-smoke-tests/rum/build.gradle index f5a54e7985a..35f68c71d58 100644 --- a/dd-smoke-tests/rum/build.gradle +++ b/dd-smoke-tests/rum/build.gradle @@ -2,6 +2,10 @@ apply from: "$rootDir/gradle/java.gradle" description = 'appsec-smoke-tests' +groovySpock { + configureDependencies("compileOnly") +} + dependencies { api project(':dd-smoke-tests') } diff --git a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java index 71358bd7dfe..b1313fe49c7 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/CoreTracer.java @@ -1608,7 +1608,7 @@ protected static final DDSpan buildSpanImpl( List links, DDSpanContext spanContext) { DDSpan span = DDSpan.create(instrumentationName, timestampMicro, spanContext, links); - if (span.isLocalRootSpan()) { + if (span.checkLocalRootSpan()) { EndpointTracker tracker = tracer.onRootSpanStarted(span); if (tracker != null) { span.setEndpointTracker(tracker); diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java b/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java index 106eb57e474..b5f186fab55 100644 --- a/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java +++ b/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java @@ -306,7 +306,7 @@ public boolean isForceKeep() { * * @return true if root, false otherwise */ - public final boolean isRootSpan() { + public final boolean checkRootSpan() { return context.getParentId() == DDSpanId.ZERO; } @@ -326,7 +326,7 @@ public DDSpan getLocalRootSpan() { * * @return {@literal true} if this span is the same as {@linkplain #getLocalRootSpan()} */ - public boolean isLocalRootSpan() { + public boolean checkLocalRootSpan() { return getLocalRootSpan().equals(this); } @@ -378,7 +378,7 @@ private boolean isExceptionReplayEnabled() { boolean captureOnlyRootSpan = (Config.get().isDebuggerExceptionOnlyLocalRoot() || !Config.get().isDebuggerExceptionCaptureIntermediateSpansEnabled()); - if (captureOnlyRootSpan && !isLocalRootSpan()) { + if (captureOnlyRootSpan && !checkLocalRootSpan()) { return false; } return true; diff --git a/dd-trace-core/src/test/groovy/datadog/trace/core/DDSpanTest.groovy b/dd-trace-core/src/test/groovy/datadog/trace/core/DDSpanTest.groovy index e7882432d9c..a61fffbab48 100644 --- a/dd-trace-core/src/test/groovy/datadog/trace/core/DDSpanTest.groovy +++ b/dd-trace-core/src/test/groovy/datadog/trace/core/DDSpanTest.groovy @@ -279,14 +279,14 @@ class DDSpanTest extends DDCoreSpecification { new ExtractedContext(DDTraceId.ONE, 2, PrioritySampling.SAMPLER_DROP, "some-origin", propagationTagsFactory.empty(), DATADOG) | _ } - def "isRootSpan() in and not in the context of distributed tracing"() { + def "checkRootSpan() in and not in the context of distributed tracing"() { setup: def root = tracer.buildSpan("root").asChildOf((AgentSpanContext) extractedContext).start() def child = tracer.buildSpan("child").asChildOf(root).start() expect: - root.isRootSpan() == isTraceRootSpan - !child.isRootSpan() + root.checkRootSpan() == isTraceRootSpan + !child.checkRootSpan() cleanup: child.finish() diff --git a/gradle/codenarc.gradle b/gradle/codenarc.gradle index d51450d6cc8..dfd0cd52407 100644 --- a/gradle/codenarc.gradle +++ b/gradle/codenarc.gradle @@ -1,9 +1,7 @@ apply plugin: "codenarc" dependencies { - codenarc('org.codenarc:CodeNarc:3.6.0') - // if the groovy transitive dependencies are upgraded, this may not be pulled - codenarc('org.codehaus.groovy:groovy-templates') + codenarc('org.codenarc:CodeNarc:3.6.0-groovy-4.0') } codenarc { diff --git a/gradle/java_deps.gradle b/gradle/java_deps.gradle index 69391241807..71392ec0947 100644 --- a/gradle/java_deps.gradle +++ b/gradle/java_deps.gradle @@ -1,8 +1,6 @@ apply plugin: 'groovy' dependencies { - testImplementation libs.bundles.spock - testImplementation libs.groovy testImplementation libs.bundles.test.logging // JUnit and Mockito compatible with Spock 2.4.0 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2c9fc1a5956..45ebbf4018c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -11,7 +11,8 @@ okhttp = "3.12.15" # Datadog fork to support Java 7 # Languages ## Groovy -groovy = "3.0.24" +groovy3 = "3.0.24" +groovy4 = "4.0.26" ## Kotlin kotlin = "1.6.21" @@ -49,6 +50,7 @@ cafe_crypto = "0.1.0" # Common utils commons = "3.2" guava = "[16.0,20.0]" # Last version to support Java 7 +javaparser = "3.24.4" jctools = "3.3.0" lz4 = "1.7.1" @@ -65,7 +67,8 @@ junit4 = "4.13.2" junit5 = "5.12.2" junit-platform = "1.12.2" mockito = "4.4.0" -spock = "2.4-M6-groovy-3.0" +spock-groovy3 = "2.4-M6-groovy-3.0" +spock-groovy4 = "2.4-M6-groovy-4.0" testcontainers = "1.21.3" [libraries] @@ -79,8 +82,19 @@ okhttp = { module = "com.datadoghq.okhttp3:okhttp", version.ref = "okhttp" } # Languages ## Groovy -groovy = { module = "org.codehaus.groovy:groovy-all", version.ref = "groovy" } -groovy-yaml = { module = "org.codehaus.groovy:groovy-yaml", version.ref = "groovy" } +groovy3 = { module = "org.codehaus.groovy:groovy", version.ref = "groovy3" } +groovy3-json = { module = "org.codehaus.groovy:groovy-json", version.ref = "groovy3" } +groovy3-templates = { module = "org.codehaus.groovy:groovy-templates", version.ref = "groovy3" } +groovy3-test-junit5 = { module = "org.codehaus.groovy:groovy-test-junit5", version.ref = "groovy3" } +groovy3-yaml = { module = "org.codehaus.groovy:groovy-yaml", version.ref = "groovy3" } +groovy3-xml = { module = "org.codehaus.groovy:groovy-xml", version.ref = "groovy3" } + +groovy4 = { module = "org.apache.groovy:groovy", version.ref = "groovy4" } +groovy4-json = { module = "org.apache.groovy:groovy-json", version.ref = "groovy4" } +groovy4-templates = { module = "org.apache.groovy:groovy-templates", version.ref = "groovy4" } +groovy4-test-junit5 = { module = "org.apache.groovy:groovy-test-junit5", version.ref = "groovy4" } +groovy4-yaml = { module = "org.apache.groovy:groovy-yaml", version.ref = "groovy4" } +groovy4-xml = { module = "org.apache.groovy:groovy-xml", version.ref = "groovy4" } ## Kotlin kotlin = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } @@ -120,6 +134,8 @@ cafe-crypto-curve25519 = { module = "cafe.cryptography:curve25519-elisabeth", ve aircompressor = { module = "io.airlift:aircompressor", version = "2.0.2"} # aircompressor v3 requires Java 22 commons-math = { module = "org.apache.commons:commons-math3", version.ref = "commons" } guava = { module = "com.google.guava:guava", version.ref = "guava" } +javaparser = {module = "com.github.javaparser:javaparser-core", version.ref = "javaparser"} +javaparser-solver = {module = "com.github.javaparser:javaparser-symbol-solver-core", version.ref = "javaparser"} jctools = { module = "org.jctools:jctools-core", version.ref = "jctools" } lz4 = { module = "org.lz4:lz4-java", version.ref = "lz4" } @@ -143,9 +159,10 @@ junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher mokito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" } mokito-junit-jupiter = { module = "org.mockito:mockito-junit-jupiter", version.ref = "mockito" } objenesis = { module = "org.objenesis:objenesis", version = "3.3" } # Used by Spock for mocking: -spock-core = { module = "org.spockframework:spock-core", version.ref = "spock" } -spock-junit4 = { module = "org.spockframework:spock-junit4", version.ref = "spock" } -spock-spring = { module = "org.spockframework:spock-spring", version.ref = "spock" } +spock-core-groovy3 = { module = "org.spockframework:spock-core", version.ref = "spock-groovy3" } +spock-core-groovy4 = { module = "org.spockframework:spock-core", version.ref = "spock-groovy4" } +spock-junit4-groovy4 = { module = "org.spockframework:spock-junit4", version.ref = "spock-groovy4" } +spock-spring-groovy4 = { module = "org.spockframework:spock-spring", version.ref = "spock-groovy4" } testcontainers = { module = "org.testcontainers:testcontainers", version.ref = "testcontainers" } testcontainers-localstack = { module = "org.testcontainers:localstack", version.ref = "testcontainers" } @@ -164,4 +181,3 @@ test-logging = ["logback-classic", "log4j-over-slf4j", "jcl-over-slf4j", "jul-to junit5 = ["junit-jupiter", "junit-jupiter-params"] junit-platform = ["junit-platform-launcher"] mockito = ["mokito-core", "mokito-junit-jupiter", "bytebuddy", "bytebuddyagent"] -spock = ["spock-core", "objenesis"] diff --git a/remote-config/remote-config-core/src/test/groovy/datadog/remoteconfig/DefaultConfigurationPollerSpecification.groovy b/remote-config/remote-config-core/src/test/groovy/datadog/remoteconfig/DefaultConfigurationPollerSpecification.groovy index 17689fa16cb..bd625135335 100644 --- a/remote-config/remote-config-core/src/test/groovy/datadog/remoteconfig/DefaultConfigurationPollerSpecification.groovy +++ b/remote-config/remote-config-core/src/test/groovy/datadog/remoteconfig/DefaultConfigurationPollerSpecification.groovy @@ -588,7 +588,7 @@ class DefaultConfigurationPollerSpecification extends DDSpecification { byte[] fileDecoded = Base64.decoder.decode(it['target_files'][0]['raw']) byte[] newFile = new byte[fileDecoded.length + 1] System.arraycopy(fileDecoded, 0, newFile, 0, fileDecoded.length) - newFile[fileDecoded.length] = '\n' + newFile[fileDecoded.length] = (byte) '\n' // Groovy 4 has strict coercion rules. it['target_files'][0]['raw'] = Base64.encoder.encodeToString(newFile) def targetDecoded = Base64.decoder.decode(it['targets']) def target = SLURPER.parse(targetDecoded) diff --git a/utils/config-utils/build.gradle.kts b/utils/config-utils/build.gradle.kts index bb046479b65..6f428fb65b3 100644 --- a/utils/config-utils/build.gradle.kts +++ b/utils/config-utils/build.gradle.kts @@ -1,6 +1,6 @@ plugins { `java-library` - id("supported-config-generator") + id("datadog.supported-config-generator") } apply(from = "$rootDir/gradle/java.gradle") diff --git a/utils/test-utils/build.gradle.kts b/utils/test-utils/build.gradle.kts index 5ddcf0b8dd1..d79b1fc8cc1 100644 --- a/utils/test-utils/build.gradle.kts +++ b/utils/test-utils/build.gradle.kts @@ -4,16 +4,18 @@ plugins { apply(from = "$rootDir/gradle/java.gradle") -dependencies { - api(libs.groovy) - api(libs.bundles.spock) +groovySpock { + configureDependencies("compileOnly") +} +dependencies { api(libs.bytebuddy) api(libs.bytebuddyagent) api(project(":components:environment")) api(group = "commons-fileupload", name = "commons-fileupload", version = "1.5") + compileOnly(libs.junit.jupiter) compileOnly(libs.logback.core) compileOnly(libs.logback.classic) }