Merge pull request #636 from DataDog/gary/play-ittest
Add Play Smoke Test with Java Agent
This commit is contained in:
commit
4a6bd7a097
|
|
@ -0,0 +1,127 @@
|
|||
plugins {
|
||||
// using this plugin will launch the server in the background and won't block the tests
|
||||
id 'com.github.psxpaul.execfork' version '0.1.8'
|
||||
id 'play'
|
||||
}
|
||||
|
||||
ext {
|
||||
minJavaVersionForTests = JavaVersion.VERSION_1_8
|
||||
playHttpPort = 8080
|
||||
}
|
||||
|
||||
def playVersion = "2.6.20"
|
||||
def scalaVersion = System.getProperty("scala.binary.version", /* default = */ "2.12")
|
||||
|
||||
model {
|
||||
components {
|
||||
play {
|
||||
platform play: playVersion, scala: scalaVersion, java: '1.8'
|
||||
injectedRoutesGenerator = true
|
||||
sources {
|
||||
scala {
|
||||
source.srcDir "src/main/scala"
|
||||
}
|
||||
extraRoutes(RoutesSourceSet) {
|
||||
source.srcDir "src/main/conf"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
distributions {
|
||||
playBinary {
|
||||
contents {
|
||||
from("src/main/conf") {
|
||||
into "conf"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
jcenter()
|
||||
maven {
|
||||
name "lightbend-maven-releases"
|
||||
url "https://repo.lightbend.com/lightbend/maven-release"
|
||||
}
|
||||
ivy {
|
||||
name "lightbend-ivy-release"
|
||||
url "https://repo.lightbend.com/lightbend/ivy-releases"
|
||||
layout "ivy"
|
||||
}
|
||||
}
|
||||
|
||||
apply from: "${rootDir}/gradle/java.gradle"
|
||||
|
||||
description = 'Play Integration Tests.'
|
||||
|
||||
dependencies {
|
||||
play "com.typesafe.play:play-guice_$scalaVersion:$playVersion"
|
||||
play "com.typesafe.play:play-logback_$scalaVersion:$playVersion"
|
||||
play "com.typesafe.play:filters-helpers_$scalaVersion:$playVersion"
|
||||
|
||||
play project(':dd-trace-api')
|
||||
play deps.opentracing
|
||||
|
||||
testCompile project(':dd-trace-api')
|
||||
testCompile project(':dd-trace-ot')
|
||||
testCompile project(':dd-java-agent:testing')
|
||||
testCompile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.6.0'
|
||||
}
|
||||
|
||||
/** Open up a random, reusable port. */
|
||||
def randomOpenPort() {
|
||||
final ServerSocket socket
|
||||
try {
|
||||
socket = new ServerSocket(0)
|
||||
socket.setReuseAddress(true)
|
||||
socket.close()
|
||||
return socket.getLocalPort()
|
||||
} catch (final IOException ioe) {
|
||||
ioe.printStackTrace()
|
||||
return -1
|
||||
}
|
||||
}
|
||||
|
||||
task startServer(type: com.github.psxpaul.task.ExecFork) {
|
||||
playHttpPort = randomOpenPort()
|
||||
|
||||
if (playHttpPort == -1) {
|
||||
throw new GradleException("Failed to get random port to start Play")
|
||||
}
|
||||
|
||||
workingDir = "${buildDir}/stage/playBinary"
|
||||
commandLine = "${workingDir}/bin/playBinary"
|
||||
stopAfter = test
|
||||
// these params tells the ExecFork plugin to block on startServer task until the port is opened or the string is seen in the ouput
|
||||
waitForPort = playHttpPort
|
||||
waitForOutput = "Listening for HTTP on /127.0.0.1:${playHttpPort}"
|
||||
environment = [
|
||||
'JAVA_OPTS' : "-javaagent:${project(':dd-java-agent').tasks.shadowJar.archivePath}"
|
||||
+ " -Ddd.writer.type=LoggingWriter" + " -Ddd.service.name=java-app"
|
||||
+ " -Ddatadog.slf4j.simpleLogger.defaultLogLevel=debug"
|
||||
+ " -Dorg.slf4j.simpleLogger.defaultLogLevel=debug"
|
||||
+ " -Dconfig.file=${workingDir}/conf/application.conf -Dhttp.port=${playHttpPort}"
|
||||
+ " -Dhttp.address=127.0.0.1"
|
||||
]
|
||||
|
||||
dependsOn 'stage'
|
||||
}
|
||||
|
||||
task deletePIDFile() {
|
||||
delete "${buildDir}/stage/playBinary/RUNNING_PID"
|
||||
}
|
||||
|
||||
tasks.withType(Test) {
|
||||
// so the test can get this property
|
||||
jvmArgs "-Ddatadog.smoketest.server.port=${playHttpPort}"
|
||||
|
||||
testLogging {
|
||||
events "started"
|
||||
}
|
||||
|
||||
dependsOn project(':dd-java-agent').shadowJar, startServer
|
||||
}
|
||||
|
||||
// clean up the PID file from the server
|
||||
tasks.withType(Test).forEach { it.finalizedBy deletePIDFile }
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
# https://www.playframework.com/documentation/latest/Configuration
|
||||
play.http.secret.key=datadogbenchmarktest0xCAFEDEAD
|
||||
http.port=8080
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
<!-- https://www.playframework.com/documentation/latest/SettingsLogger -->
|
||||
<configuration>
|
||||
|
||||
<conversionRule conversionWord="coloredLevel" converterClass="play.api.libs.logback.ColoredLevel"/>
|
||||
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>%coloredLevel %logger{15} - %message%n%xException{10}</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
|
||||
<appender name="ASYNCSTDOUT" class="ch.qos.logback.classic.AsyncAppender">
|
||||
<appender-ref ref="STDOUT"/>
|
||||
</appender>
|
||||
|
||||
<logger name="play" level="INFO"/>
|
||||
<logger name="application" level="DEBUG"/>
|
||||
|
||||
<!-- Off these ones as they are annoying, and anyway we manage configuration ourselves -->
|
||||
<logger name="com.avaje.ebean.config.PropertyMapLoader" level="OFF"/>
|
||||
<logger name="com.avaje.ebeaninternal.server.core.XmlConfigLoader" level="OFF"/>
|
||||
<logger name="com.avaje.ebeaninternal.server.lib.BackgroundThread" level="OFF"/>
|
||||
<logger name="com.gargoylesoftware.htmlunit.javascript" level="OFF"/>
|
||||
|
||||
<root level="WARN">
|
||||
<appender-ref ref="ASYNCSTDOUT"/>
|
||||
</root>
|
||||
|
||||
</configuration>
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
# Routes
|
||||
# This file defines all application routes (Higher priority routes first)
|
||||
# https://www.playframework.com/documentation/latest/ScalaRouting
|
||||
# ~~~~
|
||||
|
||||
# An example controller showing a sample home page
|
||||
GET /welcome controllers.HomeController.doGet(id: Option[Int])
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
package controllers
|
||||
|
||||
import javax.inject.Inject
|
||||
|
||||
import play.api.mvc._
|
||||
|
||||
/**
|
||||
* This controller creates an `Action` to handle HTTP requests to the
|
||||
* application's welcome greeting
|
||||
*/
|
||||
class HomeController @Inject()(cc: ControllerComponents) extends AbstractController(cc) {
|
||||
|
||||
/**
|
||||
* Create an Action to return a greeting
|
||||
*/
|
||||
def doGet(id: Option[Int]) = Action { implicit request: Request[AnyContent] =>
|
||||
val idVal = id.getOrElse(-1)
|
||||
if (idVal > 0) {
|
||||
Ok("Welcome %d.".format(idVal))
|
||||
} else {
|
||||
Ok("No ID.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
package datadog.trace.agent
|
||||
|
||||
import datadog.trace.agent.test.utils.OkHttpUtils
|
||||
import okhttp3.OkHttpClient
|
||||
import okhttp3.Request
|
||||
import spock.lang.Specification
|
||||
|
||||
class PlaySmokeTest extends Specification {
|
||||
|
||||
OkHttpClient client = OkHttpUtils.client()
|
||||
private int port = Integer.parseInt(System.getProperty("datadog.smoketest.server.port", "8080"))
|
||||
|
||||
def "welcome endpoint #n th time"() {
|
||||
setup:
|
||||
String url = "http://localhost:$port/welcome?id=$n"
|
||||
def request = new Request.Builder().url(url).get().build()
|
||||
|
||||
when:
|
||||
def response = client.newCall(request).execute()
|
||||
|
||||
then:
|
||||
def responseBodyStr = response.body().string()
|
||||
responseBodyStr == "Welcome $n."
|
||||
response.code() == 200
|
||||
|
||||
where:
|
||||
n << (1..200)
|
||||
}
|
||||
}
|
||||
|
|
@ -17,7 +17,9 @@ include ':dd-java-agent:agent-jmxfetch'
|
|||
// misc
|
||||
include ':dd-java-agent:testing'
|
||||
|
||||
// smoke tests
|
||||
include ':dd-smoke-tests:wildfly'
|
||||
include ':dd-smoke-tests:play'
|
||||
|
||||
// instrumentation:
|
||||
include ':dd-java-agent:instrumentation:akka-http-10.0'
|
||||
|
|
|
|||
Loading…
Reference in New Issue