diff --git a/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsUtils.kt b/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsUtils.kt index f8e70ed186b..a8c5ddf69f6 100644 --- a/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsUtils.kt +++ b/buildSrc/src/main/kotlin/datadog/gradle/plugin/testJvmConstraints/TestJvmConstraintsUtils.kt @@ -33,12 +33,12 @@ private fun TestJvmConstraintsExtension.withinAllowedRange(currentJvmVersion: Ja val definedMax = maxJavaVersion.isPresent if (definedMin && (minJavaVersion.get()) > currentJvmVersion) { - logger.info("isWithinAllowedRange returns false b/o minProp=${minJavaVersion.get()} is defined and greater than version=$currentJvmVersion") + logger.info("'isWithinAllowedRange' returns false b/o testJvmConstraints.minJavaVersion=${minJavaVersion.get()} is defined and greater than test JVM version=$currentJvmVersion") return false } if (definedMax && (maxJavaVersion.get()) < currentJvmVersion) { - logger.info("isWithinAllowedRange returns false b/o maxProp=${maxJavaVersion.get()} is defined and lower than version=$currentJvmVersion") + logger.info("'isWithinAllowedRange' returns false because testJvmConstraints.maxJavaVersion=${maxJavaVersion.get()} is defined and lower than test JVM version=$currentJvmVersion") return false } diff --git a/dd-java-agent/instrumentation/play/play-2.3/.gitignore b/dd-java-agent/instrumentation/play/play-2.3/.gitignore deleted file mode 100644 index 5292519a25e..00000000000 --- a/dd-java-agent/instrumentation/play/play-2.3/.gitignore +++ /dev/null @@ -1 +0,0 @@ -logs/ \ No newline at end of file diff --git a/dd-java-agent/instrumentation/play/play-2.3/build.gradle b/dd-java-agent/instrumentation/play/play-2.3/build.gradle index 13aff562fe7..b6871bc0b14 100644 --- a/dd-java-agent/instrumentation/play/play-2.3/build.gradle +++ b/dd-java-agent/instrumentation/play/play-2.3/build.gradle @@ -60,5 +60,5 @@ dependencies { } tasks.named("compileLatestDepTestGroovy", GroovyCompile) { - classpath += files(tasks.named('compileLatestDepTestScala').map { it.destinationDirectory }) + classpath += files(tasks.named('compileLatestDepTestScala')) } diff --git a/dd-java-agent/instrumentation/play/play-2.4/.gitignore b/dd-java-agent/instrumentation/play/play-2.4/.gitignore deleted file mode 100644 index 5292519a25e..00000000000 --- a/dd-java-agent/instrumentation/play/play-2.4/.gitignore +++ /dev/null @@ -1 +0,0 @@ -logs/ \ No newline at end of file diff --git a/dd-java-agent/instrumentation/play/play-2.6/.gitignore b/dd-java-agent/instrumentation/play/play-2.6/.gitignore deleted file mode 100644 index 5292519a25e..00000000000 --- a/dd-java-agent/instrumentation/play/play-2.6/.gitignore +++ /dev/null @@ -1 +0,0 @@ -logs/ \ No newline at end of file diff --git a/dd-java-agent/instrumentation/play/play-2.6/build.gradle b/dd-java-agent/instrumentation/play/play-2.6/build.gradle index 08c448d2e4f..472f5894c77 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/build.gradle +++ b/dd-java-agent/instrumentation/play/play-2.6/build.gradle @@ -1,14 +1,11 @@ -def scalaVersion = '2.11' -def playVersion = '2.6.0' - muzzle { extraRepository("typesafe", "https://repo.typesafe.com/typesafe/maven-releases/") pass { name = 'play26Plus' group = 'com.typesafe.play' - module = "play_$scalaVersion" - versions = "[$playVersion,)" + module = "play_2.11" + versions = "[2.6.0,)" assertInverse = true javaVersion = 11 } @@ -16,7 +13,7 @@ muzzle { name = 'play26Plus' group = 'com.typesafe.play' module = 'play_2.12' - versions = "[$playVersion,)" + versions = "[2.6.0,)" assertInverse = true javaVersion = 11 } @@ -24,11 +21,10 @@ muzzle { name = 'play26Plus' group = 'com.typesafe.play' module = 'play_2.13' - versions = "[$playVersion,)" + versions = "[2.6.0,)" assertInverse = true javaVersion = 11 } - pass { name = 'play26Only' group = 'com.typesafe.play' @@ -36,19 +32,12 @@ muzzle { versions = "[2.6.0,2.7.0)" assertInverse = true } - - pass { - name = 'play27' - group = 'com.typesafe.play' - module = 'play-java_2.13' - versions = "[2.7.0,)" - assertInverse = true - javaVersion = 11 - } } apply from: "$rootDir/gradle/java.gradle" apply plugin: 'scala' +apply plugin: 'groovy' +apply plugin: 'java-test-fixtures' testJvmConstraints { // Play doesn't work with Java 9+ until 2.6.12 @@ -64,49 +53,22 @@ repositories { } } -addTestSuite('baseTest') -addTestSuite('latestDepTest') - -sourceSets { - main_play27 { - java.srcDirs "${project.projectDir}/src/main/java_play27" - } -} - -tasks.named("jar", Jar) { - from sourceSets.main_play27.output -} - -tasks.named("compileMain_play27Java", JavaCompile) { - dependsOn(compileJava) -} - -project.afterEvaluate { - tasks.named('instrumentJava') { dependsOn 'compileMain_play27Java' } - tasks.named('forbiddenApisMain_play27') { dependsOn 'instrumentMain_play27Java' } -} - -instrument { - additionalClasspath = [ - instrumentJava: compileMain_play27Java.destinationDirectory - ] -} - dependencies { - compileOnly group: 'com.typesafe.play', name: "play_$scalaVersion", version: playVersion - compileOnly group: 'com.typesafe.play', name: "play-java_$scalaVersion", version: playVersion + compileOnly group: 'com.typesafe.play', name: "play_2.11", version: '2.6.0' + compileOnly group: 'com.typesafe.play', name: "play-java_2.11", version: '2.6.0' - main_play27CompileOnly group: 'com.typesafe.play', name: "play-java_$scalaVersion", version: '2.7.0' - main_play27CompileOnly project(':internal-api') - main_play27CompileOnly project(':dd-java-agent:agent-tooling') - main_play27CompileOnly project(':dd-java-agent:agent-bootstrap') - main_play27CompileOnly files("${project.buildDir}/classes/java/raw") { - builtBy = ['compileJava'] + testFixturesCompileOnly group: 'com.typesafe.play', name: "play-java_2.11", version: '2.6.0' + // TODO: Play WS is a separately versioned library starting with 2.6 and needs separate instrumentation. + testFixturesCompileOnly(group: 'com.typesafe.play', name: "play-test_2.11", version: '2.6.0') { + exclude group: 'org.eclipse.jetty.websocket', module: 'websocket-client' } + testFixturesApi project(':dd-java-agent:instrumentation-testing') + testFixturesApi libs.spock.core - baseTestImplementation group: 'com.typesafe.play', name: "play-java_$scalaVersion", version: playVersion - // TODO: Play WS is a separately versioned library starting with 2.6 and needs separate instrumentation. - baseTestImplementation(group: 'com.typesafe.play', name: "play-test_$scalaVersion", version: playVersion) { + testImplementation group: 'com.typesafe.play', name: "play-java_2.11", version: '2.6.0' + testImplementation testFixtures(project(':dd-java-agent:instrumentation:play:play-2.6')) + testImplementation group: 'com.typesafe.play', name: "play-java_2.11", version: '2.6.0' + testImplementation(group: 'com.typesafe.play', name: "play-test_2.11", version: '2.6.0') { exclude group: 'org.eclipse.jetty.websocket', module: 'websocket-client' } @@ -117,96 +79,5 @@ dependencies { testRuntimeOnly project(':dd-java-agent:instrumentation:scala:scala-concurrent-2.8') testRuntimeOnly project(':dd-java-agent:instrumentation:scala:scala-promise:scala-promise-2.10') testRuntimeOnly project(':dd-java-agent:instrumentation:scala:scala-promise:scala-promise-2.13') - - latestDepTestRuntimeOnly sourceSets.baseTest.output - latestDepTestImplementation libs.scala213 - latestDepTestImplementation group: 'com.typesafe.play', name: "play-java_2.13", version: '2.+' - latestDepTestImplementation(group: 'com.typesafe.play', name: "play-test_2.13", version: '2.+') { - exclude group: 'org.eclipse.jetty.websocket', module: 'websocket-client' - } - latestDepTestImplementation group: 'com.typesafe.play', name: 'play-akka-http-server_2.13', version: '2.+' } -configurations.matching({ it.name.startsWith('latestDepTest') }).configureEach({ - it.resolutionStrategy { - // logback-classic 1.4.11 doesn't like being loaded in the bootstrap classloader (NPE) - force group: 'ch.qos.logback', name: 'logback-classic', version: '1.4.5' - } -}) - -tasks.named("compileLatestDepTestJava", JavaCompile) { - configureCompiler(it, 11) -} - -tasks.named("compileLatestDepTestScala", ScalaCompile) { - configureCompiler(it, 11) - classpath = classpath + files(tasks.named('compileBaseTestJava').map { it.destinationDirectory }) -} - -tasks.named("latestDepTest", Test) { - javaLauncher = getJavaLauncherFor(11) - testClassesDirs = testClassesDirs + sourceSets.baseTest.output.classesDirs -} - -final generatedRoutes = layout.buildDirectory.dir('generated/sources/latestDepTestRoutes/scala') -sourceSets { - routeGenerator { - scala { - srcDir "${project.projectDir}/src/routeGenerator/scala" - } - } - latestDepTestGenerated { - scala { - srcDir generatedRoutes - } - } -} - -dependencies { - routeGeneratorImplementation libs.scala213 - routeGeneratorImplementation group: 'com.typesafe.play', name: "routes-compiler_2.13", version: '2.+' -} - -configurations { - latestDepTestGeneratedCompileClasspath.extendsFrom(latestDepTestCompileClasspath) -} - -tasks.register('buildLatestDepTestRoutes', JavaExec) { - String routesFile = "${project.projectDir}/src/latestDepTest/routes/conf/routes" - def outputDir = generatedRoutes - - it.inputs.file routesFile - it.outputs.dir outputDir - - it.mainClass = 'generator.CompileRoutes' - it.args routesFile, outputDir.get().asFile.absolutePath - - it.classpath configurations.named('routeGeneratorRuntimeClasspath') - it.classpath tasks.named('compileRouteGeneratorScala').map { it.destinationDirectory } - it.classpath tasks.named('compileLatestDepTestScala').map { it.destinationDirectory } - - it.javaLauncher = getJavaLauncherFor(11) -} - -tasks.named("compileLatestDepTestGeneratedScala", ScalaCompile) { - configureCompiler(it, 11) - classpath = classpath + files(tasks.named('compileLatestDepTestScala').map { it.destinationDirectory }) - dependsOn 'buildLatestDepTestRoutes' -} - -tasks.named("forbiddenApisLatestDepTestGenerated") { - enabled = false -} - -tasks.named("compileLatestDepTestGroovy", GroovyCompile) { - configureCompiler(it, 11) - classpath = classpath + - files(tasks.named('compileLatestDepTestScala').map { it.destinationDirectory }) + - files(tasks.named('compileBaseTestGroovy').map { it.destinationDirectory }) + - files(tasks.named('compileBaseTestJava').map { it.destinationDirectory }) + - files(tasks.named('compileLatestDepTestGeneratedScala').map { it.destinationDirectory }) -} - -dependencies { - latestDepTestRuntimeOnly sourceSets.latestDepTestGenerated.output -} diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayAsyncServerTest.groovy b/dd-java-agent/instrumentation/play/play-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayAsyncServerTest.groovy similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayAsyncServerTest.groovy rename to dd-java-agent/instrumentation/play/play-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayAsyncServerTest.groovy diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayAsyncServerWithErrorHandlerTest.groovy b/dd-java-agent/instrumentation/play/play-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayAsyncServerWithErrorHandlerTest.groovy similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayAsyncServerWithErrorHandlerTest.groovy rename to dd-java-agent/instrumentation/play/play-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayAsyncServerWithErrorHandlerTest.groovy diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayServerTest.groovy b/dd-java-agent/instrumentation/play/play-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayServerTest.groovy new file mode 100644 index 00000000000..5f42d474c10 --- /dev/null +++ b/dd-java-agent/instrumentation/play/play-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayServerTest.groovy @@ -0,0 +1,50 @@ +package datadog.trace.instrumentation.play26.server + +class PlayServerTest extends AbstractPlayServerTest { + // Disabling involving Appsec / Instrumentation Gateway, they are tested in play-appsec-2.x modules + + @Override + boolean testBlocking() { + false + } + + @Override + boolean testBlockingOnResponse() { + false + } + + @Override + boolean testRequestBody() { + false + } + + @Override + boolean testBodyJson() { + false + } + + @Override + boolean testBodyUrlencoded() { + false + } + + @Override + boolean testBodyMultipart() { + false + } + + @Override + boolean testResponseBodyJson() { + false + } + + @Override + Map expectedIGPathParams() { + null + } + + @Override + boolean testBodyXml() { + false + } +} diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayServerWithErrorHandlerTest.groovy b/dd-java-agent/instrumentation/play/play-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayServerWithErrorHandlerTest.groovy new file mode 100644 index 00000000000..d64f38092a8 --- /dev/null +++ b/dd-java-agent/instrumentation/play/play-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayServerWithErrorHandlerTest.groovy @@ -0,0 +1,50 @@ +package datadog.trace.instrumentation.play26.server + +class PlayServerWithErrorHandlerTest extends AbstractPlayServerWithErrorHandlerTest { + // Disabling involving Appsec / Instrumentation Gateway, they are tested in play-appsec-2.x modules + + @Override + boolean testBlocking() { + false + } + + @Override + boolean testBlockingOnResponse() { + false + } + + @Override + boolean testRequestBody() { + false + } + + @Override + boolean testBodyJson() { + false + } + + @Override + boolean testBodyUrlencoded() { + false + } + + @Override + boolean testBodyMultipart() { + false + } + + @Override + boolean testResponseBodyJson() { + false + } + + @Override + Map expectedIGPathParams() { + null + } + + @Override + boolean testBodyXml() { + false + } +} diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayServerTest.groovy b/dd-java-agent/instrumentation/play/play-2.6/src/testFixtures/groovy/datadog/trace/instrumentation/play26/server/AbstractPlayServerTest.groovy similarity index 96% rename from dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayServerTest.groovy rename to dd-java-agent/instrumentation/play/play-2.6/src/testFixtures/groovy/datadog/trace/instrumentation/play26/server/AbstractPlayServerTest.groovy index 2f5b1f27f96..26d00882753 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayServerTest.groovy +++ b/dd-java-agent/instrumentation/play/play-2.6/src/testFixtures/groovy/datadog/trace/instrumentation/play26/server/AbstractPlayServerTest.groovy @@ -11,6 +11,7 @@ import groovy.transform.CompileStatic import okhttp3.MediaType import okhttp3.RequestBody import play.server.Server +import spock.lang.IgnoreIf import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.BODY_XML import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.CUSTOM_EXCEPTION @@ -18,7 +19,7 @@ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.EXCEPT import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.FORWARDED import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.SUCCESS -class PlayServerTest extends HttpServerTest { +class AbstractPlayServerTest extends HttpServerTest { @Override @CompileStatic @@ -151,6 +152,11 @@ class PlayServerTest extends HttpServerTest { } } + boolean testBodyXml() { + true + } + + @IgnoreIf({ !instance.testBodyXml() }) def 'test instrumentation gateway xml request body'() { setup: def request = request( diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayServerWithErrorHandlerTest.groovy b/dd-java-agent/instrumentation/play/play-2.6/src/testFixtures/groovy/datadog/trace/instrumentation/play26/server/AbstractPlayServerWithErrorHandlerTest.groovy similarity index 93% rename from dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayServerWithErrorHandlerTest.groovy rename to dd-java-agent/instrumentation/play/play-2.6/src/testFixtures/groovy/datadog/trace/instrumentation/play26/server/AbstractPlayServerWithErrorHandlerTest.groovy index 6221c5681ce..22adcc7b3eb 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayServerWithErrorHandlerTest.groovy +++ b/dd-java-agent/instrumentation/play/play-2.6/src/testFixtures/groovy/datadog/trace/instrumentation/play26/server/AbstractPlayServerWithErrorHandlerTest.groovy @@ -1,11 +1,11 @@ package datadog.trace.instrumentation.play26.server +import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.CUSTOM_EXCEPTION + import datadog.trace.agent.test.base.HttpServer import spock.lang.IgnoreIf -import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.CUSTOM_EXCEPTION - -class PlayServerWithErrorHandlerTest extends PlayServerTest { +abstract class AbstractPlayServerWithErrorHandlerTest extends AbstractPlayServerTest { @Override HttpServer server() { new PlayHttpServer(PlayRouters.&sync, new TestHttpErrorHandler()) diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayHttpServer.groovy b/dd-java-agent/instrumentation/play/play-2.6/src/testFixtures/groovy/datadog/trace/instrumentation/play26/server/PlayHttpServer.groovy similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayHttpServer.groovy rename to dd-java-agent/instrumentation/play/play-2.6/src/testFixtures/groovy/datadog/trace/instrumentation/play26/server/PlayHttpServer.groovy diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayRouters.groovy b/dd-java-agent/instrumentation/play/play-2.6/src/testFixtures/groovy/datadog/trace/instrumentation/play26/server/PlayRouters.groovy similarity index 96% rename from dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayRouters.groovy rename to dd-java-agent/instrumentation/play/play-2.6/src/testFixtures/groovy/datadog/trace/instrumentation/play26/server/PlayRouters.groovy index c2226b78f6d..41195d7ac33 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/baseTest/groovy/datadog/trace/instrumentation/play26/server/PlayRouters.groovy +++ b/dd-java-agent/instrumentation/play/play-2.6/src/testFixtures/groovy/datadog/trace/instrumentation/play26/server/PlayRouters.groovy @@ -41,23 +41,14 @@ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.REDIRE import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.SUCCESS import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.USER_BLOCK import static datadog.trace.agent.test.base.HttpServerTest.controller -import static java.lang.Class.forName class PlayRouters { static Router sync(BuiltInComponents components) { - try { - forName("datadog.trace.instrumentation.play26.server.latestdep.PlayRouters").sync components - } catch (ClassNotFoundException cnf) { - sync26(components) - } + sync26(components) } static Router async(ExecutorService executor, BuiltInComponents components) { - try { - forName("datadog.trace.instrumentation.play26.server.latestdep.PlayRouters").async executor, components - } catch (ClassNotFoundException cnf) { - async26(executor, components) - } + async26(executor, components) } private static Router sync26(BuiltInComponents components) { diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/baseTest/java/datadog/trace/instrumentation/play26/server/TestHttpErrorHandler.java b/dd-java-agent/instrumentation/play/play-2.6/src/testFixtures/java/datadog/trace/instrumentation/play26/server/TestHttpErrorHandler.java similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/baseTest/java/datadog/trace/instrumentation/play26/server/TestHttpErrorHandler.java rename to dd-java-agent/instrumentation/play/play-2.6/src/testFixtures/java/datadog/trace/instrumentation/play26/server/TestHttpErrorHandler.java diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/.gitignore b/dd-java-agent/instrumentation/play/play-appsec-2.5/.gitignore deleted file mode 100644 index 5292519a25e..00000000000 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/.gitignore +++ /dev/null @@ -1 +0,0 @@ -logs/ \ No newline at end of file diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/build.gradle b/dd-java-agent/instrumentation/play/play-appsec-2.5/build.gradle index 6f10dfeebdd..63042d2515a 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/build.gradle +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/build.gradle @@ -12,6 +12,42 @@ muzzle { apply from: "$rootDir/gradle/java.gradle" apply plugin: 'scala' +def configureRoutesCompilation(String sourceSetName) { + def capitalizedName = sourceSetName.capitalize() + def buildRoutesTask = tasks.register("build${capitalizedName}Routes", JavaExec) { + String routesFile = "${project.projectDir}/src/test/routes/conf/routes" + def outputDir = layout.buildDirectory.dir("generated/sources/${sourceSetName}Routes/scala") + + inputs.file routesFile + outputs.dir outputDir + + mainClass.set 'generator.CompileRoutes' + args routesFile, outputDir.get().asFile.absolutePath + + classpath configurations.named('routeGeneratorRuntimeClasspath') + classpath tasks.named('compileRouteGeneratorScala') + } + + sourceSets.named(sourceSetName) { + scala { + srcDir buildRoutesTask + } + } + + tasks.named("compile${capitalizedName}Groovy", GroovyCompile) { + // Groovy tests need access to generated routes compiled by Scala + classpath += files(tasks.named("compile${capitalizedName}Scala")) + } +} + +sourceSets { + routeGenerator { + scala { + srcDir 'src/routeGenerator/scala' + } + } +} + testJvmConstraints { // Play doesn't work with Java 9+ until 2.6.12 maxJavaVersion = JavaVersion.VERSION_1_8 @@ -34,6 +70,10 @@ addTestSuiteForDir('latestDepTest', 'test') dependencies { compileOnly group: 'com.typesafe.play', name: 'play_2.11', version: '2.5.0' + implementation(project(':dd-java-agent:instrumentation:play:play-appsec-common')) + + routeGeneratorImplementation libs.scala211 + routeGeneratorImplementation group: 'com.typesafe.play', name: "routes-compiler_2.11", version: '2.5.0' testRuntimeOnly project(':dd-java-agent:instrumentation:netty:netty-4.0') testRuntimeOnly project(':dd-java-agent:instrumentation:netty:netty-4.1') @@ -59,97 +99,5 @@ dependencies { } } -tasks.named("compileTestGroovy", GroovyCompile) { - classpath = classpath + files(tasks.named('compileTestScala').map { it.destinationDirectory }) -} - -tasks.named("compileLatestDepTestGroovy", GroovyCompile) { - classpath = classpath + files(tasks.named('compileLatestDepTestScala').map { it.destinationDirectory }) -} - -sourceSets { - routeGenerator { - scala { - srcDir "${project.projectDir}/src/routeGenerator/scala" - } - } - testGenerated { - scala { - srcDir layout.buildDirectory.dir('generated/sources/testRoutes/scala') - } - } - latestDepTestGenerated { - scala { - srcDir layout.buildDirectory.dir('generated/sources/latestDepTestRoutes/scala') - } - } -} - -dependencies { - routeGeneratorImplementation libs.scala211 - routeGeneratorImplementation group: 'com.typesafe.play', name: "routes-compiler_2.11", version: '2.5.0' -} - -configurations { - testGeneratedCompileClasspath.extendsFrom testCompileClasspath - latestDepTestGeneratedCompileClasspath.extendsFrom latestDepTestCompileClasspath -} - -['buildTestRoutes', 'buildLatestDepTestRoutes'].each { taskName -> - tasks.register(taskName, JavaExec) { - String routesFile = "${project.projectDir}/src/test/routes/conf/routes" - def subdir = taskName == 'buildTestRoutes' ? 'testRoutes' : 'latestDepTestRoutes' - def outputDir = - layout.buildDirectory.dir("generated/sources/$subdir/scala") - - it.inputs.file routesFile - it.outputs.dir outputDir - - it.mainClass.set 'generator.CompileRoutes' - it.args routesFile, outputDir.get().asFile.absolutePath - - it.classpath configurations.named('routeGeneratorRuntimeClasspath') - it.classpath tasks.named('compileRouteGeneratorScala').map { it.destinationDirectory } - - if (taskName == 'buildTestRoutes') { - it.classpath tasks.named('compileTestScala').map { it.destinationDirectory } - } else { - it.classpath tasks.named('compileLatestDepTestScala').map { it.destinationDirectory } - } - } -} - -tasks.named("compileTestGeneratedScala", ScalaCompile) { - classpath += files(tasks.named('compileTestScala').map { it.destinationDirectory }) - dependsOn 'buildTestRoutes', 'compileLatestDepTestScala' -} - -tasks.named("compileLatestDepTestGeneratedScala", ScalaCompile) { - classpath += files(tasks.named('compileLatestDepTestScala').map { it.destinationDirectory }) - dependsOn 'buildLatestDepTestRoutes' -} - -tasks.named("compileTestGroovy", GroovyCompile) { - classpath += files(tasks.named('compileTestGeneratedScala').map { it.destinationDirectory }) -} - -tasks.named("compileLatestDepTestGroovy", GroovyCompile) { - classpath += files(tasks.named('compileLatestDepTestGeneratedScala').map { it.destinationDirectory }) -} -// do it this way rather than through dependencies {} because -// latestDepTestImplementation extends testImplementation -tasks.named("test", Test) { - classpath += files(tasks.named('compileTestGeneratedScala').map { it.destinationDirectory }) -} - -tasks.named("latestDepTest", Test) { - classpath += files(tasks.named('compileLatestDepTestGeneratedScala').map { it.destinationDirectory }) -} - -tasks.named("forbiddenApisTestGenerated") { - enabled = false -} - -tasks.named("forbiddenApisLatestDepTestGenerated") { - enabled = false -} +configureRoutesCompilation('test') +configureRoutesCompilation('latestDepTest') diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/ArgumentCaptureWrappers.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/ArgumentCaptureWrappers.java index 2eb39277e5d..8b7c89dcc8f 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/ArgumentCaptureWrappers.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/ArgumentCaptureWrappers.java @@ -6,6 +6,7 @@ import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.instrumentation.play.appsec.PathExtractionHelpers; import java.util.Collections; import java.util.HashMap; import java.util.Map; diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PathExtractionHelpers.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PathExtractionHelpers.java deleted file mode 100644 index c97bf454889..00000000000 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PathExtractionHelpers.java +++ /dev/null @@ -1,58 +0,0 @@ -package datadog.trace.instrumentation.play25.appsec; - -import static datadog.trace.api.gateway.Events.EVENTS; - -import datadog.appsec.api.blocking.BlockingException; -import datadog.trace.api.gateway.BlockResponseFunction; -import datadog.trace.api.gateway.CallbackProvider; -import datadog.trace.api.gateway.Flow; -import datadog.trace.api.gateway.RequestContext; -import datadog.trace.api.gateway.RequestContextSlot; -import datadog.trace.bootstrap.instrumentation.api.AgentTracer; -import java.util.Map; -import java.util.function.BiFunction; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class PathExtractionHelpers { - private static final Logger log = LoggerFactory.getLogger(PathExtractionHelpers.class); - - private PathExtractionHelpers() {} - - public static BlockingException callRequestPathParamsCallback( - RequestContext reqCtx, Map params, String origin) { - try { - return doCallRequestPathParamsCallback(reqCtx, params, origin); - } catch (Exception e) { - log.warn("Error calling {}", origin, e); - return null; - } - } - - private static BlockingException doCallRequestPathParamsCallback( - RequestContext reqCtx, Map params, String origin) { - if (params == null || params.isEmpty()) { - return null; - } - - CallbackProvider cbp = AgentTracer.get().getCallbackProvider(RequestContextSlot.APPSEC); - BiFunction, Flow> callback = - cbp.getCallback(EVENTS.requestPathParams()); - if (callback == null) { - return null; - } - - Flow flow = callback.apply(reqCtx, params); - Flow.Action action = flow.getAction(); - if (!(action instanceof Flow.Action.RequestBlockingAction)) { - return null; - } - - Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action; - BlockResponseFunction brf = reqCtx.getBlockResponseFunction(); - if (brf != null) { - brf.tryCommitBlockingResponse(reqCtx.getTraceSegment(), rba); - } - return new BlockingException("Blocked request (for " + origin + ")"); - } -} diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PathPatternApplyAdvice.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PathPatternApplyAdvice.java index 7eab9542568..7ff4f4f80e3 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PathPatternApplyAdvice.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PathPatternApplyAdvice.java @@ -5,6 +5,7 @@ import datadog.trace.advice.RequiresRequestContext; import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; +import datadog.trace.instrumentation.play.appsec.PathExtractionHelpers; import net.bytebuddy.asm.Advice; import scala.Tuple2; import scala.collection.Iterator; diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PathPatternInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PathPatternInstrumentation.java index ba78f5d5472..86856d3b199 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PathPatternInstrumentation.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/PathPatternInstrumentation.java @@ -30,7 +30,7 @@ public Reference[] additionalMuzzleReferences() { @Override public String[] helperClassNames() { return new String[] { - packageName + ".PathExtractionHelpers", + "datadog.trace.instrumentation.play.appsec.PathExtractionHelpers", }; } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/RoutingDslInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/RoutingDslInstrumentation.java index a548b58fb52..5e975ec2805 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/RoutingDslInstrumentation.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/RoutingDslInstrumentation.java @@ -36,7 +36,7 @@ public String[] helperClassNames() { packageName + ".ArgumentCaptureWrappers$ArgumentCaptureFunction", packageName + ".ArgumentCaptureWrappers$ArgumentCaptureBiFunction", packageName + ".ArgumentCaptureWrappers$ArgumentCaptureFunction3", - packageName + ".PathExtractionHelpers", + "datadog.trace.instrumentation.play.appsec.PathExtractionHelpers", }; } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/SirdPathExtractorExtractAdvice.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/SirdPathExtractorExtractAdvice.java index 7de650729c0..3770edf4e9f 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/SirdPathExtractorExtractAdvice.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/SirdPathExtractorExtractAdvice.java @@ -4,6 +4,7 @@ import datadog.trace.advice.RequiresRequestContext; import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; +import datadog.trace.instrumentation.play.appsec.PathExtractionHelpers; import java.util.HashMap; import java.util.Map; import net.bytebuddy.asm.Advice; diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/SirdPathExtractorInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/SirdPathExtractorInstrumentation.java index 3be2f0295be..946a8299fef 100644 --- a/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/SirdPathExtractorInstrumentation.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.5/src/main/java/datadog/trace/instrumentation/play25/appsec/SirdPathExtractorInstrumentation.java @@ -44,7 +44,7 @@ public void methodAdvice(MethodTransformer transformer) { @Override public String[] helperClassNames() { return new String[] { - packageName + ".PathExtractionHelpers", + "datadog.trace.instrumentation.play.appsec.PathExtractionHelpers", }; } } diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.6/build.gradle b/dd-java-agent/instrumentation/play/play-appsec-2.6/build.gradle new file mode 100644 index 00000000000..457c7ce58ba --- /dev/null +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/build.gradle @@ -0,0 +1,48 @@ +muzzle { + extraRepository("typesafe", "https://repo.typesafe.com/typesafe/maven-releases/") + + pass { + name = 'play26Only' + group = 'com.typesafe.play' + module = 'play-java_2.11' + versions = "[2.6.0,2.7.0)" + assertInverse = true + } +} + +apply from: "$rootDir/gradle/java.gradle" +apply plugin: 'scala' + +testJvmConstraints { + // Play doesn't work with Java 9+ until 2.6.12 + maxJavaVersion = JavaVersion.VERSION_1_8 +} + +repositories { + maven { + name = 'typesafe' + url = 'https://repo.typesafe.com/typesafe/maven-releases/' + } +} + +dependencies { + compileOnly group: 'com.typesafe.play', name: "play_2.11", version: '2.6.0' + compileOnly group: 'com.typesafe.play', name: "play-java_2.11", version: '2.6.0' + compileOnly project(':dd-java-agent:instrumentation:play:play-2.6') + implementation(project(':dd-java-agent:instrumentation:play:play-appsec-common')) + + testImplementation project(':dd-java-agent:instrumentation:play:play-2.6') + testImplementation testFixtures(project(':dd-java-agent:instrumentation:play:play-2.6')) + testImplementation group: 'com.typesafe.play', name: "play-java_2.11", version: '2.6.0' + testImplementation(group: 'com.typesafe.play', name: "play-test_2.11", version: '2.6.0') { + exclude group: 'org.eclipse.jetty.websocket', module: 'websocket-client' + } + + testRuntimeOnly project(':dd-java-agent:instrumentation:netty:netty-4.0') + testRuntimeOnly project(':dd-java-agent:instrumentation:netty:netty-4.1') + testRuntimeOnly project(':dd-java-agent:instrumentation:akka:akka-http:akka-http-10.0') + testRuntimeOnly project(':dd-java-agent:instrumentation:akka:akka-actor-2.5') + testRuntimeOnly project(':dd-java-agent:instrumentation:scala:scala-concurrent-2.8') + testRuntimeOnly project(':dd-java-agent:instrumentation:scala:scala-promise:scala-promise-2.10') + testRuntimeOnly project(':dd-java-agent:instrumentation:scala:scala-promise:scala-promise-2.13') +} diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/ArgumentCaptureWrappers.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/ArgumentCaptureWrappers.java similarity index 98% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/ArgumentCaptureWrappers.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/ArgumentCaptureWrappers.java index 853fbb39f4a..26f716b3414 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/ArgumentCaptureWrappers.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/ArgumentCaptureWrappers.java @@ -6,6 +6,7 @@ import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; +import datadog.trace.instrumentation.play.appsec.PathExtractionHelpers; import java.util.Collections; import java.util.HashMap; import java.util.Map; diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/BodyParserHelpers.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/BodyParserHelpers.java similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/BodyParserHelpers.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/BodyParserHelpers.java diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/DelegatingBodyParserInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/DelegatingBodyParserInstrumentation.java similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/DelegatingBodyParserInstrumentation.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/DelegatingBodyParserInstrumentation.java diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/FormUrlEncodedInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/FormUrlEncodedInstrumentation.java similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/FormUrlEncodedInstrumentation.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/FormUrlEncodedInstrumentation.java diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/HttpErrorHandlerInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/HttpErrorHandlerInstrumentation.java similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/HttpErrorHandlerInstrumentation.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/HttpErrorHandlerInstrumentation.java diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/JavaMultipartFormDataRegisterExcF.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/JavaMultipartFormDataRegisterExcF.java similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/JavaMultipartFormDataRegisterExcF.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/JavaMultipartFormDataRegisterExcF.java diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/NoDeclaredMethodMatcher.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/NoDeclaredMethodMatcher.java similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/NoDeclaredMethodMatcher.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/NoDeclaredMethodMatcher.java diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PathPatternInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PathPatternInstrumentation.java similarity index 95% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PathPatternInstrumentation.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PathPatternInstrumentation.java index becc3b54a44..386f2889e81 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PathPatternInstrumentation.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PathPatternInstrumentation.java @@ -16,6 +16,7 @@ import datadog.trace.agent.tooling.muzzle.Reference; import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; +import datadog.trace.instrumentation.play.appsec.PathExtractionHelpers; import datadog.trace.instrumentation.play26.MuzzleReferences; import net.bytebuddy.asm.Advice; import scala.Tuple2; @@ -40,7 +41,7 @@ public String muzzleDirective() { @Override public String[] helperClassNames() { return new String[] { - packageName + ".PathExtractionHelpers", + "datadog.trace.instrumentation.play.appsec.PathExtractionHelpers", }; } diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PlayBodyParsersInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PlayBodyParsersInstrumentation.java similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PlayBodyParsersInstrumentation.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PlayBodyParsersInstrumentation.java diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/ResultsStatusInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/ResultsStatusInstrumentation.java similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/ResultsStatusInstrumentation.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/ResultsStatusInstrumentation.java diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/RoutingDslInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/RoutingDslInstrumentation.java similarity index 97% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/RoutingDslInstrumentation.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/RoutingDslInstrumentation.java index d181146f9e6..ce026f7727d 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/RoutingDslInstrumentation.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/RoutingDslInstrumentation.java @@ -58,7 +58,7 @@ public String[] helperClassNames() { packageName + ".ArgumentCaptureWrappers$ArgumentCaptureFunction", packageName + ".ArgumentCaptureWrappers$ArgumentCaptureBiFunction", packageName + ".ArgumentCaptureWrappers$ArgumentCaptureFunction3", - packageName + ".PathExtractionHelpers", + "datadog.trace.instrumentation.play.appsec.PathExtractionHelpers", }; } diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/SirdPathExtractorInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/SirdPathExtractorInstrumentation.java similarity index 95% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/SirdPathExtractorInstrumentation.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/SirdPathExtractorInstrumentation.java index 375c17897ff..3c7844ccec5 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/SirdPathExtractorInstrumentation.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/SirdPathExtractorInstrumentation.java @@ -13,6 +13,7 @@ import datadog.trace.agent.tooling.muzzle.Reference; import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; +import datadog.trace.instrumentation.play.appsec.PathExtractionHelpers; import datadog.trace.instrumentation.play26.MuzzleReferences; import java.util.HashMap; import java.util.Map; @@ -57,7 +58,7 @@ public void methodAdvice(MethodTransformer transformer) { @Override public String[] helperClassNames() { return new String[] { - packageName + ".PathExtractionHelpers", + "datadog.trace.instrumentation.play.appsec.PathExtractionHelpers", }; } diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/StatusHeaderInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/StatusHeaderInstrumentation.java similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/StatusHeaderInstrumentation.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/StatusHeaderInstrumentation.java diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/TolerantJsonInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/TolerantJsonInstrumentation.java similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/TolerantJsonInstrumentation.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/TolerantJsonInstrumentation.java diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/TolerantTextInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/TolerantTextInstrumentation.java similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/TolerantTextInstrumentation.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/TolerantTextInstrumentation.java diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/TolerantXmlInstrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/TolerantXmlInstrumentation.java similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/TolerantXmlInstrumentation.java rename to dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/TolerantXmlInstrumentation.java diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayAsyncServerTest.groovy b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayAsyncServerTest.groovy new file mode 100644 index 00000000000..4155deea955 --- /dev/null +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayAsyncServerTest.groovy @@ -0,0 +1,23 @@ +package datadog.trace.instrumentation.play26.server + +import datadog.trace.agent.test.base.HttpServer +import groovy.transform.CompileStatic +import spock.lang.Shared + +import java.util.concurrent.Executors + +class PlayAsyncServerTest extends AbstractPlayServerTest { + @Shared + def executor + + def cleanupSpec() { + executor.shutdown() + } + + @CompileStatic + @Override + HttpServer server() { + executor = Executors.newCachedThreadPool() + return new PlayHttpServer(PlayRouters.&async.curry(executor)) + } +} diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayAsyncServerWithErrorHandlerTest.groovy b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayAsyncServerWithErrorHandlerTest.groovy new file mode 100644 index 00000000000..a63949be584 --- /dev/null +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayAsyncServerWithErrorHandlerTest.groovy @@ -0,0 +1,21 @@ +package datadog.trace.instrumentation.play26.server + +import datadog.trace.agent.test.base.HttpServer +import spock.lang.Shared + +import java.util.concurrent.Executors + +class PlayAsyncServerWithErrorHandlerTest extends AbstractPlayServerWithErrorHandlerTest { + @Shared + def executor + + def cleanupSpec() { + executor.shutdown() + } + + @Override + HttpServer server() { + executor = Executors.newCachedThreadPool() + return new PlayHttpServer(PlayRouters.&async.curry(executor), new TestHttpErrorHandler()) + } +} diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayServerTest.groovy b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayServerTest.groovy new file mode 100644 index 00000000000..b425a73b0ce --- /dev/null +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayServerTest.groovy @@ -0,0 +1,34 @@ +package datadog.trace.instrumentation.play26.server + +import okhttp3.MediaType +import okhttp3.RequestBody + +import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.BODY_XML + +class PlayServerTest extends AbstractPlayServerTest { + + def 'test instrumentation gateway xml request body'() { + setup: + def request = request( + BODY_XML, 'POST', + RequestBody.create(MediaType.get('text/xml'), 'mytext')) + .build() + def response = client.newCall(request).execute() + if (isDataStreamsEnabled()) { + TEST_DATA_STREAMS_WRITER.waitForGroups(1) + } + String body = response.body().charStream().text + + + expect: + body == BODY_XML.body || body == 'mytext' + + when: + TEST_WRITER.waitForTraces(1) + + then: + TEST_WRITER.get(0).any { + it.getTag('request.body.converted') == '[[children:[mytext, [:]], attributes:[attr:attr_value]]]' + } + } +} diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayServerWithErrorHandlerTest.groovy b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayServerWithErrorHandlerTest.groovy new file mode 100644 index 00000000000..6cae40b1b4a --- /dev/null +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/groovy/datadog/trace/instrumentation/play26/server/PlayServerWithErrorHandlerTest.groovy @@ -0,0 +1,4 @@ +package datadog.trace.instrumentation.play26.server + +class PlayServerWithErrorHandlerTest extends AbstractPlayServerWithErrorHandlerTest { +} diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/java/datadog/trace/instrumentation/play26/server/TestHttpErrorHandler.java b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/java/datadog/trace/instrumentation/play26/server/TestHttpErrorHandler.java new file mode 100644 index 00000000000..f4a4055480c --- /dev/null +++ b/dd-java-agent/instrumentation/play/play-appsec-2.6/src/test/java/datadog/trace/instrumentation/play26/server/TestHttpErrorHandler.java @@ -0,0 +1,42 @@ +package datadog.trace.instrumentation.play26.server; + +import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.CUSTOM_EXCEPTION; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionStage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import play.http.HttpErrorHandler; +import play.mvc.Http.RequestHeader; +import play.mvc.Result; +import play.mvc.Results; + +public class TestHttpErrorHandler implements HttpErrorHandler { + private static final Logger log = LoggerFactory.getLogger(TestHttpErrorHandler.class); + + public static class CustomRuntimeException extends RuntimeException { + public CustomRuntimeException(String message) { + super(message); + } + } + + public CompletionStage onClientError( + RequestHeader request, int statusCode, String message) { + return CompletableFuture.completedFuture(Results.status(statusCode, message)); + } + + public CompletionStage onServerError(RequestHeader request, Throwable exception) { + log.warn("server error", exception); + + Throwable cause = exception.getCause(); + if (cause != null) { + exception = cause; + } + if (exception instanceof CustomRuntimeException) { + return CompletableFuture.completedFuture( + Results.status(CUSTOM_EXCEPTION.getStatus(), exception.getMessage())); + } + + return CompletableFuture.completedFuture(Results.internalServerError(exception.getMessage())); + } +} diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.7/build.gradle b/dd-java-agent/instrumentation/play/play-appsec-2.7/build.gradle new file mode 100644 index 00000000000..e03850f3a0b --- /dev/null +++ b/dd-java-agent/instrumentation/play/play-appsec-2.7/build.gradle @@ -0,0 +1,139 @@ +muzzle { + extraRepository("typesafe", "https://repo.typesafe.com/typesafe/maven-releases/") + + pass { + name = 'play27' + group = 'com.typesafe.play' + module = 'play-java_2.11' + versions = "[2.7.0,)" + assertInverse = true + javaVersion = 11 + } + pass { + name = 'play27' + group = 'com.typesafe.play' + module = 'play-java_2.12' + versions = "[2.7.0,)" + assertInverse = true + javaVersion = 11 + } + pass { + name = 'play27' + group = 'com.typesafe.play' + module = 'play-java_2.13' + versions = "[2.7.0,)" + assertInverse = true + javaVersion = 11 + } +} + +apply from: "$rootDir/gradle/java.gradle" +apply plugin: 'scala' + +def configureRoutesCompilation(String sourceSetName) { + def capitalizedName = sourceSetName.capitalize() + def buildRoutesTask = tasks.register("build${capitalizedName}Routes", JavaExec) { + def routesFile = "${project.projectDir}/src/test/routes/conf/routes" + def outputDir = layout.buildDirectory.dir("generated/sources/${sourceSetName}Routes/scala") + + inputs.file routesFile + outputs.dir outputDir + + mainClass = 'generator.CompileRoutes' + args routesFile, outputDir.get().asFile.absolutePath + + classpath configurations.named('routeGeneratorRuntimeClasspath') + classpath tasks.named('compileRouteGeneratorScala') + + javaLauncher = getJavaLauncherFor(11) + } + + sourceSets.named(sourceSetName) { + scala { + srcDir buildRoutesTask + } + } + + tasks.named("compile${capitalizedName}Java", JavaCompile) { + configureCompiler(it, 11) + } + + tasks.named("compile${capitalizedName}Scala", ScalaCompile) { + configureCompiler(it, 11) + dependsOn buildRoutesTask + } + + tasks.named("compile${capitalizedName}Groovy", GroovyCompile) { + configureCompiler(it, 11) + classpath += files(tasks.named("compile${capitalizedName}Scala")) + } +} + +sourceSets { + routeGenerator { + scala { + srcDir 'src/routeGenerator/scala' + } + } +} + +testJvmConstraints { + minJavaVersion = JavaVersion.VERSION_11 +} + +repositories { + maven { + // for muzzle because of play-2.3 + // only place that has 'com.typesafe.netty:netty-http-pipelining:1.1.2' publicly accessible + name = 'typesafe' + url = 'https://repo.typesafe.com/typesafe/maven-releases/' + } +} + +addTestSuiteForDir('latestDepTest', 'test') + +dependencies { + compileOnly group: 'com.typesafe.play', name: "play-java_2.11", version: '2.7.0' + implementation project(':dd-java-agent:instrumentation:play:play-2.6') + implementation(project(':dd-java-agent:instrumentation:play:play-appsec-common')) + + routeGeneratorImplementation libs.scala213 + routeGeneratorImplementation group: 'com.typesafe.play', name: "routes-compiler_2.13", version: '2.+' + + testImplementation libs.scala213 + testImplementation project(':dd-java-agent:instrumentation:play:play-2.6') + // Inherited tests needs play-appsec-2.6 instrumentation + testImplementation project(':dd-java-agent:instrumentation:play:play-appsec-2.6') + testImplementation testFixtures(project(':dd-java-agent:instrumentation:play:play-2.6')) + + testImplementation group: 'com.typesafe.play', name: "play-java_2.13", version: '2.7.+' + testImplementation(group: 'com.typesafe.play', name: "play-test_2.13", version: '2.7.+') { + exclude group: 'org.eclipse.jetty.websocket', module: 'websocket-client' + } + testImplementation group: 'com.typesafe.play', name: 'play-akka-http-server_2.13', version: '2.+' + + testRuntimeOnly project(':dd-java-agent:instrumentation:netty:netty-4.0') + testRuntimeOnly project(':dd-java-agent:instrumentation:netty:netty-4.1') + testRuntimeOnly project(':dd-java-agent:instrumentation:akka:akka-http:akka-http-10.0') + testRuntimeOnly project(':dd-java-agent:instrumentation:akka:akka-actor-2.5') + testRuntimeOnly project(':dd-java-agent:instrumentation:scala:scala-concurrent-2.8') + testRuntimeOnly project(':dd-java-agent:instrumentation:scala:scala-promise:scala-promise-2.10') + testRuntimeOnly project(':dd-java-agent:instrumentation:scala:scala-promise:scala-promise-2.13') + + latestDepTestImplementation libs.scala213 + latestDepTestImplementation group: 'com.typesafe.play', name: "play-java_2.13", version: '2.+' + latestDepTestImplementation(group: 'com.typesafe.play', name: "play-test_2.13", version: '2.+') { + exclude group: 'org.eclipse.jetty.websocket', module: 'websocket-client' + } + latestDepTestImplementation group: 'com.typesafe.play', name: 'play-akka-http-server_2.13', version: '2.+' +} + +configurations.matching({ it.name.startsWith('test') }).configureEach({ + it.resolutionStrategy { + // logback-classic 1.4.11 doesn't like being loaded in the bootstrap classloader (NPE) + force group: 'ch.qos.logback', name: 'logback-classic', version: '1.4.5' + } +}) + +configureRoutesCompilation('test') +configureRoutesCompilation('latestDepTest') diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java_play27/datadog/trace/instrumentation/play27/appsec/ArgumentCaptureAdvice.java b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/main/java/datadog/trace/instrumentation/play27/appsec/ArgumentCaptureAdvice.java similarity index 98% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java_play27/datadog/trace/instrumentation/play27/appsec/ArgumentCaptureAdvice.java rename to dd-java-agent/instrumentation/play/play-appsec-2.7/src/main/java/datadog/trace/instrumentation/play27/appsec/ArgumentCaptureAdvice.java index fefc4747eb1..d32fdb49773 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/main/java_play27/datadog/trace/instrumentation/play27/appsec/ArgumentCaptureAdvice.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/main/java/datadog/trace/instrumentation/play27/appsec/ArgumentCaptureAdvice.java @@ -6,7 +6,7 @@ import datadog.trace.api.gateway.RequestContext; import datadog.trace.api.gateway.RequestContextSlot; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.instrumentation.play26.appsec.PathExtractionHelpers; +import datadog.trace.instrumentation.play.appsec.PathExtractionHelpers; import java.util.Collections; import java.util.HashMap; import java.util.Map; diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play27/appsec/RoutingDsl27Instrumentation.java b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/main/java/datadog/trace/instrumentation/play27/appsec/RoutingDsl27Instrumentation.java similarity index 96% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play27/appsec/RoutingDsl27Instrumentation.java rename to dd-java-agent/instrumentation/play/play-appsec-2.7/src/main/java/datadog/trace/instrumentation/play27/appsec/RoutingDsl27Instrumentation.java index 930fc97b218..1f60d2aa906 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play27/appsec/RoutingDsl27Instrumentation.java +++ b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/main/java/datadog/trace/instrumentation/play27/appsec/RoutingDsl27Instrumentation.java @@ -51,7 +51,7 @@ public String[] helperClassNames() { packageName + ".ArgumentCaptureAdvice$ArgumentCaptureFunctionParam1", packageName + ".ArgumentCaptureAdvice$ArgumentCaptureFunctionParam2", packageName + ".ArgumentCaptureAdvice$ArgumentCaptureFunctionParam3", - "datadog.trace.instrumentation.play26.appsec.PathExtractionHelpers", + "datadog.trace.instrumentation.play.appsec.PathExtractionHelpers", }; } diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/routeGenerator/scala/generator/CompileRoutes.scala b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/routeGenerator/scala/generator/CompileRoutes.scala similarity index 100% rename from dd-java-agent/instrumentation/play/play-2.6/src/routeGenerator/scala/generator/CompileRoutes.scala rename to dd-java-agent/instrumentation/play/play-appsec-2.7/src/routeGenerator/scala/generator/CompileRoutes.scala diff --git a/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/AbstractPlayServer27WithErrorHandlerTest.groovy b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/AbstractPlayServer27WithErrorHandlerTest.groovy new file mode 100644 index 00000000000..60fb36c77cd --- /dev/null +++ b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/AbstractPlayServer27WithErrorHandlerTest.groovy @@ -0,0 +1,13 @@ +package datadog.trace.instrumentation.play27.server.test + +import datadog.trace.agent.test.base.HttpServer +import datadog.trace.instrumentation.play26.server.AbstractPlayServerWithErrorHandlerTest +import datadog.trace.instrumentation.play26.server.PlayHttpServer +import datadog.trace.instrumentation.play26.server.TestHttpErrorHandler + +abstract class AbstractPlayServer27WithErrorHandlerTest extends AbstractPlayServerWithErrorHandlerTest { + @Override + HttpServer server() { + new PlayHttpServer(Play27Routers.&sync, new TestHttpErrorHandler()) + } +} diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/groovy/datadog/trace/instrumentation/play26/server/latestdep/PlayRouters.groovy b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/Play27Routers.groovy similarity index 99% rename from dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/groovy/datadog/trace/instrumentation/play26/server/latestdep/PlayRouters.groovy rename to dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/Play27Routers.groovy index 3f80a909182..692bf2e329d 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/groovy/datadog/trace/instrumentation/play26/server/latestdep/PlayRouters.groovy +++ b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/Play27Routers.groovy @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.play26.server.latestdep +package datadog.trace.instrumentation.play27.server.test import com.fasterxml.jackson.databind.JsonNode import datadog.appsec.api.blocking.Blocking @@ -43,7 +43,7 @@ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.USER_B import static datadog.trace.agent.test.base.HttpServerTest.controller // TODO: a lot of this routes don't exercise query/parameter extraction, when they should -class PlayRouters { +class Play27Routers { static Router sync(BuiltInComponents components) { RoutingDsl.fromComponents(components) .GET(SUCCESS.path).routingTo({ diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/groovy/datadog/trace/instrumentation/play26/server/latestdep/PlayAsyncServerRoutesScalaWithErrorHandlerTest.groovy b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/PlayAsyncServerRoutesScalaWithErrorHandlerTest.groovy similarity index 94% rename from dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/groovy/datadog/trace/instrumentation/play26/server/latestdep/PlayAsyncServerRoutesScalaWithErrorHandlerTest.groovy rename to dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/PlayAsyncServerRoutesScalaWithErrorHandlerTest.groovy index 9ca31fbffa8..3285f8febe5 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/groovy/datadog/trace/instrumentation/play26/server/latestdep/PlayAsyncServerRoutesScalaWithErrorHandlerTest.groovy +++ b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/PlayAsyncServerRoutesScalaWithErrorHandlerTest.groovy @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.play26.server.latestdep +package datadog.trace.instrumentation.play27.server.test import datadog.trace.agent.test.asserts.TraceAssert import datadog.trace.agent.test.base.HttpServer @@ -8,7 +8,6 @@ import datadog.trace.api.DDTags import datadog.trace.api.config.TraceInstrumentationConfig import datadog.trace.bootstrap.instrumentation.api.Tags import datadog.trace.instrumentation.play26.PlayHttpServerDecorator -import datadog.trace.instrumentation.play26.server.PlayServerWithErrorHandlerTest import datadog.trace.instrumentation.play26.server.TestHttpErrorHandler import play.api.BuiltInComponents import play.libs.concurrent.ClassLoaderExecution @@ -26,7 +25,7 @@ import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.NOT_FO import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.PATH_PARAM import static datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint.SUCCESS -class PlayAsyncServerRoutesScalaWithErrorHandlerTest extends PlayServerWithErrorHandlerTest { +class PlayAsyncServerRoutesScalaWithErrorHandlerTest extends AbstractPlayServer27WithErrorHandlerTest { @Shared ExecutorService executor diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/groovy/datadog/trace/instrumentation/play26/server/latestdep/PlayAsyncServerScalaWithErrorHandlerTest.groovy b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/PlayAsyncServerScalaWithErrorHandlerTest.groovy similarity index 77% rename from dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/groovy/datadog/trace/instrumentation/play26/server/latestdep/PlayAsyncServerScalaWithErrorHandlerTest.groovy rename to dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/PlayAsyncServerScalaWithErrorHandlerTest.groovy index f1efed6da8b..ad2f1e43b63 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/groovy/datadog/trace/instrumentation/play26/server/latestdep/PlayAsyncServerScalaWithErrorHandlerTest.groovy +++ b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/PlayAsyncServerScalaWithErrorHandlerTest.groovy @@ -1,7 +1,6 @@ -package datadog.trace.instrumentation.play26.server.latestdep +package datadog.trace.instrumentation.play27.server.test import datadog.trace.agent.test.base.HttpServer -import datadog.trace.instrumentation.play26.server.PlayServerWithErrorHandlerTest import datadog.trace.instrumentation.play26.server.TestHttpErrorHandler import play.api.BuiltInComponents import play.routing.Router @@ -11,7 +10,7 @@ import java.util.concurrent.ExecutorService import java.util.concurrent.Executors import java.util.function.Function -class PlayAsyncServerScalaWithErrorHandlerTest extends PlayServerWithErrorHandlerTest { +class PlayAsyncServerScalaWithErrorHandlerTest extends AbstractPlayServer27WithErrorHandlerTest { @Shared ExecutorService executor diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/groovy/datadog/trace/instrumentation/play26/server/latestdep/PlayHttpServerScala.groovy b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/PlayHttpServerScala.groovy similarity index 97% rename from dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/groovy/datadog/trace/instrumentation/play26/server/latestdep/PlayHttpServerScala.groovy rename to dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/PlayHttpServerScala.groovy index 2a75fca703f..6edd6b6afd3 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/groovy/datadog/trace/instrumentation/play26/server/latestdep/PlayHttpServerScala.groovy +++ b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/groovy/datadog/trace/instrumentation/play27/server/test/PlayHttpServerScala.groovy @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.play26.server.latestdep +package datadog.trace.instrumentation.play27.server.test import datadog.trace.agent.test.base.HttpServer import groovy.transform.CompileStatic diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/routes/conf/routes b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/routes/conf/routes similarity index 53% rename from dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/routes/conf/routes rename to dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/routes/conf/routes index 0ba1ae9cff2..b7fe09a0106 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/routes/conf/routes +++ b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/routes/conf/routes @@ -1,17 +1,17 @@ -GET /success datadog.trace.instrumentation.play26.server.latestdep.PlayController.success() -GET /redirect datadog.trace.instrumentation.play26.server.latestdep.PlayController.redirect() -GET /forwarded datadog.trace.instrumentation.play26.server.latestdep.PlayController.forwarded() -GET /error-status datadog.trace.instrumentation.play26.server.latestdep.PlayController.errorStatus() -GET /exception datadog.trace.instrumentation.play26.server.latestdep.PlayController.exception() -GET /custom-exception datadog.trace.instrumentation.play26.server.latestdep.PlayController.customException() -GET /not-here datadog.trace.instrumentation.play26.server.latestdep.PlayController.notHere() -GET /user-block datadog.trace.instrumentation.play26.server.latestdep.PlayController.userBlock() -GET /query datadog.trace.instrumentation.play26.server.latestdep.PlayController.query(some: String) -GET /encoded_query datadog.trace.instrumentation.play26.server.latestdep.PlayController.encodedQuery(some: String) -GET /encoded%20path%20query datadog.trace.instrumentation.play26.server.latestdep.PlayController.encodedPathQuery(some: String) -GET /path/:path/param datadog.trace.instrumentation.play26.server.latestdep.PlayController.pathParam(path: Integer) -POST /created datadog.trace.instrumentation.play26.server.latestdep.PlayController.created() -POST /body-urlencoded datadog.trace.instrumentation.play26.server.latestdep.PlayController.bodyUrlencoded() -POST /body-multipart datadog.trace.instrumentation.play26.server.latestdep.PlayController.bodyMultipart() -POST /body-json datadog.trace.instrumentation.play26.server.latestdep.PlayController.bodyJson() -POST /body-xml datadog.trace.instrumentation.play26.server.latestdep.PlayController.bodyXml() +GET /success datadog.trace.instrumentation.play27.server.test.PlayController.success() +GET /redirect datadog.trace.instrumentation.play27.server.test.PlayController.redirect() +GET /forwarded datadog.trace.instrumentation.play27.server.test.PlayController.forwarded() +GET /error-status datadog.trace.instrumentation.play27.server.test.PlayController.errorStatus() +GET /exception datadog.trace.instrumentation.play27.server.test.PlayController.exception() +GET /custom-exception datadog.trace.instrumentation.play27.server.test.PlayController.customException() +GET /not-here datadog.trace.instrumentation.play27.server.test.PlayController.notHere() +GET /user-block datadog.trace.instrumentation.play27.server.test.PlayController.userBlock() +GET /query datadog.trace.instrumentation.play27.server.test.PlayController.query(some: String) +GET /encoded_query datadog.trace.instrumentation.play27.server.test.PlayController.encodedQuery(some: String) +GET /encoded%20path%20query datadog.trace.instrumentation.play27.server.test.PlayController.encodedPathQuery(some: String) +GET /path/:path/param datadog.trace.instrumentation.play27.server.test.PlayController.pathParam(path: Integer) +POST /created datadog.trace.instrumentation.play27.server.test.PlayController.created() +POST /body-urlencoded datadog.trace.instrumentation.play27.server.test.PlayController.bodyUrlencoded() +POST /body-multipart datadog.trace.instrumentation.play27.server.test.PlayController.bodyMultipart() +POST /body-json datadog.trace.instrumentation.play27.server.test.PlayController.bodyJson() +POST /body-xml datadog.trace.instrumentation.play27.server.test.PlayController.bodyXml() diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/ImplicitConversions.scala b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/scala/datadog/trace/instrumentation/play27/server/test/ImplicitConversions.scala similarity index 88% rename from dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/ImplicitConversions.scala rename to dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/scala/datadog/trace/instrumentation/play27/server/test/ImplicitConversions.scala index 19a290847f7..c45d49a5ac2 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/ImplicitConversions.scala +++ b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/scala/datadog/trace/instrumentation/play27/server/test/ImplicitConversions.scala @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.play26.server.latestdep +package datadog.trace.instrumentation.play27.server.test object ImplicitConversions { implicit class MapExtensions[A](m: Iterable[(String, A)]) { diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/PlayController.scala b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/scala/datadog/trace/instrumentation/play27/server/test/PlayController.scala similarity index 95% rename from dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/PlayController.scala rename to dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/scala/datadog/trace/instrumentation/play27/server/test/PlayController.scala index 06d1950421c..f8db3d3e7a8 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/PlayController.scala +++ b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/scala/datadog/trace/instrumentation/play27/server/test/PlayController.scala @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.play26.server.latestdep +package datadog.trace.instrumentation.play27.server.test import datadog.trace.agent.test.base.HttpServerTest import datadog.trace.agent.test.base.HttpServerTest.{ @@ -8,7 +8,7 @@ import datadog.trace.agent.test.base.HttpServerTest.{ } import datadog.appsec.api.blocking.Blocking import datadog.trace.instrumentation.play26.server.TestHttpErrorHandler -import datadog.trace.instrumentation.play26.server.latestdep.ImplicitConversions.MapExtensions +import datadog.trace.instrumentation.play27.server.test.ImplicitConversions.MapExtensions import groovy.lang.Closure import play.api.libs.json.{JsNull, JsValue, Json} import play.api.mvc._ diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/PlayRoutersScala.scala b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/scala/datadog/trace/instrumentation/play27/server/test/PlayRoutersScala.scala similarity index 97% rename from dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/PlayRoutersScala.scala rename to dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/scala/datadog/trace/instrumentation/play27/server/test/PlayRoutersScala.scala index aa145a4377e..dcc33d0e8b8 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/latestDepTest/scala/datadog/trace/instrumentation/play26/server/latestdep/PlayRoutersScala.scala +++ b/dd-java-agent/instrumentation/play/play-appsec-2.7/src/test/scala/datadog/trace/instrumentation/play27/server/test/PlayRoutersScala.scala @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.play26.server.latestdep +package datadog.trace.instrumentation.play27.server.test import datadog.appsec.api.blocking.Blocking import datadog.trace.agent.test.base.HttpServerTest @@ -9,7 +9,7 @@ import datadog.trace.agent.test.base.HttpServerTest.{ } import datadog.trace.agent.test.base.HttpServerTest.ServerEndpoint._ import datadog.trace.instrumentation.play26.server.TestHttpErrorHandler.CustomRuntimeException -import datadog.trace.instrumentation.play26.server.latestdep.ImplicitConversions.MapExtensions +import datadog.trace.instrumentation.play27.server.test.ImplicitConversions.MapExtensions import groovy.lang.Closure import play.api.BuiltInComponents import play.api.libs.json._ diff --git a/dd-java-agent/instrumentation/play/play-appsec-common/build.gradle b/dd-java-agent/instrumentation/play/play-appsec-common/build.gradle new file mode 100644 index 00000000000..b1e219f2c52 --- /dev/null +++ b/dd-java-agent/instrumentation/play/play-appsec-common/build.gradle @@ -0,0 +1,3 @@ +apply from: "$rootDir/gradle/java.gradle" + + diff --git a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PathExtractionHelpers.java b/dd-java-agent/instrumentation/play/play-appsec-common/src/main/java/datadog/trace/instrumentation/play/appsec/PathExtractionHelpers.java similarity index 97% rename from dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PathExtractionHelpers.java rename to dd-java-agent/instrumentation/play/play-appsec-common/src/main/java/datadog/trace/instrumentation/play/appsec/PathExtractionHelpers.java index 5003ec73ee3..8da233f0388 100644 --- a/dd-java-agent/instrumentation/play/play-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/PathExtractionHelpers.java +++ b/dd-java-agent/instrumentation/play/play-appsec-common/src/main/java/datadog/trace/instrumentation/play/appsec/PathExtractionHelpers.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.play26.appsec; +package datadog.trace.instrumentation.play.appsec; import static datadog.trace.api.gateway.Events.EVENTS; diff --git a/settings.gradle.kts b/settings.gradle.kts index ee2b2bd34b9..e766669cc19 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -500,8 +500,11 @@ include( ":dd-java-agent:instrumentation:play-ws:play-ws-common", ":dd-java-agent:instrumentation:play:play-2.3", ":dd-java-agent:instrumentation:play:play-2.4", - ":dd-java-agent:instrumentation:play:play-appsec-2.5", ":dd-java-agent:instrumentation:play:play-2.6", + ":dd-java-agent:instrumentation:play:play-appsec-2.5", + ":dd-java-agent:instrumentation:play:play-appsec-2.6", + ":dd-java-agent:instrumentation:play:play-appsec-2.7", + ":dd-java-agent:instrumentation:play:play-appsec-common", ":dd-java-agent:instrumentation:protobuf-3.0", ":dd-java-agent:instrumentation:quartz-2.0", ":dd-java-agent:instrumentation:rabbitmq-amqp-2.7",