diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/HourPackageSyncTool.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/HourPackageSyncTool.kt index a15a2fa6969f165ac04109a4a55e3022a8bf878a..6cd2b736817058246ad9515cab0c3e09309f776c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/HourPackageSyncTool.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/diagnosiskeys/download/HourPackageSyncTool.kt @@ -9,6 +9,7 @@ import de.rki.coronawarnapp.diagnosiskeys.server.LocationCode import de.rki.coronawarnapp.diagnosiskeys.storage.CachedKey import de.rki.coronawarnapp.diagnosiskeys.storage.CachedKeyInfo.Type import de.rki.coronawarnapp.diagnosiskeys.storage.KeyCacheRepository +import de.rki.coronawarnapp.exception.http.NetworkConnectTimeoutException import de.rki.coronawarnapp.storage.DeviceStorage import de.rki.coronawarnapp.util.TimeAndDateExtensions.toLocalDate import de.rki.coronawarnapp.util.TimeStamper @@ -51,7 +52,12 @@ class HourPackageSyncTool @Inject constructor( val keysWereRevoked = revokeCachedKeys(downloadConfig.revokedHourPackages) val missingHours = targetLocations.mapNotNull { - determineMissingHours(it, forceIndexLookup || keysWereRevoked) + try { + determineMissingHours(it, forceIndexLookup || keysWereRevoked) + } catch (e: NetworkConnectTimeoutException) { + Timber.tag(TAG).i("missing hours sync failed due to network timeout") + return SyncResult(successful = false, newPackages = emptyList()) + } } if (missingHours.isEmpty()) { Timber.tag(TAG).i("There were no missing hours.") @@ -142,6 +148,9 @@ class HourPackageSyncTool @Inject constructor( val availableHours = run { val hoursToday = try { keyServer.getHourIndex(location, today) + } catch (e: NetworkConnectTimeoutException) { + Timber.tag(TAG).e(e, "Failed to get today's hour due - not going to delete the cache.") + throw e } catch (e: IOException) { Timber.tag(TAG).e(e, "failed to get today's hour index.") emptyList() diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/download/HourPackageSyncToolTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/download/HourPackageSyncToolTest.kt index f6dae8e55b255f6e8cb3d71bd3c8a7577cb88466..5e50eeaedd865915c26891ecd384e711160b6a7e 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/download/HourPackageSyncToolTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/diagnosiskeys/download/HourPackageSyncToolTest.kt @@ -4,6 +4,7 @@ import de.rki.coronawarnapp.appconfig.mapping.RevokedKeyPackage import de.rki.coronawarnapp.diagnosiskeys.storage.CachedKey import de.rki.coronawarnapp.diagnosiskeys.storage.CachedKeyInfo import de.rki.coronawarnapp.diagnosiskeys.storage.CachedKeyInfo.Type +import de.rki.coronawarnapp.exception.http.NetworkConnectTimeoutException import io.kotest.matchers.shouldBe import io.mockk.coEvery import io.mockk.coVerify @@ -258,4 +259,18 @@ class HourPackageSyncToolTest : CommonSyncToolTest() { coVerify(exactly = 0) { keyServer.getHourIndex("EUR".loc, "2020-01-04".day) } } + + @Test + fun `network connection time out does not clear the cache and returns an unsuccessful result`() = runBlockingTest { + coEvery { keyServer.getHourIndex(any(), any()) } throws NetworkConnectTimeoutException() + + val instance = createInstance() + instance.syncMissingHourPackages(listOf("EUR".loc), false) shouldBe BaseKeyPackageSyncTool.SyncResult( + successful = false, + newPackages = emptyList() + ) + + coVerify(exactly = 1) { keyServer.getHourIndex("EUR".loc, "2020-01-04".day) } + coVerify(exactly = 0) { keyCache.delete(any()) } + } }