Code clarity: use withTimeout with combination of runCatching instead of withTimeoutOrNull

This commit is contained in:
Benoit Marty 2024-04-02 16:40:07 +02:00 committed by Benoit Marty
parent 8971a6c0fb
commit 5a97d322c4
2 changed files with 41 additions and 33 deletions

View file

@ -29,7 +29,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withTimeoutOrNull import kotlinx.coroutines.withTimeout
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
@ -72,22 +72,26 @@ class NotificationTest @Inject constructor(
notificationClickHandler.state.first() notificationClickHandler.state.first()
Timber.d("Notification clicked!") Timber.d("Notification clicked!")
} }
val s = withTimeoutOrNull(30.seconds) { runCatching {
withTimeout(30.seconds) {
job.join() job.join()
} }
}.fold(
onSuccess = {
delegate.updateState(
description = stringProvider.getString(R.string.troubleshoot_notifications_test_display_notification_success),
status = NotificationTroubleshootTestState.Status.Success
)
},
onFailure = {
job.cancel() job.cancel()
if (s == null) {
notificationDisplayer.dismissDiagnosticNotification() notificationDisplayer.dismissDiagnosticNotification()
delegate.updateState( delegate.updateState(
description = stringProvider.getString(R.string.troubleshoot_notifications_test_display_notification_failure), description = stringProvider.getString(R.string.troubleshoot_notifications_test_display_notification_failure),
status = NotificationTroubleshootTestState.Status.Failure(false) status = NotificationTroubleshootTestState.Status.Failure(false)
) )
} else {
delegate.updateState(
description = stringProvider.getString(R.string.troubleshoot_notifications_test_display_notification_success),
status = NotificationTroubleshootTestState.Status.Success
)
} }
)
}.invokeOnCompletion { }.invokeOnCompletion {
// Ensure that the notification is cancelled when the screen is left // Ensure that the notification is cancelled when the screen is left
notificationDisplayer.dismissDiagnosticNotification() notificationDisplayer.dismissDiagnosticNotification()

View file

@ -31,7 +31,7 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.withTimeoutOrNull import kotlinx.coroutines.withTimeout
import timber.log.Timber import timber.log.Timber
import javax.inject.Inject import javax.inject.Inject
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds
@ -84,21 +84,25 @@ class PushLoopbackTest @Inject constructor(
job.cancel() job.cancel()
return return
} }
val result = withTimeoutOrNull(10.seconds) { runCatching {
withTimeout(10.seconds) {
completable.await() completable.await()
} }
}.fold(
onSuccess = { duration ->
delegate.updateState(
description = stringProvider.getString(R.string.troubleshoot_notifications_test_push_loop_back_success, duration),
status = NotificationTroubleshootTestState.Status.Success
)
},
onFailure = {
job.cancel() job.cancel()
if (result == null) {
delegate.updateState( delegate.updateState(
description = stringProvider.getString(R.string.troubleshoot_notifications_test_push_loop_back_failure_4), description = stringProvider.getString(R.string.troubleshoot_notifications_test_push_loop_back_failure_4),
status = NotificationTroubleshootTestState.Status.Failure(false) status = NotificationTroubleshootTestState.Status.Failure(false)
) )
} else {
delegate.updateState(
description = stringProvider.getString(R.string.troubleshoot_notifications_test_push_loop_back_success, result),
status = NotificationTroubleshootTestState.Status.Success
)
} }
)
} }
override suspend fun reset() = delegate.reset() override suspend fun reset() = delegate.reset()