Skip to content

Commit 1cf51e2

Browse files
Fixed tests
1 parent 4714a0c commit 1cf51e2

5 files changed

Lines changed: 129 additions & 37 deletions

File tree

dd-java-agent/appsec/src/main/java/com/datadog/appsec/config/AppSecFeatures.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,7 @@
33
public class AppSecFeatures {
44
public Asm asm;
55

6-
@com.squareup.moshi.Json(name = "api_security")
7-
public ApiSecurity apiSecurity;
8-
96
public static class Asm {
107
public boolean enabled;
118
}
12-
13-
public static class ApiSecurity {
14-
@com.squareup.moshi.Json(name = "request_sample_rate")
15-
public Float requestSampleRate;
16-
}
179
}

dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/gateway/GatewayBridgeSpecification.groovy

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import datadog.trace.bootstrap.instrumentation.api.URIDataAdapter
2424
import datadog.trace.bootstrap.instrumentation.api.URIDataAdapterBase
2525
import datadog.trace.test.util.DDSpecification
2626

27+
import java.util.function.BiConsumer
2728
import java.util.function.BiFunction
2829
import java.util.function.Function
2930
import java.util.function.Supplier
@@ -87,6 +88,7 @@ class GatewayBridgeSpecification extends DDSpecification {
8788
Function<RequestContext, Flow<Void>> respHeadersDoneCB
8889
BiFunction<RequestContext, Object, Flow<Void>> grpcServerRequestMessageCB
8990
BiFunction<RequestContext, Map<String, Object>, Flow<Void>> graphqlServerRequestMessageCB
91+
BiConsumer<RequestContext, AgentSpan> postProcessingCB
9092

9193
void setup() {
9294
callInitAndCaptureCBs()
@@ -143,7 +145,6 @@ class GatewayBridgeSpecification extends DDSpecification {
143145
1 * spanInfo.getTags() >> ['http.client_ip':'1.1.1.1']
144146
1 * mockAppSecCtx.transferCollectedEvents() >> [event]
145147
1 * mockAppSecCtx.peerAddress >> '2001::1'
146-
1 * mockAppSecCtx.close()
147148
1 * traceSegment.setTagTop('manual.keep', true)
148149
1 * traceSegment.setTagTop("_dd.appsec.enabled", 1)
149150
1 * traceSegment.setTagTop("_dd.runtime_family", "jvm")
@@ -152,7 +153,6 @@ class GatewayBridgeSpecification extends DDSpecification {
152153
1 * traceSegment.setTagTop('http.request.headers.accept', 'header_value')
153154
1 * traceSegment.setTagTop('http.response.headers.content-type', 'text/html; charset=UTF-8')
154155
1 * traceSegment.setTagTop('network.client.ip', '2001::1')
155-
1 * mockAppSecCtx.closeAdditive()
156156
flow.result == null
157157
flow.action == Flow.Action.Noop.INSTANCE
158158
}
@@ -172,8 +172,6 @@ class GatewayBridgeSpecification extends DDSpecification {
172172

173173
then:
174174
11 * mockAppSecCtx.transferCollectedEvents() >> [event]
175-
11 * mockAppSecCtx.close()
176-
11 * mockAppSecCtx.closeAdditive()
177175
10 * spanInfo.getTags() >> ['http.client_ip':'1.1.1.1']
178176
10 * traceSegment.setDataTop("appsec", _)
179177
}
@@ -421,6 +419,7 @@ class GatewayBridgeSpecification extends DDSpecification {
421419
1 * ig.registerCallback(EVENTS.responseHeaderDone(), _) >> { respHeadersDoneCB = it[1]; null }
422420
1 * ig.registerCallback(EVENTS.grpcServerRequestMessage(), _) >> { grpcServerRequestMessageCB = it[1]; null }
423421
1 * ig.registerCallback(EVENTS.graphqlServerRequestMessage(), _) >> { graphqlServerRequestMessageCB = it[1]; null }
422+
1 * ig.registerCallback(EVENTS.postProcessing(), _) >> { postProcessingCB = it[1]; null }
424423
0 * ig.registerCallback(_, _)
425424

426425
bridge.init()

dd-trace-core/src/test/groovy/datadog/trace/core/DDSpanTest.groovy

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package datadog.trace.core
33
import datadog.trace.api.DDSpanId
44
import datadog.trace.api.DDTags
55
import datadog.trace.api.DDTraceId
6-
import datadog.trace.api.gateway.RequestContextSlot
76
import datadog.trace.api.sampling.PrioritySampling
87
import datadog.trace.bootstrap.instrumentation.api.AgentSpan
98
import datadog.trace.bootstrap.instrumentation.api.AgentTracer.NoopPathwayContext
@@ -319,30 +318,6 @@ class DDSpanTest extends DDCoreSpecification {
319318
new ExtractedContext(DDTraceId.from(123), 456, PrioritySampling.SAMPLER_KEEP, "789", propagationTagsFactory.empty(), DATADOG) | false
320319
}
321320

322-
def 'publishing of root span closes the request context data'() {
323-
setup:
324-
def reqContextData = Mock(Closeable)
325-
def context = new TagContext().withRequestContextDataAppSec(reqContextData)
326-
def root = tracer.buildSpan("root").asChildOf(context).start()
327-
def child = tracer.buildSpan("child").asChildOf(root).start()
328-
329-
expect:
330-
root.requestContext.getData(RequestContextSlot.APPSEC).is(reqContextData)
331-
child.requestContext.getData(RequestContextSlot.APPSEC).is(reqContextData)
332-
333-
when:
334-
child.finish()
335-
336-
then:
337-
0 * reqContextData.close()
338-
339-
when:
340-
root.finish()
341-
342-
then:
343-
1 * reqContextData.close()
344-
}
345-
346321
def "infer top level from parent service name"() {
347322
setup:
348323
def propagationTagsFactory = tracer.getPropagationTagsFactory()
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
package datadog.trace.core.postprocessor
2+
3+
import datadog.trace.api.gateway.CallbackProvider
4+
import datadog.trace.api.gateway.RequestContext
5+
import datadog.trace.api.gateway.RequestContextSlot
6+
import datadog.trace.bootstrap.instrumentation.api.AgentTracer
7+
import datadog.trace.core.DDSpan
8+
import datadog.trace.core.DDSpanContext
9+
import datadog.trace.core.PendingTrace
10+
import datadog.trace.test.util.DDSpecification
11+
12+
import java.util.function.BiConsumer
13+
import java.util.function.BooleanSupplier
14+
15+
import static datadog.trace.api.gateway.Events.EVENTS
16+
17+
18+
class AppSecSpanPostProcessorTest extends DDSpecification {
19+
def "process returns false if span context is null"() {
20+
given:
21+
def processor = new AppSecSpanPostProcessor()
22+
def span = Mock(DDSpan)
23+
def timeoutCheck = Mock(BooleanSupplier)
24+
(span.context()) >> null
25+
26+
expect:
27+
!processor.process(span, timeoutCheck)
28+
}
29+
30+
def "process returns false if callback provider is null"() {
31+
given:
32+
AgentTracer.TracerAPI tracer = Mock(AgentTracer.TracerAPI)
33+
tracer.getCallbackProvider(RequestContextSlot.APPSEC) >> null
34+
def processor = new AppSecSpanPostProcessor() {
35+
@Override
36+
protected AgentTracer.TracerAPI tracer() {
37+
return tracer
38+
}
39+
}
40+
def span = Mock(DDSpan) {
41+
context() >> Mock(DDSpanContext)
42+
}
43+
def timeoutCheck = Mock(BooleanSupplier)
44+
45+
expect:
46+
!processor.process(span, timeoutCheck)
47+
}
48+
49+
def "process returns false if request context is null"() {
50+
given:
51+
AgentTracer.TracerAPI tracer = Mock(AgentTracer.TracerAPI)
52+
def cbp = Mock(CallbackProvider)
53+
tracer.getCallbackProvider(RequestContextSlot.APPSEC) >> cbp
54+
def processor = new AppSecSpanPostProcessor() {
55+
@Override
56+
protected AgentTracer.TracerAPI tracer() {
57+
return tracer
58+
}
59+
}
60+
def span = Mock(DDSpan) {
61+
context() >> Mock(DDSpanContext)
62+
getRequestContext() >> null
63+
}
64+
def timeoutCheck = Mock(BooleanSupplier)
65+
66+
expect:
67+
!processor.process(span, timeoutCheck)
68+
}
69+
70+
def "process returns false if post-processing callback is null"() {
71+
given:
72+
AgentTracer.TracerAPI tracer = Mock(AgentTracer.TracerAPI)
73+
def cbp = Mock(CallbackProvider)
74+
tracer.getCallbackProvider(RequestContextSlot.APPSEC) >> cbp
75+
cbp.getCallback(EVENTS.postProcessing()) >> null
76+
def processor = new AppSecSpanPostProcessor() {
77+
@Override
78+
protected AgentTracer.TracerAPI tracer() {
79+
return tracer
80+
}
81+
}
82+
def span = Mock(DDSpan) {
83+
context() >> Mock(DDSpanContext)
84+
getRequestContext() >> Mock(RequestContext)
85+
}
86+
def timeoutCheck = Mock(BooleanSupplier)
87+
88+
expect:
89+
!processor.process(span, timeoutCheck)
90+
}
91+
92+
def "process returns true when all components are properly configured"() {
93+
given:
94+
def callback = Mock(BiConsumer)
95+
AgentTracer.TracerAPI tracer = Mock(AgentTracer.TracerAPI)
96+
def cbp = Mock(CallbackProvider)
97+
tracer.getCallbackProvider(RequestContextSlot.APPSEC) >> cbp
98+
cbp.getCallback(EVENTS.postProcessing()) >> callback
99+
def processor = new AppSecSpanPostProcessor() {
100+
@Override
101+
protected AgentTracer.TracerAPI tracer() {
102+
return tracer
103+
}
104+
}
105+
def span = DDSpan.create("test", 0, Mock(DDSpanContext) {
106+
isRequiresPostProcessing() >> true
107+
getTrace() >> Mock(PendingTrace) {
108+
getCurrentTimeNano() >> 0
109+
}
110+
getRequestContext() >> Mock(RequestContext)
111+
}, [])
112+
def timeoutCheck = Mock(BooleanSupplier)
113+
114+
when:
115+
boolean result = processor.process(span, timeoutCheck)
116+
117+
then:
118+
result
119+
1 * callback.accept(_, _)
120+
}
121+
}
122+

internal-api/src/test/java/datadog/trace/api/gateway/InstrumentationGatewayTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,8 @@ public void testNormalCalls() {
205205
ss.registerCallback(events.graphqlServerRequestMessage(), callback);
206206
assertThat(cbp.getCallback(events.graphqlServerRequestMessage()).apply(null, null).getAction())
207207
.isEqualTo(Flow.Action.Noop.INSTANCE);
208+
ss.registerCallback(events.postProcessing(), callback);
209+
cbp.getCallback(events.postProcessing()).accept(null, null);
208210
assertThat(callback.count).isEqualTo(Events.MAX_EVENTS);
209211
}
210212

@@ -254,6 +256,8 @@ public void testThrowableBlocking() {
254256
ss.registerCallback(events.graphqlServerRequestMessage(), throwback);
255257
assertThat(cbp.getCallback(events.graphqlServerRequestMessage()).apply(null, null).getAction())
256258
.isEqualTo(Flow.Action.Noop.INSTANCE);
259+
ss.registerCallback(events.postProcessing(), throwback);
260+
cbp.getCallback(events.postProcessing()).accept(null, null);
257261
assertThat(throwback.count).isEqualTo(Events.MAX_EVENTS);
258262
}
259263

0 commit comments

Comments
 (0)