Coverage Summary for Class: InAppFailureTrackerImpl (cloud.mindbox.mobile_sdk.inapp.data.managers)
| Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| InAppFailureTrackerImpl |
100%
(8/8)
|
100%
(12/12)
|
100%
(35/35)
|
100%
(129/129)
|
| InAppFailureTrackerImpl$Companion |
|
| Total |
100%
(8/8)
|
100%
(12/12)
|
100%
(35/35)
|
100%
(129/129)
|
package cloud.mindbox.mobile_sdk.inapp.data.managers
import cloud.mindbox.mobile_sdk.convertToString
import cloud.mindbox.mobile_sdk.convertToZonedDateTimeAtUTC
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.FeatureToggleManager
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.managers.InAppFailureTracker
import cloud.mindbox.mobile_sdk.inapp.domain.interfaces.repositories.InAppRepository
import cloud.mindbox.mobile_sdk.logger.mindboxLogI
import cloud.mindbox.mobile_sdk.models.operation.request.FailureReason
import cloud.mindbox.mobile_sdk.models.operation.request.InAppShowFailure
import cloud.mindbox.mobile_sdk.utils.TimeProvider
import org.threeten.bp.Instant
import java.util.concurrent.CopyOnWriteArrayList
internal class InAppFailureTrackerImpl(
private val timeProvider: TimeProvider,
private val inAppRepository: InAppRepository,
private val featureToggleManager: FeatureToggleManager
) : InAppFailureTracker {
private val failures = CopyOnWriteArrayList<InAppShowFailure>()
private fun trackFailure(failure: InAppShowFailure) {
if (failures.none { it.inAppId == failure.inAppId }) {
failures.add(failure)
}
}
private fun sendFailures() {
if (failures.isEmpty()) return
if (!featureToggleManager.isEnabled(SEND_INAPP_SHOW_ERROR_FEATURE)) {
mindboxLogI("Feature $SEND_INAPP_SHOW_ERROR_FEATURE is off. Skip send failures")
return
}
inAppRepository.sendInAppShowFailure(failures.toList())
failures.clear()
}
private fun sendSingleFailure(failure: InAppShowFailure) {
if (!featureToggleManager.isEnabled(SEND_INAPP_SHOW_ERROR_FEATURE)) {
mindboxLogI("Feature $SEND_INAPP_SHOW_ERROR_FEATURE is off. Skip send failure")
return
}
inAppRepository.sendInAppShowFailure(listOf(failure))
}
override fun sendFailure(inAppId: String, failureReason: FailureReason, errorDetails: String?) {
val timestamp = Instant.ofEpochMilli(timeProvider.currentTimeMillis())
.convertToZonedDateTimeAtUTC()
.convertToString()
sendSingleFailure(
failure = InAppShowFailure(
inAppId = inAppId,
failureReason = failureReason,
errorDetails = errorDetails?.take(COUNT_OF_CHARS_IN_ERROR_DETAILS),
dateTimeUtc = timestamp
)
)
}
override fun collectFailure(inAppId: String, failureReason: FailureReason, errorDetails: String?) {
val timestamp = Instant.ofEpochMilli(timeProvider.currentTimeMillis())
.convertToZonedDateTimeAtUTC()
.convertToString()
trackFailure(
InAppShowFailure(
inAppId = inAppId,
failureReason = failureReason,
errorDetails = errorDetails?.take(COUNT_OF_CHARS_IN_ERROR_DETAILS),
dateTimeUtc = timestamp
)
)
}
override fun sendCollectedFailures() {
sendFailures()
}
override fun clearFailures() {
failures.clear()
}
companion object {
private const val COUNT_OF_CHARS_IN_ERROR_DETAILS = 1000
}
}