Merge pull request #562 from DataDog/tyler/fix-latest-dep-tests

Add assertion to ensure latestDepTest dependencies are different from test
This commit is contained in:
Tyler Benson 2018-11-14 13:47:13 -08:00 committed by GitHub
commit 2ad1dee113
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 352 additions and 342 deletions

View File

@ -95,13 +95,6 @@ configurations.test_1_11_106Compile {
} }
} }
configurations.latestDepTestCompile {
resolutionStrategy {
force group: 'com.amazonaws', name: 'aws-java-sdk', version: '+'
}
}
dependencies { dependencies {
compileOnly group: 'com.amazonaws', name: 'aws-java-sdk-core', version: '1.11.0' compileOnly group: 'com.amazonaws', name: 'aws-java-sdk-core', version: '1.11.0'

View File

@ -36,10 +36,6 @@ dependencies {
testCompile project(':dd-java-agent:testing') testCompile project(':dd-java-agent:testing')
testCompile group: 'com.datastax.cassandra', name: 'cassandra-driver-core', version: '3.2.0' testCompile group: 'com.datastax.cassandra', name: 'cassandra-driver-core', version: '3.2.0'
testCompile group: 'org.cassandraunit', name: 'cassandra-unit', version: '3.1.3.2' testCompile group: 'org.cassandraunit', name: 'cassandra-unit', version: '3.1.3.2'
}
configurations.latestDepTestCompile { latestDepTestCompile group: 'com.datastax.cassandra', name: 'cassandra-driver-core', version: '+'
resolutionStrategy {
force group: 'com.datastax.cassandra', name: 'cassandra-driver-core', version: '+'
}
} }

View File

@ -53,7 +53,7 @@ dependencies {
testCompile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.0' testCompile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.11.0'
testCompile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.0' testCompile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.11.0'
latestDepTestCompile group: 'org.elasticsearch.plugin', name: 'transport-netty4-client', version: '+' // Limit tests to <6.5 as the latest versions have a breaking change for the tests.
latestDepTestCompile group: 'org.elasticsearch.client', name: 'transport', version: '+' latestDepTestCompile group: 'org.elasticsearch.plugin', name: 'transport-netty4-client', version: '(6.1,6.5)'
latestDepTestCompile group: 'org.elasticsearch.client', name: 'elasticsearch-rest-client', version: '+' latestDepTestCompile group: 'org.elasticsearch.client', name: 'transport', version: '(6.1,6.5)'
} }

View File

@ -60,12 +60,7 @@ dependencies {
testCompile group: 'io.grpc', name: 'grpc-stub', version: grpcVersion testCompile group: 'io.grpc', name: 'grpc-stub', version: grpcVersion
latestDepTestCompile sourceSets.test.output // include the protobuf generated classes latestDepTestCompile sourceSets.test.output // include the protobuf generated classes
} latestDepTestCompile group: 'io.grpc', name: 'grpc-netty', version: '+'
latestDepTestCompile group: 'io.grpc', name: 'grpc-protobuf', version: '+'
configurations.latestDepTestCompile { latestDepTestCompile group: 'io.grpc', name: 'grpc-stub', version: '+'
resolutionStrategy {
force group: 'io.grpc', name: 'grpc-netty', version: '+'
force group: 'io.grpc', name: 'grpc-protobuf', version: '+'
force group: 'io.grpc', name: 'grpc-stub', version: '+'
}
} }

View File

@ -32,10 +32,6 @@ dependencies {
testCompile project(':dd-java-agent:instrumentation:java-concurrent') testCompile project(':dd-java-agent:instrumentation:java-concurrent')
testCompile project(':dd-java-agent:instrumentation:trace-annotation') testCompile project(':dd-java-agent:instrumentation:trace-annotation')
testCompile group: 'com.netflix.hystrix', name: 'hystrix-core', version: '1.4.0' testCompile group: 'com.netflix.hystrix', name: 'hystrix-core', version: '1.4.0'
}
configurations.latestDepTestCompile { latestDepTestCompile group: 'com.netflix.hystrix', name: 'hystrix-core', version: '+'
resolutionStrategy {
force group: 'com.netflix.hystrix', name: 'hystrix-core', version: '+'
}
} }

View File

@ -33,17 +33,13 @@ dependencies {
testCompile group: 'org.apache.tomcat', name: 'tomcat-juli', version: '7.0.19' testCompile group: 'org.apache.tomcat', name: 'tomcat-juli', version: '7.0.19'
testCompile group: 'com.zaxxer', name: 'HikariCP', version: '2.4.0' testCompile group: 'com.zaxxer', name: 'HikariCP', version: '2.4.0'
testCompile group: 'com.mchange', name: 'c3p0', version: '0.9.5' testCompile group: 'com.mchange', name: 'c3p0', version: '0.9.5'
}
latestDepTestCompile group: 'com.h2database', name: 'h2', version: '+'
latestDepTestCompile group: 'org.apache.derby', name: 'derby', version: '+'
latestDepTestCompile group: 'org.hsqldb', name: 'hsqldb', version: '+'
configurations.latestDepTestCompile { latestDepTestCompile group: 'org.apache.tomcat', name: 'tomcat-jdbc', version: '+'
resolutionStrategy { latestDepTestCompile group: 'org.apache.tomcat', name: 'tomcat-juli', version: '+'
force group: 'com.h2database', name: 'h2', version: '+' latestDepTestCompile group: 'com.zaxxer', name: 'HikariCP', version: '+'
force group: 'org.apache.derby', name: 'derby', version: '+' latestDepTestCompile group: 'com.mchange', name: 'c3p0', version: '+'
force group: 'org.hsqldb', name: 'hsqldb', version: '+'
force group: 'org.apache.tomcat', name: 'tomcat-jdbc', version: '+'
force group: 'org.apache.tomcat', name: 'tomcat-juli', version: '+'
force group: 'com.zaxxer', name: 'HikariCP', version: '+'
force group: 'com.mchange', name: 'c3p0', version: '+'
}
} }

View File

@ -33,9 +33,3 @@ dependencies {
latestDepTestCompile group: 'redis.clients', name: 'jedis', version: '+' latestDepTestCompile group: 'redis.clients', name: 'jedis', version: '+'
} }
configurations.latestDepTestCompile {
resolutionStrategy {
force group: 'redis.clients', name: 'jedis', version: '+'
}
}

View File

@ -33,11 +33,9 @@ dependencies {
} }
testCompile group: 'org.eclipse.jetty', name: 'jetty-server', version: '8.0.0.v20110901' testCompile group: 'org.eclipse.jetty', name: 'jetty-server', version: '8.0.0.v20110901'
testCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '8.0.0.v20110901' testCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '8.0.0.v20110901'
} testCompile group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '8.0.0.v20110901'
configurations.latestDepTestCompile { latestDepTestCompile group: 'org.eclipse.jetty', name: 'jetty-server', version: '+'
resolutionStrategy { latestDepTestCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '+'
force group: 'org.eclipse.jetty', name: 'jetty-server', version: '+' latestDepTestCompile group: 'org.eclipse.jetty', name: 'jetty-continuation', version: '+'
force group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '+'
}
} }

View File

@ -16,7 +16,6 @@ import net.bytebuddy.matcher.ElementMatcher;
@AutoService(Instrumenter.class) @AutoService(Instrumenter.class)
public final class HandlerInstrumentation extends Instrumenter.Default { public final class HandlerInstrumentation extends Instrumenter.Default {
public static final String SERVLET_OPERATION_NAME = "jetty.request";
public HandlerInstrumentation() { public HandlerInstrumentation() {
super("jetty", "jetty-8"); super("jetty", "jetty-8");

View File

@ -1,7 +1,6 @@
import datadog.trace.agent.test.AgentTestRunner import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils import datadog.trace.agent.test.TestUtils
import datadog.trace.agent.test.utils.OkHttpUtils import datadog.trace.agent.test.utils.OkHttpUtils
import datadog.trace.api.Config
import datadog.trace.api.DDSpanTypes import datadog.trace.api.DDSpanTypes
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import org.eclipse.jetty.continuation.Continuation import org.eclipse.jetty.continuation.Continuation
@ -11,9 +10,11 @@ import org.eclipse.jetty.server.Request
import org.eclipse.jetty.server.Server import org.eclipse.jetty.server.Server
import org.eclipse.jetty.server.handler.AbstractHandler import org.eclipse.jetty.server.handler.AbstractHandler
import javax.servlet.DispatcherType
import javax.servlet.ServletException import javax.servlet.ServletException
import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse import javax.servlet.http.HttpServletResponse
import java.util.concurrent.atomic.AtomicBoolean
class JettyHandlerTest extends AgentTestRunner { class JettyHandlerTest extends AgentTestRunner {
@ -55,31 +56,30 @@ class JettyHandlerTest extends AgentTestRunner {
expect: expect:
response.body().string().trim() == "Hello World" response.body().string().trim() == "Hello World"
TEST_WRITER.waitForTraces(1)
TEST_WRITER.size() == 1
def trace = TEST_WRITER.firstTrace()
trace.size() == 1
def context = trace[0].context()
context.serviceName == "unnamed-java-app"
context.operationName == "jetty.request"
context.resourceName == "GET ${handler.class.name}"
context.spanType == DDSpanTypes.HTTP_SERVER
!context.getErrorFlag()
context.parentId == "0"
def tags = context.tags
tags["http.url"] == "http://localhost:$port/"
tags["http.method"] == "GET"
tags["span.kind"] == "server"
tags["span.type"] == DDSpanTypes.HTTP_SERVER
tags["component"] == "jetty-handler"
tags["http.status_code"] == 200
tags["thread.name"] != null
tags["thread.id"] != null
tags[Config.RUNTIME_ID_TAG] == Config.get().runtimeId
tags["span.origin.type"] == handler.class.name
tags.size() == 10
}
assertTraces(1) {
trace(0, 1) {
span(0) {
serviceName "unnamed-java-app"
operationName "jetty.request"
resourceName "GET ${handler.class.name}"
spanType DDSpanTypes.HTTP_SERVER
errored false
parent()
tags {
"http.url" "http://localhost:$port/"
"http.method" "GET"
"span.kind" "server"
"component" "jetty-handler"
"span.origin.type" handler.class.name
"span.type" DDSpanTypes.HTTP_SERVER
"http.status_code" 200
defaultTags()
}
}
}
}
}
def "handler instrumentation clears state after async request"() { def "handler instrumentation clears state after async request"() {
setup: setup:
@ -87,7 +87,7 @@ class JettyHandlerTest extends AgentTestRunner {
@Override @Override
void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
final Continuation continuation = ContinuationSupport.getContinuation(request) final Continuation continuation = ContinuationSupport.getContinuation(request)
continuation.suspend() continuation.suspend(response)
// By the way, this is a terrible async server // By the way, this is a terrible async server
new Thread() { new Thread() {
@Override @Override
@ -128,10 +128,16 @@ class JettyHandlerTest extends AgentTestRunner {
def "call to jetty with error creates a trace"() { def "call to jetty with error creates a trace"() {
setup: setup:
def errorHandlerCalled = new AtomicBoolean(false)
Handler handler = new AbstractHandler() { Handler handler = new AbstractHandler() {
@Override @Override
void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
throw new RuntimeException() if (baseRequest.dispatcherType == DispatcherType.ERROR) {
errorHandlerCalled.set(true)
baseRequest.setHandled(true)
} else {
throw new RuntimeException()
}
} }
} }
server.setHandler(handler) server.setHandler(handler)
@ -144,31 +150,52 @@ class JettyHandlerTest extends AgentTestRunner {
expect: expect:
response.body().string().trim() == "" response.body().string().trim() == ""
TEST_WRITER.waitForTraces(1)
TEST_WRITER.size() == 1 assertTraces(errorHandlerCalled.get() ? 2 : 1) {
def trace = TEST_WRITER.firstTrace() trace(0, 1) {
trace.size() == 1 span(0) {
def context = trace[0].context() serviceName "unnamed-java-app"
context.serviceName == "unnamed-java-app" operationName "jetty.request"
context.operationName == "jetty.request" resourceName "GET ${handler.class.name}"
context.resourceName == "GET ${handler.class.name}" spanType DDSpanTypes.HTTP_SERVER
context.spanType == DDSpanTypes.HTTP_SERVER errored true
context.getErrorFlag() parent()
context.parentId == "0" tags {
def tags = context.tags "http.url" "http://localhost:$port/"
tags["http.url"] == "http://localhost:$port/" "http.method" "GET"
tags["http.method"] == "GET" "span.kind" "server"
tags["span.kind"] == "server" "component" "jetty-handler"
tags["span.type"] == DDSpanTypes.HTTP_SERVER "span.origin.type" handler.class.name
tags["component"] == "jetty-handler" "span.type" DDSpanTypes.HTTP_SERVER
tags["http.status_code"] == 500 "http.status_code" 500
tags["thread.name"] != null errorTags RuntimeException
tags["thread.id"] != null defaultTags()
tags[Config.RUNTIME_ID_TAG] == Config.get().runtimeId }
tags["span.origin.type"] == handler.class.name }
tags["error"] == true }
tags["error.type"] == RuntimeException.name if (errorHandlerCalled.get()) {
tags["error.stack"] != null trace(1, 1) {
tags.size() == 13 span(0) {
serviceName "unnamed-java-app"
operationName "jetty.request"
resourceName "GET ${handler.class.name}"
spanType DDSpanTypes.HTTP_SERVER
errored true
parent()
tags {
"http.url" "http://localhost:$port/"
"http.method" "GET"
"span.kind" "server"
"component" "jetty-handler"
"span.origin.type" handler.class.name
"span.type" DDSpanTypes.HTTP_SERVER
"http.status_code" 500
"error" true
defaultTags()
}
}
}
}
}
} }
} }

View File

@ -38,14 +38,10 @@ dependencies {
testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '7.0.37' testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '7.0.37'
testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-logging-juli', version: '7.0.37' testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-logging-juli', version: '7.0.37'
testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '7.0.37' testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '7.0.37'
}
configurations.latestDepTestCompile { latestDepTestCompile group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: '+'
resolutionStrategy { latestDepTestCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '+'
force group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: '+' latestDepTestCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '+'
force group: 'javax.servlet', name: 'javax.servlet-api', version: '+' latestDepTestCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '+'
force group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '+' latestDepTestCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-logging-juli', version: '+'
force group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '+'
force group: 'org.apache.tomcat.embed', name: 'tomcat-embed-logging-juli', version: '+'
}
} }

View File

@ -16,15 +16,19 @@ import io.opentracing.Scope;
import io.opentracing.Span; import io.opentracing.Span;
import io.opentracing.tag.Tags; import io.opentracing.tag.Tags;
import io.opentracing.util.GlobalTracer; import io.opentracing.util.GlobalTracer;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.servlet.RequestDispatcher; import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.HttpJspPage;
import net.bytebuddy.asm.Advice; import net.bytebuddy.asm.Advice;
import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.matcher.ElementMatcher; import net.bytebuddy.matcher.ElementMatcher;
import org.slf4j.LoggerFactory;
@AutoService(Instrumenter.class) @AutoService(Instrumenter.class)
public final class JSPInstrumentation extends Instrumenter.Default { public final class JSPInstrumentation extends Instrumenter.Default {
@ -68,19 +72,28 @@ public final class JSPInstrumentation extends Instrumenter.Default {
// get the JSP file name being rendered in an include action // get the JSP file name being rendered in an include action
final Object includeServletPath = req.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH); final Object includeServletPath = req.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH);
String resourceName = req.getServletPath(); String resourceName = req.getServletPath();
if (includeServletPath != null && includeServletPath instanceof String) { if (includeServletPath instanceof String) {
resourceName = includeServletPath.toString(); resourceName = includeServletPath.toString();
} }
span.setTag(DDTags.RESOURCE_NAME, resourceName); span.setTag(DDTags.RESOURCE_NAME, resourceName);
final Object forwardOrigin = req.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH); final Object forwardOrigin = req.getAttribute(RequestDispatcher.FORWARD_SERVLET_PATH);
if (forwardOrigin != null && forwardOrigin instanceof String) { if (forwardOrigin instanceof String) {
span.setTag("jsp.forwardOrigin", forwardOrigin.toString()); span.setTag("jsp.forwardOrigin", forwardOrigin.toString());
} }
// add the request URL as a tag to provide better context when looking at spans produced by // add the request URL as a tag to provide better context when looking at spans produced by
// actions // actions. Tomcat 9 has relative path symbols in the value returned from
span.setTag("jsp.requestURL", req.getRequestURL().toString()); // HttpServletRequest#getRequestURL(),
// normalizing the URL should remove those symbols for readability and consistency
try {
span.setTag(
"jsp.requestURL", (new URI(req.getRequestURL().toString())).normalize().toString());
} catch (final URISyntaxException uriSE) {
LoggerFactory.getLogger(HttpJspPage.class)
.warn("Failed to get and normalize request URL: " + uriSE.getMessage());
}
Tags.COMPONENT.set(span, "jsp-http-servlet"); Tags.COMPONENT.set(span, "jsp-http-servlet");
return scope; return scope;

View File

@ -45,17 +45,23 @@ class JSPInstrumentationBasicTests extends AgentTestRunner {
OkHttpClient client = OkHttpUtils.client() OkHttpClient client = OkHttpUtils.client()
def setupSpec() { def setupSpec() {
port = TestUtils.randomOpenPort()
tomcatServer = new Tomcat()
tomcatServer.setPort(port)
// comment to debug
tomcatServer.setSilent(true)
baseDir = Files.createTempDir() baseDir = Files.createTempDir()
baseDir.deleteOnExit() baseDir.deleteOnExit()
expectedJspClassFilesDir = baseDir.getCanonicalFile().getAbsolutePath() + expectedJspClassFilesDir expectedJspClassFilesDir = baseDir.getCanonicalFile().getAbsolutePath() + expectedJspClassFilesDir
baseUrl = "http://localhost:$port/$jspWebappContext"
port = TestUtils.randomOpenPort()
tomcatServer = new Tomcat()
tomcatServer.setBaseDir(baseDir.getAbsolutePath()) tomcatServer.setBaseDir(baseDir.getAbsolutePath())
tomcatServer.setPort(port)
tomcatServer.getConnector()
// comment to debug
tomcatServer.setSilent(true)
// this is needed in tomcat 9, this triggers the creation of a connector, will not
// affect tomcat 7 and 8
// https://stackoverflow.com/questions/48998387/code-works-with-embedded-apache-tomcat-8-but-not-with-9-whats-changed
tomcatServer.getConnector()
baseUrl = "http://localhost:$port/$jspWebappContext"
appContext = tomcatServer.addWebapp("/$jspWebappContext", appContext = tomcatServer.addWebapp("/$jspWebappContext",
JSPInstrumentationBasicTests.getResource("/webapps/jsptest").getPath()) JSPInstrumentationBasicTests.getResource("/webapps/jsptest").getPath())
@ -344,7 +350,14 @@ class JSPInstrumentationBasicTests extends AgentTestRunner {
"span.origin.type" jspClassName "span.origin.type" jspClassName
"servlet.context" "/$jspWebappContext" "servlet.context" "/$jspWebappContext"
"jsp.requestURL" reqUrl "jsp.requestURL" reqUrl
errorTags(exceptionClass, errorMessage) "error" true
"error.type" { String tagExceptionType ->
return tagExceptionType == exceptionClass.getName() || tagExceptionType.contains(exceptionClass.getSimpleName())
}
"error.msg" { String tagErrorMsg ->
return errorMessageOptional || tagErrorMsg instanceof String
}
"error.stack" String
defaultTags() defaultTags()
} }
} }
@ -373,10 +386,10 @@ class JSPInstrumentationBasicTests extends AgentTestRunner {
res.close() res.close()
where: where:
test | jspFileName | jspClassName | exceptionClass | errorMessage test | jspFileName | jspClassName | exceptionClass | errorMessageOptional
"java runtime error" | "runtimeError.jsp" | "runtimeError_jsp" | ArithmeticException | String "java runtime error" | "runtimeError.jsp" | "runtimeError_jsp" | ArithmeticException | false
"invalid write" | "invalidWrite.jsp" | "invalidWrite_jsp" | StringIndexOutOfBoundsException | String "invalid write" | "invalidWrite.jsp" | "invalidWrite_jsp" | IndexOutOfBoundsException | true
"missing query gives null" | "getQuery.jsp" | "getQuery_jsp" | NullPointerException | null "missing query gives null" | "getQuery.jsp" | "getQuery_jsp" | NullPointerException | true
} }
def "non-erroneous include plain HTML GET"() { def "non-erroneous include plain HTML GET"() {

View File

@ -43,17 +43,24 @@ class JSPInstrumentationForwardTests extends AgentTestRunner {
OkHttpClient client = OkHttpUtils.client() OkHttpClient client = OkHttpUtils.client()
def setupSpec() { def setupSpec() {
port = TestUtils.randomOpenPort()
tomcatServer = new Tomcat()
tomcatServer.setPort(port)
// comment to debug
tomcatServer.setSilent(true)
baseDir = Files.createTempDir() baseDir = Files.createTempDir()
baseDir.deleteOnExit() baseDir.deleteOnExit()
expectedJspClassFilesDir = baseDir.getCanonicalFile().getAbsolutePath() + expectedJspClassFilesDir expectedJspClassFilesDir = baseDir.getCanonicalFile().getAbsolutePath() + expectedJspClassFilesDir
baseUrl = "http://localhost:$port/$jspWebappContext"
port = TestUtils.randomOpenPort()
tomcatServer = new Tomcat()
tomcatServer.setBaseDir(baseDir.getAbsolutePath()) tomcatServer.setBaseDir(baseDir.getAbsolutePath())
tomcatServer.setPort(port)
tomcatServer.getConnector()
// comment to debug
tomcatServer.setSilent(true)
// this is needed in tomcat 9, this triggers the creation of a connector, will not
// affect tomcat 7 and 8
// https://stackoverflow.com/questions/48998387/code-works-with-embedded-apache-tomcat-8-but-not-with-9-whats-changed
tomcatServer.getConnector()
baseUrl = "http://localhost:$port/$jspWebappContext"
appContext = tomcatServer.addWebapp("/$jspWebappContext", appContext = tomcatServer.addWebapp("/$jspWebappContext",
JSPInstrumentationForwardTests.getResource("/webapps/jsptest").getPath()) JSPInstrumentationForwardTests.getResource("/webapps/jsptest").getPath())

View File

@ -32,12 +32,9 @@ dependencies {
testCompile group: 'org.springframework.kafka', name: 'spring-kafka', version: '1.3.3.RELEASE' testCompile group: 'org.springframework.kafka', name: 'spring-kafka', version: '1.3.3.RELEASE'
testCompile group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '1.3.3.RELEASE' testCompile group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '1.3.3.RELEASE'
testCompile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.2.3' testCompile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.2.3'
}
configurations.latestDepTestCompile { latestDepTestCompile group: 'org.apache.kafka', name: 'kafka-clients', version: '+'
resolutionStrategy { latestDepTestCompile group: 'org.springframework.kafka', name: 'spring-kafka', version: '+'
force group: 'org.apache.kafka', name: 'kafka-clients', version: '+' latestDepTestCompile group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '+'
force group: 'org.springframework.kafka', name: 'spring-kafka', version: '+' latestDepTestCompile group: 'org.assertj', name: 'assertj-core', version: '3.+'
force group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '+'
}
} }

View File

@ -21,6 +21,6 @@ public class TextMapInjectAdapter implements TextMap {
@Override @Override
public void put(final String key, final String value) { public void put(final String key, final String value) {
headers.add(key, value.getBytes(StandardCharsets.UTF_8)); headers.remove(key).add(key, value.getBytes(StandardCharsets.UTF_8));
} }
} }

View File

@ -7,7 +7,6 @@ import org.springframework.kafka.core.DefaultKafkaProducerFactory
import org.springframework.kafka.core.KafkaTemplate import org.springframework.kafka.core.KafkaTemplate
import org.springframework.kafka.listener.KafkaMessageListenerContainer import org.springframework.kafka.listener.KafkaMessageListenerContainer
import org.springframework.kafka.listener.MessageListener import org.springframework.kafka.listener.MessageListener
import org.springframework.kafka.listener.config.ContainerProperties
import org.springframework.kafka.test.rule.KafkaEmbedded import org.springframework.kafka.test.rule.KafkaEmbedded
import org.springframework.kafka.test.utils.ContainerTestUtils import org.springframework.kafka.test.utils.ContainerTestUtils
import org.springframework.kafka.test.utils.KafkaTestUtils import org.springframework.kafka.test.utils.KafkaTestUtils
@ -36,7 +35,13 @@ class KafkaClientTest extends AgentTestRunner {
def consumerFactory = new DefaultKafkaConsumerFactory<String, String>(consumerProperties) def consumerFactory = new DefaultKafkaConsumerFactory<String, String>(consumerProperties)
// set the topic that needs to be consumed // set the topic that needs to be consumed
ContainerProperties containerProperties = new ContainerProperties(SHARED_TOPIC) def containerProperties
try {
// Different class names for test and latestDepTest.
containerProperties = Class.forName("org.springframework.kafka.listener.config.ContainerProperties").newInstance(SHARED_TOPIC)
} catch (ClassNotFoundException | NoClassDefFoundError e) {
containerProperties = Class.forName("org.springframework.kafka.listener.ContainerProperties").newInstance(SHARED_TOPIC)
}
// create a Kafka MessageListenerContainer // create a Kafka MessageListenerContainer
def container = new KafkaMessageListenerContainer<>(consumerFactory, containerProperties) def container = new KafkaMessageListenerContainer<>(consumerFactory, containerProperties)
@ -126,7 +131,7 @@ class KafkaClientTest extends AgentTestRunner {
cleanup: cleanup:
producerFactory.stop() producerFactory.stop()
container.stop() container?.stop()
} }
} }

View File

@ -35,13 +35,10 @@ dependencies {
testCompile group: 'org.springframework.kafka', name: 'spring-kafka', version: '1.3.3.RELEASE' testCompile group: 'org.springframework.kafka', name: 'spring-kafka', version: '1.3.3.RELEASE'
testCompile group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '1.3.3.RELEASE' testCompile group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '1.3.3.RELEASE'
testCompile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.2.3' testCompile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.2.3'
}
configurations.latestDepTestCompile { latestDepTestCompile group: 'org.apache.kafka', name: 'kafka-clients', version: '+'
resolutionStrategy { latestDepTestCompile group: 'org.apache.kafka', name: 'kafka-streams', version: '+'
force group: 'org.apache.kafka', name: 'kafka-clients', version: '+' latestDepTestCompile group: 'org.springframework.kafka', name: 'spring-kafka', version: '+'
force group: 'org.apache.kafka', name: 'kafka-streams', version: '+' latestDepTestCompile group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '+'
force group: 'org.springframework.kafka', name: 'spring-kafka', version: '+' latestDepTestCompile group: 'org.assertj', name: 'assertj-core', version: '3.+'
force group: 'org.springframework.kafka', name: 'spring-kafka-test', version: '+'
}
} }

View File

@ -1,11 +1,9 @@
import datadog.trace.agent.test.AgentTestRunner import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.api.Config
import org.apache.kafka.clients.consumer.ConsumerRecord import org.apache.kafka.clients.consumer.ConsumerRecord
import org.apache.kafka.common.serialization.Serdes import org.apache.kafka.common.serialization.Serdes
import org.apache.kafka.streams.KafkaStreams import org.apache.kafka.streams.KafkaStreams
import org.apache.kafka.streams.StreamsConfig import org.apache.kafka.streams.StreamsConfig
import org.apache.kafka.streams.kstream.KStream import org.apache.kafka.streams.kstream.KStream
import org.apache.kafka.streams.kstream.KStreamBuilder
import org.apache.kafka.streams.kstream.ValueMapper import org.apache.kafka.streams.kstream.ValueMapper
import org.junit.ClassRule import org.junit.ClassRule
import org.springframework.kafka.core.DefaultKafkaConsumerFactory import org.springframework.kafka.core.DefaultKafkaConsumerFactory
@ -13,7 +11,6 @@ import org.springframework.kafka.core.DefaultKafkaProducerFactory
import org.springframework.kafka.core.KafkaTemplate import org.springframework.kafka.core.KafkaTemplate
import org.springframework.kafka.listener.KafkaMessageListenerContainer import org.springframework.kafka.listener.KafkaMessageListenerContainer
import org.springframework.kafka.listener.MessageListener import org.springframework.kafka.listener.MessageListener
import org.springframework.kafka.listener.config.ContainerProperties
import org.springframework.kafka.test.rule.KafkaEmbedded import org.springframework.kafka.test.rule.KafkaEmbedded
import org.springframework.kafka.test.utils.ContainerTestUtils import org.springframework.kafka.test.utils.ContainerTestUtils
import org.springframework.kafka.test.utils.KafkaTestUtils import org.springframework.kafka.test.utils.KafkaTestUtils
@ -41,7 +38,15 @@ class KafkaStreamsTest extends AgentTestRunner {
// CONFIGURE CONSUMER // CONFIGURE CONSUMER
def consumerFactory = new DefaultKafkaConsumerFactory<String, String>(KafkaTestUtils.consumerProps("sender", "false", embeddedKafka)) def consumerFactory = new DefaultKafkaConsumerFactory<String, String>(KafkaTestUtils.consumerProps("sender", "false", embeddedKafka))
def consumerContainer = new KafkaMessageListenerContainer<>(consumerFactory, new ContainerProperties(STREAM_PROCESSED))
def containerProperties
try {
// Different class names for test and latestDepTest.
containerProperties = Class.forName("org.springframework.kafka.listener.config.ContainerProperties").newInstance(STREAM_PROCESSED)
} catch (ClassNotFoundException | NoClassDefFoundError e) {
containerProperties = Class.forName("org.springframework.kafka.listener.ContainerProperties").newInstance(STREAM_PROCESSED)
}
def consumerContainer = new KafkaMessageListenerContainer<>(consumerFactory, containerProperties)
// create a thread safe queue to store the processed message // create a thread safe queue to store the processed message
def records = new LinkedBlockingQueue<ConsumerRecord<String, String>>() def records = new LinkedBlockingQueue<ConsumerRecord<String, String>>()
@ -65,9 +70,15 @@ class KafkaStreamsTest extends AgentTestRunner {
ContainerTestUtils.waitForAssignment(consumerContainer, embeddedKafka.getPartitionsPerTopic()) ContainerTestUtils.waitForAssignment(consumerContainer, embeddedKafka.getPartitionsPerTopic())
// CONFIGURE PROCESSOR // CONFIGURE PROCESSOR
final KStreamBuilder builder = new KStreamBuilder() def builder
try {
// Different class names for test and latestDepTest.
builder = Class.forName("org.apache.kafka.streams.kstream.KStreamBuilder").newInstance()
} catch (ClassNotFoundException | NoClassDefFoundError e) {
builder = Class.forName("org.apache.kafka.streams.StreamsBuilder").newInstance()
}
KStream<String, String> textLines = builder.stream(STREAM_PENDING) KStream<String, String> textLines = builder.stream(STREAM_PENDING)
textLines def values = textLines
.mapValues(new ValueMapper<String, String>() { .mapValues(new ValueMapper<String, String>() {
@Override @Override
String apply(String textLine) { String apply(String textLine) {
@ -76,8 +87,18 @@ class KafkaStreamsTest extends AgentTestRunner {
return textLine.toLowerCase() return textLine.toLowerCase()
} }
}) })
.to(Serdes.String(), Serdes.String(), STREAM_PROCESSED)
KafkaStreams streams = new KafkaStreams(builder, config) KafkaStreams streams
try {
// Different api for test and latestDepTest.
values.to(Serdes.String(), Serdes.String(), STREAM_PROCESSED)
streams = new KafkaStreams(builder, config)
} catch (MissingMethodException e) {
def producer = Class.forName("org.apache.kafka.streams.kstream.Produced")
.with(Serdes.String(), Serdes.String())
values.to(STREAM_PROCESSED, producer)
streams = new KafkaStreams(builder.build(), config)
}
streams.start() streams.start()
// CONFIGURE PRODUCER // CONFIGURE PRODUCER
@ -94,101 +115,89 @@ class KafkaStreamsTest extends AgentTestRunner {
received.value() == greeting.toLowerCase() received.value() == greeting.toLowerCase()
received.key() == null received.key() == null
TEST_WRITER.waitForTraces(3) assertTraces(3) {
TEST_WRITER.size() == 3 trace(0, 1) {
// PRODUCER span 0
span(0) {
serviceName "kafka"
operationName "kafka.produce"
resourceName "Produce Topic $STREAM_PENDING"
spanType "queue"
errored false
parent()
tags {
"component" "java-kafka"
"span.kind" "producer"
"span.type" "queue"
defaultTags()
}
}
}
trace(1, 2) {
def t1 = TEST_WRITER.get(0) // STREAMING span 0
t1.size() == 1 span(0) {
def t2 = TEST_WRITER.get(1) serviceName "kafka"
t2.size() == 2 operationName "kafka.produce"
def t3 = TEST_WRITER.get(2) resourceName "Produce Topic $STREAM_PROCESSED"
t3.size() == 1 spanType "queue"
errored false
childOf span(1)
and: // PRODUCER span 0 tags {
def t1span1 = t1[0] "component" "java-kafka"
"span.kind" "producer"
"span.type" "queue"
defaultTags()
}
}
t1span1.context().operationName == "kafka.produce" // STREAMING span 1
t1span1.serviceName == "kafka" span(1) {
t1span1.resourceName == "Produce Topic $STREAM_PENDING" serviceName "kafka"
t1span1.type == "queue" operationName "kafka.consume"
!t1span1.context().getErrorFlag() resourceName "Consume Topic $STREAM_PENDING"
t1span1.context().parentId == "0" spanType "queue"
errored false
childOf TEST_WRITER[0][0]
def t1tags1 = t1span1.context().tags tags {
t1tags1["component"] == "java-kafka" "component" "java-kafka"
t1tags1["span.kind"] == "producer" "span.kind" "consumer"
t1tags1["span.type"] == "queue" "span.type" "queue"
t1tags1["thread.name"] != null "partition" { it >= 0 }
t1tags1["thread.id"] != null "offset" 0
t1tags1[Config.RUNTIME_ID_TAG] == Config.get().runtimeId defaultTags(true)
t1tags1.size() == 6 "asdf" "testing"
}
and: // STREAMING span 0 }
def t2span1 = t2[0] }
trace(2, 1) {
t2span1.context().operationName == "kafka.produce" // CONSUMER span 0
t2span1.serviceName == "kafka" span(0) {
t2span1.resourceName == "Produce Topic $STREAM_PROCESSED" serviceName "kafka"
t2span1.type == "queue" operationName "kafka.consume"
!t2span1.context().getErrorFlag() resourceName "Consume Topic $STREAM_PROCESSED"
spanType "queue"
def t2tags1 = t2span1.context().tags errored false
t2tags1["component"] == "java-kafka" childOf TEST_WRITER[1][0]
t2tags1["span.kind"] == "producer" tags {
t2tags1["span.type"] == "queue" "component" "java-kafka"
t2tags1["thread.name"] != null "span.kind" "consumer"
t2tags1["thread.id"] != null "span.type" "queue"
t2tags1.size() == 5 "partition" { it >= 0 }
"offset" 0
and: // STREAMING span 1 defaultTags(true)
def t2span2 = t2[1] "testing" 123
t2span1.context().parentId == t2span2.context().spanId }
}
t2span2.context().operationName == "kafka.consume" }
t2span2.serviceName == "kafka" }
t2span2.resourceName == "Consume Topic $STREAM_PENDING"
t2span2.type == "queue"
!t2span2.context().getErrorFlag()
t2span2.context().parentId == t1span1.context().spanId
def t2tags2 = t2span2.context().tags
t2tags2["component"] == "java-kafka"
t2tags2["span.kind"] == "consumer"
t2tags2["span.type"] == "queue"
t2tags2["partition"] >= 0
t2tags2["offset"] == 0
t2tags2["thread.name"] != null
t2tags2["thread.id"] != null
t2tags2[Config.RUNTIME_ID_TAG] == Config.get().runtimeId
t2tags2["asdf"] == "testing"
t2tags2.size() == 9
and: // CONSUMER span 0
def t3span1 = t3[0]
t3span1.context().operationName == "kafka.consume"
t3span1.serviceName == "kafka"
t3span1.resourceName == "Consume Topic $STREAM_PROCESSED"
t3span1.type == "queue"
!t3span1.context().getErrorFlag()
t3span1.context().parentId == t2span1.context().spanId
def t3tags1 = t3span1.context().tags
t3tags1["component"] == "java-kafka"
t3tags1["span.kind"] == "consumer"
t3tags1["span.type"] == "queue"
t3tags1["partition"] >= 0
t3tags1["offset"] == 0
t3tags1["thread.name"] != null
t3tags1["thread.id"] != null
t3tags1[Config.RUNTIME_ID_TAG] == Config.get().runtimeId
t3tags1["testing"] == 123
t3tags1.size() == 9
def headers = received.headers() def headers = received.headers()
headers.iterator().hasNext() headers.iterator().hasNext()
new String(headers.headers("x-datadog-trace-id").iterator().next().value()) == "$t2span1.traceId" new String(headers.headers("x-datadog-trace-id").iterator().next().value()) == "${TEST_WRITER[1][0].traceId}"
new String(headers.headers("x-datadog-parent-id").iterator().next().value()) == "$t2span1.spanId" new String(headers.headers("x-datadog-parent-id").iterator().next().value()) == "${TEST_WRITER[1][0].spanId}"
cleanup: cleanup:

View File

@ -61,10 +61,7 @@ dependencies {
testCompile group: 'com.github.kstyrc', name: 'embedded-redis', version: '0.6' testCompile group: 'com.github.kstyrc', name: 'embedded-redis', version: '0.6'
testCompile group: 'io.lettuce', name: 'lettuce-core', version: '5.0.0.RELEASE' testCompile group: 'io.lettuce', name: 'lettuce-core', version: '5.0.0.RELEASE'
}
configurations.latestDepTestCompile { // FIXME: Tests need to be updated to support 5.1+
resolutionStrategy { latestDepTestCompile group: 'io.lettuce', name: 'lettuce-core', version: '5.0.+'
force group: 'io.lettuce', name: 'lettuce-core', version: '+'
}
} }

View File

@ -29,10 +29,5 @@ dependencies {
testCompile project(':dd-trace-ot') testCompile project(':dd-trace-ot')
testCompile group: 'org.mongodb', name: 'mongo-java-driver', version: '3.1.0' testCompile group: 'org.mongodb', name: 'mongo-java-driver', version: '3.1.0'
} latestDepTestCompile group: 'org.mongodb', name: 'mongo-java-driver', version: '+'
configurations.latestDepTestCompile {
resolutionStrategy {
force group: 'org.mongodb', name: 'mongo-java-driver', version: '+'
}
} }

View File

@ -44,6 +44,9 @@ dependencies {
testCompile group: 'io.netty', name: 'netty-codec-http', version: '4.0.0.Final' testCompile group: 'io.netty', name: 'netty-codec-http', version: '4.0.0.Final'
testCompile group: 'org.asynchttpclient', name: 'async-http-client', version: '2.0.0' testCompile group: 'org.asynchttpclient', name: 'async-http-client', version: '2.0.0'
latestDepTestCompile group: 'io.netty', name: 'netty-codec-http', version: '4.0.56.Final'
latestDepTestCompile group: 'org.asynchttpclient', name: 'async-http-client', version: '2.0.+'
} }
// We need to force the dependency to the earliest supported version because other libraries declare newer versions. // We need to force the dependency to the earliest supported version because other libraries declare newer versions.
@ -57,11 +60,3 @@ configurations.testCompile {
} }
} }
} }
configurations.latestDepTestCompile {
resolutionStrategy {
force group: 'io.netty', name: 'netty-codec-http', version: '4.0.56.Final'
force group: 'org.asynchttpclient', name: 'async-http-client', version: '2.0.+'
}
}

View File

@ -2,6 +2,7 @@ import datadog.trace.agent.test.AgentTestRunner
import datadog.trace.agent.test.TestUtils import datadog.trace.agent.test.TestUtils
import datadog.trace.api.DDSpanTypes import datadog.trace.api.DDSpanTypes
import datadog.trace.api.DDTags import datadog.trace.api.DDTags
import io.netty.channel.AbstractChannel
import io.opentracing.tag.Tags import io.opentracing.tag.Tags
import org.asynchttpclient.AsyncHttpClient import org.asynchttpclient.AsyncHttpClient
import org.asynchttpclient.DefaultAsyncHttpClientConfig import org.asynchttpclient.DefaultAsyncHttpClientConfig
@ -105,7 +106,11 @@ class Netty40ClientTest extends AgentTestRunner {
errored true errored true
tags { tags {
"$Tags.COMPONENT.key" "netty" "$Tags.COMPONENT.key" "netty"
errorTags ConnectException, "Connection refused: localhost/127.0.0.1:$invalidPort" try {
errorTags ConnectException, "Connection refused: localhost/127.0.0.1:$invalidPort"
} catch (AssertionError e) {
errorTags AbstractChannel.AnnotatedConnectException, "Connection refused: localhost/127.0.0.1:$invalidPort"
}
defaultTags() defaultTags()
} }
} }

View File

@ -42,6 +42,10 @@ dependencies {
testCompile project(':dd-java-agent:instrumentation:java-concurrent') testCompile project(':dd-java-agent:instrumentation:java-concurrent')
testCompile group: 'io.netty', name: 'netty-codec-http', version: '4.1.0.Final' testCompile group: 'io.netty', name: 'netty-codec-http', version: '4.1.0.Final'
testCompile group: 'org.asynchttpclient', name: 'async-http-client', version: '2.1.0' testCompile group: 'org.asynchttpclient', name: 'async-http-client', version: '2.1.0'
latestDepTestCompile group: 'io.netty', name: 'netty-codec-http', version: '(,5.0)'
// latest async-http-client incompatable with 5.0+ netty
latestDepTestCompile group: 'org.asynchttpclient', name: 'async-http-client', version: '+'
} }
// We need to force the dependency to the earliest supported version because other libraries declare newer versions. // We need to force the dependency to the earliest supported version because other libraries declare newer versions.
@ -55,11 +59,3 @@ configurations.testCompile {
} }
} }
} }
configurations.latestDepTestCompile {
resolutionStrategy {
force group: 'io.netty', name: 'netty-codec-http', version: '+'
force group: 'org.asynchttpclient', name: 'async-http-client', version: '+'
}
}

View File

@ -27,12 +27,10 @@ dependencies {
annotationProcessor deps.autoservice annotationProcessor deps.autoservice
implementation deps.autoservice implementation deps.autoservice
testCompile project(':dd-java-agent:testing') testCompile(project(':dd-java-agent:testing')) {
testCompile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.0.0' exclude module: 'okhttp'
}
configurations.latestDepTestCompile {
resolutionStrategy {
force group: 'com.squareup.okhttp3', name: 'okhttp', version: '+'
} }
testCompile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.0.0'
latestDepTestCompile group: 'com.squareup.okhttp3', name: 'okhttp', version: '[3.11.0,)'
} }

View File

@ -66,10 +66,5 @@ dependencies {
testCompile project(':dd-java-agent:testing') testCompile project(':dd-java-agent:testing')
testCompile group: 'io.ratpack', name: 'ratpack-groovy-test', version: '1.4.0' testCompile group: 'io.ratpack', name: 'ratpack-groovy-test', version: '1.4.0'
} latestDepTestCompile group: 'io.ratpack', name: 'ratpack-groovy-test', version: '+'
configurations.latestDepTestCompile {
resolutionStrategy {
force group: 'io.ratpack', name: 'ratpack-groovy-test', version: '+'
}
} }

View File

@ -41,13 +41,9 @@ dependencies {
testCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '8.2.0.v20160908' testCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '8.2.0.v20160908'
testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '8.0.41' testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '8.0.41'
testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '8.0.41' testCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '8.0.41'
}
configurations.latestDepTestCompile { latestDepTestCompile group: 'org.eclipse.jetty', name: 'jetty-server', version: '+'
resolutionStrategy { latestDepTestCompile group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '+'
force group: 'org.eclipse.jetty', name: 'jetty-server', version: '+' latestDepTestCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '+'
force group: 'org.eclipse.jetty', name: 'jetty-servlet', version: '+' latestDepTestCompile group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '+'
force group: 'org.apache.tomcat.embed', name: 'tomcat-embed-core', version: '+'
force group: 'org.apache.tomcat.embed', name: 'tomcat-embed-jasper', version: '+'
}
} }

View File

@ -7,7 +7,6 @@ import okhttp3.Interceptor
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.eclipse.jetty.http.HttpHeaders
import org.eclipse.jetty.security.ConstraintMapping import org.eclipse.jetty.security.ConstraintMapping
import org.eclipse.jetty.security.ConstraintSecurityHandler import org.eclipse.jetty.security.ConstraintSecurityHandler
import org.eclipse.jetty.security.HashLoginService import org.eclipse.jetty.security.HashLoginService
@ -16,6 +15,7 @@ import org.eclipse.jetty.security.authentication.BasicAuthenticator
import org.eclipse.jetty.server.Server import org.eclipse.jetty.server.Server
import org.eclipse.jetty.servlet.ServletContextHandler import org.eclipse.jetty.servlet.ServletContextHandler
import org.eclipse.jetty.util.security.Constraint import org.eclipse.jetty.util.security.Constraint
import spock.lang.Shared
class JettyServlet3Test extends AgentTestRunner { class JettyServlet3Test extends AgentTestRunner {
@ -29,11 +29,14 @@ class JettyServlet3Test extends AgentTestRunner {
}) })
.build() .build()
@Shared
int port int port
@Shared
private Server jettyServer private Server jettyServer
@Shared
private ServletContextHandler servletContext private ServletContextHandler servletContext
def setup() { def setupSpec() {
port = TestUtils.randomOpenPort() port = TestUtils.randomOpenPort()
jettyServer = new Server(port) jettyServer = new Server(port)
servletContext = new ServletContextHandler() servletContext = new ServletContextHandler()
@ -53,7 +56,7 @@ class JettyServlet3Test extends AgentTestRunner {
"Jetty server: http://localhost:" + port + "/") "Jetty server: http://localhost:" + port + "/")
} }
def cleanup() { def cleanupSpec() {
jettyServer.stop() jettyServer.stop()
jettyServer.destroy() jettyServer.destroy()
} }
@ -68,7 +71,7 @@ class JettyServlet3Test extends AgentTestRunner {
requestBuilder.header("x-datadog-parent-id", "456") requestBuilder.header("x-datadog-parent-id", "456")
} }
if (auth) { if (auth) {
requestBuilder.header(HttpHeaders.AUTHORIZATION, Credentials.basic("user", "password")) requestBuilder.header("Authorization", Credentials.basic("user", "password"))
} }
def response = client.newCall(requestBuilder.build()).execute() def response = client.newCall(requestBuilder.build()).execute()

View File

@ -10,19 +10,24 @@ import org.apache.catalina.core.ApplicationFilterChain
import org.apache.catalina.startup.Tomcat import org.apache.catalina.startup.Tomcat
import org.apache.tomcat.JarScanFilter import org.apache.tomcat.JarScanFilter
import org.apache.tomcat.JarScanType import org.apache.tomcat.JarScanType
import spock.lang.Shared
class TomcatServlet3Test extends AgentTestRunner { class TomcatServlet3Test extends AgentTestRunner {
OkHttpClient client = OkHttpUtils.client() OkHttpClient client = OkHttpUtils.client()
@Shared
int port int port
@Shared
Tomcat tomcatServer Tomcat tomcatServer
@Shared
Context appContext Context appContext
def setup() { def setupSpec() {
port = TestUtils.randomOpenPort() port = TestUtils.randomOpenPort()
tomcatServer = new Tomcat() tomcatServer = new Tomcat()
tomcatServer.setPort(port) tomcatServer.setPort(port)
tomcatServer.getConnector()
def baseDir = Files.createTempDir() def baseDir = Files.createTempDir()
baseDir.deleteOnExit() baseDir.deleteOnExit()
@ -52,7 +57,7 @@ class TomcatServlet3Test extends AgentTestRunner {
"Tomcat server: http://" + tomcatServer.getHost().getName() + ":" + port + "/") "Tomcat server: http://" + tomcatServer.getHost().getName() + ":" + port + "/")
} }
def cleanup() { def cleanupSpec() {
tomcatServer.stop() tomcatServer.stop()
tomcatServer.destroy() tomcatServer.destroy()
} }

View File

@ -54,9 +54,3 @@ dependencies {
latestDepTestCompile group: 'com.sparkjava', name: 'spark-core', version: '+' latestDepTestCompile group: 'com.sparkjava', name: 'spark-core', version: '+'
} }
configurations.latestDepTestCompile {
resolutionStrategy {
force group: 'com.sparkjava', name: 'spark-core', version: '+'
}
}

View File

@ -74,12 +74,9 @@ dependencies {
testCompile group: 'org.spockframework', name: 'spock-spring', version: '1.1-groovy-2.4' testCompile group: 'org.spockframework', name: 'spock-spring', version: '1.1-groovy-2.4'
testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.0.0.RELEASE' testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.0.0.RELEASE'
testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-reactor-netty', version: '2.0.0.RELEASE' testCompile group: 'org.springframework.boot', name: 'spring-boot-starter-reactor-netty', version: '2.0.0.RELEASE'
}
configurations.latestDepTestCompile { // FIXME: Tests need to be updated to support 2.1+
resolutionStrategy { latestDepTestCompile group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '2.0.+'
force group: 'org.springframework.boot', name: 'spring-boot-starter-webflux', version: '+' latestDepTestCompile group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '2.0.+'
force group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: '+' latestDepTestCompile group: 'org.springframework.boot', name: 'spring-boot-starter-reactor-netty', version: '2.0.+'
force group: 'org.springframework.boot', name: 'spring-boot-starter-reactor-netty', version: '+'
}
} }

View File

@ -13,7 +13,6 @@ import okhttp3.RequestBody
import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.context.SpringBootTest
import org.springframework.boot.web.server.LocalServerPort import org.springframework.boot.web.server.LocalServerPort
import org.springframework.web.server.ResponseStatusException import org.springframework.web.server.ResponseStatusException
import spock.lang.Unroll
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringWebFluxTestApplication) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = SpringWebFluxTestApplication)
class SpringWebfluxTest extends AgentTestRunner { class SpringWebfluxTest extends AgentTestRunner {
@ -27,7 +26,6 @@ class SpringWebfluxTest extends AgentTestRunner {
OkHttpClient client = OkHttpUtils.client() OkHttpClient client = OkHttpUtils.client()
@Unroll
def "Basic GET test #testName to functional API"() { def "Basic GET test #testName to functional API"() {
setup: setup:
String url = "http://localhost:$port/greet$urlSuffix" String url = "http://localhost:$port/greet$urlSuffix"
@ -82,7 +80,6 @@ class SpringWebfluxTest extends AgentTestRunner {
"with two parameters" | "/World/Test1" | "/{name}/{word}" | SpringWebFluxTestApplication.GreetingHandler.DEFAULT_RESPONSE + " World Test1" "with two parameters" | "/World/Test1" | "/{name}/{word}" | SpringWebFluxTestApplication.GreetingHandler.DEFAULT_RESPONSE + " World Test1"
} }
@Unroll
def "Basic GET test #testName to annotations API"() { def "Basic GET test #testName to annotations API"() {
setup: setup:
String url = "http://localhost:$port/foo$urlSuffix" String url = "http://localhost:$port/foo$urlSuffix"
@ -417,7 +414,6 @@ class SpringWebfluxTest extends AgentTestRunner {
} }
} }
@Unroll
def "Flux x#count GET test with functional API endpoint"() { def "Flux x#count GET test with functional API endpoint"() {
setup: setup:
String expectedResponseBodyStr = FooModel.createXFooModelsStringFromArray(FooModel.createXFooModels(count)) String expectedResponseBodyStr = FooModel.createXFooModelsStringFromArray(FooModel.createXFooModels(count))
@ -471,7 +467,6 @@ class SpringWebfluxTest extends AgentTestRunner {
count << [0, 1, 10] count << [0, 1, 10]
} }
@Unroll
def "Flux x#count GET test with spring annotations endpoint"() { def "Flux x#count GET test with spring annotations endpoint"() {
setup: setup:
String expectedResponseBodyStr = FooModel.createXFooModelsStringFromArray(FooModel.createXFooModels(count)) String expectedResponseBodyStr = FooModel.createXFooModelsStringFromArray(FooModel.createXFooModels(count))

View File

@ -33,11 +33,6 @@ dependencies {
testCompile group: 'net.spy', name: 'spymemcached', version: '2.12.0' testCompile group: 'net.spy', name: 'spymemcached', version: '2.12.0'
testCompile deps.testcontainers testCompile deps.testcontainers
}
configurations.latestDepTestCompile { latestDepTestCompile group: 'net.spy', name: 'spymemcached', version: '+'
resolutionStrategy {
force group: 'net.spy', name: 'spymemcached', version: '+'
}
} }

View File

@ -20,13 +20,13 @@ muzzle {
} }
} }
apply plugin: 'org.unbroken-dome.test-sets' //apply plugin: 'org.unbroken-dome.test-sets'
//
testSets { //testSets {
latestDepTest { // latestDepTest {
dirName = 'test' // dirName = 'test'
} // }
} //}
sourceCompatibility = 1.8 sourceCompatibility = 1.8
targetCompatibility = 1.8 targetCompatibility = 1.8

View File

@ -7,10 +7,11 @@ import java.util.concurrent.TimeUnit
class OkHttpUtils { class OkHttpUtils {
static clientBuilder() { static clientBuilder() {
def unit = TimeUnit.MINUTES
new OkHttpClient.Builder() new OkHttpClient.Builder()
.connectTimeout(1, TimeUnit.MINUTES) .connectTimeout(1, unit)
.writeTimeout(1, TimeUnit.MINUTES) .writeTimeout(1, unit)
.readTimeout(1, TimeUnit.MINUTES) .readTimeout(1, unit)
} }
static client() { static client() {

View File

@ -118,6 +118,18 @@ artifacts {
archives javaDocJar archives javaDocJar
} }
project.afterEvaluate {
if (project.plugins.hasPlugin('org.unbroken-dome.test-sets') && configurations.hasProperty("latestDepTestRuntime")) {
tasks.withType(Test) {
doFirst{
def testArtifacts = configurations.testRuntime.resolvedConfiguration.resolvedArtifacts
def latestTestArtifacts = configurations.latestDepTestRuntime.resolvedConfiguration.resolvedArtifacts
assert testArtifacts != latestTestArtifacts : "latestDepTest dependencies are identical to test"
}
}
}
}
if (project.plugins.hasPlugin('com.github.johnrengelman.shadow')) { if (project.plugins.hasPlugin('com.github.johnrengelman.shadow')) {
// Remove the no-deps jar from the archives to prevent publication // Remove the no-deps jar from the archives to prevent publication
configurations.archives.with { configurations.archives.with {