diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/AppConfigProvider.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/AppConfigProvider.kt index 796f19a123ce9fd8886172f8389ebfb122aff32a..47810d4506d7d8d10215e7d5991730b99325e99c 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/AppConfigProvider.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/AppConfigProvider.kt @@ -58,7 +58,12 @@ class AppConfigProvider @Inject constructor( downloadAppConfig() } catch (e: Exception) { Timber.w(e, "Failed to download latest AppConfig.") - null + if (configStorage.isAppConfigAvailable) { + null + } else { + Timber.e("No fallback available, rethrowing!") + throw e + } } val newConfigParsed = try { diff --git a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/AppConfigStorage.kt b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/AppConfigStorage.kt index 49bbca096850f67457e2cb292670f75ceab62d91..44edccd9c44b9163bcb367cd070e64fe7c4e38fb 100644 --- a/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/AppConfigStorage.kt +++ b/Corona-Warn-App/src/main/java/de/rki/coronawarnapp/appconfig/AppConfigStorage.kt @@ -13,6 +13,9 @@ class AppConfigStorage @Inject constructor( private val configDir = File(context.filesDir, "appconfig_storage") private val configFile = File(configDir, "appconfig") + val isAppConfigAvailable: Boolean + get() = configFile.exists() && configFile.length() > MIN_VALID_CONFIG_BYTES + var appConfigRaw: ByteArray? get() { Timber.v("get() AppConfig") @@ -36,4 +39,9 @@ class AppConfigStorage @Inject constructor( configFile.delete() } } + + companion object { + // The normal config is ~512B+, we just need to check for a non 0 value, 128 is fine. + private const val MIN_VALID_CONFIG_BYTES = 128 + } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/AppConfigProviderTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/AppConfigProviderTest.kt index b61f6775769bbd8f8055cd59a4c41bf9219ced86..e744b2fc360cc3214b41a46243014e1b33ef77b6 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/AppConfigProviderTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/AppConfigProviderTest.kt @@ -38,6 +38,7 @@ class AppConfigProviderTest : BaseIOTest() { testDir.mkdirs() testDir.exists() shouldBe true + every { appConfigStorage.isAppConfigAvailable } answers { mockConfigStorage != null } every { appConfigStorage.appConfigRaw } answers { mockConfigStorage } every { appConfigStorage.appConfigRaw = any() } answers { mockConfigStorage = arg(0) } } diff --git a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/AppConfigStorageTest.kt b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/AppConfigStorageTest.kt index aaecb0b01a8a7debd996fda33db9e6c59d62c409..dd637fbb7269ad1f404b5c58282f9a6f405c1a8b 100644 --- a/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/AppConfigStorageTest.kt +++ b/Corona-Warn-App/src/test/java/de/rki/coronawarnapp/appconfig/AppConfigStorageTest.kt @@ -36,6 +36,21 @@ class AppConfigStorageTest : BaseIOTest() { private fun createStorage() = AppConfigStorage(context) + @Test + fun `config availability is determined by file existence and min size`() { + storageDir.mkdirs() + val storage = createStorage() + storage.isAppConfigAvailable shouldBe false + configPath.createNewFile() + storage.isAppConfigAvailable shouldBe false + + configPath.writeBytes(ByteArray(128) { 1 }) + storage.isAppConfigAvailable shouldBe false + + configPath.writeBytes(ByteArray(129) { 1 }) + storage.isAppConfigAvailable shouldBe true + } + @Test fun `simple read and write config`() { configPath.exists() shouldBe false