package org.fdroid.fdroid.updater; import android.content.ContentValues; import android.support.annotation.NonNull; import android.util.Log; import org.fdroid.fdroid.BuildConfig; import org.fdroid.fdroid.RepoUpdater.UpdateException; import org.fdroid.fdroid.data.Repo; import org.fdroid.fdroid.data.RepoProvider; import org.fdroid.fdroid.data.Schema.RepoTable.Cols; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricGradleTestRunner; import org.robolectric.annotation.Config; import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; // TODO: Use sdk=24 when Robolectric supports this @Config(constants = BuildConfig.class, sdk = 23) @RunWith(RobolectricGradleTestRunner.class) public class AcceptableMultiRepoUpdaterTest extends MultiRepoUpdaterTest { private static final String TAG = "AcceptableMultiRepoTest"; private void assertSomewhatAcceptable() { Log.i(TAG, "Asserting at least one versions of each .apk is in index."); List<Repo> repos = RepoProvider.Helper.all(context); assertEquals("Repos", 3, repos.size()); assertApp2048(); assertAppAdaway(); assertAppAdbWireless(); assertAppIcsImport(); } @Test public void testAcceptableConflictingThenMainThenArchive() throws UpdateException { assertEmpty(); updateConflicting(); updateMain(); updateArchive(); assertSomewhatAcceptable(); } @Test public void testAcceptableConflictingThenArchiveThenMain() throws UpdateException { assertEmpty(); updateConflicting(); updateArchive(); updateMain(); assertSomewhatAcceptable(); } @Test public void testAcceptableArchiveThenMainThenConflicting() throws UpdateException { assertEmpty(); updateArchive(); updateMain(); updateConflicting(); assertSomewhatAcceptable(); } @Test public void testAcceptableArchiveThenConflictingThenMain() throws UpdateException { assertEmpty(); updateArchive(); updateConflicting(); updateMain(); assertSomewhatAcceptable(); } @Test public void testAcceptableMainThenArchiveThenConflicting() throws UpdateException { assertEmpty(); updateMain(); updateArchive(); updateConflicting(); assertSomewhatAcceptable(); } @Test public void testAcceptableMainThenConflictingThenArchive() throws UpdateException { assertEmpty(); updateMain(); updateConflicting(); updateArchive(); assertSomewhatAcceptable(); } @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(Cols.IN_USE, 0); RepoProvider.Helper.update(context, repo, values); } }