1e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck/* 2e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Copyright (C) 2011 The Android Open Source Project 3e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * 4e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Licensed under the Apache License, Version 2.0 (the "License"); 5e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * you may not use this file except in compliance with the License. 6e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * You may obtain a copy of the License at 7e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * 8e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * http://www.apache.org/licenses/LICENSE-2.0 9e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * 10e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Unless required by applicable law or agreed to in writing, software 11e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * distributed under the License is distributed on an "AS IS" BASIS, 12e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * See the License for the specific language governing permissions and 14e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * limitations under the License. 15e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */ 16e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 17e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckpackage com.android.browser.tests.utils; 18e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 19e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.content.ContentProvider; 20e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.content.Context; 2157e39f9e46091750c8a07895531446a7f0efdb21John Reckimport android.content.SharedPreferences; 22e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.content.res.Resources; 23e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.database.ContentObserver; 24e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.net.Uri; 25e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.test.AndroidTestCase; 26e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.test.IsolatedContext; 27e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.test.RenamingDelegatingContext; 28e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport android.test.mock.MockContext; 29e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 30e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckimport java.io.File; 31e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 32e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck/** 33e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Replacement for ProviderTestCase2 that keeps calls to ContentResolver.notifyChanged 34e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * internal to observers registered with ProviderTestCase3.registerContentObserver 35e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */ 36e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reckpublic abstract class ProviderTestCase3<T extends ContentProvider> extends AndroidTestCase { 37e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 38db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck public static final String FILENAME_PREFIX = "test."; 39db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck 40e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck Class<T> mProviderClass; 41e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck String[] mProviderAuthority; 42e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 43e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck private IsolatedContext mProviderContext; 44e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck private MockContentResolver2 mResolver; 45e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 46e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck private class MockContext2 extends MockContext { 47e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 48e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck @Override 49e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public Resources getResources() { 50e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return getContext().getResources(); 51e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 52e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 53e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck @Override 54e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public File getDir(String name, int mode) { 55e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck // name the directory so the directory will be separated from 56e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck // one created through the regular Context 57e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return getContext().getDir("mockcontext2_" + name, mode); 58e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 59e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 60e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck @Override 6157e39f9e46091750c8a07895531446a7f0efdb21John Reck public String getPackageName() { 6257e39f9e46091750c8a07895531446a7f0efdb21John Reck return getContext().getPackageName(); 6357e39f9e46091750c8a07895531446a7f0efdb21John Reck } 6457e39f9e46091750c8a07895531446a7f0efdb21John Reck 6557e39f9e46091750c8a07895531446a7f0efdb21John Reck @Override 6657e39f9e46091750c8a07895531446a7f0efdb21John Reck public SharedPreferences getSharedPreferences(String name, int mode) { 6757e39f9e46091750c8a07895531446a7f0efdb21John Reck return getContext().getSharedPreferences("mockcontext2_" + name, mode); 6857e39f9e46091750c8a07895531446a7f0efdb21John Reck } 6957e39f9e46091750c8a07895531446a7f0efdb21John Reck 7057e39f9e46091750c8a07895531446a7f0efdb21John Reck @Override 71e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public Context getApplicationContext() { 72e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return this; 73e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 74ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck 75ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck @Override 76ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck public Object getSystemService(String name) { 77ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck return null; 78ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck } 79e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 80e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck /** 81e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Constructor. 82e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * 83e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * @param providerClass The class name of the provider under test 84e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * @param providerAuthorities The provider's authority string 85e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */ 86e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public ProviderTestCase3(Class<T> providerClass, String... providerAuthorities) { 87e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mProviderClass = providerClass; 88e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mProviderAuthority = providerAuthorities; 89e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 90e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 91e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck private T mProvider; 92e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 93e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck /** 94e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Returns the content provider created by this class in the {@link #setUp()} method. 95e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * @return T An instance of the provider class given as a parameter to the test case class. 96e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */ 97e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public T getProvider() { 98e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return mProvider; 99e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 100e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 101e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck /** 102e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Sets up the environment for the test fixture. 103e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * <p> 104e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Creates a new 105e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * {@link com.android.browser.tests.utils.MockContentResolver2}, a new IsolatedContext 106e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * that isolates the provider's file operations, and a new instance of 107e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * the provider under test within the isolated environment. 108e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * </p> 109e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * 110e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * @throws Exception 111e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */ 112e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck @Override 113e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck protected void setUp() throws Exception { 114e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck super.setUp(); 115e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 116e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mResolver = new MockContentResolver2(); 117e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck RenamingDelegatingContext targetContextWrapper = new 118e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck RenamingDelegatingContext( 119e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck new MockContext2(), // The context that most methods are 120e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck //delegated to 121e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck getContext(), // The context that file methods are delegated to 122db78cd054b0344e67a18dc9e1d1a154d3814dc77John Reck FILENAME_PREFIX); 123ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck // The default IsolatedContext has a mock AccountManager that doesn't 124ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck // work for us, so override getSystemService to always return null 125ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck mProviderContext = new IsolatedContext(mResolver, targetContextWrapper) { 126ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck 127ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck @Override 128ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck public Object getSystemService(String name) { 129ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck return null; 130ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck } 131ad662f04ed7fbd9ce464fed54fd7764290e800e8John Reck }; 132e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 133e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mProvider = mProviderClass.newInstance(); 134e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mProvider.attachInfo(mProviderContext, null); 135e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck assertNotNull(mProvider); 136e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck for (String auth : mProviderAuthority) { 137e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mResolver.addProvider(auth, getProvider()); 138e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 139e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 140e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 141e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck /** 142e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Tears down the environment for the test fixture. 143e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * <p> 144e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Calls {@link android.content.ContentProvider#shutdown()} on the 145e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * {@link android.content.ContentProvider} represented by mProvider. 146e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */ 147e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck @Override 148e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck protected void tearDown() throws Exception { 149e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mProvider.shutdown(); 150e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck super.tearDown(); 151e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 152e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 153e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck /** 154e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Gets the {@link MockContentResolver2} created by this class during initialization. You 155e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * must use the methods of this resolver to access the provider under test. 156e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * 157e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * @return A {@link MockContentResolver2} instance. 158e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */ 159e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public MockContentResolver2 getMockContentResolver() { 160e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return mResolver; 161e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 162e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 163e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck /** 164e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * Gets the {@link IsolatedContext} created by this class during initialization. 165e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck * @return The {@link IsolatedContext} instance 166e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck */ 167e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public IsolatedContext getMockContext() { 168e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck return mProviderContext; 169e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 170e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 171e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public void registerContentObserver(Uri uri, boolean notifyForDescendents, 172e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck ContentObserver observer) { 173e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mResolver.safeRegisterContentObserver(uri, notifyForDescendents, observer); 174e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 175e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 176e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck public void unregisterContentObserver(ContentObserver observer) { 177e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck mResolver.safeUnregisterContentObserver(observer); 178e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck } 179e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck 180e6adaf57a9a4f05e88505e4a86c565b5f18a1d3bJohn Reck} 181