From cb6e6d671499b08bbc7c5e43b74a387a4057f9a5 Mon Sep 17 00:00:00 2001
From: Matthias Urhahn <matthias.urhahn@sap.com>
Date: Wed, 11 Nov 2020 09:57:31 +0100
Subject: [PATCH] Fix missing error dialog (DEV) (#1564)

* Fix task exceptions not being forwarded to our current error UI elements.

* Clean up old transaction names.

* Use simple class name as error tag.

* Prevent error reporting from triggering in unit tests due to static access.

* Move isUnitTest to CWDebug

Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com>
---
 .../de/rki/coronawarnapp/bugreporting/BugReporter.kt     | 2 ++
 .../exception/reporting/ExceptionReporter.kt             | 3 +++
 .../java/de/rki/coronawarnapp/task/TaskController.kt     | 5 +++++
 .../internal/DefaultTaskCoroutineScope.kt}               | 4 ++--
 .../de/rki/coronawarnapp/task/internal/TaskModule.kt     | 3 +--
 .../src/main/java/de/rki/coronawarnapp/util/CWADebug.kt  | 9 +++++++++
 Corona-Warn-App/src/test/java/testhelpers/IsAUnitTest.kt | 3 +++
 7 files changed, 25 insertions(+), 4 deletions(-)
 rename Corona-Warn-App/src/main/java/de/rki/coronawarnapp/{transaction/TransactionCoroutineScope.kt => task/internal/DefaultTaskCoroutineScope.kt} (75%)
 create mode 100644 Corona-Warn-App/src/test/java/testhelpers/IsAUnitTest.kt

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/BugReporter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/BugReporter.kt
index d3ae63b59..d67d523d9 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/BugReporter.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/bugreporting/BugReporter.kt
@@ -1,5 +1,6 @@
 package de.rki.coronawarnapp.bugreporting
 
+import de.rki.coronawarnapp.util.CWADebug
 import de.rki.coronawarnapp.util.di.AppInjector
 
 interface BugReporter {
@@ -7,6 +8,7 @@ interface BugReporter {
 }
 
 fun Throwable.reportProblem(tag: String? = null, info: String? = null) {
+    if (CWADebug.isAUnitTest) return
     val reporter = AppInjector.component.bugReporter
     reporter.report(this, tag, info)
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ExceptionReporter.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ExceptionReporter.kt
index 8f602075d..06a6455a5 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ExceptionReporter.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/exception/reporting/ExceptionReporter.kt
@@ -10,6 +10,7 @@ import de.rki.coronawarnapp.exception.ExceptionCategory
 import de.rki.coronawarnapp.exception.reporting.ReportingConstants.STATUS_CODE_GOOGLE_API_FAIL
 import de.rki.coronawarnapp.exception.reporting.ReportingConstants.STATUS_CODE_GOOGLE_UPDATE_NEEDED
 import de.rki.coronawarnapp.exception.reporting.ReportingConstants.STATUS_CODE_REACHED_REQUEST_LIMIT
+import de.rki.coronawarnapp.util.CWADebug
 import de.rki.coronawarnapp.util.tryFormattedError
 import java.io.PrintWriter
 import java.io.StringWriter
@@ -22,6 +23,8 @@ fun Throwable.report(
     prefix: String?,
     suffix: String?
 ) {
+    if (CWADebug.isAUnitTest) return
+
     reportProblem(tag = prefix, info = suffix)
     val context = CoronaWarnApplication.getAppContext()
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/task/TaskController.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/task/TaskController.kt
index 77e223947..46b3964b9 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/task/TaskController.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/task/TaskController.kt
@@ -1,6 +1,9 @@
 package de.rki.coronawarnapp.task
 
 import androidx.annotation.VisibleForTesting
+import de.rki.coronawarnapp.bugreporting.reportProblem
+import de.rki.coronawarnapp.exception.ExceptionCategory
+import de.rki.coronawarnapp.exception.reporting.report
 import de.rki.coronawarnapp.task.TaskFactory.Config.CollisionBehavior
 import de.rki.coronawarnapp.task.internal.InternalTaskState
 import de.rki.coronawarnapp.util.TimeStamper
@@ -147,6 +150,8 @@ class TaskController @Inject constructor(
                     state.job.getCompleted()
                 } else {
                     Timber.tag(TAG).e(error, "Task failed: %s", state)
+                    error.report(ExceptionCategory.INTERNAL)
+                    error.reportProblem(tag = state.request.type.simpleName)
                     null
                 }
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/TransactionCoroutineScope.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/task/internal/DefaultTaskCoroutineScope.kt
similarity index 75%
rename from Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/TransactionCoroutineScope.kt
rename to Corona-Warn-App/src/main/java/de/rki/coronawarnapp/task/internal/DefaultTaskCoroutineScope.kt
index 0e27712b8..c10a3c041 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/transaction/TransactionCoroutineScope.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/task/internal/DefaultTaskCoroutineScope.kt
@@ -1,4 +1,4 @@
-package de.rki.coronawarnapp.transaction
+package de.rki.coronawarnapp.task.internal
 
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
@@ -8,6 +8,6 @@ import javax.inject.Singleton
 import kotlin.coroutines.CoroutineContext
 
 @Singleton
-class TransactionCoroutineScope @Inject constructor() : CoroutineScope {
+class DefaultTaskCoroutineScope @Inject constructor() : CoroutineScope {
     override val coroutineContext: CoroutineContext = SupervisorJob() + Dispatchers.Default
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/task/internal/TaskModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/task/internal/TaskModule.kt
index c94f6beb9..f0169422b 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/task/internal/TaskModule.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/task/internal/TaskModule.kt
@@ -4,7 +4,6 @@ import dagger.Module
 import dagger.Provides
 import de.rki.coronawarnapp.task.TaskCoroutineScope
 import de.rki.coronawarnapp.task.example.QueueingTaskModule
-import de.rki.coronawarnapp.transaction.TransactionCoroutineScope
 import kotlinx.coroutines.CoroutineScope
 import javax.inject.Singleton
 
@@ -17,5 +16,5 @@ class TaskModule {
     @Provides
     @Singleton
     @TaskCoroutineScope
-    fun provideScope(scope: TransactionCoroutineScope): CoroutineScope = scope
+    fun provideScope(scope: DefaultTaskCoroutineScope): CoroutineScope = scope
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CWADebug.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CWADebug.kt
index 8efb6c148..cade97a58 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CWADebug.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CWADebug.kt
@@ -31,4 +31,13 @@ object CWADebug {
         DEVICE("device"),
         DEVICE_FOR_TESTERS("deviceForTesters")
     }
+
+    val isAUnitTest: Boolean by lazy {
+        try {
+            Class.forName("testhelpers.IsAUnitTest")
+            true
+        } catch (e: Exception) {
+            false
+        }
+    }
 }
diff --git a/Corona-Warn-App/src/test/java/testhelpers/IsAUnitTest.kt b/Corona-Warn-App/src/test/java/testhelpers/IsAUnitTest.kt
new file mode 100644
index 000000000..2af3e4cb7
--- /dev/null
+++ b/Corona-Warn-App/src/test/java/testhelpers/IsAUnitTest.kt
@@ -0,0 +1,3 @@
+package testhelpers
+
+class IsAUnitTest
-- 
GitLab