Skip to content

Commit 69df037

Browse files
committed
Introduce OtlpPayloadDispatcherTest.java
1 parent 460833a commit 69df037

1 file changed

Lines changed: 137 additions & 0 deletions

File tree

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
package datadog.trace.common.writer;
2+
3+
import static datadog.trace.core.DDSpanContext.SPAN_SAMPLING_MECHANISM_TAG;
4+
import static org.junit.jupiter.api.Assertions.assertEquals;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
import static org.mockito.Mockito.mock;
7+
import static org.mockito.Mockito.verify;
8+
import static org.mockito.Mockito.verifyNoInteractions;
9+
import static org.mockito.Mockito.when;
10+
11+
import datadog.trace.core.CoreSpan;
12+
import datadog.trace.core.otlp.common.OtlpPayload;
13+
import datadog.trace.core.otlp.common.OtlpSender;
14+
import datadog.trace.core.otlp.trace.OtlpTraceCollector;
15+
import java.util.ArrayDeque;
16+
import java.util.Arrays;
17+
import java.util.Collections;
18+
import java.util.Deque;
19+
import java.util.List;
20+
import org.junit.jupiter.api.Test;
21+
import org.junit.jupiter.api.extension.ExtendWith;
22+
import org.mockito.ArgumentCaptor;
23+
import org.mockito.Mock;
24+
import org.mockito.junit.jupiter.MockitoExtension;
25+
26+
@ExtendWith(MockitoExtension.class)
27+
class OtlpPayloadDispatcherTest {
28+
29+
@Mock OtlpSender sender;
30+
@Mock OtlpTraceCollector collector;
31+
32+
@Test
33+
@SuppressWarnings({"unchecked", "rawtypes"})
34+
void sampledTraceForwardsAllSpans() {
35+
OtlpPayloadDispatcher dispatcher = new OtlpPayloadDispatcher(sender, collector);
36+
List<CoreSpan<?>> trace = Arrays.asList(sampledSpan(), sampledSpan());
37+
38+
dispatcher.addTrace(trace);
39+
40+
ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
41+
verify(collector).addTrace(captor.capture());
42+
assertEquals(trace, captor.getValue());
43+
verifyNoInteractions(sender);
44+
}
45+
46+
@Test
47+
void droppedTraceWithoutSingleSpanSamplingForwardsNothing() {
48+
OtlpPayloadDispatcher dispatcher = new OtlpPayloadDispatcher(sender, collector);
49+
50+
dispatcher.addTrace(Arrays.asList(droppedSpan(), droppedSpan()));
51+
52+
verifyNoInteractions(collector, sender);
53+
}
54+
55+
@Test
56+
@SuppressWarnings({"unchecked", "rawtypes"})
57+
void droppedTraceWithSingleSpanSampledForwardsOnlyThoseSpans() {
58+
OtlpPayloadDispatcher dispatcher = new OtlpPayloadDispatcher(sender, collector);
59+
CoreSpan<?> keep = singleSpanSampledSpan();
60+
CoreSpan<?> drop1 = droppedSpan();
61+
CoreSpan<?> drop2 = droppedSpan();
62+
63+
dispatcher.addTrace(Arrays.asList(drop1, keep, drop2));
64+
65+
ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
66+
verify(collector).addTrace(captor.capture());
67+
assertEquals(Collections.singletonList(keep), captor.getValue());
68+
}
69+
70+
@Test
71+
void emptyTraceForwardsNothing() {
72+
OtlpPayloadDispatcher dispatcher = new OtlpPayloadDispatcher(sender, collector);
73+
74+
dispatcher.addTrace(Collections.emptyList());
75+
76+
verifyNoInteractions(collector, sender);
77+
}
78+
79+
@Test
80+
void flushSendsNonEmptyPayload() {
81+
Deque<byte[]> chunks = new ArrayDeque<>();
82+
chunks.add(new byte[] {1, 2, 3});
83+
OtlpPayload payload = new OtlpPayload(chunks, 3, "application/x-protobuf");
84+
when(collector.collectTraces()).thenReturn(payload);
85+
OtlpPayloadDispatcher dispatcher = new OtlpPayloadDispatcher(sender, collector);
86+
87+
dispatcher.flush();
88+
89+
verify(sender).send(payload);
90+
}
91+
92+
@Test
93+
void flushSkipsEmptyPayload() {
94+
when(collector.collectTraces()).thenReturn(OtlpPayload.EMPTY);
95+
OtlpPayloadDispatcher dispatcher = new OtlpPayloadDispatcher(sender, collector);
96+
97+
dispatcher.flush();
98+
99+
verifyNoInteractions(sender);
100+
}
101+
102+
@Test
103+
void getApisIsEmpty() {
104+
OtlpPayloadDispatcher dispatcher = new OtlpPayloadDispatcher(sender, collector);
105+
106+
assertTrue(dispatcher.getApis().isEmpty());
107+
}
108+
109+
@Test
110+
void onDroppedTraceDoesNothing() {
111+
OtlpPayloadDispatcher dispatcher = new OtlpPayloadDispatcher(sender, collector);
112+
113+
dispatcher.onDroppedTrace(5);
114+
115+
verifyNoInteractions(collector, sender);
116+
}
117+
118+
private static CoreSpan<?> sampledSpan() {
119+
CoreSpan<?> span = mock(CoreSpan.class);
120+
when(span.samplingPriority()).thenReturn(1);
121+
return span;
122+
}
123+
124+
private static CoreSpan<?> droppedSpan() {
125+
CoreSpan<?> span = mock(CoreSpan.class);
126+
when(span.samplingPriority()).thenReturn(0);
127+
when(span.getTag(SPAN_SAMPLING_MECHANISM_TAG)).thenReturn(null);
128+
return span;
129+
}
130+
131+
private static CoreSpan<?> singleSpanSampledSpan() {
132+
CoreSpan<?> span = mock(CoreSpan.class);
133+
when(span.samplingPriority()).thenReturn(0);
134+
when(span.getTag(SPAN_SAMPLING_MECHANISM_TAG)).thenReturn(8);
135+
return span;
136+
}
137+
}

0 commit comments

Comments
 (0)