diff --git a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt index 1de6e298ada80c107b9da7fd9af3ff455a81f030..c03b84f39023d1999f7d0e38b93fa25b1e6d0d10 100644 --- a/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt +++ b/Corona-Warn-App/src/deviceForTesters/java/de/rki/coronawarnapp/test/api/ui/TestForAPIFragment.kt @@ -16,7 +16,6 @@ import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 import com.google.android.gms.nearby.exposurenotification.ExposureNotificationClient -import com.google.android.gms.nearby.exposurenotification.ExposureWindow import com.google.android.gms.nearby.exposurenotification.TemporaryExposureKey import com.google.android.material.snackbar.Snackbar import com.google.gson.Gson @@ -120,7 +119,6 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), binding.apply { buttonApiTestStart.setOnClickListener { start() } buttonApiGetExposureKeys.setOnClickListener { getExposureKeys() } - buttonApiGetCheckExposure.setOnClickListener { checkExposure() } buttonApiScanQrCode.setOnClickListener { IntentIntegrator.forSupportFragment(this@TestForAPIFragment) @@ -198,12 +196,6 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), } } - override fun onResume() { - super.onResume() - - updateExposureSummaryDisplay(null) - } - private val prettyKey = { key: AppleLegacyKeyExchange.Key -> StringBuilder() .append("\nKey data: ${key.keyData}") @@ -309,51 +301,6 @@ class TestForAPIFragment : Fragment(R.layout.fragment_test_for_a_p_i), } } - private fun checkExposure() { - Timber.d("Check Exposure") - - lifecycleScope.launch { - try { - val exposureSummary = enfClient.exposureWindows() - updateExposureSummaryDisplay(exposureSummary) - showToast("Updated Exposure Summary") - Timber.d("Received exposure from QR Code") - Timber.i(exposureSummary.toString()) - } catch (e: Exception) { - e.report(ExceptionCategory.EXPOSURENOTIFICATION) - } - } - } - - private fun updateExposureSummaryDisplay(windows: List<ExposureWindow>?) { - - // FIXME -// binding.labelExposureSummaryMatchedKeyCount.text = getString( -// R.string.test_api_body_matchedKeyCount, -// (exposureSummary?.matchedKeyCount ?: "-").toString() -// ) -// -// binding.labelExposureSummaryDaysSinceLastExposure.text = getString( -// R.string.test_api_body_daysSinceLastExposure, -// (exposureSummary?.daysSinceLastExposure ?: "-").toString() -// ) -// -// binding.labelExposureSummaryMaximumRiskScore.text = getString( -// R.string.test_api_body_maximumRiskScore, -// (exposureSummary?.maximumRiskScore ?: "-").toString() -// ) -// -// binding.labelExposureSummarySummationRiskScore.text = getString( -// R.string.test_api_body_summation_risk, -// (exposureSummary?.summationRiskScore ?: "-").toString() -// ) -// -// binding.labelExposureSummaryAttenuation.text = getString( -// R.string.test_api_body_attenuation, -// (exposureSummary?.attenuationDurationsInMinutes?.joinToString() ?: "-").toString() -// ) - } - private fun updateKeysDisplay() { val myKeys = diff --git a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml index a4eb49227c15f443d2dde6b13eb76d3affca190c..30b10c80b5acd13b4e1e7963521ba2fe44500099 100644 --- a/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml +++ b/Corona-Warn-App/src/deviceForTesters/res/layout/fragment_test_for_a_p_i.xml @@ -61,36 +61,6 @@ android:layout_marginBottom="@dimen/spacing_tiny" android:text="@string/test_api_exposure_summary_headline" /> - <TextView - android:id="@+id/label_exposure_summary_matchedKeyCount" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/test_api_body_matchedKeyCount" /> - - <TextView - android:id="@+id/label_exposure_summary_daysSinceLastExposure" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/test_api_body_daysSinceLastExposure" /> - - <TextView - android:id="@+id/label_exposure_summary_maximumRiskScore" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/test_api_body_maximumRiskScore" /> - - <TextView - android:id="@+id/label_exposure_summary_summationRiskScore" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/test_api_body_summation_risk" /> - - <TextView - android:id="@+id/label_exposure_summary_attenuation" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:text="@string/test_api_body_attenuation" /> - <Button android:id="@+id/button_api_scan_qr_code" style="@style/buttonPrimary" @@ -106,14 +76,6 @@ android:layout_height="wrap_content" android:layout_marginTop="@dimen/spacing_tiny" android:text="@string/test_api_button_enter_other_keys" /> - - <Button - android:id="@+id/button_api_get_check_exposure" - style="@style/buttonPrimary" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginTop="@dimen/spacing_tiny" - android:text="@string/test_api_button_check_exposure" /> </LinearLayout> <LinearLayout diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/diagnosiskeyprovider/DefaultDiagnosisKeyProvider.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/diagnosiskeyprovider/DefaultDiagnosisKeyProvider.kt index bf0c6f5ccb9b3270b32163a14f03ffc7d73563df..5d4ce8b4fa847c50b9d659318de47d665ca981a3 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/diagnosiskeyprovider/DefaultDiagnosisKeyProvider.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/diagnosiskeyprovider/DefaultDiagnosisKeyProvider.kt @@ -25,13 +25,9 @@ class DefaultDiagnosisKeyProvider @Inject constructor( return true } - // Check version of ENF - try { - enfVersion.requireAtLeast(ENFVersion.V16) - } catch (e: Exception) { - Timber.e(e) - throw e - } + // Check version of ENF, WindowMode since v1.5, but version check since v1.6 + // Will throw if requirement is not satisfied + enfVersion.requireMinimumVersion(ENFVersion.V1_6) if (!submissionQuota.consumeQuota(1)) { Timber.w("No key files submitted because not enough quota available.") diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/version/DefaultENFVersion.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/version/DefaultENFVersion.kt index 044bff1afb98daa9eccec81ff055d187924447b7..7652fb055bdb64e4cbd76d4528a7047ffbfeef91 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/version/DefaultENFVersion.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/version/DefaultENFVersion.kt @@ -9,7 +9,6 @@ import javax.inject.Singleton import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine -import kotlin.math.abs @Singleton class DefaultENFVersion @Inject constructor( @@ -23,22 +22,19 @@ class DefaultENFVersion @Inject constructor( null } - override suspend fun requireAtLeast(compareVersion: Long) { - if (!isAtLeast(compareVersion)) { - throw ENFVersion.Companion.UnsupportedENFVersionException() - } - } - - override suspend fun isAtLeast(compareVersion: Long): Boolean { - if (!compareVersion.isCorrectVersionLength) throw IllegalArgumentException("given version has incorrect length") - - return try { - internalGetENFClientVersion() >= compareVersion + override suspend fun requireMinimumVersion(required: Long) { + try { + val currentVersion = internalGetENFClientVersion() + if (currentVersion < required) { + val error = OutdatedENFVersionException(current = currentVersion, required = required) + Timber.e(error, "Version requirement not satisfied.") + throw error + } else { + Timber.d("Version requirement satisfied: current=$currentVersion, required=$required") + } } catch (apiException: ApiException) { if (apiException.statusCode != CommonStatusCodes.API_NOT_CONNECTED) { throw apiException - } else { - return false } } } @@ -48,12 +44,4 @@ class DefaultENFVersion @Inject constructor( .addOnSuccessListener { cont.resume(it) } .addOnFailureListener { cont.resumeWithException(it) } } - - // check if a raw long has the correct length to be considered an API version - private val Long.isCorrectVersionLength - get(): Boolean = abs(this).toString().length == GOOGLE_API_VERSION_FIELD_LENGTH - - companion object { - private const val GOOGLE_API_VERSION_FIELD_LENGTH = 8 - } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/version/ENFVersion.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/version/ENFVersion.kt index 0a01015653f27e659e5d0e90b577078b756c9778..b7d16994a91e0742d3910f3c22fd7323b31b6857 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/version/ENFVersion.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/version/ENFVersion.kt @@ -1,24 +1,18 @@ package de.rki.coronawarnapp.nearby.modules.version interface ENFVersion { - suspend fun getENFClientVersion(): Long? - /** - * Indicates if the client runs above a certain version - * - * @return isAboveVersion, if connected to an old unsupported version, return false + * May return null if the API is currently not connected. */ - suspend fun isAtLeast(compareVersion: Long): Boolean + suspend fun getENFClientVersion(): Long? /** - * Throws an [UnsupportedENFVersionException] if the client runs an old unsupported version of the ENF + * Throws an [OutdatedENFVersionException] if the client runs an old unsupported version of the ENF + * If the API is currently not connected, no exception will be thrown, we expect this to only be a temporary state */ - suspend fun requireAtLeast(compareVersion: Long) + suspend fun requireMinimumVersion(required: Long) companion object { - const val V16 = 16000000L - const val V15 = 15000000L - - class UnsupportedENFVersionException : Exception("The client runs an old unsupported version of the ENF") + const val V1_6 = 16000000L } } diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/version/OutdatedENFVersionException.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/version/OutdatedENFVersionException.kt new file mode 100644 index 0000000000000000000000000000000000000000..5cf38d6fb2e81becdbce33e9fba99fac2ec6127b --- /dev/null +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/nearby/modules/version/OutdatedENFVersionException.kt @@ -0,0 +1,6 @@ +package de.rki.coronawarnapp.nearby.modules.version + +class OutdatedENFVersionException( + val current: Long, + val required: Long +) : Exception("Client is using an outdated ENF version: current=$current, required=$required") diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt index 4c2b2f955c6b11c0f0a33541b72d6149be4206ad..6a869aa15a472ceb4d54b28ebbb2413f016556d4 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/di/ApplicationComponent.kt @@ -19,11 +19,9 @@ import de.rki.coronawarnapp.nearby.ENFModule import de.rki.coronawarnapp.playbook.Playbook import de.rki.coronawarnapp.playbook.PlaybookModule import de.rki.coronawarnapp.receiver.ReceiverBinder -import de.rki.coronawarnapp.risk.ExposureResultStore import de.rki.coronawarnapp.risk.RiskModule import de.rki.coronawarnapp.service.ServiceBinder import de.rki.coronawarnapp.storage.SettingsRepository -import de.rki.coronawarnapp.storage.interoperability.InteroperabilityRepository import de.rki.coronawarnapp.submission.SubmissionModule import de.rki.coronawarnapp.submission.SubmissionTaskModule import de.rki.coronawarnapp.task.TaskController @@ -85,15 +83,11 @@ interface ApplicationComponent : AndroidInjector<CoronaWarnApplication> { val enfClient: ENFClient - val exposureResultStore: ExposureResultStore - val encryptedPreferencesFactory: EncryptedPreferencesFactory val errorResetTool: EncryptionErrorResetTool val playbook: Playbook - val interoperabilityRepository: InteroperabilityRepository - val taskController: TaskController @AppScope val appScope: AppCoroutineScope diff --git a/Corona-Warn-App/src/main/res/values-bg/strings.xml b/Corona-Warn-App/src/main/res/values-bg/strings.xml index 2d1890d30f5f492d038d8df7d82d931021860cdf..03b2b1f7a0f2b3c5313198d83369a2a978d274c4 100644 --- a/Corona-Warn-App/src/main/res/values-bg/strings.xml +++ b/Corona-Warn-App/src/main/res/values-bg/strings.xml @@ -1257,17 +1257,7 @@ <!-- NOTR --> <string name="test_api_button_check_exposure">"Check Exposure Summary"</string> <!-- NOTR --> - <string name="test_api_exposure_summary_headline">"Exposure summary"</string> - <!-- NOTR --> - <string name="test_api_body_daysSinceLastExposure">"Days since last exposure: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_attenuation">"Attenuation Durations in Minutes: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_summation_risk">"Summation Risk Score: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_matchedKeyCount">"Matched key count: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_maximumRiskScore">"Maximum risk score %1$s"</string> + <string name="test_api_exposure_summary_headline">"Exposure Windows"</string> <!-- NOTR --> <string name="test_api_body_my_keys">"My keys (count: %1$d)"</string> <!-- NOTR --> diff --git a/Corona-Warn-App/src/main/res/values-de/strings.xml b/Corona-Warn-App/src/main/res/values-de/strings.xml index 102761a193ba2433ac9329ff7e256f4cf7fdd466..f8eaa6a2e06e2b1893ce39c6db4ba5b014fb3e53 100644 --- a/Corona-Warn-App/src/main/res/values-de/strings.xml +++ b/Corona-Warn-App/src/main/res/values-de/strings.xml @@ -1259,17 +1259,7 @@ <!-- NOTR --> <string name="test_api_button_check_exposure">"Check Exposure Summary"</string> <!-- NOTR --> - <string name="test_api_exposure_summary_headline">"Exposure summary"</string> - <!-- NOTR --> - <string name="test_api_body_daysSinceLastExposure">"Days since last exposure: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_attenuation">"Attenuation Durations in Minutes: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_summation_risk">"Summation Risk Score: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_matchedKeyCount">"Matched key count: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_maximumRiskScore">"Maximum risk score %1$s"</string> + <string name="test_api_exposure_summary_headline">"Exposure Windows"</string> <!-- NOTR --> <string name="test_api_body_my_keys">"My keys (count: %1$d)"</string> <!-- NOTR --> diff --git a/Corona-Warn-App/src/main/res/values-en/strings.xml b/Corona-Warn-App/src/main/res/values-en/strings.xml index 1671da109a0a5ad15f715b8594585729680b28d0..6b9d4ca42f8c7a9b242d2e1f1862b7caa903e1df 100644 --- a/Corona-Warn-App/src/main/res/values-en/strings.xml +++ b/Corona-Warn-App/src/main/res/values-en/strings.xml @@ -1257,17 +1257,7 @@ <!-- NOTR --> <string name="test_api_button_check_exposure">"Check Exposure Summary"</string> <!-- NOTR --> - <string name="test_api_exposure_summary_headline">"Exposure summary"</string> - <!-- NOTR --> - <string name="test_api_body_daysSinceLastExposure">"Days since last exposure: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_attenuation">"Attenuation Durations in Minutes: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_summation_risk">"Summation Risk Score: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_matchedKeyCount">"Matched key count: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_maximumRiskScore">"Maximum risk score %1$s"</string> + <string name="test_api_exposure_summary_headline">"Exposure Windows"</string> <!-- NOTR --> <string name="test_api_body_my_keys">"My keys (count: %1$d)"</string> <!-- NOTR --> diff --git a/Corona-Warn-App/src/main/res/values-pl/strings.xml b/Corona-Warn-App/src/main/res/values-pl/strings.xml index 657e14803b0f9b1ef31c6b20af13af4fcc91f7ff..e6583c9af191c2f552c6c04953312988958f0e7f 100644 --- a/Corona-Warn-App/src/main/res/values-pl/strings.xml +++ b/Corona-Warn-App/src/main/res/values-pl/strings.xml @@ -1257,17 +1257,7 @@ <!-- NOTR --> <string name="test_api_button_check_exposure">"Check Exposure Summary"</string> <!-- NOTR --> - <string name="test_api_exposure_summary_headline">"Exposure summary"</string> - <!-- NOTR --> - <string name="test_api_body_daysSinceLastExposure">"Days since last exposure: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_attenuation">"Attenuation Durations in Minutes: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_summation_risk">"Summation Risk Score: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_matchedKeyCount">"Matched key count: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_maximumRiskScore">"Maximum risk score %1$s"</string> + <string name="test_api_exposure_summary_headline">"Exposure Windows"</string> <!-- NOTR --> <string name="test_api_body_my_keys">"My keys (count: %1$d)"</string> <!-- NOTR --> diff --git a/Corona-Warn-App/src/main/res/values-ro/strings.xml b/Corona-Warn-App/src/main/res/values-ro/strings.xml index 1f52872f8b5de27c4bd6b3a0b8323732e798ef12..3bcca1384b7d4d00442d9525c768e0273cbdac85 100644 --- a/Corona-Warn-App/src/main/res/values-ro/strings.xml +++ b/Corona-Warn-App/src/main/res/values-ro/strings.xml @@ -1257,17 +1257,7 @@ <!-- NOTR --> <string name="test_api_button_check_exposure">"Check Exposure Summary"</string> <!-- NOTR --> - <string name="test_api_exposure_summary_headline">"Exposure summary"</string> - <!-- NOTR --> - <string name="test_api_body_daysSinceLastExposure">"Days since last exposure: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_attenuation">"Attenuation Durations in Minutes: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_summation_risk">"Summation Risk Score: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_matchedKeyCount">"Matched key count: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_maximumRiskScore">"Maximum risk score %1$s"</string> + <string name="test_api_exposure_summary_headline">"Exposure Windows"</string> <!-- NOTR --> <string name="test_api_body_my_keys">"My keys (count: %1$d)"</string> <!-- NOTR --> diff --git a/Corona-Warn-App/src/main/res/values-tr/strings.xml b/Corona-Warn-App/src/main/res/values-tr/strings.xml index 2a391bcd3bd1f95dc11bdd464ec5dfc5d2719de3..2af4f639b65779e8db88d69aec94612aa733ebb8 100644 --- a/Corona-Warn-App/src/main/res/values-tr/strings.xml +++ b/Corona-Warn-App/src/main/res/values-tr/strings.xml @@ -1257,17 +1257,7 @@ <!-- NOTR --> <string name="test_api_button_check_exposure">"Check Exposure Summary"</string> <!-- NOTR --> - <string name="test_api_exposure_summary_headline">"Exposure summary"</string> - <!-- NOTR --> - <string name="test_api_body_daysSinceLastExposure">"Days since last exposure: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_attenuation">"Attenuation Durations in Minutes: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_summation_risk">"Summation Risk Score: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_matchedKeyCount">"Matched key count: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_maximumRiskScore">"Maximum risk score %1$s"</string> + <string name="test_api_exposure_summary_headline">"Exposure Windows"</string> <!-- NOTR --> <string name="test_api_body_my_keys">"My keys (count: %1$d)"</string> <!-- NOTR --> diff --git a/Corona-Warn-App/src/main/res/values/strings.xml b/Corona-Warn-App/src/main/res/values/strings.xml index d120c2c1a4bc91089abbbf63710b9e9091829397..b76608adbad8e9fdfeec178b7849432f9c1ab914 100644 --- a/Corona-Warn-App/src/main/res/values/strings.xml +++ b/Corona-Warn-App/src/main/res/values/strings.xml @@ -1263,17 +1263,7 @@ <!-- NOTR --> <string name="test_api_button_check_exposure">"Check Exposure Summary"</string> <!-- NOTR --> - <string name="test_api_exposure_summary_headline">"Exposure summary"</string> - <!-- NOTR --> - <string name="test_api_body_daysSinceLastExposure">"Days since last exposure: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_attenuation">"Attenuation Durations in Minutes: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_summation_risk">"Summation Risk Score: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_matchedKeyCount">"Matched key count: %1$s"</string> - <!-- NOTR --> - <string name="test_api_body_maximumRiskScore">"Maximum risk score %1$s"</string> + <string name="test_api_exposure_summary_headline">"Exposure Windows"</string> <!-- NOTR --> <string name="test_api_body_my_keys">"My keys (count: %1$d)"</string> <!-- NOTR --> diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/modules/diagnosiskeyprovider/DefaultDiagnosisKeyProviderTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/modules/diagnosiskeyprovider/DefaultDiagnosisKeyProviderTest.kt index 0082ef6707c2149cc6c5f1ae2177fd4985af7a63..a8fdf34442f6c1a6992295762b66324d1c49462e 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/modules/diagnosiskeyprovider/DefaultDiagnosisKeyProviderTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/modules/diagnosiskeyprovider/DefaultDiagnosisKeyProviderTest.kt @@ -2,6 +2,7 @@ package de.rki.coronawarnapp.nearby.modules.diagnosiskeyprovider import com.google.android.gms.nearby.exposurenotification.ExposureNotificationClient import de.rki.coronawarnapp.nearby.modules.version.ENFVersion +import de.rki.coronawarnapp.nearby.modules.version.OutdatedENFVersionException import io.kotest.matchers.shouldBe import io.mockk.MockKAnnotations import io.mockk.clearAllMocks @@ -33,7 +34,7 @@ class DefaultDiagnosisKeyProviderTest : BaseTest() { coEvery { googleENFClient.provideDiagnosisKeys(any<List<File>>()) } returns MockGMSTask.forValue(null) - coEvery { enfVersion.requireAtLeast(any()) } returns Unit + coEvery { enfVersion.requireMinimumVersion(any()) } returns Unit } @AfterEach @@ -49,11 +50,14 @@ class DefaultDiagnosisKeyProviderTest : BaseTest() { @Test fun `provide diagnosis keys with outdated ENF versions`() { - coEvery { enfVersion.requireAtLeast(any()) } throws ENFVersion.Companion.UnsupportedENFVersionException() + coEvery { enfVersion.requireMinimumVersion(any()) } throws OutdatedENFVersionException( + current = 9000, + required = 5000 + ) val provider = createProvider() - assertThrows<ENFVersion.Companion.UnsupportedENFVersionException> { + assertThrows<OutdatedENFVersionException> { runBlockingTest { provider.provideDiagnosisKeys(exampleKeyFiles) } shouldBe false } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/modules/version/DefaultENFVersionTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/modules/version/DefaultENFVersionTest.kt index 4f30d19a1f98a02a17d0650111b8fedb6ddae915..6d9e563b93dda599d64478739717998339f72d63 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/modules/version/DefaultENFVersionTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/modules/version/DefaultENFVersionTest.kt @@ -2,21 +2,21 @@ package de.rki.coronawarnapp.nearby.modules.version import com.google.android.gms.common.api.ApiException import com.google.android.gms.common.api.CommonStatusCodes.API_NOT_CONNECTED +import com.google.android.gms.common.api.CommonStatusCodes.INTERNAL_ERROR import com.google.android.gms.common.api.Status import com.google.android.gms.nearby.exposurenotification.ExposureNotificationClient +import io.kotest.assertions.throwables.shouldNotThrowAny +import io.kotest.assertions.throwables.shouldThrow import io.kotest.matchers.shouldBe -import io.mockk.Called import io.mockk.MockKAnnotations import io.mockk.clearAllMocks import io.mockk.every import io.mockk.impl.annotations.MockK -import io.mockk.verify import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.runBlockingTest import org.junit.jupiter.api.AfterEach import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test -import org.junit.jupiter.api.assertThrows import testhelpers.gms.MockGMSTask @ExperimentalCoroutinesApi @@ -39,61 +39,74 @@ internal class DefaultENFVersionTest { ) @Test - fun `isAbove API v16 is true for v17`() { + fun `current version is newer than the required version`() { every { client.version } returns MockGMSTask.forValue(17000000L) runBlockingTest { - createInstance().isAtLeast(ENFVersion.V16) shouldBe true + createInstance().apply { + getENFClientVersion() shouldBe 17000000L + shouldNotThrowAny { + requireMinimumVersion(ENFVersion.V1_6) + } + } } } @Test - fun `isAbove API v16 is false for v15`() { + fun `current version is older than the required version`() { every { client.version } returns MockGMSTask.forValue(15000000L) runBlockingTest { - createInstance().isAtLeast(ENFVersion.V16) shouldBe false - } - } + createInstance().apply { + getENFClientVersion() shouldBe 15000000L - @Test - fun `isAbove API v16 throws IllegalArgument for invalid version`() { - assertThrows<IllegalArgumentException> { - runBlockingTest { - createInstance().isAtLeast(1L) + shouldThrow<OutdatedENFVersionException> { + requireMinimumVersion(ENFVersion.V1_6) + } } - verify { client.version wasNot Called } } } @Test - fun `isAbove API v16 false when APIException for too low version`() { - every { client.version } returns MockGMSTask.forError(ApiException(Status(API_NOT_CONNECTED))) + fun `current version is equal to the required version`() { + every { client.version } returns MockGMSTask.forValue(16000000L) runBlockingTest { - createInstance().isAtLeast(ENFVersion.V16) shouldBe false + createInstance().apply { + getENFClientVersion() shouldBe ENFVersion.V1_6 + shouldNotThrowAny { + requireMinimumVersion(ENFVersion.V1_6) + } + } } } @Test - fun `require API v16 throws UnsupportedENFVersionException for v15`() { - every { client.version } returns MockGMSTask.forValue(ENFVersion.V15) + fun `API_NOT_CONNECTED exceptions are not treated as failures`() { + every { client.version } returns MockGMSTask.forError(ApiException(Status(API_NOT_CONNECTED))) - assertThrows<ENFVersion.Companion.UnsupportedENFVersionException> { - runBlockingTest { - createInstance().requireAtLeast(ENFVersion.V16) + runBlockingTest { + createInstance().apply { + getENFClientVersion() shouldBe null + shouldNotThrowAny { + requireMinimumVersion(ENFVersion.V1_6) + } } } } @Test - fun `require API v15 does not throw for v16`() { - every { client.version } returns MockGMSTask.forValue(ENFVersion.V16) + fun `rethrows unexpected exceptions`() { + every { client.version } returns MockGMSTask.forError(ApiException(Status(INTERNAL_ERROR))) runBlockingTest { - createInstance().requireAtLeast(ENFVersion.V15) - } + createInstance().apply { + getENFClientVersion() shouldBe null - verify { client.version } + shouldThrow<ApiException> { + requireMinimumVersion(ENFVersion.V1_6) + } + } + } } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/windows/ExposureWindowsCalculationTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/windows/ExposureWindowsCalculationTest.kt index ece66bfcb20995de6a14d2bc80487d8022177d2b..4af8bfe870a7f39adc6f71b9d1943fc93c6843ec 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/windows/ExposureWindowsCalculationTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/nearby/windows/ExposureWindowsCalculationTest.kt @@ -100,7 +100,7 @@ class ExposureWindowsCalculationTest : BaseTest() { debugLog("Test cases checked. Total count: ${json.testCases.size}") // 3 - Mock calculation configuration and create default risk level with it - jsonToConfiguration(json.defaultRiskCalculationConfiguration) + setupTestConfiguration(json.defaultRiskCalculationConfiguration) coEvery { appConfigProvider.getAppConfig() } returns testConfig every { appConfigProvider.currentConfig } returns flow { testConfig } logConfiguration(testConfig) @@ -296,7 +296,7 @@ class ExposureWindowsCalculationTest : BaseTest() { debugLog(result.toString(), logLevel) } - private fun jsonToConfiguration(json: DefaultRiskCalculationConfiguration) { + private fun setupTestConfiguration(json: DefaultRiskCalculationConfiguration) { testConfig = ConfigDataContainer( serverTime = Instant.now(),