Adapt tests to the new Config approach instance vs static
This commit is contained in:
parent
8debe771d4
commit
ae03abe63c
|
@ -1,6 +1,7 @@
|
||||||
import datadog.opentracing.DDSpan
|
import datadog.opentracing.DDSpan
|
||||||
import datadog.opentracing.scopemanager.ContinuableScope
|
import datadog.opentracing.scopemanager.ContinuableScope
|
||||||
import datadog.trace.agent.test.AgentTestRunner
|
import datadog.trace.agent.test.AgentTestRunner
|
||||||
|
import datadog.trace.agent.test.utils.ConfigUtils
|
||||||
import datadog.trace.api.Trace
|
import datadog.trace.api.Trace
|
||||||
import datadog.trace.bootstrap.instrumentation.java.concurrent.CallableWrapper
|
import datadog.trace.bootstrap.instrumentation.java.concurrent.CallableWrapper
|
||||||
import datadog.trace.bootstrap.instrumentation.java.concurrent.RunnableWrapper
|
import datadog.trace.bootstrap.instrumentation.java.concurrent.RunnableWrapper
|
||||||
|
@ -25,7 +26,9 @@ import java.util.concurrent.TimeoutException
|
||||||
class ExecutorInstrumentationTest extends AgentTestRunner {
|
class ExecutorInstrumentationTest extends AgentTestRunner {
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
ConfigUtils.makeConfigInstanceModifiable()
|
||||||
System.setProperty("dd.trace.executors", "ExecutorInstrumentationTest\$CustomThreadPoolExecutor")
|
System.setProperty("dd.trace.executors", "ExecutorInstrumentationTest\$CustomThreadPoolExecutor")
|
||||||
|
ConfigUtils.resetConfig()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Shared
|
@Shared
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import datadog.trace.agent.test.AgentTestRunner
|
import datadog.trace.agent.test.AgentTestRunner
|
||||||
|
import datadog.trace.agent.test.utils.ConfigUtils
|
||||||
import datadog.trace.api.CorrelationIdentifier
|
import datadog.trace.api.CorrelationIdentifier
|
||||||
import io.opentracing.Scope
|
import io.opentracing.Scope
|
||||||
import io.opentracing.util.GlobalTracer
|
import io.opentracing.util.GlobalTracer
|
||||||
|
@ -8,7 +9,9 @@ import java.util.concurrent.atomic.AtomicReference
|
||||||
|
|
||||||
class Slf4jMDCTest extends AgentTestRunner {
|
class Slf4jMDCTest extends AgentTestRunner {
|
||||||
static {
|
static {
|
||||||
|
ConfigUtils.makeConfigInstanceModifiable()
|
||||||
System.setProperty("dd.logs.injection", "true")
|
System.setProperty("dd.logs.injection", "true")
|
||||||
|
ConfigUtils.resetConfig()
|
||||||
}
|
}
|
||||||
|
|
||||||
def "mdc shows trace and span ids for active scope"() {
|
def "mdc shows trace and span ids for active scope"() {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import datadog.trace.agent.test.AgentTestRunner
|
import datadog.trace.agent.test.AgentTestRunner
|
||||||
|
import datadog.trace.agent.test.utils.ConfigUtils
|
||||||
import datadog.trace.instrumentation.trace_annotation.TraceAnnotationsInstrumentation
|
import datadog.trace.instrumentation.trace_annotation.TraceAnnotationsInstrumentation
|
||||||
import dd.test.trace.annotation.SayTracedHello
|
import dd.test.trace.annotation.SayTracedHello
|
||||||
|
|
||||||
|
@ -10,8 +11,10 @@ import static datadog.trace.instrumentation.trace_annotation.TraceAnnotationsIns
|
||||||
class ConfiguredTraceAnnotationsTest extends AgentTestRunner {
|
class ConfiguredTraceAnnotationsTest extends AgentTestRunner {
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
ConfigUtils.makeConfigInstanceModifiable()
|
||||||
// nr annotation not included here, so should be disabled.
|
// nr annotation not included here, so should be disabled.
|
||||||
System.setProperty("dd.trace.annotations", "package.Class\$Name;${OuterClass.InterestingMethod.name}")
|
System.setProperty("dd.trace.annotations", "package.Class\$Name;${OuterClass.InterestingMethod.name}")
|
||||||
|
ConfigUtils.resetConfig()
|
||||||
}
|
}
|
||||||
|
|
||||||
def specCleanup() {
|
def specCleanup() {
|
||||||
|
@ -47,6 +50,7 @@ class ConfiguredTraceAnnotationsTest extends AgentTestRunner {
|
||||||
def "test configuration #value"() {
|
def "test configuration #value"() {
|
||||||
setup:
|
setup:
|
||||||
def config = withSystemProperty("dd.trace.annotations", value) {
|
def config = withSystemProperty("dd.trace.annotations", value) {
|
||||||
|
ConfigUtils.resetConfig()
|
||||||
new TraceAnnotationsInstrumentation().additionalTraceAnnotations
|
new TraceAnnotationsInstrumentation().additionalTraceAnnotations
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
import datadog.opentracing.decorators.ErrorFlag
|
import datadog.opentracing.decorators.ErrorFlag
|
||||||
import datadog.trace.agent.test.AgentTestRunner
|
import datadog.trace.agent.test.AgentTestRunner
|
||||||
|
import datadog.trace.agent.test.utils.ConfigUtils
|
||||||
import datadog.trace.api.Trace
|
import datadog.trace.api.Trace
|
||||||
import dd.test.trace.annotation.SayTracedHello
|
import dd.test.trace.annotation.SayTracedHello
|
||||||
import io.opentracing.tag.Tags
|
import io.opentracing.tag.Tags
|
||||||
|
@ -9,12 +10,15 @@ import java.util.concurrent.Callable
|
||||||
class TraceAnnotationsTest extends AgentTestRunner {
|
class TraceAnnotationsTest extends AgentTestRunner {
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
ConfigUtils.makeConfigInstanceModifiable()
|
||||||
System.clearProperty("dd.trace.annotations")
|
System.clearProperty("dd.trace.annotations")
|
||||||
|
ConfigUtils.resetConfig(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
def "test simple case annotations"() {
|
def "test simple case annotations"() {
|
||||||
setup:
|
setup:
|
||||||
// Test single span in new trace
|
// Test single span in new trace
|
||||||
|
ConfigUtils.resetConfig(true)
|
||||||
SayTracedHello.sayHello()
|
SayTracedHello.sayHello()
|
||||||
|
|
||||||
expect:
|
expect:
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import datadog.trace.agent.test.AgentTestRunner
|
import datadog.trace.agent.test.AgentTestRunner
|
||||||
|
import datadog.trace.agent.test.utils.ConfigUtils
|
||||||
import datadog.trace.instrumentation.trace_annotation.TraceConfigInstrumentation
|
import datadog.trace.instrumentation.trace_annotation.TraceConfigInstrumentation
|
||||||
|
|
||||||
import java.util.concurrent.Callable
|
import java.util.concurrent.Callable
|
||||||
|
@ -8,11 +9,14 @@ import static datadog.trace.agent.test.utils.ConfigUtils.withSystemProperty
|
||||||
class TraceConfigTest extends AgentTestRunner {
|
class TraceConfigTest extends AgentTestRunner {
|
||||||
|
|
||||||
static {
|
static {
|
||||||
|
ConfigUtils.makeConfigInstanceModifiable()
|
||||||
System.setProperty("dd.trace.methods", "package.ClassName[method1,method2];${ConfigTracedCallable.name}[call]")
|
System.setProperty("dd.trace.methods", "package.ClassName[method1,method2];${ConfigTracedCallable.name}[call]")
|
||||||
|
ConfigUtils.resetConfig()
|
||||||
}
|
}
|
||||||
|
|
||||||
def specCleanup() {
|
def specCleanup() {
|
||||||
System.clearProperty("dd.trace.methods")
|
System.clearProperty("dd.trace.methods")
|
||||||
|
ConfigUtils.resetConfig()
|
||||||
}
|
}
|
||||||
|
|
||||||
class ConfigTracedCallable implements Callable<String> {
|
class ConfigTracedCallable implements Callable<String> {
|
||||||
|
@ -44,6 +48,7 @@ class TraceConfigTest extends AgentTestRunner {
|
||||||
setup:
|
setup:
|
||||||
def config = null
|
def config = null
|
||||||
withSystemProperty("dd.trace.methods", value) {
|
withSystemProperty("dd.trace.methods", value) {
|
||||||
|
ConfigUtils.resetConfig()
|
||||||
def instrumentation = new TraceConfigInstrumentation()
|
def instrumentation = new TraceConfigInstrumentation()
|
||||||
config = instrumentation.classMethodsToTrace
|
config = instrumentation.classMethodsToTrace
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@ class ConfigUtils {
|
||||||
private static class ConfigInstance {
|
private static class ConfigInstance {
|
||||||
// Wrapped in a static class to lazy load.
|
// Wrapped in a static class to lazy load.
|
||||||
static final FIELD = Config.getDeclaredField("INSTANCE")
|
static final FIELD = Config.getDeclaredField("INSTANCE")
|
||||||
|
static final RUNTIME_ID_FIELD = Config.getDeclaredField("runtimeId")
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: ideally all users of this should switch to using Config object (and withConfigOverride) instead.
|
// TODO: ideally all users of this should switch to using Config object (and withConfigOverride) instead.
|
||||||
|
@ -60,15 +61,27 @@ class ConfigUtils {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calling will reset the runtimeId too, so it might cause problems around runtimeId verification.
|
* Calling will reset the runtimeId too, so it might cause problems around runtimeId verification.
|
||||||
|
* If you are testing runtimeId provide <code>preserveRuntimeId = false</code> to copy the previous runtimeId
|
||||||
|
* tot he new config instance.
|
||||||
*/
|
*/
|
||||||
static void resetConfig() {
|
static void resetConfig(preserveRuntimeId = false) {
|
||||||
// Ensure the class was retransformed properly in AgentTestRunner.makeConfigInstanceModifiable()
|
// Ensure the class was retransformed properly in AgentTestRunner.makeConfigInstanceModifiable()
|
||||||
assert Modifier.isPublic(ConfigInstance.FIELD.getModifiers())
|
assert Modifier.isPublic(ConfigInstance.FIELD.getModifiers())
|
||||||
assert Modifier.isStatic(ConfigInstance.FIELD.getModifiers())
|
assert Modifier.isStatic(ConfigInstance.FIELD.getModifiers())
|
||||||
assert Modifier.isVolatile(ConfigInstance.FIELD.getModifiers())
|
assert Modifier.isVolatile(ConfigInstance.FIELD.getModifiers())
|
||||||
assert !Modifier.isFinal(ConfigInstance.FIELD.getModifiers())
|
assert !Modifier.isFinal(ConfigInstance.FIELD.getModifiers())
|
||||||
|
|
||||||
ConfigInstance.FIELD.set(null, new Config())
|
assert Modifier.isPublic(ConfigInstance.RUNTIME_ID_FIELD.getModifiers())
|
||||||
|
assert !Modifier.isStatic(ConfigInstance.RUNTIME_ID_FIELD.getModifiers())
|
||||||
|
assert Modifier.isVolatile(ConfigInstance.RUNTIME_ID_FIELD.getModifiers())
|
||||||
|
assert !Modifier.isFinal(ConfigInstance.RUNTIME_ID_FIELD.getModifiers())
|
||||||
|
|
||||||
|
def previousConfig = ConfigInstance.FIELD.get(null)
|
||||||
|
def newConfig = new Config()
|
||||||
|
ConfigInstance.FIELD.set(null, newConfig)
|
||||||
|
if (previousConfig != null && preserveRuntimeId) {
|
||||||
|
ConfigInstance.RUNTIME_ID_FIELD.set(newConfig, ConfigInstance.RUNTIME_ID_FIELD.get(previousConfig))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void makeConfigInstanceModifiable() {
|
static void makeConfigInstanceModifiable() {
|
||||||
|
@ -88,6 +101,12 @@ class ConfigUtils {
|
||||||
.field(named("INSTANCE"))
|
.field(named("INSTANCE"))
|
||||||
.transform(Transformer.ForField.withModifiers(PUBLIC, STATIC, VOLATILE))
|
.transform(Transformer.ForField.withModifiers(PUBLIC, STATIC, VOLATILE))
|
||||||
}
|
}
|
||||||
|
// Making runtimeId modifiable so that it can be preserved when resetting config in tests
|
||||||
|
.transform { builder, typeDescription, classLoader, module ->
|
||||||
|
builder
|
||||||
|
.field(named("runtimeId"))
|
||||||
|
.transform(Transformer.ForField.withModifiers(PUBLIC, VOLATILE))
|
||||||
|
}
|
||||||
.installOn(instrumentation)
|
.installOn(instrumentation)
|
||||||
|
|
||||||
final field = ConfigInstance.FIELD
|
final field = ConfigInstance.FIELD
|
||||||
|
@ -96,6 +115,12 @@ class ConfigUtils {
|
||||||
assert Modifier.isVolatile(field.getModifiers())
|
assert Modifier.isVolatile(field.getModifiers())
|
||||||
assert !Modifier.isFinal(field.getModifiers())
|
assert !Modifier.isFinal(field.getModifiers())
|
||||||
|
|
||||||
|
final runtimeIdField = ConfigInstance.RUNTIME_ID_FIELD
|
||||||
|
assert Modifier.isPublic(runtimeIdField.getModifiers())
|
||||||
|
assert !Modifier.isStatic(ConfigInstance.RUNTIME_ID_FIELD.getModifiers())
|
||||||
|
assert Modifier.isVolatile(runtimeIdField.getModifiers())
|
||||||
|
assert !Modifier.isFinal(runtimeIdField.getModifiers())
|
||||||
|
|
||||||
// No longer needed (Unless class gets retransformed somehow).
|
// No longer needed (Unless class gets retransformed somehow).
|
||||||
instrumentation.removeTransformer(transformer)
|
instrumentation.removeTransformer(transformer)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue