blob: f3655fc781dd7a10755bbf8b02fc074e6030d555 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001package android.test;
2
3import android.content.ContentProvider;
4import android.content.ContentResolver;
5import android.content.Context;
Ken Shirriff04cc0e12009-07-28 16:15:38 -07006import android.content.res.Resources;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08007import android.test.mock.MockContext;
8import android.test.mock.MockContentResolver;
9import android.database.DatabaseUtils;
10
Paul Westbrook10481082010-02-11 10:33:12 -080011import java.io.File;
12
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080013/**
Dianne Hackborn935ae462009-04-13 16:11:55 -070014 * This TestCase class provides a framework for isolated testing of a single
15 * ContentProvider. It uses a {@link android.test.mock.MockContentResolver} to
16 * access the provider, restricts the provider to an isolated area of the
17 * filesystem (for safely creating & modifying databases & files), and injects
18 * {@link android.test.IsolatedContext} to isolate the ContentProvider from the
19 * rest of the running system.
20 *
21 * <p>This environment is created automatically by {@link #setUp} and {@link
22 * #tearDown}.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080023 */
24public abstract class ProviderTestCase2<T extends ContentProvider> extends AndroidTestCase {
25
26 Class<T> mProviderClass;
27 String mProviderAuthority;
28
29 private IsolatedContext mProviderContext;
30 private MockContentResolver mResolver;
31
Ken Shirriff04cc0e12009-07-28 16:15:38 -070032 private class MockContext2 extends MockContext {
33
34 @Override
35 public Resources getResources() {
36 return getContext().getResources();
37 }
Paul Westbrook10481082010-02-11 10:33:12 -080038
39 @Override
40 public File getDir(String name, int mode) {
41 // name the directory so the directory will be seperated from
42 // one created through the regular Context
43 return getContext().getDir("mockcontext2_" + name, mode);
44 }
Ken Shirriff04cc0e12009-07-28 16:15:38 -070045 }
46
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080047 public ProviderTestCase2(Class<T> providerClass, String providerAuthority) {
48 mProviderClass = providerClass;
49 mProviderAuthority = providerAuthority;
50 }
51
52 /**
53 * The content provider that will be set up for use in each test method.
54 */
55 private T mProvider;
56
57 public T getProvider() {
58 return mProvider;
59 }
60
61 @Override
62 protected void setUp() throws Exception {
63 super.setUp();
64
65 mResolver = new MockContentResolver();
66 final String filenamePrefix = "test.";
67 RenamingDelegatingContext targetContextWrapper = new RenamingDelegatingContext(
Ken Shirriff04cc0e12009-07-28 16:15:38 -070068 new MockContext2(), // The context that most methods are delegated to
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080069 getContext(), // The context that file methods are delegated to
70 filenamePrefix);
71 mProviderContext = new IsolatedContext(mResolver, targetContextWrapper);
72
73 mProvider = mProviderClass.newInstance();
74 mProvider.attachInfo(mProviderContext, null);
75 assertNotNull(mProvider);
76 mResolver.addProvider(mProviderAuthority, getProvider());
77 }
78
79 public MockContentResolver getMockContentResolver() {
80 return mResolver;
81 }
82
83 public IsolatedContext getMockContext() {
84 return mProviderContext;
85 }
86
87 public static <T extends ContentProvider> ContentResolver newResolverWithContentProviderFromSql(
88 Context targetContext, String filenamePrefix, Class<T> providerClass, String authority,
89 String databaseName, int databaseVersion, String sql)
90 throws IllegalAccessException, InstantiationException {
91 MockContentResolver resolver = new MockContentResolver();
92 RenamingDelegatingContext targetContextWrapper = new RenamingDelegatingContext(
93 new MockContext(), // The context that most methods are delegated to
94 targetContext, // The context that file methods are delegated to
95 filenamePrefix);
96 Context context = new IsolatedContext(resolver, targetContextWrapper);
97 DatabaseUtils.createDbFromSqlStatements(context, databaseName, databaseVersion, sql);
98
99 T provider = providerClass.newInstance();
100 provider.attachInfo(context, null);
101 resolver.addProvider(authority, provider);
102
103 return resolver;
104 }
Dianne Hackborn935ae462009-04-13 16:11:55 -0700105}