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 17package com.android.providers.contacts; 18 19import android.content.ContentProvider; 20import android.content.ContentValues; 21import android.content.Context; 22import android.content.ContextWrapper; 23import android.content.Intent; 24import android.content.pm.PackageManager; 25import android.os.Process; 26import android.provider.CallLog.Calls; 27import android.provider.VoicemailContract; 28 29import java.io.File; 30import java.util.ArrayList; 31import java.util.Collections; 32import java.util.List; 33 34/** 35 * Base class for all tests that require interacting with the voicemail content provider. 36 */ 37public abstract class BaseVoicemailProviderTest extends BaseContactsProvider2Test { 38 39 protected boolean mUseSourceUri = false; 40 private File mTestDirectory; 41 ContactsMockPackageManager mPackageManager; 42 43 @Override 44 protected void setUp() throws Exception { 45 super.setUp(); 46 addProvider(TestVoicemailProvider.class, VoicemailContract.AUTHORITY); 47 TestVoicemailProvider.setVvmProviderCallDelegate(createMockProviderCalls()); 48 49 mPackageManager = (ContactsMockPackageManager) getProvider() 50 .getContext().getPackageManager(); 51 mPackageManager.addPackage(Process.myUid(), mActor.packageName); 52 } 53 54 @Override 55 protected void tearDown() throws Exception { 56 removeTestDirectory(); 57 super.tearDown(); 58 } 59 60 @Override 61 protected Class<? extends ContentProvider> getProviderClass() { 62 return TestVoicemailProvider.class; 63 } 64 65 @Override 66 protected String getAuthority() { 67 return VoicemailContract.AUTHORITY; 68 } 69 70 protected void setUpForOwnPermission() { 71 mActor.removePermissions(READ_VOICEMAIL_PERMISSION); 72 mActor.removePermissions(WRITE_VOICEMAIL_PERMISSION); 73 mActor.addPermissions(ADD_VOICEMAIL_PERMISSION); 74 mUseSourceUri = true; 75 } 76 77 protected void setUpForFullPermission() { 78 mActor.addPermissions(ADD_VOICEMAIL_PERMISSION); 79 mActor.addPermissions(READ_VOICEMAIL_PERMISSION); 80 mActor.addPermissions(WRITE_VOICEMAIL_PERMISSION); 81 mUseSourceUri = false; 82 } 83 84 protected void setUpForNoPermission() { 85 mActor.removePermissions(ADD_VOICEMAIL_PERMISSION); 86 mActor.removePermissions(READ_VOICEMAIL_PERMISSION); 87 mActor.removePermissions(WRITE_VOICEMAIL_PERMISSION); 88 mUseSourceUri = true; 89 } 90 91 protected int countFilesInTestDirectory() { 92 return findAllFiles(mTestDirectory).size(); 93 } 94 95 // TODO: Use a mocking framework to mock these calls. 96 private VvmProviderCalls createMockProviderCalls() { 97 return new VvmProviderCalls() { 98 @Override 99 public void sendOrderedBroadcast(Intent intent, String receiverPermission) { 100 // Do nothing for now. 101 } 102 103 @Override 104 public File getDir(String name, int mode) { 105 return getTestDirectory(); 106 } 107 108 @Override 109 public PackageManager getPackageManager() { 110 return mActor.getProviderContext().getPackageManager(); 111 } 112 }; 113 } 114 115 /** Lazily construct the test directory when required. */ 116 private synchronized File getTestDirectory() { 117 if (mTestDirectory == null) { 118 File baseDirectory = getContext().getCacheDir(); 119 mTestDirectory = new File(baseDirectory, Long.toString(System.currentTimeMillis())); 120 assertFalse(mTestDirectory.exists()); 121 assertTrue(mTestDirectory.mkdirs()); 122 } 123 return mTestDirectory; 124 } 125 126 private void removeTestDirectory() { 127 if (mTestDirectory != null) { 128 recursiveDeleteAll(mTestDirectory); 129 } 130 } 131 132 private static void recursiveDeleteAll(File input) { 133 if (input.isDirectory()) { 134 for (File file : input.listFiles()) { 135 recursiveDeleteAll(file); 136 } 137 } 138 assertTrue("error deleting " + input.getAbsolutePath(), input.delete()); 139 } 140 141 private List<File> findAllFiles(File input) { 142 if (input == null) { 143 return Collections.emptyList(); 144 } 145 if (!input.isDirectory()) { 146 return Collections.singletonList(input); 147 } 148 List<File> results = new ArrayList<File>(); 149 for (File file : input.listFiles()) { 150 results.addAll(findAllFiles(file)); 151 } 152 return results; 153 } 154 155 /** The calls that we need to mock out for our VvmProvider, used by TestVoicemailProvider. */ 156 private interface VvmProviderCalls { 157 public void sendOrderedBroadcast(Intent intent, String receiverPermission); 158 public File getDir(String name, int mode); 159 public PackageManager getPackageManager(); 160 } 161 162 public static class TestVoicemailProvider extends VoicemailContentProvider { 163 private static VvmProviderCalls mDelegate; 164 public static synchronized void setVvmProviderCallDelegate(VvmProviderCalls delegate) { 165 mDelegate = delegate; 166 } 167 168 @Override 169 protected ContactsDatabaseHelper getDatabaseHelper(Context context) { 170 return ContactsDatabaseHelper.getNewInstanceForTest(context); 171 } 172 173 @Override 174 protected Context context() { 175 return new ContextWrapper(getContext()) { 176 @Override 177 public File getDir(String name, int mode) { 178 return mDelegate.getDir(name, mode); 179 } 180 @Override 181 public void sendBroadcast(Intent intent, String receiverPermission) { 182 mDelegate.sendOrderedBroadcast(intent, receiverPermission); 183 } 184 @Override 185 public PackageManager getPackageManager() { 186 return mDelegate.getPackageManager(); 187 } 188 }; 189 } 190 191 @Override 192 protected String getCallingPackage_() { 193 return getContext().getPackageName(); 194 } 195 196 @Override 197 CallLogInsertionHelper createCallLogInsertionHelper(Context context) { 198 return new CallLogInsertionHelper() { 199 @Override 200 public String getGeocodedLocationFor(String number, String countryIso) { 201 return "usa"; 202 } 203 204 @Override 205 public void addComputedValues(ContentValues values) { 206 values.put(Calls.COUNTRY_ISO, "us"); 207 values.put(Calls.GEOCODED_LOCATION, "usa"); 208 } 209 }; 210 } 211 } 212} 213