Skip to content

Commit 638db1d

Browse files
committed
Validating SignalStorageExporter
1 parent 61455e5 commit 638db1d

File tree

1 file changed

+130
-0
lines changed

1 file changed

+130
-0
lines changed
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package io.opentelemetry.contrib.disk.buffering.exporters;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.mockito.ArgumentMatchers.anyCollection;
5+
import static org.mockito.Mockito.clearInvocations;
6+
import static org.mockito.Mockito.mock;
7+
import static org.mockito.Mockito.verify;
8+
import static org.mockito.Mockito.verifyNoMoreInteractions;
9+
import static org.mockito.Mockito.when;
10+
11+
import io.opentelemetry.contrib.disk.buffering.SignalType;
12+
import io.opentelemetry.contrib.disk.buffering.storage.SignalStorage;
13+
import io.opentelemetry.contrib.disk.buffering.storage.result.WriteResult;
14+
import io.opentelemetry.sdk.common.CompletableResultCode;
15+
import io.opentelemetry.sdk.trace.data.SpanData;
16+
import java.time.Duration;
17+
import java.util.ArrayList;
18+
import java.util.Arrays;
19+
import java.util.Collection;
20+
import java.util.Collections;
21+
import java.util.Iterator;
22+
import java.util.List;
23+
import java.util.concurrent.CompletableFuture;
24+
import javax.annotation.Nonnull;
25+
import org.junit.jupiter.api.Test;
26+
import org.junit.jupiter.api.extension.ExtendWith;
27+
import org.mockito.Mock;
28+
import org.mockito.junit.jupiter.MockitoExtension;
29+
30+
@ExtendWith(MockitoExtension.class)
31+
class SignalStorageExporterTest {
32+
@Mock private ExporterCallback callback;
33+
34+
@Test
35+
void verifyExportToStorage_success() {
36+
SignalStorage.Span storage = new TestSpanStorage();
37+
SignalType signalType = SignalType.SPAN;
38+
SignalStorageExporter<SpanData> storageExporter =
39+
new SignalStorageExporter<>(storage, callback, Duration.ofSeconds(1), signalType);
40+
SpanData item1 = mock();
41+
SpanData item2 = mock();
42+
SpanData item3 = mock();
43+
44+
CompletableResultCode resultCode = storageExporter.exportToStorage(Arrays.asList(item1, item2));
45+
46+
assertThat(resultCode.isSuccess()).isTrue();
47+
verify(callback).onExportSuccess(signalType);
48+
verifyNoMoreInteractions(callback);
49+
50+
// Adding more items
51+
clearInvocations(callback);
52+
resultCode = storageExporter.exportToStorage(Collections.singletonList(item3));
53+
54+
assertThat(resultCode.isSuccess()).isTrue();
55+
verify(callback).onExportSuccess(signalType);
56+
verifyNoMoreInteractions(callback);
57+
58+
// Checking items
59+
List<SpanData> storedItems = new ArrayList<>();
60+
for (Collection<SpanData> collection : storage) {
61+
storedItems.addAll(collection);
62+
}
63+
assertThat(storedItems).containsExactly(item1, item2, item3);
64+
}
65+
66+
@SuppressWarnings("ThrowableNotThrown")
67+
@Test
68+
void verifyExportToStorage_failure() {
69+
SignalStorage.Span storage = mock();
70+
SignalType signalType = SignalType.SPAN;
71+
SignalStorageExporter<SpanData> storageExporter =
72+
new SignalStorageExporter<>(storage, callback, Duration.ofSeconds(1), signalType);
73+
SpanData item1 = mock();
74+
75+
// Without exception
76+
when(storage.write(anyCollection()))
77+
.thenReturn(CompletableFuture.completedFuture(WriteResult.create(false, null)));
78+
79+
CompletableResultCode resultCode =
80+
storageExporter.exportToStorage(Collections.singletonList(item1));
81+
82+
assertThat(resultCode.isSuccess()).isFalse();
83+
assertThat(resultCode.getFailureThrowable()).isNull();
84+
verify(callback).onExportError(signalType, null);
85+
verifyNoMoreInteractions(callback);
86+
87+
// With exception
88+
clearInvocations(callback);
89+
Exception exception = new Exception();
90+
when(storage.write(anyCollection()))
91+
.thenReturn(CompletableFuture.completedFuture(WriteResult.create(false, exception)));
92+
93+
resultCode = storageExporter.exportToStorage(Collections.singletonList(item1));
94+
95+
assertThat(resultCode.isSuccess()).isFalse();
96+
assertThat(resultCode.getFailureThrowable()).isEqualTo(exception);
97+
verify(callback).onExportError(signalType, exception);
98+
verifyNoMoreInteractions(callback);
99+
}
100+
101+
private static class TestSpanStorage implements SignalStorage.Span {
102+
private final List<Collection<SpanData>> storedItems = new ArrayList<>();
103+
104+
@Override
105+
public CompletableFuture<WriteResult> write(Collection<SpanData> items) {
106+
storedItems.add(items);
107+
return getSuccessfulFuture();
108+
}
109+
110+
@Override
111+
public CompletableFuture<WriteResult> clear() {
112+
storedItems.clear();
113+
return getSuccessfulFuture();
114+
}
115+
116+
@Override
117+
public void close() {}
118+
119+
@Nonnull
120+
@Override
121+
public Iterator<Collection<SpanData>> iterator() {
122+
return storedItems.iterator();
123+
}
124+
125+
@Nonnull
126+
private static CompletableFuture<WriteResult> getSuccessfulFuture() {
127+
return CompletableFuture.completedFuture(WriteResult.create(true, null));
128+
}
129+
}
130+
}

0 commit comments

Comments
 (0)