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