1 package android.test; 2 3 import android.content.ContentProvider; 4 import android.content.ContentResolver; 5 import android.content.Context; 6 import android.content.res.Resources; 7 import android.test.mock.MockContext; 8 import android.test.mock.MockContentResolver; 9 import android.database.DatabaseUtils; 10 11 /** 12 * This TestCase class provides a framework for isolated testing of a single 13 * ContentProvider. It uses a {@link android.test.mock.MockContentResolver} to 14 * access the provider, restricts the provider to an isolated area of the 15 * filesystem (for safely creating & modifying databases & files), and injects 16 * {@link android.test.IsolatedContext} to isolate the ContentProvider from the 17 * rest of the running system. 18 * 19 * <p>This environment is created automatically by {@link #setUp} and {@link 20 * #tearDown}. 21 */ 22 public abstract class ProviderTestCase2<T extends ContentProvider> extends AndroidTestCase { 23 24 Class<T> mProviderClass; 25 String mProviderAuthority; 26 27 private IsolatedContext mProviderContext; 28 private MockContentResolver mResolver; 29 30 private class MockContext2 extends MockContext { 31 32 @Override getResources()33 public Resources getResources() { 34 return getContext().getResources(); 35 } 36 } 37 ProviderTestCase2(Class<T> providerClass, String providerAuthority)38 public ProviderTestCase2(Class<T> providerClass, String providerAuthority) { 39 mProviderClass = providerClass; 40 mProviderAuthority = providerAuthority; 41 } 42 43 /** 44 * The content provider that will be set up for use in each test method. 45 */ 46 private T mProvider; 47 getProvider()48 public T getProvider() { 49 return mProvider; 50 } 51 52 @Override setUp()53 protected void setUp() throws Exception { 54 super.setUp(); 55 56 mResolver = new MockContentResolver(); 57 final String filenamePrefix = "test."; 58 RenamingDelegatingContext targetContextWrapper = new RenamingDelegatingContext( 59 new MockContext2(), // The context that most methods are delegated to 60 getContext(), // The context that file methods are delegated to 61 filenamePrefix); 62 mProviderContext = new IsolatedContext(mResolver, targetContextWrapper); 63 64 mProvider = mProviderClass.newInstance(); 65 mProvider.attachInfo(mProviderContext, null); 66 assertNotNull(mProvider); 67 mResolver.addProvider(mProviderAuthority, getProvider()); 68 } 69 getMockContentResolver()70 public MockContentResolver getMockContentResolver() { 71 return mResolver; 72 } 73 getMockContext()74 public IsolatedContext getMockContext() { 75 return mProviderContext; 76 } 77 newResolverWithContentProviderFromSql( Context targetContext, String filenamePrefix, Class<T> providerClass, String authority, String databaseName, int databaseVersion, String sql)78 public static <T extends ContentProvider> ContentResolver newResolverWithContentProviderFromSql( 79 Context targetContext, String filenamePrefix, Class<T> providerClass, String authority, 80 String databaseName, int databaseVersion, String sql) 81 throws IllegalAccessException, InstantiationException { 82 MockContentResolver resolver = new MockContentResolver(); 83 RenamingDelegatingContext targetContextWrapper = new RenamingDelegatingContext( 84 new MockContext(), // The context that most methods are delegated to 85 targetContext, // The context that file methods are delegated to 86 filenamePrefix); 87 Context context = new IsolatedContext(resolver, targetContextWrapper); 88 DatabaseUtils.createDbFromSqlStatements(context, databaseName, databaseVersion, sql); 89 90 T provider = providerClass.newInstance(); 91 provider.attachInfo(context, null); 92 resolver.addProvider(authority, provider); 93 94 return resolver; 95 } 96 } 97