From 90581125a395c8d9136049d65499bfdce92b2e0d Mon Sep 17 00:00:00 2001 From: Matthias Urhahn <matthias.urhahn@sap.com> Date: Wed, 28 Apr 2021 19:06:01 +0200 Subject: [PATCH] For data consistency, the test repo processes actions sequentially. (#2999) If we have a blocking operations (network refresh), the UI could queue up multiple test removals. The first one would work, the following would throw an exception. We should handle this silently for users of `SubmissionRepository` Co-authored-by: I502720 <axel.herbstreith@sap.com> --- .../coronatest/CoronaTestRepository.kt | 5 +++-- .../errors/CoronaTestNotFoundException.kt | 5 +++++ .../submission/SubmissionRepository.kt | 13 ++++++++++--- 3 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/errors/CoronaTestNotFoundException.kt diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/CoronaTestRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/CoronaTestRepository.kt index 2921477f4..3e35ebfa0 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/CoronaTestRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/CoronaTestRepository.kt @@ -2,6 +2,7 @@ package de.rki.coronawarnapp.coronatest import androidx.annotation.VisibleForTesting import de.rki.coronawarnapp.bugreporting.reportProblem +import de.rki.coronawarnapp.coronatest.errors.CoronaTestNotFoundException import de.rki.coronawarnapp.coronatest.migration.PCRTestMigration import de.rki.coronawarnapp.coronatest.qrcode.CoronaTestGUID import de.rki.coronawarnapp.coronatest.qrcode.CoronaTestQRCode @@ -123,7 +124,7 @@ class CoronaTestRepository @Inject constructor( internalData.updateBlocking { val toBeRemoved = values.singleOrNull { it.identifier == identifier } - ?: throw IllegalArgumentException("No found for $identifier") + ?: throw CoronaTestNotFoundException("No found for $identifier") getProcessor(toBeRemoved.type).onRemove(toBeRemoved) @@ -236,7 +237,7 @@ class CoronaTestRepository @Inject constructor( ) { internalData.updateBlocking { val original = values.singleOrNull { it.identifier == identifier } - ?: throw IllegalArgumentException("No found for $identifier") + ?: throw CoronaTestNotFoundException("No test found for $identifier") val processor = getProcessor(original.type) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/errors/CoronaTestNotFoundException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/errors/CoronaTestNotFoundException.kt new file mode 100644 index 000000000..5b0b92c11 --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/coronatest/errors/CoronaTestNotFoundException.kt @@ -0,0 +1,5 @@ +package de.rki.coronawarnapp.coronatest.errors + +class CoronaTestNotFoundException( + message: String +) : IllegalArgumentException(message) diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/SubmissionRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/SubmissionRepository.kt index 7e621ecff..70549aee1 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/SubmissionRepository.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/submission/SubmissionRepository.kt @@ -2,6 +2,7 @@ package de.rki.coronawarnapp.submission import de.rki.coronawarnapp.coronatest.CoronaTestRepository import de.rki.coronawarnapp.coronatest.TestRegistrationRequest +import de.rki.coronawarnapp.coronatest.errors.CoronaTestNotFoundException import de.rki.coronawarnapp.coronatest.server.CoronaTestResult import de.rki.coronawarnapp.coronatest.type.CoronaTest import de.rki.coronawarnapp.coronatest.type.pcr.PCRCoronaTest @@ -101,9 +102,15 @@ class SubmissionRepository @Inject constructor( scope.launch { val test = coronaTestRepository.coronaTests.first().singleOrNull { it.type == type } - ?: throw IllegalStateException("No test of type $type available") - - coronaTestRepository.removeTest(identifier = test.identifier) + if (test == null) { + Timber.tag(TAG).w("There is no test of type=$type to remove.") + return@launch + } + try { + coronaTestRepository.removeTest(identifier = test.identifier) + } catch (e: CoronaTestNotFoundException) { + Timber.tag(TAG).e(e, "Test not found (type=$type), already removed?") + } } } -- GitLab