Skip to content

Commit 3e8bd77

Browse files
committed
feat(core): Add tracing propagator unit tests
1 parent d757f57 commit 3e8bd77

File tree

1 file changed

+185
-0
lines changed

1 file changed

+185
-0
lines changed
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
package datadog.trace.core.propagation
2+
3+
import datadog.context.Context
4+
import datadog.context.propagation.CarrierSetter
5+
import datadog.context.propagation.Propagators
6+
import datadog.trace.api.sampling.PrioritySampling
7+
import datadog.trace.bootstrap.instrumentation.api.AgentPropagation
8+
import datadog.trace.common.writer.LoggingWriter
9+
import datadog.trace.core.ControllableSampler
10+
import datadog.trace.core.test.DDCoreSpecification
11+
12+
import static datadog.trace.api.sampling.PrioritySampling.SAMPLER_KEEP
13+
import static datadog.trace.api.sampling.PrioritySampling.USER_DROP
14+
import static datadog.trace.bootstrap.instrumentation.api.AgentPropagation.XRAY_TRACING_CONCERN
15+
16+
class TracingPropagatorTest extends DDCoreSpecification {
17+
HttpCodec.Injector injector
18+
HttpCodec.Extractor extractor
19+
TracingPropagator propagator
20+
21+
def setup() {
22+
injector = Mock(HttpCodec.Injector)
23+
extractor = Mock(HttpCodec.Extractor)
24+
this.propagator = new TracingPropagator(injector, extractor)
25+
}
26+
27+
def 'test tracing propagator context injection'() {
28+
setup:
29+
def tracer = tracerBuilder().build()
30+
def span = tracer.buildSpan('test', 'operation').start()
31+
def setter = Mock(CarrierSetter)
32+
def carrier = new Object()
33+
34+
when:
35+
this.propagator.inject(span, carrier, setter)
36+
37+
then:
38+
1 * injector.inject(span.context(), carrier, _)
39+
40+
cleanup:
41+
span.finish()
42+
tracer.close()
43+
}
44+
45+
def 'test tracing propagator context extractor'() {
46+
setup:
47+
def context = Context.root()
48+
// TODO Use ContextVisitor mock as getter once extractor API is refactored
49+
def getter = Mock(AgentPropagation.ContextVisitor)
50+
def carrier = new Object()
51+
52+
when:
53+
this.propagator.extract(context, carrier, getter)
54+
55+
then:
56+
1 * extractor.extract(carrier, _)
57+
}
58+
59+
def 'span priority set when injecting'() {
60+
given:
61+
injectSysConfig('writer.type', 'LoggingWriter')
62+
def tracer = tracerBuilder().build()
63+
def setter = Mock(CarrierSetter)
64+
def carrier = new Object()
65+
66+
when:
67+
def root = tracer.buildSpan('test', 'parent').start()
68+
def child = tracer.buildSpan('test', 'child').asChildOf(root).start()
69+
Propagators.defaultPropagator().inject(child, carrier, setter)
70+
71+
then:
72+
root.getSamplingPriority() == SAMPLER_KEEP as int
73+
child.getSamplingPriority() == root.getSamplingPriority()
74+
1 * setter.set(carrier, DatadogHttpCodec.SAMPLING_PRIORITY_KEY, String.valueOf(SAMPLER_KEEP))
75+
76+
cleanup:
77+
child.finish()
78+
root.finish()
79+
tracer.close()
80+
}
81+
82+
def 'span priority only set after first injection'() {
83+
given:
84+
def sampler = new ControllableSampler()
85+
def tracer = tracerBuilder().writer(new LoggingWriter()).sampler(sampler).build()
86+
def setter = Mock(AgentPropagation.Setter)
87+
def carrier = new Object()
88+
89+
when:
90+
def root = tracer.buildSpan('test', 'parent').start()
91+
def child = tracer.buildSpan('test', 'child').asChildOf(root).start()
92+
Propagators.defaultPropagator().inject(child, carrier, setter)
93+
94+
then:
95+
root.getSamplingPriority() == SAMPLER_KEEP as int
96+
child.getSamplingPriority() == root.getSamplingPriority()
97+
1 * setter.set(carrier, DatadogHttpCodec.SAMPLING_PRIORITY_KEY, String.valueOf(SAMPLER_KEEP))
98+
99+
when:
100+
sampler.nextSamplingPriority = PrioritySampling.SAMPLER_DROP as int
101+
def child2 = tracer.buildSpan('test', 'child2').asChildOf(root).start()
102+
Propagators.defaultPropagator().inject(child2, carrier, setter)
103+
104+
then:
105+
root.getSamplingPriority() == SAMPLER_KEEP as int
106+
child.getSamplingPriority() == root.getSamplingPriority()
107+
child2.getSamplingPriority() == root.getSamplingPriority()
108+
1 * setter.set(carrier, DatadogHttpCodec.SAMPLING_PRIORITY_KEY, String.valueOf(SAMPLER_KEEP))
109+
110+
cleanup:
111+
child.finish()
112+
child2.finish()
113+
root.finish()
114+
tracer.close()
115+
}
116+
117+
def 'injection does not override set priority'() {
118+
given:
119+
def sampler = new ControllableSampler()
120+
def tracer = tracerBuilder().writer(new LoggingWriter()).sampler(sampler).build()
121+
def setter = Mock(AgentPropagation.Setter)
122+
def carrier = new Object()
123+
124+
when:
125+
def root = tracer.buildSpan('test', 'root').start()
126+
def child = tracer.buildSpan('test', 'child').asChildOf(root).start()
127+
child.setSamplingPriority(USER_DROP)
128+
Propagators.defaultPropagator().inject(child, carrier, setter)
129+
130+
then:
131+
root.getSamplingPriority() == USER_DROP as int
132+
child.getSamplingPriority() == root.getSamplingPriority()
133+
1 * setter.set(carrier, DatadogHttpCodec.SAMPLING_PRIORITY_KEY, String.valueOf(USER_DROP))
134+
135+
cleanup:
136+
child.finish()
137+
root.finish()
138+
tracer.close()
139+
}
140+
141+
def 'test ASM standalone billing propagator stop propagation'() {
142+
setup:
143+
injectSysConfig('experimental.appsec.standalone.enabled', standaloneAsmEnabled.toString())
144+
def tracer = tracerBuilder().build()
145+
def span = tracer.buildSpan('test', 'operation').start()
146+
def setter = Mock(CarrierSetter)
147+
def carrier = new Object()
148+
149+
when:
150+
Propagators.defaultPropagator().inject(span, carrier, setter)
151+
152+
then:
153+
if (standaloneAsmEnabled) {
154+
0 * setter.set(_, _, _)
155+
} else {
156+
(1.._) * setter.set(_, _, _)
157+
}
158+
159+
cleanup:
160+
span.finish()
161+
tracer.close()
162+
163+
where:
164+
standaloneAsmEnabled << [true, false]
165+
}
166+
167+
def 'test AWS X-Ray propagator'() {
168+
setup:
169+
def tracer = tracerBuilder().build()
170+
def span = tracer.buildSpan('test', 'operation').start()
171+
def propagator = Propagators.forConcerns(XRAY_TRACING_CONCERN)
172+
def setter = Mock(CarrierSetter)
173+
def carrier = new Object()
174+
175+
when:
176+
propagator.inject(span, carrier, setter)
177+
178+
then:
179+
1 * setter.set(carrier, 'X-Amzn-Trace-Id', _)
180+
181+
cleanup:
182+
span.finish()
183+
tracer.close()
184+
}
185+
}

0 commit comments

Comments
 (0)