From 81910bf7499d6054d21a0b00a419c2d12e9eee18 Mon Sep 17 00:00:00 2001 From: Peter Serwylo Date: Wed, 29 Jun 2016 07:08:13 +1000 Subject: [PATCH] Added tests for "orphaned apks" that must be removed after disabling a repo. --- .../java/org/fdroid/fdroid/RepoUpdater.java | 10 ++-- .../AcceptableMultiRepoUpdaterTest.java | 52 +++++++++++++++++++ .../fdroid/fdroid/MultiRepoUpdaterTest.java | 20 +++---- 3 files changed, 66 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java b/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java index 3df518df1..0cd108ac1 100644 --- a/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java +++ b/app/src/main/java/org/fdroid/fdroid/RepoUpdater.java @@ -199,10 +199,12 @@ public class RepoUpdater { reader.setContentHandler(repoXMLHandler); reader.parse(new InputSource(indexInputStream)); - long timestamp = repoDetailsToSave.getAsLong(RepoTable.Cols.TIMESTAMP); - if (timestamp < repo.timestamp) { - throw new UpdateException(repo, "index.jar is older that current index! " - + timestamp + " < " + repo.timestamp); + if (repoDetailsToSave.containsKey(RepoTable.Cols.TIMESTAMP)) { + long timestamp = repoDetailsToSave.getAsLong(RepoTable.Cols.TIMESTAMP); + if (timestamp < repo.timestamp) { + throw new UpdateException(repo, "index.jar is older that current index! " + + timestamp + " < " + repo.timestamp); + } } signingCertFromJar = getSigningCertFromJar(indexEntry); diff --git a/app/src/test/java/org/fdroid/fdroid/AcceptableMultiRepoUpdaterTest.java b/app/src/test/java/org/fdroid/fdroid/AcceptableMultiRepoUpdaterTest.java index d159c6018..ef5a4f203 100644 --- a/app/src/test/java/org/fdroid/fdroid/AcceptableMultiRepoUpdaterTest.java +++ b/app/src/test/java/org/fdroid/fdroid/AcceptableMultiRepoUpdaterTest.java @@ -1,6 +1,9 @@ package org.fdroid.fdroid; +import android.content.ContentValues; +import android.net.Uri; +import android.support.annotation.NonNull; import android.util.Log; import org.fdroid.fdroid.RepoUpdater.UpdateException; @@ -14,6 +17,7 @@ import org.robolectric.annotation.Config; import java.util.List; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; @Config(constants = BuildConfig.class) @RunWith(RobolectricGradleTestRunner.class) @@ -79,4 +83,52 @@ public class AcceptableMultiRepoUpdaterTest extends MultiRepoUpdaterTest { } } + @NonNull + private Repo getMainRepo() { + Repo repo = RepoProvider.Helper.findByAddress(context, REPO_MAIN_URI); + assertNotNull(repo); + return repo; + } + + @NonNull + private Repo getArchiveRepo() { + Repo repo = RepoProvider.Helper.findByAddress(context, REPO_ARCHIVE_URI); + assertNotNull(repo); + return repo; + } + + @NonNull + private Repo getConflictingRepo() { + Repo repo = RepoProvider.Helper.findByAddress(context, REPO_CONFLICTING_URI); + assertNotNull(repo); + return repo; + } + + @Test + public void testOrphanedApps() throws UpdateException { + assertEmpty(); + + updateArchive(); + updateMain(); + updateConflicting(); + + assertSomewhatAcceptable(); + + disableRepo(getArchiveRepo()); + disableRepo(getMainRepo()); + disableRepo(getConflictingRepo()); + + RepoProvider.Helper.purgeApps(context, getArchiveRepo()); + RepoProvider.Helper.purgeApps(context, getMainRepo()); + RepoProvider.Helper.purgeApps(context, getConflictingRepo()); + + assertEmpty(); + } + + private void disableRepo(Repo repo) { + ContentValues values = new ContentValues(1); + values.put(RepoProvider.DataColumns.IN_USE, 0); + RepoProvider.Helper.update(context, repo, values); + } + } diff --git a/app/src/test/java/org/fdroid/fdroid/MultiRepoUpdaterTest.java b/app/src/test/java/org/fdroid/fdroid/MultiRepoUpdaterTest.java index 9aa0785e4..3b2468b1f 100644 --- a/app/src/test/java/org/fdroid/fdroid/MultiRepoUpdaterTest.java +++ b/app/src/test/java/org/fdroid/fdroid/MultiRepoUpdaterTest.java @@ -33,9 +33,9 @@ public abstract class MultiRepoUpdaterTest extends FDroidProviderTest { protected static final String REPO_ARCHIVE = "Test F-Droid repo (Archive)"; protected static final String REPO_CONFLICTING = "Test F-Droid repo with different apps"; - protected RepoUpdater conflictingRepoUpdater; - protected RepoUpdater mainRepoUpdater; - protected RepoUpdater archiveRepoUpdater; + protected static final String REPO_MAIN_URI = "https://f-droid.org/repo"; + protected static final String REPO_ARCHIVE_URI = "https://f-droid.org/archive"; + protected static final String REPO_CONFLICTING_URI = "https://example.com/conflicting/fdroid/repo"; private static final String PUB_KEY = "3082050b308202f3a003020102020420d8f212300d06092a864886f70d01010b050030363110300e0603" + @@ -79,10 +79,6 @@ public abstract class MultiRepoUpdaterTest extends FDroidProviderTest { RepoProvider.Helper.remove(context, 3); RepoProvider.Helper.remove(context, 4); - conflictingRepoUpdater = createUpdater(REPO_CONFLICTING, context); - mainRepoUpdater = createUpdater(REPO_MAIN, context); - archiveRepoUpdater = createUpdater(REPO_ARCHIVE, context); - Preferences.setup(context); } @@ -157,10 +153,10 @@ public abstract class MultiRepoUpdaterTest extends FDroidProviderTest { } } - private RepoUpdater createUpdater(String name, Context context) { + private RepoUpdater createUpdater(String name, String uri, Context context) { Repo repo = new Repo(); repo.signingCertificate = PUB_KEY; - repo.address = "https://fake.url/" + UUID.randomUUID().toString() + "/fdroid/repo"; + repo.address = uri; repo.name = name; ContentValues values = new ContentValues(2); @@ -176,15 +172,15 @@ public abstract class MultiRepoUpdaterTest extends FDroidProviderTest { } protected boolean updateConflicting() throws UpdateException { - return updateRepo(conflictingRepoUpdater, "multiRepo.conflicting.jar"); + return updateRepo(createUpdater(REPO_CONFLICTING, REPO_CONFLICTING_URI, context), "multiRepo.conflicting.jar"); } protected boolean updateMain() throws UpdateException { - return updateRepo(mainRepoUpdater, "multiRepo.normal.jar"); + return updateRepo(createUpdater(REPO_MAIN, REPO_MAIN_URI, context), "multiRepo.normal.jar"); } protected boolean updateArchive() throws UpdateException { - return updateRepo(archiveRepoUpdater, "multiRepo.archive.jar"); + return updateRepo(createUpdater(REPO_ARCHIVE, REPO_ARCHIVE_URI, context), "multiRepo.archive.jar"); } private boolean updateRepo(RepoUpdater updater, String indexJarPath) throws UpdateException {