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 */ 16package com.android.providers.contacts; 17 18import android.content.Context; 19import android.content.pm.ApplicationInfo; 20import android.content.pm.PackageInfo; 21import android.content.pm.PackageManager; 22import android.content.pm.ProviderInfo; 23import android.content.res.Resources; 24import android.os.Binder; 25import android.test.mock.MockPackageManager; 26 27import com.google.android.collect.Lists; 28 29import java.util.HashMap; 30import java.util.List; 31 32/** 33 * Mock {@link PackageManager} that knows about a specific set of packages 34 * to help test security models. Because {@link Binder#getCallingUid()} 35 * can't be mocked, you'll have to find your mock-UID manually using your 36 * {@link Context#getPackageName()}. 37 */ 38public class ContactsMockPackageManager extends MockPackageManager { 39 private final HashMap<Integer, String> mForward = new HashMap<Integer, String>(); 40 private final HashMap<String, Integer> mReverse = new HashMap<String, Integer>(); 41 private List<PackageInfo> mPackages; 42 43 public ContactsMockPackageManager() { 44 } 45 46 /** 47 * Add a UID-to-package mapping, which is then stored internally. 48 */ 49 public void addPackage(int packageUid, String packageName) { 50 mForward.put(packageUid, packageName); 51 mReverse.put(packageName, packageUid); 52 } 53 54 @Override 55 public String getNameForUid(int uid) { 56 return "name-for-uid"; 57 } 58 59 @Override 60 public String[] getPackagesForUid(int uid) { 61 if (mPackages != null) { 62 return new String[] { mPackages.get(0).packageName }; 63 } else { 64 return new String[] { ContactsActor.sCallingPackage }; 65 } 66 } 67 68 @Override 69 public ApplicationInfo getApplicationInfo(String packageName, int flags) { 70 ApplicationInfo info = new ApplicationInfo(); 71 Integer uid = mReverse.get(packageName); 72 info.uid = (uid != null) ? uid : -1; 73 return info; 74 } 75 76 public void setInstalledPackages(List<PackageInfo> packages) { 77 this.mPackages = packages; 78 } 79 80 @Override 81 public List<PackageInfo> getInstalledPackages(int flags) { 82 return mPackages; 83 } 84 85 @Override 86 public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException { 87 for (PackageInfo info : mPackages) { 88 if (info.packageName.equals(packageName)) { 89 return info; 90 } 91 } 92 throw new NameNotFoundException(); 93 } 94 95 @Override 96 public Resources getResourcesForApplication(String appPackageName) { 97 return new ContactsMockResources(); 98 } 99 100 @Override 101 public List<ProviderInfo> queryContentProviders(String processName, int uid, int flags) { 102 final List<ProviderInfo> ret = Lists.newArrayList(); 103 if (mPackages == null) return ret; 104 for (PackageInfo packageInfo : mPackages) { 105 if (packageInfo.providers == null) continue; 106 for (ProviderInfo providerInfo : packageInfo.providers) { 107 ret.add(providerInfo); 108 } 109 } 110 return ret; 111 } 112} 113