Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extract session ordinal logic to preference service #81

Merged
merged 1 commit into from
Nov 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -226,9 +226,11 @@ internal class EmbracePreferencesService(
get() = prefs.getBooleanPreference(LAST_USER_MESSAGE_FAILED_KEY, false)
set(value) = prefs.setBooleanPreference(LAST_USER_MESSAGE_FAILED_KEY, value)

override var sessionNumber: Int
get() = prefs.getIntegerPreference(LAST_SESSION_NUMBER_KEY) ?: 0
set(value) = prefs.setIntegerPreference(LAST_SESSION_NUMBER_KEY, value)
override fun getIncrementAndGetSessionNumber(): Int {
val sessionNumber = (prefs.getIntegerPreference(LAST_SESSION_NUMBER_KEY) ?: 0) + 1
prefs.setIntegerPreference(LAST_SESSION_NUMBER_KEY, sessionNumber)
return sessionNumber
}

override var javaScriptBundleURL: String?
get() = prefs.getStringPreference(JAVA_SCRIPT_BUNDLE_URL_KEY)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,9 +84,11 @@ internal interface PreferencesService {
var userMessageNeedsRetry: Boolean

/**
* Last session number. Increments by one.
* Increments and returns the session number ordinal. This is an integer that increments
* at the start of every session. This allows us to check the % of sessions that didn't get
* delivered to the backend.
*/
var sessionNumber: Int
fun getIncrementAndGetSessionNumber(): Int

/**
* Last javaScript bundle string url.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ internal class SessionHandler(
coldStart,
startType,
startTime,
incrementAndGetSessionNumber(),
preferencesService.getIncrementAndGetSessionNumber(),
userService.loadUserInfoFromDisk(),
sessionProperties.get()
)
Expand Down Expand Up @@ -354,15 +354,6 @@ internal class SessionHandler(
return fullEndSessionMessage
}

/**
* @return session number incremented by 1
*/
private fun incrementAndGetSessionNumber(): Int {
val sessionNumber = preferencesService.sessionNumber + 1
preferencesService.sessionNumber = sessionNumber
return sessionNumber
}

/**
* It starts a background job that will schedule a callback to automatically end the session.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ internal class FakePreferenceService(
@Deprecated("") override var customPersonas: Set<String>? = null,
override var lastConfigFetchDate: Long? = null,
override var userMessageNeedsRetry: Boolean = false,
override var sessionNumber: Int = 0,
override var reactNativeVersionNumber: String? = null,
override var unityVersionNumber: String? = null,
override var unityBuildIdNumber: String? = null,
Expand All @@ -34,7 +33,8 @@ internal class FakePreferenceService(
override var jailbroken: Boolean? = null,
override var applicationExitInfoHistory: Set<String>? = null,
override var cpuName: String? = null,
override var egl: String? = null
override var egl: String? = null,
val sessionNumber: () -> Int = { 0 }
) : PreferencesService {

var networkCaptureRuleOver = false
Expand All @@ -47,5 +47,7 @@ internal class FakePreferenceService(
override fun decreaseNetworkCaptureRuleRemainingCount(id: String, maxCount: Int) {
}

override fun getIncrementAndGetSessionNumber(): Int = sessionNumber()

override fun isUsersFirstDay(): Boolean = firstDay
}
Original file line number Diff line number Diff line change
Expand Up @@ -188,13 +188,10 @@ internal class EmbracePreferencesServiceTest {

@Test
fun `test session number is saved`() {
assertEquals(0, service.sessionNumber)

service.sessionNumber = 1234
assertEquals(1234, service.sessionNumber)

service.sessionNumber = -1
assertEquals(0, service.sessionNumber)
assertEquals(1, service.getIncrementAndGetSessionNumber())
assertEquals(2, service.getIncrementAndGetSessionNumber())
assertEquals(3, service.getIncrementAndGetSessionNumber())
assertEquals(4, service.getIncrementAndGetSessionNumber())
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import io.embrace.android.embracesdk.fakes.FakeAndroidMetadataService
import io.embrace.android.embracesdk.fakes.FakeClock
import io.embrace.android.embracesdk.fakes.FakeConfigService
import io.embrace.android.embracesdk.fakes.FakeGatingService
import io.embrace.android.embracesdk.fakes.FakePreferenceService
import io.embrace.android.embracesdk.fakes.FakeUserService
import io.embrace.android.embracesdk.fakes.fakeAutoDataCaptureBehavior
import io.embrace.android.embracesdk.fakes.fakeDataCaptureEventBehavior
Expand All @@ -36,6 +35,7 @@ import io.embrace.android.embracesdk.ndk.NdkService
import io.embrace.android.embracesdk.payload.Session
import io.embrace.android.embracesdk.payload.SessionMessage
import io.embrace.android.embracesdk.payload.UserInfo
import io.embrace.android.embracesdk.prefs.PreferencesService
import io.embrace.android.embracesdk.session.EmbraceSessionService.Companion.SESSION_CACHING_INTERVAL
import io.embrace.android.embracesdk.session.properties.EmbraceSessionProperties
import io.mockk.Called
Expand Down Expand Up @@ -66,7 +66,7 @@ internal class SessionHandlerTest {

companion object {
private val logger: InternalEmbraceLogger = InternalEmbraceLogger()
private val preferencesService: FakePreferenceService = FakePreferenceService()
private val preferencesService: PreferencesService = mockk(relaxed = true)
private val mockUserService: FakeUserService = FakeUserService()
private val mockNetworkConnectivityService: NetworkConnectivityService =
mockk(relaxUnitFun = true)
Expand All @@ -86,7 +86,7 @@ internal class SessionHandlerTest {
private val mockSessionPeriodicCacheExecutorService: ScheduledExecutorService = mockk(relaxed = true)
private const val sessionUuid = "99fcae22-0db5-4b63-b49d-315eecce4889"
private const val now = 123L
private const val sessionNumber = 5
private var sessionNumber = 5
private val mockSessionProperties: EmbraceSessionProperties = mockk(relaxed = true)
private val emptyMapSessionProperties: Map<String, String> = emptyMap()
private val mockUserInfo: UserInfo = mockk()
Expand Down Expand Up @@ -123,7 +123,6 @@ internal class SessionHandlerTest {
@Before
fun before() {
mockActiveSession = mockk(relaxed = true)
preferencesService.sessionNumber = sessionNumber
every { mockSessionProperties.get() } returns emptyMapSessionProperties

metadataService = FakeAndroidMetadataService()
Expand Down Expand Up @@ -238,7 +237,6 @@ internal class SessionHandlerTest {
with(checkNotNull(sessionMessage?.session)) {
assertEquals(sessionUuid, this.sessionId)
assertEquals(startTime, now)
assertEquals(sessionNumber + 1, number)
assertTrue(isColdStart)
assertEquals(sessionStartType, startType)
assertEquals(emptyMapSessionProperties, properties)
Expand All @@ -251,6 +249,7 @@ internal class SessionHandlerTest {
assertEquals(metadataService.getDeviceInfo(), deviceInfo)
assertEquals(metadataService.getAppInfo(), appInfo)
}
verify(exactly = 1) { preferencesService.getIncrementAndGetSessionNumber() }
}

@Test
Expand Down Expand Up @@ -280,7 +279,7 @@ internal class SessionHandlerTest {
@Test
fun `onSession started successfully with no preference service session number`() {
// return absent session number
preferencesService.sessionNumber = 0
sessionNumber = 0
sessionLocalConfig = SessionLocalConfig(maxSessionSeconds = 5, asyncEnd = false)
every { mockBreadcrumbService.getLastViewBreadcrumbScreenName() } returns "screen"
val sessionStartType = Session.SessionLifeEventType.STATE
Expand All @@ -295,7 +294,7 @@ internal class SessionHandlerTest {
mockPeriodicCachingRunnable
)

assertEquals(1, preferencesService.sessionNumber)
verify(exactly = 1) { preferencesService.getIncrementAndGetSessionNumber() }
assertNotNull(sessionMessage)
assertNotNull(sessionMessage!!.session)
// no need to verify anything else because it's already verified in another test case
Expand Down