• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 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 
17 package com.android.browser.tests.utils;
18 
19 import android.content.ContentProvider;
20 import android.content.Context;
21 import android.content.SharedPreferences;
22 import android.content.res.Resources;
23 import android.database.ContentObserver;
24 import android.net.Uri;
25 import android.test.AndroidTestCase;
26 import android.test.IsolatedContext;
27 import android.test.RenamingDelegatingContext;
28 import android.test.mock.MockContext;
29 
30 import java.io.File;
31 
32 /**
33  * Replacement for ProviderTestCase2 that keeps calls to ContentResolver.notifyChanged
34  * internal to observers registered with ProviderTestCase3.registerContentObserver
35  */
36 public abstract class ProviderTestCase3<T extends ContentProvider> extends AndroidTestCase {
37 
38     public static final String FILENAME_PREFIX = "test.";
39 
40     Class<T> mProviderClass;
41     String[] mProviderAuthority;
42 
43     private IsolatedContext mProviderContext;
44     private MockContentResolver2 mResolver;
45 
46     private class MockContext2 extends MockContext {
47 
48         @Override
getResources()49         public Resources getResources() {
50             return getContext().getResources();
51         }
52 
53         @Override
getDir(String name, int mode)54         public File getDir(String name, int mode) {
55             // name the directory so the directory will be separated from
56             // one created through the regular Context
57             return getContext().getDir("mockcontext2_" + name, mode);
58         }
59 
60         @Override
getPackageName()61         public String getPackageName() {
62             return getContext().getPackageName();
63         }
64 
65         @Override
getSharedPreferences(String name, int mode)66         public SharedPreferences getSharedPreferences(String name, int mode) {
67             return getContext().getSharedPreferences("mockcontext2_" + name, mode);
68         }
69 
70         @Override
getApplicationContext()71         public Context getApplicationContext() {
72             return this;
73         }
74 
75         @Override
getSystemService(String name)76         public Object getSystemService(String name) {
77             return null;
78         }
79     }
80     /**
81      * Constructor.
82      *
83      * @param providerClass The class name of the provider under test
84      * @param providerAuthorities The provider's authority string
85      */
ProviderTestCase3(Class<T> providerClass, String... providerAuthorities)86     public ProviderTestCase3(Class<T> providerClass, String... providerAuthorities) {
87         mProviderClass = providerClass;
88         mProviderAuthority = providerAuthorities;
89     }
90 
91     private T mProvider;
92 
93     /**
94      * Returns the content provider created by this class in the {@link #setUp()} method.
95      * @return T An instance of the provider class given as a parameter to the test case class.
96      */
getProvider()97     public T getProvider() {
98         return mProvider;
99     }
100 
101     /**
102      * Sets up the environment for the test fixture.
103      * <p>
104      * Creates a new
105      * {@link com.android.browser.tests.utils.MockContentResolver2}, a new IsolatedContext
106      * that isolates the provider's file operations, and a new instance of
107      * the provider under test within the isolated environment.
108      * </p>
109      *
110      * @throws Exception
111      */
112     @Override
setUp()113     protected void setUp() throws Exception {
114         super.setUp();
115 
116         mResolver = new MockContentResolver2();
117         RenamingDelegatingContext targetContextWrapper = new
118                 RenamingDelegatingContext(
119                 new MockContext2(), // The context that most methods are
120                                     //delegated to
121                 getContext(), // The context that file methods are delegated to
122                 FILENAME_PREFIX);
123         // The default IsolatedContext has a mock AccountManager that doesn't
124         // work for us, so override getSystemService to always return null
125         mProviderContext = new IsolatedContext(mResolver, targetContextWrapper) {
126 
127             @Override
128             public Object getSystemService(String name) {
129                 return null;
130             }
131         };
132 
133         mProvider = mProviderClass.newInstance();
134         mProvider.attachInfo(mProviderContext, null);
135         assertNotNull(mProvider);
136         for (String auth : mProviderAuthority) {
137             mResolver.addProvider(auth, getProvider());
138         }
139     }
140 
141     /**
142      * Tears down the environment for the test fixture.
143      * <p>
144      * Calls {@link android.content.ContentProvider#shutdown()} on the
145      * {@link android.content.ContentProvider} represented by mProvider.
146      */
147     @Override
tearDown()148     protected void tearDown() throws Exception {
149         mProvider.shutdown();
150         super.tearDown();
151     }
152 
153     /**
154      * Gets the {@link MockContentResolver2} created by this class during initialization. You
155      * must use the methods of this resolver to access the provider under test.
156      *
157      * @return A {@link MockContentResolver2} instance.
158      */
getMockContentResolver()159     public MockContentResolver2 getMockContentResolver() {
160         return mResolver;
161     }
162 
163     /**
164      * Gets the {@link IsolatedContext} created by this class during initialization.
165      * @return The {@link IsolatedContext} instance
166      */
getMockContext()167     public IsolatedContext getMockContext() {
168         return mProviderContext;
169     }
170 
registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)171     public void registerContentObserver(Uri uri, boolean notifyForDescendents,
172             ContentObserver observer) {
173         mResolver.safeRegisterContentObserver(uri, notifyForDescendents, observer);
174     }
175 
unregisterContentObserver(ContentObserver observer)176     public void unregisterContentObserver(ContentObserver observer) {
177         mResolver.safeUnregisterContentObserver(observer);
178     }
179 
180 }
181