Skip to content

Commit 68fc80c

Browse files
committed
Unit tests + cleanup
1 parent 0a778c1 commit 68fc80c

File tree

4 files changed

+78
-56
lines changed

4 files changed

+78
-56
lines changed

awsagentprovider/src/main/java/software/amazon/opentelemetry/javaagent/providers/OtlpUdpSpanExporter.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ public CompletableResultCode export(Collection<SpanData> spans) {
6565
: FORMAT_OTEL_UNSAMPLED_TRACES_BINARY_PREFIX)
6666
+ Base64.getEncoder().encodeToString(baos.toByteArray());
6767
sender.send(payload.getBytes(StandardCharsets.UTF_8));
68-
System.out.println("Sending::: " + payload); // TODO: remove
6968
return CompletableResultCode.ofSuccess();
7069
} catch (Exception e) {
7170
logger.log(Level.SEVERE, "Failed to export spans. Error: " + e.getMessage(), e);
@@ -75,6 +74,7 @@ public CompletableResultCode export(Collection<SpanData> spans) {
7574

7675
@Override
7776
public CompletableResultCode flush() {
77+
// TODO: implement
7878
return CompletableResultCode.ofSuccess();
7979
}
8080

@@ -86,4 +86,14 @@ public CompletableResultCode shutdown() {
8686
}
8787
return sender.shutdown();
8888
}
89+
90+
// Visible for testing
91+
UdpSender getSender() {
92+
return sender;
93+
}
94+
95+
// Visible for testing
96+
boolean isSampled() {
97+
return sampled;
98+
}
8999
}

awsagentprovider/src/main/java/software/amazon/opentelemetry/javaagent/providers/OtlpUdpSpanExporterBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,10 @@ public OtlpUdpSpanExporter build() {
5555
}
5656
return new OtlpUdpSpanExporter(this.sender, this.sampled);
5757
}
58+
59+
// Only for testing
60+
OtlpUdpSpanExporterBuilder setSender(UdpSender sender) {
61+
this.sender = sender;
62+
return this;
63+
}
5864
}

awsagentprovider/src/main/java/software/amazon/opentelemetry/javaagent/providers/UdpSender.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,9 @@ public void send(byte[] data) {
5858
logger.log(Level.SEVERE, "Exception while sending data.", e);
5959
}
6060
}
61+
62+
// Visible for testing
63+
InetSocketAddress getEndpoint() {
64+
return endpoint;
65+
}
6166
}

awsagentprovider/src/test/java/software/amazon/opentelemetry/javaagent/providers/UdpExporterTest.java

Lines changed: 56 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -15,91 +15,92 @@
1515

1616
package software.amazon.opentelemetry.javaagent.providers;
1717

18-
import static org.mockito.Mockito.mock;
19-
import static org.mockito.Mockito.when;
18+
import static org.assertj.core.api.Assertions.assertThat;
19+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
20+
import static org.mockito.Mockito.*;
2021

2122
import io.opentelemetry.api.common.AttributeKey;
2223
import io.opentelemetry.api.common.Attributes;
2324
import io.opentelemetry.api.trace.*;
24-
import io.opentelemetry.sdk.OpenTelemetrySdk;
2525
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
2626
import io.opentelemetry.sdk.resources.Resource;
27-
import io.opentelemetry.sdk.trace.ReadableSpan;
2827
import io.opentelemetry.sdk.trace.data.SpanData;
2928
import io.opentelemetry.sdk.trace.data.StatusData;
30-
import java.util.Arrays;
3129
import java.util.Collections;
3230
import org.junit.jupiter.api.Test;
3331

3432
public class UdpExporterTest {
35-
private static final boolean CONTAINS_ATTRIBUTES = true;
3633

3734
@Test
38-
public void testExporter() { // TODO: only for testing. remove.
39-
// Tracer tracer = GlobalOpenTelemetry.getTracer("My application");
40-
Tracer tracer = OpenTelemetrySdk.builder().build().getTracer("hello");
41-
42-
Span mySpan = tracer.spanBuilder("DoTheLoop_3").startSpan();
43-
int numIterations = 5;
44-
mySpan.setAttribute("NumIterations", numIterations);
45-
mySpan.setAttribute(AttributeKey.stringArrayKey("foo"), Arrays.asList("bar1", "bar2"));
46-
try (var scope = mySpan.makeCurrent()) {
47-
for (int i = 1; i <= numIterations; i++) {
48-
System.out.println("i = " + i);
49-
}
50-
} finally {
51-
mySpan.end();
52-
}
53-
35+
public void testUdpExporterWithDefaults() {
5436
OtlpUdpSpanExporter exporter = new OtlpUdpSpanExporterBuilder().build();
37+
UdpSender sender = exporter.getSender();
38+
assertThat(sender.getEndpoint().getHostName())
39+
.isEqualTo("localhost"); // getHostName implicitly converts 127.0.0.1 to localhost
40+
assertThat(sender.getEndpoint().getPort()).isEqualTo(2000);
41+
assertThat(exporter.isSampled()).isTrue();
42+
}
5543

56-
ReadableSpan readableSpan = (ReadableSpan) mySpan;
57-
SpanData spanData = readableSpan.toSpanData();
44+
@Test
45+
public void testUdpExporterWithCustomEndpointAndSample() {
46+
OtlpUdpSpanExporter exporter =
47+
new OtlpUdpSpanExporterBuilder().setEndpoint("somehost:1000").setSampled(false).build();
48+
UdpSender sender = exporter.getSender();
49+
assertThat(sender.getEndpoint().getHostName()).isEqualTo("somehost");
50+
assertThat(sender.getEndpoint().getPort()).isEqualTo(1000);
51+
assertThat(exporter.isSampled()).isFalse();
52+
}
5853

59-
exporter.export(Collections.singletonList(spanData));
54+
@Test
55+
public void testUdpExporterWithInvalidEndpoint() {
56+
assertThatThrownBy(
57+
() -> {
58+
new OtlpUdpSpanExporterBuilder().setEndpoint("invalidhost");
59+
})
60+
.isInstanceOf(IllegalArgumentException.class)
61+
.hasMessage("Invalid endpoint, must be a valid URL: invalidhost");
6062
}
6163

6264
@Test
63-
public void testUdpExporter() {
64-
// Add your test logic here
65-
OtlpUdpSpanExporter exporter = new OtlpUdpSpanExporterBuilder().build();
65+
public void testExport() {
66+
UdpSender senderMock = mock(UdpSender.class);
67+
68+
// mock SpanData
69+
SpanData spanData = buildSpanDataMock();
70+
71+
OtlpUdpSpanExporter exporter = new OtlpUdpSpanExporterBuilder().setSender(senderMock).build();
72+
exporter.export(Collections.singletonList(spanData));
73+
74+
// assert that the senderMock.send is called once
75+
verify(senderMock, times(1)).send(any(byte[].class));
76+
}
77+
78+
private static SpanData buildSpanDataMock() {
79+
SpanData mockSpanData = mock(SpanData.class);
80+
81+
Attributes spanAttributes =
82+
Attributes.of(AttributeKey.stringKey("original key"), "original value");
83+
when(mockSpanData.getAttributes()).thenReturn(spanAttributes);
84+
when(mockSpanData.getTotalAttributeCount()).thenReturn(spanAttributes.size());
85+
when(mockSpanData.getKind()).thenReturn(SpanKind.SERVER);
6686

67-
// build test span
6887
SpanContext parentSpanContextMock = mock(SpanContext.class);
69-
Attributes spanAttributes = buildSpanAttributes(CONTAINS_ATTRIBUTES);
70-
SpanData spanDataMock = buildSpanDataMock(spanAttributes);
71-
when(spanDataMock.getParentSpanContext()).thenReturn(parentSpanContextMock);
88+
when(mockSpanData.getParentSpanContext()).thenReturn(parentSpanContextMock);
89+
7290
SpanContext spanContextMock = mock(SpanContext.class);
7391
when(spanContextMock.isValid()).thenReturn(true);
74-
when(spanDataMock.getSpanContext()).thenReturn(spanContextMock);
92+
when(mockSpanData.getSpanContext()).thenReturn(spanContextMock);
93+
7594
TraceState traceState = TraceState.builder().build();
7695
when(spanContextMock.getTraceState()).thenReturn(traceState);
77-
StatusData statusData = StatusData.unset();
78-
when(spanDataMock.getStatus()).thenReturn(statusData);
79-
when(spanDataMock.getInstrumentationScopeInfo())
96+
97+
when(mockSpanData.getStatus()).thenReturn(StatusData.unset());
98+
when(mockSpanData.getInstrumentationScopeInfo())
8099
.thenReturn(InstrumentationScopeInfo.create("Dummy Scope"));
81100

82101
Resource testResource = Resource.empty();
83-
when(spanDataMock.getResource()).thenReturn(testResource);
84-
85-
exporter.export(Collections.singletonList(spanDataMock));
86-
}
87-
88-
private static Attributes buildSpanAttributes(boolean containsAttribute) {
89-
if (containsAttribute) {
90-
return Attributes.of(AttributeKey.stringKey("original key"), "original value");
91-
} else {
92-
return Attributes.empty();
93-
}
94-
}
102+
when(mockSpanData.getResource()).thenReturn(testResource);
95103

96-
private static SpanData buildSpanDataMock(Attributes spanAttributes) {
97-
// Configure spanData
98-
SpanData mockSpanData = mock(SpanData.class);
99-
when(mockSpanData.getAttributes()).thenReturn(spanAttributes);
100-
when(mockSpanData.getTotalAttributeCount()).thenReturn(spanAttributes.size());
101-
when(mockSpanData.getKind()).thenReturn(SpanKind.SERVER);
102-
when(mockSpanData.getParentSpanContext()).thenReturn(null);
103104
return mockSpanData;
104105
}
105106
}

0 commit comments

Comments
 (0)