diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/IntegrationTestRuleExtensions.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/IntegrationTestRuleExtensions.kt index fa374f1ea..c54b8cc73 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/IntegrationTestRuleExtensions.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/IntegrationTestRuleExtensions.kt @@ -114,6 +114,13 @@ internal fun IntegrationTestRule.Harness.getLastSavedSession(): Envelope? { + return overriddenDeliveryModule.deliveryService.getLastSavedBackgroundActivity() +} + /** * Returns the last session that was sent by the SDK. */ diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/features/SessionPropertiesTest.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/features/SessionPropertiesTest.kt index 9f52fe814..7f2dce28b 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/features/SessionPropertiesTest.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/features/SessionPropertiesTest.kt @@ -3,9 +3,11 @@ package io.embrace.android.embracesdk.features import androidx.test.ext.junit.runners.AndroidJUnit4 import io.embrace.android.embracesdk.IntegrationTestRule import io.embrace.android.embracesdk.findSessionSpan +import io.embrace.android.embracesdk.getLastSavedBackgroundActivity import io.embrace.android.embracesdk.getLastSentBackgroundActivity import io.embrace.android.embracesdk.getSentBackgroundActivities import io.embrace.android.embracesdk.internal.payload.Span +import io.embrace.android.embracesdk.internal.payload.getSessionSpan import io.embrace.android.embracesdk.internal.spans.getSessionProperty import io.embrace.android.embracesdk.recordSession import org.junit.Assert.assertEquals @@ -120,6 +122,23 @@ internal class SessionPropertiesTest { } } + @Test + fun `adding properties in bg activity modifications change the cached payload`() { + with(testRule) { + startSdk() + harness.recordSession() + embrace.addSessionProperty("temp", "value", false) + val bgSnapshot = checkNotNull(harness.getLastSavedBackgroundActivity()) + checkNotNull(bgSnapshot.getSessionSpan()).assertPropertyExistence(exist = listOf("temp")) + + val session = checkNotNull(harness.recordSession()) + checkNotNull(session.getSessionSpan()).assertPropertyExistence(missing = listOf("temp")) + + val bg = checkNotNull(harness.getLastSentBackgroundActivity()) + checkNotNull(bg.getSessionSpan()).assertPropertyExistence(exist = listOf("temp")) + } + } + private fun Span.assertPropertyExistence(exist: List = emptyList(), missing: List = emptyList()) { exist.forEach { assertNotNull(getSessionProperty(it), "Missing session property with key: $it") diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/session/BackgroundActivityDisabledTest.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/session/BackgroundActivityDisabledTest.kt index 3b5200018..e1c35fcbd 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/session/BackgroundActivityDisabledTest.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/session/BackgroundActivityDisabledTest.kt @@ -75,7 +75,7 @@ internal class BackgroundActivityDisabledTest { // Check what should and shouldn't be logged when there is no background activity and the app is in the background assertTrue(embrace.isStarted) assertTrue(embrace.currentSessionId.isNullOrBlank()) - assertTrue(embrace.getDeviceId().isNotBlank()) + assertTrue(embrace.deviceId.isNotBlank()) assertNull(embrace.startSpan("test")) embrace.logError("error") runLoggingThread() diff --git a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/session/BackgroundActivityTest.kt b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/session/BackgroundActivityTest.kt index 74675b4a2..1903765ee 100644 --- a/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/session/BackgroundActivityTest.kt +++ b/embrace-android-sdk/src/integrationTest/kotlin/io/embrace/android/embracesdk/session/BackgroundActivityTest.kt @@ -4,10 +4,10 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import io.embrace.android.embracesdk.IntegrationTestRule import io.embrace.android.embracesdk.findSessionSpan import io.embrace.android.embracesdk.getSentBackgroundActivities -import io.embrace.android.embracesdk.internal.spans.findAttributeValue +import io.embrace.android.embracesdk.getSessionId import io.embrace.android.embracesdk.internal.opentelemetry.embSessionNumber +import io.embrace.android.embracesdk.internal.spans.findAttributeValue import io.embrace.android.embracesdk.recordSession -import io.embrace.android.embracesdk.getSessionId import org.junit.Assert.assertEquals import org.junit.Assert.assertNotEquals import org.junit.Rule diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/SdkStateApi.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/SdkStateApi.kt index 20b194aad..d223d94e6 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/SdkStateApi.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/SdkStateApi.kt @@ -22,7 +22,7 @@ public interface SdkStateApi { */ public fun setAppId(appId: String): Boolean - public fun getDeviceId(): String + public val deviceId: String public val currentSessionId: String? diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/SdkStateApiDelegate.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/SdkStateApiDelegate.kt index e67d4089e..ca8c72071 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/SdkStateApiDelegate.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/SdkStateApiDelegate.kt @@ -62,13 +62,14 @@ internal class SdkStateApiDelegate( return true } - override fun getDeviceId(): String = when { - sdkCallChecker.check("get_device_id") -> - preferencesService?.deviceIdentifier - ?: "" - - else -> "" - } + override val deviceId: String + get() { + return if (sdkCallChecker.check("get_device_id")) { + preferencesService?.deviceIdentifier ?: "" + } else { + "" + } + } override val currentSessionId: String? get() { diff --git a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/SessionApiDelegate.kt b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/SessionApiDelegate.kt index 1a6df91f2..d088bfc7a 100644 --- a/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/SessionApiDelegate.kt +++ b/embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/SessionApiDelegate.kt @@ -21,7 +21,10 @@ internal class SessionApiDelegate( */ override fun addSessionProperty(key: String, value: String, permanent: Boolean): Boolean { if (sdkCallChecker.check("add_session_property")) { - return sessionPropertiesService?.addProperty(key, value, permanent) ?: false + return sessionPropertiesService?.addProperty(key, value, permanent) + .apply { + sessionOrchestrator?.reportBackgroundActivityStateChange() + } ?: false } return false } @@ -31,7 +34,9 @@ internal class SessionApiDelegate( */ override fun removeSessionProperty(key: String): Boolean { if (sdkCallChecker.check("remove_session_property")) { - return sessionPropertiesService?.removeProperty(key) ?: false + return sessionPropertiesService?.removeProperty(key).apply { + sessionOrchestrator?.reportBackgroundActivityStateChange() + } ?: false } return false } diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/api/delegate/SdkStateApiDelegateTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/api/delegate/SdkStateApiDelegateTest.kt index d08afc033..ec08e5b77 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/api/delegate/SdkStateApiDelegateTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/api/delegate/SdkStateApiDelegateTest.kt @@ -59,7 +59,14 @@ internal class SdkStateApiDelegateTest { @Test fun getDeviceId() { preferencesService.deviceIdentifier = "foo" - assertEquals("foo", delegate.getDeviceId()) + assertEquals("foo", delegate.deviceId) + } + + @Test + fun `device ID not returned SDK is not enabled`() { + preferencesService.deviceIdentifier = "foo" + sdkCallChecker.started.set(false) + assertEquals("", delegate.deviceId) } @Test diff --git a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/api/delegate/SessionApiDelegateTest.kt b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/api/delegate/SessionApiDelegateTest.kt index 7e730b7a0..dfe3853e8 100644 --- a/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/api/delegate/SessionApiDelegateTest.kt +++ b/embrace-android-sdk/src/test/java/io/embrace/android/embracesdk/internal/api/delegate/SessionApiDelegateTest.kt @@ -9,6 +9,7 @@ import io.embrace.android.embracesdk.fakes.FakeTelemetryService import io.embrace.android.embracesdk.fakes.fakeModuleInitBootstrapper import io.embrace.android.embracesdk.internal.payload.AppFramework import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse import org.junit.Assert.assertNull import org.junit.Before import org.junit.Test @@ -19,6 +20,7 @@ internal class SessionApiDelegateTest { private lateinit var delegate: SessionApiDelegate private lateinit var orchestrator: FakeSessionOrchestrator + private lateinit var sdkCallChecker: SdkCallChecker private lateinit var sessionPropertiesService: FakeSessionPropertiesService @Before @@ -27,16 +29,26 @@ internal class SessionApiDelegateTest { moduleInitBootstrapper.init(ApplicationProvider.getApplicationContext(), AppFramework.NATIVE, 0) orchestrator = moduleInitBootstrapper.sessionOrchestrationModule.sessionOrchestrator as FakeSessionOrchestrator sessionPropertiesService = moduleInitBootstrapper.essentialServiceModule.sessionPropertiesService as FakeSessionPropertiesService - - val sdkCallChecker = SdkCallChecker(FakeEmbLogger(), FakeTelemetryService()) + sdkCallChecker = SdkCallChecker(FakeEmbLogger(), FakeTelemetryService()) sdkCallChecker.started.set(true) delegate = SessionApiDelegate(moduleInitBootstrapper, sdkCallChecker) } + @Test + fun `cannot modify session properties when SDK is not enabled`() { + sdkCallChecker.started.set(false) + assertFalse(delegate.addSessionProperty("test", "value", false)) + assertFalse(delegate.removeSessionProperty("test")) + assertEquals(0, orchestrator.stateChangeCount) + delegate.endSession() + assertEquals(0, orchestrator.manualEndCount) + } + @Test fun `add session property`() { delegate.addSessionProperty("test", "value", false) assertEquals("value", sessionPropertiesService.props["test"]) + assertEquals(1, orchestrator.stateChangeCount) } @Test @@ -44,12 +56,15 @@ internal class SessionApiDelegateTest { delegate.addSessionProperty("test", "value", false) delegate.removeSessionProperty("test") assertNull(sessionPropertiesService.props["test"]) + assertEquals(2, orchestrator.stateChangeCount) } + @Suppress("DEPRECATION") @Test fun `get session properties`() { sessionPropertiesService.props["key"] = "value" assertEquals(mapOf("key" to "value"), delegate.getSessionProperties()) + assertEquals(0, orchestrator.stateChangeCount) } @Test