From d8747db801287ba33086bd9c97ea4166b8e77838 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Thu, 6 Nov 2025 16:14:17 -0500 Subject: [PATCH 1/6] Code cleanup. --- buildSrc/build.gradle.kts | 2 +- .../build.gradle.kts | 3 +- .../http/RejectingExecutorServiceTest.groovy | 6 ++-- .../iast/test/NoopOverheadController.groovy | 2 +- .../test/InstrumentationSpecification.groovy | 2 +- .../test/groovy/server/HttpServerTest.groovy | 2 +- .../jax-rs-annotations-1/build.gradle | 2 +- .../junit/junit-5.3/build.gradle | 2 ++ .../org/example/TestAssumptionLegacy.java | 1 + .../kafka/kafka-clients-0.11/build.gradle | 2 +- .../kafka/kafka-streams-0.11/build.gradle | 1 + .../spring-webflux-5.0/build.gradle | 2 +- .../SingleThreadedSpringWebfluxTest.groovy | 8 ++--- gradle/libs.versions.toml | 4 ++- .../DependencyResolverSpecification.groovy | 29 ++++++++++++------- .../test/util/MultipartRequestParser.groovy | 2 +- 16 files changed, 40 insertions(+), 30 deletions(-) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index d93c261886a..953bc8bc4a4 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -80,8 +80,8 @@ testing { suites { val test by getting(JvmTestSuite::class) { dependencies { - implementation(libs.spock.core) implementation(libs.groovy) + implementation(libs.spock.core) } targets.configureEach { testTask.configure { diff --git a/buildSrc/call-site-instrumentation-plugin/build.gradle.kts b/buildSrc/call-site-instrumentation-plugin/build.gradle.kts index 1987bd5f91d..8b8793e721c 100644 --- a/buildSrc/call-site-instrumentation-plugin/build.gradle.kts +++ b/buildSrc/call-site-instrumentation-plugin/build.gradle.kts @@ -35,9 +35,8 @@ dependencies { implementation("com.github.javaparser", "javaparser-symbol-solver-core", "3.24.4") testImplementation(libs.bytebuddy) - testImplementation(libs.spock.core) - testImplementation("org.objenesis", "objenesis", "3.0.1") testImplementation(libs.groovy) + testImplementation(libs.bundles.spock) testImplementation("javax.servlet", "javax.servlet-api", "3.0.1") testImplementation("com.github.spotbugs", "spotbugs-annotations", "4.2.0") } diff --git a/communication/src/test/groovy/datadog/communication/http/RejectingExecutorServiceTest.groovy b/communication/src/test/groovy/datadog/communication/http/RejectingExecutorServiceTest.groovy index 6065c64a644..d236e32178e 100644 --- a/communication/src/test/groovy/datadog/communication/http/RejectingExecutorServiceTest.groovy +++ b/communication/src/test/groovy/datadog/communication/http/RejectingExecutorServiceTest.groovy @@ -1,19 +1,19 @@ package datadog.communication.http +import static org.junit.jupiter.api.Assertions.assertThrows + import org.junit.jupiter.api.Test import java.util.concurrent.ExecutorService import java.util.concurrent.RejectedExecutionException import java.util.concurrent.TimeUnit -import static groovy.test.GroovyAssert.shouldFail - class RejectingExecutorServiceTest { ExecutorService executorService = new RejectingExecutorService() @Test void 'execute throws exception'() { - shouldFail(RejectedExecutionException) { + assertThrows(RejectedExecutionException) { executorService.execute({}) } } diff --git a/dd-java-agent/agent-iast/iast-test-fixtures/src/main/groovy/com/datadog/iast/test/NoopOverheadController.groovy b/dd-java-agent/agent-iast/iast-test-fixtures/src/main/groovy/com/datadog/iast/test/NoopOverheadController.groovy index 7535c112003..f907536ee9d 100644 --- a/dd-java-agent/agent-iast/iast-test-fixtures/src/main/groovy/com/datadog/iast/test/NoopOverheadController.groovy +++ b/dd-java-agent/agent-iast/iast-test-fixtures/src/main/groovy/com/datadog/iast/test/NoopOverheadController.groovy @@ -3,9 +3,9 @@ package com.datadog.iast.test import com.datadog.iast.model.VulnerabilityType import com.datadog.iast.overhead.Operation import com.datadog.iast.overhead.OverheadController -import com.github.javaparser.quality.Nullable import datadog.trace.bootstrap.instrumentation.api.AgentSpan import groovy.transform.CompileStatic +import javax.annotation.Nullable @CompileStatic class NoopOverheadController implements OverheadController { diff --git a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy index b7e03e48f38..82bb9c1512f 100644 --- a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy +++ b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy @@ -515,7 +515,7 @@ abstract class InstrumentationSpecification extends DDSpecification implements A def sw = new StringWriter() PrintWriter pw = new PrintWriter(sw) entry.value.eachWithIndex { Exception e, int i -> - pw.write('\n' as char) + pw.write((char)'\n') pw.write "Location $i:\n" def st = e.stackTrace int loc = st.findIndexOf { diff --git a/dd-java-agent/instrumentation-testing/src/test/groovy/server/HttpServerTest.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/server/HttpServerTest.groovy index 5d747b2296b..84510eeab1d 100644 --- a/dd-java-agent/instrumentation-testing/src/test/groovy/server/HttpServerTest.groovy +++ b/dd-java-agent/instrumentation-testing/src/test/groovy/server/HttpServerTest.groovy @@ -435,7 +435,7 @@ class HttpServerTest extends InstrumentationSpecification { then: clientResponse.code() == 500 - IOUtils.readFully (clientResponse.body().byteStream()).contains("assert body != null") + IOUtils.readFully(clientResponse.body().byteStream()).contains("assert body != null") cleanup: server.stop() diff --git a/dd-java-agent/instrumentation/jax-rs-annotations-1/build.gradle b/dd-java-agent/instrumentation/jax-rs-annotations-1/build.gradle index 043d79272bb..c82b0ca7dd4 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations-1/build.gradle +++ b/dd-java-agent/instrumentation/jax-rs-annotations-1/build.gradle @@ -16,7 +16,7 @@ apply from: "$rootDir/gradle/java.gradle" dependencies { compileOnly group: 'javax.ws.rs', name: 'jsr311-api', version: '1.1.1' - testImplementation libs.spock.junit4 // This legacy module still needs JUnit4. + testImplementation libs.junit4 // This legacy still needs 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/junit/junit-5.3/build.gradle b/dd-java-agent/instrumentation/junit/junit-5.3/build.gradle index fbffbe3af73..e7f45d8243e 100644 --- a/dd-java-agent/instrumentation/junit/junit-5.3/build.gradle +++ b/dd-java-agent/instrumentation/junit/junit-5.3/build.gradle @@ -36,6 +36,8 @@ dependencies { testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-instrumentation-test-fixtures') + testImplementation libs.junit4 // This module still needs JUnit4. + // versions used below are not the minimum ones that we support, // but the tests need to use them in order to be compliant with Spock 2.x testImplementation group: 'org.junit.platform', name: 'junit-platform-launcher', version: libs.versions.junit.platform.get() diff --git a/dd-java-agent/instrumentation/junit/junit-5.3/src/test/java/org/example/TestAssumptionLegacy.java b/dd-java-agent/instrumentation/junit/junit-5.3/src/test/java/org/example/TestAssumptionLegacy.java index 8f0bcc571ad..1c3e58c31e9 100644 --- a/dd-java-agent/instrumentation/junit/junit-5.3/src/test/java/org/example/TestAssumptionLegacy.java +++ b/dd-java-agent/instrumentation/junit/junit-5.3/src/test/java/org/example/TestAssumptionLegacy.java @@ -7,6 +7,7 @@ public class TestAssumptionLegacy { @Test public void test_fail_assumption_legacy() { + // Throw exception from legacy JUnit4 library. throw new AssumptionViolatedException("assumption is not fulfilled"); } } 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 b23bf4c1808..db40c218ec5 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 @@ -26,7 +26,7 @@ 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 legacy module still needs JUnit4. + testImplementation libs.junit4 // This module still needs 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 0fdffd3d57d..55236383c59 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 @@ -26,6 +26,7 @@ dependencies { // Include latest version of kafka itself along with latest version of client libs. // This seems to help with jar compatibility hell. + latestDepTestImplementation libs.junit4 // This module still needs 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/spring/spring-webflux/spring-webflux-5.0/build.gradle b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/build.gradle index 65608606cf4..68163949547 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 @@ -86,7 +86,7 @@ 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 group: 'org.spockframework', name: 'spock-spring', version: '1.1-groovy-2.4' + 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-5.0/src/bootTest/groovy/SingleThreadedSpringWebfluxTest.groovy b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/bootTest/groovy/SingleThreadedSpringWebfluxTest.groovy index 23bddcfcc9a..efc3a2e1931 100644 --- a/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/bootTest/groovy/SingleThreadedSpringWebfluxTest.groovy +++ b/dd-java-agent/instrumentation/spring/spring-webflux/spring-webflux-5.0/src/bootTest/groovy/SingleThreadedSpringWebfluxTest.groovy @@ -1,6 +1,4 @@ import dd.trace.instrumentation.springwebflux.server.SpringWebFluxTestApplication -import org.junit.AfterClass -import org.junit.BeforeClass import org.springframework.boot.test.context.SpringBootTest /** @@ -11,13 +9,11 @@ import org.springframework.boot.test.context.SpringBootTest @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = [SpringWebFluxTestApplication, ForceNettyAutoConfiguration]) class SingleThreadedSpringWebfluxTest extends SpringWebfluxTest { - @BeforeClass - static void init() { + def setup() { System.setProperty("reactor.netty.ioWorkerCount", "1") } - @AfterClass - static void teardown() { + def cleanup() { System.clearProperty("reactor.netty.ioWorkerCount") } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cc0abb6737b..a854f8da546 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,6 +8,7 @@ okio = "1.17.6" # Datadog fork spock = "2.4-M6-groovy-3.0" groovy = "3.0.24" +junit4 = "4.13.2" junit5 = "5.12.2" junit-platform = "1.12.2" logback = "1.2.13" @@ -68,12 +69,13 @@ aircompressor = { module = 'io.airlift:aircompressor', version = '2.0.2'} # Testing 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" } objenesis = { module = "org.objenesis:objenesis", version = "3.3" } # Used by Spock for mocking: groovy = { module = "org.codehaus.groovy:groovy-all", version.ref = "groovy" } groovy-yaml = { module = "org.codehaus.groovy:groovy-yaml", version.ref = "groovy" } + +junit4 = { module = "junit:junit", version.ref = "junit4" } junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit5" } junit-jupiter-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref = "junit5" } junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "junit-platform" } diff --git a/telemetry/src/test/groovy/datadog/telemetry/dependency/DependencyResolverSpecification.groovy b/telemetry/src/test/groovy/datadog/telemetry/dependency/DependencyResolverSpecification.groovy index 073d85999e9..4437f1a1c65 100644 --- a/telemetry/src/test/groovy/datadog/telemetry/dependency/DependencyResolverSpecification.groovy +++ b/telemetry/src/test/groovy/datadog/telemetry/dependency/DependencyResolverSpecification.groovy @@ -1,6 +1,5 @@ package datadog.telemetry.dependency -import org.apache.tools.ant.taskdefs.Classloader import spock.lang.TempDir import java.nio.charset.Charset @@ -136,8 +135,8 @@ class DependencyResolverSpecification extends DepSpecification { void 'spring boot dependency'() throws IOException { when: - String zipPath = Classloader.classLoader.getResource('datadog/telemetry/dependencies/spring-boot-app.jar').path - URI uri = new URI("jar:file:$zipPath!/BOOT-INF/lib/opentracing-util-0.33.0.jar!/") + URI zipPath = zipPath('datadog/telemetry/dependencies/spring-boot-app.jar') + URI uri = new URI("jar:$zipPath!/BOOT-INF/lib/opentracing-util-0.33.0.jar!/") Dependency dep = DependencyResolver.resolve(uri).get(0) @@ -151,8 +150,8 @@ class DependencyResolverSpecification extends DepSpecification { void 'spring boot dependency without trailing slash'() throws IOException { when: - String zipPath = Classloader.classLoader.getResource('datadog/telemetry/dependencies/spring-boot-app.jar').path - URI uri = new URI("jar:file:$zipPath!/BOOT-INF/lib/opentracing-util-0.33.0.jar!") + URI zipPath = zipPath('datadog/telemetry/dependencies/spring-boot-app.jar') + URI uri = new URI("jar:$zipPath!/BOOT-INF/lib/opentracing-util-0.33.0.jar!") Dependency dep = DependencyResolver.resolve(uri).get(0) @@ -166,8 +165,8 @@ class DependencyResolverSpecification extends DepSpecification { void 'spring boot dependency new style'() throws IOException { when: - String zipPath = Classloader.classLoader.getResource('datadog/telemetry/dependencies/spring-boot-app.jar').path - URI uri = new URI("jar:nested:$zipPath/!BOOT-INF/lib/opentracing-util-0.33.0.jar!/") + String zipPath = zipPath('datadog/telemetry/dependencies/spring-boot-app.jar').toString().replace("file:", "nested:") + URI uri = new URI("jar:$zipPath/!BOOT-INF/lib/opentracing-util-0.33.0.jar!/") Dependency dep = DependencyResolver.resolve(uri).get(0) @@ -235,7 +234,7 @@ class DependencyResolverSpecification extends DepSpecification { void 'fat jar with multiple pom.properties'() throws IOException { when: - URI uri = Classloader.classLoader.getResource('datadog/telemetry/dependencies/budgetapp.jar').toURI() + URI uri = zipPath('datadog/telemetry/dependencies/budgetapp.jar') List deps = DependencyResolver.resolve(uri) @@ -246,7 +245,7 @@ class DependencyResolverSpecification extends DepSpecification { void 'fat jar with two pom.properties'() throws IOException { when: - URI uri = Classloader.classLoader.getResource('datadog/telemetry/dependencies/budgetappreduced.jar').toURI() + URI uri = zipPath('datadog/telemetry/dependencies/budgetappreduced.jar') List deps = DependencyResolver.resolve(uri) Dependency dep1 = deps.get(0) @@ -260,7 +259,7 @@ class DependencyResolverSpecification extends DepSpecification { void 'fat jar with two pom.properties one of them bad'() throws IOException { when: - URI uri = Classloader.classLoader.getResource('datadog/telemetry/dependencies/budgetappreducedbadproperties.jar').toURI() + URI uri = zipPath('datadog/telemetry/dependencies/budgetappreducedbadproperties.jar') List deps = DependencyResolver.resolve(uri) Dependency dep1 = deps.get(0) @@ -352,4 +351,14 @@ class DependencyResolverSpecification extends DepSpecification { then: deps.size() == 1 } + + private static URI zipPath(String outerJar) { + URL outerJarUrl = Thread.currentThread() + .contextClassLoader + .getResource(outerJar) + + assert outerJarUrl != null : "Resource not found: ${outerJar}" + + outerJarUrl.toURI() + } } diff --git a/utils/test-utils/src/main/groovy/datadog/trace/test/util/MultipartRequestParser.groovy b/utils/test-utils/src/main/groovy/datadog/trace/test/util/MultipartRequestParser.groovy index 076598b97b6..fded0e8179c 100644 --- a/utils/test-utils/src/main/groovy/datadog/trace/test/util/MultipartRequestParser.groovy +++ b/utils/test-utils/src/main/groovy/datadog/trace/test/util/MultipartRequestParser.groovy @@ -35,7 +35,7 @@ class MultipartRequestParser { String getCharacterEncoding() { ParameterParser parser = new ParameterParser() parser.setLowerCaseNames(true) - String charset = parser.parse(contentType, ';' as char).get("charset") + String charset = parser.parse(contentType, (char)';').get("charset") return charset != null ? charset : "UTF-8" } From 655f5308577d9f5c75e81d00891e14f29f0f3fef Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Thu, 6 Nov 2025 16:19:36 -0500 Subject: [PATCH 2/6] Typo --- dd-java-agent/instrumentation/jax-rs-annotations-1/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dd-java-agent/instrumentation/jax-rs-annotations-1/build.gradle b/dd-java-agent/instrumentation/jax-rs-annotations-1/build.gradle index c82b0ca7dd4..ffe280624d9 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations-1/build.gradle +++ b/dd-java-agent/instrumentation/jax-rs-annotations-1/build.gradle @@ -16,7 +16,7 @@ apply from: "$rootDir/gradle/java.gradle" dependencies { compileOnly group: 'javax.ws.rs', name: 'jsr311-api', version: '1.1.1' - testImplementation libs.junit4 // This legacy still needs JUnit4. + testImplementation libs.junit4 // This module still needs JUnit4. testImplementation group: 'io.dropwizard', name: 'dropwizard-testing', version: '0.7.1' testImplementation group: 'javax.xml.bind', name: 'jaxb-api', version: '2.2.3' } From 13791bd04892ca477c69848b7b194d5672587dd6 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Thu, 6 Nov 2025 17:41:31 -0500 Subject: [PATCH 3/6] Tweaking build --- buildSrc/call-site-instrumentation-plugin/build.gradle.kts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildSrc/call-site-instrumentation-plugin/build.gradle.kts b/buildSrc/call-site-instrumentation-plugin/build.gradle.kts index 8b8793e721c..1987bd5f91d 100644 --- a/buildSrc/call-site-instrumentation-plugin/build.gradle.kts +++ b/buildSrc/call-site-instrumentation-plugin/build.gradle.kts @@ -35,8 +35,9 @@ dependencies { implementation("com.github.javaparser", "javaparser-symbol-solver-core", "3.24.4") testImplementation(libs.bytebuddy) + testImplementation(libs.spock.core) + testImplementation("org.objenesis", "objenesis", "3.0.1") testImplementation(libs.groovy) - testImplementation(libs.bundles.spock) testImplementation("javax.servlet", "javax.servlet-api", "3.0.1") testImplementation("com.github.spotbugs", "spotbugs-annotations", "4.2.0") } From 1c00a30b3562674e810ee634b4e4adf195851378 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Thu, 6 Nov 2025 18:19:58 -0500 Subject: [PATCH 4/6] WIP --- buildSrc/call-site-instrumentation-plugin/build.gradle.kts | 3 +-- .../src/test/groovy/timer/TimerTaskContinuationTest.groovy | 2 +- .../instrumentation/jax-rs-annotations-1/build.gradle | 2 +- .../instrumentation/kafka/kafka-clients-0.11/build.gradle | 2 +- .../instrumentation/kafka/kafka-streams-0.11/build.gradle | 2 +- .../datadog/smoketest/AbstractIastSpringBootTest.groovy | 2 +- gradle/codenarc.gradle | 4 ---- gradle/libs.versions.toml | 1 + 8 files changed, 7 insertions(+), 11 deletions(-) diff --git a/buildSrc/call-site-instrumentation-plugin/build.gradle.kts b/buildSrc/call-site-instrumentation-plugin/build.gradle.kts index 1987bd5f91d..8b8793e721c 100644 --- a/buildSrc/call-site-instrumentation-plugin/build.gradle.kts +++ b/buildSrc/call-site-instrumentation-plugin/build.gradle.kts @@ -35,9 +35,8 @@ dependencies { implementation("com.github.javaparser", "javaparser-symbol-solver-core", "3.24.4") testImplementation(libs.bytebuddy) - testImplementation(libs.spock.core) - testImplementation("org.objenesis", "objenesis", "3.0.1") testImplementation(libs.groovy) + testImplementation(libs.bundles.spock) testImplementation("javax.servlet", "javax.servlet-api", "3.0.1") testImplementation("com.github.spotbugs", "spotbugs-annotations", "4.2.0") } diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/timer/TimerTaskContinuationTest.groovy b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/timer/TimerTaskContinuationTest.groovy index f2d4c37c72c..0ce840a5600 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/timer/TimerTaskContinuationTest.groovy +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-1.8/src/test/groovy/timer/TimerTaskContinuationTest.groovy @@ -64,7 +64,7 @@ class TimerTaskContinuationTest extends InstrumentationSpecification { def "test continuation activated when TimerTask runs (date)"() { when: runUnderTrace("parent", { - timer.schedule(timerTask, Instant.now().plusMillis(100).toDate()) + timer.schedule(timerTask, Date.from(Instant.now().plusMillis(100))) }) runLatch.await() diff --git a/dd-java-agent/instrumentation/jax-rs-annotations-1/build.gradle b/dd-java-agent/instrumentation/jax-rs-annotations-1/build.gradle index ffe280624d9..7d1844129c7 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations-1/build.gradle +++ b/dd-java-agent/instrumentation/jax-rs-annotations-1/build.gradle @@ -16,7 +16,7 @@ apply from: "$rootDir/gradle/java.gradle" dependencies { compileOnly group: 'javax.ws.rs', name: 'jsr311-api', version: '1.1.1' - testImplementation libs.junit4 // This module still needs JUnit4. + 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/kafka/kafka-clients-0.11/build.gradle b/dd-java-agent/instrumentation/kafka/kafka-clients-0.11/build.gradle index db40c218ec5..9cd0f269375 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 @@ -26,7 +26,7 @@ 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.junit4 // This module still needs JUnit4. + 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 55236383c59..f8bd3970654 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 @@ -26,7 +26,7 @@ dependencies { // Include latest version of kafka itself along with latest version of client libs. // This seems to help with jar compatibility hell. - latestDepTestImplementation libs.junit4 // This module still needs JUnit4. + 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-smoke-tests/iast-util/src/testFixtures/groovy/datadog/smoketest/AbstractIastSpringBootTest.groovy b/dd-smoke-tests/iast-util/src/testFixtures/groovy/datadog/smoketest/AbstractIastSpringBootTest.groovy index fbbb8b62606..72777ce9227 100644 --- a/dd-smoke-tests/iast-util/src/testFixtures/groovy/datadog/smoketest/AbstractIastSpringBootTest.groovy +++ b/dd-smoke-tests/iast-util/src/testFixtures/groovy/datadog/smoketest/AbstractIastSpringBootTest.groovy @@ -1247,7 +1247,7 @@ abstract class AbstractIastSpringBootTest extends AbstractIastServerSmokeTest { void 'untrusted deserialization for snakeyaml with a string'() { setup: final String yaml = "test" - final url = "http://localhost:${httpPort}/untrusted_deserialization/snakeyaml?yaml=${yaml}" + final url = "http://localhost:${httpPort}/untrusted_deserialization/snakeyaml?yaml=${yaml}".toString() final request = new Request.Builder().url(url).get().build() when: diff --git a/gradle/codenarc.gradle b/gradle/codenarc.gradle index daebac987b8..d51450d6cc8 100644 --- a/gradle/codenarc.gradle +++ b/gradle/codenarc.gradle @@ -9,7 +9,3 @@ dependencies { codenarc { configFile = rootProject.file('gradle/enforcement/codenarc.groovy') } - -//codenarcTest { -// configFile rootProject.file('gradle/enforcement/codenarcTest.groovy') -//} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a854f8da546..1307c72ce02 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -69,6 +69,7 @@ aircompressor = { module = 'io.airlift:aircompressor', version = '2.0.2'} # Testing 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" } objenesis = { module = "org.objenesis:objenesis", version = "3.3" } # Used by Spock for mocking: From 290cfd95860e8d6ed2d0a2604e5fe38e26bc1054 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Thu, 6 Nov 2025 22:39:11 -0500 Subject: [PATCH 5/6] Minor improvement. --- .../groovy/StructuredConcurrencyTest.groovy | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-21.0/src/previewTest/groovy/StructuredConcurrencyTest.groovy b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-21.0/src/previewTest/groovy/StructuredConcurrencyTest.groovy index 885c4035811..8ef8fce7df4 100644 --- a/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-21.0/src/previewTest/groovy/StructuredConcurrencyTest.groovy +++ b/dd-java-agent/instrumentation/java/java-concurrent/java-concurrent-21.0/src/previewTest/groovy/StructuredConcurrencyTest.groovy @@ -1,13 +1,13 @@ +import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace +import static datadog.trace.agent.test.utils.TraceUtils.runnableUnderTrace +import static java.time.Instant.now +import static java.time.temporal.ChronoUnit.SECONDS + import datadog.trace.agent.test.InstrumentationSpecification import datadog.trace.api.Trace - import java.util.concurrent.Callable import java.util.concurrent.StructuredTaskScope -import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace -import static datadog.trace.agent.test.utils.TraceUtils.runnableUnderTrace -import static java.time.Instant.now - class StructuredConcurrencyTest extends InstrumentationSpecification { /** * Tests the structured task scope with a single task. @@ -26,7 +26,7 @@ class StructuredConcurrencyTest extends InstrumentationSpecification { return true } }) - taskScope.joinUntil(now() + 10) // Wait for 10 seconds at maximum + taskScope.joinUntil(now().plus(10, SECONDS)) result = task.get() } taskScope.close() @@ -73,7 +73,7 @@ class StructuredConcurrencyTest extends InstrumentationSpecification { taskScope.fork { runnableUnderTrace("child3") {} } - taskScope.joinUntil(now() + 10) // Wait for 10 seconds at maximum + taskScope.joinUntil(now().plus(10, SECONDS)) } taskScope.close() @@ -132,7 +132,7 @@ class StructuredConcurrencyTest extends InstrumentationSpecification { taskScope.fork { runnableUnderTrace("child2") {} } - taskScope.joinUntil(now() + 10) // Wait for 10 seconds at maximum + taskScope.joinUntil(now().plus(10, SECONDS)) } taskScope.close() From 508fd26720b125e9c88e599f3440b0c96d8af1a1 Mon Sep 17 00:00:00 2001 From: Alexey Kuznetsov Date: Fri, 7 Nov 2025 10:13:08 -0500 Subject: [PATCH 6/6] Use same annotations across codebase. --- .../coverage/ConcurrentCoverageStore.java | 2 +- .../coverage/file/FileCoverageStore.java | 2 +- .../coverage/line/LineCoverageStore.java | 2 +- .../report/NoOpCoverageProcessor.java | 2 +- .../execution/ExecutionOutcomeImpl.java | 2 +- .../debugger/origin/CodeOriginTest.java | 4 +-- .../datadog/debugger/probe/LogProbeTest.java | 4 +-- .../com/datadog/iast/IastOptOutContext.java | 2 -- .../iast/overhead/OverheadContext.java | 4 +-- dd-java-agent/agent-llmobs/build.gradle | 12 --------- .../trace/llmobs/domain/LLMObsEval.java | 2 +- .../DatadogThreadContextElement.java | 26 +++++++++---------- 12 files changed, 25 insertions(+), 39 deletions(-) diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/ConcurrentCoverageStore.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/ConcurrentCoverageStore.java index 8edcaa0adb8..29b420f3b02 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/ConcurrentCoverageStore.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/ConcurrentCoverageStore.java @@ -9,7 +9,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; -import org.jetbrains.annotations.Nullable; +import javax.annotation.Nullable; /** A store that keeps track of coverage probes allocated for multiple threads. */ public abstract class ConcurrentCoverageStore implements CoverageStore { diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/file/FileCoverageStore.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/file/FileCoverageStore.java index 0399ccbf6e2..21d6d601926 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/file/FileCoverageStore.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/file/FileCoverageStore.java @@ -20,7 +20,7 @@ import java.util.List; import java.util.Set; import java.util.function.Function; -import org.jetbrains.annotations.Nullable; +import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/line/LineCoverageStore.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/line/LineCoverageStore.java index 651e0acd5dc..ae811c35de9 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/line/LineCoverageStore.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/line/LineCoverageStore.java @@ -24,9 +24,9 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; +import javax.annotation.Nullable; import org.jacoco.core.analysis.Analyzer; import org.jacoco.core.data.ExecutionDataStore; -import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/report/NoOpCoverageProcessor.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/report/NoOpCoverageProcessor.java index 90929e33784..2dd5c4db3c3 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/report/NoOpCoverageProcessor.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/coverage/report/NoOpCoverageProcessor.java @@ -2,7 +2,7 @@ import datadog.trace.api.civisibility.domain.BuildModuleLayout; import datadog.trace.civisibility.config.ExecutionSettings; -import org.jetbrains.annotations.Nullable; +import javax.annotation.Nullable; public class NoOpCoverageProcessor implements CoverageProcessor { diff --git a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/execution/ExecutionOutcomeImpl.java b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/execution/ExecutionOutcomeImpl.java index 47b0fe76722..91acb0b845f 100644 --- a/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/execution/ExecutionOutcomeImpl.java +++ b/dd-java-agent/agent-ci-visibility/src/main/java/datadog/trace/civisibility/execution/ExecutionOutcomeImpl.java @@ -2,7 +2,7 @@ import datadog.trace.api.civisibility.execution.TestExecutionHistory; import datadog.trace.api.civisibility.telemetry.tag.RetryReason; -import org.jetbrains.annotations.Nullable; +import javax.annotation.Nullable; class ExecutionOutcomeImpl implements TestExecutionHistory.ExecutionOutcome { diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTest.java index 61af2573ca9..0a53e61150d 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/origin/CodeOriginTest.java @@ -47,13 +47,13 @@ import java.util.Set; import java.util.TreeSet; import java.util.stream.Collectors; +import javax.annotation.Nonnull; import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.agent.builder.AgentBuilder.InitializationStrategy; import net.bytebuddy.agent.builder.AgentBuilder.RedefinitionStrategy; import net.bytebuddy.agent.builder.AgentBuilder.TypeStrategy; import net.bytebuddy.asm.Advice; import net.bytebuddy.matcher.ElementMatcher.Junction.Conjunction; -import org.jetbrains.annotations.NotNull; import org.joor.Reflect; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; @@ -248,7 +248,7 @@ public void testDuplicateInstrumentations() assertEquals(probe1, probe2); } - @NotNull + @Nonnull private static CodeOriginProbe[] codeOriginProbes(String type) { CodeOriginProbe entry = new CodeOriginProbe(CODE_ORIGIN_ID1, true, Where.of(type, "entry", "()", "53")); diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/LogProbeTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/LogProbeTest.java index b9081c1fa1e..16d9ceb0811 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/LogProbeTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/probe/LogProbeTest.java @@ -30,7 +30,7 @@ import datadog.trace.bootstrap.instrumentation.api.Tags; import datadog.trace.core.CoreTracer; import java.util.stream.Stream; -import org.jetbrains.annotations.NotNull; +import javax.annotation.Nonnull; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -109,7 +109,7 @@ public void budgets() { } } - @NotNull + @Nonnull private Result getResult( TracerAPI tracer, String sessionId, boolean captureSnapshot, Integer line) { BudgetSink sink = new BudgetSink(getConfig(), mock(ProbeStatusSink.class)); diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastOptOutContext.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastOptOutContext.java index ad91165da20..464e38b3681 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastOptOutContext.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/IastOptOutContext.java @@ -5,13 +5,11 @@ import java.io.IOException; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import org.jetbrains.annotations.NotNull; public class IastOptOutContext implements IastContext { @Nonnull @SuppressWarnings("unchecked") - @NotNull @Override public TaintedObjects getTaintedObjects() { return TaintedObjects.NoOp.INSTANCE; diff --git a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/OverheadContext.java b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/OverheadContext.java index 9dac3394455..89dc03c1a59 100644 --- a/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/OverheadContext.java +++ b/dd-java-agent/agent-iast/src/main/java/com/datadog/iast/overhead/OverheadContext.java @@ -10,8 +10,8 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicIntegerArray; import java.util.function.Function; +import javax.annotation.Nonnull; import javax.annotation.Nullable; -import org.jetbrains.annotations.NotNull; public class OverheadContext { @@ -28,7 +28,7 @@ public class OverheadContext { @Override public AtomicIntegerArray computeIfAbsent( String key, - @NotNull Function mappingFunction) { + @Nonnull Function mappingFunction) { if (this.size() >= GLOBAL_MAP_MAX_SIZE) { super.clear(); } diff --git a/dd-java-agent/agent-llmobs/build.gradle b/dd-java-agent/agent-llmobs/build.gradle index b0a327bbcff..541dbeb7ec5 100644 --- a/dd-java-agent/agent-llmobs/build.gradle +++ b/dd-java-agent/agent-llmobs/build.gradle @@ -1,23 +1,11 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.dsl.KotlinVersion plugins { id 'com.gradleup.shadow' - id 'org.jetbrains.kotlin.jvm' } apply from: "$rootDir/gradle/java.gradle" apply from: "$rootDir/gradle/version.gradle" -apply from: "$rootDir/gradle/test-with-kotlin.gradle" - -kotlin { - compilerOptions { - jvmTarget = JvmTarget.JVM_1_8 - apiVersion = KotlinVersion.KOTLIN_1_6 - languageVersion = KotlinVersion.KOTLIN_1_6 - } -} minimumBranchCoverage = 0.0 minimumInstructionCoverage = 0.0 diff --git a/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/domain/LLMObsEval.java b/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/domain/LLMObsEval.java index 8438e398e38..58d3c5dbb64 100644 --- a/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/domain/LLMObsEval.java +++ b/dd-java-agent/agent-llmobs/src/main/java/datadog/trace/llmobs/domain/LLMObsEval.java @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import org.jetbrains.annotations.Nullable; +import javax.annotation.Nullable; public abstract class LLMObsEval { private static final String METRIC_TYPE_SCORE = "score"; diff --git a/dd-java-agent/instrumentation/kotlin-coroutines/src/main/java/datadog/trace/instrumentation/kotlin/coroutines/DatadogThreadContextElement.java b/dd-java-agent/instrumentation/kotlin-coroutines/src/main/java/datadog/trace/instrumentation/kotlin/coroutines/DatadogThreadContextElement.java index b4462b185cf..aae9d7b95f1 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines/src/main/java/datadog/trace/instrumentation/kotlin/coroutines/DatadogThreadContextElement.java +++ b/dd-java-agent/instrumentation/kotlin-coroutines/src/main/java/datadog/trace/instrumentation/kotlin/coroutines/DatadogThreadContextElement.java @@ -3,12 +3,12 @@ import datadog.context.Context; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentTracer; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import kotlin.coroutines.CoroutineContext; import kotlin.jvm.functions.Function2; import kotlinx.coroutines.AbstractCoroutine; import kotlinx.coroutines.ThreadContextElement; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; /** Manages the Datadog context for coroutines, switching contexts as coroutines switch threads. */ public final class DatadogThreadContextElement implements ThreadContextElement { @@ -25,13 +25,13 @@ public static CoroutineContext addDatadogElement(CoroutineContext coroutineConte private Context context; private AgentScope.Continuation continuation; - @NotNull + @Nonnull @Override public Key getKey() { return DATADOG_KEY; } - public static void captureDatadogContext(@NotNull AbstractCoroutine coroutine) { + public static void captureDatadogContext(@Nonnull AbstractCoroutine coroutine) { DatadogThreadContextElement datadog = coroutine.getContext().get(DATADOG_KEY); if (datadog != null && datadog.context == null) { // record context to use for this coroutine @@ -41,7 +41,7 @@ public static void captureDatadogContext(@NotNull AbstractCoroutine coroutine } } - public static void cancelDatadogContext(@NotNull AbstractCoroutine coroutine) { + public static void cancelDatadogContext(@Nonnull AbstractCoroutine coroutine) { DatadogThreadContextElement datadog = coroutine.getContext().get(DATADOG_KEY); if (datadog != null && datadog.continuation != null) { // release enclosing trace now the coroutine has completed @@ -50,7 +50,7 @@ public static void cancelDatadogContext(@NotNull AbstractCoroutine coroutine) } @Override - public Context updateThreadContext(@NotNull CoroutineContext coroutineContext) { + public Context updateThreadContext(@Nonnull CoroutineContext coroutineContext) { if (context == null) { // record context to use for this coroutine context = Context.current(); @@ -62,31 +62,31 @@ public Context updateThreadContext(@NotNull CoroutineContext coroutineContext) { @Override public void restoreThreadContext( - @NotNull CoroutineContext coroutineContext, Context originalContext) { + @Nonnull CoroutineContext coroutineContext, Context originalContext) { context = originalContext.swap(); } - @NotNull + @Nonnull @Override - public CoroutineContext plus(@NotNull CoroutineContext coroutineContext) { + public CoroutineContext plus(@Nonnull CoroutineContext coroutineContext) { return CoroutineContext.DefaultImpls.plus(this, coroutineContext); } @Override public R fold( - R initial, @NotNull Function2 operation) { + R initial, @Nonnull Function2 operation) { return CoroutineContext.Element.DefaultImpls.fold(this, initial, operation); } @Nullable @Override - public E get(@NotNull Key key) { + public E get(@Nonnull Key key) { return CoroutineContext.Element.DefaultImpls.get(this, key); } - @NotNull + @Nonnull @Override - public CoroutineContext minusKey(@NotNull Key key) { + public CoroutineContext minusKey(@Nonnull Key key) { return CoroutineContext.Element.DefaultImpls.minusKey(this, key); } }