Skip to content

Commit

Permalink
refactor: extract session api to delegate
Browse files Browse the repository at this point in the history
  • Loading branch information
fractalwrench committed May 17, 2024
1 parent ea0eca8 commit 88dceb2
Show file tree
Hide file tree
Showing 5 changed files with 135 additions and 45 deletions.
2 changes: 1 addition & 1 deletion embrace-android-sdk/config/detekt/baseline.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@
<ID>DataClassShouldBeImmutable:LegacyExceptionError.kt$LegacyExceptionError$@Json(name = "c") var occurrences: Int = 0</ID>
<ID>DataClassShouldBeImmutable:LegacyExceptionError.kt$LegacyExceptionError$@Json(name = "rep") var exceptionErrors: MutableList&lt;LegacyExceptionErrorInfo&gt; = mutableListOf()</ID>
<ID>LongParameterList:FakeModuleInitBootstrapper.kt$( fakeEmbLogger: FakeEmbLogger = FakeEmbLogger(), fakeInitModule: FakeInitModule = FakeInitModule(), fakeOpenTelemetryModule: FakeOpenTelemetryModule = FakeOpenTelemetryModule(), coreModuleSupplier: CoreModuleSupplier = { _, _, _ -&gt; FakeCoreModule() }, systemServiceModuleSupplier: SystemServiceModuleSupplier = { _, _ -&gt; FakeSystemServiceModule() }, androidServicesModuleSupplier: AndroidServicesModuleSupplier = { _, _, _ -&gt; FakeAndroidServicesModule() }, workerThreadModuleSupplier: WorkerThreadModuleSupplier = { _ -&gt; FakeWorkerThreadModule() }, storageModuleSupplier: StorageModuleSupplier = { _, _, _ -&gt; FakeStorageModule() }, essentialServiceModuleSupplier: EssentialServiceModuleSupplier = { _, _, _, _, _, _, _, _, _, _ -&gt; FakeEssentialServiceModule() }, dataSourceModuleSupplier: DataSourceModuleSupplier = { _, _, _, _, _, _, _, _ -&gt; FakeDataSourceModule() }, dataCaptureServiceModuleSupplier: DataCaptureServiceModuleSupplier = { _, _, _, _, _, _, _ -&gt; FakeDataCaptureServiceModule() }, deliveryModuleSupplier: DeliveryModuleSupplier = { _, _, _, _, _ -&gt; FakeDeliveryModule() }, anrModuleSupplier: AnrModuleSupplier = { _, _, _, _ -&gt; FakeAnrModule() }, customerLogModuleSupplier: CustomerLogModuleSupplier = { _, _, _, _, _, _, _, _ -&gt; FakeCustomerLogModule() }, nativeModuleSupplier: NativeModuleSupplier = { _, _, _, _, _, _, _ -&gt; FakeNativeModule() }, dataContainerModuleSupplier: DataContainerModuleSupplier = { _, _, _, _, _ -&gt; FakeDataContainerModule() }, sessionModuleSupplier: SessionModuleSupplier = { _, _, _, _, _, _, _, _, _, _, _, _, _ -&gt; FakeSessionModule() }, crashModuleSupplier: CrashModuleSupplier = { _, _, _, _, _, _, _, _, _, _, _ -&gt; FakeCrashModule() }, payloadModuleSupplier: PayloadModuleSupplier = { _, _, _, _, _, _, _, _, _ -&gt; FakePayloadModule() } )</ID>
<ID>TooManyFunctions:EmbraceImpl.kt$EmbraceImpl : UserApi</ID>
<ID>TooManyFunctions:EmbraceImpl.kt$EmbraceImpl : UserApiSessionApi</ID>
</CurrentIssues>
</SmellBaseline>
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import io.embrace.android.embracesdk.internal.IdGenerator.Companion.generateW3CT
import io.embrace.android.embracesdk.internal.Systrace.endSynchronous
import io.embrace.android.embracesdk.internal.Systrace.startSynchronous
import io.embrace.android.embracesdk.internal.api.delegate.SdkCallChecker
import io.embrace.android.embracesdk.internal.api.delegate.SessionApiDelegate
import io.embrace.android.embracesdk.internal.api.delegate.UserApiDelegate
import io.embrace.android.embracesdk.internal.spans.EmbraceTracer
import io.embrace.android.embracesdk.internal.utils.getSafeStackTrace
Expand All @@ -45,8 +46,9 @@ internal class EmbraceImpl @JvmOverloads constructor(
private val bootstrapper: ModuleInitBootstrapper = ModuleInitBootstrapper(),
private val sdkCallChecker: SdkCallChecker =
SdkCallChecker(bootstrapper.initModule.logger, bootstrapper.initModule.telemetryService),
private val userApiDelegate: UserApiDelegate = UserApiDelegate(bootstrapper, sdkCallChecker)
) : UserApi by userApiDelegate {
private val userApiDelegate: UserApiDelegate = UserApiDelegate(bootstrapper, sdkCallChecker),
private val sessionApiDelegate: SessionApiDelegate = SessionApiDelegate(bootstrapper, sdkCallChecker)
) : UserApi by userApiDelegate, SessionApi by sessionApiDelegate {

@JvmField
val tracer: EmbraceTracer = bootstrapper.openTelemetryModule.embraceTracer
Expand Down Expand Up @@ -329,33 +331,6 @@ internal class EmbraceImpl @JvmOverloads constructor(
}
}

/**
* Adds a property to the current session.
*/
fun addSessionProperty(key: String, value: String, permanent: Boolean): Boolean {
if (sdkCallChecker.check("add_session_property")) {
return sessionPropertiesService?.addProperty(key, value, permanent) ?: false
}
return false
}

/**
* Removes a property from the current session.
*/
fun removeSessionProperty(key: String): Boolean {
if (sdkCallChecker.check("remove_session_property")) {
return sessionPropertiesService?.removeProperty(key) ?: false
}
return false
}

fun getSessionProperties(): Map<String, String>? {
if (sdkCallChecker.check("get_session_properties")) {
return sessionPropertiesService?.getProperties()
}
return null
}

/**
* Starts a 'moment'. Moments are used for encapsulating particular activities within
* the app, such as a user adding an item to their shopping cart.
Expand Down Expand Up @@ -555,18 +530,6 @@ internal class EmbraceImpl @JvmOverloads constructor(
}
}

/**
* Ends the current session and starts a new one.
*
*
* Cleans all the user info on the device.
*/
fun endSession(clearUserInfo: Boolean) {
if (sdkCallChecker.check("end_session")) {
sessionOrchestrator?.endSessionWithManual(clearUserInfo)
}
}

fun getDeviceId(): String = when {
sdkCallChecker.check("get_device_id") ->
preferencesService?.deviceIdentifier
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package io.embrace.android.embracesdk.internal.api.delegate

import io.embrace.android.embracesdk.SessionApi
import io.embrace.android.embracesdk.injection.ModuleInitBootstrapper
import io.embrace.android.embracesdk.injection.embraceImplInject

internal class SessionApiDelegate(
bootstrapper: ModuleInitBootstrapper,
private val sdkCallChecker: SdkCallChecker
) : SessionApi {

private val sessionPropertiesService by embraceImplInject(sdkCallChecker) {
bootstrapper.sessionModule.sessionPropertiesService
}
private val sessionOrchestrator by embraceImplInject(sdkCallChecker) { bootstrapper.sessionModule.sessionOrchestrator }

/**
* Adds a property to the current session.
*/
override fun addSessionProperty(key: String, value: String, permanent: Boolean): Boolean {
if (sdkCallChecker.check("add_session_property")) {
return sessionPropertiesService?.addProperty(key, value, permanent) ?: false
}
return false

Check warning on line 24 in embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/SessionApiDelegate.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/SessionApiDelegate.kt#L24

Added line #L24 was not covered by tests
}

/**
* Removes a property from the current session.
*/
override fun removeSessionProperty(key: String): Boolean {
if (sdkCallChecker.check("remove_session_property")) {
return sessionPropertiesService?.removeProperty(key) ?: false
}
return false

Check warning on line 34 in embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/SessionApiDelegate.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/SessionApiDelegate.kt#L34

Added line #L34 was not covered by tests
}

override fun getSessionProperties(): Map<String, String>? {
if (sdkCallChecker.check("get_session_properties")) {
return sessionPropertiesService?.getProperties()
}
return null

Check warning on line 41 in embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/SessionApiDelegate.kt

View check run for this annotation

Codecov / codecov/patch

embrace-android-sdk/src/main/java/io/embrace/android/embracesdk/internal/api/delegate/SessionApiDelegate.kt#L41

Added line #L41 was not covered by tests
}

override fun endSession() = endSession(false)

/**
* Ends the current session and starts a new one.
*
* Cleans all the user info on the device.
*/
override fun endSession(clearUserInfo: Boolean) {
if (sdkCallChecker.check("end_session")) {
sessionOrchestrator?.endSessionWithManual(clearUserInfo)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,20 @@ package io.embrace.android.embracesdk
import io.embrace.android.embracesdk.session.properties.SessionPropertiesService

internal class FakeSessionPropertiesService : SessionPropertiesService {

var props: MutableMap<String, String> = mutableMapOf()

override fun addProperty(originalKey: String, originalValue: String, permanent: Boolean): Boolean {
TODO("Not yet implemented")
props[originalKey] = originalValue
return true
}

override fun removeProperty(originalKey: String): Boolean {
TODO("Not yet implemented")
props.remove(originalKey)
return true
}

override fun getProperties(): Map<String, String> = emptyMap()
override fun getProperties(): Map<String, String> = props

override fun populateCurrentSession(): Boolean = true
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package io.embrace.android.embracesdk.internal.api.delegate

import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import io.embrace.android.embracesdk.Embrace
import io.embrace.android.embracesdk.FakeSessionPropertiesService
import io.embrace.android.embracesdk.fakes.FakeEmbLogger
import io.embrace.android.embracesdk.fakes.FakeSessionOrchestrator
import io.embrace.android.embracesdk.fakes.FakeTelemetryService
import io.embrace.android.embracesdk.fakes.fakeModuleInitBootstrapper
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith

@RunWith(AndroidJUnit4::class)
internal class SessionApiDelegateTest {

private lateinit var delegate: SessionApiDelegate
private lateinit var orchestrator: FakeSessionOrchestrator
private lateinit var sessionPropertiesService: FakeSessionPropertiesService

@Before
fun setUp() {
val moduleInitBootstrapper = fakeModuleInitBootstrapper()
moduleInitBootstrapper.init(ApplicationProvider.getApplicationContext(), Embrace.AppFramework.NATIVE, 0)
orchestrator = moduleInitBootstrapper.sessionModule.sessionOrchestrator as FakeSessionOrchestrator
sessionPropertiesService = moduleInitBootstrapper.sessionModule.sessionPropertiesService as FakeSessionPropertiesService

val sdkCallChecker = SdkCallChecker(FakeEmbLogger(), FakeTelemetryService())
sdkCallChecker.started.set(true)
delegate = SessionApiDelegate(moduleInitBootstrapper, sdkCallChecker)
}

@Test
fun `add session property`() {
delegate.addSessionProperty("test", "value", false)
assertEquals("value", sessionPropertiesService.props["test"])
}

@Test
fun `remove session property`() {
delegate.addSessionProperty("test", "value", false)
delegate.removeSessionProperty("test")
assertNull(sessionPropertiesService.props["test"])
}

@Test
fun `get session properties`() {
sessionPropertiesService.props["key"] = "value"
assertEquals(mapOf("key" to "value"), delegate.getSessionProperties())
}

@Test
fun `end session`() {
delegate.endSession()
assertEquals(1, orchestrator.manualEndCount)
}

@Test
fun `end session clear user info`() {
delegate.endSession(true)
assertEquals(1, orchestrator.manualEndCount)
}
}

0 comments on commit 88dceb2

Please sign in to comment.