From fccc32a84f2349631a08d09da5f751bce8f94ee3 Mon Sep 17 00:00:00 2001
From: Philipp Woessner <64482866+pwoessner@users.noreply.github.com>
Date: Tue, 7 Jul 2020 18:40:39 +0200
Subject: [PATCH] Fixed the outdated check for the locally persisted files
 (#839)

* remove all files from the cache if they are no longer present in the server date index

* Set version to 1.0.5 for hotfix release
---
 .../storage/keycache/KeyCacheRepository.kt      | 17 ++++++++++-------
 .../coronawarnapp/util/CachedKeyFileHolder.kt   |  4 +++-
 .../util/CachedKeyFileHolderTest.kt             |  4 ++--
 3 files changed, 15 insertions(+), 10 deletions(-)

diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/keycache/KeyCacheRepository.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/keycache/KeyCacheRepository.kt
index 92fb64795..243a5b300 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/keycache/KeyCacheRepository.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/storage/keycache/KeyCacheRepository.kt
@@ -21,7 +21,7 @@ package de.rki.coronawarnapp.storage.keycache
 
 import android.content.Context
 import de.rki.coronawarnapp.storage.AppDatabase
-import de.rki.coronawarnapp.storage.FileStorageHelper.isOutdated
+import timber.log.Timber
 import java.io.File
 import java.net.URI
 
@@ -58,13 +58,16 @@ class KeyCacheRepository(private val keyCacheDao: KeyCacheDao) {
         }
     )
 
-    suspend fun deleteOutdatedEntries() = keyCacheDao.getAllEntries().forEach {
-        val file = File(it.path)
-        if (file.isOutdated() || !file.exists()) {
-            deleteFileForEntry(it)
-            keyCacheDao.deleteEntry(it)
+    suspend fun deleteOutdatedEntries(validEntries: List<String>) =
+        keyCacheDao.getAllEntries().forEach {
+            Timber.v("valid entries for cache from server: $validEntries")
+            val file = File(it.path)
+            if (!validEntries.contains(it.id) || !file.exists()) {
+                Timber.w("${it.id} will be deleted from the cache")
+                deleteFileForEntry(it)
+                keyCacheDao.deleteEntry(it)
+            }
         }
-    }
 
     private fun deleteFileForEntry(entry: KeyCacheEntity) = File(entry.path).delete()
 
diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CachedKeyFileHolder.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CachedKeyFileHolder.kt
index be5b2edf7..15437cf47 100644
--- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CachedKeyFileHolder.kt
+++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/util/CachedKeyFileHolder.kt
@@ -91,9 +91,11 @@ object CachedKeyFileHolder {
                 )
             }
         } else {
+            val uuidListFromServer = serverDates
+                .map { getURLForDay(it).generateCacheKeyFromString() }
             // queries will be executed after the "query plan" was set
             val deferredQueries: MutableCollection<Deferred<Any>> = mutableListOf()
-            keyCache.deleteOutdatedEntries()
+            keyCache.deleteOutdatedEntries(uuidListFromServer)
             val missingDays = getMissingDaysFromDiff(serverDates)
             if (missingDays.isNotEmpty()) {
                 // we have a date difference
diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/CachedKeyFileHolderTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/CachedKeyFileHolderTest.kt
index d796b4c7e..b03e57dd7 100644
--- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/CachedKeyFileHolderTest.kt
+++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/util/CachedKeyFileHolderTest.kt
@@ -37,7 +37,7 @@ class CachedKeyFileHolderTest {
         every { CoronaWarnApplication.getAppContext() } returns context
         every { KeyCacheRepository.getDateRepository(any()) } returns keyCacheRepository
         mockkObject(CachedKeyFileHolder)
-        coEvery { keyCacheRepository.deleteOutdatedEntries() } just Runs
+        coEvery { keyCacheRepository.deleteOutdatedEntries(any()) } just Runs
     }
 
     /**
@@ -60,7 +60,7 @@ class CachedKeyFileHolderTest {
             coVerifyOrder {
                 CachedKeyFileHolder.asyncFetchFiles(date)
                 CachedKeyFileHolder["getDatesFromServer"]()
-                keyCacheRepository.deleteOutdatedEntries()
+                keyCacheRepository.deleteOutdatedEntries(any())
                 CachedKeyFileHolder["getMissingDaysFromDiff"](arrayListOf<String>())
                 keyCacheRepository.getDates()
                 keyCacheRepository.getFilesFromEntries()
-- 
GitLab