ContactsMockContext.java revision 43fd1e84de5e28639062c20d35ba7bfec8a07001
1/* 2 * Copyright (C) 2010 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 com.android.contacts.tests.mocks; 18 19//import com.android.providers.contacts.ContactsMockPackageManager; 20 21import android.app.LoaderManager; 22import android.content.AsyncTaskLoader; 23import android.content.ContentResolver; 24import android.content.Context; 25import android.content.ContextWrapper; 26import android.content.pm.PackageManager; 27import android.content.pm.ProviderInfo; 28import android.provider.ContactsContract; 29import android.provider.Settings; 30import android.test.mock.MockContentResolver; 31import android.util.Log; 32 33import junit.framework.Assert; 34 35/** 36 * A mock context for contacts unit tests. Forwards everything to 37 * a supplied context, except content resolver operations, which are sent 38 * to mock content providers. 39 */ 40public class ContactsMockContext extends ContextWrapper { 41 42 private static final String TAG = "ContactsMockContext"; 43 44 private ContactsMockPackageManager mPackageManager; 45 private MockContentResolver mContentResolver; 46 private MockContentProvider mContactsProvider; 47 private MockContentProvider mSettingsProvider; 48 49 public ContactsMockContext(Context base) { 50 super(base); 51 mPackageManager = new ContactsMockPackageManager(); 52 mContentResolver = new MockContentResolver(); 53 mContactsProvider = new MockContentProvider(); 54 mContentResolver.addProvider(ContactsContract.AUTHORITY, mContactsProvider); 55 mContactsProvider.attachInfo(this, new ProviderInfo()); 56 mSettingsProvider = new MockContentProvider(); 57 mSettingsProvider.attachInfo(this, new ProviderInfo()); 58 mContentResolver.addProvider(Settings.AUTHORITY, mSettingsProvider); 59 } 60 61 @Override 62 public ContentResolver getContentResolver() { 63 return mContentResolver; 64 } 65 66 public MockContentProvider getContactsProvider() { 67 return mContactsProvider; 68 } 69 70 public MockContentProvider getSettingsProvider() { 71 return mSettingsProvider; 72 } 73 74 @Override 75 public PackageManager getPackageManager() { 76 return mPackageManager; 77 } 78 79 @Override 80 public Context getApplicationContext() { 81 return this; 82 } 83 84 public void verify() { 85 mContactsProvider.verify(); 86 mSettingsProvider.verify(); 87 } 88 89 /** 90 * Waits for the specified loaders to complete loading. 91 */ 92 public void waitForLoaders(LoaderManager loaderManager, int... loaderIds) { 93 // We want to wait for each loader using a separate thread, so that we can 94 // simulate race conditions. 95 Thread[] waitThreads = new Thread[loaderIds.length]; 96 for (int i = 0; i < loaderIds.length; i++) { 97 final int loaderId = loaderIds[i]; 98 final AsyncTaskLoader<?> loader = 99 (AsyncTaskLoader<?>) loaderManager.getLoader(loaderId); 100 if (loader == null) { 101 Assert.fail("Loader does not exist: " + loaderId); 102 return; 103 } 104 105 waitThreads[i] = new Thread("LoaderWaitingThread" + i) { 106 @Override 107 public void run() { 108 try { 109 loader.waitForLoader(); 110 } catch (Throwable e) { 111 Log.e(TAG, "Exception while waiting for loader: " + loaderId, e); 112 Assert.fail("Exception while waiting for loader: " + loaderId); 113 } 114 } 115 }; 116 waitThreads[i].start(); 117 } 118 119 // Now we wait for all these threads to finish 120 for (Thread thread : waitThreads) { 121 try { 122 thread.join(); 123 } catch (InterruptedException e) { 124 // Ignore 125 } 126 } 127 } 128 129} 130