Adapt tests to the new Config approach instance vs static

This commit is contained in:
Luca Abbati 2019-06-05 12:17:09 +02:00
parent 8debe771d4
commit ae03abe63c
No known key found for this signature in database
GPG Key ID: 74DBB952D9BA17F2
6 changed files with 46 additions and 2 deletions

View File

@ -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

View File

@ -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"() {

View File

@ -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
} }

View File

@ -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:

View File

@ -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
} }

View File

@ -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)
} }