diff --git a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/build.gradle b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/build.gradle index 86abd12eb08..27c7a630608 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/build.gradle +++ b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/build.gradle @@ -35,6 +35,9 @@ kotlin { } } +// Reuse the flow and context-lifecycle tests across intermediate and current releases. +addTestSuiteForDir('coroutines16Test', 'latestDepTest') +addTestSuiteForDir('coroutines18Test', 'latestDepTest') addTestSuite('latestDepTest') dependencies { @@ -52,10 +55,15 @@ dependencies { testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0" testImplementation testFixtures(project(':dd-java-agent:instrumentation:kotlin-coroutines-1.3')) + coroutines16TestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4" + coroutines18TestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1" + latestDepTestImplementation libs.kotlin - latestDepTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.+" + latestDepTestImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.+" latestDepTestImplementation testFixtures(project(':dd-java-agent:instrumentation:kotlin-coroutines-1.3')) testFixturesCompileOnly(libs.bundles.groovy) testFixturesCompileOnly(libs.bundles.spock) + testFixturesCompileOnly libs.junit.jupiter + testFixturesCompileOnly libs.tabletest } diff --git a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/gradle.lockfile b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/gradle.lockfile index 31525e3b1ca..1bcca5a8846 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/gradle.lockfile +++ b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/gradle.lockfile @@ -2,63 +2,63 @@ # Manual edits can break the build and are not advised. # This file is expected to be part of source control. # To regenerate this file, run: ./gradlew :dd-java-agent:instrumentation:kotlin-coroutines-1.3:dependencies --write-locks -cafe.cryptography:curve25519-elisabeth:0.1.0=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -cafe.cryptography:ed25519-elisabeth:0.1.0=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -ch.qos.logback:logback-classic:1.2.13=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -ch.qos.logback:logback-core:1.2.13=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.blogspot.mydailyjava:weak-lock-free:0.17=buildTimeInstrumentationPlugin,compileClasspath,implementationDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.datadoghq.okhttp3:okhttp:3.12.15=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.datadoghq.okio:okio:1.17.6=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.datadoghq:dd-instrument-java:0.0.6=buildTimeInstrumentationPlugin,compileClasspath,implementationDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.datadoghq:dd-javac-plugin-client:0.2.2=buildTimeInstrumentationPlugin,compileClasspath,implementationDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.datadoghq:java-dogstatsd-client:4.4.5=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -com.datadoghq:sketches-java:0.8.3=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +cafe.cryptography:curve25519-elisabeth:0.1.0=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +cafe.cryptography:ed25519-elisabeth:0.1.0=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +ch.qos.logback:logback-classic:1.2.13=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +ch.qos.logback:logback-core:1.2.13=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.blogspot.mydailyjava:weak-lock-free:0.17=buildTimeInstrumentationPlugin,compileClasspath,coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,implementationDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.datadoghq.okhttp3:okhttp:3.12.15=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.datadoghq.okio:okio:1.17.6=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.datadoghq:dd-instrument-java:0.0.6=buildTimeInstrumentationPlugin,compileClasspath,coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,implementationDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.datadoghq:dd-javac-plugin-client:0.2.2=buildTimeInstrumentationPlugin,compileClasspath,coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,implementationDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,muzzleBootstrap,muzzleTooling,runtimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.datadoghq:java-dogstatsd-client:4.4.5=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.datadoghq:sketches-java:0.8.3=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath com.github.javaparser:javaparser-core:3.25.6=codenarc -com.github.jnr:jffi:1.3.15=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -com.github.jnr:jnr-a64asm:1.0.0=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -com.github.jnr:jnr-constants:0.10.4=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -com.github.jnr:jnr-enxio:0.32.20=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -com.github.jnr:jnr-ffi:2.2.19=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -com.github.jnr:jnr-posix:3.1.22=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -com.github.jnr:jnr-unixsocket:0.38.25=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -com.github.jnr:jnr-x86asm:1.0.2=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.github.jnr:jffi:1.3.15=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-a64asm:1.0.0=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-constants:0.10.4=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-enxio:0.32.20=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-ffi:2.2.19=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-posix:3.1.22=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-unixsocket:0.38.25=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.github.jnr:jnr-x86asm:1.0.2=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath com.github.spotbugs:spotbugs-annotations:4.10.4=compileClasspath,compileOnlyDependenciesMetadata,spotbugs com.github.spotbugs:spotbugs:4.10.4=spotbugs com.github.stephenc.jcip:jcip-annotations:1.0-1=spotbugs -com.google.auto.service:auto-service-annotations:1.1.1=annotationProcessor,compileClasspath,compileOnlyDependenciesMetadata,latestDepTestAnnotationProcessor,latestDepTestCompileClasspath,latestDepTestCompileOnlyDependenciesMetadata,testAnnotationProcessor,testCompileClasspath,testCompileOnlyDependenciesMetadata -com.google.auto.service:auto-service:1.1.1=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor -com.google.auto:auto-common:1.2.1=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor -com.google.code.findbugs:jsr305:3.0.2=annotationProcessor,compileClasspath,compileOnlyDependenciesMetadata,latestDepTestAnnotationProcessor,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,spotbugs,testAnnotationProcessor,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.google.auto.service:auto-service-annotations:1.1.1=annotationProcessor,compileClasspath,compileOnlyDependenciesMetadata,coroutines16TestAnnotationProcessor,coroutines16TestCompileClasspath,coroutines16TestCompileOnlyDependenciesMetadata,coroutines18TestAnnotationProcessor,coroutines18TestCompileClasspath,coroutines18TestCompileOnlyDependenciesMetadata,latestDepTestAnnotationProcessor,latestDepTestCompileClasspath,latestDepTestCompileOnlyDependenciesMetadata,testAnnotationProcessor,testCompileClasspath,testCompileOnlyDependenciesMetadata +com.google.auto.service:auto-service:1.1.1=annotationProcessor,coroutines16TestAnnotationProcessor,coroutines18TestAnnotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +com.google.auto:auto-common:1.2.1=annotationProcessor,coroutines16TestAnnotationProcessor,coroutines18TestAnnotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +com.google.code.findbugs:jsr305:3.0.2=annotationProcessor,compileClasspath,compileOnlyDependenciesMetadata,coroutines16TestAnnotationProcessor,coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestAnnotationProcessor,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestAnnotationProcessor,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,spotbugs,testAnnotationProcessor,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath com.google.code.gson:gson:2.14.0=spotbugs -com.google.errorprone:error_prone_annotations:2.18.0=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor -com.google.errorprone:error_prone_annotations:2.47.0=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.google.errorprone:error_prone_annotations:2.18.0=annotationProcessor,coroutines16TestAnnotationProcessor,coroutines18TestAnnotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +com.google.errorprone:error_prone_annotations:2.47.0=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath com.google.errorprone:error_prone_annotations:2.48.0=spotbugs -com.google.guava:failureaccess:1.0.1=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor -com.google.guava:failureaccess:1.0.3=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.google.guava:guava:32.0.1-jre=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor -com.google.guava:guava:33.6.0-jre=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=annotationProcessor,latestDepTestAnnotationProcessor,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testAnnotationProcessor,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.google.j2objc:j2objc-annotations:2.8=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor -com.google.j2objc:j2objc-annotations:3.1=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.google.re2j:re2j:1.8=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -com.squareup.moshi:moshi:1.11.0=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.squareup.okhttp3:logging-interceptor:3.12.12=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.squareup.okhttp3:okhttp:3.12.12=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -com.squareup.okio:okio:1.17.5=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.google.guava:failureaccess:1.0.1=annotationProcessor,coroutines16TestAnnotationProcessor,coroutines18TestAnnotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +com.google.guava:failureaccess:1.0.3=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.google.guava:guava:32.0.1-jre=annotationProcessor,coroutines16TestAnnotationProcessor,coroutines18TestAnnotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +com.google.guava:guava:33.6.0-jre=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava=annotationProcessor,coroutines16TestAnnotationProcessor,coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestAnnotationProcessor,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestAnnotationProcessor,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testAnnotationProcessor,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.google.j2objc:j2objc-annotations:2.8=annotationProcessor,coroutines16TestAnnotationProcessor,coroutines18TestAnnotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +com.google.j2objc:j2objc-annotations:3.1=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.google.re2j:re2j:1.8=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +com.squareup.moshi:moshi:1.11.0=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.squareup.okhttp3:logging-interceptor:3.12.12=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.squareup.okhttp3:okhttp:3.12.12=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +com.squareup.okio:okio:1.17.5=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath com.thoughtworks.qdox:qdox:1.12.1=codenarc -commons-fileupload:commons-fileupload:1.5=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -commons-io:commons-io:2.11.0=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +commons-fileupload:commons-fileupload:1.5=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +commons-io:commons-io:2.11.0=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath commons-io:commons-io:2.21.0=spotbugs -de.thetaphi:forbiddenapis:3.11=compileClasspath,compileOnlyDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -io.leangen.geantyref:geantyref:1.3.16=latestDepTestRuntimeClasspath,testRuntimeClasspath -io.sqreen:libsqreen:17.5.0=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -javax.servlet:javax.servlet-api:3.1.0=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +de.thetaphi:forbiddenapis:3.11=compileClasspath,compileOnlyDependenciesMetadata,coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +io.leangen.geantyref:geantyref:1.3.16=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testRuntimeClasspath +io.sqreen:libsqreen:17.5.0=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +javax.servlet:javax.servlet-api:3.1.0=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath jaxen:jaxen:2.0.6=spotbugs -junit:junit:4.13.2=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -net.bytebuddy:byte-buddy-agent:1.18.12=buildTimeInstrumentationPlugin,compileClasspath,implementationDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -net.bytebuddy:byte-buddy:1.18.12=buildTimeInstrumentationPlugin,compileClasspath,implementationDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -net.java.dev.jna:jna-platform:5.8.0=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -net.java.dev.jna:jna:5.8.0=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +junit:junit:4.13.2=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +net.bytebuddy:byte-buddy-agent:1.18.12=buildTimeInstrumentationPlugin,compileClasspath,coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,implementationDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +net.bytebuddy:byte-buddy:1.18.12=buildTimeInstrumentationPlugin,compileClasspath,coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,implementationDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +net.java.dev.jna:jna-platform:5.8.0=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +net.java.dev.jna:jna:5.8.0=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath net.sf.saxon:Saxon-HE:12.10=spotbugs org.apache.ant:ant-antlr:1.10.14=codenarc org.apache.ant:ant-junit:1.10.14=codenarc @@ -67,24 +67,24 @@ org.apache.commons:commons-lang3:3.20.0=spotbugs org.apache.commons:commons-text:1.15.0=spotbugs org.apache.logging.log4j:log4j-api:2.26.1=spotbugs org.apache.logging.log4j:log4j-core:2.26.1=spotbugs -org.apiguardian:apiguardian-api:1.1.2=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata -org.checkerframework:checker-qual:3.33.0=annotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor +org.apiguardian:apiguardian-api:1.1.2=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata +org.checkerframework:checker-qual:3.33.0=annotationProcessor,coroutines16TestAnnotationProcessor,coroutines18TestAnnotationProcessor,latestDepTestAnnotationProcessor,testAnnotationProcessor org.codehaus.groovy:groovy-ant:3.0.23=codenarc org.codehaus.groovy:groovy-docgenerator:3.0.23=codenarc org.codehaus.groovy:groovy-groovydoc:3.0.23=codenarc org.codehaus.groovy:groovy-json:3.0.23=codenarc -org.codehaus.groovy:groovy-json:3.0.25=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testRuntimeClasspath +org.codehaus.groovy:groovy-json:3.0.25=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testRuntimeClasspath org.codehaus.groovy:groovy-templates:3.0.23=codenarc org.codehaus.groovy:groovy-xml:3.0.23=codenarc org.codehaus.groovy:groovy:3.0.23=codenarc -org.codehaus.groovy:groovy:3.0.25=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testRuntimeClasspath +org.codehaus.groovy:groovy:3.0.25=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testRuntimeClasspath org.codenarc:CodeNarc:3.7.0=codenarc org.dom4j:dom4j:2.2.0=spotbugs org.gmetrics:GMetrics:2.1.0=codenarc -org.hamcrest:hamcrest-core:1.3=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -org.hamcrest:hamcrest:3.0=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jctools:jctools-core-jdk11:4.0.6=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -org.jctools:jctools-core:4.0.6=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.hamcrest:hamcrest-core:1.3=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.hamcrest:hamcrest:3.0=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testRuntimeClasspath +org.jctools:jctools-core-jdk11:4.0.6=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.jctools:jctools-core:4.0.6=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath org.jetbrains.intellij.deps:trove4j:1.0.20200330=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath org.jetbrains.kotlin:kotlin-build-tools-api:2.1.20=kotlinBuildToolsApiClasspath org.jetbrains.kotlin:kotlin-build-tools-impl:2.1.20=kotlinBuildToolsApiClasspath @@ -94,57 +94,68 @@ org.jetbrains.kotlin:kotlin-daemon-client:2.1.20=kotlinBuildToolsApiClasspath org.jetbrains.kotlin:kotlin-daemon-embeddable:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath org.jetbrains.kotlin:kotlin-klib-commonizer-embeddable:2.1.20=kotlinKlibCommonizerClasspath org.jetbrains.kotlin:kotlin-reflect:1.6.10=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath -org.jetbrains.kotlin:kotlin-script-runtime:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathLatestDepTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestFixtures,kotlinKlibCommonizerClasspath -org.jetbrains.kotlin:kotlin-scripting-common:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathLatestDepTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestFixtures -org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathLatestDepTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestFixtures -org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathLatestDepTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestFixtures -org.jetbrains.kotlin:kotlin-scripting-jvm:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathLatestDepTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestFixtures -org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21=compileClasspath,compileOnlyDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath -org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath -org.jetbrains.kotlin:kotlin-stdlib:1.6.21=compileClasspath,compileOnlyDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jetbrains.kotlin:kotlin-stdlib:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathLatestDepTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestFixtures,kotlinKlibCommonizerClasspath -org.jetbrains.kotlinx:atomicfu:0.17.3=latestDepTestImplementationDependenciesMetadata -org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath +org.jetbrains.kotlin:kotlin-script-runtime:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathCoroutines16Test,kotlinCompilerPluginClasspathCoroutines18Test,kotlinCompilerPluginClasspathLatestDepTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestFixtures,kotlinKlibCommonizerClasspath +org.jetbrains.kotlin:kotlin-scripting-common:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathCoroutines16Test,kotlinCompilerPluginClasspathCoroutines18Test,kotlinCompilerPluginClasspathLatestDepTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestFixtures +org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathCoroutines16Test,kotlinCompilerPluginClasspathCoroutines18Test,kotlinCompilerPluginClasspathLatestDepTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestFixtures +org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathCoroutines16Test,kotlinCompilerPluginClasspathCoroutines18Test,kotlinCompilerPluginClasspathLatestDepTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestFixtures +org.jetbrains.kotlin:kotlin-scripting-jvm:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerPluginClasspathCoroutines16Test,kotlinCompilerPluginClasspathCoroutines18Test,kotlinCompilerPluginClasspathLatestDepTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestFixtures +org.jetbrains.kotlin:kotlin-stdlib-common:1.6.21=compileClasspath,compileOnlyDependenciesMetadata,coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-common:1.9.21=coroutines18TestImplementationDependenciesMetadata +org.jetbrains.kotlin:kotlin-stdlib-common:2.2.20=latestDepTestImplementationDependenciesMetadata +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21=coroutines16TestCompileClasspath,coroutines16TestRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21=coroutines16TestCompileClasspath,coroutines16TestRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib:1.6.21=compileClasspath,compileOnlyDependenciesMetadata,coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib:1.9.21=coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib:2.1.20=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathCoroutines16Test,kotlinCompilerPluginClasspathCoroutines18Test,kotlinCompilerPluginClasspathLatestDepTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestFixtures,kotlinKlibCommonizerClasspath +org.jetbrains.kotlin:kotlin-stdlib:2.2.20=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath +org.jetbrains.kotlinx:atomicfu:0.17.3=coroutines16TestImplementationDependenciesMetadata +org.jetbrains.kotlinx:atomicfu:0.23.1=coroutines18TestImplementationDependenciesMetadata,latestDepTestImplementationDependenciesMetadata +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.11.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.8.1=coroutines18TestCompileClasspath,coroutines18TestRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.11.0=latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.6.4=coroutines16TestCompileClasspath,coroutines16TestRuntimeClasspath org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.0=kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinKlibCommonizerClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.8.1=coroutines18TestCompileClasspath,coroutines18TestRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.11.0=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.0=compileClasspath,compileOnlyDependenciesMetadata,testCompileClasspath,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath -org.jetbrains:annotations:13.0=compileClasspath,compileOnlyDependenciesMetadata,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathLatestDepTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestFixtures,kotlinKlibCommonizerClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.jspecify:jspecify:1.0.0=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.junit.jupiter:junit-jupiter-api:5.14.1=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.junit.jupiter:junit-jupiter-engine:5.14.1=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -org.junit.jupiter:junit-jupiter-params:5.14.1=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.junit.jupiter:junit-jupiter:5.14.1=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.junit.platform:junit-platform-commons:1.14.1=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.junit.platform:junit-platform-engine:1.14.1=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.junit.platform:junit-platform-launcher:1.14.1=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -org.junit.platform:junit-platform-runner:1.14.1=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -org.junit.platform:junit-platform-suite-api:1.14.1=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -org.junit.platform:junit-platform-suite-commons:1.14.1=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -org.junit:junit-bom:5.14.1=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.mockito:mockito-core:4.4.0=latestDepTestRuntimeClasspath,testRuntimeClasspath -org.objenesis:objenesis:3.3=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testRuntimeClasspath -org.opentest4j:opentest4j:1.3.0=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.1=coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath +org.jetbrains:annotations:13.0=compileClasspath,compileOnlyDependenciesMetadata,coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,kotlinBuildToolsApiClasspath,kotlinCompilerClasspath,kotlinCompilerPluginClasspathCoroutines16Test,kotlinCompilerPluginClasspathCoroutines18Test,kotlinCompilerPluginClasspathLatestDepTest,kotlinCompilerPluginClasspathMain,kotlinCompilerPluginClasspathTest,kotlinCompilerPluginClasspathTestFixtures,kotlinKlibCommonizerClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.jetbrains:annotations:23.0.0=coroutines18TestCompileClasspath,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestRuntimeClasspath +org.jspecify:jspecify:1.0.0=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-api:5.14.1=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-engine:5.14.1=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.junit.jupiter:junit-jupiter-params:5.14.1=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.junit.jupiter:junit-jupiter:5.14.1=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.junit.platform:junit-platform-commons:1.14.1=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.junit.platform:junit-platform-engine:1.14.1=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.junit.platform:junit-platform-launcher:1.14.1=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-runner:1.14.1=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-suite-api:1.14.1=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.junit.platform:junit-platform-suite-commons:1.14.1=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.junit:junit-bom:5.14.1=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.mockito:mockito-core:4.4.0=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testRuntimeClasspath +org.objenesis:objenesis:3.3=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testRuntimeClasspath +org.opentest4j:opentest4j:1.3.0=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath org.ow2.asm:asm-analysis:9.10.1=spotbugs -org.ow2.asm:asm-analysis:9.7.1=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -org.ow2.asm:asm-commons:9.10.1=latestDepTestRuntimeClasspath,spotbugs,testFixturesRuntimeClasspath,testRuntimeClasspath -org.ow2.asm:asm-tree:9.10.1=latestDepTestRuntimeClasspath,spotbugs,testFixturesRuntimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-analysis:9.7.1=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-commons:9.10.1=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,spotbugs,testFixturesRuntimeClasspath,testRuntimeClasspath +org.ow2.asm:asm-tree:9.10.1=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,spotbugs,testFixturesRuntimeClasspath,testRuntimeClasspath org.ow2.asm:asm-util:9.10.1=spotbugs -org.ow2.asm:asm-util:9.7.1=latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -org.ow2.asm:asm:9.10.1=buildTimeInstrumentationPlugin,compileClasspath,implementationDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,spotbugs,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.slf4j:jcl-over-slf4j:1.7.30=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.slf4j:jul-to-slf4j:1.7.30=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.slf4j:log4j-over-slf4j:1.7.30=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.ow2.asm:asm-util:9.7.1=coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.ow2.asm:asm:9.10.1=buildTimeInstrumentationPlugin,compileClasspath,coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,implementationDependenciesMetadata,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,spotbugs,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.slf4j:jcl-over-slf4j:1.7.30=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.slf4j:jul-to-slf4j:1.7.30=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.slf4j:log4j-over-slf4j:1.7.30=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath org.slf4j:slf4j-api:1.7.30=buildTimeInstrumentationPlugin,compileClasspath,implementationDependenciesMetadata,muzzleBootstrap,muzzleTooling,runtimeClasspath -org.slf4j:slf4j-api:1.7.32=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.slf4j:slf4j-api:1.7.32=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesApiDependenciesMetadata,testFixturesCompileClasspath,testFixturesImplementationDependenciesMetadata,testFixturesRuntimeClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath org.slf4j:slf4j-api:2.0.17=spotbugsSlf4j org.slf4j:slf4j-api:2.0.18=spotbugs org.slf4j:slf4j-simple:2.0.17=spotbugsSlf4j -org.snakeyaml:snakeyaml-engine:2.9=buildTimeInstrumentationPlugin,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath -org.spockframework:spock-bom:2.4-groovy-3.0=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testRuntimeClasspath -org.spockframework:spock-core:2.4-groovy-3.0=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testRuntimeClasspath -org.tabletest:tabletest-junit:1.2.2=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath -org.tabletest:tabletest-parser:1.2.1=latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testImplementationDependenciesMetadata,testRuntimeClasspath +org.snakeyaml:snakeyaml-engine:2.9=buildTimeInstrumentationPlugin,coroutines16TestRuntimeClasspath,coroutines18TestRuntimeClasspath,latestDepTestRuntimeClasspath,muzzleTooling,runtimeClasspath,testFixturesRuntimeClasspath,testRuntimeClasspath +org.spockframework:spock-bom:2.4-groovy-3.0=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testRuntimeClasspath +org.spockframework:spock-core:2.4-groovy-3.0=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testRuntimeClasspath +org.tabletest:tabletest-junit:1.2.2=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testRuntimeClasspath +org.tabletest:tabletest-parser:1.2.1=coroutines16TestCompileClasspath,coroutines16TestImplementationDependenciesMetadata,coroutines16TestRuntimeClasspath,coroutines18TestCompileClasspath,coroutines18TestImplementationDependenciesMetadata,coroutines18TestRuntimeClasspath,latestDepTestCompileClasspath,latestDepTestImplementationDependenciesMetadata,latestDepTestRuntimeClasspath,testCompileClasspath,testFixturesCompileClasspath,testFixturesCompileOnlyDependenciesMetadata,testImplementationDependenciesMetadata,testRuntimeClasspath org.xmlresolver:xmlresolver:5.3.3=spotbugs -empty=apiDependenciesMetadata,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,latestDepTestApiDependenciesMetadata,latestDepTestIntransitiveDependenciesMetadata,latestDepTestKotlinScriptDefExtensions,spotbugsPlugins,testApiDependenciesMetadata,testFixturesAnnotationProcessor,testFixturesIntransitiveDependenciesMetadata,testFixturesKotlinScriptDefExtensions,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions +empty=apiDependenciesMetadata,coroutines16TestApiDependenciesMetadata,coroutines16TestIntransitiveDependenciesMetadata,coroutines16TestKotlinScriptDefExtensions,coroutines18TestApiDependenciesMetadata,coroutines18TestIntransitiveDependenciesMetadata,coroutines18TestKotlinScriptDefExtensions,intransitiveDependenciesMetadata,kotlinCompilerPluginClasspath,kotlinNativeCompilerPluginClasspath,kotlinScriptDefExtensions,latestDepTestApiDependenciesMetadata,latestDepTestIntransitiveDependenciesMetadata,latestDepTestKotlinScriptDefExtensions,spotbugsPlugins,testApiDependenciesMetadata,testFixturesAnnotationProcessor,testFixturesIntransitiveDependenciesMetadata,testFixturesKotlinScriptDefExtensions,testIntransitiveDependenciesMetadata,testKotlinScriptDefExtensions diff --git a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/latestDepTest/java/datadog/trace/instrumentation/kotlin/coroutines/DatadogThreadContextElementTest.java b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/latestDepTest/java/datadog/trace/instrumentation/kotlin/coroutines/DatadogThreadContextElementTest.java new file mode 100644 index 00000000000..e45a22d4b23 --- /dev/null +++ b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/latestDepTest/java/datadog/trace/instrumentation/kotlin/coroutines/DatadogThreadContextElementTest.java @@ -0,0 +1,3 @@ +package datadog.trace.instrumentation.kotlin.coroutines; + +class DatadogThreadContextElementTest extends AbstractDatadogThreadContextElementTest {} diff --git a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/latestDepTest/kotlin/KotlinCoroutineTests.kt b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/latestDepTest/kotlin/KotlinCoroutineTests.kt index 77be265ed46..74da3dd1bff 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/latestDepTest/kotlin/KotlinCoroutineTests.kt +++ b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/latestDepTest/kotlin/KotlinCoroutineTests.kt @@ -12,7 +12,7 @@ class KotlinCoroutineTests(dispatcher: CoroutineDispatcher) : CoreKotlinCoroutin @Trace fun tracedAcrossFlows(withModifiedContext: Boolean): Int = runTest { - val producer = flow { + val producer = flow { repeat(3) { tracedChild("produce_$it") if (withModifiedContext) { @@ -36,7 +36,7 @@ class KotlinCoroutineTests(dispatcher: CoroutineDispatcher) : CoreKotlinCoroutin @Trace fun traceAfterFlow(): Int = runTest { - val f = flow { + val f = flow { childSpan("inside-flow").activateAndUse { println("insideFlowSpan") } @@ -51,6 +51,18 @@ class KotlinCoroutineTests(dispatcher: CoroutineDispatcher) : CoreKotlinCoroutin 3 } + @Trace + override fun structuredChildrenOutliveSeedSpan(): Int = super.structuredChildrenOutliveSeedSpan() + + @Trace + override fun structuredChildrenOfScopedCoroutines(suspendScope: Boolean): Int = super.structuredChildrenOfScopedCoroutines(suspendScope) + + @Trace + override fun childWithReplacedJob(supervisor: Boolean): Int = super.childWithReplacedJob(supervisor) + + @Trace + override fun structuredChildOfCancelledCoroutine(): Int = super.structuredChildOfCancelledCoroutine() + @Trace override fun tracePreventedByCancellation(): Int = super.tracePreventedByCancellation() diff --git a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/main/java/datadog/trace/instrumentation/kotlin/coroutines/DatadogThreadContextElement.java b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/main/java/datadog/trace/instrumentation/kotlin/coroutines/DatadogThreadContextElement.java index 55516db89e0..25129df46e3 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/main/java/datadog/trace/instrumentation/kotlin/coroutines/DatadogThreadContextElement.java +++ b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/main/java/datadog/trace/instrumentation/kotlin/coroutines/DatadogThreadContextElement.java @@ -2,16 +2,23 @@ import datadog.context.Context; import datadog.context.ContextContinuation; +import datadog.trace.api.GenericClassValue; +import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import javax.annotation.Nonnull; import javax.annotation.Nullable; import kotlin.coroutines.CoroutineContext; +import kotlin.coroutines.EmptyCoroutineContext; import kotlin.jvm.functions.Function2; import kotlinx.coroutines.AbstractCoroutine; +import kotlinx.coroutines.Job; import kotlinx.coroutines.ThreadContextElement; +import kotlinx.coroutines.internal.ScopeCoroutine; /** Manages the Datadog context for coroutines, switching contexts as coroutines switch threads. */ -public final class DatadogThreadContextElement implements ThreadContextElement { +public final class DatadogThreadContextElement + implements ThreadContextElement, + Function2 { private static final AtomicReferenceFieldUpdater CONTINUATION = AtomicReferenceFieldUpdater.newUpdater( @@ -20,16 +27,63 @@ public final class DatadogThreadContextElement implements ThreadContextElement DATADOG_KEY = new CoroutineContext.Key() {}; + private static final Object COMPLETED = new Object(); + + /** Coroutines built by coroutineScope, withContext, etc. that their caller waits for. */ + private static final ClassValue SCOPED_COROUTINE = + GenericClassValue.of( + type -> + ScopeCoroutine.class.isAssignableFrom(type) + // older timeout coroutines are scoped but don't extend ScopeCoroutine + || (AbstractCoroutine.class.isAssignableFrom(type) + && "kotlinx.coroutines.TimeoutCoroutine".equals(type.getName()))); + + /** Adds a fresh Datadog element, replacing any inherited element in place. */ public static CoroutineContext addDatadogElement(CoroutineContext coroutineContext) { - if (coroutineContext.get(DATADOG_KEY) != null) { - return coroutineContext; // already added + DatadogThreadContextElement existing = coroutineContext.get(DATADOG_KEY); + if (existing == null) { + return coroutineContext.plus(new DatadogThreadContextElement(null)); } - return coroutineContext.plus(new DatadogThreadContextElement()); + DatadogThreadContextElement fresh = + new DatadogThreadContextElement(existing.localRootFor(coroutineContext.get(Job.Key))); + // keep the element's position, so elements added after it can still update scopes on top + return coroutineContext.fold(EmptyCoroutineContext.INSTANCE, fresh); + } + + /** Rebuilds the context using this replacement element, avoiding a capturing fold lambda. */ + @Override + public CoroutineContext invoke(CoroutineContext rebuilt, CoroutineContext.Element element) { + return rebuilt.plus(element.getKey() == DATADOG_KEY ? this : element); } - private Context context; + @Nullable private AgentSpan parentLocalRootSpan; + private volatile Context context; private volatile ContextContinuation continuation; + /** The owning Job, null before initialization, or COMPLETED after releasing the owner. */ + @Nullable private volatile Object owner; + + /** The local root of the trace kept open by this coroutine or its parent. */ + @Nullable private volatile AgentSpan localRootSpan; + + private DatadogThreadContextElement(@Nullable AgentSpan parentLocalRootSpan) { + this.parentLocalRootSpan = parentLocalRootSpan; + } + + /** Returns the local root kept open for structured children launched with this job. */ + @Nullable + private AgentSpan localRootFor(@Nullable Job job) { + AgentSpan rootSpan = localRootSpan; + // structured children complete before their parent, which keeps its trace open until then + return rootSpan != null && job != null && (job == owner || isScopedBy(job)) ? rootSpan : null; + } + + /** Scoped coroutines share their caller's element and complete before the caller does. */ + private boolean isScopedBy(Job job) { + return SCOPED_COROUTINE.get(job.getClass()) + && ((AbstractCoroutine) job).getContext().get(DATADOG_KEY) == this; + } + @Nonnull @Override public Key getKey() { @@ -38,18 +92,59 @@ public Key getKey() { 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 - datadog.context = Context.current(); - // stop enclosing trace from finishing early - datadog.continuation = datadog.context.capture(); + if (datadog != null) { + if (datadog.owner == null) { + // scoped coroutines built later share this element, but aren't its owner + datadog.owner = coroutine; + } + if (datadog.context == null) { + datadog.captureInitialContext(); + } else if (datadog.owner != coroutine && datadog.isScopedBy(coroutine)) { + // preserve active span changes when a scoped coroutine reinstalls this element + datadog.context = Context.current(); + } + } + } + + private synchronized void captureInitialContext() { + if (context == null) { + Context initial = Context.current(); + // this coroutine isn't running yet, so its context can't change under us + AgentSpan rootSpan = localRootOf(initial); + if (rootSpan != null) { + if (rootSpan == parentLocalRootSpan) { + // the parent keeps this trace open until after this child completes + localRootSpan = rootSpan; + } else { + // stop enclosing trace from finishing early + ContextContinuation captured = initial.capture(); + continuation = captured; + if (captured.context() != Context.root()) { + // only when the capture was accepted, e.g. async propagation is enabled + localRootSpan = rootSpan; + } + } + } + context = initial; + parentLocalRootSpan = null; } } + @Nullable + private static AgentSpan localRootOf(Context context) { + AgentSpan span = AgentSpan.fromContext(context); + return span != null ? span.getLocalRootSpan() : null; + } + public static void cancelDatadogContext(@Nonnull AbstractCoroutine coroutine) { DatadogThreadContextElement datadog = coroutine.getContext().get(DATADOG_KEY); - ContextContinuation continuation = - datadog == null ? null : CONTINUATION.getAndSet(datadog, null); + if (datadog == null || datadog.owner != coroutine) { + // scoped coroutines share their caller's element, but must not release its trace hold + return; + } + datadog.owner = COMPLETED; + datadog.localRootSpan = null; + ContextContinuation continuation = CONTINUATION.getAndSet(datadog, null); if (continuation != null) { // release enclosing trace now the coroutine has completed continuation.release(); @@ -58,13 +153,16 @@ public static void cancelDatadogContext(@Nonnull AbstractCoroutine coroutine) @Override public Context updateThreadContext(@Nonnull CoroutineContext coroutineContext) { - if (context == null) { - // record context to use for this coroutine - context = Context.current(); - // stop enclosing trace from finishing early - continuation = context.capture(); + Context current = context; + if (current == null) { + if (owner == null) { + // an already-cancelled coroutine can skip constructor capture but still install context + owner = coroutineContext.get(Job.Key); + } + captureInitialContext(); + current = context; } - return context.swap(); + return current.swap(); } @Override diff --git a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/test/java/datadog/trace/instrumentation/kotlin/coroutines/DatadogThreadContextElementTest.java b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/test/java/datadog/trace/instrumentation/kotlin/coroutines/DatadogThreadContextElementTest.java new file mode 100644 index 00000000000..e45a22d4b23 --- /dev/null +++ b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/test/java/datadog/trace/instrumentation/kotlin/coroutines/DatadogThreadContextElementTest.java @@ -0,0 +1,3 @@ +package datadog.trace.instrumentation.kotlin.coroutines; + +class DatadogThreadContextElementTest extends AbstractDatadogThreadContextElementTest {} diff --git a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/test/kotlin/KotlinCoroutineTests.kt b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/test/kotlin/KotlinCoroutineTests.kt index 8ba909ae74d..a04bd04c99f 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/test/kotlin/KotlinCoroutineTests.kt +++ b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/test/kotlin/KotlinCoroutineTests.kt @@ -32,6 +32,18 @@ class KotlinCoroutineTests(dispatcher: CoroutineDispatcher) : CoreKotlinCoroutin 7 } + @Trace + override fun structuredChildrenOutliveSeedSpan(): Int = super.structuredChildrenOutliveSeedSpan() + + @Trace + override fun structuredChildrenOfScopedCoroutines(suspendScope: Boolean): Int = super.structuredChildrenOfScopedCoroutines(suspendScope) + + @Trace + override fun childWithReplacedJob(supervisor: Boolean): Int = super.childWithReplacedJob(supervisor) + + @Trace + override fun structuredChildOfCancelledCoroutine(): Int = super.structuredChildOfCancelledCoroutine() + @Trace override fun tracePreventedByCancellation(): Int = super.tracePreventedByCancellation() diff --git a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/testFixtures/groovy/datadog/trace/instrumentation/kotlin/coroutines/AbstractKotlinCoroutineInstrumentationTest.groovy b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/testFixtures/groovy/datadog/trace/instrumentation/kotlin/coroutines/AbstractKotlinCoroutineInstrumentationTest.groovy index 4298933db84..0e24eb97c0b 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/testFixtures/groovy/datadog/trace/instrumentation/kotlin/coroutines/AbstractKotlinCoroutineInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/testFixtures/groovy/datadog/trace/instrumentation/kotlin/coroutines/AbstractKotlinCoroutineInstrumentationTest.groovy @@ -1,7 +1,11 @@ package datadog.trace.instrumentation.kotlin.coroutines +import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace + +import datadog.trace.api.InstrumenterConfig import datadog.trace.agent.test.InstrumentationSpecification import datadog.trace.core.DDSpan +import datadog.trace.test.util.Flaky import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ThreadPoolDispatcherKt @@ -11,6 +15,19 @@ abstract class AbstractKotlinCoroutineInstrumentationTest trace = TEST_WRITER.get(0) + + expect: + TEST_WRITER.size() == 1 + trace.size() == expectedNumberOfSpans + findSpan(trace, "child").spanContext().getParentId() == findSpan(trace, "seed").spanContext().getSpanId() + findSpan(trace, "grandchild").spanContext().getParentId() == findSpan(trace, "child").spanContext().getSpanId() + + where: + [dispatcherName, dispatcher] << dispatchersToTest + } + + def "child launched after a scoped coroutine keeps the trace open scoped=#scoped #dispatcherName"() { + setup: + CoreKotlinCoroutineTests kotlinTest = getCoreKotlinCoroutineTestsInstance(dispatcher) + int expectedNumberOfSpans = kotlinTest.structuredChildAfterScopedCoroutine(scoped) + kotlinTest.finishDetached() + TEST_WRITER.waitForTraces(1) + List trace = TEST_WRITER.get(0) + + expect: + TEST_WRITER.size() == 1 + trace.size() == expectedNumberOfSpans + findSpan(trace, "child").spanContext().getParentId() == findSpan(trace, "seed").spanContext().getSpanId() + findSpan(trace, "seed").spanContext().getParentId() == findSpan(trace, "root").spanContext().getSpanId() + + where: + [dispatcherName, dispatcher, scoped] << dispatchersToTest.collectMany { dispatcher -> + ["none", "withContext", "coroutineScope", "withTimeout"].collect { dispatcher + it } + } + } + + def "children of scoped coroutines keep the trace open #dispatcherName (suspendScope=#suspendScope)"() { + setup: + CoreKotlinCoroutineTests kotlinTest = getCoreKotlinCoroutineTestsInstance(dispatcher) + int expectedNumberOfSpans = kotlinTest.structuredChildrenOfScopedCoroutines(suspendScope) + kotlinTest.finishDetached() + TEST_WRITER.waitForTraces(1) + List trace = TEST_WRITER.get(0) + + expect: + TEST_WRITER.size() == 1 + trace.size() == expectedNumberOfSpans + findSpan(trace, "scope-child").spanContext().getParentId() == findSpan(trace, "seed").spanContext().getSpanId() + findSpan(trace, "context-child").spanContext().getParentId() == findSpan(trace, "seed").spanContext().getSpanId() + + where: + [dispatcherName, dispatcher, suspendScope] << dispatchersToTest.collectMany { dispatcher -> + [false, true].collect { dispatcher + it } + } + } + + def "structured child keeps the trace open when its parent started without one #dispatcherName"() { + setup: + CoreKotlinCoroutineTests kotlinTest = getCoreKotlinCoroutineTestsInstance(dispatcher) + int expectedNumberOfSpans = kotlinTest.structuredChildOfUntracedCoroutine() + kotlinTest.finishDetached() + TEST_WRITER.waitForTraces(1) + List trace = TEST_WRITER.get(0) + + expect: + TEST_WRITER.size() == 1 + trace.size() == expectedNumberOfSpans + findSpan(trace, "child").spanContext().getParentId() == findSpan(trace, "root").spanContext().getSpanId() + where: + [dispatcherName, dispatcher] << dispatchersToTest + } + + def "child with a replaced job keeps the trace open supervisor=#supervisor #dispatcherName"() { + setup: + CoreKotlinCoroutineTests kotlinTest = getCoreKotlinCoroutineTestsInstance(dispatcher) + int expectedNumberOfSpans = kotlinTest.childWithReplacedJob(supervisor) + kotlinTest.finishDetached() + TEST_WRITER.waitForTraces(1) + List trace = TEST_WRITER.get(0) + + expect: + TEST_WRITER.size() == 1 + trace.size() == expectedNumberOfSpans + findSpan(trace, "child").spanContext().getParentId() == findSpan(trace, "trace.annotation").spanContext().getSpanId() + + where: + [dispatcherName, dispatcher, supervisor] << dispatchersToTest.collectMany { [it + false, it + true] } + } + + def "cancelled coroutine keeps the trace open for its structured child #dispatcherName"() { + setup: + CoreKotlinCoroutineTests kotlinTest = getCoreKotlinCoroutineTestsInstance(dispatcher) + int expectedNumberOfSpans = kotlinTest.structuredChildOfCancelledCoroutine() + kotlinTest.cancelDetached() + TEST_WRITER.waitForTraces(1) + List trace = TEST_WRITER.get(0) + + expect: + TEST_WRITER.size() == 1 + trace.size() == expectedNumberOfSpans + findSpan(trace, "cleanup").spanContext().getParentId() == findSpan(trace, "trace.annotation").spanContext().getSpanId() + + where: + [dispatcherName, dispatcher] << dispatchersToTest + } + protected static DDSpan findSpan(List trace, String opName) { for (DDSpan span : trace) { if (span.getOperationName() == opName) { diff --git a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/testFixtures/java/datadog/trace/instrumentation/kotlin/coroutines/AbstractDatadogThreadContextElementTest.java b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/testFixtures/java/datadog/trace/instrumentation/kotlin/coroutines/AbstractDatadogThreadContextElementTest.java new file mode 100644 index 00000000000..0664a648a0b --- /dev/null +++ b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/testFixtures/java/datadog/trace/instrumentation/kotlin/coroutines/AbstractDatadogThreadContextElementTest.java @@ -0,0 +1,212 @@ +package datadog.trace.instrumentation.kotlin.coroutines; + +import static datadog.trace.instrumentation.kotlin.coroutines.DatadogThreadContextElement.addDatadogElement; +import static datadog.trace.instrumentation.kotlin.coroutines.DatadogThreadContextElement.cancelDatadogContext; +import static datadog.trace.instrumentation.kotlin.coroutines.DatadogThreadContextElement.captureDatadogContext; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertSame; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import kotlin.Unit; +import kotlin.coroutines.AbstractCoroutineContextElement; +import kotlin.coroutines.Continuation; +import kotlin.coroutines.ContinuationInterceptor; +import kotlin.coroutines.CoroutineContext; +import kotlin.coroutines.EmptyCoroutineContext; +import kotlin.jvm.functions.Function2; +import kotlinx.coroutines.ThreadContextElement; +import kotlinx.coroutines.internal.ScopeCoroutine; +import org.junit.jupiter.api.Test; +import org.tabletest.junit.TableTest; + +/** Context replacement checks shared by the oldest and latest dependency suites. */ +public abstract class AbstractDatadogThreadContextElementTest { + @Test + void completionReleasesOwnerWithoutAllowingAnotherCoroutineToClaimElement() throws Exception { + DatadogThreadContextElement element = + (DatadogThreadContextElement) addDatadogElement(EmptyCoroutineContext.INSTANCE); + Continuation completion = + new Continuation() { + @Override + public CoroutineContext getContext() { + return EmptyCoroutineContext.INSTANCE; + } + + @Override + public void resumeWith(Object result) {} + }; + ScopeCoroutine owner = new ScopeCoroutine<>(element, completion); + captureDatadogContext(owner); + Field ownerField = DatadogThreadContextElement.class.getDeclaredField("owner"); + ownerField.setAccessible(true); + assertSame(owner, ownerField.get(element)); + + ScopeCoroutine scoped = new ScopeCoroutine<>(owner.getContext(), completion); + captureDatadogContext(scoped); + scoped.resumeWith(Unit.INSTANCE); + cancelDatadogContext(scoped); + assertSame(owner, ownerField.get(element), "Scoped completion must preserve the owner"); + + owner.resumeWith(Unit.INSTANCE); + cancelDatadogContext(owner); + Object completed = ownerField.get(element); + assertNotNull(completed, "Completed elements must remain distinct from uninitialized elements"); + assertNotSame(owner, completed, "Completed elements must release the owning coroutine"); + + ScopeCoroutine later = new ScopeCoroutine<>(element, completion); + captureDatadogContext(later); + later.resumeWith(Unit.INSTANCE); + cancelDatadogContext(later); + assertSame( + completed, ownerField.get(element), "Completed elements must not acquire a new owner"); + } + + @TableTest({ + "Scenario | Ordinary before | Ordinary after | Hooks before | Hooks after | Dispatcher | Custom view", + "Singleton | 0 | 0 | 0 | 0 | false | false ", + "Ordinary middle | 2 | 2 | 0 | 0 | true | false ", + "Later hook | 1 | 1 | 0 | 1 | true | false ", + "Hooks either side | 1 | 1 | 2 | 2 | false | false ", + "Custom later hook | 2 | 2 | 1 | 1 | true | true " + }) + void replacementPreservesContentsAndCallbackOrder( + int ordinaryBefore, + int ordinaryAfter, + int hooksBefore, + int hooksAfter, + boolean dispatcher, + boolean customView) { + DatadogThreadContextElement original = + (DatadogThreadContextElement) addDatadogElement(EmptyCoroutineContext.INSTANCE); + CoroutineContext input = EmptyCoroutineContext.INSTANCE; + for (int i = 0; i < ordinaryBefore; i++) { + input = input.plus(new Element()); + } + for (int i = 0; i < hooksBefore; i++) { + input = input.plus(new Hook()); + } + input = input.plus(original); + for (int i = 0; i < ordinaryAfter; i++) { + input = input.plus(new Element()); + } + for (int i = 0; i < hooksAfter; i++) { + input = input.plus(new Hook()); + } + if (dispatcher) { + input = input.plus(new Interceptor()); + } + if (customView) { + input = new ContextView(input); + } + assertReplacement(input, original); + } + + @Test + void contextWithoutDatadogElementRetainsItsContents() { + Element ordinary = new Element(); + Hook hook = new Hook(); + CoroutineContext input = ordinary.plus(hook); + CoroutineContext output = addDatadogElement(input); + assertSame(ordinary, lookup(output, ordinary)); + assertSame(hook, lookup(output, hook)); + assertEquals(3, keys(output).size()); + assertEquals(ordinary.getKey(), keys(output).get(0)); + assertEquals(hook.getKey(), keys(output).get(1)); + } + + private static void assertReplacement( + CoroutineContext input, DatadogThreadContextElement original) { + CoroutineContext output = addDatadogElement(input); + assertSame(original, lookup(input, original)); + assertNotSame(original, lookup(output, original)); + assertEquals(keys(input), keys(output)); + input.fold( + output, + (rebuilt, element) -> { + if (element != original) { + assertSame(element, lookup(rebuilt, element)); + } + return rebuilt; + }); + } + + @SuppressWarnings("unchecked") + private static CoroutineContext.Element lookup( + CoroutineContext context, CoroutineContext.Element element) { + return context.get((CoroutineContext.Key) element.getKey()); + } + + private static List> keys(CoroutineContext context) { + return context.fold( + new ArrayList>(), + (keys, element) -> { + keys.add(element.getKey()); + return keys; + }); + } + + private static class Element extends AbstractCoroutineContextElement { + Element() { + super(new CoroutineContext.Key() {}); + } + } + + private static final class Hook extends Element implements ThreadContextElement { + @Override + public Object updateThreadContext(CoroutineContext context) { + return null; + } + + @Override + public void restoreThreadContext(CoroutineContext context, Object state) {} + } + + private static final class Interceptor extends AbstractCoroutineContextElement + implements ContinuationInterceptor { + Interceptor() { + super(ContinuationInterceptor.Key); + } + + @SuppressWarnings("unchecked") + @Override + public Continuation interceptContinuation(Continuation continuation) { + return (Continuation) continuation; + } + + @Override + public void releaseInterceptedContinuation(Continuation continuation) {} + } + + private static final class ContextView implements CoroutineContext { + private final CoroutineContext delegate; + + ContextView(CoroutineContext delegate) { + this.delegate = delegate; + } + + @Override + public E get(CoroutineContext.Key key) { + return delegate.get(key); + } + + @Override + public R fold( + R initial, Function2 operation) { + return delegate.fold(initial, operation); + } + + @Override + public CoroutineContext minusKey(CoroutineContext.Key key) { + return delegate.minusKey(key); + } + + @Override + public CoroutineContext plus(CoroutineContext other) { + return CoroutineContext.DefaultImpls.plus(this, other); + } + } +} diff --git a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/testFixtures/kotlin/datadog/trace/instrumentation/kotlin/coroutines/CoreKotlinCoroutineTests.kt b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/testFixtures/kotlin/datadog/trace/instrumentation/kotlin/coroutines/CoreKotlinCoroutineTests.kt index 4e6e4fcda64..b4d36e2122c 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/testFixtures/kotlin/datadog/trace/instrumentation/kotlin/coroutines/CoreKotlinCoroutineTests.kt +++ b/dd-java-agent/instrumentation/kotlin-coroutines-1.3/src/testFixtures/kotlin/datadog/trace/instrumentation/kotlin/coroutines/CoreKotlinCoroutineTests.kt @@ -11,6 +11,9 @@ import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Deferred +import kotlinx.coroutines.Job +import kotlinx.coroutines.NonCancellable +import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.cancelAndJoin @@ -21,14 +24,36 @@ import kotlinx.coroutines.runBlocking import kotlinx.coroutines.selects.select import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.withContext import kotlinx.coroutines.withTimeout import kotlinx.coroutines.yield import java.util.concurrent.CancellationException import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicInteger +import kotlin.coroutines.CoroutineContext abstract class CoreKotlinCoroutineTests(private val dispatcher: CoroutineDispatcher) { + fun launchWithCancelledParent() { + val queuedDispatcher = object : CoroutineDispatcher() { + var pending: Runnable? = null + + override fun dispatch(context: CoroutineContext, block: Runnable) { + check(pending == null) { "Unexpected second dispatch" } + pending = block + } + } + val parent = Job() + parent.cancel() + + val child = CoroutineScope(parent + queuedDispatcher).launch { + error("A child of an already-cancelled parent must not execute") + } + + checkNotNull(queuedDispatcher.pending) { "Cancellation was not dispatched" }.run() + check(child.isCompleted && child.isCancelled) { "Child did not complete cancellation" } + } + @Trace open fun tracePreventedByCancellation(): Int { kotlin.runCatching { @@ -387,4 +412,157 @@ abstract class CoreKotlinCoroutineTests(private val dispatcher: CoroutineDispatc setAsyncPropagationEnabled(asyncPropagation) return runBlocking(jobName("test") + dispatcher, block = block) } + + // The following tests start a detached coroutine that outlives the method's root span. Its + // children wait on a gate that is only released by finishDetached(), after the root span has + // finished, so only coroutine continuations can keep the trace open until the children finish. + + private val gate = CompletableDeferred() + private var detached: Job? = null + + /** Releases the children of the detached coroutine and waits for it to complete. */ + fun finishDetached() { + gate.complete(Unit) + runBlocking { detached?.join() } + } + + /** Cancels the detached coroutine and waits for it to complete. */ + fun cancelDetached() { + detached?.cancel() + runBlocking { detached?.join() } + } + + /** Children launched with their parent's context, from a span the parent finishes early. */ + @Trace + open fun structuredChildrenOutliveSeedSpan(): Int { + runTest { + detached = launch(Job() + jobName("detached")) { + childSpan("seed").activateAndUse { + launch(coroutineContext + jobName("child")) { + gate.await() + childSpan("child").activateAndUse { + launch(coroutineContext + jobName("grandchild")) { + childSpan("grandchild").finish() + } + } + } + } + } + } + return 4 + } + + /** A structured child launched after a scoped coroutine has completed in its parent. */ + open fun structuredChildAfterScopedCoroutine(scoped: String): Int { + runTest { + childSpan("root").activateAndUse { + val seedFinished = CompletableDeferred() + detached = launch(Job() + jobName("detached")) { + childSpan("seed").activateAndUse { + when (scoped) { + "none" -> Unit + "withContext" -> withContext(jobName("scoped")) {} + "coroutineScope" -> coroutineScope {} + "withTimeout" -> withTimeout(30_000) {} + else -> error("Unknown scoped coroutine: $scoped") + } + launch(coroutineContext + jobName("child")) { + gate.await() + childSpan("child").finish() + } + } + seedFinished.complete(Unit) + } + // Finish both spans before opening the child's gate, regardless of dispatcher timing. + seedFinished.await() + } + } + return 3 + } + + /** Children launched with the context of scoped coroutines inside their parent. */ + @Trace + open fun structuredChildrenOfScopedCoroutines(suspendScope: Boolean): Int { + if (!suspendScope) gate.complete(Unit) + runTest { + detached = launch(Job() + jobName("detached"), start = CoroutineStart.UNDISPATCHED) { + childSpan("seed").activateAndUse { + // Enter the child inline so the closed gate always suspends this scope. + coroutineScope { + launch(coroutineContext + jobName("scope-child"), start = CoroutineStart.UNDISPATCHED) { + gate.await() + childSpan("scope-child").finish() + } + } + withContext(jobName("with-context")) { + launch(coroutineContext + jobName("context-child")) { + gate.await() + childSpan("context-child").finish() + } + } + } + } + } + return 4 + } + + /** A child launched with its parent's context, when the parent started without a trace. */ + open fun structuredChildOfUntracedCoroutine(): Int { + runTest { + detached = launch(Job() + jobName("detached")) { + childSpan("root").activateAndUse { + val started = CompletableDeferred() + launch(coroutineContext + jobName("child")) { + started.complete(Unit) + gate.await() + childSpan("child").finish() + } + // the child's first dispatch can keep the trace open, so finish the root after it + started.await() + } + } + } + return 2 + } + + /** A child launched with its parent's context but a different job, so not a structured child. */ + @Trace + open fun childWithReplacedJob(supervisor: Boolean): Int { + runTest { + val job = if (supervisor) SupervisorJob() else Job() + val started = CompletableDeferred() + detached = launch(coroutineContext + job + jobName("detached")) { + started.complete(Unit) + gate.await() + childSpan("child").finish() + } + // the child's first dispatch can keep the trace open, so finish the root after it + started.await() + } + return 2 + } + + /** A structured child that only adds its span while its cancelled parent waits for it. */ + @Trace + open fun structuredChildOfCancelledCoroutine(): Int { + runTest { + val started = CompletableDeferred() + detached = launch(Job() + jobName("detached")) { + launch(coroutineContext + jobName("child")) { + try { + started.complete(Unit) + CompletableDeferred().await() + } finally { + withContext(NonCancellable) { + delay(50) + childSpan("cleanup").finish() + } + } + } + } + // a child cancelled before it starts never runs its finally block + started.await() + } + return 2 + } }