fix(telemetry): Fix FK exception for TelemetryManager enqueue.

This commit is contained in:
dkadrikj 2024-03-13 13:32:31 +01:00 committed by Dino Kadrikj
parent fedf620cce
commit 365224cb79
3 changed files with 35 additions and 11 deletions

View File

@ -25,8 +25,8 @@ plugins {
}
protonCoverage {
branchCoveragePercentage.set(87)
lineCoveragePercentage.set(93)
branchCoveragePercentage.set(90)
lineCoveragePercentage.set(95)
}
publishOption.shouldBePublishedAsLib = true

View File

@ -18,6 +18,7 @@
package me.proton.core.telemetry.domain
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import me.proton.core.domain.entity.UserId
import me.proton.core.telemetry.domain.entity.TelemetryEvent
@ -26,6 +27,7 @@ import me.proton.core.telemetry.domain.repository.TelemetryRepository
import me.proton.core.telemetry.domain.usecase.IsTelemetryEnabled
import me.proton.core.util.kotlin.CoreLogger
import me.proton.core.util.kotlin.CoroutineScopeProvider
import org.jetbrains.annotations.VisibleForTesting
import javax.inject.Inject
import kotlin.time.Duration.Companion.hours
import kotlin.time.Duration.Companion.seconds
@ -52,21 +54,26 @@ public class TelemetryManager @Inject internal constructor(
}
}
private suspend fun enqueueEvent(
@VisibleForTesting
internal suspend fun enqueueEvent(
userId: UserId?,
event: TelemetryEvent,
priority: TelemetryPriority = TelemetryPriority.Default
) {
CoreLogger.d(LogTag.ENQUEUE, "$event")
if (isTelemetryEnabled(userId)) {
repository.addEvent(userId, event)
when (priority) {
TelemetryPriority.Immediate -> workerManager.enqueueAndReplace(userId, MIN_DELAY)
TelemetryPriority.Default -> workerManager.enqueueOrKeep(userId, MAX_DELAY)
runCatching {
if (isTelemetryEnabled(userId)) {
repository.addEvent(userId, event)
when (priority) {
TelemetryPriority.Immediate -> workerManager.enqueueAndReplace(userId, MIN_DELAY)
TelemetryPriority.Default -> workerManager.enqueueOrKeep(userId, MAX_DELAY)
}
} else {
workerManager.cancel(userId)
repository.deleteAllEvents(userId)
}
} else {
workerManager.cancel(userId)
repository.deleteAllEvents(userId)
}.onFailure {
CoreLogger.e(LogTag.ENQUEUE, it)
}
}

View File

@ -89,4 +89,21 @@ class TelemetryManagerTest {
coVerify(exactly = 1) { telemetryRepository.addEvent(userId, event) }
verify(exactly = 1) { workerManager.enqueueOrKeep(userId, TelemetryManager.MAX_DELAY) }
}
@Test
fun sendExceptionHappened() = runTest {
coEvery { isTelemetryEnabled(userId) } returns true
val event = TelemetryEvent(group = "group", name = "first")
coEvery { telemetryRepository.addEvent(userId, event) } throws Exception("Test")
// WHEN
tested.enqueueEvent(userId, event)
// THEN
coVerify(exactly = 0) { telemetryRepository.deleteAllEvents(userId) }
verify(exactly = 0) { workerManager.cancel(userId) }
coVerify(exactly = 1) { telemetryRepository.addEvent(userId, event) }
verify(exactly = 0) { workerManager.enqueueOrKeep(userId, TelemetryManager.MAX_DELAY) }
}
}