From 38f69359537bd4f481557f6d69bc30c50036d124 Mon Sep 17 00:00:00 2001
From: Mohamed <mohamed.metwalli@sap.com>
Date: Wed, 14 Apr 2021 10:55:18 +0200
Subject: [PATCH] Corona Test Config (EXPOSUREAPP-6047) (#2823)

* Map CoronaTestConfig

* Set default value

* Remove todo , aligned
---
 .../appconfig/AppConfigModule.kt              |  5 +++
 .../appconfig/CoronaTestConfig.kt             | 22 ++++++++++++
 .../appconfig/mapping/ConfigMapping.kt        |  2 ++
 .../appconfig/mapping/ConfigParser.kt         |  5 ++-
 .../mapping/CoronaTestConfigMapper.kt         | 36 +++++++++++++++++++
 .../appconfig/mapping/DefaultConfigMapping.kt |  2 ++
 .../appconfig/mapping/ConfigParserTest.kt     |  6 +++-
 7 files changed, 76 insertions(+), 2 deletions(-)
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/CoronaTestConfig.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/CoronaTestConfigMapper.kt

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/AppConfigModule.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/AppConfigModule.kt
index cf775d6f5..90de99cd1 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/AppConfigModule.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/AppConfigModule.kt
@@ -5,6 +5,7 @@ import dagger.Provides
 import de.rki.coronawarnapp.appconfig.download.AppConfigApiV2
 import de.rki.coronawarnapp.appconfig.mapping.AnalyticsConfigMapper
 import de.rki.coronawarnapp.appconfig.mapping.CWAConfigMapper
+import de.rki.coronawarnapp.appconfig.mapping.CoronaTestConfigMapper
 import de.rki.coronawarnapp.appconfig.mapping.ExposureDetectionConfigMapper
 import de.rki.coronawarnapp.appconfig.mapping.ExposureWindowRiskCalculationConfigMapper
 import de.rki.coronawarnapp.appconfig.mapping.KeyDownloadParametersMapper
@@ -83,6 +84,10 @@ class AppConfigModule {
     fun presenceTracingMapper(mapper: PresenceTracingConfigMapper):
         PresenceTracingConfig.Mapper = mapper
 
+    @Provides
+    fun coronaTestConfigMapper(mapper: CoronaTestConfigMapper):
+        CoronaTestConfig.Mapper = mapper
+
     companion object {
         private val HTTP_TIMEOUT_APPCONFIG = Duration.standardSeconds(10)
     }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/CoronaTestConfig.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/CoronaTestConfig.kt
new file mode 100644
index 000000000..acba01888
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/CoronaTestConfig.kt
@@ -0,0 +1,22 @@
+package de.rki.coronawarnapp.appconfig
+
+import de.rki.coronawarnapp.appconfig.mapping.ConfigMapper
+
+interface CoronaTestConfig {
+    val coronaRapidAntigenTestParameters: CoronaRapidAntigenTestParametersContainer
+
+    interface Mapper : ConfigMapper<CoronaTestConfig>
+}
+
+data class CoronaRapidAntigenTestParametersContainer(
+    val hoursToDeemTestOutdated: Int = DEFAULT_HOURS
+) {
+    companion object {
+        const val DEFAULT_HOURS = 48
+    }
+}
+
+data class CoronaTestConfigContainer(
+    override val coronaRapidAntigenTestParameters: CoronaRapidAntigenTestParametersContainer =
+        CoronaRapidAntigenTestParametersContainer()
+) : CoronaTestConfig
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/ConfigMapping.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/ConfigMapping.kt
index bad36b65a..d0d379026 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/ConfigMapping.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/ConfigMapping.kt
@@ -2,6 +2,7 @@ package de.rki.coronawarnapp.appconfig.mapping
 
 import de.rki.coronawarnapp.appconfig.AnalyticsConfig
 import de.rki.coronawarnapp.appconfig.CWAConfig
+import de.rki.coronawarnapp.appconfig.CoronaTestConfig
 import de.rki.coronawarnapp.appconfig.ExposureDetectionConfig
 import de.rki.coronawarnapp.appconfig.ExposureWindowRiskCalculationConfig
 import de.rki.coronawarnapp.appconfig.KeyDownloadConfig
@@ -22,4 +23,5 @@ interface ConfigMapping :
     val analytics: AnalyticsConfig
     val logUpload: LogUploadConfig
     val presenceTracing: PresenceTracingConfig
+    val coronaTestParameters: CoronaTestConfig
 }
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/ConfigParser.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/ConfigParser.kt
index de2214177..ced74a1e8 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/ConfigParser.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/ConfigParser.kt
@@ -3,6 +3,7 @@ package de.rki.coronawarnapp.appconfig.mapping
 import dagger.Reusable
 import de.rki.coronawarnapp.appconfig.AnalyticsConfig
 import de.rki.coronawarnapp.appconfig.CWAConfig
+import de.rki.coronawarnapp.appconfig.CoronaTestConfig
 import de.rki.coronawarnapp.appconfig.ExposureDetectionConfig
 import de.rki.coronawarnapp.appconfig.ExposureWindowRiskCalculationConfig
 import de.rki.coronawarnapp.appconfig.KeyDownloadConfig
@@ -23,6 +24,7 @@ class ConfigParser @Inject constructor(
     private val analyticsConfigMapper: AnalyticsConfig.Mapper,
     private val logUploadConfigMapper: LogUploadConfig.Mapper,
     private val presenceTracingConfigMapper: PresenceTracingConfig.Mapper,
+    private val coronaTestConfigMapper: CoronaTestConfig.Mapper,
 ) {
 
     fun parse(configBytes: ByteArray): ConfigMapping = try {
@@ -36,7 +38,8 @@ class ConfigParser @Inject constructor(
                 survey = surveyConfigMapper.map(it),
                 analytics = analyticsConfigMapper.map(it),
                 logUpload = logUploadConfigMapper.map(it),
-                presenceTracing = presenceTracingConfigMapper.map(it)
+                presenceTracing = presenceTracingConfigMapper.map(it),
+                coronaTestParameters = coronaTestConfigMapper.map(it)
             )
         }
     } catch (e: Exception) {
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/CoronaTestConfigMapper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/CoronaTestConfigMapper.kt
new file mode 100644
index 000000000..09fbb9068
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/CoronaTestConfigMapper.kt
@@ -0,0 +1,36 @@
+package de.rki.coronawarnapp.appconfig.mapping
+
+import dagger.Reusable
+import de.rki.coronawarnapp.appconfig.CoronaRapidAntigenTestParametersContainer
+import de.rki.coronawarnapp.appconfig.CoronaTestConfig
+import de.rki.coronawarnapp.appconfig.CoronaTestConfigContainer
+import de.rki.coronawarnapp.server.protocols.internal.v2.AppConfigAndroid.ApplicationConfigurationAndroid
+import timber.log.Timber
+import javax.inject.Inject
+
+@Reusable
+class CoronaTestConfigMapper @Inject constructor() : CoronaTestConfig.Mapper {
+    override fun map(
+        rawConfig: ApplicationConfigurationAndroid
+    ): CoronaTestConfig {
+
+        if (!rawConfig.hasCoronaTestParameters()) {
+            Timber.d("coronaTestParameters are missing")
+            return CoronaTestConfigContainer()
+        }
+
+        return rawConfig.mapCoronaTestParameters()
+    }
+
+    private fun ApplicationConfigurationAndroid.mapCoronaTestParameters(): CoronaTestConfig {
+        val coronaRapidAntigenTestParameters = if (coronaTestParameters.hasCoronaRapidAntigenTestParameters()) {
+            CoronaRapidAntigenTestParametersContainer(
+                coronaTestParameters.coronaRapidAntigenTestParameters.hoursToDeemTestOutdated
+            )
+        } else {
+            Timber.d("coronaRapidAntigenTestParameters is missing")
+            CoronaRapidAntigenTestParametersContainer()
+        }
+        return CoronaTestConfigContainer(coronaRapidAntigenTestParameters)
+    }
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/DefaultConfigMapping.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/DefaultConfigMapping.kt
index cdebdff80..220c854e0 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/DefaultConfigMapping.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/DefaultConfigMapping.kt
@@ -2,6 +2,7 @@ package de.rki.coronawarnapp.appconfig.mapping
 
 import de.rki.coronawarnapp.appconfig.AnalyticsConfig
 import de.rki.coronawarnapp.appconfig.CWAConfig
+import de.rki.coronawarnapp.appconfig.CoronaTestConfig
 import de.rki.coronawarnapp.appconfig.ExposureDetectionConfig
 import de.rki.coronawarnapp.appconfig.ExposureWindowRiskCalculationConfig
 import de.rki.coronawarnapp.appconfig.KeyDownloadConfig
@@ -20,6 +21,7 @@ data class DefaultConfigMapping(
     override val analytics: AnalyticsConfig,
     override val logUpload: LogUploadConfig,
     override val presenceTracing: PresenceTracingConfig,
+    override val coronaTestParameters: CoronaTestConfig,
 ) : ConfigMapping,
     CWAConfig by cwaConfig,
     KeyDownloadConfig by keyDownloadConfig,
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/mapping/ConfigParserTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/mapping/ConfigParserTest.kt
index 6f605d32f..b3c8c07ba 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/mapping/ConfigParserTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/mapping/ConfigParserTest.kt
@@ -3,6 +3,7 @@ package de.rki.coronawarnapp.appconfig.mapping
 import com.google.protobuf.InvalidProtocolBufferException
 import de.rki.coronawarnapp.appconfig.AnalyticsConfig
 import de.rki.coronawarnapp.appconfig.CWAConfig
+import de.rki.coronawarnapp.appconfig.CoronaTestConfig
 import de.rki.coronawarnapp.appconfig.ExposureDetectionConfig
 import de.rki.coronawarnapp.appconfig.ExposureWindowRiskCalculationConfig
 import de.rki.coronawarnapp.appconfig.KeyDownloadConfig
@@ -32,6 +33,7 @@ class ConfigParserTest : BaseTest() {
     @MockK lateinit var analyticsConfigMapper: AnalyticsConfig.Mapper
     @MockK lateinit var logUploadConfigMapper: LogUploadConfig.Mapper
     @MockK lateinit var presenceTracingConfigMapper: PresenceTracingConfig.Mapper
+    @MockK lateinit var coronaTestConfigMapper: CoronaTestConfig.Mapper
 
     private val appConfig171 = File("src/test/resources/appconfig_1_7_1.bin")
     private val appConfig180 = File("src/test/resources/appconfig_1_8_0.bin")
@@ -48,6 +50,7 @@ class ConfigParserTest : BaseTest() {
         every { analyticsConfigMapper.map(any()) } returns mockk()
         every { logUploadConfigMapper.map(any()) } returns mockk()
         every { presenceTracingConfigMapper.map(any()) } returns mockk()
+        every { coronaTestConfigMapper.map(any()) } returns mockk()
 
         appConfig171.exists() shouldBe true
         appConfig180.exists() shouldBe true
@@ -61,7 +64,8 @@ class ConfigParserTest : BaseTest() {
         surveyConfigMapper = surveyConfigMapper,
         analyticsConfigMapper = analyticsConfigMapper,
         logUploadConfigMapper = logUploadConfigMapper,
-        presenceTracingConfigMapper = presenceTracingConfigMapper
+        presenceTracingConfigMapper = presenceTracingConfigMapper,
+        coronaTestConfigMapper = coronaTestConfigMapper,
     )
 
     @Test
-- 
GitLab