diff --git a/dd-java-agent/agent-ci-visibility/build.gradle b/dd-java-agent/agent-ci-visibility/build.gradle index ada61134053..1bc3f0a0e0c 100644 --- a/dd-java-agent/agent-ci-visibility/build.gradle +++ b/dd-java-agent/agent-ci-visibility/build.gradle @@ -24,7 +24,6 @@ buildscript { plugins { id 'com.gradleup.shadow' - id 'java-test-fixtures' } apply from: "$rootDir/gradle/java.gradle" @@ -39,8 +38,8 @@ dependencies { api libs.slf4j implementation libs.bundles.asm - implementation group: 'org.jacoco', name: 'org.jacoco.core', version: '0.8.12' - implementation group: 'org.jacoco', name: 'org.jacoco.report', version: '0.8.12' + implementation group: 'org.jacoco', name: 'org.jacoco.core', version: '0.8.13' + implementation group: 'org.jacoco', name: 'org.jacoco.report', version: '0.8.13' implementation project(':communication') implementation project(':components:json') @@ -48,19 +47,14 @@ dependencies { implementation project(':internal-api:internal-api-9') testImplementation project(":utils:test-utils") + testImplementation project(':dd-java-agent:testing') testImplementation("com.google.jimfs:jimfs:1.1") // an in-memory file system for testing code that works with files testImplementation libs.scala testImplementation libs.kotlin - testFixturesApi project(':dd-java-agent:testing') - testFixturesApi project(':utils:test-utils') - - testFixturesApi group: 'org.skyscreamer', name: 'jsonassert', version: '1.5.1' - testFixturesApi group: 'org.freemarker', name: 'freemarker', version: '2.3.31' - testFixturesApi group: 'com.jayway.jsonpath', name: 'json-path', version: '2.8.0' - testFixturesApi group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.16.0' - testFixturesApi group: 'org.msgpack', name: 'jackson-dataformat-msgpack', version: '0.9.6' + testImplementation group: 'org.skyscreamer', name: 'jsonassert', version: '1.5.1' + testImplementation group: 'org.freemarker', name: 'freemarker', version: '2.3.31' testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.9.2") // Required to update dependency lock files } diff --git a/dd-java-agent/agent-ci-visibility/civisibility-testing/build.gradle b/dd-java-agent/agent-ci-visibility/civisibility-testing/build.gradle new file mode 100644 index 00000000000..fda1081ef61 --- /dev/null +++ b/dd-java-agent/agent-ci-visibility/civisibility-testing/build.gradle @@ -0,0 +1,15 @@ +apply from: "$rootDir/gradle/java.gradle" +apply from: "$rootDir/gradle/version.gradle" + +dependencies { + api project(':dd-java-agent:agent-ci-visibility') + api project(':dd-java-agent:instrumentation-testing') + api project(':utils:test-utils') + + api group: 'org.skyscreamer', name: 'jsonassert', version: '1.5.1' + api group: 'org.freemarker', name: 'freemarker', version: '2.3.31' + api group: 'com.jayway.jsonpath', name: 'json-path', version: '2.8.0' + api group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.16.0' + api group: 'org.msgpack', name: 'jackson-dataformat-msgpack', version: '0.9.6' +} + diff --git a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy b/dd-java-agent/agent-ci-visibility/civisibility-testing/src/main/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy similarity index 100% rename from dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy rename to dd-java-agent/agent-ci-visibility/civisibility-testing/src/main/groovy/datadog/trace/civisibility/CiVisibilityInstrumentationTest.groovy diff --git a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy b/dd-java-agent/agent-ci-visibility/civisibility-testing/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy similarity index 100% rename from dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy rename to dd-java-agent/agent-ci-visibility/civisibility-testing/src/main/groovy/datadog/trace/civisibility/CiVisibilitySmokeTest.groovy diff --git a/dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy b/dd-java-agent/agent-ci-visibility/civisibility-testing/src/main/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy similarity index 100% rename from dd-java-agent/agent-ci-visibility/src/testFixtures/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy rename to dd-java-agent/agent-ci-visibility/civisibility-testing/src/main/groovy/datadog/trace/civisibility/CiVisibilityTestUtils.groovy diff --git a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/config/ConfigurationApiImplTest.groovy b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/config/ConfigurationApiImplTest.groovy index c284fce0199..83a15117fcd 100644 --- a/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/config/ConfigurationApiImplTest.groovy +++ b/dd-java-agent/agent-ci-visibility/src/test/groovy/datadog/trace/civisibility/config/ConfigurationApiImplTest.groovy @@ -11,7 +11,11 @@ import datadog.trace.api.civisibility.config.TestFQN import datadog.trace.api.civisibility.config.TestIdentifier import datadog.trace.api.civisibility.config.TestMetadata import datadog.trace.api.civisibility.telemetry.CiVisibilityMetricCollector -import datadog.trace.civisibility.CiVisibilityTestUtils +import freemarker.core.Environment +import freemarker.core.InvalidReferenceException +import freemarker.template.Template +import freemarker.template.TemplateException +import freemarker.template.TemplateExceptionHandler import okhttp3.HttpUrl import okhttp3.OkHttpClient import org.apache.commons.io.IOUtils @@ -233,7 +237,7 @@ class ConfigurationApiImplTest extends Specification { httpServer { handlers { prefix(path) { - def expectedRequestBody = CiVisibilityTestUtils.getFreemarkerTemplate(requestTemplate, requestData) + def expectedRequestBody = getFreemarkerTemplate(requestTemplate, requestData) def response = response try { @@ -242,7 +246,7 @@ class ConfigurationApiImplTest extends Specification { response.status(400).send(error.getMessage().bytes) } - def responseBody = CiVisibilityTestUtils.getFreemarkerTemplate(responseTemplate, responseData).bytes + def responseBody = getFreemarkerTemplate(responseTemplate, responseData).bytes def header = request.getHeader("Accept-Encoding") def gzipSupported = header != null && header.contains("gzip") if (gzipSupported) { @@ -315,4 +319,37 @@ class ConfigurationApiImplTest extends Specification { } return bitSet } + + static final TemplateExceptionHandler SUPPRESS_EXCEPTION_HANDLER = new TemplateExceptionHandler() { + @Override + void handleTemplateException(TemplateException e, Environment environment, Writer writer) throws TemplateException { + if (e instanceof InvalidReferenceException) { + writer.write('""') + } else { + throw e + } + } + } + + static final freemarker.template.Configuration FREEMARKER = new freemarker.template.Configuration(freemarker.template.Configuration.VERSION_2_3_30) { { + setClassLoaderForTemplateLoading(ConfigurationApiImplTest.classLoader, "") + setDefaultEncoding("UTF-8") + setTemplateExceptionHandler(SUPPRESS_EXCEPTION_HANDLER) + setLogTemplateExceptions(false) + setWrapUncheckedExceptions(true) + setFallbackOnNullLoopVariable(false) + setNumberFormat("0.######") + } + } + + static String getFreemarkerTemplate(String templatePath, Map replacements, List> replacementsSource = []) { + try { + Template coveragesTemplate = FREEMARKER.getTemplate(templatePath) + StringWriter coveragesOut = new StringWriter() + coveragesTemplate.process(replacements, coveragesOut) + return coveragesOut.toString() + } catch (Exception e) { + throw new RuntimeException("Could not get Freemarker template " + templatePath + "; replacements map: " + replacements + "; replacements source: " + replacementsSource, e) + } + } } diff --git a/dd-java-agent/agent-iast/build.gradle b/dd-java-agent/agent-iast/build.gradle index 7f2640deec2..9302a992948 100644 --- a/dd-java-agent/agent-iast/build.gradle +++ b/dd-java-agent/agent-iast/build.gradle @@ -3,7 +3,6 @@ import net.ltgt.gradle.errorprone.CheckSeverity plugins { id 'com.gradleup.shadow' id 'me.champeau.jmh' - id 'java-test-fixtures' id 'com.google.protobuf' version '0.8.18' id 'net.ltgt.errorprone' version '3.1.0' } @@ -52,8 +51,8 @@ dependencies { implementation libs.moshi implementation libs.bundles.asm - testFixturesApi project(':dd-java-agent:testing') - testFixturesApi project(':utils:test-utils') + testImplementation project(':utils:test-utils') + testImplementation project(':dd-java-agent:agent-bootstrap') testImplementation libs.bytebuddy testImplementation('org.skyscreamer:jsonassert:1.5.1') testImplementation libs.groovy.yaml diff --git a/dd-java-agent/agent-iast/iast-testing/build.gradle b/dd-java-agent/agent-iast/iast-testing/build.gradle new file mode 100644 index 00000000000..b64b897306f --- /dev/null +++ b/dd-java-agent/agent-iast/iast-testing/build.gradle @@ -0,0 +1,8 @@ +apply from: "$rootDir/gradle/java.gradle" +apply from: "$rootDir/gradle/version.gradle" + +dependencies { + api project(':dd-java-agent:agent-iast') + api project(':dd-java-agent:instrumentation-testing') + api project(':utils:test-utils') +} diff --git a/dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/IastAgentTestRunner.groovy b/dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/IastAgentTestRunner.groovy similarity index 100% rename from dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/IastAgentTestRunner.groovy rename to dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/IastAgentTestRunner.groovy diff --git a/dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/IastHttpServerTest.groovy b/dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/IastHttpServerTest.groovy similarity index 100% rename from dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/IastHttpServerTest.groovy rename to dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/IastHttpServerTest.groovy diff --git a/dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/IastRequestContextPreparationTrait.groovy b/dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/IastRequestContextPreparationTrait.groovy similarity index 94% rename from dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/IastRequestContextPreparationTrait.groovy rename to dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/IastRequestContextPreparationTrait.groovy index 86fedac3cf2..ba7e7d9a858 100644 --- a/dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/IastRequestContextPreparationTrait.groovy +++ b/dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/IastRequestContextPreparationTrait.groovy @@ -43,7 +43,7 @@ trait IastRequestContextPreparationTrait { } static void iastSystemCleanup() { - get().getSubscriptionService(RequestContextSlot.IAST).reset() + datadog.trace.bootstrap.instrumentation.api.AgentTracer.get().getSubscriptionService(RequestContextSlot.IAST).reset() InstrumentationBridge.clearIastModules() } @@ -75,8 +75,8 @@ trait IastRequestContextPreparationTrait { private static Logger withLogger(final String name) { final logger = LoggerFactory.getLogger(name) - if (logger instanceof ch.qos.logback.classic.Logger) { - ((ch.qos.logback.classic.Logger) logger).level = ch.qos.logback.classic.Level.DEBUG + if (logger instanceof Logger) { + ((Logger) logger).level = ch.qos.logback.classic.Level.DEBUG } return logger } diff --git a/dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/IastRequestTestRunner.groovy b/dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/IastRequestTestRunner.groovy similarity index 100% rename from dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/IastRequestTestRunner.groovy rename to dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/IastRequestTestRunner.groovy diff --git a/dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/IastSourcesTest.groovy b/dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/IastSourcesTest.groovy similarity index 97% rename from dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/IastSourcesTest.groovy rename to dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/IastSourcesTest.groovy index c9e8be7a8ff..b47f5732d9d 100644 --- a/dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/IastSourcesTest.groovy +++ b/dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/IastSourcesTest.groovy @@ -1,7 +1,6 @@ package com.datadog.iast.test import datadog.trace.api.iast.SourceTypes -import okhttp3.FormBody import okhttp3.MediaType import okhttp3.Request import okhttp3.RequestBody @@ -94,7 +93,7 @@ abstract class IastSourcesTest extends IastHttpServerTest { void 'test form source'() { when: final url = "${address}/iast/sources/form" - final body = new FormBody.Builder().add('name', 'value').build() + final body = new Request.Builder().add('name', 'value').build() final request = new Request.Builder().url(url).post(body).build() final response = client.newCall(request).execute() diff --git a/dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/NoopOverheadController.groovy b/dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/NoopOverheadController.groovy similarity index 100% rename from dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/NoopOverheadController.groovy rename to dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/NoopOverheadController.groovy diff --git a/dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/TaintMarkerHelpers.groovy b/dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/TaintMarkerHelpers.groovy similarity index 100% rename from dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/TaintMarkerHelpers.groovy rename to dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/TaintMarkerHelpers.groovy diff --git a/dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/TaintedObjectCollection.groovy b/dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/TaintedObjectCollection.groovy similarity index 93% rename from dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/TaintedObjectCollection.groovy rename to dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/TaintedObjectCollection.groovy index d7ac5b3351d..f742f595538 100644 --- a/dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/TaintedObjectCollection.groovy +++ b/dd-java-agent/agent-iast/iast-testing/src/main/groovy/com/datadog/iast/test/TaintedObjectCollection.groovy @@ -54,7 +54,7 @@ class TaintedObjectCollection { } else if (obj instanceof Pattern) { valueMatcher = Matchers.matchesPattern(obj) } else { - valueMatcher = equalTo(obj) + valueMatcher = org.hamcrest.Matchers.equalTo(obj) } } @@ -62,11 +62,11 @@ class TaintedObjectCollection { if (obj instanceof Matcher) { obj } else if (obj instanceof Pattern) { - matchesPattern(obj) + org.hamcrest.Matchers.matchesPattern(obj) } else if (obj == null) { - nullValue() + org.hamcrest.Matchers.nullValue() } else { - equalTo(obj) + org.hamcrest.Matchers.equalTo(obj) } } @@ -79,7 +79,7 @@ class TaintedObjectCollection { } void range(int start, int length, SourceMatcher source) { - ranges << new RangeMatcher(start, equalTo(length), source) + ranges << new RangeMatcher(start, org.hamcrest.Matchers.equalTo(length), source) } void range(int start, Matcher length, SourceMatcher source) { @@ -87,7 +87,7 @@ class TaintedObjectCollection { } void range(SourceMatcher source) { - ranges << new RangeMatcher(0, greaterThan(0), source) + ranges << new RangeMatcher(0, org.hamcrest.Matchers.greaterThan(0), source) } @Override diff --git a/dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/TaintedObjectsUtils.groovy b/dd-java-agent/agent-iast/src/test/groovy/com/datadog/iast/test/TaintedObjectsUtils.groovy similarity index 100% rename from dd-java-agent/agent-iast/src/testFixtures/groovy/com/datadog/iast/test/TaintedObjectsUtils.groovy rename to dd-java-agent/agent-iast/src/test/groovy/com/datadog/iast/test/TaintedObjectsUtils.groovy diff --git a/dd-java-agent/appsec/appsec-testing/build.gradle b/dd-java-agent/appsec/appsec-testing/build.gradle new file mode 100644 index 00000000000..03544fd1d37 --- /dev/null +++ b/dd-java-agent/appsec/appsec-testing/build.gradle @@ -0,0 +1,12 @@ +apply from: "$rootDir/gradle/java.gradle" +apply from: "$rootDir/gradle/version.gradle" + +dependencies { + api project(':dd-java-agent:appsec') + api project(':dd-java-agent:instrumentation-testing') + api project(':utils:test-utils') +} + +configurations.api { + exclude group: 'org.eclipse.jetty', module: 'jetty-server' +} diff --git a/dd-java-agent/appsec/src/testFixtures/groovy/com/datadog/appsec/AppSecHttpServerTest.groovy b/dd-java-agent/appsec/appsec-testing/src/main/groovy/com/datadog/appsec/AppSecHttpServerTest.groovy similarity index 100% rename from dd-java-agent/appsec/src/testFixtures/groovy/com/datadog/appsec/AppSecHttpServerTest.groovy rename to dd-java-agent/appsec/appsec-testing/src/main/groovy/com/datadog/appsec/AppSecHttpServerTest.groovy diff --git a/dd-java-agent/appsec/src/testFixtures/groovy/com/datadog/appsec/AppSecInactiveHttpServerTest.groovy b/dd-java-agent/appsec/appsec-testing/src/main/groovy/com/datadog/appsec/AppSecInactiveHttpServerTest.groovy similarity index 100% rename from dd-java-agent/appsec/src/testFixtures/groovy/com/datadog/appsec/AppSecInactiveHttpServerTest.groovy rename to dd-java-agent/appsec/appsec-testing/src/main/groovy/com/datadog/appsec/AppSecInactiveHttpServerTest.groovy diff --git a/dd-java-agent/appsec/build.gradle b/dd-java-agent/appsec/build.gradle index aca7f3f309c..6e53bc2c3ab 100644 --- a/dd-java-agent/appsec/build.gradle +++ b/dd-java-agent/appsec/build.gradle @@ -4,7 +4,6 @@ import groovy.json.JsonSlurper plugins { id 'com.gradleup.shadow' id 'me.champeau.jmh' - id 'java-test-fixtures' } apply from: "$rootDir/gradle/java.gradle" @@ -26,11 +25,7 @@ dependencies { testImplementation libs.logback.classic testImplementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.16.0' - testFixturesApi project(':dd-java-agent:testing') -} - -configurations.testFixturesApi { - exclude group: 'org.eclipse.jetty', module: 'jetty-server' + testImplementation project(':utils:test-utils') } shadowJar { diff --git a/dd-java-agent/instrumentation-testing/build.gradle b/dd-java-agent/instrumentation-testing/build.gradle new file mode 100644 index 00000000000..2eb8a03c42a --- /dev/null +++ b/dd-java-agent/instrumentation-testing/build.gradle @@ -0,0 +1,27 @@ +apply from: "$rootDir/gradle/java.gradle" + +dependencies { + api libs.bytebuddy + api libs.bytebuddyagent + api libs.slf4j + api libs.bundles.spock + api libs.bundles.test.logging + api libs.guava + + api project(':dd-java-agent:testing') + + implementation project(':dd-java-agent:agent-debugger') + + implementation 'org.junit.platform:junit-platform-runner:1.9.0' + + testImplementation project(':utils:test-utils') + testImplementation project(':dd-java-agent:instrumentation:trace-annotation') + + testImplementation group: 'cglib', name: 'cglib', version: '3.2.5' + // test instrumenting java 1.1 bytecode + testImplementation group: 'net.sf.jt400', name: 'jt400', version: '6.1' + + // We have autoservices defined in test subtree, looks like we need this to be able to properly rebuild this + testAnnotationProcessor libs.autoservice.processor + testCompileOnly libs.autoservice.annotation +} diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/AgentTestRunner.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/AgentTestRunner.groovy similarity index 99% rename from dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/AgentTestRunner.groovy rename to dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/AgentTestRunner.groovy index 8c70e25d876..b31772b485a 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/AgentTestRunner.groovy +++ b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/AgentTestRunner.groovy @@ -67,7 +67,7 @@ import net.bytebuddy.dynamic.DynamicType import net.bytebuddy.utility.JavaModule import okhttp3.HttpUrl import okhttp3.OkHttpClient -import org.junit.runner.RunWith +import org.junit.jupiter.api.extension.ExtendWith import org.slf4j.LoggerFactory import org.spockframework.mock.MockUtil import org.spockframework.mock.runtime.MockInvocation @@ -107,7 +107,7 @@ import static datadog.trace.util.AgentThreadFactory.AgentThread.TASK_SCHEDULER */ // CodeNarc incorrectly thinks ".class" is unnecessary in @RunWith @SuppressWarnings('UnnecessaryDotClass') -@RunWith(SpockRunner.class) +@ExtendWith(SpockExtension.class) abstract class AgentTestRunner extends DDSpecification implements AgentBuilder.Listener { private static final long TIMEOUT_MILLIS = TimeUnit.SECONDS.toMillis(20) diff --git a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/BootstrapClasspathSetup.java b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/BootstrapClasspathSetup.java new file mode 100644 index 00000000000..548fb07381c --- /dev/null +++ b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/BootstrapClasspathSetup.java @@ -0,0 +1,150 @@ +package datadog.trace.agent.test; + +import static com.google.common.base.StandardSystemProperty.JAVA_CLASS_PATH; +import static com.google.common.base.StandardSystemProperty.PATH_SEPARATOR; + +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableList; +import com.google.common.reflect.ClassPath; +import datadog.trace.agent.test.utils.ClasspathUtils; +import datadog.trace.bootstrap.BootstrapProxy; +import de.thetaphi.forbiddenapis.SuppressForbidden; +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.HashSet; +import java.util.Set; +import java.util.TreeSet; +import java.util.jar.JarFile; +import net.bytebuddy.agent.ByteBuddyAgent; +import org.junit.platform.launcher.LauncherSession; +import org.junit.platform.launcher.LauncherSessionListener; + +public class BootstrapClasspathSetup implements LauncherSessionListener { + + @Override + public void launcherSessionOpened(LauncherSession session) { + // this method is only needed to trigger this class' static initializer before JUnit does + // classpath scanning + } + + private static final String[] TEST_EXCLUDED_BOOTSTRAP_PACKAGE_PREFIXES = { + "ch.qos.logback.classic.servlet", // this draws javax.servlet deps that are not needed + }; + + private static final String[] TEST_BOOTSTRAP_PREFIXES = { + "datadog.slf4j", + "datadog.context", + "datadog.environment", + "datadog.json", + "datadog.yaml", + "datadog.appsec.api", + "datadog.trace.api", + "datadog.trace.bootstrap", + "datadog.trace.context", + "datadog.trace.instrumentation.api", + "datadog.trace.logging", + "datadog.trace.util", + "org.slf4j", + "ch.qos.logback", + }; + + public static final ClassPath TEST_CLASSPATH = computeTestClasspath(); + + static { + ByteBuddyAgent.install(); + setupBootstrapClasspath(); + } + + private static ClassPath computeTestClasspath() { + ClassLoader testClassLoader = AgentTestRunner.class.getClassLoader(); + if (!(testClassLoader instanceof URLClassLoader)) { + // java9's system loader does not extend URLClassLoader + // which breaks Guava ClassPath lookup + testClassLoader = buildJavaClassPathClassLoader(); + } + try { + return ClassPath.from(testClassLoader); + } catch (final IOException e) { + throw new RuntimeException(e); + } + } + + /** + * Parse JVM classpath and return ClassLoader containing all classpath entries. Inspired by Guava. + */ + @SuppressForbidden + private static ClassLoader buildJavaClassPathClassLoader() { + final ImmutableList.Builder urls = ImmutableList.builder(); + for (final String entry : Splitter.on(PATH_SEPARATOR.value()).split(JAVA_CLASS_PATH.value())) { + try { + try { + urls.add(new File(entry).toURI().toURL()); + } catch (final SecurityException e) { // File.toURI checks to see if the file is a directory + urls.add(new URL("file", null, new File(entry).getAbsolutePath())); + } + } catch (final MalformedURLException e) { + System.err.println( + String.format( + "Error injecting bootstrap jar: Malformed classpath entry: %s. %s", entry, e)); + } + } + return new URLClassLoader(urls.build().toArray(new URL[0]), null); + } + + private static void setupBootstrapClasspath() { + // Ensure there weren't any bootstrap classes loaded prematurely. + Set prematureBootstrapClasses = new TreeSet<>(); + for (Class clazz : ByteBuddyAgent.getInstrumentation().getAllLoadedClasses()) { + if (isBootstrapClass(clazz.getName()) + && clazz.getClassLoader() != null + && !clazz.getName().equals("datadog.trace.api.DisableTestTrace") + && !clazz.getName().startsWith("org.slf4j")) { + prematureBootstrapClasses.add(clazz.getName()); + } + } + if (!prematureBootstrapClasses.isEmpty()) { + throw new AssertionError( + prematureBootstrapClasses.size() + + " classes were loaded before bootstrap classpath was initialized: " + + prematureBootstrapClasses); + } + try { + final File bootstrapJar = createBootstrapJar(); + ByteBuddyAgent.getInstrumentation() + .appendToBootstrapClassLoaderSearch(new JarFile(bootstrapJar)); + BootstrapProxy.addBootstrapResource(bootstrapJar.toURI().toURL()); + } catch (final IOException e) { + throw new RuntimeException(e); + } + } + + private static File createBootstrapJar() throws IOException { + Set bootstrapClasses = new HashSet<>(); + for (ClassPath.ClassInfo info : TEST_CLASSPATH.getAllClasses()) { + if (isBootstrapClass(info.getName())) { + bootstrapClasses.add(info.getResourceName()); + } + } + URL jar = + ClasspathUtils.createJarWithClasses( + SpockExtension.class.getClassLoader(), bootstrapClasses.toArray(new String[0])); + return new File(jar.getFile()); + } + + public static boolean isBootstrapClass(final String name) { + for (String prefix : TEST_BOOTSTRAP_PREFIXES) { + if (name.startsWith(prefix)) { + for (String excluded : TEST_EXCLUDED_BOOTSTRAP_PACKAGE_PREFIXES) { + if (name.startsWith(excluded)) { + return false; + } + } + return true; + } + } + return false; + } +} diff --git a/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/SpockExtension.java b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/SpockExtension.java new file mode 100644 index 00000000000..b173cf53715 --- /dev/null +++ b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/SpockExtension.java @@ -0,0 +1,163 @@ +package datadog.trace.agent.test; + +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.List; +import net.bytebuddy.dynamic.ClassFileLocator; +import org.junit.jupiter.api.extension.AfterAllCallback; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.TestExecutionExceptionHandler; +import org.spockframework.mock.IMockInvocation; +import org.spockframework.mock.TooManyInvocationsError; + +public final class SpockExtension + implements BeforeAllCallback, + AfterAllCallback, + BeforeEachCallback, + AfterEachCallback, + TestExecutionExceptionHandler { + + private static final ExtensionContext.Namespace NAMESPACE = + ExtensionContext.Namespace.create("dd", "spock"); + + private static final String INSTRUMENTATION_CLASSLOADER = "instrumentation-class-loader"; + private static final String ORIGINAL_CLASSLOADER = "original-thread-context-class-loader"; + + @Override + public void beforeAll(ExtensionContext ctx) { + Class testClass = ctx.getRequiredTestClass(); + assertNoBootstrapClassesInTestClass(testClass); + + InstrumentationClassLoader custom = + new InstrumentationClassLoader(testClass.getClassLoader(), testClass.getName()); + ctx.getStore(NAMESPACE).put(INSTRUMENTATION_CLASSLOADER, custom); + } + + public static void assertNoBootstrapClassesInTestClass(final Class testClass) { + for (final Field field : testClass.getDeclaredFields()) { + assertNotBootstrapClass(testClass, field.getType()); + } + for (final Method method : testClass.getDeclaredMethods()) { + assertNotBootstrapClass(testClass, method.getReturnType()); + for (final Class paramType : method.getParameterTypes()) { + assertNotBootstrapClass(testClass, paramType); + } + } + } + + private static void assertNotBootstrapClass(final Class testClass, final Class clazz) { + if (!clazz.isPrimitive() && BootstrapClasspathSetup.isBootstrapClass(clazz.getName())) { + throw new IllegalStateException( + testClass.getName() + + ": Bootstrap classes are not allowed in test class field or method signatures. Offending class: " + + clazz.getName()); + } + } + + @Override + public void afterAll(ExtensionContext ctx) { + // nothing to clean‑up – garbage collector will take care of loader + } + + @Override + public void beforeEach(ExtensionContext ctx) { + ClassLoader instrumentationClassloader = + ctx.getStore(NAMESPACE).get(INSTRUMENTATION_CLASSLOADER, ClassLoader.class); + ctx.getStore(NAMESPACE) + .put(ORIGINAL_CLASSLOADER, Thread.currentThread().getContextClassLoader()); + Thread.currentThread().setContextClassLoader(instrumentationClassloader); + } + + @Override + public void afterEach(ExtensionContext ctx) { + ClassLoader prev = ctx.getStore(NAMESPACE).remove(ORIGINAL_CLASSLOADER, ClassLoader.class); + if (prev != null) { + Thread.currentThread().setContextClassLoader(prev); + } + } + + @Override + public void handleTestExecutionException(ExtensionContext ctx, Throwable ex) throws Throwable { + if (ex instanceof TooManyInvocationsError) { + fixTooManyInvocationsError((TooManyInvocationsError) ex); + throw ex; // re‑throw so JUnit still marks the test as failed. + } + throw ex; + } + + static void fixTooManyInvocationsError(final TooManyInvocationsError error) { + final List accepted = error.getAcceptedInvocations(); + for (final IMockInvocation invocation : accepted) { + try { + invocation.toString(); + } catch (final Throwable t) { + final List args = invocation.getArguments(); + for (int i = 0; i < args.size(); i++) { + final Object arg = args.get(i); + if (arg instanceof AssertionError) { + args.set( + i, + new AssertionError( + "'" + + arg.getClass().getName() + + "' hidden due to '" + + t.getClass().getName() + + "'", + t)); + } + } + } + } + } + + /** Run test classes in a classloader which loads test classes before delegating. */ + private static class InstrumentationClassLoader extends ClassLoader { + private final ClassLoader parent; + private final String shadowPrefix; + + InstrumentationClassLoader(ClassLoader parent, String shadowPrefix) { + super(parent); + this.parent = parent; + this.shadowPrefix = shadowPrefix; + } + + /** Forcefully inject the bytes of clazz into this classloader. */ + Class shadow(Class clazz) throws IOException { + Class loaded = findLoadedClass(clazz.getName()); + if (loaded != null && loaded.getClassLoader() == this) { + return loaded; + } + byte[] classBytes = + ClassFileLocator.ForClassLoader.of(clazz.getClassLoader()) + .locate(clazz.getName()) + .resolve(); + return defineClass(clazz.getName(), classBytes, 0, classBytes.length); + } + + @Override + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + synchronized (getClassLoadingLock(name)) { + Class c = findLoadedClass(name); + if (c != null) { + return c; + } + if (name.startsWith(shadowPrefix)) { + try { + Class shadowed = shadow(parent.loadClass(name)); + if (resolve) { + resolveClass(shadowed); + } + return shadowed; + } catch (Exception ignored) { + // fall‑back to parent below + } + } + return super.loadClass(name, resolve); + } + } + } +} diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/AbstractPromiseTest.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/base/AbstractPromiseTest.groovy similarity index 100% rename from dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/AbstractPromiseTest.groovy rename to dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/base/AbstractPromiseTest.groovy diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpClientTest.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/base/HttpClientTest.groovy similarity index 100% rename from dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpClientTest.groovy rename to dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/base/HttpClientTest.groovy diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy similarity index 100% rename from dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy rename to dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/base/HttpServerTest.groovy diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/WithHttpServer.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/base/WithHttpServer.groovy similarity index 97% rename from dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/WithHttpServer.groovy rename to dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/base/WithHttpServer.groovy index 235aa2a7933..7a687043ed7 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/base/WithHttpServer.groovy +++ b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/base/WithHttpServer.groovy @@ -83,7 +83,7 @@ abstract class WithHttpServer extends VersionedNamingTestBase { && throwable.message.startsWith("Illegal access: this web application instance has been stopped already. Could not load")) { println "Ignoring class load error at shutdown" } else { - super.onError(typeName, classLoader, module, loaded, throwable) + Object.onError(typeName, classLoader, module, loaded, throwable) } } diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/datastreams/MockFeaturesDiscovery.java b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/datastreams/MockFeaturesDiscovery.java similarity index 100% rename from dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/datastreams/MockFeaturesDiscovery.java rename to dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/datastreams/MockFeaturesDiscovery.java diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/datastreams/RecordingDatastreamsPayloadWriter.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/datastreams/RecordingDatastreamsPayloadWriter.groovy similarity index 100% rename from dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/datastreams/RecordingDatastreamsPayloadWriter.groovy rename to dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/datastreams/RecordingDatastreamsPayloadWriter.groovy diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/log/injection/LogContextInjectionTestBase.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/log/injection/LogContextInjectionTestBase.groovy similarity index 100% rename from dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/log/injection/LogContextInjectionTestBase.groovy rename to dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/log/injection/LogContextInjectionTestBase.groovy diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/naming/NamingConventions.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/naming/NamingConventions.groovy similarity index 100% rename from dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/naming/NamingConventions.groovy rename to dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/naming/NamingConventions.groovy diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/naming/VersionedNamingTest.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/naming/VersionedNamingTest.groovy similarity index 100% rename from dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/naming/VersionedNamingTest.groovy rename to dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/naming/VersionedNamingTest.groovy diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/naming/VersionedNamingTestBase.groovy b/dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/naming/VersionedNamingTestBase.groovy similarity index 100% rename from dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/naming/VersionedNamingTestBase.groovy rename to dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/naming/VersionedNamingTestBase.groovy diff --git a/dd-java-agent/instrumentation-testing/src/main/resources/META-INF/services/org.junit.platform.launcher.LauncherSessionListener b/dd-java-agent/instrumentation-testing/src/main/resources/META-INF/services/org.junit.platform.launcher.LauncherSessionListener new file mode 100644 index 00000000000..be692a1f82a --- /dev/null +++ b/dd-java-agent/instrumentation-testing/src/main/resources/META-INF/services/org.junit.platform.launcher.LauncherSessionListener @@ -0,0 +1 @@ +datadog.trace.agent.test.BootstrapClasspathSetup diff --git a/dd-java-agent/testing/src/test/groovy/AgentTestRunnerTest.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/AgentTestRunnerTest.groovy similarity index 95% rename from dd-java-agent/testing/src/test/groovy/AgentTestRunnerTest.groovy rename to dd-java-agent/instrumentation-testing/src/test/groovy/AgentTestRunnerTest.groovy index 50a09a2c8ab..491a033f253 100644 --- a/dd-java-agent/testing/src/test/groovy/AgentTestRunnerTest.groovy +++ b/dd-java-agent/instrumentation-testing/src/test/groovy/AgentTestRunnerTest.groovy @@ -1,7 +1,6 @@ import com.google.common.reflect.ClassPath import datadog.trace.agent.test.AgentTestRunner -import datadog.trace.agent.test.SpockRunner -import datadog.trace.agent.test.utils.ClasspathUtils +import datadog.trace.agent.test.BootstrapClasspathSetup import datadog.trace.api.GlobalTracer import datadog.trace.api.Platform import datadog.trace.bootstrap.Constants @@ -37,14 +36,14 @@ class AgentTestRunnerTest extends AgentTestRunner { def "spock runner bootstrap prefixes correct for test setup"() { expect: - SpockRunner.BOOTSTRAP_PACKAGE_PREFIXES_COPY == Constants.BOOTSTRAP_PACKAGE_PREFIXES + BootstrapClasspathSetup.BOOTSTRAP_PACKAGE_PREFIXES_COPY == Constants.BOOTSTRAP_PACKAGE_PREFIXES } def "classpath setup"() { setup: boolean jfrSupported = isJFRSupported() final List bootstrapClassesIncorrectlyLoaded = [] - for (ClassPath.ClassInfo info : ClasspathUtils.getTestClasspath().getAllClasses()) { + for (ClassPath.ClassInfo info : BootstrapClasspathSetup.TEST_CLASSPATH.getAllClasses()) { for (int i = 0; i < Constants.BOOTSTRAP_PACKAGE_PREFIXES.length; ++i) { if (info.getName().startsWith(Constants.BOOTSTRAP_PACKAGE_PREFIXES[i])) { if (!jfrSupported && info.name.startsWith("datadog.trace.bootstrap.instrumentation.jfr.")) { diff --git a/dd-java-agent/testing/src/test/groovy/ConfigResetTest.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/ConfigResetTest.groovy similarity index 100% rename from dd-java-agent/testing/src/test/groovy/ConfigResetTest.groovy rename to dd-java-agent/instrumentation-testing/src/test/groovy/ConfigResetTest.groovy diff --git a/dd-java-agent/testing/src/test/groovy/InstrumentOldBytecode.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/InstrumentOldBytecode.groovy similarity index 100% rename from dd-java-agent/testing/src/test/groovy/InstrumentOldBytecode.groovy rename to dd-java-agent/instrumentation-testing/src/test/groovy/InstrumentOldBytecode.groovy diff --git a/dd-java-agent/instrumentation-testing/src/test/groovy/TooManyInvocationsErrorListenerTest.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/TooManyInvocationsErrorListenerTest.groovy new file mode 100644 index 00000000000..9a2ff316ae6 --- /dev/null +++ b/dd-java-agent/instrumentation-testing/src/test/groovy/TooManyInvocationsErrorListenerTest.groovy @@ -0,0 +1,30 @@ +import datadog.trace.agent.test.AgentTestRunner +import datadog.trace.agent.test.SpockExtension +import org.spockframework.mock.* +import org.spockframework.mock.runtime.MockInvocation + +class TooManyInvocationsErrorListenerTest extends AgentTestRunner { + + @SuppressWarnings('GroovyAccessibility') + void 'test that listener modifies failure'() { + setup: + final error = new TooManyInvocationsError(Stub(IMockInteraction), []) + error.acceptedInvocations.add(new MockInvocation(Stub(IMockObject), + Stub(IMockMethod), + [error], + Stub(IResponseGenerator))) + + when: + error.getMessage() + + then: + thrown(StackOverflowError) + + when: + SpockExtension.fixTooManyInvocationsError(error) + error.getMessage() + + then: + noExceptionThrown() + } +} diff --git a/dd-java-agent/testing/src/test/groovy/TraceCorrelationTest.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/TraceCorrelationTest.groovy similarity index 100% rename from dd-java-agent/testing/src/test/groovy/TraceCorrelationTest.groovy rename to dd-java-agent/instrumentation-testing/src/test/groovy/TraceCorrelationTest.groovy diff --git a/dd-java-agent/testing/src/test/groovy/context/FieldInjectionForkedTest.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/context/FieldInjectionForkedTest.groovy similarity index 94% rename from dd-java-agent/testing/src/test/groovy/context/FieldInjectionForkedTest.groovy rename to dd-java-agent/instrumentation-testing/src/test/groovy/context/FieldInjectionForkedTest.groovy index 67f1841d794..0b647ee3ad5 100644 --- a/dd-java-agent/testing/src/test/groovy/context/FieldInjectionForkedTest.groovy +++ b/dd-java-agent/instrumentation-testing/src/test/groovy/context/FieldInjectionForkedTest.groovy @@ -39,7 +39,7 @@ class FieldInjectionForkedTest extends AgentTestRunner { "Aborting transform for class name = " + typeName + ", loader = " + classLoader) } - super.onDiscovery(typeName, classLoader, module, loaded) + Object.onDiscovery(typeName, classLoader, module, loaded) } def "#keyClassName structure modified = #shouldModifyStructure"() { @@ -72,12 +72,12 @@ class FieldInjectionForkedTest extends AgentTestRunner { where: keyClass | shouldModifyStructure | isInstrumented - KeyClass | true | true - UntransformableKeyClass | false | false - ValidSerializableKeyClass | true | true - InvalidSerializableKeyClass | true | true - ValidInheritsSerializableKeyClass | true | true - InvalidInheritsSerializableKeyClass | true | true + KeyClass | true | true + UntransformableKeyClass | false | false + ValidSerializableKeyClass | true | true + InvalidSerializableKeyClass | true | true + ValidInheritsSerializableKeyClass | true | true + InvalidInheritsSerializableKeyClass | true | true keyClassName = keyClass.getSimpleName() } diff --git a/dd-java-agent/testing/src/test/groovy/excludefilter/ExcludeFilterForkedTest.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/excludefilter/ExcludeFilterForkedTest.groovy similarity index 85% rename from dd-java-agent/testing/src/test/groovy/excludefilter/ExcludeFilterForkedTest.groovy rename to dd-java-agent/instrumentation-testing/src/test/groovy/excludefilter/ExcludeFilterForkedTest.groovy index 13b78fea5d6..01b9f58b8e9 100644 --- a/dd-java-agent/testing/src/test/groovy/excludefilter/ExcludeFilterForkedTest.groovy +++ b/dd-java-agent/instrumentation-testing/src/test/groovy/excludefilter/ExcludeFilterForkedTest.groovy @@ -41,13 +41,13 @@ class ExcludeFilterForkedTest extends AgentTestRunner { where: clazz | hasRunnable | hasExecutor | hasAccessor - ExcludedRunnable | false | false | false - NormalRunnable | true | false | true - RunnableExcludedExecutor | true | false | true - ExcludedExecutor | false | false | false - NormalExecutor | false | true | true - ExecutorExcludedRunnable | false | true | true - ExecutorRunnable | true | true | true + ExcludedRunnable | false | false | false + NormalRunnable | true | false | true + RunnableExcludedExecutor | true | false | true + ExcludedExecutor | false | false | false + NormalExecutor | false | true | true + ExecutorExcludedRunnable | false | true | true + ExecutorRunnable | true | true | true } static class InjectionCheck { diff --git a/dd-java-agent/testing/src/test/groovy/locator/ClassInjectingForkedTest.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/locator/ClassInjectingForkedTest.groovy similarity index 100% rename from dd-java-agent/testing/src/test/groovy/locator/ClassInjectingForkedTest.groovy rename to dd-java-agent/instrumentation-testing/src/test/groovy/locator/ClassInjectingForkedTest.groovy diff --git a/dd-java-agent/testing/src/test/groovy/locator/ClassInjectingLoadClassDisabledForkedTest.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/locator/ClassInjectingLoadClassDisabledForkedTest.groovy similarity index 100% rename from dd-java-agent/testing/src/test/groovy/locator/ClassInjectingLoadClassDisabledForkedTest.groovy rename to dd-java-agent/instrumentation-testing/src/test/groovy/locator/ClassInjectingLoadClassDisabledForkedTest.groovy diff --git a/dd-java-agent/testing/src/test/groovy/server/HttpProxyTest.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/server/HttpProxyTest.groovy similarity index 100% rename from dd-java-agent/testing/src/test/groovy/server/HttpProxyTest.groovy rename to dd-java-agent/instrumentation-testing/src/test/groovy/server/HttpProxyTest.groovy diff --git a/dd-java-agent/testing/src/test/groovy/server/HttpServerTest.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/server/HttpServerTest.groovy similarity index 100% rename from dd-java-agent/testing/src/test/groovy/server/HttpServerTest.groovy rename to dd-java-agent/instrumentation-testing/src/test/groovy/server/HttpServerTest.groovy diff --git a/dd-java-agent/testing/src/test/groovy/synthetic/SyntheticForkedTest.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/synthetic/SyntheticForkedTest.groovy similarity index 100% rename from dd-java-agent/testing/src/test/groovy/synthetic/SyntheticForkedTest.groovy rename to dd-java-agent/instrumentation-testing/src/test/groovy/synthetic/SyntheticForkedTest.groovy diff --git a/dd-java-agent/testing/src/test/groovy/utils/PortUtilsTest.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/utils/PortUtilsTest.groovy similarity index 100% rename from dd-java-agent/testing/src/test/groovy/utils/PortUtilsTest.groovy rename to dd-java-agent/instrumentation-testing/src/test/groovy/utils/PortUtilsTest.groovy diff --git a/dd-java-agent/testing/src/test/groovy/utils/ThreadUtilsTest.groovy b/dd-java-agent/instrumentation-testing/src/test/groovy/utils/ThreadUtilsTest.groovy similarity index 100% rename from dd-java-agent/testing/src/test/groovy/utils/ThreadUtilsTest.groovy rename to dd-java-agent/instrumentation-testing/src/test/groovy/utils/ThreadUtilsTest.groovy diff --git a/dd-java-agent/testing/src/test/java/IBMResourceLevelInstrumentation.java b/dd-java-agent/instrumentation-testing/src/test/java/IBMResourceLevelInstrumentation.java similarity index 100% rename from dd-java-agent/testing/src/test/java/IBMResourceLevelInstrumentation.java rename to dd-java-agent/instrumentation-testing/src/test/java/IBMResourceLevelInstrumentation.java diff --git a/dd-java-agent/testing/src/test/java/config/exclude/SomeClass.java b/dd-java-agent/instrumentation-testing/src/test/java/config/exclude/SomeClass.java similarity index 100% rename from dd-java-agent/testing/src/test/java/config/exclude/SomeClass.java rename to dd-java-agent/instrumentation-testing/src/test/java/config/exclude/SomeClass.java diff --git a/dd-java-agent/testing/src/test/java/config/exclude/packagename/SomeClass.java b/dd-java-agent/instrumentation-testing/src/test/java/config/exclude/packagename/SomeClass.java similarity index 100% rename from dd-java-agent/testing/src/test/java/config/exclude/packagename/SomeClass.java rename to dd-java-agent/instrumentation-testing/src/test/java/config/exclude/packagename/SomeClass.java diff --git a/dd-java-agent/testing/src/test/java/context/FieldInjectionTestInstrumentation.java b/dd-java-agent/instrumentation-testing/src/test/java/context/FieldInjectionTestInstrumentation.java similarity index 100% rename from dd-java-agent/testing/src/test/java/context/FieldInjectionTestInstrumentation.java rename to dd-java-agent/instrumentation-testing/src/test/java/context/FieldInjectionTestInstrumentation.java diff --git a/dd-java-agent/testing/src/test/java/excludefilter/ExcludeFilterTestInstrumentation.java b/dd-java-agent/instrumentation-testing/src/test/java/excludefilter/ExcludeFilterTestInstrumentation.java similarity index 100% rename from dd-java-agent/testing/src/test/java/excludefilter/ExcludeFilterTestInstrumentation.java rename to dd-java-agent/instrumentation-testing/src/test/java/excludefilter/ExcludeFilterTestInstrumentation.java diff --git a/dd-java-agent/testing/src/test/java/locator/ClassInjectingTestInstrumentation.java b/dd-java-agent/instrumentation-testing/src/test/java/locator/ClassInjectingTestInstrumentation.java similarity index 100% rename from dd-java-agent/testing/src/test/java/locator/ClassInjectingTestInstrumentation.java rename to dd-java-agent/instrumentation-testing/src/test/java/locator/ClassInjectingTestInstrumentation.java diff --git a/dd-java-agent/testing/src/test/java/locator/ClassInjectingTransformer.java b/dd-java-agent/instrumentation-testing/src/test/java/locator/ClassInjectingTransformer.java similarity index 100% rename from dd-java-agent/testing/src/test/java/locator/ClassInjectingTransformer.java rename to dd-java-agent/instrumentation-testing/src/test/java/locator/ClassInjectingTransformer.java diff --git a/dd-java-agent/testing/src/test/java/synthetic/SyntheticTestInstrumentation.java b/dd-java-agent/instrumentation-testing/src/test/java/synthetic/SyntheticTestInstrumentation.java similarity index 100% rename from dd-java-agent/testing/src/test/java/synthetic/SyntheticTestInstrumentation.java rename to dd-java-agent/instrumentation-testing/src/test/java/synthetic/SyntheticTestInstrumentation.java diff --git a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/build.gradle b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/build.gradle index db6f77915b4..af6f6026072 100644 --- a/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/build.gradle +++ b/dd-java-agent/instrumentation/akka/akka-http/akka-http-10.0/build.gradle @@ -116,7 +116,7 @@ dependencies { baseTestImplementation group: 'com.typesafe.akka', name: 'akka-http-jackson_2.11', version: '10.0.10' baseTestImplementation group: 'com.typesafe.akka', name: 'akka-http-spray-json_2.11', version: '10.0.10' - iastTestImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + iastTestImplementation project(':dd-java-agent:agent-iast:iast-testing') iastTestCompileOnly group: 'de.thetaphi', name: 'forbiddenapis', version: '3.4' iastTestRuntimeOnly project(':dd-java-agent:instrumentation:jackson-core') iastTestRuntimeOnly project(':dd-java-agent:instrumentation:jackson-core:jackson-core-2.8') @@ -131,13 +131,13 @@ dependencies { version101TestImplementation group: 'com.typesafe.akka', name: 'akka-http-jackson_2.12', version: '10.1.+' version101TestImplementation group: 'com.typesafe.akka', name: 'akka-http-spray-json_2.12', version: '10.1.+' - version101IastTestImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + version101IastTestImplementation project(':dd-java-agent:agent-iast:iast-testing') version102IastTestImplementation libs.scala212 version102IastTestImplementation group: 'com.typesafe.akka', name: 'akka-http_2.12', version: '10.2.+' version102IastTestImplementation group: 'com.typesafe.akka', name: 'akka-stream_2.12', version: '2.6.+' version102IastTestImplementation group: 'com.typesafe.akka', name: 'akka-http-jackson_2.12', version: '10.2.+' - version102IastTestImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + version102IastTestImplementation project(':dd-java-agent:agent-iast:iast-testing') version102Scala213TestImplementation libs.scala213 version102Scala213TestImplementation group: 'com.typesafe.akka', name: 'akka-http_2.13', version: '10.2.+' @@ -161,7 +161,7 @@ dependencies { latestDepIastTestImplementation group: 'com.typesafe.akka', name: 'akka-stream_2.13', version: '2.8.+' latestDepIastTestImplementation group: 'com.typesafe.akka', name: 'akka-actor_2.13', version: '2.8.+' latestDepIastTestImplementation group: 'com.typesafe.akka', name: 'akka-http-jackson_2.13', version: '[10.+,10.5.2)' - latestDepIastTestImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + latestDepIastTestImplementation project(':dd-java-agent:agent-iast:iast-testing') latestDepIastTestImplementation project(':dd-java-agent:instrumentation:jackson-core:jackson-core-2.12') lagomTestImplementation libs.scala211 diff --git a/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-4.0/build.gradle b/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-4.0/build.gradle index e12abc8749f..ee4dac3df03 100644 --- a/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-4.0/build.gradle +++ b/dd-java-agent/instrumentation/apache-httpclient/apache-httpclient-4.0/build.gradle @@ -32,11 +32,11 @@ addTestSuiteExtendingForDir('v45IastIntegrationTest', 'iastIntegrationTest', 'ia dependencies { compileOnly group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.0' - testImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + testImplementation project(':dd-java-agent:agent-iast:iast-testing') testImplementation group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.0' testImplementation(project(':dd-java-agent:instrumentation:apache-httpclient:apache-httpasyncclient-4.0')) // to instrument the integration test - iastIntegrationTestImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + iastIntegrationTestImplementation project(':dd-java-agent:agent-iast:iast-testing') iastIntegrationTestImplementation group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.0' iastIntegrationTestRuntimeOnly(project(':dd-java-agent:instrumentation:jetty-9')) iastIntegrationTestRuntimeOnly(project(':dd-java-agent:instrumentation:apache-httpcore:apache-httpcore-4.0')) diff --git a/dd-java-agent/instrumentation/armeria/armeria-jetty-1.24/build.gradle b/dd-java-agent/instrumentation/armeria/armeria-jetty-1.24/build.gradle index 669d428c9ff..f643b40e78e 100644 --- a/dd-java-agent/instrumentation/armeria/armeria-jetty-1.24/build.gradle +++ b/dd-java-agent/instrumentation/armeria/armeria-jetty-1.24/build.gradle @@ -76,7 +76,7 @@ dependencies { testImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:request-5')) testImplementation testFixtures(project(':dd-java-agent:instrumentation:jetty-11')) - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } // always mix everything up diff --git a/dd-java-agent/instrumentation/build.gradle b/dd-java-agent/instrumentation/build.gradle index 4c69a12c2b8..a294a72b811 100644 --- a/dd-java-agent/instrumentation/build.gradle +++ b/dd-java-agent/instrumentation/build.gradle @@ -87,35 +87,18 @@ subprojects { Project subProj -> //testImplementation project(':dd-java-agent:instrumentation:http-url-connection') testImplementation project(':dd-java-agent:instrumentation:classloading') - testImplementation project(':dd-java-agent:testing') + testImplementation project(':dd-java-agent:instrumentation-testing') testAnnotationProcessor libs.autoservice.processor testCompileOnly libs.autoservice.annotation instrumentPluginClasspath project(path: ':dd-java-agent:agent-tooling', configuration: 'instrumentPluginClasspath') } - subProj.testing { - suites.configureEach { - // SpockRunner that we use to run agent tests cannot be properly ported to JUnit 5, - // since the framework does not provide the hooks / extension points - // that can be used to shadow the tested class. - - // In order to mitigate this, SpockRunner extends JUnitPlatform, - // which is a JUnit 4 runner that allows executing JUnit 5 tests in a JUnit 4 environment - // (i.e. running them as JUnit 4 tests). - - // So even though Spock 2 tests run on top of JUnit 5, - // we execute them in "compatibility mode" so that SpockRunner could shadow the test class - // See https://junit.org/junit5/docs/current/user-guide/#running-tests-junit-platform-runner for more details. - useJUnit() - } - } - subProj.tasks.withType(Test).configureEach { subTask -> // The `forkedTest` task is not a proper test suite, so it has to be configured directly if (subTask.name == 'forkedTest') { // See SpockRunner comment above - useJUnit() + useJUnitPlatform() } if (subTask.name in ['latestDepTest', 'latestDepForkedTest']) { diff --git a/dd-java-agent/instrumentation/cxf-2.1/build.gradle b/dd-java-agent/instrumentation/cxf-2.1/build.gradle index fc93e8a95a1..20bb0d04ca5 100644 --- a/dd-java-agent/instrumentation/cxf-2.1/build.gradle +++ b/dd-java-agent/instrumentation/cxf-2.1/build.gradle @@ -53,7 +53,7 @@ addTestSuiteForDir('cxf3LatestDepTest', 'test') dependencies { compileOnly group: 'org.apache.cxf', name: 'cxf-api', version: '2.1' - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } testImplementation group: 'org.apache.cxf', name: 'cxf-rt-frontend-jaxrs', version: '3.0.0' diff --git a/dd-java-agent/instrumentation/dropwizard/build.gradle b/dd-java-agent/instrumentation/dropwizard/build.gradle index 31f285fcf71..b51df8d5a3f 100644 --- a/dd-java-agent/instrumentation/dropwizard/build.gradle +++ b/dd-java-agent/instrumentation/dropwizard/build.gradle @@ -7,7 +7,7 @@ dependencies { testImplementation project(':dd-java-agent:instrumentation:servlet:request-3') // Don't want to conflict with jetty from the test server. - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } diff --git a/dd-java-agent/instrumentation/grizzly-http-2.3.20/build.gradle b/dd-java-agent/instrumentation/grizzly-http-2.3.20/build.gradle index 905d0663060..d047fa65339 100644 --- a/dd-java-agent/instrumentation/grizzly-http-2.3.20/build.gradle +++ b/dd-java-agent/instrumentation/grizzly-http-2.3.20/build.gradle @@ -25,7 +25,7 @@ dependencies { testImplementation group: 'org.glassfish.grizzly', name: 'grizzly-http-server', version: '2.3.20' testImplementation group: 'org.glassfish.jersey.containers', name: 'jersey-container-grizzly2-http', version: '2.18' testImplementation group: 'org.glassfish.jersey.media', name: 'jersey-media-multipart', version: '2.18' - testImplementation testFixtures(project(':dd-java-agent:appsec')) + testImplementation project(':dd-java-agent:appsec:appsec-testing') testRuntimeOnly project(':dd-java-agent:instrumentation:jersey-2-appsec') latestDepTestImplementation group: 'org.glassfish.grizzly', name: 'grizzly-http-server', version: '2.3.20+' diff --git a/dd-java-agent/instrumentation/jdbc/build.gradle b/dd-java-agent/instrumentation/jdbc/build.gradle index 096f227a660..759a11c7759 100644 --- a/dd-java-agent/instrumentation/jdbc/build.gradle +++ b/dd-java-agent/instrumentation/jdbc/build.gradle @@ -21,7 +21,7 @@ addTestSuiteExtendingForDir('latestDepJava11Test', 'latestDepTest', 'test') dependencies { compileOnly group: 'com.zaxxer', name: 'HikariCP', version: '2.4.0' - testImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + testImplementation project(':dd-java-agent:agent-iast:iast-testing') // jdbc unit testing testImplementation group: 'com.h2database', name: 'h2', version: '[1.3.168,1.3.169]'// first jdk 1.6 compatible diff --git a/dd-java-agent/instrumentation/jersey/build.gradle b/dd-java-agent/instrumentation/jersey/build.gradle index 6994d611389..5e534839d6d 100644 --- a/dd-java-agent/instrumentation/jersey/build.gradle +++ b/dd-java-agent/instrumentation/jersey/build.gradle @@ -44,11 +44,11 @@ dependencies { testImplementation group: 'jakarta.ws.rs', name: 'jakarta.ws.rs-api', version: '3.0.0' testImplementation group: 'org.glassfish.jersey.core', name: 'jersey-common', version: jersey3Version - jersey2JettyTestImplementation project(':dd-java-agent:testing'), { + jersey2JettyTestImplementation project(':dd-java-agent:instrumentation-testing'), { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } - jersey2JettyTestImplementation testFixtures(project(':dd-java-agent:appsec')) - jersey2JettyTestImplementation testFixtures(project(':dd-java-agent:agent-iast')) + jersey2JettyTestImplementation project(':dd-java-agent:appsec:appsec-testing') + jersey2JettyTestImplementation project(':dd-java-agent:agent-iast:iast-testing') jersey2JettyTestImplementation group: 'org.glassfish.jersey.containers', name: 'jersey-container-jetty-http', version : jersey2Version jersey2JettyTestImplementation group: 'org.glassfish.jersey.media', name: 'jersey-media-multipart', version: jersey2Version jersey2JettyTestImplementation group: 'org.glassfish.jersey.media', name: 'jersey-media-json-jackson', version: jersey2Version @@ -58,11 +58,11 @@ dependencies { jersey2JettyTestRuntimeOnly project(':dd-java-agent:instrumentation:jersey-2-appsec') jersey2JettyTestRuntimeOnly project(':dd-java-agent:instrumentation:jax-rs-annotations-2') - jersey3JettyTestImplementation project(':dd-java-agent:testing'), { + jersey3JettyTestImplementation project(':dd-java-agent:instrumentation-testing'), { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } - jersey3JettyTestImplementation testFixtures(project(':dd-java-agent:appsec')) - jersey3JettyTestImplementation testFixtures(project(':dd-java-agent:agent-iast')) + jersey3JettyTestImplementation project(':dd-java-agent:appsec:appsec-testing') + jersey3JettyTestImplementation project(':dd-java-agent:agent-iast:iast-testing') jersey3JettyTestImplementation group: 'org.glassfish.jersey.containers', name: 'jersey-container-jetty-http', version : jersey3Version jersey3JettyTestImplementation group: 'org.glassfish.jersey.media', name: 'jersey-media-multipart', version: jersey3Version jersey3JettyTestImplementation group: 'org.glassfish.jersey.media', name: 'jersey-media-json-jackson', version: jersey3Version diff --git a/dd-java-agent/instrumentation/jetty-11/build.gradle b/dd-java-agent/instrumentation/jetty-11/build.gradle index 12f5dc77c96..1c4d3203519 100644 --- a/dd-java-agent/instrumentation/jetty-11/build.gradle +++ b/dd-java-agent/instrumentation/jetty-11/build.gradle @@ -43,11 +43,11 @@ dependencies { - testFixturesImplementation(project(':dd-java-agent:testing')) { + testFixturesImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } // Don't want to conflict with jetty from the test server. - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } testImplementation ("org.eclipse.jetty:jetty-server:11.0.0") { @@ -61,7 +61,7 @@ dependencies { } testImplementation(project(':dd-java-agent:instrumentation:jetty-appsec-9.3')) testImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:request-5')) - testImplementation testFixtures(project(':dd-java-agent:appsec')) + testImplementation project(':dd-java-agent:appsec:appsec-testing') testRuntimeOnly project(':dd-java-agent:instrumentation:jetty-9') testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:request-5') testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:javax-websocket-1.0') diff --git a/dd-java-agent/instrumentation/jetty-12/build.gradle b/dd-java-agent/instrumentation/jetty-12/build.gradle index 470dfbe1d3a..c60d9664cbb 100644 --- a/dd-java-agent/instrumentation/jetty-12/build.gradle +++ b/dd-java-agent/instrumentation/jetty-12/build.gradle @@ -63,7 +63,7 @@ dependencies { implementation project(':dd-java-agent:instrumentation:jetty-common') // Don't want to conflict with jetty from the test server. - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } testImplementation ("org.eclipse.jetty:jetty-server:12.0.0") { @@ -78,7 +78,7 @@ dependencies { testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-10") testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-11") testRuntimeOnly project(":dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-12") - testImplementation testFixtures(project(':dd-java-agent:appsec')) + testImplementation project(':dd-java-agent:appsec:appsec-testing') testRuntimeOnly project(':dd-java-agent:instrumentation:jetty-9') testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:request-5') testRuntimeOnly(project(':dd-java-agent:instrumentation:jetty-11')) diff --git a/dd-java-agent/instrumentation/jetty-7.0/build.gradle b/dd-java-agent/instrumentation/jetty-7.0/build.gradle index 7c2473439a5..8667f3cbc25 100644 --- a/dd-java-agent/instrumentation/jetty-7.0/build.gradle +++ b/dd-java-agent/instrumentation/jetty-7.0/build.gradle @@ -17,7 +17,7 @@ dependencies { implementation project(':dd-java-agent:instrumentation:jetty-common') // Don't want to conflict with jetty from the test server. - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } testImplementation project(':dd-java-agent:instrumentation:jetty-util') diff --git a/dd-java-agent/instrumentation/jetty-7.6/build.gradle b/dd-java-agent/instrumentation/jetty-7.6/build.gradle index d8277cab97e..d4fdc0fd6bd 100644 --- a/dd-java-agent/instrumentation/jetty-7.6/build.gradle +++ b/dd-java-agent/instrumentation/jetty-7.6/build.gradle @@ -17,7 +17,7 @@ dependencies { implementation project(':dd-java-agent:instrumentation:jetty-common') // Don't want to conflict with jetty from the test server. - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } testImplementation project(':dd-java-agent:instrumentation:jetty-util') diff --git a/dd-java-agent/instrumentation/jetty-9/build.gradle b/dd-java-agent/instrumentation/jetty-9/build.gradle index de8c939dab4..5e324c2884b 100644 --- a/dd-java-agent/instrumentation/jetty-9/build.gradle +++ b/dd-java-agent/instrumentation/jetty-9/build.gradle @@ -163,11 +163,11 @@ dependencies { builtBy = ['compileJava'] } - testFixturesImplementation(project(':dd-java-agent:testing')) { + testFixturesImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } // Don't want to conflict with jetty from the test server. - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } testImplementation project(':dd-java-agent:instrumentation:jetty-util') @@ -187,7 +187,7 @@ dependencies { testRuntimeOnly project(':dd-java-agent:instrumentation:websocket:jetty-websocket:jetty-websocket-10') testImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:request-3')) testFixturesImplementation testFixtures(project(':dd-java-agent:instrumentation:servlet:request-3')) - testImplementation testFixtures(project(':dd-java-agent:appsec')) + testImplementation project(':dd-java-agent:appsec:appsec-testing') jetty92TestImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.2.30.v20200428' jetty92TestImplementation group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '9.2.30.v20200428' diff --git a/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/build.gradle b/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/build.gradle index bef44b496ae..ab6e34c6d3e 100644 --- a/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/build.gradle +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-10.0/build.gradle @@ -38,11 +38,12 @@ dependencies { } //because contains some instrumentation that still apply testImplementation(project(':dd-java-agent:instrumentation:jetty-client:jetty-client-9.1')) - testImplementation(project(path:':dd-java-agent:testing', configuration:'shadow')) { + testImplementation(project(path:':dd-java-agent:testing', 'configuration': 'shadow')) { // explicitly declared below. exclude group: 'org.eclipse.jetty' } testImplementation project(':dd-java-agent:instrumentation:jetty-util') + testImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '10.0.0' testImplementation group: 'org.eclipse.jetty', name: 'jetty-client', version: '10.0.0' jetty10LatestDepTestImplementation group: 'org.eclipse.jetty', name: 'jetty-client', version: '10.+' jetty11TestImplementation group: 'org.eclipse.jetty', name: 'jetty-client', version: '11.0.0' diff --git a/dd-java-agent/instrumentation/jetty-client/jetty-client-12.0/build.gradle b/dd-java-agent/instrumentation/jetty-client/jetty-client-12.0/build.gradle index f726648b022..d6b8994dce2 100644 --- a/dd-java-agent/instrumentation/jetty-client/jetty-client-12.0/build.gradle +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-12.0/build.gradle @@ -31,7 +31,7 @@ dependencies { testImplementation(project(':dd-java-agent:instrumentation:jetty-client:jetty-client-9.1')) testImplementation(project(':dd-java-agent:instrumentation:jetty-client:jetty-client-10.0')) - testImplementation(project(path:':dd-java-agent:testing', configuration:'shadow')) { + testImplementation(project(path:':dd-java-agent:testing', 'configuration': 'shadow')) { // explicitly declared below. exclude group: 'org.eclipse.jetty' } diff --git a/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/build.gradle b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/build.gradle index 0b606c3bc8b..18579cc66fb 100644 --- a/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/build.gradle +++ b/dd-java-agent/instrumentation/jetty-client/jetty-client-9.1/build.gradle @@ -51,7 +51,7 @@ dependencies { implementation(project(':dd-java-agent:instrumentation:jetty-client:jetty-client-common')) { transitive = false } - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { // explicitly declared below. exclude group: 'org.eclipse.jetty' } diff --git a/dd-java-agent/instrumentation/jetty-common/build.gradle b/dd-java-agent/instrumentation/jetty-common/build.gradle index cdf037556ae..b72b2c63300 100644 --- a/dd-java-agent/instrumentation/jetty-common/build.gradle +++ b/dd-java-agent/instrumentation/jetty-common/build.gradle @@ -6,7 +6,7 @@ addTestSuiteForDir('latestDepTest', 'test') dependencies { compileOnly group: 'org.eclipse.jetty', name: 'jetty-server', version: '7.0.0.v20091005' - testImplementation project(':dd-java-agent:testing'), { + testImplementation project(':dd-java-agent:instrumentation-testing'), { exclude group: 'org.eclipse.jetty' } testImplementation group: 'org.eclipse.jetty', name: 'jetty-server', version: '7.0.0.v20091005' diff --git a/dd-java-agent/instrumentation/jetty-common/src/test/groovy/datadog/trace/instrumentation/jetty/JettyBlockingHelperSpecification.groovy b/dd-java-agent/instrumentation/jetty-common/src/test/groovy/datadog/trace/instrumentation/jetty/JettyBlockingHelperSpecification.groovy index 7f8f29129e4..9a895aa511b 100644 --- a/dd-java-agent/instrumentation/jetty-common/src/test/groovy/datadog/trace/instrumentation/jetty/JettyBlockingHelperSpecification.groovy +++ b/dd-java-agent/instrumentation/jetty-common/src/test/groovy/datadog/trace/instrumentation/jetty/JettyBlockingHelperSpecification.groovy @@ -1,5 +1,6 @@ package datadog.trace.instrumentation.jetty +import datadog.appsec.api.blocking.BlockingContentType import datadog.trace.api.gateway.Flow import datadog.trace.api.internal.TraceSegment import datadog.trace.test.util.DDSpecification @@ -8,8 +9,6 @@ import org.eclipse.jetty.server.Response import javax.servlet.ServletOutputStream -import static datadog.appsec.api.blocking.BlockingContentType.AUTO - class JettyBlockingHelperSpecification extends DDSpecification { void 'block completes successfully'() { setup: @@ -17,9 +16,10 @@ class JettyBlockingHelperSpecification extends DDSpecification { Response resp = Mock() ServletOutputStream os = Mock() TraceSegment seg = Mock() + Flow.Action.RequestBlockingAction rba = new Flow.Action.RequestBlockingAction(402, BlockingContentType.AUTO) when: - JettyBlockingHelper.block(seg, req, resp, new Flow.Action.RequestBlockingAction(402, AUTO)) + JettyBlockingHelper.block(seg, req, resp, rba.getStatusCode(), rba.getBlockingContentType(), rba.getExtraHeaders()) then: 1 * resp.isCommitted() >> false diff --git a/dd-java-agent/instrumentation/junit-4.10/build.gradle b/dd-java-agent/instrumentation/junit-4.10/build.gradle index 64ed32abf76..cb7c717443a 100644 --- a/dd-java-agent/instrumentation/junit-4.10/build.gradle +++ b/dd-java-agent/instrumentation/junit-4.10/build.gradle @@ -19,7 +19,7 @@ tasks.named("compileLatestDepTestGroovy").configure { dependencies { compileOnly group: 'junit', name: 'junit', version: '4.10' - testImplementation testFixtures(project(':dd-java-agent:agent-ci-visibility')) + testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-testing') // version used below is not the minimum one that we support, // but the tests need to use it in order to be compliant with Spock 2.x diff --git a/dd-java-agent/instrumentation/junit-4.10/cucumber-junit-4/build.gradle b/dd-java-agent/instrumentation/junit-4.10/cucumber-junit-4/build.gradle index 871afe9b522..c91c9954f4c 100644 --- a/dd-java-agent/instrumentation/junit-4.10/cucumber-junit-4/build.gradle +++ b/dd-java-agent/instrumentation/junit-4.10/cucumber-junit-4/build.gradle @@ -14,7 +14,7 @@ dependencies { implementation project(':dd-java-agent:instrumentation:junit-4.10') compileOnly group: 'io.cucumber', name: 'cucumber-junit', version: '5.4.0' - testImplementation testFixtures(project(':dd-java-agent:agent-ci-visibility')) + testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-testing') // version used below is not the minimum one that we support, // but the tests need to use it in order to be compliant with Spock 2.x diff --git a/dd-java-agent/instrumentation/junit-4.10/junit-4.13/build.gradle b/dd-java-agent/instrumentation/junit-4.10/junit-4.13/build.gradle index 0de58ffa9c0..05d91f1c941 100644 --- a/dd-java-agent/instrumentation/junit-4.10/junit-4.13/build.gradle +++ b/dd-java-agent/instrumentation/junit-4.10/junit-4.13/build.gradle @@ -14,7 +14,7 @@ dependencies { implementation project(':dd-java-agent:instrumentation:junit-4.10') compileOnly group: 'junit', name: 'junit', version: '4.13' - testImplementation testFixtures(project(':dd-java-agent:agent-ci-visibility')) + testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-testing') // version used below is not the minimum one that we support, // but the tests need to use it in order to be compliant with Spock 2.x diff --git a/dd-java-agent/instrumentation/junit-4.10/munit-junit-4/build.gradle b/dd-java-agent/instrumentation/junit-4.10/munit-junit-4/build.gradle index e3cda16d277..781b9cb2316 100644 --- a/dd-java-agent/instrumentation/junit-4.10/munit-junit-4/build.gradle +++ b/dd-java-agent/instrumentation/junit-4.10/munit-junit-4/build.gradle @@ -15,7 +15,7 @@ dependencies { implementation project(':dd-java-agent:instrumentation:junit-4.10') compileOnly group: 'org.scalameta', name: 'munit_2.13', version: '0.7.28' - testImplementation testFixtures(project(':dd-java-agent:agent-ci-visibility')) + testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-testing') // version used below is not the minimum one that we support, // but the tests need to use it in order to be compliant with Spock 2.x diff --git a/dd-java-agent/instrumentation/junit-5.3/build.gradle b/dd-java-agent/instrumentation/junit-5.3/build.gradle index 20560456845..edf042a8366 100644 --- a/dd-java-agent/instrumentation/junit-5.3/build.gradle +++ b/dd-java-agent/instrumentation/junit-5.3/build.gradle @@ -28,7 +28,7 @@ dependencies { compileOnly group: 'org.junit.platform', name: 'junit-platform-launcher', version: "$platformVersion" compileOnly group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: "$jupiterVersion" - testImplementation testFixtures(project(':dd-java-agent:agent-ci-visibility')) + testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-testing') // versions used below are not the minimum ones that we support, // but the tests need to use them in order to be compliant with Spock 2.x diff --git a/dd-java-agent/instrumentation/junit-5.3/cucumber-junit-5/build.gradle b/dd-java-agent/instrumentation/junit-5.3/cucumber-junit-5/build.gradle index 2d558b68c21..510a7c36b18 100644 --- a/dd-java-agent/instrumentation/junit-5.3/cucumber-junit-5/build.gradle +++ b/dd-java-agent/instrumentation/junit-5.3/cucumber-junit-5/build.gradle @@ -17,7 +17,7 @@ dependencies { compileOnly group: 'io.cucumber', name: 'cucumber-junit-platform-engine', version: '5.4.0' compileOnly group: 'io.cucumber', name: 'cucumber-java', version: '5.4.0' - testImplementation testFixtures(project(':dd-java-agent:agent-ci-visibility')) + testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-testing') testImplementation group: 'org.junit.platform', name: 'junit-platform-launcher', version: '1.12.0' testImplementation group: 'org.junit.platform', name: 'junit-platform-suite', version: '1.12.0' diff --git a/dd-java-agent/instrumentation/junit-5.3/junit-5.8/build.gradle b/dd-java-agent/instrumentation/junit-5.3/junit-5.8/build.gradle index 7a236d02e8b..3319fb9dde5 100644 --- a/dd-java-agent/instrumentation/junit-5.3/junit-5.8/build.gradle +++ b/dd-java-agent/instrumentation/junit-5.3/junit-5.8/build.gradle @@ -32,7 +32,7 @@ dependencies { compileOnly group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: "$jupiterVersion" compileOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: "$jupiterVersion" - testImplementation testFixtures(project(':dd-java-agent:agent-ci-visibility')) + testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-testing') // versions used below are not the minimum ones that we support, // but the tests need to use them in order to be compliant with Spock 2.x diff --git a/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/build.gradle b/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/build.gradle index 40134ed7360..38edda8595e 100644 --- a/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/build.gradle +++ b/dd-java-agent/instrumentation/junit-5.3/spock-junit-5/build.gradle @@ -20,7 +20,7 @@ dependencies { compileOnly group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.7.2' compileOnly group: 'org.spockframework', name: 'spock-core', version: "2.0-groovy-${spockGroovyVersion}" - testImplementation testFixtures(project(':dd-java-agent:agent-ci-visibility')) + testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-testing') testImplementation group: 'org.junit.platform', name: 'junit-platform-launcher', version: '1.12.0' testImplementation group: 'org.spockframework', name: 'spock-core', version: "2.2-groovy-${spockGroovyVersion}" diff --git a/dd-java-agent/instrumentation/junit-5.3/src/test/java/org/example/TestFlaky.java b/dd-java-agent/instrumentation/junit-5.3/src/test/java/org/example/TestFlaky.java deleted file mode 100644 index 8681742e020..00000000000 --- a/dd-java-agent/instrumentation/junit-5.3/src/test/java/org/example/TestFlaky.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.example; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.junit.jupiter.api.Test; - -public class TestFlaky { - - public static int TEST_EXECUTIONS_IDX = 0; - - @Test - public void test_flake() { - assertEquals(0, TEST_EXECUTIONS_IDX++ % 2); - } -} diff --git a/dd-java-agent/instrumentation/kafka-clients-0.11/build.gradle b/dd-java-agent/instrumentation/kafka-clients-0.11/build.gradle index 1fa13c7d2af..2b027ea3c32 100644 --- a/dd-java-agent/instrumentation/kafka-clients-0.11/build.gradle +++ b/dd-java-agent/instrumentation/kafka-clients-0.11/build.gradle @@ -34,7 +34,7 @@ dependencies { testRuntimeOnly project(':dd-java-agent:instrumentation:spring-scheduling-3.1') testRuntimeOnly project(':dd-java-agent:instrumentation:reactor-core-3.1') testRuntimeOnly project(':dd-java-agent:instrumentation:reactive-streams') - testImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + testImplementation project(':dd-java-agent:agent-iast:iast-testing') // IAST testing dependencies @@ -62,7 +62,7 @@ dependencies { iastLatestDepTest3RuntimeOnly project(':dd-java-agent:instrumentation:jackson-core') iastLatestDepTest3RuntimeOnly project(':dd-java-agent:instrumentation:jackson-core:jackson-core-2.12') iastLatestDepTest3Implementation(group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.15.3') - iastLatestDepTest3Implementation(testFixtures(project(':dd-java-agent:agent-iast'))) + iastLatestDepTest3Implementation project(':dd-java-agent:agent-iast:iast-testing') } diff --git a/dd-java-agent/instrumentation/kafka-connect-0.11/build.gradle b/dd-java-agent/instrumentation/kafka-connect-0.11/build.gradle index e5ac493608e..7d89aac7b17 100644 --- a/dd-java-agent/instrumentation/kafka-connect-0.11/build.gradle +++ b/dd-java-agent/instrumentation/kafka-connect-0.11/build.gradle @@ -13,7 +13,7 @@ apply from: "$rootDir/gradle/java.gradle" dependencies { compileOnly group: 'org.apache.kafka', name: 'connect-runtime', version: '0.11.0.0' - testImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + testImplementation project(':dd-java-agent:agent-iast:iast-testing') testRuntimeOnly project(':dd-java-agent:instrumentation:iast-instrumenter') testRuntimeOnly project(':dd-java-agent:instrumentation:java-lang') testRuntimeOnly project(':dd-java-agent:instrumentation:java-io') diff --git a/dd-java-agent/instrumentation/karate/build.gradle b/dd-java-agent/instrumentation/karate/build.gradle index 2832208a3f2..73ca2c463f0 100644 --- a/dd-java-agent/instrumentation/karate/build.gradle +++ b/dd-java-agent/instrumentation/karate/build.gradle @@ -27,7 +27,7 @@ addTestSuiteForDir('karate131Test', 'test') dependencies { compileOnly group: 'com.intuit.karate', name: 'karate-core', version: '1.0.0' - testImplementation testFixtures(project(':dd-java-agent:agent-ci-visibility')) + testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-testing') testImplementation group: 'org.junit.platform', name: 'junit-platform-launcher', version: '1.8.2' testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.8.2' diff --git a/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle b/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle index 66935b361c3..9f723812ebc 100644 --- a/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle +++ b/dd-java-agent/instrumentation/kotlin-coroutines/build.gradle @@ -47,7 +47,7 @@ dependencies { testFixturesImplementation libs.coroutines testFixturesApi project(':dd-trace-api') testFixturesApi project(':dd-java-agent:instrumentation:trace-annotation') - testFixturesApi project(':dd-java-agent:testing') + testFixturesApi project(':dd-java-agent:instrumentation-testing') testFixturesApi 'com.github.spotbugs:spotbugs-annotations:4.2.0' testImplementation libs.kotlin diff --git a/dd-java-agent/instrumentation/liberty-20/build.gradle b/dd-java-agent/instrumentation/liberty-20/build.gradle index 0f5829507ab..688049e6387 100644 --- a/dd-java-agent/instrumentation/liberty-20/build.gradle +++ b/dd-java-agent/instrumentation/liberty-20/build.gradle @@ -29,7 +29,7 @@ dependencies { implementation project(':dd-java-agent:instrumentation:servlet-common') testImplementation files({ tasks.installOpenLibertyDeps.wsServerJar }) - testImplementation testFixtures(project(':dd-java-agent:appsec')) + testImplementation project(':dd-java-agent:appsec:appsec-testing') testRuntimeOnly project(':dd-java-agent:instrumentation:osgi-4.3') testRuntimeOnly files({ tasks.filterLogbackClassic.filteredLogbackDir }) testRuntimeOnly project(':dd-java-agent:instrumentation:servlet:request-3') diff --git a/dd-java-agent/instrumentation/liberty-23/build.gradle b/dd-java-agent/instrumentation/liberty-23/build.gradle index fc97f44a6a0..63a5395944b 100644 --- a/dd-java-agent/instrumentation/liberty-23/build.gradle +++ b/dd-java-agent/instrumentation/liberty-23/build.gradle @@ -31,7 +31,7 @@ dependencies { implementation project(':dd-java-agent:instrumentation:servlet:request-5') testImplementation files({ tasks.installOpenLibertyDeps.wsServerJar }) - testImplementation testFixtures(project(':dd-java-agent:appsec')) + testImplementation project(':dd-java-agent:appsec:appsec-testing') testRuntimeOnly project(':dd-java-agent:instrumentation:osgi-4.3') testRuntimeOnly files({ tasks.filterLogbackClassic.filteredLogbackDir }) testRuntimeOnly project(':dd-java-agent:instrumentation:liberty-20') diff --git a/dd-java-agent/instrumentation/maven-3.2.1/build.gradle b/dd-java-agent/instrumentation/maven-3.2.1/build.gradle index f2148ebea1c..c146e579365 100644 --- a/dd-java-agent/instrumentation/maven-3.2.1/build.gradle +++ b/dd-java-agent/instrumentation/maven-3.2.1/build.gradle @@ -14,7 +14,7 @@ addTestSuiteForDir('latestDepTest', 'test') dependencies { compileOnly 'org.apache.maven:maven-embedder:3.2.1' - testImplementation testFixtures(project(':dd-java-agent:agent-ci-visibility')) + testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-testing') // this is not the earliest version of Maven that we support, // but using the earliest one is not possible here because of dependency conflicts diff --git a/dd-java-agent/instrumentation/okhttp-2/build.gradle b/dd-java-agent/instrumentation/okhttp-2/build.gradle index db2c0e30f72..c21ff0254ac 100644 --- a/dd-java-agent/instrumentation/okhttp-2/build.gradle +++ b/dd-java-agent/instrumentation/okhttp-2/build.gradle @@ -28,7 +28,7 @@ dependencies { exclude module: 'okhttp' } - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude module: 'okhttp' } testImplementation(project(':dd-java-agent:instrumentation:java-concurrent')) { diff --git a/dd-java-agent/instrumentation/pekko-http-1.0/build.gradle b/dd-java-agent/instrumentation/pekko-http-1.0/build.gradle index b70cb979673..663ce1be5e0 100644 --- a/dd-java-agent/instrumentation/pekko-http-1.0/build.gradle +++ b/dd-java-agent/instrumentation/pekko-http-1.0/build.gradle @@ -62,7 +62,7 @@ dependencies { baseTestImplementation group: 'org.apache.pekko', name: 'pekko-stream_2.12', version: '1.0.1' iastTestImplementation group: 'com.github.pjfanning', name: 'pekko-http-jackson_2.12', version: '2.1.0' - iastTestImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + iastTestImplementation project(':dd-java-agent:agent-iast:iast-testing') iastTestCompileOnly group: 'de.thetaphi', name: 'forbiddenapis', version: '3.4' iastTestRuntimeOnly project(':dd-java-agent:instrumentation:jackson-core') iastTestRuntimeOnly project(':dd-java-agent:instrumentation:jackson-core:jackson-core-2.12') @@ -84,7 +84,7 @@ dependencies { latestDepIastTestImplementation group: 'org.apache.pekko', name: 'pekko-stream_2.13', version: '1.0.+' latestDepIastTestImplementation group: 'com.github.pjfanning', name: 'pekko-http-jackson_2.13', version: '2.+' latestDepIastTestImplementation group: 'org.scala-lang.modules', name: 'scala-java8-compat_2.13', version: '1.0.+' - latestDepIastTestImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + latestDepIastTestImplementation project(':dd-java-agent:agent-iast:iast-testing') latestDepIastTestImplementation project(':dd-java-agent:instrumentation:jackson-core:jackson-core-2.16') } diff --git a/dd-java-agent/instrumentation/ratpack-1.5/build.gradle b/dd-java-agent/instrumentation/ratpack-1.5/build.gradle index 1b5e9306bc1..02825456da9 100644 --- a/dd-java-agent/instrumentation/ratpack-1.5/build.gradle +++ b/dd-java-agent/instrumentation/ratpack-1.5/build.gradle @@ -20,6 +20,6 @@ dependencies { testImplementation project(':dd-java-agent:instrumentation:netty-4.1') testImplementation group: 'io.ratpack', name: 'ratpack-groovy-test', version: '1.5.0' testImplementation 'com.sun.activation:jakarta.activation:1.2.2' - testImplementation testFixtures(project(':dd-java-agent:appsec')) + testImplementation project(':dd-java-agent:appsec:appsec-testing') latestDepTestImplementation group: 'io.ratpack', name: 'ratpack-groovy-test', version: '1.+' } diff --git a/dd-java-agent/instrumentation/resteasy-appsec/build.gradle b/dd-java-agent/instrumentation/resteasy-appsec/build.gradle index 85da55c14c0..88351ec30d1 100644 --- a/dd-java-agent/instrumentation/resteasy-appsec/build.gradle +++ b/dd-java-agent/instrumentation/resteasy-appsec/build.gradle @@ -32,11 +32,11 @@ dependencies { testFixturesApi group: 'org.jboss.resteasy', name: 'resteasy-jaxrs', version: '3.0.0.Final' testFixturesApi group: 'org.jboss.resteasy', name: 'resteasy-jackson-provider', version: '3.0.0.Final' testFixturesApi group: 'org.jboss.resteasy', name: 'resteasy-multipart-provider', version: '3.0.0.Final' - testFixturesImplementation project(':dd-java-agent:testing'), { + testFixturesImplementation project(':dd-java-agent:instrumentation-testing'), { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } - testImplementation project(':dd-java-agent:testing'), { + testImplementation project(':dd-java-agent:instrumentation-testing'), { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } diff --git a/dd-java-agent/instrumentation/scala/build.gradle b/dd-java-agent/instrumentation/scala/build.gradle index 6042eda2234..42d62bff8ef 100644 --- a/dd-java-agent/instrumentation/scala/build.gradle +++ b/dd-java-agent/instrumentation/scala/build.gradle @@ -15,7 +15,7 @@ dependencies { // First 2.10 version that accepts target 1.8 compileOnly group: 'org.scala-lang', name: 'scala-library', version: '2.10.7' testImplementation group: 'org.scala-lang', name: 'scala-library', version: '2.10.7' - testImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + testImplementation project(':dd-java-agent:agent-iast:iast-testing') testRuntimeOnly project(':dd-java-agent:instrumentation:iast-instrumenter') } diff --git a/dd-java-agent/instrumentation/scalatest/build.gradle b/dd-java-agent/instrumentation/scalatest/build.gradle index 27f88013511..b9fa6892893 100644 --- a/dd-java-agent/instrumentation/scalatest/build.gradle +++ b/dd-java-agent/instrumentation/scalatest/build.gradle @@ -15,7 +15,7 @@ addTestSuiteForDir('latestDepTest', 'test') dependencies { compileOnly group: 'org.scalatest', name: 'scalatest_2.13', version: '3.0.8' - testImplementation testFixtures(project(':dd-java-agent:agent-ci-visibility')) + testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-testing') testImplementation group: 'org.scala-lang', name: 'scala-library', version: '2.12.15' testImplementation group: 'org.scalatest', name: 'scalatest_2.12', version: '3.1.0' diff --git a/dd-java-agent/instrumentation/selenium/build.gradle b/dd-java-agent/instrumentation/selenium/build.gradle index 71d13fbd7f7..cade482cff4 100644 --- a/dd-java-agent/instrumentation/selenium/build.gradle +++ b/dd-java-agent/instrumentation/selenium/build.gradle @@ -23,7 +23,7 @@ addTestSuite('latestDepTest') dependencies { compileOnly group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.141.59' - testFixturesApi testFixtures(project(':dd-java-agent:agent-ci-visibility')) + testFixturesApi project(':dd-java-agent:agent-ci-visibility:civisibility-testing') testFixturesApi project(':dd-java-agent:instrumentation:junit-5.3') testFixturesApi group: 'org.junit.platform', name: 'junit-platform-launcher', version: '1.8.2' testFixturesApi group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.8.2' diff --git a/dd-java-agent/instrumentation/servlet/build.gradle b/dd-java-agent/instrumentation/servlet/build.gradle index 4266e6d9f29..31c6abdc9ac 100644 --- a/dd-java-agent/instrumentation/servlet/build.gradle +++ b/dd-java-agent/instrumentation/servlet/build.gradle @@ -25,7 +25,7 @@ dependencies { testImplementation project(':dd-java-agent:instrumentation:servlet:request-2') // Don't want to conflict with jetty from the test server. - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } diff --git a/dd-java-agent/instrumentation/servlet/request-2/build.gradle b/dd-java-agent/instrumentation/servlet/request-2/build.gradle index b2137c07e9c..2a4049edcf0 100644 --- a/dd-java-agent/instrumentation/servlet/request-2/build.gradle +++ b/dd-java-agent/instrumentation/servlet/request-2/build.gradle @@ -34,7 +34,7 @@ dependencies { compileOnly group: 'javax.servlet', name: 'servlet-api', version: '2.2' implementation project(':dd-java-agent:instrumentation:servlet-common') - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } testImplementation project(':dd-java-agent:instrumentation:jetty-7.0') // See if there's any conflicts. diff --git a/dd-java-agent/instrumentation/servlet/request-3/build.gradle b/dd-java-agent/instrumentation/servlet/request-3/build.gradle index 30f9c115905..d75e1691f21 100644 --- a/dd-java-agent/instrumentation/servlet/request-3/build.gradle +++ b/dd-java-agent/instrumentation/servlet/request-3/build.gradle @@ -38,12 +38,12 @@ dependencies { compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0' implementation project(':dd-java-agent:instrumentation:servlet-common') - testFixturesApi(project(':dd-java-agent:testing')) { + testFixturesApi(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } testFixturesCompileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1' - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } testImplementation project(':dd-java-agent:instrumentation:jetty-7.0') // See if there's any conflicts. diff --git a/dd-java-agent/instrumentation/servlet/request-5/build.gradle b/dd-java-agent/instrumentation/servlet/request-5/build.gradle index 967f0c3f135..e731b0ae3b2 100644 --- a/dd-java-agent/instrumentation/servlet/request-5/build.gradle +++ b/dd-java-agent/instrumentation/servlet/request-5/build.gradle @@ -64,7 +64,7 @@ dependencies { transitive = false } - testFixturesApi(project(':dd-java-agent:testing')) { + testFixturesApi(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } testFixturesCompileOnly group: 'jakarta.servlet', name: 'jakarta.servlet-api', version: '5.0.0' diff --git a/dd-java-agent/instrumentation/spark/build.gradle b/dd-java-agent/instrumentation/spark/build.gradle index 90e58f3977e..806f480fbe5 100644 --- a/dd-java-agent/instrumentation/spark/build.gradle +++ b/dd-java-agent/instrumentation/spark/build.gradle @@ -15,7 +15,7 @@ dependencies { testFixturesApi project(':dd-trace-api') testFixturesApi project(':dd-java-agent:instrumentation:trace-annotation') - testFixturesApi project(':dd-java-agent:testing') + testFixturesApi project(':dd-java-agent:instrumentation-testing') testFixturesCompileOnly group: 'org.apache.spark', name: 'spark-core_2.12', version: '2.4.0' testFixturesCompileOnly group: 'org.apache.spark', name: 'spark-sql_2.12', version: '2.4.0' diff --git a/dd-java-agent/instrumentation/spray-1.3/build.gradle b/dd-java-agent/instrumentation/spray-1.3/build.gradle index 51e5128b66c..d0249a9f8e9 100644 --- a/dd-java-agent/instrumentation/spray-1.3/build.gradle +++ b/dd-java-agent/instrumentation/spray-1.3/build.gradle @@ -21,6 +21,6 @@ dependencies { testImplementation group: 'io.spray', name: "spray-can_$scalaVersion", version: '1.3.3' testImplementation group: 'io.spray', name: "spray-routing_$scalaVersion", version: '1.3.1' - testImplementation project(':dd-java-agent:testing') + testImplementation project(':dd-java-agent:instrumentation-testing') } diff --git a/dd-java-agent/instrumentation/spring-security-5/build.gradle b/dd-java-agent/instrumentation/spring-security-5/build.gradle index 51bc36007cf..ccd52f1cdbf 100644 --- a/dd-java-agent/instrumentation/spring-security-5/build.gradle +++ b/dd-java-agent/instrumentation/spring-security-5/build.gradle @@ -15,7 +15,7 @@ final springBootVersion = '2.6.0' dependencies { compileOnly group: 'org.springframework.security', name: 'spring-security-core', version: springSecurityVersion - testImplementation testFixtures(project(':dd-java-agent:appsec')) + testImplementation project(':dd-java-agent:appsec:appsec-testing') testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: springBootVersion testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springBootVersion testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: springBootVersion diff --git a/dd-java-agent/instrumentation/spring-security-6/build.gradle b/dd-java-agent/instrumentation/spring-security-6/build.gradle index e746ed3f9c5..d9c70ee761a 100644 --- a/dd-java-agent/instrumentation/spring-security-6/build.gradle +++ b/dd-java-agent/instrumentation/spring-security-6/build.gradle @@ -17,7 +17,7 @@ tasks.withType(GroovyCompile).configureEach { dependencies { - testImplementation testFixtures(project(':dd-java-agent:appsec')) + testImplementation project(':dd-java-agent:appsec:appsec-testing') testImplementation project(':dd-java-agent:instrumentation:spring-security-5') testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: springBootVersion testImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: springBootVersion diff --git a/dd-java-agent/instrumentation/spring-webflux-5/build.gradle b/dd-java-agent/instrumentation/spring-webflux-5/build.gradle index 305c5c8f96b..9aa3af5549e 100644 --- a/dd-java-agent/instrumentation/spring-webflux-5/build.gradle +++ b/dd-java-agent/instrumentation/spring-webflux-5/build.gradle @@ -118,7 +118,7 @@ dependencies { } iastTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-reactor-netty', version: '2.0.+' iastTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-json', version: '2.0.+' - iastTestImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + iastTestImplementation project(':dd-java-agent:agent-iast:iast-testing') iastTestImplementation project(':dd-java-agent:instrumentation:jackson-core') iastTestImplementation project(':dd-java-agent:instrumentation:jackson-core:jackson-core-2.8') diff --git a/dd-java-agent/instrumentation/spring-webflux-6/build.gradle b/dd-java-agent/instrumentation/spring-webflux-6/build.gradle index c7af51aeaf6..5a12b4e3d27 100644 --- a/dd-java-agent/instrumentation/spring-webflux-6/build.gradle +++ b/dd-java-agent/instrumentation/spring-webflux-6/build.gradle @@ -66,7 +66,7 @@ dependencies { iastTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-reactor-netty', version: '3.0.0' iastTestImplementation group: 'org.springframework.boot', name: 'spring-boot-starter-json', version: '3.0.0' - iastTestImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + iastTestImplementation project(':dd-java-agent:agent-iast:iast-testing') iastTestImplementation project(':dd-java-agent:instrumentation:spring-webflux-5') iastTestImplementation project(':dd-java-agent:instrumentation:jackson-core') iastTestImplementation project(':dd-java-agent:instrumentation:jackson-core:jackson-core-2.12') diff --git a/dd-java-agent/instrumentation/spring-webmvc-3.1/build.gradle b/dd-java-agent/instrumentation/spring-webmvc-3.1/build.gradle index dfb49f6f882..bcbdd9695f8 100644 --- a/dd-java-agent/instrumentation/spring-webmvc-3.1/build.gradle +++ b/dd-java-agent/instrumentation/spring-webmvc-3.1/build.gradle @@ -42,11 +42,11 @@ dependencies { // compileOnly group: 'org.springframework', name: 'spring-webmvc', version: '2.5.6' // compileOnly group: 'javax.servlet', name: 'servlet-api', version: '2.4' - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude(module: 'jetty-server') // incompatible servlet api } - testImplementation testFixtures(project(':dd-java-agent:appsec')) + testImplementation project(':dd-java-agent:appsec:appsec-testing') // Include spring-beans instrumentation to test repairing bean definitions testImplementation project(':dd-java-agent:instrumentation:spring-beans') diff --git a/dd-java-agent/instrumentation/spring-webmvc-5.3/build.gradle b/dd-java-agent/instrumentation/spring-webmvc-5.3/build.gradle index e97b20a4438..adc69ebcbdb 100644 --- a/dd-java-agent/instrumentation/spring-webmvc-5.3/build.gradle +++ b/dd-java-agent/instrumentation/spring-webmvc-5.3/build.gradle @@ -14,7 +14,7 @@ dependencies { compileOnly group: 'org.springframework', name: 'spring-webmvc', version: '5.3.23' compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1' - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude(module: 'jetty-server') // incompatable servlet api } diff --git a/dd-java-agent/instrumentation/spring-webmvc-6.0/build.gradle b/dd-java-agent/instrumentation/spring-webmvc-6.0/build.gradle index 574ba859b3b..b1959b175e9 100644 --- a/dd-java-agent/instrumentation/spring-webmvc-6.0/build.gradle +++ b/dd-java-agent/instrumentation/spring-webmvc-6.0/build.gradle @@ -36,7 +36,7 @@ dependencies { implementation project(':dd-java-agent:instrumentation:span-origin') main_java17Implementation project(':dd-java-agent:instrumentation:span-origin') - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude(module: 'jetty-server') // incompatible servlet api } diff --git a/dd-java-agent/instrumentation/testng/build.gradle b/dd-java-agent/instrumentation/testng/build.gradle index dc239f8b9b6..d070d9a123c 100644 --- a/dd-java-agent/instrumentation/testng/build.gradle +++ b/dd-java-agent/instrumentation/testng/build.gradle @@ -7,7 +7,7 @@ apply from: "$rootDir/gradle/java.gradle" dependencies { compileOnly group: 'org.testng', name: 'testng', version: '6.4' - testFixturesApi testFixtures(project(':dd-java-agent:agent-ci-visibility')) + testFixturesApi project(':dd-java-agent:agent-ci-visibility:civisibility-testing') testFixturesImplementation group: 'org.testng', name: 'testng', version: '6.4' testFixturesApi group: 'org.apache.maven', name: 'maven-artifact', version: '3.9.9' diff --git a/dd-java-agent/instrumentation/tomcat-5.5/build.gradle b/dd-java-agent/instrumentation/tomcat-5.5/build.gradle index 003e3eb0753..d34c91b7808 100644 --- a/dd-java-agent/instrumentation/tomcat-5.5/build.gradle +++ b/dd-java-agent/instrumentation/tomcat-5.5/build.gradle @@ -94,7 +94,7 @@ dependencies { implementation project(':dd-java-agent:instrumentation:tomcat-5.5-common') - testImplementation(project(':dd-java-agent:testing')) { + testImplementation(project(':dd-java-agent:instrumentation-testing')) { exclude group: 'org.eclipse.jetty', module: 'jetty-server' } @@ -126,7 +126,7 @@ dependencies { latest10TestImplementation group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '10.+' latest10TestImplementation group: 'org.apache.tomcat.embed', name: 'tomcat-embed-websocket', version: '10.+' latest10TestImplementation group: 'org.apache.tomcat', name: 'jakartaee-migration', version: '1.+' - latest10TestImplementation(testFixtures(project(":dd-java-agent:appsec"))) + latest10TestImplementation project(":dd-java-agent:appsec:appsec-testing") latest10TestImplementation(project(':dd-java-agent:instrumentation:tomcat-appsec-6')) latest10TestImplementation(project(':dd-java-agent:instrumentation:tomcat-appsec-7')) @@ -135,7 +135,7 @@ dependencies { latestDepTestImplementation group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '11.+' latestDepTestImplementation group: 'org.apache.tomcat.embed', name: 'tomcat-embed-websocket', version: '11.+' latestDepTestImplementation group: 'org.apache.tomcat', name: 'jakartaee-migration', version: '1.+' - latestDepTestImplementation(testFixtures(project(":dd-java-agent:appsec"))) + latestDepTestImplementation project(":dd-java-agent:appsec:appsec-testing") latestDepTestRuntimeOnly(project(':dd-java-agent:instrumentation:tomcat-appsec-6')) latestDepTestRuntimeOnly(project(':dd-java-agent:instrumentation:tomcat-appsec-7')) diff --git a/dd-java-agent/instrumentation/vertx-web-3.4/build.gradle b/dd-java-agent/instrumentation/vertx-web-3.4/build.gradle index 777e6d9f3c9..d4b39e607fc 100644 --- a/dd-java-agent/instrumentation/vertx-web-3.4/build.gradle +++ b/dd-java-agent/instrumentation/vertx-web-3.4/build.gradle @@ -38,7 +38,7 @@ dependencies { testImplementation project(':dd-java-agent:instrumentation:netty-4.1') testImplementation project(':dd-java-agent:instrumentation:trace-annotation') - testImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + testImplementation project(':dd-java-agent:agent-iast:iast-testing') testRuntimeOnly project(':dd-java-agent:instrumentation:iast-instrumenter') @@ -47,7 +47,7 @@ dependencies { testImplementation group: 'org.mockito', name: 'mockito-inline', version: '4.11.0' - testImplementation testFixtures(project(':dd-java-agent:appsec')) + testImplementation project(':dd-java-agent:appsec:appsec-testing') latestDepTestImplementation group: 'io.vertx', name: 'vertx-web', version: '3.+' latestDepTestImplementation group: 'io.vertx', name: 'vertx-web-client', version: '3.+' diff --git a/dd-java-agent/instrumentation/vertx-web-3.9/build.gradle b/dd-java-agent/instrumentation/vertx-web-3.9/build.gradle index 5861f0980eb..4a17f96813f 100644 --- a/dd-java-agent/instrumentation/vertx-web-3.9/build.gradle +++ b/dd-java-agent/instrumentation/vertx-web-3.9/build.gradle @@ -32,7 +32,7 @@ dependencies { testImplementation project(':dd-java-agent:instrumentation:netty-4.1') testImplementation project(':dd-java-agent:instrumentation:trace-annotation') - testImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + testImplementation project(':dd-java-agent:agent-iast:iast-testing') testImplementation group: 'io.vertx', name: 'vertx-web', version: '3.9.0' testImplementation group: 'io.vertx', name: 'vertx-web-client', version: '3.9.0' diff --git a/dd-java-agent/instrumentation/vertx-web-4.0/build.gradle b/dd-java-agent/instrumentation/vertx-web-4.0/build.gradle index 0b0ebe88d4f..b0e5c127861 100644 --- a/dd-java-agent/instrumentation/vertx-web-4.0/build.gradle +++ b/dd-java-agent/instrumentation/vertx-web-4.0/build.gradle @@ -43,13 +43,13 @@ dependencies { testImplementation project(':dd-java-agent:instrumentation:netty-4.1') testImplementation project(':dd-java-agent:instrumentation:trace-annotation') - testImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + testImplementation project(':dd-java-agent:agent-iast:iast-testing') testRuntimeOnly project(':dd-java-agent:instrumentation:iast-instrumenter') testImplementation group: 'io.vertx', name: 'vertx-web', version: '4.0.0' testImplementation group: 'io.vertx', name: 'vertx-web-client', version: '4.0.0' - testImplementation testFixtures(project(':dd-java-agent:appsec')) + testImplementation project(':dd-java-agent:appsec:appsec-testing') testRuntimeOnly project(':dd-java-agent:instrumentation:jackson-core') testRuntimeOnly project(':dd-java-agent:instrumentation:netty-buffer-4') diff --git a/dd-java-agent/instrumentation/vertx-web-5.0/build.gradle b/dd-java-agent/instrumentation/vertx-web-5.0/build.gradle index c11c4b7ab13..0825e843b76 100644 --- a/dd-java-agent/instrumentation/vertx-web-5.0/build.gradle +++ b/dd-java-agent/instrumentation/vertx-web-5.0/build.gradle @@ -44,13 +44,13 @@ dependencies { testImplementation project(':dd-java-agent:instrumentation:vertx-web-4.0') testImplementation project(':dd-java-agent:instrumentation:trace-annotation') - testImplementation(testFixtures(project(':dd-java-agent:agent-iast'))) + testImplementation project(':dd-java-agent:agent-iast:iast-testing') testRuntimeOnly project(':dd-java-agent:instrumentation:iast-instrumenter') testImplementation group: 'io.vertx', name: 'vertx-web', version: vertxVersion testImplementation group: 'io.vertx', name: 'vertx-web-client', version: vertxVersion - testImplementation testFixtures(project(':dd-java-agent:appsec')) + testImplementation project(':dd-java-agent:appsec:appsec-testing') testRuntimeOnly project(':dd-java-agent:instrumentation:jackson-core') testRuntimeOnly project(':dd-java-agent:instrumentation:netty-buffer-4') diff --git a/dd-java-agent/instrumentation/weaver/build.gradle b/dd-java-agent/instrumentation/weaver/build.gradle index 7ce9ef1075a..734d0a01896 100644 --- a/dd-java-agent/instrumentation/weaver/build.gradle +++ b/dd-java-agent/instrumentation/weaver/build.gradle @@ -22,7 +22,7 @@ addTestSuiteForDir('weaver084Test', 'test') dependencies { compileOnly group: 'org.typelevel', name: 'weaver-cats_3', version: '0.9.0' - testImplementation testFixtures(project(':dd-java-agent:agent-ci-visibility')) + testImplementation project(':dd-java-agent:agent-ci-visibility:civisibility-testing') testImplementation group: 'org.scala-lang', name: 'scala-library', version: '2.12.20' testImplementation group: 'org.typelevel', name: 'weaver-cats_3', version: '0.9.0' diff --git a/dd-java-agent/testing/build.gradle b/dd-java-agent/testing/build.gradle index df2430f9433..800dd8ecd55 100644 --- a/dd-java-agent/testing/build.gradle +++ b/dd-java-agent/testing/build.gradle @@ -63,19 +63,6 @@ dependencies { implementation 'org.junit.platform:junit-platform-runner:1.9.0' implementation project(':dd-java-agent:appsec') - - implementation project(':dd-java-agent:agent-debugger') - - testImplementation project(':utils:test-utils') - testImplementation project(':dd-java-agent:instrumentation:trace-annotation') - - testImplementation group: 'cglib', name: 'cglib', version: '3.2.5' - // test instrumenting java 1.1 bytecode - testImplementation group: 'net.sf.jt400', name: 'jt400', version: '6.1' - - // We have autoservices defined in test subtree, looks like we need this to be able to properly rebuild this - testAnnotationProcessor libs.autoservice.processor - testCompileOnly libs.autoservice.annotation } shadowJar { @@ -88,16 +75,5 @@ shadowJar { } tasks.withType(Test).configureEach { - // SpockRunner that we use to run agent tests cannot be properly ported to JUnit 5, - // since the framework does not provide the hooks / extension points - // that can be used to shadow the tested class. - - // In order to mitigate this, SpockRunner extends JUnitPlatform, - // which is a JUnit 4 runner that allows executing JUnit 5 tests in a JUnit 4 environment - // (i.e. running them as JUnit 4 tests). - - // So even though Spock 2 tests run on top of JUnit 5, - // we execute them in "compatibility mode" so that SpockRunner could shadow the test class - // See https://junit.org/junit5/docs/current/user-guide/#running-tests-junit-platform-runner for more details. - useJUnit() + useJUnitPlatform() } diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/SpockRunner.java b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/SpockRunner.java deleted file mode 100644 index 80160b59e9f..00000000000 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/SpockRunner.java +++ /dev/null @@ -1,285 +0,0 @@ -package datadog.trace.agent.test; - -import com.google.common.reflect.ClassPath; -import datadog.trace.agent.test.utils.ClasspathUtils; -import datadog.trace.bootstrap.BootstrapProxy; -import java.io.File; -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; -import java.util.jar.JarFile; -import net.bytebuddy.agent.ByteBuddyAgent; -import net.bytebuddy.dynamic.ClassFileLocator; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.notification.Failure; -import org.junit.runner.notification.RunListener; -import org.junit.runner.notification.RunNotifier; -import org.spockframework.mock.IMockInvocation; -import org.spockframework.mock.TooManyInvocationsError; - -/** - * Runs a spock test in an agent-friendly way. - * - *
    - *
  • Adds agent bootstrap classes to bootstrap classpath. - *
- */ -public class SpockRunner extends JUnitPlatform { - /** - * An exact copy of {@link datadog.trace.bootstrap.Constants#BOOTSTRAP_PACKAGE_PREFIXES}. - * - *

This list is needed to initialize the bootstrap classpath because Utils' static initializer - * references bootstrap classes (e.g. DatadogClassLoader). - */ - public static final String[] BOOTSTRAP_PACKAGE_PREFIXES_COPY = { - "datadog.slf4j", - "datadog.context", - "datadog.environment", - "datadog.json", - "datadog.yaml", - "datadog.appsec.api", - "datadog.trace.api", - "datadog.trace.bootstrap", - "datadog.trace.context", - "datadog.trace.instrumentation.api", - "datadog.trace.logging", - "datadog.trace.util", - }; - - private static final String[] TEST_EXCLUDED_BOOTSTRAP_PACKAGE_PREFIXES = { - "ch.qos.logback.classic.servlet", // this draws javax.servlet deps that are not needed - }; - - private static final String[] TEST_BOOTSTRAP_PREFIXES; - - static { - ByteBuddyAgent.install(); - final String[] testBS = { - "org.slf4j", "ch.qos.logback", - }; - - TEST_BOOTSTRAP_PREFIXES = - Arrays.copyOf( - BOOTSTRAP_PACKAGE_PREFIXES_COPY, - BOOTSTRAP_PACKAGE_PREFIXES_COPY.length + testBS.length); - for (int i = 0; i < testBS.length; ++i) { - TEST_BOOTSTRAP_PREFIXES[i + BOOTSTRAP_PACKAGE_PREFIXES_COPY.length] = testBS[i]; - } - - setupBootstrapClasspath(); - } - - private final InstrumentationClassLoader customLoader; - - public SpockRunner(final Class clazz) - throws NoSuchFieldException, SecurityException, IllegalArgumentException, - IllegalAccessException { - super(shadowTestClass(clazz)); - assertNoBootstrapClassesInTestClass(clazz); - // access the classloader created in shadowTestClass above - final Field clazzField = JUnitPlatform.class.getDeclaredField("testClass"); - try { - clazzField.setAccessible(true); - customLoader = - (InstrumentationClassLoader) ((Class) clazzField.get(this)).getClassLoader(); - } finally { - clazzField.setAccessible(false); - } - } - - private static void assertNoBootstrapClassesInTestClass(final Class testClass) { - for (final Field field : testClass.getDeclaredFields()) { - assertNotBootstrapClass(testClass, field.getType()); - } - - for (final Method method : testClass.getDeclaredMethods()) { - assertNotBootstrapClass(testClass, method.getReturnType()); - for (final Class paramType : method.getParameterTypes()) { - assertNotBootstrapClass(testClass, paramType); - } - } - } - - private static void assertNotBootstrapClass(final Class testClass, final Class clazz) { - if ((!clazz.isPrimitive()) && isBootstrapClass(clazz.getName())) { - throw new IllegalStateException( - testClass.getName() - + ": Bootstrap classes are not allowed in test class field or method signatures. Offending class: " - + clazz.getName()); - } - } - - private static boolean isBootstrapClass(final String className) { - for (int i = 0; i < TEST_BOOTSTRAP_PREFIXES.length; ++i) { - if (className.startsWith(TEST_BOOTSTRAP_PREFIXES[i])) { - return Arrays.stream(TEST_EXCLUDED_BOOTSTRAP_PACKAGE_PREFIXES) - .noneMatch(className::startsWith); - } - } - return false; - } - - // Shadow the test class with bytes loaded by InstrumentationClassLoader - private static Class shadowTestClass(final Class clazz) { - try { - final InstrumentationClassLoader customLoader = - new InstrumentationClassLoader( - datadog.trace.agent.test.SpockRunner.class.getClassLoader(), clazz.getName()); - return customLoader.shadow(clazz); - } catch (final Exception e) { - throw new IllegalStateException(e); - } - } - - @Override - public void run(final RunNotifier notifier) { - final ClassLoader contextLoader = Thread.currentThread().getContextClassLoader(); - final RunListener listener = new TooManyInvocationsErrorListener(); - try { - Thread.currentThread().setContextClassLoader(customLoader); - notifier.addFirstListener(listener); - super.run(notifier); - } finally { - notifier.removeListener(listener); - Thread.currentThread().setContextClassLoader(contextLoader); - } - } - - private static void setupBootstrapClasspath() { - // Ensure there weren't any bootstrap classes loaded prematurely. - Set prematureBootstrapClasses = new TreeSet<>(); - for (Class clazz : ByteBuddyAgent.getInstrumentation().getAllLoadedClasses()) { - if (isBootstrapClass(clazz.getName()) - && clazz.getClassLoader() != null - && !clazz.getName().equals("datadog.trace.api.DisableTestTrace") - && !clazz.getName().startsWith("org.slf4j")) { - prematureBootstrapClasses.add(clazz.getName()); - } - } - if (!prematureBootstrapClasses.isEmpty()) { - throw new AssertionError( - prematureBootstrapClasses.size() - + " classes were loaded before bootstrap classpath was initialized: " - + prematureBootstrapClasses); - } - try { - final File bootstrapJar = createBootstrapJar(); - ByteBuddyAgent.getInstrumentation() - .appendToBootstrapClassLoaderSearch(new JarFile(bootstrapJar)); - // Utils cannot be referenced before this line, as its static initializers load bootstrap - // classes (for example, the bootstrap proxy). - BootstrapProxy.addBootstrapResource(bootstrapJar.toURI().toURL()); - } catch (final IOException e) { - throw new RuntimeException(e); - } - } - - private static File createBootstrapJar() throws IOException { - final Set bootstrapClasses = new HashSet<>(); - for (final ClassPath.ClassInfo info : ClasspathUtils.getTestClasspath().getAllClasses()) { - // if info starts with bootstrap prefix: add to bootstrap jar - if (isBootstrapClass(info.getName())) { - bootstrapClasses.add(info.getResourceName()); - } - } - return new File( - ClasspathUtils.createJarWithClasses( - AgentTestRunner.class.getClassLoader(), bootstrapClasses.toArray(new String[0])) - .getFile()); - } - - /** Run test classes in a classloader which loads test classes before delegating. */ - private static class InstrumentationClassLoader extends java.lang.ClassLoader { - final ClassLoader parent; - final String shadowPrefix; - - public InstrumentationClassLoader(final ClassLoader parent, final String shadowPrefix) { - super(parent); - this.parent = parent; - this.shadowPrefix = shadowPrefix; - } - - /** Forcefully inject the bytes of clazz into this classloader. */ - public Class shadow(final Class clazz) throws IOException { - final Class loaded = findLoadedClass(clazz.getName()); - if (loaded != null && loaded.getClassLoader() == this) { - return loaded; - } - final ClassFileLocator locator = ClassFileLocator.ForClassLoader.of(clazz.getClassLoader()); - final byte[] classBytes = locator.locate(clazz.getName()).resolve(); - - return defineClass(clazz.getName(), classBytes, 0, classBytes.length); - } - - @Override - protected Class loadClass(final String name, final boolean resolve) - throws ClassNotFoundException { - synchronized (super.getClassLoadingLock(name)) { - final Class c = findLoadedClass(name); - if (c != null) { - return c; - } - if (name.startsWith(shadowPrefix)) { - try { - return shadow(super.loadClass(name, resolve)); - } catch (final Exception e) { - } - } - - return parent.loadClass(name); - } - } - } - - /** - * This class tries to fix {@link TooManyInvocationsError} exceptions when the assertion error is - * caught by a mock triggering a stack overflow while composing the failure message. - */ - @SuppressWarnings("ResultOfMethodCallIgnored") - @RunListener.ThreadSafe - private static class TooManyInvocationsErrorListener extends RunListener { - - @Override - public void testFailure(final Failure failure) throws Exception { - if (failure.getException() instanceof TooManyInvocationsError) { - final TooManyInvocationsError assertion = (TooManyInvocationsError) failure.getException(); - try { - // try to trigger an error (e.g. stack overflow) - assertion.getMessage(); - } catch (final Throwable e) { - fixTooManyInvocationsError(assertion); - } - } - } - - private void fixTooManyInvocationsError(final TooManyInvocationsError error) { - final List accepted = error.getAcceptedInvocations(); - for (final IMockInvocation invocation : accepted) { - try { - invocation.toString(); - } catch (final Throwable t) { - final List arguments = invocation.getArguments(); - for (int i = 0; i < arguments.size(); i++) { - final Object arg = arguments.get(i); - if (arg instanceof AssertionError) { - final AssertionError updatedAssertion = - new AssertionError( - "'" - + arg.getClass().getName() - + "' hidden due to '" - + t.getClass().getName() - + "'", - t); - invocation.getArguments().set(i, updatedAssertion); - } - } - } - } - } - } -} diff --git a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ClasspathUtils.java b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ClasspathUtils.java index 3d0887d0e93..30a9b0f2727 100644 --- a/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ClasspathUtils.java +++ b/dd-java-agent/testing/src/main/groovy/datadog/trace/agent/test/utils/ClasspathUtils.java @@ -1,30 +1,20 @@ package datadog.trace.agent.test.utils; -import static com.google.common.base.StandardSystemProperty.JAVA_CLASS_PATH; -import static com.google.common.base.StandardSystemProperty.PATH_SEPARATOR; import static datadog.trace.util.Strings.getResourceName; -import com.google.common.base.Splitter; -import com.google.common.collect.ImmutableList; -import com.google.common.reflect.ClassPath; -import datadog.trace.agent.test.AgentTestRunner; -import de.thetaphi.forbiddenapis.SuppressForbidden; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Method; -import java.net.MalformedURLException; import java.net.URL; -import java.net.URLClassLoader; import java.util.UUID; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; public class ClasspathUtils { - private static final ClassPath testClasspath = computeTestClasspath(); public static byte[] convertToByteArray(final InputStream resource) throws IOException { final ByteArrayOutputStream buffer = new ByteArrayOutputStream(); @@ -119,46 +109,6 @@ private static void addToJar( jarOutputStream.closeEntry(); } - public static ClassPath getTestClasspath() { - return testClasspath; - } - - private static ClassPath computeTestClasspath() { - ClassLoader testClassLoader = AgentTestRunner.class.getClassLoader(); - if (!(testClassLoader instanceof URLClassLoader)) { - // java9's system loader does not extend URLClassLoader - // which breaks Guava ClassPath lookup - testClassLoader = buildJavaClassPathClassLoader(); - } - try { - return ClassPath.from(testClassLoader); - } catch (final IOException e) { - throw new RuntimeException(e); - } - } - - /** - * Parse JVM classpath and return ClassLoader containing all classpath entries. Inspired by Guava. - */ - @SuppressForbidden - private static ClassLoader buildJavaClassPathClassLoader() { - final ImmutableList.Builder urls = ImmutableList.builder(); - for (final String entry : Splitter.on(PATH_SEPARATOR.value()).split(JAVA_CLASS_PATH.value())) { - try { - try { - urls.add(new File(entry).toURI().toURL()); - } catch (final SecurityException e) { // File.toURI checks to see if the file is a directory - urls.add(new URL("file", null, new File(entry).getAbsolutePath())); - } - } catch (final MalformedURLException e) { - System.err.println( - String.format( - "Error injecting bootstrap jar: Malformed classpath entry: %s. %s", entry, e)); - } - } - return new URLClassLoader(urls.build().toArray(new URL[0]), null); - } - // Moved this to a java class because groovy was adding a hard ref to classLoader public static boolean isClassLoaded(final String className, final ClassLoader classLoader) { try { diff --git a/dd-java-agent/testing/src/test/groovy/TooManyInvocationsErrorListenerTest.groovy b/dd-java-agent/testing/src/test/groovy/TooManyInvocationsErrorListenerTest.groovy deleted file mode 100644 index 265a63e8fc0..00000000000 --- a/dd-java-agent/testing/src/test/groovy/TooManyInvocationsErrorListenerTest.groovy +++ /dev/null @@ -1,38 +0,0 @@ -import datadog.trace.agent.test.AgentTestRunner -import datadog.trace.agent.test.SpockRunner -import org.junit.runner.Description -import org.junit.runner.notification.Failure -import org.spockframework.mock.IMockInteraction -import org.spockframework.mock.IMockMethod -import org.spockframework.mock.IMockObject -import org.spockframework.mock.IResponseGenerator -import org.spockframework.mock.TooManyInvocationsError -import org.spockframework.mock.runtime.MockInvocation - -class TooManyInvocationsErrorListenerTest extends AgentTestRunner { - - @SuppressWarnings('GroovyAccessibility') - void 'test that listener modifies failure'() { - setup: - final error = new TooManyInvocationsError(Stub(IMockInteraction), []) - error.acceptedInvocations.add(new MockInvocation(Stub(IMockObject), - Stub(IMockMethod), - [error], - Stub(IResponseGenerator))) - final failure = new Failure(new Description(TooManyInvocationsErrorListenerTest, 'test'), error) - - when: - failure.getMessage() - - then: - thrown(StackOverflowError) - - when: - final listener = new SpockRunner.TooManyInvocationsErrorListener() - listener.testFailure(failure) - failure.getMessage() - - then: - noExceptionThrown() - } -} diff --git a/dd-smoke-tests/backend-mock/build.gradle b/dd-smoke-tests/backend-mock/build.gradle index 76f6e1754a6..3cf1063e21b 100644 --- a/dd-smoke-tests/backend-mock/build.gradle +++ b/dd-smoke-tests/backend-mock/build.gradle @@ -3,5 +3,5 @@ description = 'Mock Datadog backend used by smoke tests.' dependencies { api project(':dd-smoke-tests') - api testFixtures(project(':dd-java-agent:agent-ci-visibility')) + api project(':dd-java-agent:agent-ci-visibility:civisibility-testing') } diff --git a/gradle/configure_tests.gradle b/gradle/configure_tests.gradle index 8372369fa7d..2e94c1c5fc7 100644 --- a/gradle/configure_tests.gradle +++ b/gradle/configure_tests.gradle @@ -61,7 +61,7 @@ tasks.withType(Test).configureEach { exclude "**/TestRepeated*" exclude "**/TestTemplate*" exclude "**/TestDisableTestTrace*" - exclude "**/TestAssumption*" + exclude "**/TestAssumption*", "**/TestSuiteSetUpAssumption*" exclude "**/TestParameterized*" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 70bbfb5679f..cb685ab0f0e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -112,11 +112,13 @@ include( include( ":dd-java-agent:appsec", + ":dd-java-agent:appsec:appsec-testing", ) // ci-visibility include( ":dd-java-agent:agent-ci-visibility", + ":dd-java-agent:agent-ci-visibility:civisibility-testing", ) // llm-observability @@ -127,6 +129,7 @@ include( // iast include( ":dd-java-agent:agent-iast", + ":dd-java-agent:agent-iast:iast-testing", ) include( @@ -240,6 +243,11 @@ include( ":dd-java-agent:instrumentation-annotation-processor", ) +// utilities and fixtures for instrumentation tests +include( + ":dd-java-agent:instrumentation-testing", +) + // instrumentation: include( ":dd-java-agent:instrumentation:aerospike-4",