ProviderTestCase2.java revision 10362ab9d67d87c0c3217e804e64d3e7038211df
1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.test;
18
19import android.content.ContentProvider;
20import android.content.ContentResolver;
21import android.content.Context;
22import android.content.res.Resources;
23import android.test.mock.MockContext;
24import android.test.mock.MockContentResolver;
25import android.database.DatabaseUtils;
26
27import java.io.File;
28
29/**
30 * This TestCase class provides a framework for isolated testing of a single
31 * ContentProvider.  It uses a {@link android.test.mock.MockContentResolver} to
32 * access the provider, restricts the provider to an isolated area of the
33 * filesystem (for safely creating & modifying databases & files), and injects
34 * {@link android.test.IsolatedContext} to isolate the ContentProvider from the
35 * rest of the running system.
36 *
37 * <p>This environment is created automatically by {@link #setUp} and {@link
38 * #tearDown}.
39 */
40public abstract class ProviderTestCase2<T extends ContentProvider> extends AndroidTestCase {
41
42    Class<T> mProviderClass;
43    String mProviderAuthority;
44
45    private IsolatedContext mProviderContext;
46    private MockContentResolver mResolver;
47
48       private class MockContext2 extends MockContext {
49
50        @Override
51        public Resources getResources() {
52            return getContext().getResources();
53        }
54
55        @Override
56        public File getDir(String name, int mode) {
57            // name the directory so the directory will be seperated from
58            // one created through the regular Context
59            return getContext().getDir("mockcontext2_" + name, mode);
60        }
61    }
62
63    public ProviderTestCase2(Class<T> providerClass, String providerAuthority) {
64        mProviderClass = providerClass;
65        mProviderAuthority = providerAuthority;
66    }
67
68    /**
69     * The content provider that will be set up for use in each test method.
70     */
71    private T mProvider;
72
73    public T getProvider() {
74        return mProvider;
75    }
76
77    @Override
78    protected void setUp() throws Exception {
79        super.setUp();
80
81        mResolver = new MockContentResolver();
82        final String filenamePrefix = "test.";
83        RenamingDelegatingContext targetContextWrapper = new RenamingDelegatingContext(
84                new MockContext2(), // The context that most methods are delegated to
85                getContext(), // The context that file methods are delegated to
86                filenamePrefix);
87        mProviderContext = new IsolatedContext(mResolver, targetContextWrapper);
88
89        mProvider = mProviderClass.newInstance();
90        mProvider.attachInfo(mProviderContext, null);
91        assertNotNull(mProvider);
92        mResolver.addProvider(mProviderAuthority, getProvider());
93    }
94
95    public MockContentResolver getMockContentResolver() {
96        return mResolver;
97    }
98
99    public IsolatedContext getMockContext() {
100        return mProviderContext;
101    }
102
103    public static <T extends ContentProvider> ContentResolver newResolverWithContentProviderFromSql(
104            Context targetContext, String filenamePrefix, Class<T> providerClass, String authority,
105            String databaseName, int databaseVersion, String sql)
106            throws IllegalAccessException, InstantiationException {
107        MockContentResolver resolver = new MockContentResolver();
108        RenamingDelegatingContext targetContextWrapper = new RenamingDelegatingContext(
109                new MockContext(), // The context that most methods are delegated to
110                targetContext, // The context that file methods are delegated to
111                filenamePrefix);
112        Context context = new IsolatedContext(resolver, targetContextWrapper);
113        DatabaseUtils.createDbFromSqlStatements(context, databaseName, databaseVersion, sql);
114
115        T provider = providerClass.newInstance();
116        provider.attachInfo(context, null);
117        resolver.addProvider(authority, provider);
118
119        return resolver;
120    }
121}
122