diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/AppStartupTraceTest.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/AppStartupTraceTest.kt index 93c72bcdb8..ecfe1ff615 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/AppStartupTraceTest.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/AppStartupTraceTest.kt @@ -5,7 +5,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.embrace.android.embracesdk.arch.assertError import io.embrace.android.embracesdk.assertions.findSpansOfType import io.embrace.android.embracesdk.fakes.FakeActivity -import io.embrace.android.embracesdk.fakes.FakeEmbLogger import io.embrace.android.embracesdk.fakes.FakeSplashScreenActivity import io.embrace.android.embracesdk.fakes.config.FakeEnabledFeatureConfig import io.embrace.android.embracesdk.fakes.config.FakeInstrumentedConfig @@ -40,7 +39,7 @@ internal class AppStartupTraceTest { @JvmField val testRule: SdkIntegrationTestRule = SdkIntegrationTestRule { EmbraceSetupInterface().apply { - (overriddenInitModule.logger as FakeEmbLogger).ignoredErrors.clear() + getEmbLogger().ignoredErrors.clear() } } diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/PublicApiTest.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/PublicApiTest.kt index 5b266be4f7..6e03411192 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/PublicApiTest.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/PublicApiTest.kt @@ -61,7 +61,7 @@ internal class PublicApiTest { recordSession { assertEquals( embrace.currentSessionId, - testRule.setup.overriddenOpenTelemetryModule.currentSessionSpan.getSessionId() + testRule.setup.getCurrentSessionSpan().getSessionId() ) assertNotNull(embrace.currentSessionId) } diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/TracingApiTest.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/TracingApiTest.kt index 2b1ebd8777..34e477459e 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/TracingApiTest.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/TracingApiTest.kt @@ -151,8 +151,7 @@ internal class TracingApiTest { ) val allSpans = getSdkInitSpanFromBackgroundActivity() + checkNotNull(session.data.spans) + - testRule.setup.overriddenOpenTelemetryModule.spanSink.completedSpans() - .map(EmbraceSpanData::toNewPayload) + testRule.setup.getSpanSink().completedSpans().map(EmbraceSpanData::toNewPayload) val spansMap = allSpans.associateBy { it.name } val sessionSpan = checkNotNull(spansMap["emb-session"]) diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/AnrFeatureTest.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/AnrFeatureTest.kt index 9ef985ca93..c35520559d 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/AnrFeatureTest.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/AnrFeatureTest.kt @@ -17,7 +17,6 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -private const val START_TIME_MS = 10000000000L private const val INTERVAL_MS = 100L private const val ANR_THRESHOLD_MS = 1000L private const val MAX_SAMPLE_COUNT = 80 @@ -29,12 +28,12 @@ internal class AnrFeatureTest { private lateinit var anrMonitorExecutor: BlockingScheduledExecutorService private lateinit var blockedThreadDetector: BlockedThreadDetector + private var startTimeMs: Long = 0L @Rule @JvmField val testRule: SdkIntegrationTestRule = SdkIntegrationTestRule { EmbraceSetupInterface( - currentTimeMs = START_TIME_MS, workerToFake = Worker.Background.AnrWatchdogWorker, anrMonitoringThread = Thread.currentThread() ).also { @@ -42,6 +41,8 @@ internal class AnrFeatureTest { anrMonitorExecutor = getFakedWorkerExecutor() anrMonitorExecutor.blockingMode = false blockedThreadDetector = getBlockedThreadDetector() + startTimeMs = getClock().now() + } } } @@ -66,7 +67,7 @@ internal class AnrFeatureTest { // assert ANRs received val spans = message.findAnrSpans() assertEquals(2, spans.size) - assertAnrReceived(spans[0], START_TIME_MS, firstSampleCount) + assertAnrReceived(spans[0], startTimeMs, firstSampleCount) assertAnrReceived(spans[1], checkNotNull(secondAnrStartTime), secondSampleCount) } ) @@ -88,7 +89,7 @@ internal class AnrFeatureTest { // assert ANRs received val spans = message.findAnrSpans() val span = spans.single() - assertAnrReceived(span, START_TIME_MS, sampleCount) + assertAnrReceived(span, startTimeMs, sampleCount) } ) } @@ -149,7 +150,7 @@ internal class AnrFeatureTest { // assert ANRs received val spans = message.findAnrSpans() val span = spans.single() - assertAnrReceived(span, START_TIME_MS, sampleCount, endTime = endTime) + assertAnrReceived(span, startTimeMs, sampleCount, endTime = endTime) } ) } diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/InternalErrorLogTest.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/InternalErrorLogTest.kt index aaac41b6f7..c7e4a7b04e 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/InternalErrorLogTest.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/InternalErrorLogTest.kt @@ -1,7 +1,6 @@ package io.embrace.android.embracesdk.testcases.features import androidx.test.ext.junit.runners.AndroidJUnit4 -import io.embrace.android.embracesdk.fakes.FakeEmbLogger import io.embrace.android.embracesdk.internal.spans.findAttributeValue import io.embrace.android.embracesdk.testframework.SdkIntegrationTestRule import io.embrace.android.embracesdk.testframework.assertions.getLogWithAttributeValue @@ -22,7 +21,7 @@ internal class InternalErrorLogTest { fun `internal error log delivered`() { testRule.runTest( setupAction = { - (overriddenInitModule.logger as FakeEmbLogger).throwOnInternalError = false + getEmbLogger().throwOnInternalError = false }, testCaseAction = { diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/NativeCrashFeatureTest.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/NativeCrashFeatureTest.kt index 33e7b6504a..d26a4bfe43 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/NativeCrashFeatureTest.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/NativeCrashFeatureTest.kt @@ -2,7 +2,6 @@ package io.embrace.android.embracesdk.testcases.features import androidx.test.ext.junit.runners.AndroidJUnit4 import io.embrace.android.embracesdk.assertions.getSessionId -import io.embrace.android.embracesdk.fakes.FakeEmbLogger import io.embrace.android.embracesdk.fakes.FakePayloadStorageService import io.embrace.android.embracesdk.fakes.TestPlatformSerializer import io.embrace.android.embracesdk.fakes.config.FakeEnabledFeatureConfig @@ -11,6 +10,7 @@ import io.embrace.android.embracesdk.fakes.fakeEnvelopeMetadata import io.embrace.android.embracesdk.fakes.fakeEnvelopeResource import io.embrace.android.embracesdk.fakes.fakeLaterEnvelopeMetadata import io.embrace.android.embracesdk.fakes.fakeLaterEnvelopeResource +import io.embrace.android.embracesdk.internal.arch.schema.EmbType import io.embrace.android.embracesdk.internal.delivery.PayloadType import io.embrace.android.embracesdk.internal.delivery.StoredTelemetryMetadata import io.embrace.android.embracesdk.internal.delivery.SupportedEnvelopeType @@ -22,7 +22,7 @@ import io.embrace.android.embracesdk.testframework.actions.EmbracePayloadAsserti import io.embrace.android.embracesdk.testframework.actions.EmbraceSetupInterface import io.embrace.android.embracesdk.testframework.actions.StoredNativeCrashData import io.embrace.android.embracesdk.testframework.actions.createStoredNativeCrashData -import io.embrace.android.embracesdk.testframework.assertions.getLastLog +import io.embrace.android.embracesdk.testframework.assertions.getLogOfType import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue @@ -103,7 +103,7 @@ internal class NativeCrashFeatureTest { EmbraceSetupInterface( processIdentifier = "8115ec91-3e5e-4d8a-816d-cc40306f9822" ).apply { - (overriddenInitModule.logger as FakeEmbLogger).throwOnInternalError = false + getEmbLogger().throwOnInternalError = false } } @@ -133,7 +133,7 @@ internal class NativeCrashFeatureTest { assertEquals(fakeEnvelopeResource, resource) assertEquals(fakeEnvelopeMetadata, metadata) } - val log = envelope.getLastLog() + val log = envelope.getLogOfType(EmbType.System.NativeCrash) assertNativeCrashSent(log, crashData, testRule.setup.symbols) } ) @@ -160,7 +160,7 @@ internal class NativeCrashFeatureTest { assertEquals(fakeEnvelopeResource, resource) assertEquals(fakeEnvelopeMetadata, metadata) } - val log = envelope.getLastLog() + val log = envelope.getLogOfType(EmbType.System.NativeCrash) assertNativeCrashSent(log, crashData, testRule.setup.symbols) } ) @@ -212,8 +212,8 @@ internal class NativeCrashFeatureTest { assertEquals(fakeLaterEnvelopeMetadata, metadata) } - val log1 = crashEnvelope1.getLastLog() - val log2 = crashEnvelope2.getLastLog() + val log1 = crashEnvelope1.getLogOfType(EmbType.System.NativeCrash) + val log2 = crashEnvelope2.getLogOfType(EmbType.System.NativeCrash) assertNativeCrashSent(log1, crashData, testRule.setup.symbols) assertNativeCrashSent(log2, crashData2, testRule.setup.symbols) @@ -291,7 +291,7 @@ internal class NativeCrashFeatureTest { } private fun findMatchingSessionId(it: Envelope, data: StoredNativeCrashData): Boolean { - return it.getLastLog().attributes?.findAttributeValue("session.id") == data.nativeCrash.sessionId + return it.getLogOfType(EmbType.System.NativeCrash).attributes?.findAttributeValue("session.id") == data.nativeCrash.sessionId } private fun EmbracePayloadAssertionInterface.assertNoNativeCrashSent( diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/PersonaFeaturesTest.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/PersonaFeaturesTest.kt index 9536e012a5..6e831ed7cc 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/PersonaFeaturesTest.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/PersonaFeaturesTest.kt @@ -19,7 +19,7 @@ internal class PersonaFeaturesTest { fun `personas found in metadata`() { testRule.runTest( setupAction = { - overriddenAndroidServicesModule.preferencesService.userPersonas = setOf("preloaded") + getPreferencesService().userPersonas = setOf("preloaded") }, testCaseAction = { embrace.addUserPersona("payer") diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/PruningFeatureTest.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/PruningFeatureTest.kt index ad8c95bbf1..8e29f3a2cc 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/PruningFeatureTest.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/PruningFeatureTest.kt @@ -26,7 +26,7 @@ internal class PruningFeatureTest { @JvmField val testRule: SdkIntegrationTestRule = SdkIntegrationTestRule { EmbraceSetupInterface().apply { - (overriddenInitModule.logger as FakeEmbLogger).throwOnInternalError = false + getEmbLogger().throwOnInternalError = false } } diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/ResurrectionFeatureTest.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/ResurrectionFeatureTest.kt index 5102391918..3a3312ab49 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/ResurrectionFeatureTest.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/ResurrectionFeatureTest.kt @@ -1,7 +1,7 @@ package io.embrace.android.embracesdk.testcases.features +import android.os.Build.VERSION_CODES.TIRAMISU import androidx.test.ext.junit.runners.AndroidJUnit4 -import io.embrace.android.embracesdk.fakes.FakeEmbLogger import io.embrace.android.embracesdk.fakes.FakePayloadStorageService import io.embrace.android.embracesdk.fakes.TestPlatformSerializer import io.embrace.android.embracesdk.fakes.config.FakeEnabledFeatureConfig @@ -24,12 +24,13 @@ import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertNotNull import org.junit.Assert.assertTrue -import org.junit.Before import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.robolectric.annotation.Config +@Config(sdk = [TIRAMISU]) @RunWith(AndroidJUnit4::class) internal class ResurrectionFeatureTest { @@ -40,20 +41,11 @@ internal class ResurrectionFeatureTest { @JvmField val testRule: SdkIntegrationTestRule = SdkIntegrationTestRule { EmbraceSetupInterface().apply { - (overriddenInitModule.logger as FakeEmbLogger).throwOnInternalError = false + getEmbLogger().throwOnInternalError = false + cacheStorageService = FakePayloadStorageService(processIdProvider = getProcessIdentifierProvider()) } } - @Before - fun setUp() { - cacheStorageService = - FakePayloadStorageService( - processIdProvider = { - testRule.setup.overriddenOpenTelemetryModule.openTelemetryConfiguration.processIdentifier - } - ) - } - @Test fun `crashed session and native crash resurrected and sent properly`() { val crashData = createStoredNativeCrashData( diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/SessionPropertiesTest.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/SessionPropertiesTest.kt index c8cdba948b..ac89cafd91 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/SessionPropertiesTest.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/SessionPropertiesTest.kt @@ -128,7 +128,7 @@ internal class SessionPropertiesTest { } private fun EmbraceSetupInterface.setupPermanentProperties() { - overriddenAndroidServicesModule.preferencesService.permanentSessionProperties = + getPreferencesService().permanentSessionProperties = mapOf( EXISTING_KEY_1 to VALUE, EXISTING_KEY_2 to VALUE, diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/UserFeaturesTest.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/UserFeaturesTest.kt index f46379b69a..c6449d254e 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/UserFeaturesTest.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testcases/features/UserFeaturesTest.kt @@ -21,7 +21,7 @@ internal class UserFeaturesTest { fun `user info setting and clearing`() { testRule.runTest( setupAction = { - overriddenAndroidServicesModule.preferencesService.apply { + getPreferencesService().apply { userIdentifier = "customId" username = "customUserName" userEmailAddress = "custom@domain.com" diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testframework/SdkIntegrationTestRule.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testframework/SdkIntegrationTestRule.kt index 3d8e95c9a8..1c130cf52f 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testframework/SdkIntegrationTestRule.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testframework/SdkIntegrationTestRule.kt @@ -29,11 +29,11 @@ import io.embrace.android.embracesdk.testframework.actions.EmbraceSetupInterface import io.embrace.android.embracesdk.testframework.export.FilteredLogExporter import io.embrace.android.embracesdk.testframework.export.FilteredSpanExporter import io.embrace.android.embracesdk.testframework.server.FakeApiServer -import java.io.File import okhttp3.Protocol import okhttp3.mockwebserver.MockWebServer import org.junit.Assert.assertEquals import org.junit.rules.ExternalResource +import java.io.File /** * A [org.junit.Rule] that is responsible for setting up and tearing down the Embrace SDK for use in @@ -156,7 +156,7 @@ internal class SdkIntegrationTestRule( persistConfig(persistedRemoteConfig) if (startSdk) { - embraceImpl.start(overriddenCoreModule.context) + embraceImpl.start(getContext()) assertEquals( "SDK did not start in integration test.", expectSdkToStart, diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testframework/actions/EmbraceSetupInterface.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testframework/actions/EmbraceSetupInterface.kt index ee2515ca7b..12ff31046b 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testframework/actions/EmbraceSetupInterface.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/testframework/actions/EmbraceSetupInterface.kt @@ -1,5 +1,6 @@ package io.embrace.android.embracesdk.testframework.actions +import android.content.Context import androidx.lifecycle.Lifecycle import androidx.lifecycle.testing.TestLifecycleOwner import io.embrace.android.embracesdk.concurrency.BlockingScheduledExecutorService @@ -25,8 +26,8 @@ import io.embrace.android.embracesdk.internal.delivery.execution.RequestExecutio import io.embrace.android.embracesdk.internal.delivery.storage.PayloadStorageService import io.embrace.android.embracesdk.internal.injection.AndroidServicesModule import io.embrace.android.embracesdk.internal.injection.AnrModule +import io.embrace.android.embracesdk.internal.injection.CoreModule import io.embrace.android.embracesdk.internal.injection.ModuleInitBootstrapper -import io.embrace.android.embracesdk.internal.injection.OpenTelemetryModule import io.embrace.android.embracesdk.internal.injection.WorkerThreadModule import io.embrace.android.embracesdk.internal.injection.createAndroidServicesModule import io.embrace.android.embracesdk.internal.injection.createAnrModule @@ -36,7 +37,10 @@ import io.embrace.android.embracesdk.internal.injection.createNativeCoreModule import io.embrace.android.embracesdk.internal.injection.createWorkerThreadModule import io.embrace.android.embracesdk.internal.logging.InternalErrorType import io.embrace.android.embracesdk.internal.payload.NativeCrashData +import io.embrace.android.embracesdk.internal.prefs.PreferencesService import io.embrace.android.embracesdk.internal.serialization.PlatformSerializer +import io.embrace.android.embracesdk.internal.spans.CurrentSessionSpan +import io.embrace.android.embracesdk.internal.spans.SpanSink import io.embrace.android.embracesdk.internal.utils.Provider import io.embrace.android.embracesdk.internal.worker.Worker import io.embrace.android.embracesdk.testframework.SdkIntegrationTestRule @@ -45,23 +49,11 @@ import io.embrace.android.embracesdk.testframework.SdkIntegrationTestRule * Test harness for which an instance is generated each test run and provided to the test by the Rule */ internal class EmbraceSetupInterface @JvmOverloads constructor( - currentTimeMs: Long = SdkIntegrationTestRule.DEFAULT_SDK_START_TIME_MS, workerToFake: Worker.Background? = null, priorityWorkerToFake: Worker.Priority? = null, anrMonitoringThread: Thread? = null, + processIdentifier: String = "integration-test-process", var useMockWebServer: Boolean = true, - val processIdentifier: String = "integration-test-process", - val overriddenInitModule: FakeInitModule = FakeInitModule( - clock = FakeClock(currentTime = currentTimeMs), - logger = FakeEmbLogger(ignoredErrors = mutableListOf(InternalErrorType.PROCESS_STATE_CALLBACK_FAIL)), - processIdentifierProvider = { processIdentifier } - ), - val overriddenOpenTelemetryModule: OpenTelemetryModule = overriddenInitModule.openTelemetryModule, - val overriddenCoreModule: FakeCoreModule = FakeCoreModule(), - val overriddenAndroidServicesModule: AndroidServicesModule = createAndroidServicesModule( - initModule = overriddenInitModule, - coreModule = overriddenCoreModule - ), var cacheStorageServiceProvider: Provider? = null, var payloadStorageServiceProvider: Provider? = null, val networkConnectivityService: FakeNetworkConnectivityService = FakeNetworkConnectivityService(), @@ -69,8 +61,14 @@ internal class EmbraceSetupInterface @JvmOverloads constructor( var symbols: Map = mapOf("libfoo.so" to "symbol_content"), val lifecycleOwner: TestLifecycleOwner = TestLifecycleOwner(initialState = Lifecycle.State.INITIALIZED), ) { + private val fakeInitModule: FakeInitModule = FakeInitModule( + clock = FakeClock(currentTime = SdkIntegrationTestRule.DEFAULT_SDK_START_TIME_MS), + logger = FakeEmbLogger(ignoredErrors = mutableListOf(InternalErrorType.PROCESS_STATE_CALLBACK_FAIL)), + processIdentifierProvider = { processIdentifier } + ) + private val workerThreadModule: WorkerThreadModule = initWorkerThreadModule( - fakeInitModule = overriddenInitModule, + fakeInitModule = fakeInitModule, workerToFake = workerToFake, priorityWorkerToFake = priorityWorkerToFake, anrMonitoringThread = anrMonitoringThread @@ -78,7 +76,7 @@ internal class EmbraceSetupInterface @JvmOverloads constructor( private val anrModule: AnrModule = if (anrMonitoringThread != null) { createAnrModule( - overriddenInitModule, + fakeInitModule, FakeConfigService(), workerThreadModule ) @@ -86,17 +84,24 @@ internal class EmbraceSetupInterface @JvmOverloads constructor( FakeAnrModule() } + private val coreModule: CoreModule = FakeCoreModule() + + private val androidServicesModule: AndroidServicesModule = createAndroidServicesModule( + initModule = fakeInitModule, + coreModule = coreModule + ) + fun createBootstrapper( instrumentedConfig: FakeInstrumentedConfig, deliveryTracer: DeliveryTracer, ): ModuleInitBootstrapper = ModuleInitBootstrapper( - initModule = overriddenInitModule.apply { + initModule = fakeInitModule.apply { this.instrumentedConfig = instrumentedConfig }, - openTelemetryModule = overriddenInitModule.openTelemetryModule, - coreModuleSupplier = { _, _ -> overriddenCoreModule }, + openTelemetryModule = fakeInitModule.openTelemetryModule, + coreModuleSupplier = { _, _ -> coreModule }, workerThreadModuleSupplier = { workerThreadModule }, - androidServicesModuleSupplier = { _, _ -> overriddenAndroidServicesModule }, + androidServicesModuleSupplier = { _, _ -> androidServicesModule }, essentialServiceModuleSupplier = { initModule, configModule, openTelemetryModule, coreModule, workerThreadModule, systemServiceModule, androidServicesModule, storageModule, _, _ -> createEssentialServiceModule( initModule, @@ -183,7 +188,13 @@ internal class EmbraceSetupInterface @JvmOverloads constructor( jniDelegate.addCrashRaw(key, json) } - fun getClock(): FakeClock = checkNotNull(overriddenInitModule.getFakeClock()) + fun getContext(): Context = coreModule.context + + fun getClock(): FakeClock = checkNotNull(fakeInitModule.getFakeClock()) + + fun getProcessIdentifierProvider(): () -> String = fakeInitModule.processIdentifierProvider + + fun getEmbLogger(): FakeEmbLogger = fakeInitModule.logger as FakeEmbLogger fun getFakedWorkerExecutor(): BlockingScheduledExecutorService = (workerThreadModule as FakeWorkerThreadModule).executor @@ -193,6 +204,12 @@ internal class EmbraceSetupInterface @JvmOverloads constructor( fun getBlockedThreadDetector(): BlockedThreadDetector = anrModule.blockedThreadDetector + fun getSpanSink(): SpanSink = fakeInitModule.openTelemetryModule.spanSink + + fun getCurrentSessionSpan(): CurrentSessionSpan = fakeInitModule.openTelemetryModule.currentSessionSpan + + fun getPreferencesService(): PreferencesService = androidServicesModule.preferencesService + private companion object { fun initWorkerThreadModule( fakeInitModule: FakeInitModule,