Remove unused test code.
Many of the `Mock*` classes are there to deal with idiosyncrosies of the Android SDK, including `final`/package local/`@Hide` annotations/etc. They are no longer required with robolectric tests.
This commit is contained in:
parent
839ebebd87
commit
60451a050f
@ -1,29 +0,0 @@
|
|||||||
package mock;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
|
||||||
import android.content.pm.ApplicationInfo;
|
|
||||||
import android.content.pm.PackageInfo;
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
@SuppressLint("ParcelCreator")
|
|
||||||
public class MockApplicationInfo extends ApplicationInfo {
|
|
||||||
|
|
||||||
private final PackageInfo info;
|
|
||||||
|
|
||||||
public MockApplicationInfo(PackageInfo info) {
|
|
||||||
this.info = info;
|
|
||||||
try {
|
|
||||||
this.publicSourceDir = File.createTempFile(info.packageName, "apk").getAbsolutePath();
|
|
||||||
} catch (IOException e) {
|
|
||||||
this.publicSourceDir = "/data/app/" + info.packageName + "-4.apk";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public CharSequence loadLabel(PackageManager pm) {
|
|
||||||
return "Mock app: " + info.packageName;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
package mock;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
import org.fdroid.fdroid.R;
|
|
||||||
|
|
||||||
public class MockCategoryResources extends MockFDroidResources {
|
|
||||||
|
|
||||||
public MockCategoryResources(Context getStringDelegatingContext) {
|
|
||||||
super(getStringDelegatingContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getString(int id) {
|
|
||||||
switch (id) {
|
|
||||||
case R.string.category_All:
|
|
||||||
return "All";
|
|
||||||
case R.string.category_Recently_Updated:
|
|
||||||
return "Recently Updated";
|
|
||||||
case R.string.category_Whats_New:
|
|
||||||
return "Whats New";
|
|
||||||
default:
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,14 +0,0 @@
|
|||||||
package mock;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* As more components are required to test different parts of F-Droid, we can
|
|
||||||
* create them and add them here (and accessors to the parent class).
|
|
||||||
*/
|
|
||||||
public class MockContextEmptyComponents extends MockContextSwappableComponents {
|
|
||||||
|
|
||||||
public MockContextEmptyComponents() {
|
|
||||||
setPackageManager(new MockEmptyPackageManager());
|
|
||||||
setResources(new MockEmptyResources());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,43 +0,0 @@
|
|||||||
package mock;
|
|
||||||
|
|
||||||
import android.content.pm.PackageManager;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.test.mock.MockContentResolver;
|
|
||||||
import android.test.mock.MockContext;
|
|
||||||
|
|
||||||
public class MockContextSwappableComponents extends MockContext {
|
|
||||||
|
|
||||||
private PackageManager packageManager;
|
|
||||||
private Resources resources;
|
|
||||||
private MockContentResolver contentResolver;
|
|
||||||
|
|
||||||
public MockContextSwappableComponents setPackageManager(PackageManager pm) {
|
|
||||||
packageManager = pm;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MockContextSwappableComponents setResources(Resources resources) {
|
|
||||||
this.resources = resources;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MockContextSwappableComponents setContentResolver(MockContentResolver contentResolver) {
|
|
||||||
this.contentResolver = contentResolver;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PackageManager getPackageManager() {
|
|
||||||
return packageManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Resources getResources() {
|
|
||||||
return resources;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public MockContentResolver getContentResolver() {
|
|
||||||
return contentResolver;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,16 +0,0 @@
|
|||||||
package mock;
|
|
||||||
|
|
||||||
import android.content.pm.PackageInfo;
|
|
||||||
import android.test.mock.MockPackageManager;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class MockEmptyPackageManager extends MockPackageManager {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<PackageInfo> getInstalledPackages(int flags) {
|
|
||||||
return new ArrayList<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
package mock;
|
|
||||||
|
|
||||||
import android.test.mock.MockResources;
|
|
||||||
|
|
||||||
public class MockEmptyResources extends MockResources {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getString(int id) {
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
package mock;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.test.mock.MockResources;
|
|
||||||
|
|
||||||
import org.fdroid.fdroid.R;
|
|
||||||
|
|
||||||
public class MockFDroidResources extends MockResources {
|
|
||||||
|
|
||||||
private final Context getStringDelegatingContext;
|
|
||||||
|
|
||||||
public MockFDroidResources(Context getStringDelegatingContext) {
|
|
||||||
this.getStringDelegatingContext = getStringDelegatingContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getString(int id) {
|
|
||||||
return getStringDelegatingContext.getString(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getInteger(int id) {
|
|
||||||
switch (id) {
|
|
||||||
case R.integer.fdroid_repo_inuse:
|
|
||||||
return 1;
|
|
||||||
case R.integer.fdroid_archive_inuse:
|
|
||||||
return 0;
|
|
||||||
case R.integer.fdroid_repo_priority:
|
|
||||||
return 10;
|
|
||||||
case R.integer.fdroid_archive_priority:
|
|
||||||
return 20;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,61 +0,0 @@
|
|||||||
package mock;
|
|
||||||
|
|
||||||
import android.content.pm.ApplicationInfo;
|
|
||||||
import android.content.pm.PackageInfo;
|
|
||||||
import android.test.mock.MockPackageManager;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class MockInstallablePackageManager extends MockPackageManager {
|
|
||||||
|
|
||||||
private final List<PackageInfo> info = new ArrayList<>();
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public List<PackageInfo> getInstalledPackages(int flags) {
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PackageInfo getPackageInfo(String id, int flags) {
|
|
||||||
for (PackageInfo i : info) {
|
|
||||||
if (i.packageName.equals(id)) {
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void install(String id, int version, String versionName) {
|
|
||||||
PackageInfo existing = getPackageInfo(id, 0);
|
|
||||||
if (existing != null) {
|
|
||||||
existing.versionCode = version;
|
|
||||||
existing.versionName = versionName;
|
|
||||||
} else {
|
|
||||||
PackageInfo p = new PackageInfo();
|
|
||||||
p.packageName = id;
|
|
||||||
p.versionCode = version;
|
|
||||||
p.versionName = versionName;
|
|
||||||
p.applicationInfo = new MockApplicationInfo(p);
|
|
||||||
p.lastUpdateTime = System.currentTimeMillis();
|
|
||||||
info.add(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ApplicationInfo getApplicationInfo(String packageName, int flags) throws NameNotFoundException {
|
|
||||||
return new MockApplicationInfo(getPackageInfo(packageName, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void remove(String id) {
|
|
||||||
for (Iterator<PackageInfo> it = info.iterator(); it.hasNext();) {
|
|
||||||
PackageInfo info = it.next();
|
|
||||||
if (info.packageName.equals(id)) {
|
|
||||||
it.remove();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,144 +1,21 @@
|
|||||||
package org.fdroid.fdroid;
|
package org.fdroid.fdroid;
|
||||||
|
|
||||||
import android.app.Instrumentation;
|
import android.app.Instrumentation;
|
||||||
import android.content.ContentResolver;
|
|
||||||
import android.content.ContentValues;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.net.Uri;
|
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
import junit.framework.AssertionFailedError;
|
|
||||||
|
|
||||||
import org.fdroid.fdroid.data.ApkProvider;
|
|
||||||
import org.fdroid.fdroid.data.AppProvider;
|
|
||||||
import org.fdroid.fdroid.data.FDroidProviderTestOld;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class TestUtils {
|
public class TestUtils {
|
||||||
|
|
||||||
private static final String TAG = "TestUtils";
|
private static final String TAG = "TestUtils";
|
||||||
|
|
||||||
public static <T extends Comparable> void assertContainsOnly(List<T> actualList, T[] expectedArray) {
|
|
||||||
List<T> expectedList = new ArrayList<>(expectedArray.length);
|
|
||||||
Collections.addAll(expectedList, expectedArray);
|
|
||||||
assertContainsOnly(actualList, expectedList);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T extends Comparable> void assertContainsOnly(T[] actualArray, List<T> expectedList) {
|
|
||||||
List<T> actualList = new ArrayList<>(actualArray.length);
|
|
||||||
Collections.addAll(actualList, actualArray);
|
|
||||||
assertContainsOnly(actualList, expectedList);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T extends Comparable> void assertContainsOnly(T[] actualArray, T[] expectedArray) {
|
|
||||||
List<T> expectedList = new ArrayList<>(expectedArray.length);
|
|
||||||
Collections.addAll(expectedList, expectedArray);
|
|
||||||
assertContainsOnly(actualArray, expectedList);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T> String listToString(List<T> list) {
|
|
||||||
String string = "[";
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
|
||||||
if (i > 0) {
|
|
||||||
string += ", ";
|
|
||||||
}
|
|
||||||
string += "'" + list.get(i) + "'";
|
|
||||||
}
|
|
||||||
string += "]";
|
|
||||||
return string;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T extends Comparable> void assertContainsOnly(List<T> actualList, List<T> expectedContains) {
|
|
||||||
if (actualList.size() != expectedContains.size()) {
|
|
||||||
String message =
|
|
||||||
"List sizes don't match.\n" +
|
|
||||||
"Expected: " +
|
|
||||||
listToString(expectedContains) + "\n" +
|
|
||||||
"Actual: " +
|
|
||||||
listToString(actualList);
|
|
||||||
throw new AssertionFailedError(message);
|
|
||||||
}
|
|
||||||
for (T required : expectedContains) {
|
|
||||||
boolean containsRequired = false;
|
|
||||||
for (T itemInList : actualList) {
|
|
||||||
if (required.equals(itemInList)) {
|
|
||||||
containsRequired = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!containsRequired) {
|
|
||||||
String message =
|
|
||||||
"List doesn't contain \"" + required + "\".\n" +
|
|
||||||
"Expected: " +
|
|
||||||
listToString(expectedContains) + "\n" +
|
|
||||||
"Actual: " +
|
|
||||||
listToString(actualList);
|
|
||||||
throw new AssertionFailedError(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void insertApp(ContentResolver resolver, String appId, String name) {
|
|
||||||
insertApp(resolver, appId, name, new ContentValues());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void insertApp(ContentResolver resolver, String id, String name, ContentValues additionalValues) {
|
|
||||||
|
|
||||||
ContentValues values = new ContentValues();
|
|
||||||
values.put(AppProvider.DataColumns.PACKAGE_NAME, id);
|
|
||||||
values.put(AppProvider.DataColumns.NAME, name);
|
|
||||||
|
|
||||||
// Required fields (NOT NULL in the database).
|
|
||||||
values.put(AppProvider.DataColumns.SUMMARY, "test summary");
|
|
||||||
values.put(AppProvider.DataColumns.DESCRIPTION, "test description");
|
|
||||||
values.put(AppProvider.DataColumns.LICENSE, "GPL?");
|
|
||||||
values.put(AppProvider.DataColumns.IS_COMPATIBLE, 1);
|
|
||||||
values.put(AppProvider.DataColumns.IGNORE_ALLUPDATES, 0);
|
|
||||||
values.put(AppProvider.DataColumns.IGNORE_THISUPDATE, 0);
|
|
||||||
|
|
||||||
values.putAll(additionalValues);
|
|
||||||
|
|
||||||
Uri uri = AppProvider.getContentUri();
|
|
||||||
|
|
||||||
resolver.insert(uri, values);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Uri insertApk(FDroidProviderTestOld<ApkProvider> providerTest, String id, int versionCode) {
|
|
||||||
return insertApk(providerTest, id, versionCode, new ContentValues());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Uri insertApk(FDroidProviderTestOld<ApkProvider> providerTest, String id, int versionCode, ContentValues additionalValues) {
|
|
||||||
|
|
||||||
ContentValues values = new ContentValues();
|
|
||||||
|
|
||||||
values.put(ApkProvider.DataColumns.PACKAGE_NAME, id);
|
|
||||||
values.put(ApkProvider.DataColumns.VERSION_CODE, versionCode);
|
|
||||||
|
|
||||||
// Required fields (NOT NULL in the database).
|
|
||||||
values.put(ApkProvider.DataColumns.REPO_ID, 1);
|
|
||||||
values.put(ApkProvider.DataColumns.VERSION_NAME, "The good one");
|
|
||||||
values.put(ApkProvider.DataColumns.HASH, "11111111aaaaaaaa");
|
|
||||||
values.put(ApkProvider.DataColumns.NAME, "Test Apk");
|
|
||||||
values.put(ApkProvider.DataColumns.SIZE, 10000);
|
|
||||||
values.put(ApkProvider.DataColumns.IS_COMPATIBLE, 1);
|
|
||||||
|
|
||||||
values.putAll(additionalValues);
|
|
||||||
|
|
||||||
Uri uri = ApkProvider.getContentUri();
|
|
||||||
|
|
||||||
return providerTest.getMockContentResolver().insert(uri, values);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public static File copyAssetToDir(Context context, String assetName, File directory) {
|
public static File copyAssetToDir(Context context, String assetName, File directory) {
|
||||||
File tempFile;
|
File tempFile;
|
||||||
|
@ -1,177 +0,0 @@
|
|||||||
package org.fdroid.fdroid.data;
|
|
||||||
|
|
||||||
import android.content.ContentValues;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.database.Cursor;
|
|
||||||
import android.net.Uri;
|
|
||||||
import android.provider.ContactsContract;
|
|
||||||
import android.test.ProviderTestCase2MockContext;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import mock.MockContextEmptyComponents;
|
|
||||||
import mock.MockContextSwappableComponents;
|
|
||||||
import mock.MockFDroidResources;
|
|
||||||
|
|
||||||
@SuppressWarnings("PMD") // TODO port this to JUnit 4 semantics
|
|
||||||
public abstract class FDroidProviderTestOld<T extends FDroidProvider> extends ProviderTestCase2MockContext<T> {
|
|
||||||
|
|
||||||
private FDroidProvider[] allProviders = {
|
|
||||||
new AppProvider(),
|
|
||||||
new RepoProvider(),
|
|
||||||
new ApkProvider(),
|
|
||||||
new InstalledAppProvider(),
|
|
||||||
};
|
|
||||||
|
|
||||||
private MockContextSwappableComponents swappableContext;
|
|
||||||
|
|
||||||
public FDroidProviderTestOld(Class<T> providerClass, String providerAuthority) {
|
|
||||||
super(providerClass, providerAuthority);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected Resources getMockResources() {
|
|
||||||
return new MockFDroidResources(getContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setUp() throws Exception {
|
|
||||||
super.setUp();
|
|
||||||
|
|
||||||
FDroidProvider.clearDbHelperSingleton();
|
|
||||||
|
|
||||||
// Instantiate all providers other than the one which was already created by the base class.
|
|
||||||
// This is because F-Droid providers tend to perform joins onto tables managed by other
|
|
||||||
// providers, and so we need to be able to insert into those other providers for these
|
|
||||||
// joins to be tested correctly.
|
|
||||||
for (FDroidProvider provider : allProviders) {
|
|
||||||
if (!provider.getName().equals(getProvider().getName())) {
|
|
||||||
provider.attachInfo(getMockContext(), null);
|
|
||||||
getMockContentResolver().addProvider(provider.getName(), provider);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getSwappableContext().setResources(getMockResources());
|
|
||||||
|
|
||||||
// The *Provider.Helper.* functions tend to take a Context as their
|
|
||||||
// first parameter. This context is used to connect to the relevant
|
|
||||||
// content provider. Thus, we need a context that is able to connect
|
|
||||||
// to the mock content resolver, in order to reach the provider
|
|
||||||
// under test.
|
|
||||||
getSwappableContext().setContentResolver(getMockContentResolver());
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testObviouslyInvalidUris() {
|
|
||||||
assertInvalidUri("http://www.google.com");
|
|
||||||
assertInvalidUri(ContactsContract.AUTHORITY_URI);
|
|
||||||
assertInvalidUri("junk");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Context createMockContext(Context delegate) {
|
|
||||||
swappableContext = new MockContextEmptyComponents();
|
|
||||||
return swappableContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
public MockContextSwappableComponents getSwappableContext() {
|
|
||||||
return swappableContext;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void assertCantDelete(Uri uri) {
|
|
||||||
try {
|
|
||||||
getMockContentResolver().delete(uri, null, null);
|
|
||||||
fail();
|
|
||||||
} catch (UnsupportedOperationException e) {
|
|
||||||
} catch (Exception e) {
|
|
||||||
fail();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void assertCantUpdate(Uri uri) {
|
|
||||||
try {
|
|
||||||
getMockContentResolver().update(uri, new ContentValues(), null, null);
|
|
||||||
fail();
|
|
||||||
} catch (UnsupportedOperationException e) {
|
|
||||||
} catch (Exception e) {
|
|
||||||
fail();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void assertInvalidUri(String uri) {
|
|
||||||
assertInvalidUri(Uri.parse(uri));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void assertValidUri(String uri) {
|
|
||||||
assertValidUri(Uri.parse(uri));
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void assertInvalidUri(Uri uri) {
|
|
||||||
try {
|
|
||||||
// Use getProvdider instead of getContentResolver, because the mock
|
|
||||||
// content resolver wont result in the provider we are testing, and
|
|
||||||
// hence we don't get to see how our provider responds to invalid
|
|
||||||
// uris.
|
|
||||||
getProvider().query(uri, getMinimalProjection(), null, null, null);
|
|
||||||
fail();
|
|
||||||
} catch (UnsupportedOperationException e) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void assertValidUri(Uri uri) {
|
|
||||||
Cursor cursor = getMockContentResolver().query(uri, getMinimalProjection(), null, null, null);
|
|
||||||
assertNotNull(cursor);
|
|
||||||
cursor.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void assertValidUri(Uri actualUri, String expectedUri) {
|
|
||||||
assertValidUri(actualUri);
|
|
||||||
assertEquals(expectedUri, actualUri.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Many queries need at least some sort of projection in order to produce
|
|
||||||
* valid SQL. As such, we also need to know about that, so we can provide
|
|
||||||
* helper functions that revolve around the contnet provider under test.
|
|
||||||
*/
|
|
||||||
protected abstract String[] getMinimalProjection();
|
|
||||||
|
|
||||||
protected void assertResultCount(int expectedCount, Uri uri) {
|
|
||||||
Cursor cursor = getMockContentResolver().query(uri, getMinimalProjection(), null, null, null);
|
|
||||||
assertResultCount(expectedCount, cursor);
|
|
||||||
cursor.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void assertResultCount(int expectedCount, List items) {
|
|
||||||
assertNotNull(items);
|
|
||||||
assertEquals(expectedCount, items.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void assertResultCount(int expectedCount, Cursor result) {
|
|
||||||
assertNotNull(result);
|
|
||||||
assertEquals(expectedCount, result.getCount());
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void assertIsInstalledVersionInDb(String appId, int versionCode, String versionName) {
|
|
||||||
Uri uri = InstalledAppProvider.getAppUri(appId);
|
|
||||||
|
|
||||||
String[] projection = {
|
|
||||||
InstalledAppProvider.DataColumns.PACKAGE_NAME,
|
|
||||||
InstalledAppProvider.DataColumns.VERSION_CODE,
|
|
||||||
InstalledAppProvider.DataColumns.VERSION_NAME,
|
|
||||||
InstalledAppProvider.DataColumns.APPLICATION_LABEL,
|
|
||||||
};
|
|
||||||
|
|
||||||
Cursor cursor = getMockContentResolver().query(uri, projection, null, null, null);
|
|
||||||
|
|
||||||
assertNotNull(cursor);
|
|
||||||
assertEquals("App \"" + appId + "\" not installed", 1, cursor.getCount());
|
|
||||||
|
|
||||||
cursor.moveToFirst();
|
|
||||||
|
|
||||||
assertEquals(appId, cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.PACKAGE_NAME)));
|
|
||||||
assertEquals(versionCode, cursor.getInt(cursor.getColumnIndex(InstalledAppProvider.DataColumns.VERSION_CODE)));
|
|
||||||
assertEquals(versionName, cursor.getString(cursor.getColumnIndex(InstalledAppProvider.DataColumns.VERSION_NAME)));
|
|
||||||
cursor.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,177 +0,0 @@
|
|||||||
package org.fdroid.fdroid.data;
|
|
||||||
|
|
||||||
import mock.MockInstallablePackageManager;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests the ability of the {@link InstalledAppCacheUpdater} to stay in sync with
|
|
||||||
* the {@link android.content.pm.PackageManager}.
|
|
||||||
* For practical reasons, it extends FDroidProviderTestOld<InstalledAppProvider>, although there is also a
|
|
||||||
* separate test for the InstalledAppProvider which tests the CRUD operations in more detail.
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("PMD") // TODO port this to JUnit 4 semantics
|
|
||||||
public class InstalledAppCacheTest extends FDroidProviderTestOld<InstalledAppProvider> {
|
|
||||||
|
|
||||||
private MockInstallablePackageManager packageManager;
|
|
||||||
|
|
||||||
public InstalledAppCacheTest() {
|
|
||||||
super(InstalledAppProvider.class, InstalledAppProvider.getAuthority());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setUp() throws Exception {
|
|
||||||
super.setUp();
|
|
||||||
packageManager = new MockInstallablePackageManager();
|
|
||||||
getSwappableContext().setPackageManager(packageManager);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected String[] getMinimalProjection() {
|
|
||||||
return new String[] {
|
|
||||||
InstalledAppProvider.DataColumns.PACKAGE_NAME,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public void install(String appId, int versionCode, String versionName) {
|
|
||||||
packageManager.install(appId, versionCode, versionName);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void remove(String appId) {
|
|
||||||
packageManager.remove(appId);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO fix me
|
|
||||||
public void testFromEmptyCache() {
|
|
||||||
assertResultCount(0, InstalledAppProvider.getContentUri());
|
|
||||||
for (int i = 1; i <= 15; i ++) {
|
|
||||||
install("com.example.app" + i, 200, "2.0");
|
|
||||||
}
|
|
||||||
InstalledAppCacheUpdater.updateInForeground(getMockContext());
|
|
||||||
|
|
||||||
String[] expectedInstalledIds = {
|
|
||||||
"com.example.app1",
|
|
||||||
"com.example.app2",
|
|
||||||
"com.example.app3",
|
|
||||||
"com.example.app4",
|
|
||||||
"com.example.app5",
|
|
||||||
"com.example.app6",
|
|
||||||
"com.example.app7",
|
|
||||||
"com.example.app8",
|
|
||||||
"com.example.app9",
|
|
||||||
"com.example.app10",
|
|
||||||
"com.example.app11",
|
|
||||||
"com.example.app12",
|
|
||||||
"com.example.app13",
|
|
||||||
"com.example.app14",
|
|
||||||
"com.example.app15",
|
|
||||||
};
|
|
||||||
|
|
||||||
TestUtils.assertContainsOnly(getInstalledAppIdsFromProvider(), expectedInstalledIds);
|
|
||||||
}
|
|
||||||
|
|
||||||
private String[] getInstalledAppIdsFromProvider() {
|
|
||||||
Uri uri = InstalledAppProvider.getContentUri();
|
|
||||||
String[] projection = { InstalledAppProvider.DataColumns.PACKAGE_NAME };
|
|
||||||
Cursor result = getMockContext().getContentResolver().query(uri, projection, null, null, null);
|
|
||||||
if (result == null) {
|
|
||||||
return new String[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
String[] installedAppIds = new String[result.getCount()];
|
|
||||||
result.moveToFirst();
|
|
||||||
int i = 0;
|
|
||||||
while (!result.isAfterLast()) {
|
|
||||||
installedAppIds[i] = result.getString(result.getColumnIndex(InstalledAppProvider.DataColumns.PACKAGE_NAME));
|
|
||||||
result.moveToNext();
|
|
||||||
i ++;
|
|
||||||
}
|
|
||||||
result.close();
|
|
||||||
return installedAppIds;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testAppsAdded() {
|
|
||||||
assertResultCount(0, InstalledAppProvider.getContentUri());
|
|
||||||
|
|
||||||
install("com.example.app1", 1, "v1");
|
|
||||||
install("com.example.app2", 1, "v1");
|
|
||||||
install("com.example.app3", 1, "v1");
|
|
||||||
InstalledAppCacheUpdater.updateInForeground(getMockContext());
|
|
||||||
|
|
||||||
assertResultCount(3, InstalledAppProvider.getContentUri());
|
|
||||||
assertIsInstalledVersionInDb("com.example.app1", 1, "v1");
|
|
||||||
assertIsInstalledVersionInDb("com.example.app2", 1, "v1");
|
|
||||||
assertIsInstalledVersionInDb("com.example.app3", 1, "v1");
|
|
||||||
|
|
||||||
install("com.example.app10", 1, "v1");
|
|
||||||
install("com.example.app11", 1, "v1");
|
|
||||||
install("com.example.app12", 1, "v1");
|
|
||||||
InstalledAppCacheUpdater.updateInForeground(getMockContext());
|
|
||||||
|
|
||||||
assertResultCount(6, InstalledAppProvider.getContentUri());
|
|
||||||
assertIsInstalledVersionInDb("com.example.app10", 1, "v1");
|
|
||||||
assertIsInstalledVersionInDb("com.example.app11", 1, "v1");
|
|
||||||
assertIsInstalledVersionInDb("com.example.app12", 1, "v1");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testAppsRemoved() {
|
|
||||||
install("com.example.app1", 1, "v1");
|
|
||||||
install("com.example.app2", 1, "v1");
|
|
||||||
install("com.example.app3", 1, "v1");
|
|
||||||
InstalledAppCacheUpdater.updateInForeground(getMockContext());
|
|
||||||
|
|
||||||
assertResultCount(3, InstalledAppProvider.getContentUri());
|
|
||||||
assertIsInstalledVersionInDb("com.example.app1", 1, "v1");
|
|
||||||
assertIsInstalledVersionInDb("com.example.app2", 1, "v1");
|
|
||||||
assertIsInstalledVersionInDb("com.example.app3", 1, "v1");
|
|
||||||
|
|
||||||
remove("com.example.app2");
|
|
||||||
InstalledAppCacheUpdater.updateInForeground(getMockContext());
|
|
||||||
|
|
||||||
assertResultCount(2, InstalledAppProvider.getContentUri());
|
|
||||||
assertIsInstalledVersionInDb("com.example.app1", 1, "v1");
|
|
||||||
assertIsInstalledVersionInDb("com.example.app3", 1, "v1");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testAppsUpdated() {
|
|
||||||
install("com.example.app1", 1, "v1");
|
|
||||||
install("com.example.app2", 1, "v1");
|
|
||||||
InstalledAppCacheUpdater.updateInForeground(getMockContext());
|
|
||||||
|
|
||||||
assertResultCount(2, InstalledAppProvider.getContentUri());
|
|
||||||
assertIsInstalledVersionInDb("com.example.app1", 1, "v1");
|
|
||||||
assertIsInstalledVersionInDb("com.example.app2", 1, "v1");
|
|
||||||
|
|
||||||
install("com.example.app2", 20, "v2.0");
|
|
||||||
InstalledAppCacheUpdater.updateInForeground(getMockContext());
|
|
||||||
|
|
||||||
assertResultCount(2, InstalledAppProvider.getContentUri());
|
|
||||||
assertIsInstalledVersionInDb("com.example.app1", 1, "v1");
|
|
||||||
assertIsInstalledVersionInDb("com.example.app2", 20, "v2.0");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void testAppsAddedRemovedAndUpdated() {
|
|
||||||
install("com.example.app1", 1, "v1");
|
|
||||||
install("com.example.app2", 1, "v1");
|
|
||||||
install("com.example.app3", 1, "v1");
|
|
||||||
install("com.example.app4", 1, "v1");
|
|
||||||
InstalledAppCacheUpdater.updateInForeground(getMockContext());
|
|
||||||
|
|
||||||
assertResultCount(4, InstalledAppProvider.getContentUri());
|
|
||||||
assertIsInstalledVersionInDb("com.example.app1", 1, "v1");
|
|
||||||
assertIsInstalledVersionInDb("com.example.app2", 1, "v1");
|
|
||||||
assertIsInstalledVersionInDb("com.example.app3", 1, "v1");
|
|
||||||
assertIsInstalledVersionInDb("com.example.app4", 1, "v1");
|
|
||||||
|
|
||||||
install("com.example.app1", 13, "v1.3");
|
|
||||||
remove("com.example.app2");
|
|
||||||
remove("com.example.app3");
|
|
||||||
install("com.example.app10", 1, "v1");
|
|
||||||
InstalledAppCacheUpdater.updateInForeground(getMockContext());
|
|
||||||
|
|
||||||
assertResultCount(3, InstalledAppProvider.getContentUri());
|
|
||||||
assertIsInstalledVersionInDb("com.example.app1", 13, "v1.3");
|
|
||||||
assertIsInstalledVersionInDb("com.example.app4", 1, "v1");
|
|
||||||
assertIsInstalledVersionInDb("com.example.app10", 1, "v1");
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user