Skip to content

Commit

Permalink
Detach the use of SpansSink interface from SpansService usage (#315)
Browse files Browse the repository at this point in the history
## Goal

Change tests to get and refer to the right interface when calling methods in `SpansService`. This will enable ripping it and its implementations apart easier.
  • Loading branch information
bidetofevil committed Jan 31, 2024
1 parent 9ea136d commit 84eeeb1
Show file tree
Hide file tree
Showing 14 changed files with 165 additions and 180 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,6 @@ internal class TracingApiTest {
harness.fakeClock.tick(100L)
embrace.start(harness.fakeCoreModule.context)
harness.recordSession {
assertTrue(
returnIfConditionMet(desiredValueSupplier = { true }, waitTimeMs = 1000) { embrace.isTracingAvailable() }
)
val parentSpan = checkNotNull(embrace.createSpan(name = "test-trace-root"))
assertTrue(parentSpan.start())
assertTrue(parentSpan.addAttribute("oMg", "OmG"))
Expand Down Expand Up @@ -91,7 +88,7 @@ internal class TracingApiTest {
val backgroundActivitySpansCount = getSdkInitSpanFromBackgroundActivity().size
assertTrue(
returnIfConditionMet(desiredValueSupplier = { true }, waitTimeMs = 1000) {
checkNotNull(harness.initModule.spansService.completedSpans()).size == (5 - backgroundActivitySpansCount)
checkNotNull(harness.initModule.spansSink.completedSpans()).size == (5 - backgroundActivitySpansCount)
}
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,5 +82,8 @@ internal class InitModuleImpl(
currentSessionSpan = currentSessionSpan,
tracer = tracer,
),
override val embraceTracer: EmbraceTracer = EmbraceTracer(spansService)
override val embraceTracer: EmbraceTracer = EmbraceTracer(
spansSink = spansSink,
spansService = spansService
)
) : InitModule
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,7 @@ internal class EmbraceSpansService(
type: EmbraceAttributes.Type,
internal: Boolean,
code: () -> T
): T =
currentDelegate.recordSpan(name = name, parent = parent, type = type, internal = internal, code = code)
): T = currentDelegate.recordSpan(name = name, parent = parent, type = type, internal = internal, code = code)

override fun recordCompletedSpan(
name: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ import io.embrace.android.embracesdk.spans.EmbraceSpanEvent
import io.embrace.android.embracesdk.spans.ErrorCode
import io.embrace.android.embracesdk.spans.TracingApi

internal class EmbraceTracer(private val spansService: SpansService) : TracingApi {
internal class EmbraceTracer(
private val spansSink: SpansSink,
private val spansService: SpansService,
) : TracingApi {
override fun createSpan(name: String): EmbraceSpan? =
createSpan(name = name, parent = null)

Expand Down Expand Up @@ -111,7 +114,7 @@ internal class EmbraceTracer(private val spansService: SpansService) : TracingAp
errorCode = errorCode
)

fun getSpan(spanId: String): EmbraceSpan? = spansService.getSpan(spanId = spanId)
fun getSpan(spanId: String): EmbraceSpan? = spansSink.getSpan(spanId = spanId)

@Deprecated("Not required. Use Embrace.isStarted() to know when the full tracing API is available")
override fun isTracingAvailable(): Boolean = spansService.initialized()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package io.embrace.android.embracesdk.capture.startup

import io.embrace.android.embracesdk.fakes.FakeClock
import io.embrace.android.embracesdk.fakes.injection.FakeInitModule
import io.embrace.android.embracesdk.injection.InitModule
import io.embrace.android.embracesdk.internal.spans.EmbraceSpansService
import io.embrace.android.embracesdk.internal.spans.SpansService
import io.embrace.android.embracesdk.internal.spans.SpansSink
import io.embrace.android.embracesdk.internal.spans.isPrivate
import io.opentelemetry.api.trace.SpanId
import io.opentelemetry.api.trace.StatusCode
Expand All @@ -15,20 +15,17 @@ import java.util.concurrent.TimeUnit

internal class StartupServiceImplTest {

private lateinit var initModule: InitModule
private lateinit var spansService: EmbraceSpansService
private lateinit var spansSink: SpansSink
private lateinit var spansService: SpansService
private lateinit var startupService: StartupService
private lateinit var clock: FakeClock

@Before
fun setUp() {
clock = FakeClock(10000000)
initModule = FakeInitModule(clock = clock)
spansService = EmbraceSpansService(
spansSink = initModule.spansSink,
currentSessionSpan = initModule.currentSessionSpan,
tracer = initModule.tracer
)
val initModule = FakeInitModule(clock = clock)
spansSink = initModule.spansSink
spansService = initModule.spansService
spansService.initializeService(TimeUnit.MILLISECONDS.toNanos(clock.now()))
startupService = StartupServiceImpl(spansService)
}
Expand All @@ -40,7 +37,7 @@ internal class StartupServiceImplTest {
val endTimeMillis = clock.now()
spansService.initializeService(startTimeMillis)
startupService.setSdkStartupInfo(startTimeMillis, endTimeMillis)
val currentSpans = checkNotNull(spansService.completedSpans())
val currentSpans = spansSink.completedSpans()
assertEquals(1, currentSpans.size)
with(currentSpans[0]) {
assertEquals("emb-sdk-init", name)
Expand All @@ -60,16 +57,16 @@ internal class StartupServiceImplTest {
fun `second sdk startup span will not be recorded if you try to set the startup info twice`() {
spansService.initializeService(10)
startupService.setSdkStartupInfo(10, 20)
assertEquals(1, spansService.completedSpans().size)
assertEquals(1, spansSink.completedSpans().size)
startupService.setSdkStartupInfo(10, 20)
startupService.setSdkStartupInfo(10, 20)
assertEquals(1, spansService.completedSpans().size)
assertEquals(1, spansSink.completedSpans().size)
}

@Test
fun `sdk startup span recorded if the startup info is set before span service initializes`() {
startupService.setSdkStartupInfo(10, 20)
spansService.initializeService(10)
assertEquals(1, spansService.completedSpans().size)
assertEquals(1, spansSink.completedSpans().size)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,10 @@ import io.embrace.android.embracesdk.fakes.FakeSessionIdTracker
import io.embrace.android.embracesdk.fakes.fakeDataCaptureEventBehavior
import io.embrace.android.embracesdk.fakes.fakeStartupBehavior
import io.embrace.android.embracesdk.gating.GatingService
import io.embrace.android.embracesdk.injection.InitModule
import io.embrace.android.embracesdk.injection.InitModuleImpl
import io.embrace.android.embracesdk.internal.spans.EmbraceSpansService
import io.embrace.android.embracesdk.internal.spans.CurrentSessionSpan
import io.embrace.android.embracesdk.internal.spans.SpansService
import io.embrace.android.embracesdk.internal.spans.SpansSink
import io.embrace.android.embracesdk.logging.InternalEmbraceLogger
import io.embrace.android.embracesdk.prefs.PreferencesService
import io.embrace.android.embracesdk.session.lifecycle.ProcessStateService
Expand All @@ -45,12 +46,13 @@ import java.util.concurrent.TimeUnit

internal class EmbraceEventServiceTest {

private lateinit var initModule: InitModule
private lateinit var deliveryService: FakeDeliveryService
private lateinit var configService: FakeConfigService
private lateinit var gatingService: GatingService
private lateinit var fakeWorkerThreadModule: FakeWorkerThreadModule
private lateinit var spansService: EmbraceSpansService
private lateinit var spansSink: SpansSink
private lateinit var currentSessionSpan: CurrentSessionSpan
private lateinit var spansService: SpansService
private lateinit var sessionProperties: EmbraceSessionProperties
private lateinit var eventService: EmbraceEventService
private lateinit var fakeClock: FakeClock
Expand Down Expand Up @@ -114,12 +116,10 @@ internal class EmbraceEventServiceTest {
)
gatingService = FakeGatingService(configService)
fakeWorkerThreadModule = FakeWorkerThreadModule(clock = fakeClock, blockingMode = true)
initModule = InitModuleImpl(clock = fakeClock)
spansService = EmbraceSpansService(
spansSink = initModule.spansSink,
currentSessionSpan = initModule.currentSessionSpan,
tracer = initModule.tracer
)
val initModule = InitModuleImpl(clock = fakeClock)
spansSink = initModule.spansSink
currentSessionSpan = initModule.currentSessionSpan
spansService = initModule.spansService
spansService.initializeService(TimeUnit.MILLISECONDS.toNanos(fakeClock.now()))
eventHandler = EventHandler(
metadataService = metadataService,
Expand Down Expand Up @@ -430,12 +430,12 @@ internal class EmbraceEventServiceTest {
sdkInitStartTimeNanos = TimeUnit.MILLISECONDS.toNanos(1)
)
configService.updateListeners()
initModule.currentSessionSpan.endSession()
currentSessionSpan.endSession()
eventService.sendStartupMoment()
eventService.applicationStartupComplete()
val executor = fakeWorkerThreadModule.executor(WorkerName.BACKGROUND_REGISTRATION)
executor.runCurrentlyBlocked()
val completedSpans = checkNotNull(spansService.completedSpans())
val completedSpans = spansSink.completedSpans()
assertEquals(1, completedSpans.size)
with(completedSpans[0]) {
assertEquals("emb-startup-moment", name)
Expand All @@ -451,18 +451,18 @@ internal class EmbraceEventServiceTest {
sdkInitStartTimeNanos = TimeUnit.MILLISECONDS.toNanos(1)
)
configService.updateListeners()
initModule.currentSessionSpan.endSession()
currentSessionSpan.endSession()
eventService.sendStartupMoment()
eventService.applicationStartupComplete()
val executor = fakeWorkerThreadModule.executor(WorkerName.BACKGROUND_REGISTRATION)
executor.runCurrentlyBlocked()
val completedSpans = checkNotNull(spansService.completedSpans())
val completedSpans = spansSink.completedSpans()
assertEquals(0, completedSpans.size)

fakeClock.setCurrentTime(20L)
eventService.endEvent(STARTUP_EVENT_NAME)
executor.runCurrentlyBlocked()
val completedSpansAgain = checkNotNull(spansService.completedSpans())
val completedSpansAgain = spansSink.completedSpans()
assertEquals(1, completedSpansAgain.size)

with(completedSpansAgain[0]) {
Expand All @@ -478,13 +478,12 @@ internal class EmbraceEventServiceTest {
sdkInitStartTimeNanos = TimeUnit.MILLISECONDS.toNanos(1)
)
configService.updateListeners()
initModule.currentSessionSpan.endSession()
currentSessionSpan.endSession()
eventService.sendStartupMoment()
assertNull(eventService.getStartupMomentInfo())
fakeClock.tick(10000L)
fakeWorkerThreadModule.scheduledExecutor(WorkerName.BACKGROUND_REGISTRATION).runCurrentlyBlocked()
assertNotNull(eventService.getStartupMomentInfo())
val completedSpans = checkNotNull(spansService.completedSpans())
assertEquals(0, completedSpans.size)
assertEquals(0, spansSink.completedSpans().size)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,5 +50,8 @@ internal class FakeInitModule(
currentSessionSpan = currentSessionSpan,
tracer = tracer,
),
override val embraceTracer: EmbraceTracer = EmbraceTracer(spansService)
override val embraceTracer: EmbraceTracer = EmbraceTracer(
spansSink = spansSink,
spansService = spansService
)
) : InitModule
Loading

0 comments on commit 84eeeb1

Please sign in to comment.