From 5862b6a8bf2a094575f93930cc37101f0df08e8d Mon Sep 17 00:00:00 2001
From: Mohamed <mohamed.metwalli@sap.com>
Date: Tue, 16 Mar 2021 11:18:35 +0100
Subject: [PATCH] Presence tracing app config (DEV) (#2611)

* Map presence tracing configuration parameters

* Give priority to config values

* Use presence tracing config in QR Code creation

* lint

* Fix tests

Co-authored-by: harambasicluka <64483219+harambasicluka@users.noreply.github.com>
---
 .../qrcode/DefaultQRCodeVerifierTest.kt       |  2 -
 .../ui/qrcode/QrCodeCreationTestViewModel.kt  | 14 ++-
 .../appconfig/AppConfigModule.kt              |  5 +
 .../appconfig/PresenceTracingConfig.kt        | 13 +++
 .../PresenceTracingConfigContainer.kt         | 10 ++
 ...nceTracingRiskCalculationParamContainer.kt | 10 ++
 ...PresenceTracingSubmissionParamContainer.kt | 12 +++
 .../appconfig/mapping/ConfigMapping.kt        |  5 +-
 .../appconfig/mapping/ConfigParser.kt         |  5 +-
 .../appconfig/mapping/DefaultConfigMapping.kt |  4 +-
 .../mapping/PresenceTracingConfigMapper.kt    | 93 +++++++++++++++++++
 .../appconfig/mapping/ConfigParserTest.kt     |  6 +-
 .../events/DefaultTraceLocationKtTest.kt      |  2 +-
 .../entity/TraceLocationConvertersTest.kt     |  2 +-
 .../storage/entity/TraceLocationEntityTest.kt |  2 +-
 15 files changed, 170 insertions(+), 15 deletions(-)
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingConfig.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingConfigContainer.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingRiskCalculationParamContainer.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingSubmissionParamContainer.kt
 create mode 100644 Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/PresenceTracingConfigMapper.kt

diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/DefaultQRCodeVerifierTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/DefaultQRCodeVerifierTest.kt
index 5e8370105..83f1ef199 100644
--- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/DefaultQRCodeVerifierTest.kt
+++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/eventregistration/checkins/qrcode/DefaultQRCodeVerifierTest.kt
@@ -1,8 +1,6 @@
 package de.rki.coronawarnapp.eventregistration.checkins.qrcode
 
 import de.rki.coronawarnapp.environment.EnvironmentSetup
-import de.rki.coronawarnapp.eventregistration.common.decodeBase32
-import de.rki.coronawarnapp.server.protocols.internal.pt.TraceLocationOuterClass
 import de.rki.coronawarnapp.util.security.SignatureValidation
 import io.kotest.assertions.throwables.shouldNotThrowAny
 import io.kotest.assertions.throwables.shouldThrow
diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/eventregistration/ui/qrcode/QrCodeCreationTestViewModel.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/eventregistration/ui/qrcode/QrCodeCreationTestViewModel.kt
index 6dd59f2e6..268db7561 100644
--- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/eventregistration/ui/qrcode/QrCodeCreationTestViewModel.kt
+++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/eventregistration/ui/qrcode/QrCodeCreationTestViewModel.kt
@@ -10,9 +10,9 @@ import com.google.zxing.BarcodeFormat
 import com.google.zxing.EncodeHintType
 import com.google.zxing.MultiFormatWriter
 import com.google.zxing.common.BitMatrix
-import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
 import dagger.assisted.AssistedFactory
 import dagger.assisted.AssistedInject
+import de.rki.coronawarnapp.appconfig.AppConfigProvider
 import de.rki.coronawarnapp.util.coroutine.DispatcherProvider
 import de.rki.coronawarnapp.util.di.AppContext
 import de.rki.coronawarnapp.util.files.FileSharing
@@ -26,7 +26,8 @@ import java.io.FileOutputStream
 class QrCodeCreationTestViewModel @AssistedInject constructor(
     private val dispatcher: DispatcherProvider,
     private val fileSharing: FileSharing,
-    @AppContext private val context: Context
+    @AppContext private val context: Context,
+    private val appConfigProvider: AppConfigProvider,
 ) : CWAViewModel(dispatcher) {
 
     val qrCodeBitmap = SingleLiveEvent<Bitmap>()
@@ -82,10 +83,15 @@ class QrCodeCreationTestViewModel @AssistedInject constructor(
         return File(dir, "CoronaWarnApp-Event.pdf")
     }
 
-    private fun encodeAsBitmap(input: String, size: Int = 1000): Bitmap? {
+    private suspend fun encodeAsBitmap(input: String, size: Int = 1000): Bitmap? {
         return try {
+            val qrCodeErrorCorrectionLevel = appConfigProvider
+                .getAppConfig()
+                .presenceTracing
+                .qrCodeErrorCorrectionLevel
+            Timber.i("QrCodeErrorCorrectionLevel: $qrCodeErrorCorrectionLevel")
             val hints = mapOf(
-                EncodeHintType.ERROR_CORRECTION to ErrorCorrectionLevel.H
+                EncodeHintType.ERROR_CORRECTION to qrCodeErrorCorrectionLevel
                 // This is not required in the specs and it should not be enabled
                 // it is causing crash on older Android versions ex:API 23
                 // EncodeHintType.CHARACTER_SET to Charsets.UTF_8
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 093538159..cf775d6f5 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
@@ -9,6 +9,7 @@ import de.rki.coronawarnapp.appconfig.mapping.ExposureDetectionConfigMapper
 import de.rki.coronawarnapp.appconfig.mapping.ExposureWindowRiskCalculationConfigMapper
 import de.rki.coronawarnapp.appconfig.mapping.KeyDownloadParametersMapper
 import de.rki.coronawarnapp.appconfig.mapping.LogUploadConfigMapper
+import de.rki.coronawarnapp.appconfig.mapping.PresenceTracingConfigMapper
 import de.rki.coronawarnapp.appconfig.mapping.SurveyConfigMapper
 import de.rki.coronawarnapp.environment.download.DownloadCDNHttpClient
 import de.rki.coronawarnapp.environment.download.DownloadCDNServerUrl
@@ -78,6 +79,10 @@ class AppConfigModule {
     fun logUploadMapper(mapper: LogUploadConfigMapper):
         LogUploadConfig.Mapper = mapper
 
+    @Provides
+    fun presenceTracingMapper(mapper: PresenceTracingConfigMapper):
+        PresenceTracingConfig.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/PresenceTracingConfig.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingConfig.kt
new file mode 100644
index 000000000..5eaee0af4
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingConfig.kt
@@ -0,0 +1,13 @@
+package de.rki.coronawarnapp.appconfig
+
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
+import de.rki.coronawarnapp.appconfig.mapping.ConfigMapper
+
+interface PresenceTracingConfig {
+    val qrCodeErrorCorrectionLevel: ErrorCorrectionLevel
+    val revokedTraceLocationVersions: List<Int>
+    val riskCalculationParameters: PresenceTracingRiskCalculationParamContainer
+    val submissionParameters: PresenceTracingSubmissionParamContainer
+
+    interface Mapper : ConfigMapper<PresenceTracingConfig>
+}
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingConfigContainer.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingConfigContainer.kt
new file mode 100644
index 000000000..0067d966b
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingConfigContainer.kt
@@ -0,0 +1,10 @@
+package de.rki.coronawarnapp.appconfig
+
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
+
+data class PresenceTracingConfigContainer(
+    override val qrCodeErrorCorrectionLevel: ErrorCorrectionLevel,
+    override val revokedTraceLocationVersions: List<Int>,
+    override val riskCalculationParameters: PresenceTracingRiskCalculationParamContainer,
+    override val submissionParameters: PresenceTracingSubmissionParamContainer
+) : PresenceTracingConfig
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingRiskCalculationParamContainer.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingRiskCalculationParamContainer.kt
new file mode 100644
index 000000000..b50b44323
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingRiskCalculationParamContainer.kt
@@ -0,0 +1,10 @@
+package de.rki.coronawarnapp.appconfig
+
+import de.rki.coronawarnapp.server.protocols.internal.v2.RiskCalculationParametersOuterClass.NormalizedTimeToRiskLevelMapping
+import de.rki.coronawarnapp.server.protocols.internal.v2.RiskCalculationParametersOuterClass.TransmissionRiskValueMapping
+
+data class PresenceTracingRiskCalculationParamContainer(
+    val transmissionRiskValueMapping: List<TransmissionRiskValueMapping>,
+    val normalizedTimePerCheckInToRiskLevelMapping: List<NormalizedTimeToRiskLevelMapping>,
+    val normalizedTimePerDayToRiskLevelMapping: List<NormalizedTimeToRiskLevelMapping>
+)
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingSubmissionParamContainer.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingSubmissionParamContainer.kt
new file mode 100644
index 000000000..1fdae47da
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/PresenceTracingSubmissionParamContainer.kt
@@ -0,0 +1,12 @@
+package de.rki.coronawarnapp.appconfig
+
+import de.rki.coronawarnapp.server.protocols.internal.v2
+    .PresenceTracingParametersOuterClass.PresenceTracingSubmissionParameters.DurationFilter
+
+import de.rki.coronawarnapp.server.protocols.internal.v2
+    .PresenceTracingParametersOuterClass.PresenceTracingSubmissionParameters.AerosoleDecayFunctionLinear
+
+data class PresenceTracingSubmissionParamContainer(
+    val durationFilters: List<DurationFilter>,
+    val aerosoleDecayLinearFunctions: List<AerosoleDecayFunctionLinear>
+)
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 92a3d6849..bad36b65a 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
@@ -6,6 +6,7 @@ import de.rki.coronawarnapp.appconfig.ExposureDetectionConfig
 import de.rki.coronawarnapp.appconfig.ExposureWindowRiskCalculationConfig
 import de.rki.coronawarnapp.appconfig.KeyDownloadConfig
 import de.rki.coronawarnapp.appconfig.LogUploadConfig
+import de.rki.coronawarnapp.appconfig.PresenceTracingConfig
 import de.rki.coronawarnapp.appconfig.SurveyConfig
 import de.rki.coronawarnapp.server.protocols.internal.v2.AppConfigAndroid
 
@@ -17,10 +18,8 @@ interface ConfigMapping :
 
     @Deprecated("Try to access a more specific config type, avoid the RAW variant.")
     val rawConfig: AppConfigAndroid.ApplicationConfigurationAndroid
-
     val survey: SurveyConfig
-
     val analytics: AnalyticsConfig
-
     val logUpload: LogUploadConfig
+    val presenceTracing: PresenceTracingConfig
 }
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 e9bf15f00..de2214177 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
@@ -7,6 +7,7 @@ import de.rki.coronawarnapp.appconfig.ExposureDetectionConfig
 import de.rki.coronawarnapp.appconfig.ExposureWindowRiskCalculationConfig
 import de.rki.coronawarnapp.appconfig.KeyDownloadConfig
 import de.rki.coronawarnapp.appconfig.LogUploadConfig
+import de.rki.coronawarnapp.appconfig.PresenceTracingConfig
 import de.rki.coronawarnapp.appconfig.SurveyConfig
 import de.rki.coronawarnapp.server.protocols.internal.v2.AppConfigAndroid
 import timber.log.Timber
@@ -21,6 +22,7 @@ class ConfigParser @Inject constructor(
     private val surveyConfigMapper: SurveyConfig.Mapper,
     private val analyticsConfigMapper: AnalyticsConfig.Mapper,
     private val logUploadConfigMapper: LogUploadConfig.Mapper,
+    private val presenceTracingConfigMapper: PresenceTracingConfig.Mapper,
 ) {
 
     fun parse(configBytes: ByteArray): ConfigMapping = try {
@@ -33,7 +35,8 @@ class ConfigParser @Inject constructor(
                 exposureWindowRiskCalculationConfig = exposureWindowRiskCalculationConfigMapper.map(it),
                 survey = surveyConfigMapper.map(it),
                 analytics = analyticsConfigMapper.map(it),
-                logUpload = logUploadConfigMapper.map(it)
+                logUpload = logUploadConfigMapper.map(it),
+                presenceTracing = presenceTracingConfigMapper.map(it)
             )
         }
     } catch (e: Exception) {
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 9ebbe2116..cdebdff80 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
@@ -6,6 +6,7 @@ import de.rki.coronawarnapp.appconfig.ExposureDetectionConfig
 import de.rki.coronawarnapp.appconfig.ExposureWindowRiskCalculationConfig
 import de.rki.coronawarnapp.appconfig.KeyDownloadConfig
 import de.rki.coronawarnapp.appconfig.LogUploadConfig
+import de.rki.coronawarnapp.appconfig.PresenceTracingConfig
 import de.rki.coronawarnapp.appconfig.SurveyConfig
 import de.rki.coronawarnapp.server.protocols.internal.v2.AppConfigAndroid
 
@@ -17,7 +18,8 @@ data class DefaultConfigMapping(
     val exposureWindowRiskCalculationConfig: ExposureWindowRiskCalculationConfig,
     override val survey: SurveyConfig,
     override val analytics: AnalyticsConfig,
-    override val logUpload: LogUploadConfig
+    override val logUpload: LogUploadConfig,
+    override val presenceTracing: PresenceTracingConfig,
 ) : ConfigMapping,
     CWAConfig by cwaConfig,
     KeyDownloadConfig by keyDownloadConfig,
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/PresenceTracingConfigMapper.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/PresenceTracingConfigMapper.kt
new file mode 100644
index 000000000..a25ebee28
--- /dev/null
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/mapping/PresenceTracingConfigMapper.kt
@@ -0,0 +1,93 @@
+package de.rki.coronawarnapp.appconfig.mapping
+
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel
+import dagger.Reusable
+import de.rki.coronawarnapp.appconfig.PresenceTracingConfig
+import de.rki.coronawarnapp.appconfig.PresenceTracingConfigContainer
+import de.rki.coronawarnapp.appconfig.PresenceTracingRiskCalculationParamContainer
+import de.rki.coronawarnapp.appconfig.PresenceTracingSubmissionParamContainer
+import de.rki.coronawarnapp.server.protocols.internal.v2.AppConfigAndroid
+import de.rki.coronawarnapp.server.protocols.internal.v2
+    .PresenceTracingParametersOuterClass.PresenceTracingSubmissionParameters
+import de.rki.coronawarnapp.server.protocols.internal.v2
+    .PresenceTracingParametersOuterClass.PresenceTracingRiskCalculationParameters
+import de.rki.coronawarnapp.server.protocols.internal.v2
+    .PresenceTracingParametersOuterClass.PresenceTracingParameters.QRCodeErrorCorrectionLevel
+import timber.log.Timber
+import javax.inject.Inject
+
+@Reusable
+class PresenceTracingConfigMapper @Inject constructor() : PresenceTracingConfig.Mapper {
+    override fun map(rawConfig: AppConfigAndroid.ApplicationConfigurationAndroid): PresenceTracingConfig {
+        if (!rawConfig.hasPresenceTracingParameters()) {
+            Timber.w("AppConfig does not have PresenceTracingParameters")
+            return PresenceTracingConfigContainer(
+                qrCodeErrorCorrectionLevel = ErrorCorrectionLevel.H,
+                revokedTraceLocationVersions = emptyList(),
+                riskCalculationParameters = emptyRiskCalculationParameters(),
+                submissionParameters = emptySubmissionParameters()
+            )
+        }
+
+        return rawConfig.presenceTracingConfig().also { Timber.i("PresenceTracingConfig: $it") }
+    }
+
+    private fun emptySubmissionParameters() =
+        PresenceTracingSubmissionParamContainer(
+            durationFilters = emptyList(),
+            aerosoleDecayLinearFunctions = emptyList()
+        )
+
+    private fun emptyRiskCalculationParameters() =
+        PresenceTracingRiskCalculationParamContainer(
+            transmissionRiskValueMapping = emptyList(),
+            normalizedTimePerCheckInToRiskLevelMapping = emptyList(),
+            normalizedTimePerDayToRiskLevelMapping = emptyList()
+        )
+
+    private fun PresenceTracingSubmissionParameters.mapSubmissionParameters() =
+        PresenceTracingSubmissionParamContainer(
+            durationFilters = durationFiltersList,
+            aerosoleDecayLinearFunctions = aerosoleDecayLinearFunctionsList
+        )
+
+    private fun PresenceTracingRiskCalculationParameters.mapRiskCalculationParameters() =
+        PresenceTracingRiskCalculationParamContainer(
+            transmissionRiskValueMapping = transmissionRiskValueMappingList,
+            normalizedTimePerCheckInToRiskLevelMapping = normalizedTimePerCheckInToRiskLevelMappingList,
+            normalizedTimePerDayToRiskLevelMapping = normalizedTimePerDayToRiskLevelMappingList
+        )
+
+    private fun QRCodeErrorCorrectionLevel.mapErrorCorrection(): ErrorCorrectionLevel =
+        when (this) {
+            QRCodeErrorCorrectionLevel.LOW -> ErrorCorrectionLevel.L
+            QRCodeErrorCorrectionLevel.MEDIUM -> ErrorCorrectionLevel.M
+            QRCodeErrorCorrectionLevel.HIGH -> ErrorCorrectionLevel.H
+            QRCodeErrorCorrectionLevel.QUANTILE -> ErrorCorrectionLevel.Q
+            else -> ErrorCorrectionLevel.H
+        }
+
+    private fun AppConfigAndroid.ApplicationConfigurationAndroid.presenceTracingConfig() =
+        presenceTracingParameters.run {
+            val riskCalculationParameters = if (hasRiskCalculationParameters()) {
+                riskCalculationParameters.mapRiskCalculationParameters()
+            } else {
+                Timber.w("RiskCalculationParameters are missing")
+                emptyRiskCalculationParameters()
+            }
+
+            val submissionParameters = if (hasSubmissionParameters()) {
+                submissionParameters.mapSubmissionParameters()
+            } else {
+                Timber.w("SubmissionParameters are missing")
+                emptySubmissionParameters()
+            }
+
+            PresenceTracingConfigContainer(
+                qrCodeErrorCorrectionLevel = qrCodeErrorCorrectionLevel.mapErrorCorrection(),
+                revokedTraceLocationVersions = revokedTraceLocationVersionsList.orEmpty(),
+                riskCalculationParameters = riskCalculationParameters,
+                submissionParameters = submissionParameters
+            )
+        }
+}
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 ab457e818..6f605d32f 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
@@ -7,6 +7,7 @@ import de.rki.coronawarnapp.appconfig.ExposureDetectionConfig
 import de.rki.coronawarnapp.appconfig.ExposureWindowRiskCalculationConfig
 import de.rki.coronawarnapp.appconfig.KeyDownloadConfig
 import de.rki.coronawarnapp.appconfig.LogUploadConfig
+import de.rki.coronawarnapp.appconfig.PresenceTracingConfig
 import de.rki.coronawarnapp.appconfig.SurveyConfig
 import io.kotest.assertions.throwables.shouldThrow
 import io.kotest.matchers.shouldBe
@@ -30,6 +31,7 @@ class ConfigParserTest : BaseTest() {
     @MockK lateinit var surveyConfigMapper: SurveyConfig.Mapper
     @MockK lateinit var analyticsConfigMapper: AnalyticsConfig.Mapper
     @MockK lateinit var logUploadConfigMapper: LogUploadConfig.Mapper
+    @MockK lateinit var presenceTracingConfigMapper: PresenceTracingConfig.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")
@@ -45,6 +47,7 @@ class ConfigParserTest : BaseTest() {
         every { surveyConfigMapper.map(any()) } returns mockk()
         every { analyticsConfigMapper.map(any()) } returns mockk()
         every { logUploadConfigMapper.map(any()) } returns mockk()
+        every { presenceTracingConfigMapper.map(any()) } returns mockk()
 
         appConfig171.exists() shouldBe true
         appConfig180.exists() shouldBe true
@@ -57,7 +60,8 @@ class ConfigParserTest : BaseTest() {
         exposureWindowRiskCalculationConfigMapper = exposureWindowRiskCalculationConfigMapper,
         surveyConfigMapper = surveyConfigMapper,
         analyticsConfigMapper = analyticsConfigMapper,
-        logUploadConfigMapper = logUploadConfigMapper
+        logUploadConfigMapper = logUploadConfigMapper,
+        presenceTracingConfigMapper = presenceTracingConfigMapper
     )
 
     @Test
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/events/DefaultTraceLocationKtTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/events/DefaultTraceLocationKtTest.kt
index 7aefa48ae..4b624abcb 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/events/DefaultTraceLocationKtTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/events/DefaultTraceLocationKtTest.kt
@@ -108,4 +108,4 @@ internal class DefaultTraceLocationKtTest : BaseTest() {
             )
         )
     }
-}
\ No newline at end of file
+}
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationConvertersTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationConvertersTest.kt
index b11ff0146..24260f9a9 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationConvertersTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationConvertersTest.kt
@@ -26,4 +26,4 @@ internal class TraceLocationConvertersTest : BaseTest() {
             fromTraceLocationType(TraceLocation.Type.TEMPORARY_OTHER) shouldBe 2
         }
     }
-}
\ No newline at end of file
+}
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntityTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntityTest.kt
index e796c1838..df49201e4 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntityTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/eventregistration/storage/entity/TraceLocationEntityTest.kt
@@ -58,4 +58,4 @@ internal class TraceLocationEntityTest : BaseTest() {
             signature = "signature"
         )
     }
-}
\ No newline at end of file
+}
-- 
GitLab