From 7b52db331cb0e860d8d79367eebba1aa557e72b5 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Thu, 24 Aug 2023 17:07:53 +0200 Subject: [PATCH] [db] Catch NotFoundException in RepoAdder --- .../main/java/org/fdroid/repo/RepoAdder.kt | 4 ++ .../java/org/fdroid/repo/RepoAdderTest.kt | 48 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/libs/database/src/main/java/org/fdroid/repo/RepoAdder.kt b/libs/database/src/main/java/org/fdroid/repo/RepoAdder.kt index 37d3ece5b..252ba0268 100644 --- a/libs/database/src/main/java/org/fdroid/repo/RepoAdder.kt +++ b/libs/database/src/main/java/org/fdroid/repo/RepoAdder.kt @@ -177,6 +177,10 @@ internal class RepoAdder( log.error(e) { "Error fetching repo." } addRepoState.value = AddRepoError(INVALID_INDEX, e) return + } catch (e: NotFoundException) { // v1 repos can also have 404 + log.error(e) { "Error fetching repo." } + addRepoState.value = AddRepoError(INVALID_INDEX, e) + return } // set final result val finalRepo = receivedRepo diff --git a/libs/database/src/test/java/org/fdroid/repo/RepoAdderTest.kt b/libs/database/src/test/java/org/fdroid/repo/RepoAdderTest.kt index 43338a0be..7f714c367 100644 --- a/libs/database/src/test/java/org/fdroid/repo/RepoAdderTest.kt +++ b/libs/database/src/test/java/org/fdroid/repo/RepoAdderTest.kt @@ -559,6 +559,54 @@ internal class RepoAdderTest { assertEquals(63, addRepoState.apps.size) } + @Test + fun testDownloadV1ThrowsNotFoundException() = runTest { + val url = "https://example.org/repo" + val jarFile = folder.newFile() + + every { tempFileProvider.createTempFile() } returns jarFile + every { + downloaderFactory.create( + repo = match { it.address == url && it.formatVersion == IndexFormatVersion.TWO }, + uri = Uri.parse("$url/entry.jar"), + indexFile = any(), + destFile = jarFile, + ) + } returns downloader + every { downloader.download() } throws NotFoundException() + + every { + downloaderFactory.create( + repo = match { it.address == url && it.formatVersion == IndexFormatVersion.ONE }, + uri = Uri.parse("$url/index-v1.jar"), + indexFile = any(), + destFile = jarFile, + ) + } returns downloader + every { downloader.download() } throws NotFoundException() + + repoAdder.addRepoState.test { + assertIs(awaitItem()) + + repoAdder.fetchRepository( + url = url, + username = null, + password = null, + proxy = null + ) + + val state1 = awaitItem() + assertIs(state1) + assertNull(state1.repo) + assertTrue(state1.apps.isEmpty()) + assertFalse(state1.canAdd) + + val state2 = awaitItem() + assertTrue(state2 is AddRepoError, "$state2") + assertEquals(INVALID_INDEX, state2.errorType) + } + } + private fun expectDownloadOfMinRepo(url: String) { val urlTrimmed = url.trimEnd('/') val jarFile = folder.newFile()