diff --git a/embrace-android-sdk/src/integrationTest/java/io/embrace/android/embracesdk/NullParametersTest.java b/embrace-android-sdk/src/integrationTest/java/io/embrace/android/embracesdk/NullParametersTest.java index 890fdcda1b..41ab1e9615 100644 --- a/embrace-android-sdk/src/integrationTest/java/io/embrace/android/embracesdk/NullParametersTest.java +++ b/embrace-android-sdk/src/integrationTest/java/io/embrace/android/embracesdk/NullParametersTest.java @@ -359,11 +359,9 @@ public void testAddSpanExporter() { private void assertError(@NonNull String functionName) { assertInternalErrorLogged( - IntegrationTestRuleExtensionsKt.internalErrorService().getCapturedData(), + testRule.bootstrapper, IllegalArgumentException.class.getCanonicalName(), - functionName + NULL_PARAMETER_ERROR_MESSAGE_TEMPLATE, - IntegrationTestRule.DEFAULT_SDK_START_TIME_MS + functionName + NULL_PARAMETER_ERROR_MESSAGE_TEMPLATE ); - IntegrationTestRuleExtensionsKt.internalErrorService().getCapturedData(); } } diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/assertions/InternalErrorAssertions.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/assertions/InternalErrorAssertions.kt index 67ce43ac3c..ac6ba1ec15 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/assertions/InternalErrorAssertions.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/assertions/InternalErrorAssertions.kt @@ -1,43 +1,35 @@ package io.embrace.android.embracesdk.assertions -import io.embrace.android.embracesdk.payload.LegacyExceptionError -import io.embrace.android.embracesdk.IntegrationTestRule -import org.junit.Assert.assertTrue +import io.embrace.android.embracesdk.FakeDeliveryService +import io.embrace.android.embracesdk.findLogAttribute +import io.embrace.android.embracesdk.injection.ModuleInitBootstrapper +import org.junit.Assert.fail /** * Return true if at least one exception matching the expected time, exception type, and error message is found in the internal errors */ internal fun assertInternalErrorLogged( - exceptionError: LegacyExceptionError?, + bootstrapper: ModuleInitBootstrapper, exceptionClassName: String, - errorMessage: String, - errorTimeMs: Long = IntegrationTestRule.DEFAULT_SDK_START_TIME_MS + errorMessage: String ) { - requireNotNull(exceptionError) { "No internal errors found" } - var foundErrorMatch = false - var foundErrorAtTime = false - val unmatchedDetails: MutableList = mutableListOf() - val errors = exceptionError.exceptionErrors.toList() - assertTrue("No exception errors found", errors.isNotEmpty()) - errors.forEach { error -> - if (errorTimeMs == error.timestamp) { - foundErrorAtTime = true - val firstExceptionInfo = checkNotNull(error.exceptions).first() - with(firstExceptionInfo) { - if (exceptionClassName == name && errorMessage == message) { - foundErrorMatch = true - } else { - unmatchedDetails.add("'$exceptionClassName' is not '$name' OR '$errorMessage' is not '$message' \n") - } - } + bootstrapper.customerLogModule.logOrchestrator.flush(false) + val deliveryService = bootstrapper.deliveryModule.deliveryService as FakeDeliveryService + val logs = deliveryService.lastSentLogPayloads.mapNotNull { it.data.logs } + .flatten() + .filter { log -> + log.findLogAttribute("emb.type") == "sys.internal" } - } - assertTrue("No internal error found matching the expected time", foundErrorAtTime) + if (logs.isEmpty()) { + fail("No internal errors found") + } - assertTrue( - "Expected exception not found. " + - "Found following ${unmatchedDetails.size} exceptions in ${errors.size} errors instead: $unmatchedDetails", - foundErrorMatch - ) + val matchingLogs = logs.filter { log -> + log.findLogAttribute("exception.type") == exceptionClassName && + log.findLogAttribute("exception.message") == errorMessage + } + if (matchingLogs.isEmpty()) { + fail("No internal errors found matching the expected exception") + } } diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceImpl.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceImpl.kt index 887174b970..a9194921e8 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceImpl.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/EmbraceImpl.kt @@ -96,11 +96,7 @@ internal class EmbraceImpl @JvmOverloads constructor( val metadataService by embraceImplInject { bootstrapper.essentialServiceModule.metadataService } val activityService by embraceImplInject { bootstrapper.essentialServiceModule.processStateService } val activityLifecycleTracker by embraceImplInject { bootstrapper.essentialServiceModule.activityLifecycleTracker } - val internalErrorService by embraceImplInject { - bootstrapper.initModule.internalErrorService.also { - it.configService = bootstrapper.essentialServiceModule.configService - } - } + val internalErrorService by embraceImplInject { bootstrapper.initModule.internalErrorService } private val anrService by embraceImplInject { bootstrapper.anrModule.anrService } private val configService by embraceImplInject { bootstrapper.essentialServiceModule.configService } diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/session/SessionPayloadSourceImpl.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/session/SessionPayloadSourceImpl.kt index f565a24fbf..dbda904faf 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/session/SessionPayloadSourceImpl.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/envelope/session/SessionPayloadSourceImpl.kt @@ -2,7 +2,6 @@ package io.embrace.android.embracesdk.capture.envelope.session import io.embrace.android.embracesdk.anr.ndk.NativeThreadSamplerService import io.embrace.android.embracesdk.arch.schema.AppTerminationCause -import io.embrace.android.embracesdk.capture.internal.errors.InternalErrorService import io.embrace.android.embracesdk.internal.payload.SessionPayload import io.embrace.android.embracesdk.internal.payload.Span import io.embrace.android.embracesdk.internal.payload.toNewPayload @@ -18,7 +17,6 @@ import io.embrace.android.embracesdk.session.properties.SessionPropertiesService import io.embrace.android.embracesdk.spans.PersistableEmbraceSpan internal class SessionPayloadSourceImpl( - private val internalErrorService: InternalErrorService, private val nativeThreadSamplerService: NativeThreadSamplerService?, private val spanSink: SpanSink, private val currentSessionSpan: CurrentSessionSpan, @@ -29,7 +27,6 @@ internal class SessionPayloadSourceImpl( override fun getSessionPayload(endType: SessionSnapshotType): SessionPayload { val sharedLibSymbolMapping = captureDataSafely(logger) { nativeThreadSamplerService?.getNativeSymbols() } - val internalErrors = captureDataSafely(logger) { internalErrorService.getCapturedData()?.toNewPayload() } val snapshots = retrieveSpanSnapshotData() // Ensure the span retrieving is last as that potentially ends the session span, which effectively ends the session @@ -37,7 +34,6 @@ internal class SessionPayloadSourceImpl( return SessionPayload( spans = spans, spanSnapshots = snapshots, - internalError = internalErrors, sharedLibSymbolMapping = sharedLibSymbolMapping ) } diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/internal/errors/EmbraceInternalErrorService.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/internal/errors/EmbraceInternalErrorService.kt index 9ac31203e9..424e3e50a8 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/internal/errors/EmbraceInternalErrorService.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/internal/errors/EmbraceInternalErrorService.kt @@ -1,36 +1,15 @@ package io.embrace.android.embracesdk.capture.internal.errors -import io.embrace.android.embracesdk.config.ConfigService -import io.embrace.android.embracesdk.internal.clock.Clock -import io.embrace.android.embracesdk.payload.LegacyExceptionError +import io.embrace.android.embracesdk.internal.utils.Provider /** * Intercepts Embrace SDK's exceptions errors and forwards them to the Embrace API. */ -internal class EmbraceInternalErrorService( - private val clock: Clock -) : InternalErrorService { - - private var err: LegacyExceptionError = LegacyExceptionError() +internal class EmbraceInternalErrorService : InternalErrorService { override fun handleInternalError(throwable: Throwable) { - // if the config service has not been set yet, capture the exception - if (configService == null || configService?.dataCaptureEventBehavior?.isInternalExceptionCaptureEnabled() == true) { - err.addException( - throwable, - clock - ) - } + internalErrorDataSource()?.handleInternalError(throwable) } - override var configService: ConfigService? = null - - override fun getCapturedData(): LegacyExceptionError? = when { - err.occurrences > 0 -> err - else -> null - } - - override fun cleanCollections() { - err = LegacyExceptionError() - } + override var internalErrorDataSource: Provider = { null } } diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/internal/errors/InternalErrorService.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/internal/errors/InternalErrorService.kt index 067bbac15e..7e9098c299 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/internal/errors/InternalErrorService.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/capture/internal/errors/InternalErrorService.kt @@ -1,13 +1,11 @@ package io.embrace.android.embracesdk.capture.internal.errors -import io.embrace.android.embracesdk.arch.DataCaptureService -import io.embrace.android.embracesdk.config.ConfigService -import io.embrace.android.embracesdk.payload.LegacyExceptionError +import io.embrace.android.embracesdk.internal.utils.Provider /** * Reports an internal error to Embrace. An internal error is defined as an exception that was * caught within Embrace code & logged to [EmbLogger]. */ -internal interface InternalErrorService : DataCaptureService, InternalErrorHandler { - var configService: ConfigService? +internal interface InternalErrorService : InternalErrorHandler { + var internalErrorDataSource: Provider } diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/DataSourceModule.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/DataSourceModule.kt index f3e569d29c..bb3b0f0cd2 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/DataSourceModule.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/DataSourceModule.kt @@ -14,6 +14,8 @@ import io.embrace.android.embracesdk.capture.crumbs.RnActionDataSource import io.embrace.android.embracesdk.capture.crumbs.TapDataSource import io.embrace.android.embracesdk.capture.crumbs.ViewDataSource import io.embrace.android.embracesdk.capture.crumbs.WebViewUrlDataSource +import io.embrace.android.embracesdk.capture.internal.errors.InternalErrorDataSource +import io.embrace.android.embracesdk.capture.internal.errors.InternalErrorDataSourceImpl import io.embrace.android.embracesdk.capture.memory.MemoryWarningDataSource import io.embrace.android.embracesdk.capture.powersave.LowPowerDataSource import io.embrace.android.embracesdk.capture.session.SessionPropertiesDataSource @@ -55,6 +57,7 @@ internal interface DataSourceModule { val rnActionDataSource: DataSourceState val thermalStateDataSource: DataSourceState? val webViewDataSource: DataSourceState + val internalErrorDataSource: DataSourceState } internal class DataSourceModuleImpl( @@ -268,6 +271,18 @@ internal class DataSourceModuleImpl( ) } + override val internalErrorDataSource: DataSourceState by dataSourceState { + DataSourceState( + factory = { + InternalErrorDataSourceImpl( + logWriter = essentialServiceModule.logWriter, + logger = initModule.logger, + ) + }, + configGate = { configService.dataCaptureEventBehavior.isInternalExceptionCaptureEnabled() } + ) + } + private val configService = essentialServiceModule.configService override fun getDataSources(): List> = values diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/InitModule.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/InitModule.kt index 9d387b23ef..f5f028d040 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/InitModule.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/InitModule.kt @@ -62,7 +62,7 @@ internal class InitModuleImpl( override val systemInfo: SystemInfo = SystemInfo() ) : InitModule { - override val internalErrorService: InternalErrorService = EmbraceInternalErrorService(clock) + override val internalErrorService: InternalErrorService = EmbraceInternalErrorService() init { logger.internalErrorService = internalErrorService diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/ModuleInitBootstrapper.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/ModuleInitBootstrapper.kt index 6baa146b93..b2de3bdf8c 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/ModuleInitBootstrapper.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/ModuleInitBootstrapper.kt @@ -192,7 +192,6 @@ internal class ModuleInitBootstrapper( ) } postInit(EssentialServiceModule::class) { - initModule.internalErrorService.configService = essentialServiceModule.configService serviceRegistry.registerServices( essentialServiceModule.processStateService, essentialServiceModule.metadataService, @@ -227,6 +226,7 @@ internal class ModuleInitBootstrapper( anrModule ) } + initModule.internalErrorService.internalErrorDataSource = { dataSourceModule.internalErrorDataSource.dataSource } dataCaptureServiceModule = init(DataCaptureServiceModule::class) { dataCaptureServiceModuleSupplier( diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/PayloadModule.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/PayloadModule.kt index 13bab30051..8fbc57027a 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/PayloadModule.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/PayloadModule.kt @@ -65,7 +65,6 @@ internal class PayloadModuleImpl( private val sessionPayloadSource by singleton { SessionPayloadSourceImpl( - initModule.internalErrorService, nativeModule.nativeThreadSamplerService, otelModule.spanSink, otelModule.currentSessionSpan, diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/SessionModule.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/SessionModule.kt index a2e9fcf157..cb8e2d7bef 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/SessionModule.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/injection/SessionModule.kt @@ -49,7 +49,6 @@ internal class SessionModuleImpl( essentialServiceModule.metadataService, dataContainerModule.eventService, customerLogModule.logMessageService, - initModule.internalErrorService, dataContainerModule.performanceInfoService, dataCaptureServiceModule.webviewService, nativeModule.nativeThreadSamplerService, diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/payload/SessionPayload.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/payload/SessionPayload.kt index b4ed924267..a69cbee351 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/payload/SessionPayload.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/payload/SessionPayload.kt @@ -10,7 +10,6 @@ import com.squareup.moshi.JsonClass * span, which contains metadata about the session represented by this payload. The spans included * here may not have started in this session, but they ended during it. * @param spanSnapshots A list of spans that are still active at the time of the session's end. - * @param internalError * @param sharedLibSymbolMapping A map of symbols that are associated with the session. We use this * to associate the symbolication files that have been uploaded with UUIDs with the stacktrace module * names, which don’t have UUIDs in them. Previous name: s.sb @@ -28,9 +27,6 @@ internal data class SessionPayload( @Json(name = "span_snapshots") val spanSnapshots: List? = null, - @Json(name = "internal_error") - val internalError: InternalError? = null, - /** * A map of symbols that are associated with the session. * We use this to associate the symbolication files that have been uploaded with UUIDs with the stacktrace module names, diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/payload/Session.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/payload/Session.kt index a183bfd88a..d439c1f1d1 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/payload/Session.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/payload/Session.kt @@ -84,9 +84,6 @@ internal data class Session @JvmOverloads internal constructor( @Json(name = "lec") val errorLogsAttemptedToSend: Int? = null, - @Json(name = "e") - val exceptionError: LegacyExceptionError? = null, - @Json(name = "ri") val crashReportId: String? = null, diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/session/message/V1PayloadMessageCollator.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/session/message/V1PayloadMessageCollator.kt index 8b1ee999fc..4ea4db4d71 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/session/message/V1PayloadMessageCollator.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/session/message/V1PayloadMessageCollator.kt @@ -5,7 +5,6 @@ import io.embrace.android.embracesdk.anr.ndk.NativeAnrOtelMapper import io.embrace.android.embracesdk.anr.ndk.NativeThreadSamplerService import io.embrace.android.embracesdk.arch.schema.AppTerminationCause import io.embrace.android.embracesdk.capture.PerformanceInfoService -import io.embrace.android.embracesdk.capture.internal.errors.InternalErrorService import io.embrace.android.embracesdk.capture.metadata.MetadataService import io.embrace.android.embracesdk.capture.startup.StartupService import io.embrace.android.embracesdk.capture.user.UserService @@ -31,7 +30,6 @@ internal class V1PayloadMessageCollator( private val metadataService: MetadataService, private val eventService: EventService, private val logMessageService: LogMessageService, - private val internalErrorService: InternalErrorService, private val performanceInfoService: PerformanceInfoService, private val webViewService: WebViewService, private val nativeThreadSamplerService: NativeThreadSamplerService?, @@ -136,7 +134,6 @@ internal class V1PayloadMessageCollator( infoLogsAttemptedToSend = captureDataSafely(logger, logMessageService::getInfoLogsAttemptedToSend), warnLogsAttemptedToSend = captureDataSafely(logger, logMessageService::getWarnLogsAttemptedToSend), errorLogsAttemptedToSend = captureDataSafely(logger, logMessageService::getErrorLogsAttemptedToSend), - exceptionError = captureDataSafely(logger, internalErrorService::getCapturedData), lastHeartbeatTime = endTime, endType = lifeEventType, unhandledExceptions = captureDataSafely(logger, logMessageService::getUnhandledExceptionsSent), diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/SessionTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/SessionTest.kt index 36ce0da55a..a6915a6e4e 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/SessionTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/SessionTest.kt @@ -1,7 +1,6 @@ package io.embrace.android.embracesdk import com.squareup.moshi.JsonDataException -import io.embrace.android.embracesdk.payload.LegacyExceptionError import io.embrace.android.embracesdk.payload.Orientation import io.embrace.android.embracesdk.payload.Session import io.embrace.android.embracesdk.payload.Session.LifeEventType @@ -40,7 +39,6 @@ internal class SessionTest { startupThreshold = 5000, sdkStartupDuration = 109, unhandledExceptions = 1, - exceptionError = LegacyExceptionError(), orientations = listOf(Orientation(1, 16092342200)), properties = mapOf("fake-key" to "fake-value"), symbols = mapOf("fake-native-key" to "fake-native-value"), @@ -90,7 +88,6 @@ internal class SessionTest { assertEquals(5000L, startupThreshold) assertEquals(109L, sdkStartupDuration) assertEquals(1, unhandledExceptions) - assertEquals(LegacyExceptionError(), exceptionError) assertEquals(listOf(Orientation(1, 16092342200)), orientations) assertEquals(mapOf("fake-key" to "fake-value"), properties) assertEquals(mapOf("fake-native-key" to "fake-native-value"), symbols) diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/envelope/session/SessionPayloadSourceImplTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/envelope/session/SessionPayloadSourceImplTest.kt index 433da0d371..ff8925112d 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/envelope/session/SessionPayloadSourceImplTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/capture/envelope/session/SessionPayloadSourceImplTest.kt @@ -1,9 +1,7 @@ package io.embrace.android.embracesdk.capture.envelope.session import io.embrace.android.embracesdk.FakeSessionPropertiesService -import io.embrace.android.embracesdk.fakes.FakeClock import io.embrace.android.embracesdk.fakes.FakeCurrentSessionSpan -import io.embrace.android.embracesdk.fakes.FakeInternalErrorService import io.embrace.android.embracesdk.fakes.FakeNativeThreadSamplerService import io.embrace.android.embracesdk.fakes.FakePersistableEmbraceSpan import io.embrace.android.embracesdk.fakes.FakeSpanData @@ -11,7 +9,6 @@ import io.embrace.android.embracesdk.internal.payload.SessionPayload import io.embrace.android.embracesdk.internal.spans.SpanRepository import io.embrace.android.embracesdk.internal.spans.SpanSinkImpl import io.embrace.android.embracesdk.logging.EmbLoggerImpl -import io.embrace.android.embracesdk.payload.LegacyExceptionError import io.embrace.android.embracesdk.session.orchestrator.SessionSnapshotType import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull @@ -29,11 +26,6 @@ internal class SessionPayloadSourceImplTest { @Before fun setUp() { - val errorService = FakeInternalErrorService().apply { - data = LegacyExceptionError().apply { - addException(RuntimeException(), FakeClock()) - } - } sink = SpanSinkImpl().apply { storeCompletedSpans(listOf(cacheSpan)) } @@ -44,7 +36,6 @@ internal class SessionPayloadSourceImplTest { spanRepository = SpanRepository() spanRepository.trackStartedSpan(activeSpan) impl = SessionPayloadSourceImpl( - errorService, FakeNativeThreadSamplerService(), sink, currentSessionSpan, @@ -76,8 +67,6 @@ internal class SessionPayloadSourceImplTest { } private fun assertPayloadPopulated(payload: SessionPayload) { - val err = checkNotNull(payload.internalError) - assertEquals(1, err.count) assertEquals(mapOf("armeabi-v7a" to "my-symbols"), payload.sharedLibSymbolMapping) val snapshots = checkNotNull(payload.spanSnapshots) assertEquals(1, snapshots.size) diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeDataSourceModule.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeDataSourceModule.kt index ba1a830039..208a6a5eb4 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeDataSourceModule.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeDataSourceModule.kt @@ -10,6 +10,7 @@ import io.embrace.android.embracesdk.capture.crumbs.RnActionDataSource import io.embrace.android.embracesdk.capture.crumbs.TapDataSource import io.embrace.android.embracesdk.capture.crumbs.ViewDataSource import io.embrace.android.embracesdk.capture.crumbs.WebViewUrlDataSource +import io.embrace.android.embracesdk.capture.internal.errors.InternalErrorDataSource import io.embrace.android.embracesdk.capture.memory.MemoryWarningDataSource import io.embrace.android.embracesdk.capture.powersave.LowPowerDataSource import io.embrace.android.embracesdk.capture.session.SessionPropertiesDataSource @@ -35,4 +36,5 @@ internal class FakeDataSourceModule : DataSourceModule { override val rnActionDataSource: DataSourceState = DataSourceState({ null }) override val thermalStateDataSource: DataSourceState = DataSourceState({ null }) override val webViewDataSource: DataSourceState = DataSourceState({ null }) + override val internalErrorDataSource: DataSourceState = DataSourceState({ null }) } diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeInternalErrorService.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeInternalErrorService.kt index 0a02304459..ee2fbba3e7 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeInternalErrorService.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/fakes/FakeInternalErrorService.kt @@ -1,12 +1,13 @@ package io.embrace.android.embracesdk.fakes +import io.embrace.android.embracesdk.capture.internal.errors.InternalErrorDataSource import io.embrace.android.embracesdk.capture.internal.errors.InternalErrorService -import io.embrace.android.embracesdk.config.ConfigService +import io.embrace.android.embracesdk.internal.utils.Provider import io.embrace.android.embracesdk.payload.LegacyExceptionError internal class FakeInternalErrorService : InternalErrorService { - override var configService: ConfigService? = null + override var internalErrorDataSource: Provider = { null } var throwables: MutableList = mutableListOf() var resetCallCount: Int = 0 var data: LegacyExceptionError? = null @@ -14,12 +15,4 @@ internal class FakeInternalErrorService : InternalErrorService { override fun handleInternalError(throwable: Throwable) { throwables.add(throwable) } - - override fun getCapturedData(): LegacyExceptionError? { - return data - } - - override fun cleanCollections() { - resetCallCount++ - } } diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/injection/DataSourceModuleImplTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/injection/DataSourceModuleImplTest.kt index 43cf2c8309..cc68fd824e 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/injection/DataSourceModuleImplTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/injection/DataSourceModuleImplTest.kt @@ -43,6 +43,7 @@ internal class DataSourceModuleImplTest { assertNotNull(module.rnActionDataSource) assertNotNull(module.thermalStateDataSource) assertNotNull(module.webViewDataSource) - assertEquals(14, module.getDataSources().size) + assertNotNull(module.internalErrorDataSource) + assertEquals(15, module.getDataSources().size) } } diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/payload/MapInternalErrorTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/payload/MapInternalErrorTest.kt deleted file mode 100644 index 2786417795..0000000000 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/payload/MapInternalErrorTest.kt +++ /dev/null @@ -1,40 +0,0 @@ -package io.embrace.android.embracesdk.internal.payload - -import io.embrace.android.embracesdk.payload.LegacyExceptionError -import io.embrace.android.embracesdk.payload.LegacyExceptionErrorInfo -import io.embrace.android.embracesdk.payload.LegacyExceptionInfo -import org.junit.Assert.assertEquals -import org.junit.Test - -internal class MapInternalErrorTest { - - @Test - fun `convert to model`() { - val input = LegacyExceptionError() - input.occurrences = 1 - input.exceptionErrors.add( - LegacyExceptionErrorInfo( - timestamp = 0, - exceptions = listOf( - LegacyExceptionInfo( - name = "name", - message = "message", - lines = listOf("line1", "line2") - ) - ) - ) - ) - - // validate transform - val output = input.toNewPayload() - assertEquals(1, output.count) - - val error = checkNotNull(output.errors).single() - assertEquals(0L, error.timestamp) - - val exception = checkNotNull(error.exceptions).single() - assertEquals("name", exception.name) - assertEquals("message", exception.message) - assertEquals(listOf("line1", "line2"), exception.stacktrace) - } -} diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/logging/EmbraceInternalErrorServiceTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/logging/EmbraceInternalErrorServiceTest.kt deleted file mode 100644 index e8dc1aafcc..0000000000 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/logging/EmbraceInternalErrorServiceTest.kt +++ /dev/null @@ -1,111 +0,0 @@ -package io.embrace.android.embracesdk.logging - -import io.embrace.android.embracesdk.capture.internal.errors.EmbraceInternalErrorService -import io.embrace.android.embracesdk.capture.internal.errors.InternalErrorService -import io.embrace.android.embracesdk.config.ConfigService -import io.embrace.android.embracesdk.config.remote.RemoteConfig -import io.embrace.android.embracesdk.fakes.FakeConfigService -import io.embrace.android.embracesdk.fakes.FakeProcessStateService -import io.embrace.android.embracesdk.fakes.fakeDataCaptureEventBehavior -import io.embrace.android.embracesdk.internal.clock.Clock -import org.junit.Assert.assertEquals -import org.junit.Assert.assertNull -import org.junit.Before -import org.junit.Test - -internal class EmbraceInternalErrorServiceTest { - - private lateinit var service: InternalErrorService - private lateinit var cfgService: ConfigService - private lateinit var activityService: FakeProcessStateService - private lateinit var cfg: RemoteConfig - private val clock = Clock { 1509234092L } - - @Before - fun setUp() { - activityService = FakeProcessStateService() - service = EmbraceInternalErrorService(clock) - cfg = RemoteConfig() - cfgService = - FakeConfigService(dataCaptureEventBehavior = fakeDataCaptureEventBehavior { cfg }) - } - - @Test - fun testExceptionReportingEnabled() { - cfg = cfg.copy(internalExceptionCaptureEnabled = true) - service.configService = cfgService - service.handleInternalError(RuntimeException("Whoops!")) - - val error = checkNotNull(service.getCapturedData()) - assertEquals(1, error.occurrences) - with(error.exceptionErrors.single()) { - assertEquals(clock.now(), timestamp) - - // verify exc object - val exc = exceptions?.single() - assertEquals("Whoops!", exc?.message) - assertEquals("java.lang.RuntimeException", exc?.name) - } - } - - @Test - fun testExceptionReportingDisabled() { - cfg = cfg.copy(internalExceptionCaptureEnabled = false) - service.configService = cfgService - service.handleInternalError(RuntimeException()) - assertNull(service.getCapturedData()) - } - - @Test - fun testExceptionReportingUnknown() { - service.handleInternalError(RuntimeException()) - val error = checkNotNull(service.getCapturedData()) - assertEquals(1, error.occurrences) - } - - @Test - fun testExceptionReset() { - cfg = cfg.copy(internalExceptionCaptureEnabled = true) - service.configService = cfgService - service.handleInternalError(RuntimeException()) - - val error = checkNotNull(service.getCapturedData()) - assertEquals(1, error.occurrences) - - service.cleanCollections() - assertNull(service.getCapturedData()) - } - - @Test - fun testIsInBackground() { - activityService.isInBackground = true - service.handleInternalError(RuntimeException("Whoops!")) - - val error = checkNotNull(service.getCapturedData()) - assertEquals(1, error.occurrences) - } - - @Test - fun testMultipleExceptionTypes() { - service.handleInternalError(RuntimeException("Whoops!")) - service.handleInternalError(IllegalStateException("Another!")) - service.handleInternalError(IllegalStateException("Another 2!")) - - val error = checkNotNull(service.getCapturedData()) - assertEquals(3, error.occurrences) - - assertEquals("Whoops!", error.exceptionErrors[0].exceptions?.single()?.message) - assertEquals("Another!", error.exceptionErrors[1].exceptions?.single()?.message) - assertEquals("Another 2!", error.exceptionErrors[2].exceptions?.single()?.message) - } - - @Test - fun testExceptionMaxLimit() { - repeat(12) { k -> - service.handleInternalError(RuntimeException("Oh no $k")) - } - val err = checkNotNull(service.getCapturedData()) - assertEquals(12, err.occurrences) - assertEquals(10, err.exceptionErrors.size) - } -} diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/payload/BackgroundActivityTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/payload/BackgroundActivityTest.kt index 1d4d3cf5d3..e5d0b051fe 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/payload/BackgroundActivityTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/payload/BackgroundActivityTest.kt @@ -27,7 +27,6 @@ internal class BackgroundActivityTest { infoLogsAttemptedToSend = 1, warnLogsAttemptedToSend = 2, errorLogsAttemptedToSend = 3, - exceptionError = LegacyExceptionError(), crashReportId = "fake-crash-id", endType = Session.LifeEventType.BKGND_STATE, startType = Session.LifeEventType.BKGND_STATE, @@ -65,7 +64,6 @@ internal class BackgroundActivityTest { assertEquals(Session.LifeEventType.BKGND_STATE, endType) assertEquals(Session.LifeEventType.BKGND_STATE, startType) assertEquals(1, unhandledExceptions) - assertEquals(LegacyExceptionError(), exceptionError) assertEquals(mapOf("fake-key" to "fake-value"), properties) } } diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/PayloadFactoryBaTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/PayloadFactoryBaTest.kt index 358668c7a1..c9be88b530 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/PayloadFactoryBaTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/PayloadFactoryBaTest.kt @@ -162,7 +162,6 @@ internal class PayloadFactoryBaTest { metadataService, eventService, logMessageService, - internalErrorService, performanceInfoService, FakeWebViewService(), null, diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/SessionHandlerTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/SessionHandlerTest.kt index cb24f6fba8..ed13d9c854 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/SessionHandlerTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/SessionHandlerTest.kt @@ -7,7 +7,6 @@ import io.embrace.android.embracesdk.anr.AnrOtelMapper import io.embrace.android.embracesdk.anr.ndk.NativeAnrOtelMapper import io.embrace.android.embracesdk.capture.PerformanceInfoService import io.embrace.android.embracesdk.capture.envelope.session.SessionEnvelopeSourceImpl -import io.embrace.android.embracesdk.capture.internal.errors.EmbraceInternalErrorService import io.embrace.android.embracesdk.capture.webview.WebViewService import io.embrace.android.embracesdk.concurrency.BlockingScheduledExecutorService import io.embrace.android.embracesdk.config.local.LocalConfig @@ -63,7 +62,6 @@ import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertFalse import org.junit.Assert.assertNotNull -import org.junit.Assert.assertNull import org.junit.Before import org.junit.Test @@ -73,7 +71,6 @@ internal class SessionHandlerTest { private val eventService: EventService = FakeEventService() private val logMessageService: LogMessageService = FakeLogMessageService() private val clock = FakeClock() - private val internalErrorService = EmbraceInternalErrorService(clock) private const val NOW = 123L private var sessionNumber = 5 private val sessionProperties: EmbraceSessionProperties = mockk(relaxed = true) @@ -153,7 +150,6 @@ internal class SessionHandlerTest { metadataService, eventService, logMessageService, - internalErrorService, performanceInfoService, webViewService, null, @@ -247,7 +243,6 @@ internal class SessionHandlerTest { assertEquals(0, infoLogsAttemptedToSend) assertEquals(0, warnLogsAttemptedToSend) assertEquals(0, errorLogsAttemptedToSend) - assertNull(exceptionError) assertEquals(NOW, lastHeartbeatTime) assertEquals(sessionProperties.get(), properties) assertEquals(Session.LifeEventType.STATE, endType) diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/V1PayloadMessageCollatorTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/V1PayloadMessageCollatorTest.kt index 223455408d..e8b8584c8e 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/V1PayloadMessageCollatorTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/V1PayloadMessageCollatorTest.kt @@ -6,7 +6,6 @@ import io.embrace.android.embracesdk.anr.ndk.NativeAnrOtelMapper import io.embrace.android.embracesdk.fakes.FakeAnrService import io.embrace.android.embracesdk.fakes.FakeEventService import io.embrace.android.embracesdk.fakes.FakeGatingService -import io.embrace.android.embracesdk.fakes.FakeInternalErrorService import io.embrace.android.embracesdk.fakes.FakeLogMessageService import io.embrace.android.embracesdk.fakes.FakeMetadataService import io.embrace.android.embracesdk.fakes.FakePerformanceInfoService @@ -19,7 +18,6 @@ import io.embrace.android.embracesdk.fakes.fakeInProgressAnrInterval import io.embrace.android.embracesdk.fakes.injection.FakeCoreModule import io.embrace.android.embracesdk.fakes.injection.FakeInitModule import io.embrace.android.embracesdk.internal.serialization.EmbraceSerializer -import io.embrace.android.embracesdk.payload.LegacyExceptionError import io.embrace.android.embracesdk.payload.Session import io.embrace.android.embracesdk.payload.Session.LifeEventType import io.embrace.android.embracesdk.payload.SessionMessage @@ -65,9 +63,6 @@ internal class V1PayloadMessageCollatorTest { preferencesService = FakePreferenceService(), eventService = FakeEventService(), logMessageService = FakeLogMessageService(), - internalErrorService = FakeInternalErrorService().apply { - data = LegacyExceptionError() - }, metadataService = FakeMetadataService(), performanceInfoService = FakePerformanceInfoService(), spanRepository = initModule.openTelemetryModule.spanRepository, @@ -253,7 +248,6 @@ internal class V1PayloadMessageCollatorTest { assertNotNull(infoLogsAttemptedToSend) assertNotNull(warnLogsAttemptedToSend) assertNotNull(errorLogsAttemptedToSend) - assertNotNull(exceptionError) assertNotNull(unhandledExceptions) } } diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/message/PayloadFactoryImplTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/message/PayloadFactoryImplTest.kt index b425492012..05e931c106 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/message/PayloadFactoryImplTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/message/PayloadFactoryImplTest.kt @@ -12,7 +12,6 @@ import io.embrace.android.embracesdk.fakes.FakeEnvelopeMetadataSource import io.embrace.android.embracesdk.fakes.FakeEnvelopeResourceSource import io.embrace.android.embracesdk.fakes.FakeEventService import io.embrace.android.embracesdk.fakes.FakeGatingService -import io.embrace.android.embracesdk.fakes.FakeInternalErrorService import io.embrace.android.embracesdk.fakes.FakeLogMessageService import io.embrace.android.embracesdk.fakes.FakeMetadataService import io.embrace.android.embracesdk.fakes.FakePerformanceInfoService @@ -24,7 +23,6 @@ import io.embrace.android.embracesdk.fakes.FakeWebViewService import io.embrace.android.embracesdk.fakes.fakeOTelBehavior import io.embrace.android.embracesdk.fakes.injection.FakeInitModule import io.embrace.android.embracesdk.internal.serialization.EmbraceSerializer -import io.embrace.android.embracesdk.payload.LegacyExceptionError import io.embrace.android.embracesdk.payload.isV2Payload import io.embrace.android.embracesdk.session.lifecycle.ProcessState.FOREGROUND import org.junit.Assert.assertFalse @@ -55,9 +53,6 @@ internal class PayloadFactoryImplTest { preferencesService = FakePreferenceService(), eventService = FakeEventService(), logMessageService = FakeLogMessageService(), - internalErrorService = FakeInternalErrorService().apply { - data = LegacyExceptionError() - }, metadataService = FakeMetadataService(), performanceInfoService = FakePerformanceInfoService(), spanRepository = initModule.openTelemetryModule.spanRepository, diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/message/V2PayloadMessageCollatorTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/message/V2PayloadMessageCollatorTest.kt index ee266a6178..3538e3dfc4 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/message/V2PayloadMessageCollatorTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/session/message/V2PayloadMessageCollatorTest.kt @@ -9,7 +9,6 @@ import io.embrace.android.embracesdk.fakes.FakeEnvelopeMetadataSource import io.embrace.android.embracesdk.fakes.FakeEnvelopeResourceSource import io.embrace.android.embracesdk.fakes.FakeEventService import io.embrace.android.embracesdk.fakes.FakeGatingService -import io.embrace.android.embracesdk.fakes.FakeInternalErrorService import io.embrace.android.embracesdk.fakes.FakeLogMessageService import io.embrace.android.embracesdk.fakes.FakeMetadataService import io.embrace.android.embracesdk.fakes.FakePerformanceInfoService @@ -21,7 +20,6 @@ import io.embrace.android.embracesdk.fakes.FakeWebViewService import io.embrace.android.embracesdk.fakes.injection.FakeCoreModule import io.embrace.android.embracesdk.fakes.injection.FakeInitModule import io.embrace.android.embracesdk.internal.serialization.EmbraceSerializer -import io.embrace.android.embracesdk.payload.LegacyExceptionError import io.embrace.android.embracesdk.payload.Session import io.embrace.android.embracesdk.payload.SessionMessage import io.embrace.android.embracesdk.session.orchestrator.SessionSnapshotType @@ -58,7 +56,6 @@ internal class V2PayloadMessageCollatorTest { preferencesService = FakePreferenceService(), eventService = FakeEventService(), logMessageService = FakeLogMessageService(), - internalErrorService = FakeInternalErrorService().apply { data = LegacyExceptionError() }, metadataService = FakeMetadataService(), performanceInfoService = FakePerformanceInfoService(), spanRepository = initModule.openTelemetryModule.spanRepository, diff --git a/embrace-android-sdk/src/test/resources/bg_activity_expected.json b/embrace-android-sdk/src/test/resources/bg_activity_expected.json index efc925efa0..9700796e29 100644 --- a/embrace-android-sdk/src/test/resources/bg_activity_expected.json +++ b/embrace-android-sdk/src/test/resources/bg_activity_expected.json @@ -22,10 +22,6 @@ "lic": 1, "lwc": 2, "lec": 3, - "e": { - "c": 0, - "rep": [] - }, "ri": "fake-crash-id", "em": "bs", "sm": "bs", diff --git a/embrace-android-sdk/src/test/resources/session_expected.json b/embrace-android-sdk/src/test/resources/session_expected.json index 5303e08c41..a9c0afe8ad 100644 --- a/embrace-android-sdk/src/test/resources/session_expected.json +++ b/embrace-android-sdk/src/test/resources/session_expected.json @@ -28,10 +28,6 @@ "lic": 1, "lwc": 2, "lec": 3, - "e": { - "c": 0, - "rep": [] - }, "ri": "fake-crash-id", "em": "s", "sm": "s",