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