-
Notifications
You must be signed in to change notification settings - Fork 7
/
SpanTest.kt
91 lines (80 loc) · 3.92 KB
/
SpanTest.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package io.embrace.android.embracesdk.testcases
import android.os.Build
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.embrace.android.embracesdk.IntegrationTestRule
import io.embrace.android.embracesdk.fakes.FakeInternalErrorService
import io.embrace.android.embracesdk.fakes.FakeSpanExporter
import io.embrace.android.embracesdk.opentelemetry.assertExpectedAttributes
import io.embrace.android.embracesdk.opentelemetry.assertHasEmbraceAttribute
import io.embrace.android.embracesdk.opentelemetry.embProcessIdentifier
import io.embrace.android.embracesdk.opentelemetry.embSequenceId
import io.embrace.android.embracesdk.recordSession
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.annotation.Config
@Config(sdk = [Build.VERSION_CODES.TIRAMISU])
@RunWith(AndroidJUnit4::class)
internal class SpanTest {
@Rule
@JvmField
val testRule: IntegrationTestRule = IntegrationTestRule(
harnessSupplier = {
IntegrationTestRule.newHarness(startImmediately = false)
}
)
@Test
fun `SDK can receive a SpanExporter`() {
with(testRule) {
val fakeSpanExporter = FakeSpanExporter()
embrace.addSpanExporter(fakeSpanExporter)
startSdk(context = harness.overriddenCoreModule.context)
embrace.startSpan("test")?.stop()
assertTrue(
"Timed out waiting for the span to be exported: ${fakeSpanExporter.exportedSpans.map { it.name }}",
fakeSpanExporter.awaitSpanExport(1)
)
// Verify that 4 spans have been logged - the exported ones and 3 private diagnostic traces
assertEquals(4, harness.overriddenOpenTelemetryModule.spanSink.completedSpans().size)
harness.recordSession {
assertTrue(
"Timed out waiting for the span to be exported: ${fakeSpanExporter.exportedSpans.map { it.name }}",
fakeSpanExporter.awaitSpanExport(2)
)
// Verify that only 2 span is exported - the test one as well as the session span that ended
assertEquals(2, fakeSpanExporter.exportedSpans.size)
val exportedSpans = fakeSpanExporter.exportedSpans.associateBy { it.name }
val testSpan = checkNotNull(exportedSpans["test"])
testSpan.assertHasEmbraceAttribute(embSequenceId, "6")
testSpan.assertHasEmbraceAttribute(embProcessIdentifier, harness.overriddenInitModule.processIdentifier)
testSpan.resource.assertExpectedAttributes(
expectedServiceName = harness.overriddenOpenTelemetryModule.openTelemetryConfiguration.embraceServiceName,
expectedServiceVersion = harness.overriddenOpenTelemetryModule.openTelemetryConfiguration.embraceVersionName,
systemInfo = harness.overriddenInitModule.systemInfo
)
val sessionSpan = checkNotNull(exportedSpans["emb-session"])
sessionSpan.assertHasEmbraceAttribute(embSequenceId, "1")
testSpan.assertHasEmbraceAttribute(embProcessIdentifier, harness.overriddenInitModule.processIdentifier)
}
}
}
@Test
fun `a SpanExporter added after initialization won't be used`() {
with(testRule) {
val fake = FakeInternalErrorService()
harness.overriddenInitModule.logger.apply {
internalErrorService = fake
}
val fakeSpanExporter = FakeSpanExporter()
embrace.start(harness.overriddenCoreModule.context)
embrace.addSpanExporter(fakeSpanExporter)
harness.recordSession {
embrace.startSpan("test")?.stop()
Thread.sleep(3000)
}
assertTrue(fakeSpanExporter.exportedSpans.size == 0)
}
}
}