1afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu/* 2afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * Copyright (C) 2006 The Android Open Source Project 3afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * 4afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * Licensed under the Apache License, Version 2.0 (the "License"); 5afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * you may not use this file except in compliance with the License. 6afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * You may obtain a copy of the License at 7afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * 8afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * http://www.apache.org/licenses/LICENSE-2.0 9afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * 10afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * Unless required by applicable law or agreed to in writing, software 11afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * distributed under the License is distributed on an "AS IS" BASIS, 12afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * See the License for the specific language governing permissions and 14afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * limitations under the License. 15afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu */ 16afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 17a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotpackage android.content.pm; 18afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 192a53332343c9fbc734595d269a2c35371227904bJeff Sharkeyimport static android.system.OsConstants.S_IFDIR; 202a53332343c9fbc734595d269a2c35371227904bJeff Sharkeyimport static android.system.OsConstants.S_IFMT; 212a53332343c9fbc734595d269a2c35371227904bJeff Sharkeyimport static android.system.OsConstants.S_IRGRP; 222a53332343c9fbc734595d269a2c35371227904bJeff Sharkeyimport static android.system.OsConstants.S_IROTH; 232a53332343c9fbc734595d269a2c35371227904bJeff Sharkeyimport static android.system.OsConstants.S_IRWXU; 242a53332343c9fbc734595d269a2c35371227904bJeff Sharkeyimport static android.system.OsConstants.S_ISDIR; 252a53332343c9fbc734595d269a2c35371227904bJeff Sharkeyimport static android.system.OsConstants.S_IXGRP; 262a53332343c9fbc734595d269a2c35371227904bJeff Sharkeyimport static android.system.OsConstants.S_IXOTH; 27089262dc022d87e31eefc536025be6c015c7ebdeSuchi Amalapurapu 28f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tateimport android.app.PackageInstallObserver; 29afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.BroadcastReceiver; 30afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.Context; 31afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.Intent; 32afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.IntentFilter; 33afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.PackageManager.NameNotFoundException; 34c4858a2ba972e86436d629c4d3f18eb49116de14Jeff Sharkeyimport android.content.pm.PackageParser.PackageParserException; 35afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.res.Resources; 36afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.res.Resources.NotFoundException; 37a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.net.Uri; 389d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashmanimport android.os.Binder; 39f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tateimport android.os.Bundle; 40afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.Environment; 41a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.os.FileUtils; 42b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapuimport android.os.IBinder; 437e921a157d1aca97506302637d4f3843ddc2b982Kenny Rootimport android.os.Process; 44afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.RemoteException; 45afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.ServiceManager; 46afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.StatFs; 477e921a157d1aca97506302637d4f3843ddc2b982Kenny Rootimport android.os.SystemClock; 48e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Rootimport android.os.UserManager; 49a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.os.storage.IMountService; 50a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.os.storage.StorageListener; 51a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.os.storage.StorageManager; 52a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.os.storage.StorageResultCode; 53117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapuimport android.provider.Settings; 54cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapuimport android.provider.Settings.SettingNotFoundException; 5534385d352da19805ae948215e2edbeedd16b7941Elliott Hughesimport android.system.ErrnoException; 569790190feecba4bbd66d54c9b942737722e5a16fElliott Hughesimport android.system.Os; 5734385d352da19805ae948215e2edbeedd16b7941Elliott Hughesimport android.system.StructStat; 58a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.test.AndroidTestCase; 59f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabotimport android.test.suitebuilder.annotation.LargeTest; 600aaa0d931716e9f57a1d84d795fab2df75092756Kenny Rootimport android.test.suitebuilder.annotation.SmallTest; 61a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.util.Log; 62a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabot 632a53332343c9fbc734595d269a2c35371227904bJeff Sharkeyimport com.android.frameworks.coretests.R; 642a53332343c9fbc734595d269a2c35371227904bJeff Sharkeyimport com.android.internal.content.PackageHelper; 652a53332343c9fbc734595d269a2c35371227904bJeff Sharkey 66a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport java.io.File; 676a6b007c77e5cab7ee435506a4f65824f52028b6Kenny Rootimport java.io.IOException; 68a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport java.io.InputStream; 6955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashmanimport java.util.HashSet; 70f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgrenimport java.util.List; 7155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashmanimport java.util.Set; 727e921a157d1aca97506302637d4f3843ddc2b982Kenny Rootimport java.util.concurrent.CountDownLatch; 737e921a157d1aca97506302637d4f3843ddc2b982Kenny Rootimport java.util.concurrent.TimeUnit; 747e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 75afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapupublic class PackageManagerTests extends AndroidTestCase { 76b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu private static final boolean localLOGV = true; 7725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 7825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public static final String TAG = "PackageManagerTests"; 7925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 8025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public final long MAX_WAIT_TIME = 25 * 1000; 8125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 8225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public final long WAIT_TIME_INCR = 5 * 1000; 8325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 842a53332343c9fbc734595d269a2c35371227904bJeff Sharkey private static final String SECURE_CONTAINERS_PREFIX = "/mnt/asec"; 8525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 86089262dc022d87e31eefc536025be6c015c7ebdeSuchi Amalapurapu private static final int APP_INSTALL_AUTO = PackageHelper.APP_INSTALL_AUTO; 8725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 88089262dc022d87e31eefc536025be6c015c7ebdeSuchi Amalapurapu private static final int APP_INSTALL_DEVICE = PackageHelper.APP_INSTALL_INTERNAL; 8925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 90089262dc022d87e31eefc536025be6c015c7ebdeSuchi Amalapurapu private static final int APP_INSTALL_SDCARD = PackageHelper.APP_INSTALL_EXTERNAL; 9125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 9214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu private boolean mOrigState; 93b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 94b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu void failStr(String errMsg) { 9525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root Log.w(TAG, "errMsg=" + errMsg); 96b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu fail(errMsg); 97b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 9825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 99b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu void failStr(Exception e) { 10090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu failStr(e.getMessage()); 101b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 102afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 103afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu @Override 104afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu protected void setUp() throws Exception { 105afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu super.setUp(); 106d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root mOrigState = checkMediaState(Environment.MEDIA_MOUNTED); 107e99bb5f10b90736d10cee9729b56cba156fc0921Suchi Amalapurapu if (!mountMedia()) { 108e99bb5f10b90736d10cee9729b56cba156fc0921Suchi Amalapurapu Log.i(TAG, "sdcard not mounted? Some of these tests might fail"); 109e99bb5f10b90736d10cee9729b56cba156fc0921Suchi Amalapurapu } 11014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 11114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu 11214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu @Override 11314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu protected void tearDown() throws Exception { 11414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Restore media state. 115d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root boolean newState = checkMediaState(Environment.MEDIA_MOUNTED); 11614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (newState != mOrigState) { 11714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (mOrigState) { 118d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root mountMedia(); 11914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } else { 120d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root unmountMedia(); 12114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 12214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 12314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu super.tearDown(); 124afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 125afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 126f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate private class TestInstallObserver extends PackageInstallObserver { 127afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public int returnCode; 12825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 129afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu private boolean doneFlag = false; 130afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 1312a53332343c9fbc734595d269a2c35371227904bJeff Sharkey @Override 1322a53332343c9fbc734595d269a2c35371227904bJeff Sharkey public void onPackageInstalled(String basePackageName, int returnCode, String msg, 1332a53332343c9fbc734595d269a2c35371227904bJeff Sharkey Bundle extras) { 1342a53332343c9fbc734595d269a2c35371227904bJeff Sharkey Log.d(TAG, "onPackageInstalled: code=" + returnCode + ", msg=" + msg + ", extras=" 1352a53332343c9fbc734595d269a2c35371227904bJeff Sharkey + extras); 13625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root synchronized (this) { 137afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.returnCode = returnCode; 138afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu doneFlag = true; 139afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu notifyAll(); 140afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 141afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 142afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 143afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public boolean isDone() { 144afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return doneFlag; 145afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 146afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 147afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 148afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu abstract class GenericReceiver extends BroadcastReceiver { 149afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu private boolean doneFlag = false; 15025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 151afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu boolean received = false; 15225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 153afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Intent intent; 15425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 155afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu IntentFilter filter; 15625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 157afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu abstract boolean notifyNow(Intent intent); 15825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 159afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu @Override 160afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void onReceive(Context context, Intent intent) { 161afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if (notifyNow(intent)) { 162afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu synchronized (this) { 163afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu received = true; 164afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu doneFlag = true; 165afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.intent = intent; 166afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu notifyAll(); 167afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 168afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 169afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 170afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 171afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public boolean isDone() { 172afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return doneFlag; 173afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 174afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 175afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void setFilter(IntentFilter filter) { 176afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.filter = filter; 177afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 178afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 179afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 180afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu class InstallReceiver extends GenericReceiver { 181afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String pkgName; 182afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 183afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu InstallReceiver(String pkgName) { 184afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.pkgName = pkgName; 185afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); 186afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu filter.addDataScheme("package"); 187afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu super.setFilter(filter); 188afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 189afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 190afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public boolean notifyNow(Intent intent) { 191afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String action = intent.getAction(); 192afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if (!Intent.ACTION_PACKAGE_ADDED.equals(action)) { 193afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return false; 194afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 195afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Uri data = intent.getData(); 196afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String installedPkg = data.getEncodedSchemeSpecificPart(); 197afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if (pkgName.equals(installedPkg)) { 198afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return true; 199afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 200afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return false; 201afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 202afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 203afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 204315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu private PackageManager getPm() { 205afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return mContext.getPackageManager(); 206afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 207afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 208315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu private IPackageManager getIPm() { 209315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu IPackageManager ipm = IPackageManager.Stub.asInterface( 210315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu ServiceManager.getService("package")); 211315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return ipm; 212315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 213315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu 214b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root public void invokeInstallPackage(Uri packageURI, int flags, GenericReceiver receiver, 215b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root boolean shouldSucceed) { 216f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate TestInstallObserver observer = new TestInstallObserver(); 217afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu mContext.registerReceiver(receiver, receiver.filter); 218afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 219afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu // Wait on observer 22025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root synchronized (observer) { 221b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu synchronized (receiver) { 222afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu getPm().installPackage(packageURI, observer, flags, null); 223afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu long waitTime = 0; 22425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) { 22594e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root try { 22694e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root observer.wait(WAIT_TIME_INCR); 22794e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root waitTime += WAIT_TIME_INCR; 22894e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root } catch (InterruptedException e) { 22994e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root Log.i(TAG, "Interrupted during sleep", e); 23094e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root } 231afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 23225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root if (!observer.isDone()) { 23394e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root fail("Timed out waiting for packageInstalled callback"); 234afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 235b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root 236b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root if (shouldSucceed) { 237b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root if (observer.returnCode != PackageManager.INSTALL_SUCCEEDED) { 238b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root fail("Package installation should have succeeded, but got code " 239b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root + observer.returnCode); 240b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root } 241b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root } else { 242b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root if (observer.returnCode == PackageManager.INSTALL_SUCCEEDED) { 243b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root fail("Package installation should fail"); 244b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root } 245b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root 246b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root /* 247b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root * We'll never expect get a notification since we 248b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root * shouldn't succeed. 249b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root */ 250b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root return; 251afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 252b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root 253afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu // Verify we received the broadcast 254afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu waitTime = 0; 25525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root while ((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME)) { 25694e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root try { 25794e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root receiver.wait(WAIT_TIME_INCR); 25894e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root waitTime += WAIT_TIME_INCR; 25994e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root } catch (InterruptedException e) { 26094e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root Log.i(TAG, "Interrupted during sleep", e); 26194e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root } 262afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 26325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root if (!receiver.isDone()) { 26494e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root fail("Timed out waiting for PACKAGE_ADDED notification"); 265afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 266afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 267afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 268afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } finally { 269afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu mContext.unregisterReceiver(receiver); 270afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 271afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 272afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 2731683afac148f5bce186f7af7a6a8ea6294ecd379Kenny Root public void invokeInstallPackageFail(Uri packageURI, int flags, int expectedResult) { 274f1977b4500e82b72ea6aa5c46d97406a20017cafChristopher Tate TestInstallObserver observer = new TestInstallObserver(); 2755b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu try { 2765b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu // Wait on observer 27725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root synchronized (observer) { 2785b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu getPm().installPackage(packageURI, observer, flags, null); 2795b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu long waitTime = 0; 28025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) { 28194e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root try { 28294e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root observer.wait(WAIT_TIME_INCR); 28394e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root waitTime += WAIT_TIME_INCR; 28494e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root } catch (InterruptedException e) { 28594e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root Log.i(TAG, "Interrupted during sleep", e); 28694e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root } 2875b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 28825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root if (!observer.isDone()) { 28994e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root fail("Timed out waiting for packageInstalled callback"); 2905b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 2911683afac148f5bce186f7af7a6a8ea6294ecd379Kenny Root assertEquals(expectedResult, observer.returnCode); 2925b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 2935b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } finally { 2945b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 2955b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 2965b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu 297afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Uri getInstallablePackage(int fileResId, File outFile) { 298afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Resources res = mContext.getResources(); 299afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu InputStream is = null; 300afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 301afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu is = res.openRawResource(fileResId); 302afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } catch (NotFoundException e) { 303afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu failStr("Failed to load resource with id: " + fileResId); 304afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 305afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu FileUtils.setPermissions(outFile.getPath(), 306afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IRWXO, 307afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu -1, -1); 308afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertTrue(FileUtils.copyToFile(is, outFile)); 309afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu FileUtils.setPermissions(outFile.getPath(), 310afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IRWXO, 311afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu -1, -1); 312afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return Uri.fromFile(outFile); 313afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 314afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 315c4858a2ba972e86436d629c4d3f18eb49116de14Jeff Sharkey private PackageParser.Package parsePackage(Uri packageURI) throws PackageParserException { 316afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu final String archiveFilePath = packageURI.getPath(); 317275e085d5a42ced54bb79e40ff76c77539e7d82dJeff Sharkey PackageParser packageParser = new PackageParser(); 318afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu File sourceFile = new File(archiveFilePath); 319275e085d5a42ced54bb79e40ff76c77539e7d82dJeff Sharkey PackageParser.Package pkg = packageParser.parseMonolithicPackage(sourceFile, 0); 3208946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu packageParser = null; 3218946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu return pkg; 322afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 32325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 32414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu private boolean checkSd(long pkgLen) { 32514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu String status = Environment.getExternalStorageState(); 32614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (!status.equals(Environment.MEDIA_MOUNTED)) { 32714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return false; 32814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 32914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu long sdSize = -1; 33025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root StatFs sdStats = new StatFs(Environment.getExternalStorageDirectory().getPath()); 33125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root sdSize = (long) sdStats.getAvailableBlocks() * (long) sdStats.getBlockSize(); 33294e0acbf2f2b74a89c4ab0c81a4c1330964bde5fKenny Root // TODO check for thresholds here 33314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return pkgLen <= sdSize; 334edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 33514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 33625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 33714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu private boolean checkInt(long pkgLen) { 33814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu StatFs intStats = new StatFs(Environment.getDataDirectory().getPath()); 33925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root long intSize = (long) intStats.getBlockCount() * (long) intStats.getBlockSize(); 34025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root long iSize = (long) intStats.getAvailableBlocks() * (long) intStats.getBlockSize(); 34114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // TODO check for thresholds here? 34214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return pkgLen <= iSize; 34314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 34425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 34514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu private static final int INSTALL_LOC_INT = 1; 34625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 34714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu private static final int INSTALL_LOC_SD = 2; 34825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 34914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu private static final int INSTALL_LOC_ERR = -1; 35025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 35114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu private int getInstallLoc(int flags, int expInstallLocation, long pkgLen) { 352cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu // Flags explicitly over ride everything else. 35325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root if ((flags & PackageManager.INSTALL_EXTERNAL) != 0) { 35414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return INSTALL_LOC_SD; 35514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } else if ((flags & PackageManager.INSTALL_INTERNAL) != 0) { 35614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return INSTALL_LOC_INT; 357cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 358cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu // Manifest option takes precedence next 359cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu if (expInstallLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL) { 36014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (checkSd(pkgLen)) { 36125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root return INSTALL_LOC_SD; 36214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 36314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (checkInt(pkgLen)) { 36414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return INSTALL_LOC_INT; 36514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 36614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return INSTALL_LOC_ERR; 367cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 3689b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu if (expInstallLocation == PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) { 36914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (checkInt(pkgLen)) { 37014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return INSTALL_LOC_INT; 37114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 37214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return INSTALL_LOC_ERR; 3739b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu } 37414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (expInstallLocation == PackageInfo.INSTALL_LOCATION_AUTO) { 375315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu // Check for free memory internally 376315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu if (checkInt(pkgLen)) { 377315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_INT; 378315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 379315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu // Check for free memory externally 380315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu if (checkSd(pkgLen)) { 381315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_SD; 382315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 383315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_ERR; 38414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 38514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Check for settings preference. 386cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu boolean checkSd = false; 387315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu int userPref = getDefaultInstallLoc(); 388315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu if (userPref == APP_INSTALL_DEVICE) { 389315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu if (checkInt(pkgLen)) { 390315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_INT; 391cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 392315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_ERR; 393315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } else if (userPref == APP_INSTALL_SDCARD) { 394315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu if (checkSd(pkgLen)) { 395315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_SD; 396cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 397315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_ERR; 398315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 399315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu // Default system policy for apps with no manifest option specified. 400315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu // Check for free memory internally 401315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu if (checkInt(pkgLen)) { 402315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_INT; 40390d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu } 404315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_ERR; 405cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 406edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 407cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu private void assertInstall(PackageParser.Package pkg, int flags, int expInstallLocation) { 408afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 409cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu String pkgName = pkg.packageName; 41014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu ApplicationInfo info = getPm().getApplicationInfo(pkgName, 0); 41114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu assertNotNull(info); 41214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu assertEquals(pkgName, info.packageName); 41314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu File dataDir = Environment.getDataDirectory(); 41414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu String appInstallPath = new File(dataDir, "app").getPath(); 41514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu String drmInstallPath = new File(dataDir, "app-private").getPath(); 41614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu File srcDir = new File(info.sourceDir); 4172a53332343c9fbc734595d269a2c35371227904bJeff Sharkey String srcPath = srcDir.getParentFile().getParent(); 41814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu File publicSrcDir = new File(info.publicSourceDir); 4192a53332343c9fbc734595d269a2c35371227904bJeff Sharkey String publicSrcPath = publicSrcDir.getParentFile().getParent(); 42014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu long pkgLen = new File(info.sourceDir).length(); 4212a53332343c9fbc734595d269a2c35371227904bJeff Sharkey String expectedLibPath = new File(new File(info.sourceDir).getParentFile(), "lib") 4222a53332343c9fbc734595d269a2c35371227904bJeff Sharkey .getPath(); 42314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu 4246dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root int rLoc = getInstallLoc(flags, expInstallLocation, pkgLen); 4256dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root if (rLoc == INSTALL_LOC_INT) { 4266dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) { 4276dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root assertTrue("The application should be installed forward locked", 4286dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root (info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0); 4297e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertStartsWith("The APK path should point to the ASEC", 4307e921a157d1aca97506302637d4f3843ddc2b982Kenny Root SECURE_CONTAINERS_PREFIX, srcPath); 4317e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertStartsWith("The public APK path should point to the ASEC", 4327e921a157d1aca97506302637d4f3843ddc2b982Kenny Root SECURE_CONTAINERS_PREFIX, publicSrcPath); 4337e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertStartsWith("The native library path should point to the ASEC", 4347e921a157d1aca97506302637d4f3843ddc2b982Kenny Root SECURE_CONTAINERS_PREFIX, info.nativeLibraryDir); 4357de350a91301985b7f2d9f28edde5aade8495d9bNick Kralevich try { 4367de350a91301985b7f2d9f28edde5aade8495d9bNick Kralevich String compatLib = new File(info.dataDir + "/lib").getCanonicalPath(); 4377de350a91301985b7f2d9f28edde5aade8495d9bNick Kralevich assertEquals("The compatibility lib directory should be a symbolic link to " 4387de350a91301985b7f2d9f28edde5aade8495d9bNick Kralevich + info.nativeLibraryDir, 4397de350a91301985b7f2d9f28edde5aade8495d9bNick Kralevich info.nativeLibraryDir, compatLib); 4407de350a91301985b7f2d9f28edde5aade8495d9bNick Kralevich } catch (IOException e) { 4417de350a91301985b7f2d9f28edde5aade8495d9bNick Kralevich fail("compat check: Can't read " + info.dataDir + "/lib"); 4427de350a91301985b7f2d9f28edde5aade8495d9bNick Kralevich } 4436dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root } else { 4446dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root assertFalse((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0); 4452a53332343c9fbc734595d269a2c35371227904bJeff Sharkey assertEquals(appInstallPath, srcPath); 4462a53332343c9fbc734595d269a2c35371227904bJeff Sharkey assertEquals(appInstallPath, publicSrcPath); 4477e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertStartsWith("Native library should point to shared lib directory", 4482a53332343c9fbc734595d269a2c35371227904bJeff Sharkey expectedLibPath, info.nativeLibraryDir); 4492a53332343c9fbc734595d269a2c35371227904bJeff Sharkey assertDirOwnerGroupPermsIfExists( 4507e921a157d1aca97506302637d4f3843ddc2b982Kenny Root "Native library directory should be owned by system:system and 0755", 4517e921a157d1aca97506302637d4f3843ddc2b982Kenny Root Process.SYSTEM_UID, Process.SYSTEM_UID, 4527e921a157d1aca97506302637d4f3843ddc2b982Kenny Root S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH, 4537e921a157d1aca97506302637d4f3843ddc2b982Kenny Root info.nativeLibraryDir); 4546dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root } 4556dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root assertFalse((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0); 4566a6b007c77e5cab7ee435506a4f65824f52028b6Kenny Root 4576dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root // Make sure the native library dir is not a symlink 4586dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root final File nativeLibDir = new File(info.nativeLibraryDir); 4592a53332343c9fbc734595d269a2c35371227904bJeff Sharkey if (nativeLibDir.exists()) { 4602a53332343c9fbc734595d269a2c35371227904bJeff Sharkey try { 4612a53332343c9fbc734595d269a2c35371227904bJeff Sharkey assertEquals("Native library dir should not be a symlink", 4622a53332343c9fbc734595d269a2c35371227904bJeff Sharkey info.nativeLibraryDir, nativeLibDir.getCanonicalPath()); 4632a53332343c9fbc734595d269a2c35371227904bJeff Sharkey } catch (IOException e) { 4642a53332343c9fbc734595d269a2c35371227904bJeff Sharkey fail("Can't read " + nativeLibDir.getPath()); 4652a53332343c9fbc734595d269a2c35371227904bJeff Sharkey } 4666dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root } 46725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } else if (rLoc == INSTALL_LOC_SD) { 4686dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) { 4696dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root assertTrue("The application should be installed forward locked", 4706dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root (info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0); 47114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } else { 4726dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root assertFalse("The application should not be installed forward locked", 4736dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root (info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0); 47414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 4756dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root assertTrue("Application flags (" + info.flags 4766dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root + ") should contain FLAG_EXTERNAL_STORAGE", 4776dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root (info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0); 4786dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root // Might need to check: 4796dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root // ((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0) 4807e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertStartsWith("The APK path should point to the ASEC", 4817e921a157d1aca97506302637d4f3843ddc2b982Kenny Root SECURE_CONTAINERS_PREFIX, srcPath); 4827e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertStartsWith("The public APK path should point to the ASEC", 4837e921a157d1aca97506302637d4f3843ddc2b982Kenny Root SECURE_CONTAINERS_PREFIX, publicSrcPath); 4847e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertStartsWith("The native library path should point to the ASEC", 4857e921a157d1aca97506302637d4f3843ddc2b982Kenny Root SECURE_CONTAINERS_PREFIX, info.nativeLibraryDir); 4866dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root 4876dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root // Make sure the native library in /data/data/<app>/lib is a 4886dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root // symlink to the ASEC 4896dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root final File nativeLibSymLink = new File(info.dataDir, "lib"); 4906dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root assertTrue("Native library symlink should exist at " + nativeLibSymLink.getPath(), 4916dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root nativeLibSymLink.exists()); 4926dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root try { 4936dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root assertEquals(nativeLibSymLink.getPath() + " should be a symlink to " 49425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root + info.nativeLibraryDir, info.nativeLibraryDir, 49525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root nativeLibSymLink.getCanonicalPath()); 4966dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root } catch (IOException e) { 4976dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root fail("Can't read " + nativeLibSymLink.getPath()); 4986dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root } 4996dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root } else { 5006dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root // TODO handle error. Install should have failed. 5016dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root fail("Install should have failed"); 502afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 503afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } catch (NameNotFoundException e) { 504afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu failStr("failed with exception : " + e); 505afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 506afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 507edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 5082a53332343c9fbc734595d269a2c35371227904bJeff Sharkey private void assertDirOwnerGroupPermsIfExists(String reason, int uid, int gid, int perms, 5092a53332343c9fbc734595d269a2c35371227904bJeff Sharkey String path) { 5102a53332343c9fbc734595d269a2c35371227904bJeff Sharkey if (!new File(path).exists()) { 5112a53332343c9fbc734595d269a2c35371227904bJeff Sharkey return; 5122a53332343c9fbc734595d269a2c35371227904bJeff Sharkey } 5137e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 5142a53332343c9fbc734595d269a2c35371227904bJeff Sharkey final StructStat stat; 5157e921a157d1aca97506302637d4f3843ddc2b982Kenny Root try { 51634385d352da19805ae948215e2edbeedd16b7941Elliott Hughes stat = Os.lstat(path); 5177e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } catch (ErrnoException e) { 5187e921a157d1aca97506302637d4f3843ddc2b982Kenny Root throw new AssertionError(reason + "\n" + "Got: " + path + " does not exist"); 5197e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 5207e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 5217e921a157d1aca97506302637d4f3843ddc2b982Kenny Root StringBuilder sb = new StringBuilder(); 5227e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 5237e921a157d1aca97506302637d4f3843ddc2b982Kenny Root if (!S_ISDIR(stat.st_mode)) { 5247e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append("\nExpected type: "); 5257e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append(S_IFDIR); 5267e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append("\ngot type: "); 5277e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append((stat.st_mode & S_IFMT)); 5287e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 5297e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 5307e921a157d1aca97506302637d4f3843ddc2b982Kenny Root if (stat.st_uid != uid) { 5317e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append("\nExpected owner: "); 5327e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append(uid); 5337e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append("\nGot owner: "); 5347e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append(stat.st_uid); 5357e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 5367e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 5377e921a157d1aca97506302637d4f3843ddc2b982Kenny Root if (stat.st_gid != gid) { 5387e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append("\nExpected group: "); 5397e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append(gid); 5407e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append("\nGot group: "); 5417e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append(stat.st_gid); 5427e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 5437e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 5447e921a157d1aca97506302637d4f3843ddc2b982Kenny Root if ((stat.st_mode & ~S_IFMT) != perms) { 5457e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append("\nExpected permissions: "); 5467e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append(Integer.toOctalString(perms)); 5477e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append("\nGot permissions: "); 5487e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append(Integer.toOctalString(stat.st_mode & ~S_IFMT)); 5497e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 5507e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 5517e921a157d1aca97506302637d4f3843ddc2b982Kenny Root if (sb.length() > 0) { 5527e921a157d1aca97506302637d4f3843ddc2b982Kenny Root throw new AssertionError(reason + sb.toString()); 5537e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 5547e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 5557e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 5567e921a157d1aca97506302637d4f3843ddc2b982Kenny Root private static void assertStartsWith(String prefix, String actual) { 5577e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertStartsWith("", prefix, actual); 5587e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 5597e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 5607e921a157d1aca97506302637d4f3843ddc2b982Kenny Root private static void assertStartsWith(String description, String prefix, String actual) { 5617e921a157d1aca97506302637d4f3843ddc2b982Kenny Root if (!actual.startsWith(prefix)) { 5627e921a157d1aca97506302637d4f3843ddc2b982Kenny Root StringBuilder sb = new StringBuilder(description); 5637e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append("\nExpected prefix: "); 5647e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append(prefix); 5657e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append("\n got: "); 5667e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append(actual); 5677e921a157d1aca97506302637d4f3843ddc2b982Kenny Root sb.append('\n'); 5687e921a157d1aca97506302637d4f3843ddc2b982Kenny Root throw new AssertionError(sb.toString()); 5697e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 5707e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 5717e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 5725b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu private void assertNotInstalled(String pkgName) { 5735b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu try { 5745b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu ApplicationInfo info = getPm().getApplicationInfo(pkgName, 0); 5755b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu fail(pkgName + " shouldnt be installed"); 5765b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } catch (NameNotFoundException e) { 5775b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 578e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root 579e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); 580e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root List<UserInfo> users = um.getUsers(); 581e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root for (UserInfo user : users) { 582e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root String dataDir = PackageManager.getDataDirForUser(user.id, pkgName); 583e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root assertFalse("Application data directory should not exist: " + dataDir, 584e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root new File(dataDir).exists()); 585e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root } 5865b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 587afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 588afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu class InstallParams { 589afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Uri packageURI; 59025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 591afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu PackageParser.Package pkg; 59225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 593c4858a2ba972e86436d629c4d3f18eb49116de14Jeff Sharkey InstallParams(String outFileName, int rawResId) throws PackageParserException { 594315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu this.pkg = getParsedPackage(outFileName, rawResId); 595c4858a2ba972e86436d629c4d3f18eb49116de14Jeff Sharkey this.packageURI = Uri.fromFile(new File(pkg.codePath)); 596315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 59725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 598315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu InstallParams(PackageParser.Package pkg) { 599c4858a2ba972e86436d629c4d3f18eb49116de14Jeff Sharkey this.packageURI = Uri.fromFile(new File(pkg.codePath)); 600afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.pkg = pkg; 601afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 60225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 603315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu long getApkSize() { 604c4858a2ba972e86436d629c4d3f18eb49116de14Jeff Sharkey File file = new File(pkg.codePath); 605315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return file.length(); 606315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 607afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 608afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 60925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private InstallParams sampleInstallFromRawResource(int flags, boolean cleanUp) throws Exception { 61025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root return installFromRawResource("install.apk", R.raw.install, flags, cleanUp, false, -1, 61125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 6125b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 6138946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 614d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String PERM_PACKAGE = "package"; 61525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 616d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String PERM_DEFINED = "defined"; 61725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 618d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String PERM_UNDEFINED = "undefined"; 61925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 620d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String PERM_USED = "used"; 62125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 622d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String PERM_NOTUSED = "notused"; 623edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 624d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn private void assertPermissions(String[] cmds) { 625d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn final PackageManager pm = getPm(); 626d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn String pkg = null; 627d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PackageInfo pkgInfo = null; 628d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn String mode = PERM_DEFINED; 629d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn int i = 0; 630d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn while (i < cmds.length) { 631d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn String cmd = cmds[i++]; 632d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (cmd == PERM_PACKAGE) { 633d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn pkg = cmds[i++]; 634d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 635d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn pkgInfo = pm.getPackageInfo(pkg, 636d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PackageManager.GET_PERMISSIONS 637d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn | PackageManager.GET_UNINSTALLED_PACKAGES); 638d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (NameNotFoundException e) { 639d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn pkgInfo = null; 640d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 641d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } else if (cmd == PERM_DEFINED || cmd == PERM_UNDEFINED 642d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn || cmd == PERM_USED || cmd == PERM_NOTUSED) { 643d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn mode = cmds[i++]; 644d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } else { 645d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (mode == PERM_DEFINED) { 646d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 647d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PermissionInfo pi = pm.getPermissionInfo(cmd, 0); 648d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertNotNull(pi); 649d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertEquals(pi.packageName, pkg); 650d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertEquals(pi.name, cmd); 651d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertNotNull(pkgInfo); 652d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn boolean found = false; 65325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root for (int j = 0; j < pkgInfo.permissions.length && !found; j++) { 654d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (pkgInfo.permissions[j].name.equals(cmd)) { 655d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn found = true; 656d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 657d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 658d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (!found) { 659d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn fail("Permission not found: " + cmd); 660d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 661d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (NameNotFoundException e) { 662d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn throw new RuntimeException(e); 663d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 664d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } else if (mode == PERM_UNDEFINED) { 665d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 666d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn pm.getPermissionInfo(cmd, 0); 667d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn throw new RuntimeException("Permission exists: " + cmd); 668d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (NameNotFoundException e) { 669d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 670d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (pkgInfo != null) { 671d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn boolean found = false; 67225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root for (int j = 0; j < pkgInfo.permissions.length && !found; j++) { 673d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (pkgInfo.permissions[j].name.equals(cmd)) { 674d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn found = true; 675d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 676d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 677d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (found) { 678d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn fail("Permission still exists: " + cmd); 679d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 680d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 681d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } else if (mode == PERM_USED || mode == PERM_NOTUSED) { 682d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn boolean found = false; 68325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root for (int j = 0; j < pkgInfo.requestedPermissions.length && !found; j++) { 684d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (pkgInfo.requestedPermissions[j].equals(cmd)) { 685d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn found = true; 686d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 687d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 688d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (!found) { 689d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn fail("Permission not requested: " + cmd); 690d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 691d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (mode == PERM_USED) { 69225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root if (pm.checkPermission(cmd, pkg) != PackageManager.PERMISSION_GRANTED) { 693d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn fail("Permission not granted: " + cmd); 694d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 695d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } else { 69625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root if (pm.checkPermission(cmd, pkg) != PackageManager.PERMISSION_DENIED) { 697d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn fail("Permission granted: " + cmd); 698d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 699d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 700d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 701d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 702d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 703d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 7048946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 705c4858a2ba972e86436d629c4d3f18eb49116de14Jeff Sharkey private PackageParser.Package getParsedPackage(String outFileName, int rawResId) 706c4858a2ba972e86436d629c4d3f18eb49116de14Jeff Sharkey throws PackageParserException { 707ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageManager pm = mContext.getPackageManager(); 708ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu File filesDir = mContext.getFilesDir(); 709ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu File outFile = new File(filesDir, outFileName); 710ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu Uri packageURI = getInstallablePackage(rawResId, outFile); 711ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageParser.Package pkg = parsePackage(packageURI); 712ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu return pkg; 713ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 714ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu 715afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu /* 716afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * Utility function that reads a apk bundled as a raw resource 717afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * copies it into own data directory and invokes 718afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * PackageManager api to install it. 719afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu */ 72025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private void installFromRawResource(InstallParams ip, int flags, boolean cleanUp, boolean fail, 72125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int result, int expInstallLocation) throws Exception { 7228a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu PackageManager pm = mContext.getPackageManager(); 723315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu PackageParser.Package pkg = ip.pkg; 724315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu Uri packageURI = ip.packageURI; 7258a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu if ((flags & PackageManager.INSTALL_REPLACE_EXISTING) == 0) { 7268a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu // Make sure the package doesn't exist 727afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 7288a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu ApplicationInfo appInfo = pm.getApplicationInfo(pkg.packageName, 7298a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 7308a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu GenericReceiver receiver = new DeleteReceiver(pkg.packageName); 731315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu invokeDeletePackage(pkg.packageName, 0, receiver); 732e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root } catch (NameNotFoundException e) { 7338a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 7348a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 7358a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu try { 7368a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu if (fail) { 737315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu invokeInstallPackageFail(packageURI, flags, result); 738ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if ((flags & PackageManager.INSTALL_REPLACE_EXISTING) == 0) { 739ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu assertNotInstalled(pkg.packageName); 740ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 7418a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } else { 7428a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu InstallReceiver receiver = new InstallReceiver(pkg.packageName); 743b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root invokeInstallPackage(packageURI, flags, receiver, true); 7448a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu // Verify installed information 7458a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu assertInstall(pkg, flags, expInstallLocation); 746afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 747afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } finally { 748afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if (cleanUp) { 7499b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu cleanUpInstall(ip); 750afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 751afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 752315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 753315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu 754315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu /* 755315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu * Utility function that reads a apk bundled as a raw resource 756315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu * copies it into own data directory and invokes 757315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu * PackageManager api to install it. 758315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu */ 75925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private InstallParams installFromRawResource(String outFileName, int rawResId, int flags, 76025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root boolean cleanUp, boolean fail, int result, int expInstallLocation) throws Exception { 761315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu InstallParams ip = new InstallParams(outFileName, rawResId); 762315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu installFromRawResource(ip, flags, cleanUp, fail, result, expInstallLocation); 7638a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu return ip; 764afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 765afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 766f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 76725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testInstallNormalInternal() throws Exception { 7685b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu sampleInstallFromRawResource(0, true); 769afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 770afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 771f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 77225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testInstallFwdLockedInternal() throws Exception { 7735b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true); 774afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 775afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 776f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 77725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testInstallSdcard() throws Exception { 7783c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 7793c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 7803c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 7813c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 7823c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 783d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root mountMedia(); 7845b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, true); 785afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 786afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 78725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /* ------------------------- Test replacing packages -------------- */ 788afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu class ReplaceReceiver extends GenericReceiver { 789afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String pkgName; 79025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 791b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final static int INVALID = -1; 79225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 793b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final static int REMOVED = 1; 79425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 795b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final static int ADDED = 2; 79625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 797b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final static int REPLACED = 3; 79825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 799b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu int removed = INVALID; 80025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 801b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // for updated system apps only 802b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean update = false; 803afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 804afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu ReplaceReceiver(String pkgName) { 805afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.pkgName = pkgName; 806afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED); 807b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu filter.addAction(Intent.ACTION_PACKAGE_ADDED); 808b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (update) { 809b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu filter.addAction(Intent.ACTION_PACKAGE_REPLACED); 810b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 811b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu filter.addDataScheme("package"); 812afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu super.setFilter(filter); 813afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 814afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 815afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public boolean notifyNow(Intent intent) { 816afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String action = intent.getAction(); 817b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Uri data = intent.getData(); 818b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String installedPkg = data.getEncodedSchemeSpecificPart(); 819b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (pkgName == null || !pkgName.equals(installedPkg)) { 820b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 821b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 822b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) { 823b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu removed = REMOVED; 824b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else if (Intent.ACTION_PACKAGE_ADDED.equals(action)) { 825b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (removed != REMOVED) { 826b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 827b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 828b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); 829b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!replacing) { 830b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 831b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 832b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu removed = ADDED; 833b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!update) { 834b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 835afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 836b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else if (Intent.ACTION_PACKAGE_REPLACED.equals(action)) { 837b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (removed != ADDED) { 838b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 839b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 840b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu removed = REPLACED; 841b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 842afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 843afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return false; 844afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 845afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 846afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 847afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu /* 848afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * Utility function that reads a apk bundled as a raw resource 849afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * copies it into own data directory and invokes 850afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * PackageManager api to install first and then replace it 851afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * again. 852afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu */ 85325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private void sampleReplaceFromRawResource(int flags) throws Exception { 8545b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu InstallParams ip = sampleInstallFromRawResource(flags, false); 855b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean replace = ((flags & PackageManager.INSTALL_REPLACE_EXISTING) != 0); 856cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu Log.i(TAG, "replace=" + replace); 857afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu GenericReceiver receiver; 858b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (replace) { 859afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu receiver = new ReplaceReceiver(ip.pkg.packageName); 860b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.i(TAG, "Creating replaceReceiver"); 861afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } else { 862afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu receiver = new InstallReceiver(ip.pkg.packageName); 863afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 864afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 865b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root invokeInstallPackage(ip.packageURI, flags, receiver, replace); 866b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root if (replace) { 867b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root assertInstall(ip.pkg, flags, ip.pkg.installLocation); 868afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 869afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } finally { 870b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu cleanUpInstall(ip); 871afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 872afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 873afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 874f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 87525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceFailNormalInternal() throws Exception { 876ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu sampleReplaceFromRawResource(0); 877afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 878afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 879f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 88025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceFailFwdLockedInternal() throws Exception { 881ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu sampleReplaceFromRawResource(PackageManager.INSTALL_FORWARD_LOCK); 882afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 883afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 884f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 88525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceFailSdcard() throws Exception { 8863c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 8873c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 8883c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 8893c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 8903c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 891ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu sampleReplaceFromRawResource(PackageManager.INSTALL_EXTERNAL); 892afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 893afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 894f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 89525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceNormalInternal() throws Exception { 896ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING); 897afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 898b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 899f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 90025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceFwdLockedInternal() throws Exception { 90125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING 90225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root | PackageManager.INSTALL_FORWARD_LOCK); 903b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 904b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 905f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 90625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceSdcard() throws Exception { 9073c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 9083c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 9093c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 9103c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 9113c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 91225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING 91325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root | PackageManager.INSTALL_EXTERNAL); 914b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 915b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 9167e921a157d1aca97506302637d4f3843ddc2b982Kenny Root /* -------------- Delete tests --- */ 91725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private static class DeleteObserver extends IPackageDeleteObserver.Stub { 9187e921a157d1aca97506302637d4f3843ddc2b982Kenny Root private CountDownLatch mLatch = new CountDownLatch(1); 919b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 9207e921a157d1aca97506302637d4f3843ddc2b982Kenny Root private int mReturnCode; 921b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 9227e921a157d1aca97506302637d4f3843ddc2b982Kenny Root private final String mPackageName; 9237e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 9247e921a157d1aca97506302637d4f3843ddc2b982Kenny Root private String mObservedPackage; 9257e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 9267e921a157d1aca97506302637d4f3843ddc2b982Kenny Root public DeleteObserver(String packageName) { 9277e921a157d1aca97506302637d4f3843ddc2b982Kenny Root mPackageName = packageName; 9287e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 9297e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 9307e921a157d1aca97506302637d4f3843ddc2b982Kenny Root public boolean isSuccessful() { 9317e921a157d1aca97506302637d4f3843ddc2b982Kenny Root return mReturnCode == PackageManager.DELETE_SUCCEEDED; 932b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 933b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 934c39bb4aaa7be1b9b0cc9fb0b1f03d54f7609ffebKenny Root public void packageDeleted(String packageName, int returnCode) throws RemoteException { 9357e921a157d1aca97506302637d4f3843ddc2b982Kenny Root mObservedPackage = packageName; 9367e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 9377e921a157d1aca97506302637d4f3843ddc2b982Kenny Root mReturnCode = returnCode; 9387e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 9397e921a157d1aca97506302637d4f3843ddc2b982Kenny Root mLatch.countDown(); 9407e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 9417e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 9427e921a157d1aca97506302637d4f3843ddc2b982Kenny Root public void waitForCompletion(long timeoutMillis) { 9437e921a157d1aca97506302637d4f3843ddc2b982Kenny Root final long deadline = SystemClock.uptimeMillis() + timeoutMillis; 9447e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 9457e921a157d1aca97506302637d4f3843ddc2b982Kenny Root long waitTime = timeoutMillis; 9467e921a157d1aca97506302637d4f3843ddc2b982Kenny Root while (waitTime > 0) { 9477e921a157d1aca97506302637d4f3843ddc2b982Kenny Root try { 9487e921a157d1aca97506302637d4f3843ddc2b982Kenny Root boolean done = mLatch.await(waitTime, TimeUnit.MILLISECONDS); 9497e921a157d1aca97506302637d4f3843ddc2b982Kenny Root if (done) { 9507e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertEquals(mPackageName, mObservedPackage); 9517e921a157d1aca97506302637d4f3843ddc2b982Kenny Root return; 9527e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 9537e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } catch (InterruptedException e) { 9547e921a157d1aca97506302637d4f3843ddc2b982Kenny Root // TODO Auto-generated catch block 9557e921a157d1aca97506302637d4f3843ddc2b982Kenny Root e.printStackTrace(); 9567e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 9577e921a157d1aca97506302637d4f3843ddc2b982Kenny Root waitTime = deadline - SystemClock.uptimeMillis(); 958b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 9597e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 9607e921a157d1aca97506302637d4f3843ddc2b982Kenny Root throw new AssertionError("Timeout waiting for package deletion"); 961b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 962b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 963b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 964b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu class DeleteReceiver extends GenericReceiver { 965b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String pkgName; 966b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 967b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu DeleteReceiver(String pkgName) { 968b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu this.pkgName = pkgName; 969b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED); 970b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu filter.addDataScheme("package"); 971b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu super.setFilter(filter); 972b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 973b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 974b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public boolean notifyNow(Intent intent) { 975b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String action = intent.getAction(); 976b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!Intent.ACTION_PACKAGE_REMOVED.equals(action)) { 977b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 978b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 979b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Uri data = intent.getData(); 980b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String installedPkg = data.getEncodedSchemeSpecificPart(); 981b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (pkgName.equals(installedPkg)) { 982b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 983b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 984b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 985b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 986b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 987b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 9887e921a157d1aca97506302637d4f3843ddc2b982Kenny Root public boolean invokeDeletePackage(final String pkgName, int flags, GenericReceiver receiver) 9897e921a157d1aca97506302637d4f3843ddc2b982Kenny Root throws Exception { 9907e921a157d1aca97506302637d4f3843ddc2b982Kenny Root ApplicationInfo info = getPm().getApplicationInfo(pkgName, 9917e921a157d1aca97506302637d4f3843ddc2b982Kenny Root PackageManager.GET_UNINSTALLED_PACKAGES); 9927e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 993b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu mContext.registerReceiver(receiver, receiver.filter); 994b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 9957e921a157d1aca97506302637d4f3843ddc2b982Kenny Root DeleteObserver observer = new DeleteObserver(pkgName); 9967e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 997a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root getPm().deletePackage(pkgName, observer, flags | PackageManager.DELETE_ALL_USERS); 9987e921a157d1aca97506302637d4f3843ddc2b982Kenny Root observer.waitForCompletion(MAX_WAIT_TIME); 9997e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 10007e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertUninstalled(info); 10017e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 10027e921a157d1aca97506302637d4f3843ddc2b982Kenny Root // Verify we received the broadcast 1003a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root // TODO replace this with a CountDownLatch 1004a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root synchronized (receiver) { 1005a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root long waitTime = 0; 1006a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root while ((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME)) { 1007a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root receiver.wait(WAIT_TIME_INCR); 1008a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root waitTime += WAIT_TIME_INCR; 1009a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root } 1010a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root if (!receiver.isDone()) { 1011a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root throw new Exception("Timed out waiting for PACKAGE_REMOVED notification"); 1012a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root } 10137e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 10147e921a157d1aca97506302637d4f3843ddc2b982Kenny Root return receiver.received; 1015b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } finally { 1016b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu mContext.unregisterReceiver(receiver); 1017b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1018b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1019b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 10207e921a157d1aca97506302637d4f3843ddc2b982Kenny Root private static void assertUninstalled(ApplicationInfo info) throws Exception { 10217e921a157d1aca97506302637d4f3843ddc2b982Kenny Root File nativeLibraryFile = new File(info.nativeLibraryDir); 10227e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertFalse("Native library directory should be erased", nativeLibraryFile.exists()); 10237e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 10247e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 102525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void deleteFromRawResource(int iFlags, int dFlags) throws Exception { 10265b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu InstallParams ip = sampleInstallFromRawResource(iFlags, false); 10277767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn boolean retainData = ((dFlags & PackageManager.DELETE_KEEP_DATA) != 0); 1028b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu GenericReceiver receiver = new DeleteReceiver(ip.pkg.packageName); 1029b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 1030315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu assertTrue(invokeDeletePackage(ip.pkg.packageName, dFlags, receiver)); 1031b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu ApplicationInfo info = null; 1032b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.i(TAG, "okay4"); 1033b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 103425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root info = getPm().getApplicationInfo(ip.pkg.packageName, 103525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageManager.GET_UNINSTALLED_PACKAGES); 1036b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (NameNotFoundException e) { 1037b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu info = null; 1038b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1039b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (retainData) { 1040b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertNotNull(info); 1041b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertEquals(info.packageName, ip.pkg.packageName); 1042b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu File file = new File(info.dataDir); 1043b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertTrue(file.exists()); 1044b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else { 1045b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertNull(info); 1046b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1047b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (Exception e) { 1048b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu failStr(e); 1049b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } finally { 1050b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu cleanUpInstall(ip); 1051b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1052b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1053b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1054f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 105525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testDeleteNormalInternal() throws Exception { 1056b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu deleteFromRawResource(0, 0); 1057b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1058b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1059f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 106025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testDeleteFwdLockedInternal() throws Exception { 1061b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, 0); 1062b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1063b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1064f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 106525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testDeleteSdcard() throws Exception { 10663c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 10673c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 10683c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 10693c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 10703c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 10715b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu deleteFromRawResource(PackageManager.INSTALL_EXTERNAL, 0); 1072b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1073b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1074f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 107525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testDeleteNormalInternalRetainData() throws Exception { 10767767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn deleteFromRawResource(0, PackageManager.DELETE_KEEP_DATA); 1077b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1078b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1079f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 108025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testDeleteFwdLockedInternalRetainData() throws Exception { 10817767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, PackageManager.DELETE_KEEP_DATA); 1082b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1083b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1084f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 108525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testDeleteSdcardRetainData() throws Exception { 10863c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 10873c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 10883c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 10893c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 10903c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 10917767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn deleteFromRawResource(PackageManager.INSTALL_EXTERNAL, PackageManager.DELETE_KEEP_DATA); 1092afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 1093b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 109425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /* sdcard mount/unmount tests ***** */ 1095b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1096b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu class SdMountReceiver extends GenericReceiver { 1097b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String pkgNames[]; 109825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 1099b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean status = true; 1100b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1101b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu SdMountReceiver(String[] pkgNames) { 1102b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu this.pkgNames = pkgNames; 1103b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IntentFilter filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); 1104b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu super.setFilter(filter); 1105b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1106b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1107b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public boolean notifyNow(Intent intent) { 1108b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.i(TAG, "okay 1"); 1109b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String action = intent.getAction(); 1110b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) { 1111b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 1112b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1113b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String rpkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); 1114b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu for (String pkg : pkgNames) { 1115b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean found = false; 1116b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu for (String rpkg : rpkgList) { 1117b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (rpkg.equals(pkg)) { 1118b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu found = true; 1119b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu break; 1120b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1121b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1122b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!found) { 1123b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu status = false; 1124b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 1125b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1126b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1127b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 1128b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1129b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1130b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1131b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu class SdUnMountReceiver extends GenericReceiver { 1132b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String pkgNames[]; 113325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 1134b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean status = true; 1135b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1136b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu SdUnMountReceiver(String[] pkgNames) { 1137b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu this.pkgNames = pkgNames; 1138b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IntentFilter filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); 1139b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu super.setFilter(filter); 1140b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1141b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1142b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public boolean notifyNow(Intent intent) { 1143b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String action = intent.getAction(); 1144b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { 1145b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 1146b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1147b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String rpkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); 1148b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu for (String pkg : pkgNames) { 1149b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean found = false; 1150b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu for (String rpkg : rpkgList) { 1151b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (rpkg.equals(pkg)) { 1152b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu found = true; 1153b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu break; 1154b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1155b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1156b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!found) { 1157b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu status = false; 1158b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 1159b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1160b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1161b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 1162b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1163b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1164b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1165b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IMountService getMs() { 1166b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IBinder service = ServiceManager.getService("mount"); 1167b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (service != null) { 1168b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return IMountService.Stub.asInterface(service); 1169b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else { 1170b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.e(TAG, "Can't get mount service"); 1171b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1172b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return null; 1173b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1174b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1175d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root boolean checkMediaState(String desired) { 1176b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 1177d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root String mPath = Environment.getExternalStorageDirectory().getPath(); 1178d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root String actual = getMs().getVolumeState(mPath); 1179d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root if (desired.equals(actual)) { 1180d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root return true; 1181d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root } else { 1182d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root return false; 1183d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root } 1184b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (RemoteException e) { 1185d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root Log.e(TAG, "Exception while checking media state", e); 1186b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 1187b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1188b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1189b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1190b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean mountMedia() { 11913c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // We can't mount emulated storage. 11923c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 11933c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return true; 11943c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 11953c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 1196d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root if (checkMediaState(Environment.MEDIA_MOUNTED)) { 1197b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 1198b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1199d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root 1200d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root final String path = Environment.getExternalStorageDirectory().toString(); 1201d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root StorageListener observer = new StorageListener(Environment.MEDIA_MOUNTED); 1202d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root StorageManager sm = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE); 1203d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root sm.registerListener(observer); 1204b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 1205d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root // Wait on observer 1206d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root synchronized (observer) { 1207d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root int ret = getMs().mountVolume(path); 1208d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root if (ret != StorageResultCode.OperationSucceeded) { 1209d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root throw new Exception("Could not mount the media"); 1210d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root } 1211d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root long waitTime = 0; 1212d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) { 1213d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root observer.wait(WAIT_TIME_INCR); 1214d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root waitTime += WAIT_TIME_INCR; 1215d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root } 1216d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root if (!observer.isDone()) { 1217d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root throw new Exception("Timed out waiting for unmount media notification"); 1218d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root } 1219d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root return true; 1220d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root } 1221d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root } catch (Exception e) { 1222d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root Log.e(TAG, "Exception : " + e); 1223b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 1224d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root } finally { 1225d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root sm.unregisterListener(observer); 1226b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1227b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1228b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1229b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu private boolean unmountMedia() { 12303c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // We can't unmount emulated storage. 12313c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 12323c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return true; 12333c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 12343c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 1235d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root if (checkMediaState(Environment.MEDIA_UNMOUNTED)) { 1236d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root return true; 1237b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1238edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 1239d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root final String path = Environment.getExternalStorageDirectory().getPath(); 1240d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root StorageListener observer = new StorageListener(Environment.MEDIA_UNMOUNTED); 1241cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu StorageManager sm = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE); 1242cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu sm.registerListener(observer); 1243b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 1244cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu // Wait on observer 124525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root synchronized (observer) { 124613c7197da8a16f77f6398708a6314c80cb01e0d1Ben Komalo getMs().unmountVolume(path, true, false); 1247cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu long waitTime = 0; 124825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) { 1249cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu observer.wait(WAIT_TIME_INCR); 1250cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu waitTime += WAIT_TIME_INCR; 1251cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 125225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root if (!observer.isDone()) { 1253315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu throw new Exception("Timed out waiting for unmount media notification"); 1254cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 1255cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu return true; 1256cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 1257cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } catch (Exception e) { 1258315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu Log.e(TAG, "Exception : " + e); 1259cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu return false; 1260cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } finally { 1261cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu sm.unregisterListener(observer); 1262b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1263b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1264b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 126525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private boolean mountFromRawResource() throws Exception { 1266b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Install pkg on sdcard 1267cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu InstallParams ip = sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, false); 1268b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Installed pkg on sdcard"); 1269d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root boolean origState = checkMediaState(Environment.MEDIA_MOUNTED); 1270cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu boolean registeredReceiver = false; 1271b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu SdMountReceiver receiver = new SdMountReceiver(new String[]{ip.pkg.packageName}); 1272b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 1273b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Unmounting media"); 1274b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Unmount media 1275b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertTrue(unmountMedia()); 1276b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Unmounted media"); 1277b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Register receiver here 1278b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu PackageManager pm = getPm(); 1279b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu mContext.registerReceiver(receiver, receiver.filter); 1280cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu registeredReceiver = true; 1281b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1282b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Wait on receiver 1283b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu synchronized (receiver) { 1284b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Mounting media"); 1285b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Mount media again 1286b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertTrue(mountMedia()); 1287b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Mounted media"); 1288b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Waiting for notification"); 1289b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu long waitTime = 0; 1290b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Verify we received the broadcast 1291b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu waitTime = 0; 129225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root while ((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME)) { 1293b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu receiver.wait(WAIT_TIME_INCR); 1294b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu waitTime += WAIT_TIME_INCR; 1295b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1296b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if(!receiver.isDone()) { 1297b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu failStr("Timed out waiting for EXTERNAL_APPLICATIONS notification"); 1298b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1299b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return receiver.received; 1300b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1301b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (InterruptedException e) { 1302b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu failStr(e); 1303b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 1304b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } finally { 130525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root if (registeredReceiver) { 130625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root mContext.unregisterReceiver(receiver); 130725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 1308b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Restore original media state 1309b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (origState) { 1310b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu mountMedia(); 1311b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else { 1312b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu unmountMedia(); 1313b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1314b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Cleaning up install"); 1315b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu cleanUpInstall(ip); 1316b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1317b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1318b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1319cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu /* 1320cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu * Install package on sdcard. Unmount and then mount the media. 1321cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu * (Use PackageManagerService private api for now) 1322cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu * Make sure the installed package is available. 1323cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu */ 1324f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 132525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testMountSdNormalInternal() throws Exception { 13263c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 13273c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 13283c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 13293c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 13303c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 1331cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu assertTrue(mountFromRawResource()); 1332cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 1333cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu 133425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root void cleanUpInstall(InstallParams ip) throws Exception { 1335b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (ip == null) { 1336b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return; 1337b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1338b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Runtime.getRuntime().gc(); 13397e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 13407e921a157d1aca97506302637d4f3843ddc2b982Kenny Root final String packageName = ip.pkg.packageName; 13417e921a157d1aca97506302637d4f3843ddc2b982Kenny Root Log.i(TAG, "Deleting package : " + packageName); 13427e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 13437e921a157d1aca97506302637d4f3843ddc2b982Kenny Root ApplicationInfo info = null; 13447e921a157d1aca97506302637d4f3843ddc2b982Kenny Root try { 13457e921a157d1aca97506302637d4f3843ddc2b982Kenny Root info = getPm().getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES); 13467e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } catch (NameNotFoundException ignored) { 13477e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 13487e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 13497e921a157d1aca97506302637d4f3843ddc2b982Kenny Root DeleteObserver observer = new DeleteObserver(packageName); 1350a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root getPm().deletePackage(packageName, observer, PackageManager.DELETE_ALL_USERS); 13517e921a157d1aca97506302637d4f3843ddc2b982Kenny Root observer.waitForCompletion(MAX_WAIT_TIME); 13527e921a157d1aca97506302637d4f3843ddc2b982Kenny Root 13537e921a157d1aca97506302637d4f3843ddc2b982Kenny Root try { 13547e921a157d1aca97506302637d4f3843ddc2b982Kenny Root if (info != null) { 13557e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertUninstalled(info); 13567e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 13577e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } finally { 1358c4858a2ba972e86436d629c4d3f18eb49116de14Jeff Sharkey File outFile = new File(ip.pkg.codePath); 13597e921a157d1aca97506302637d4f3843ddc2b982Kenny Root if (outFile != null && outFile.exists()) { 13607e921a157d1aca97506302637d4f3843ddc2b982Kenny Root outFile.delete(); 13617e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } 1362b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1363b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 136425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 136525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private void cleanUpInstall(String pkgName) throws Exception { 1366ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (pkgName == null) { 1367ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu return; 1368ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 1369ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu Log.i(TAG, "Deleting package : " + pkgName); 1370ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu try { 1371ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu ApplicationInfo info = getPm().getApplicationInfo(pkgName, 1372ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 137325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 1374ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (info != null) { 13757e921a157d1aca97506302637d4f3843ddc2b982Kenny Root DeleteObserver observer = new DeleteObserver(pkgName); 1376a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root getPm().deletePackage(pkgName, observer, PackageManager.DELETE_ALL_USERS); 13777e921a157d1aca97506302637d4f3843ddc2b982Kenny Root observer.waitForCompletion(MAX_WAIT_TIME); 13787e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertUninstalled(info); 1379ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 138025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } catch (NameNotFoundException e) { 138125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 1382ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 1383117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 1384f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 138525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestInstallLocationInternal() throws Exception { 13865b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_internal, 1387cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu 0, true, false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 1388117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 1389117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 1390f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 139125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestInstallLocationSdcard() throws Exception { 13923c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 13933c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 13943c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 13953c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 13963c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 13975b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_sdcard, 1398cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu 0, true, false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 1399117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 1400117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 1401f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 140225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestInstallLocationAuto() throws Exception { 14035b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_auto, 1404cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu 0, true, false, -1, PackageInfo.INSTALL_LOCATION_AUTO); 1405117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 1406117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 1407f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 140825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestInstallLocationUnspecified() throws Exception { 14095b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_unspecified, 141090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu 0, true, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 1411117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 1412117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 1413f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 141425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestInstallLocationFwdLockedFlagSdcard() throws Exception { 14153c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 14163c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 14173c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 14183c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 14193c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 1420a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_unspecified, 1421a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu PackageManager.INSTALL_FORWARD_LOCK | 1422bf023589b3d9994f43823c7cb0450d278b084f9bKenny Root PackageManager.INSTALL_EXTERNAL, true, false, -1, 1423bf023589b3d9994f43823c7cb0450d278b084f9bKenny Root PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 1424a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1425a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 1426f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 142725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestInstallLocationFwdLockedSdcard() throws Exception { 14283c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 14293c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 14303c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 14313c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 14323c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 14335b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_sdcard, 143425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageManager.INSTALL_FORWARD_LOCK, true, false, -1, 1435a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 1436a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1437a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 14388a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu /* 14398a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * Install a package on internal flash via PackageManager install flag. Replace 14408a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * the package via flag to install on sdcard. Make sure the new flag overrides 14418a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * the old install location. 14428a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu */ 1443f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 144425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceFlagInternalSdcard() throws Exception { 14453c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 14463c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 14473c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 14483c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 14493c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 14508a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu int iFlags = 0; 14518a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu int rFlags = PackageManager.INSTALL_EXTERNAL; 1452a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu InstallParams ip = sampleInstallFromRawResource(iFlags, false); 1453a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName); 1454a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING; 1455a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu try { 1456b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root invokeInstallPackage(ip.packageURI, replaceFlags, receiver, true); 14578a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu assertInstall(ip.pkg, rFlags, ip.pkg.installLocation); 1458a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } catch (Exception e) { 1459a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu failStr("Failed with exception : " + e); 1460a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } finally { 1461a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu cleanUpInstall(ip); 1462a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1463a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1464a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 14658a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu /* 14668a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * Install a package on sdcard via PackageManager install flag. Replace 14678a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * the package with no flags or manifest option and make sure the old 14688a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * install location is retained. 14698a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu */ 1470f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 147125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceFlagSdcardInternal() throws Exception { 14723c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 14733c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 14743c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 14753c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 14763c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 14778a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu int iFlags = PackageManager.INSTALL_EXTERNAL; 14788a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu int rFlags = 0; 14798a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu InstallParams ip = sampleInstallFromRawResource(iFlags, false); 14808a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName); 14818a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING; 14828a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu try { 1483b7c24702c26c7824f025d603d703ddf2f19ddb30Kenny Root invokeInstallPackage(ip.packageURI, replaceFlags, receiver, true); 14848a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu assertInstall(ip.pkg, iFlags, ip.pkg.installLocation); 14858a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } catch (Exception e) { 14868a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu failStr("Failed with exception : " + e); 14878a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } finally { 14888a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu cleanUpInstall(ip); 14898a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 1490a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1491a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 1492f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 149325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestInstallLocationReplaceInternalSdcard() throws Exception { 14943c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 14953c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 14963c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 14973c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 14983c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 1499a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int iFlags = 0; 150090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int iApk = R.raw.install_loc_internal; 1501a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int rFlags = 0; 1502a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int rApk = R.raw.install_loc_sdcard; 1503a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu InstallParams ip = installFromRawResource("install.apk", iApk, 1504a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu iFlags, false, 150590d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 1506a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName); 1507a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING; 1508a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu try { 1509a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu InstallParams rp = installFromRawResource("install.apk", rApk, 15108a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu replaceFlags, false, 1511a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 1512a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu assertInstall(rp.pkg, replaceFlags, rp.pkg.installLocation); 1513a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } catch (Exception e) { 1514a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu failStr("Failed with exception : " + e); 1515a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } finally { 1516a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu cleanUpInstall(ip); 1517a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1518a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1519a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 1520f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 152125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestInstallLocationReplaceSdcardInternal() throws Exception { 15223c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 15233c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 15243c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 15253c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 15263c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 1527a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int iFlags = 0; 1528a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int iApk = R.raw.install_loc_sdcard; 1529a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int rFlags = 0; 1530a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int rApk = R.raw.install_loc_unspecified; 1531a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu InstallParams ip = installFromRawResource("install.apk", iApk, 1532a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu iFlags, false, 1533a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 1534a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING; 1535a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu try { 1536a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu InstallParams rp = installFromRawResource("install.apk", rApk, 15378a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu replaceFlags, false, 1538a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 1539a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu assertInstall(rp.pkg, replaceFlags, ip.pkg.installLocation); 1540a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } catch (Exception e) { 1541a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu failStr("Failed with exception : " + e); 1542a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } finally { 1543a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu cleanUpInstall(ip); 1544a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1545117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 15468946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 15478946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu class MoveReceiver extends GenericReceiver { 15488946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu String pkgName; 154925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 15508946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu final static int INVALID = -1; 155125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 15528946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu final static int REMOVED = 1; 155325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 15548946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu final static int ADDED = 2; 155525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 15568946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu int removed = INVALID; 15578946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 15588946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu MoveReceiver(String pkgName) { 15598946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu this.pkgName = pkgName; 15608946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); 15618946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); 15628946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu super.setFilter(filter); 15638946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 15648946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 15658946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu public boolean notifyNow(Intent intent) { 15668946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu String action = intent.getAction(); 15678946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu Log.i(TAG, "MoveReceiver::" + action); 15688946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { 15698946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu String[] list = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); 15708946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if (list != null) { 15718946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu for (String pkg : list) { 15728946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if (pkg.equals(pkgName)) { 15738946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu removed = REMOVED; 15748946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu break; 15758946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 15768946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 15778946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 15788946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu removed = REMOVED; 15798946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) { 15808946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if (removed != REMOVED) { 15818946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu return false; 15828946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 15838946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu String[] list = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); 15848946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if (list != null) { 15858946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu for (String pkg : list) { 15868946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if (pkg.equals(pkgName)) { 15878946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu removed = ADDED; 15888946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu return true; 15898946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 15908946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 15918946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 15928946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 15938946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu return false; 15948946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 15958946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 15968946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 15978946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu private class PackageMoveObserver extends IPackageMoveObserver.Stub { 15988946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu public int returnCode; 159925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 16008946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu private boolean doneFlag = false; 160125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 160230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu public String packageName; 160325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 160430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu public PackageMoveObserver(String pkgName) { 160530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu packageName = pkgName; 160630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 160725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 16088946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu public void packageMoved(String packageName, int returnCode) { 160930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu Log.i("DEBUG_MOVE::", "pkg = " + packageName + ", " + "ret = " + returnCode); 161030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu if (!packageName.equals(this.packageName)) { 161130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu return; 161230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 161325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root synchronized (this) { 16148946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu this.returnCode = returnCode; 16158946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu doneFlag = true; 16168946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu notifyAll(); 16178946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 16188946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 16198946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 16208946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu public boolean isDone() { 16218946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu return doneFlag; 16228946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 16238946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 16248946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 162525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public boolean invokeMovePackage(String pkgName, int flags, GenericReceiver receiver) 162625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root throws Exception { 162730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu PackageMoveObserver observer = new PackageMoveObserver(pkgName); 16288946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu final boolean received = false; 16298946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu mContext.registerReceiver(receiver, receiver.filter); 16308946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu try { 16318946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu // Wait on observer 163225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root synchronized (observer) { 16338946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu synchronized (receiver) { 16348946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu getPm().movePackage(pkgName, observer, flags); 16358946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu long waitTime = 0; 163625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) { 16378946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu observer.wait(WAIT_TIME_INCR); 16388946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu waitTime += WAIT_TIME_INCR; 16398946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 164025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root if (!observer.isDone()) { 16418946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu throw new Exception("Timed out waiting for pkgmove callback"); 16428946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 16438946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if (observer.returnCode != PackageManager.MOVE_SUCCEEDED) { 16448946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu return false; 16458946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 16468946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu // Verify we received the broadcast 16478946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu waitTime = 0; 164825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root while ((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME)) { 16498946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu receiver.wait(WAIT_TIME_INCR); 16508946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu waitTime += WAIT_TIME_INCR; 16518946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 165225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root if (!receiver.isDone()) { 16538946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu throw new Exception("Timed out waiting for MOVE notifications"); 16548946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 16558946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu return receiver.received; 16568946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 16578946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 16588946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } finally { 16598946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu mContext.unregisterReceiver(receiver); 16608946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 16618946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 166225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 166330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu private boolean invokeMovePackageFail(String pkgName, int flags, int errCode) throws Exception { 166430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu PackageMoveObserver observer = new PackageMoveObserver(pkgName); 166530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu try { 166630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu // Wait on observer 166725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root synchronized (observer) { 166830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu getPm().movePackage(pkgName, observer, flags); 166930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu long waitTime = 0; 167025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root while ((!observer.isDone()) && (waitTime < MAX_WAIT_TIME)) { 167130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu observer.wait(WAIT_TIME_INCR); 167230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu waitTime += WAIT_TIME_INCR; 167330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 167425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root if (!observer.isDone()) { 167530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu throw new Exception("Timed out waiting for pkgmove callback"); 167630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 167730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu assertEquals(errCode, observer.returnCode); 167830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 167930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } finally { 168030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 168130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu return true; 168230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 16838946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 1684315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu private int getDefaultInstallLoc() { 16859b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu int origDefaultLoc = PackageInfo.INSTALL_LOCATION_AUTO; 16869b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu try { 1687625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey origDefaultLoc = Settings.Global.getInt(mContext.getContentResolver(), 1688625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey Settings.Global.DEFAULT_INSTALL_LOCATION); 16899b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu } catch (SettingNotFoundException e1) { 16909b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu } 16919b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu return origDefaultLoc; 16929b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu } 16939b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu 16949b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu private void setInstallLoc(int loc) { 1695625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey Settings.Global.putInt(mContext.getContentResolver(), 1696625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey Settings.Global.DEFAULT_INSTALL_LOCATION, loc); 16979b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu } 169825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 16998946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu /* 170030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu * Tests for moving apps between internal and external storage 170130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu */ 170230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu /* 17038946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu * Utility function that reads a apk bundled as a raw resource 17048946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu * copies it into own data directory and invokes 17058946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu * PackageManager api to install first and then replace it 17068946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu * again. 17078946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu */ 1708edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 170925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private void moveFromRawResource(String outFileName, int rawResId, int installFlags, 171025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int moveFlags, boolean cleanUp, boolean fail, int result) throws Exception { 1711315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu int origDefaultLoc = getDefaultInstallLoc(); 171230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu InstallParams ip = null; 17138946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu try { 171430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu setInstallLoc(PackageHelper.APP_INSTALL_AUTO); 171530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu // Install first 171630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu ip = installFromRawResource("install.apk", rawResId, installFlags, false, 171730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 171830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu ApplicationInfo oldAppInfo = getPm().getApplicationInfo(ip.pkg.packageName, 0); 171930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu if (fail) { 172030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu assertTrue(invokeMovePackageFail(ip.pkg.packageName, moveFlags, result)); 172130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu ApplicationInfo info = getPm().getApplicationInfo(ip.pkg.packageName, 0); 172230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu assertNotNull(info); 172330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu assertEquals(oldAppInfo.flags, info.flags); 172430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } else { 172530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu // Create receiver based on expRetCode 172630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu MoveReceiver receiver = new MoveReceiver(ip.pkg.packageName); 172725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root boolean retCode = invokeMovePackage(ip.pkg.packageName, moveFlags, receiver); 17288946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu assertTrue(retCode); 17298946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu ApplicationInfo info = getPm().getApplicationInfo(ip.pkg.packageName, 0); 17306a6b007c77e5cab7ee435506a4f65824f52028b6Kenny Root assertNotNull("ApplicationInfo for recently installed application should exist", 17316a6b007c77e5cab7ee435506a4f65824f52028b6Kenny Root info); 17328946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if ((moveFlags & PackageManager.MOVE_INTERNAL) != 0) { 17336a6b007c77e5cab7ee435506a4f65824f52028b6Kenny Root assertTrue("ApplicationInfo.FLAG_EXTERNAL_STORAGE flag should NOT be set", 17346a6b007c77e5cab7ee435506a4f65824f52028b6Kenny Root (info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == 0); 17357e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertStartsWith("Native library dir should be in dataDir", 17367e921a157d1aca97506302637d4f3843ddc2b982Kenny Root info.dataDir, info.nativeLibraryDir); 17377e921a157d1aca97506302637d4f3843ddc2b982Kenny Root } else if ((moveFlags & PackageManager.MOVE_EXTERNAL_MEDIA) != 0) { 17386a6b007c77e5cab7ee435506a4f65824f52028b6Kenny Root assertTrue("ApplicationInfo.FLAG_EXTERNAL_STORAGE flag should be set", 17396a6b007c77e5cab7ee435506a4f65824f52028b6Kenny Root (info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0); 17407e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertStartsWith("Native library dir should point to ASEC", 17417e921a157d1aca97506302637d4f3843ddc2b982Kenny Root SECURE_CONTAINERS_PREFIX, info.nativeLibraryDir); 17426a6b007c77e5cab7ee435506a4f65824f52028b6Kenny Root final File nativeLibSymLink = new File(info.dataDir, "lib"); 17437e921a157d1aca97506302637d4f3843ddc2b982Kenny Root assertStartsWith("The data directory should have a 'lib' symlink that points to the ASEC container", 17447e921a157d1aca97506302637d4f3843ddc2b982Kenny Root SECURE_CONTAINERS_PREFIX, nativeLibSymLink.getCanonicalPath()); 17458946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 17468946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 174730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } catch (NameNotFoundException e) { 174830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu failStr("Pkg hasnt been installed correctly"); 17498946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } catch (Exception e) { 17508946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu failStr("Failed with exception : " + e); 17518946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } finally { 175230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu if (ip != null) { 175330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu cleanUpInstall(ip); 175430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 17559b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu // Restore default install location 17569b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu setInstallLoc(origDefaultLoc); 17578946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 17588946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 175925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 176030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu private void sampleMoveFromRawResource(int installFlags, int moveFlags, boolean fail, 176125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int result) throws Exception { 176230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu moveFromRawResource("install.apk", 176330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu R.raw.install, installFlags, moveFlags, true, 176430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu fail, result); 176530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 17668946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 1767f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 176825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testMoveAppInternalToExternal() throws Exception { 17693c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 17703c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 17713c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 17723c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 17733c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 177430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int installFlags = PackageManager.INSTALL_INTERNAL; 177530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA; 177630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu boolean fail = false; 177730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int result = PackageManager.MOVE_SUCCEEDED; 177830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu sampleMoveFromRawResource(installFlags, moveFlags, fail, result); 17798946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 17808946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 1781f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 178225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testMoveAppInternalToInternal() throws Exception { 178330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int installFlags = PackageManager.INSTALL_INTERNAL; 178430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int moveFlags = PackageManager.MOVE_INTERNAL; 178530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu boolean fail = true; 178630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int result = PackageManager.MOVE_FAILED_INVALID_LOCATION; 178730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu sampleMoveFromRawResource(installFlags, moveFlags, fail, result); 17888946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 17898946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 1790f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 179125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testMoveAppExternalToExternal() throws Exception { 17923c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 17933c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 17943c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 17953c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 17963c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 179730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int installFlags = PackageManager.INSTALL_EXTERNAL; 179830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA; 179930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu boolean fail = true; 180030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int result = PackageManager.MOVE_FAILED_INVALID_LOCATION; 180130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu sampleMoveFromRawResource(installFlags, moveFlags, fail, result); 18028946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 18033c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 1804f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 180525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testMoveAppExternalToInternal() throws Exception { 18063c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 18073c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 18083c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 18093c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 18103c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 181130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int installFlags = PackageManager.INSTALL_EXTERNAL; 181230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int moveFlags = PackageManager.MOVE_INTERNAL; 181330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu boolean fail = false; 181430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int result = PackageManager.MOVE_SUCCEEDED; 181530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu sampleMoveFromRawResource(installFlags, moveFlags, fail, result); 181630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 18173c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 1818f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 181925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testMoveAppForwardLocked() throws Exception { 18203c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 18213c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 18223c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 18233c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 18243c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 182530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int installFlags = PackageManager.INSTALL_FORWARD_LOCK; 182630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA; 1827bf023589b3d9994f43823c7cb0450d278b084f9bKenny Root boolean fail = false; 1828bf023589b3d9994f43823c7cb0450d278b084f9bKenny Root int result = PackageManager.MOVE_SUCCEEDED; 182930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu sampleMoveFromRawResource(installFlags, moveFlags, fail, result); 183030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 18313c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 1832f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 183325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testMoveAppFailInternalToExternalDelete() throws Exception { 18343c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 18353c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 18363c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 18373c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 18383c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 183930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int installFlags = 0; 184030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA; 184130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu boolean fail = true; 184230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu final int result = PackageManager.MOVE_FAILED_DOESNT_EXIST; 1843edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 184430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int rawResId = R.raw.install; 1845315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu int origDefaultLoc = getDefaultInstallLoc(); 184630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu InstallParams ip = null; 184730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu try { 184830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu PackageManager pm = getPm(); 184930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu setInstallLoc(PackageHelper.APP_INSTALL_AUTO); 185030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu // Install first 185130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu ip = installFromRawResource("install.apk", R.raw.install, installFlags, false, 185230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 185330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu // Delete the package now retaining data. 18549a212adcffbc4b32d51f512889b33ba584647aa9Suchi Amalapurapu GenericReceiver receiver = new DeleteReceiver(ip.pkg.packageName); 18557767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn invokeDeletePackage(ip.pkg.packageName, PackageManager.DELETE_KEEP_DATA, receiver); 185630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu assertTrue(invokeMovePackageFail(ip.pkg.packageName, moveFlags, result)); 185730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } catch (Exception e) { 185830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu failStr(e); 185930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } finally { 186030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu if (ip != null) { 186130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu cleanUpInstall(ip); 186230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 186330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu // Restore default install location 186430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu setInstallLoc(origDefaultLoc); 186530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 18668946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 18673c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 18688a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu /* 18698a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * Test that an install error code is returned when media is unmounted 18708a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * and package installed on sdcard via package manager flag. 18718a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu */ 1872f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 187325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testInstallSdcardUnmount() throws Exception { 18743c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 18753c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 18763c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 18773c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 18783c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 1879d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root boolean origState = checkMediaState(Environment.MEDIA_MOUNTED); 18808a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu try { 18818a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu // Unmount sdcard 18828a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu assertTrue(unmountMedia()); 18838a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu // Try to install and make sure an error code is returned. 1884315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 18858a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu PackageManager.INSTALL_EXTERNAL, false, 188614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE, 1887315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_AUTO); 18888a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } finally { 18898a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu // Restore original media state 18908a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu if (origState) { 18918a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu mountMedia(); 18928a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } else { 18938a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu unmountMedia(); 18948a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 18958a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 18968a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 18978a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu 18988a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu /* 1899edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen * Unmount sdcard. Try installing an app with manifest option to install 1900edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen * on sdcard. Make sure it gets installed on internal flash. 1901edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen */ 1902f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 190325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testInstallManifestSdcardUnmount() throws Exception { 19043c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 19053c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 19063c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 19073c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 19083c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 1909d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root boolean origState = checkMediaState(Environment.MEDIA_MOUNTED); 1910d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root try { 1911d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root // Unmount sdcard 1912d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root assertTrue(unmountMedia()); 1913d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root InstallParams ip = new InstallParams("install.apk", R.raw.install_loc_sdcard); 1914d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root installFromRawResource(ip, 0, true, false, -1, 1915d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 1916d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root } finally { 1917d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root // Restore original media state 1918d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root if (origState) { 1919d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root mountMedia(); 1920d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root } else { 1921d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root unmountMedia(); 1922d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root } 1923d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root } 1924d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root } 19258a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu 192625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /*---------- Recommended install location tests ----*/ 192725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /* 192825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * PrecedenceSuffixes: 192925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * Flag : FlagI, FlagE, FlagF 193025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * I - internal, E - external, F - forward locked, Flag suffix absent if not using any option. 193125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * Manifest: ManifestI, ManifestE, ManifestA, Manifest suffix absent if not using any option. 193225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * Existing: Existing suffix absent if not existing. 193325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * User: UserI, UserE, UserA, User suffix absent if not existing. 193425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * 193525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root */ 193614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu 19373c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root /* 19383c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * Install an app on internal flash 19393c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root */ 19403c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 194125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagI() throws Exception { 19423c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root sampleInstallFromRawResource(PackageManager.INSTALL_INTERNAL, true); 19433c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 19443c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 19453c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root /* 19463c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * Install an app on sdcard. 19473c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root */ 19483c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 194925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagE() throws Exception { 19503c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 19513c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 19523c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 19533c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 19543c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 19553c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, true); 19563c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 19573c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 19583c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root /* 19593c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * Install an app forward-locked. 19603c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root */ 19613c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 196225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagF() throws Exception { 19633c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true); 19643c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 19653c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 19663c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root /* 19673c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * Install an app with both internal and external flags set. should fail 19683c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root */ 19693c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 197025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagIE() throws Exception { 19713c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 19723c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_INTERNAL, 19733c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, 19743c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION, 19753c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageInfo.INSTALL_LOCATION_AUTO); 19763c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 19773c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 19783c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root /* 19793c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * Install an app with both internal and forward-lock flags set. 19803c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root */ 19813c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 198225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagIF() throws Exception { 19833c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK 19843c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root | PackageManager.INSTALL_INTERNAL, true); 19853c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 19863c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 19873c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root /* 19886dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root * Install an app with both external and forward-lock flags set. 19893c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root */ 19903c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 199125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagEF() throws Exception { 19926dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root // Do not run on devices with emulated external storage. 19936dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root if (Environment.isExternalStorageEmulated()) { 19946dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root return; 19956dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root } 19966dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root 19976dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK 19986dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root | PackageManager.INSTALL_EXTERNAL, true); 19993c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 20003c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 20013c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root /* 20023c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * Install an app with both internal and external flags set with forward 20033c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * lock. Should fail. 20043c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root */ 20053c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 200625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagIEF() throws Exception { 20073c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 20083c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_INTERNAL | 20093c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageManager.INSTALL_EXTERNAL, 20103c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, 20113c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION, 20123c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageInfo.INSTALL_LOCATION_AUTO); 20133c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 201414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu 201525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /* 201625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * Install an app with both internal and manifest option set. 201725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * should install on internal. 201825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root */ 201925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root @LargeTest 202025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagIManifestI() throws Exception { 202125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root installFromRawResource("install.apk", R.raw.install_loc_internal, 202225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageManager.INSTALL_INTERNAL, 202325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root true, 202425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root false, -1, 202525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 202625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 202725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /* 202825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * Install an app with both internal and manifest preference for 202925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * preferExternal. Should install on internal. 203025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root */ 203125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root @LargeTest 203225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagIManifestE() throws Exception { 203325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root installFromRawResource("install.apk", R.raw.install_loc_sdcard, 203425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageManager.INSTALL_INTERNAL, 203525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root true, 203625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root false, -1, 203725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 203825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 203925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /* 204025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * Install an app with both internal and manifest preference for 204125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * auto. should install internal. 204225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root */ 204325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root @LargeTest 204425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagIManifestA() throws Exception { 204525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root installFromRawResource("install.apk", R.raw.install_loc_auto, 204625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageManager.INSTALL_INTERNAL, 204725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root true, 204825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root false, -1, 204925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 205025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 205125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /* 205225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * Install an app with both external and manifest option set. 205325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * should install externally. 205425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root */ 205525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root @LargeTest 205625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagEManifestI() throws Exception { 20573c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 20583c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 20593c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 20603c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 20613c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 206225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root installFromRawResource("install.apk", R.raw.install_loc_internal, 206325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageManager.INSTALL_EXTERNAL, 206425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root true, 206525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root false, -1, 206625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 206725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 20683c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 206925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /* 207025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * Install an app with both external and manifest preference for 207125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * preferExternal. Should install externally. 207225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root */ 207325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root @LargeTest 207425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagEManifestE() throws Exception { 20753c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 20763c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 20773c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 20783c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 20793c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 20803c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install_loc_sdcard, 20813c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageManager.INSTALL_EXTERNAL, 20823c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 20833c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 20843c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 20853c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 20863c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 20873c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root /* 20883c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * Install an app with both external and manifest preference for 20893c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * auto. should install on external media. 20903c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root */ 20913c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 209225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagEManifestA() throws Exception { 20933c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 20943c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 20953c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 20963c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 20973c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 20983c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install_loc_auto, 20993c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageManager.INSTALL_EXTERNAL, 21003c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 21013c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 21023c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 21033c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 21043c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 21053c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root /* 21063c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * Install an app with fwd locked flag set and install location set to 21073c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * internal. should install internally. 21083c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root */ 21093c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 211025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagFManifestI() throws Exception { 21113c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install_loc_internal, 21123c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageManager.INSTALL_FORWARD_LOCK, 21133c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 21143c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 21156dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 21163c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 21173c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 21183c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root /* 21193c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * Install an app with fwd locked flag set and install location set to 21206dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root * preferExternal. Should install externally. 21213c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root */ 21223c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 212325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagFManifestE() throws Exception { 21246dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root // Do not run on devices with emulated external storage. 21256dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root if (Environment.isExternalStorageEmulated()) { 21266dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root return; 21276dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root } 21286dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root 21293c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install_loc_sdcard, 21303c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageManager.INSTALL_FORWARD_LOCK, 21313c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 21323c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 21333c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 21343c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 21353c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 21363c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root /* 21376dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root * Install an app with fwd locked flag set and install location set to auto. 21386dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root * should install externally. 21393c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root */ 21403c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 214125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagFManifestA() throws Exception { 21426dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root // Do not run on devices with emulated external storage. 21436dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root if (Environment.isExternalStorageEmulated()) { 21446dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root return; 21456dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root } 21466dceb88f1c7c42c6ab43834af2c993d599895d82Kenny Root 21473c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install_loc_auto, 21483c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageManager.INSTALL_FORWARD_LOCK, 21493c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 21503c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 2151bf023589b3d9994f43823c7cb0450d278b084f9bKenny Root PackageInfo.INSTALL_LOCATION_AUTO); 21523c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 21533c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 215425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /* 215525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * The following test functions verify install location for existing apps. 21563c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * ie existing app can be installed internally or externally. If install 21573c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * flag is explicitly set it should override current location. If manifest location 21583c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * is set, that should over ride current location too. if not the existing install 21593c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * location should be honoured. 21603c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * testFlagI/E/F/ExistingI/E - 21613c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root */ 21623c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 216325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagIExistingI() throws Exception { 21643c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_INTERNAL; 21653c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int rFlags = PackageManager.INSTALL_INTERNAL | PackageManager.INSTALL_REPLACE_EXISTING; 21663c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // First install. 21673c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 21683c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root iFlags, 21693c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, 21703c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 21713c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 21723c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Replace now 21733c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 21743c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root rFlags, 21753c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 21763c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 21773c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 21783c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 21793c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 21803c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 218125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagIExistingE() throws Exception { 21823c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 21833c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 21843c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 21853c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 21863c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 21873c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_EXTERNAL; 21883c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int rFlags = PackageManager.INSTALL_INTERNAL | PackageManager.INSTALL_REPLACE_EXISTING; 21893c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // First install. 21903c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 21913c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root iFlags, 21923c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, 21933c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 21943c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 21953c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Replace now 21963c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 21973c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root rFlags, 21983c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 21993c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 22003c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 22013c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 22023c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 22033c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 220425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagEExistingI() throws Exception { 22053c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 22063c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 22073c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 22083c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 22093c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 22103c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_INTERNAL; 22113c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int rFlags = PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_REPLACE_EXISTING; 22123c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // First install. 22133c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 22143c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root iFlags, 22153c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, 22163c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 22173c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 22183c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Replace now 22193c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 22203c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root rFlags, 22213c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 22223c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 22233c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 22243c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 22253c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 22263c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 222725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagEExistingE() throws Exception { 22283c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 22293c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 22303c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 22313c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 22323c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 22333c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_EXTERNAL; 22343c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int rFlags = PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_REPLACE_EXISTING; 22353c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // First install. 22363c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 22373c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root iFlags, 22383c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, 22393c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 22403c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 22413c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Replace now 22423c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 22433c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root rFlags, 22443c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 22453c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 22463c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 22473c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 22483c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 22493c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 225025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagFExistingI() throws Exception { 22513c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_INTERNAL; 22523c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int rFlags = PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_REPLACE_EXISTING; 22533c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // First install. 22543c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 22553c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root iFlags, 22563c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, 22573c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 22583c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 22593c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Replace now 22603c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 22613c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root rFlags, 22623c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 22633c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 22643c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 22653c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 22663c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 22673c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 226825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testFlagFExistingE() throws Exception { 22693c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 22703c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 22713c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 22723c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 22733c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 22743c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_EXTERNAL; 22753c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int rFlags = PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_REPLACE_EXISTING; 22763c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // First install. 22773c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 22783c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root iFlags, 22793c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, 22803c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 22813c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 22823c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Replace now 22833c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 22843c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root rFlags, 22853c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 22863c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 22873c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 22883c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 22893c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 22903c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root /* 22913c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * The following set of tests verify the installation of apps with 22923c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * install location attribute set to internalOnly, preferExternal and auto. 22933c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * The manifest option should dictate the install location. 22943c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * public void testManifestI/E/A 22953c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * TODO out of memory fall back behaviour. 22963c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root */ 22973c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 229825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestI() throws Exception { 22993c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install_loc_internal, 23003c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 0, 23013c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 23023c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 23033c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 23043c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 23053c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 23063c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 230725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestE() throws Exception { 23083c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 23093c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 23103c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 23113c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 23123c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 23133c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install_loc_sdcard, 23143c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 0, 23153c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 23163c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 23173c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 23183c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 23193c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 23203c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 232125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestA() throws Exception { 23223c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install_loc_auto, 23233c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 0, 23243c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 23253c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 23263c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 23273c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 23283c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 23293c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root /* 23303c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * The following set of tests verify the installation of apps 23313c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * with install location attribute set to internalOnly, preferExternal and auto 23323c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * for already existing apps. The manifest option should take precedence. 23333c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * TODO add out of memory fall back behaviour. 23343c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root * testManifestI/E/AExistingI/E 23353c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root */ 23363c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 233725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestIExistingI() throws Exception { 23383c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_INTERNAL; 23393c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 23403c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // First install. 23413c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 23423c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root iFlags, 23433c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, 23443c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 23453c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 23463c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Replace now 23473c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install_loc_internal, 23483c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root rFlags, 23493c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 23503c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 23513c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 23523c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 23533c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 23543c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 235525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestIExistingE() throws Exception { 23563c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 23573c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 23583c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 23593c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 23603c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 23613c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_EXTERNAL; 23623c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 23633c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // First install. 23643c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 23653c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root iFlags, 23663c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, 23673c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 23683c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 23693c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Replace now 23703c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install_loc_internal, 23713c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root rFlags, 23723c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 23733c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 23743c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 23753c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 23763c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 23773c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 237825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestEExistingI() throws Exception { 23793c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 23803c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 23813c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 23823c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 23833c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 23843c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_INTERNAL; 23853c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 23863c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // First install. 23873c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 23883c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root iFlags, 23893c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, 23903c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 23913c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 23923c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Replace now 23933c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install_loc_sdcard, 23943c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root rFlags, 23953c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 23963c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 23973c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 23983c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 23993c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 24003c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 240125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestEExistingE() throws Exception { 24023c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 24033c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 24043c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 24053c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 24063c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 24073c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_EXTERNAL; 24083c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 24093c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // First install. 24103c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 24113c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root iFlags, 24123c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, 24133c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 24143c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 24153c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Replace now 24163c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install_loc_sdcard, 24173c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root rFlags, 24183c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 24193c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 24203c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 24213c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 24223c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 24233c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 242425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestAExistingI() throws Exception { 24253c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_INTERNAL; 24263c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 24273c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // First install. 24283c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 24293c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root iFlags, 24303c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, 24313c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 24323c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 24333c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Replace now 24343c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install_loc_auto, 24353c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root rFlags, 24363c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 24373c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 24383c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageInfo.INSTALL_LOCATION_AUTO); 24393c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 24403c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 24413c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 244225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testManifestAExistingE() throws Exception { 24433c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 24443c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 24453c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 24463c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 24473c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 24483c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_EXTERNAL; 24493c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 24503c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // First install. 24513c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install, 24523c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root iFlags, 24533c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, 24543c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 24553c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root -1); 24563c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Replace now 24573c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root installFromRawResource("install.apk", R.raw.install_loc_auto, 24583c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root rFlags, 24593c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root true, 24603c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root false, -1, 24613c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 24623c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 24633c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 246425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /* 246525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * The following set of tests check install location for existing 246625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * application based on user setting. 246725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root */ 246825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private int getExpectedInstallLocation(int userSetting) { 246925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; 247025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root boolean enable = getUserSettingSetInstallLocation(); 247125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root if (enable) { 247225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root if (userSetting == PackageHelper.APP_INSTALL_AUTO) { 247325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root iloc = PackageInfo.INSTALL_LOCATION_AUTO; 247425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } else if (userSetting == PackageHelper.APP_INSTALL_EXTERNAL) { 247525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root iloc = PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL; 247625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } else if (userSetting == PackageHelper.APP_INSTALL_INTERNAL) { 247725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root iloc = PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY; 247825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 247925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 248025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root return iloc; 248125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 248225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 248325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private void setExistingXUserX(int userSetting, int iFlags, int iloc) throws Exception { 248425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 248525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root // First install. 248625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root installFromRawResource("install.apk", R.raw.install, 248725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root iFlags, 248825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root false, 248925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root false, -1, 249025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 249125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int origSetting = getDefaultInstallLoc(); 249225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root try { 249325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root // Set user setting 249425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root setInstallLoc(userSetting); 249525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root // Replace now 249625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root installFromRawResource("install.apk", R.raw.install, 249725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root rFlags, 249825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root true, 249925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root false, -1, 250025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root iloc); 250125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } finally { 250225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root setInstallLoc(origSetting); 250325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 250425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 250525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root @LargeTest 250625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testExistingIUserI() throws Exception { 250725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int userSetting = PackageHelper.APP_INSTALL_INTERNAL; 250825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int iFlags = PackageManager.INSTALL_INTERNAL; 250925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 251025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 251125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 251225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root @LargeTest 251325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testExistingIUserE() throws Exception { 25143c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 25153c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 25163c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 25173c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 25183c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 25193c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int userSetting = PackageHelper.APP_INSTALL_EXTERNAL; 25203c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_INTERNAL; 25213c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 25223c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 25233c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 252425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root @LargeTest 252525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testExistingIUserA() throws Exception { 252625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int userSetting = PackageHelper.APP_INSTALL_AUTO; 252725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int iFlags = PackageManager.INSTALL_INTERNAL; 252825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 252925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 25303c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 25313c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 253225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testExistingEUserI() throws Exception { 25333c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 25343c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 25353c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 25363c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 25373c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 25383c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int userSetting = PackageHelper.APP_INSTALL_INTERNAL; 25393c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_EXTERNAL; 25403c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 25413c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 25423c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 25433c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 254425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testExistingEUserE() throws Exception { 25453c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 25463c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 25473c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 25483c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 25493c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 25503c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int userSetting = PackageHelper.APP_INSTALL_EXTERNAL; 25513c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_EXTERNAL; 25523c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 25533c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 25543c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 25553c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root @LargeTest 255625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testExistingEUserA() throws Exception { 25573c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 25583c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 25593c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 25603c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 25613c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 25623c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int userSetting = PackageHelper.APP_INSTALL_AUTO; 25633c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iFlags = PackageManager.INSTALL_EXTERNAL; 25643c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 25653c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 25663c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 256725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /* 256825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * The following set of tests verify that the user setting defines 256925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * the install location. 257025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * 257125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root */ 257225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private boolean getUserSettingSetInstallLocation() { 257325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root try { 2574625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey return Settings.Global.getInt( 2575625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey mContext.getContentResolver(), Settings.Global.SET_INSTALL_LOCATION) != 0; 257625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } catch (SettingNotFoundException e1) { 257725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 257825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root return false; 257925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 258025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 258125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private void setUserSettingSetInstallLocation(boolean value) { 2582625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey Settings.Global.putInt(mContext.getContentResolver(), 2583625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey Settings.Global.SET_INSTALL_LOCATION, value ? 1 : 0); 258425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 258525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 258625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private void setUserX(boolean enable, int userSetting, int iloc) throws Exception { 258725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root boolean origUserSetting = getUserSettingSetInstallLocation(); 258825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int origSetting = getDefaultInstallLoc(); 258925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root try { 259025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root setUserSettingSetInstallLocation(enable); 259125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root // Set user setting 259225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root setInstallLoc(userSetting); 259325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root // Replace now 259425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root installFromRawResource("install.apk", R.raw.install, 259525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 0, 259625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root true, 259725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root false, -1, 259825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root iloc); 259925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } finally { 260025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root // Restore original setting 260125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root setUserSettingSetInstallLocation(origUserSetting); 260225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root setInstallLoc(origSetting); 260325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 260425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 260525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root @LargeTest 260625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testUserI() throws Exception { 260725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int userSetting = PackageHelper.APP_INSTALL_INTERNAL; 260825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int iloc = getExpectedInstallLocation(userSetting); 260925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root setUserX(true, userSetting, iloc); 261025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 261125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 261225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root @LargeTest 261325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testUserE() throws Exception { 26143c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 26153c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 26163c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 26173c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 26183c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 26193c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int userSetting = PackageHelper.APP_INSTALL_EXTERNAL; 26203c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iloc = getExpectedInstallLocation(userSetting); 26213c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root setUserX(true, userSetting, iloc); 26223c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 26233c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 262425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root @LargeTest 262525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testUserA() throws Exception { 262625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int userSetting = PackageHelper.APP_INSTALL_AUTO; 262725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int iloc = getExpectedInstallLocation(userSetting); 262825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root setUserX(true, userSetting, iloc); 262925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 263025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 263125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /* 263225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * The following set of tests turn on/off the basic 263325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * user setting for turning on install location. 263425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root */ 263525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root @LargeTest 263625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testUserPrefOffUserI() throws Exception { 263725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int userSetting = PackageHelper.APP_INSTALL_INTERNAL; 263825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; 263925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root setUserX(false, userSetting, iloc); 264025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 264125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 264225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root @LargeTest 264325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testUserPrefOffUserE() throws Exception { 26443c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 26453c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 26463c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 26473c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 26483c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 26493c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int userSetting = PackageHelper.APP_INSTALL_EXTERNAL; 26503c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; 26513c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root setUserX(false, userSetting, iloc); 26523c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 26533c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 265425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root @LargeTest 265525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testUserPrefOffA() throws Exception { 265625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int userSetting = PackageHelper.APP_INSTALL_AUTO; 265725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; 265825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root setUserX(false, userSetting, iloc); 265925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root } 2660edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2661d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String BASE_PERMISSIONS_DEFINED[] = new String[] { 2662d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PERM_PACKAGE, "com.android.unit_tests.install_decl_perm", 2663d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PERM_DEFINED, 26640dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.NORMAL", 26650dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.DANGEROUS", 26660dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.SIGNATURE", 2667d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn }; 2668edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2669d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String BASE_PERMISSIONS_UNDEFINED[] = new String[] { 26700dc59e78e18493aecd37427531d093e800846c3eBrett Chabot PERM_PACKAGE, "com.android.frameworks.coretests.install_decl_perm", 2671d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PERM_UNDEFINED, 26720dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.NORMAL", 26730dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.DANGEROUS", 26740dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.SIGNATURE", 2675d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn }; 2676edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2677d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String BASE_PERMISSIONS_USED[] = new String[] { 26780dc59e78e18493aecd37427531d093e800846c3eBrett Chabot PERM_PACKAGE, "com.android.frameworks.coretests.install_use_perm_good", 2679d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PERM_USED, 26800dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.NORMAL", 26810dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.DANGEROUS", 26820dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.SIGNATURE", 2683d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn }; 2684edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2685d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String BASE_PERMISSIONS_NOTUSED[] = new String[] { 26860dc59e78e18493aecd37427531d093e800846c3eBrett Chabot PERM_PACKAGE, "com.android.frameworks.coretests.install_use_perm_good", 2687d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PERM_NOTUSED, 26880dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.NORMAL", 26890dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.DANGEROUS", 26900dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.SIGNATURE", 2691d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn }; 2692edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2693d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String BASE_PERMISSIONS_SIGUSED[] = new String[] { 26940dc59e78e18493aecd37427531d093e800846c3eBrett Chabot PERM_PACKAGE, "com.android.frameworks.coretests.install_use_perm_good", 2695d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PERM_USED, 26960dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.SIGNATURE", 2697d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PERM_NOTUSED, 26980dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.NORMAL", 26990dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.DANGEROUS", 2700d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn }; 2701edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2702d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn /* 2703d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn * Ensure that permissions are properly declared. 2704d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn */ 2705edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @LargeTest 270625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testInstallDeclaresPermissions() throws Exception { 2707d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn InstallParams ip = null; 2708d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn InstallParams ip2 = null; 2709d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 2710d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Upon installing a package, are its declared permissions published? 2711edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2712d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn int iFlags = PackageManager.INSTALL_INTERNAL; 2713d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn int iApk = R.raw.install_decl_perm; 2714d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip = installFromRawResource("install.apk", iApk, 2715d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn iFlags, false, 2716d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 2717d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertInstall(ip.pkg, iFlags, ip.pkg.installLocation); 2718d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_DEFINED); 2719edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2720d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Upon installing package, are its permissions granted? 2721edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2722d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn int i2Flags = PackageManager.INSTALL_INTERNAL; 2723d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn int i2Apk = R.raw.install_use_perm_good; 2724d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip2 = installFromRawResource("install2.apk", i2Apk, 2725d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn i2Flags, false, 2726d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 2727d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertInstall(ip2.pkg, i2Flags, ip2.pkg.installLocation); 2728d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_USED); 2729edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2730d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Upon removing but not deleting, are permissions retained? 2731edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2732d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn GenericReceiver receiver = new DeleteReceiver(ip.pkg.packageName); 2733edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2734d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 27357767eac3232ba2fb9828766813cdb481d6a97584Dianne Hackborn invokeDeletePackage(ip.pkg.packageName, PackageManager.DELETE_KEEP_DATA, receiver); 2736d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (Exception e) { 2737d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn failStr(e); 2738d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2739d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_DEFINED); 2740d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_USED); 2741edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2742d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Upon re-installing, are permissions retained? 2743edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2744d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip = installFromRawResource("install.apk", iApk, 2745d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn iFlags | PackageManager.INSTALL_REPLACE_EXISTING, false, 2746d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 2747d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertInstall(ip.pkg, iFlags, ip.pkg.installLocation); 2748d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_DEFINED); 2749d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_USED); 2750edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2751d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Upon deleting package, are all permissions removed? 2752edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2753d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 2754315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu invokeDeletePackage(ip.pkg.packageName, 0, receiver); 2755d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip = null; 2756d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (Exception e) { 2757d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn failStr(e); 2758d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2759d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_UNDEFINED); 2760d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_NOTUSED); 2761edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2762d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Delete package using permissions; nothing to check here. 2763edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2764d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn GenericReceiver receiver2 = new DeleteReceiver(ip2.pkg.packageName); 2765d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 2766315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu invokeDeletePackage(ip2.pkg.packageName, 0, receiver); 2767d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip2 = null; 2768d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (Exception e) { 2769d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn failStr(e); 2770d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2771edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2772d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Re-install package using permissions; no permissions can be granted. 2773edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2774d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip2 = installFromRawResource("install2.apk", i2Apk, 2775d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn i2Flags, false, 2776d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 2777d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertInstall(ip2.pkg, i2Flags, ip2.pkg.installLocation); 2778d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_NOTUSED); 2779edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2780d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Upon installing declaring package, are sig permissions granted 2781d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // to other apps (but not other perms)? 2782edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2783d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip = installFromRawResource("install.apk", iApk, 2784d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn iFlags, false, 2785d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 2786d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertInstall(ip.pkg, iFlags, ip.pkg.installLocation); 2787d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_DEFINED); 2788d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_SIGUSED); 2789edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2790d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Re-install package using permissions; are all permissions granted? 2791edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2792d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip2 = installFromRawResource("install2.apk", i2Apk, 2793d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn i2Flags | PackageManager.INSTALL_REPLACE_EXISTING, false, 2794d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 2795d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertInstall(ip2.pkg, i2Flags, ip2.pkg.installLocation); 2796d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_NOTUSED); 2797edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2798d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Upon deleting package, are all permissions removed? 2799edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2800d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 2801315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu invokeDeletePackage(ip.pkg.packageName, 0, receiver); 2802d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip = null; 2803d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (Exception e) { 2804d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn failStr(e); 2805d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2806d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_UNDEFINED); 2807d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_NOTUSED); 2808edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2809d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Delete package using permissions; nothing to check here. 2810edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2811d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 2812315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu invokeDeletePackage(ip2.pkg.packageName, 0, receiver); 2813d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip2 = null; 2814d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (Exception e) { 2815d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn failStr(e); 2816d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2817edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2818d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } finally { 2819d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (ip2 != null) { 2820d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn cleanUpInstall(ip2); 2821d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2822d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (ip != null) { 2823d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn cleanUpInstall(ip); 2824d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2825d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2826d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2827d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn 2828ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu /* 2829ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu * Ensure that permissions are properly declared. 2830ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu */ 2831f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 283225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testInstallOnSdPermissionsUnmount() throws Exception { 2833ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu InstallParams ip = null; 2834d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root boolean origMediaState = checkMediaState(Environment.MEDIA_MOUNTED); 2835ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu try { 2836ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu // **: Upon installing a package, are its declared permissions published? 2837ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu int iFlags = PackageManager.INSTALL_INTERNAL; 2838ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu int iApk = R.raw.install_decl_perm; 2839ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu ip = installFromRawResource("install.apk", iApk, 2840ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu iFlags, false, 2841ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 2842ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu assertInstall(ip.pkg, iFlags, ip.pkg.installLocation); 2843ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu assertPermissions(BASE_PERMISSIONS_DEFINED); 2844ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu // Unmount media here 2845ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu assertTrue(unmountMedia()); 2846ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu // Mount media again 2847ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu mountMedia(); 2848ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu //Check permissions now 2849ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu assertPermissions(BASE_PERMISSIONS_DEFINED); 2850ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu } finally { 2851ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu if (ip != null) { 2852ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu cleanUpInstall(ip); 2853ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu } 2854ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu } 2855ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu } 2856c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu 2857c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu /* This test creates a stale container via MountService and then installs 2858c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu * a package and verifies that the stale container is cleaned up and install 2859c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu * is successful. 2860c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu * Please note that this test is very closely tied to the framework's 2861c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu * naming convention for secure containers. 2862c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu */ 2863f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 286425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testInstallSdcardStaleContainer() throws Exception { 28653c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 28663c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 28673c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 28683c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 28693c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 2870d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root boolean origMediaState = checkMediaState(Environment.MEDIA_MOUNTED); 2871c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu try { 2872d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root // Mount media first 2873d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root mountMedia(); 2874c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu String outFileName = "install.apk"; 2875c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu int rawResId = R.raw.install; 2876c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu PackageManager pm = mContext.getPackageManager(); 2877c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu File filesDir = mContext.getFilesDir(); 2878c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu File outFile = new File(filesDir, outFileName); 2879c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu Uri packageURI = getInstallablePackage(rawResId, outFile); 2880c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu PackageParser.Package pkg = parsePackage(packageURI); 2881c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu assertNotNull(pkg); 2882c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu // Install an app on sdcard. 2883c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu installFromRawResource(outFileName, rawResId, 2884c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu PackageManager.INSTALL_EXTERNAL, false, 2885c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2886c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu // Unmount sdcard 2887c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu unmountMedia(); 2888c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu // Delete the app on sdcard to leave a stale container on sdcard. 2889c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu GenericReceiver receiver = new DeleteReceiver(pkg.packageName); 2890315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu assertTrue(invokeDeletePackage(pkg.packageName, 0, receiver)); 2891c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu mountMedia(); 2892c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu // Reinstall the app and make sure it gets installed. 2893c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu installFromRawResource(outFileName, rawResId, 2894c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu PackageManager.INSTALL_EXTERNAL, true, 2895c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2896edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen } catch (Exception e) { 2897c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu failStr(e.getMessage()); 2898c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu } finally { 2899c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu if (origMediaState) { 2900c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu mountMedia(); 2901c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu } else { 2902c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu unmountMedia(); 2903c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu } 2904c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu 2905c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu } 2906c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu } 29071ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu 29081ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu /* This test installs an application on sdcard and unmounts media. 29091ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu * The app is then re-installed on internal storage. The sdcard is mounted 29101ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu * and verified that the re-installation on internal storage takes precedence. 29111ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu */ 2912f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 291325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testInstallSdcardStaleContainerReinstall() throws Exception { 29143c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root // Do not run on devices with emulated external storage. 29153c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root if (Environment.isExternalStorageEmulated()) { 29163c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root return; 29173c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root } 29183c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 2919d7b421b4de68d803252a5d9b3cb0106731217ad7Kenny Root boolean origMediaState = checkMediaState(Environment.MEDIA_MOUNTED); 29201ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu try { 29211ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu // Mount media first 29221ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu mountMedia(); 29231ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu String outFileName = "install.apk"; 29241ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu int rawResId = R.raw.install; 29251ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu PackageManager pm = mContext.getPackageManager(); 29261ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu File filesDir = mContext.getFilesDir(); 29271ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu File outFile = new File(filesDir, outFileName); 29281ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu Uri packageURI = getInstallablePackage(rawResId, outFile); 29291ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu PackageParser.Package pkg = parsePackage(packageURI); 29301ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu assertNotNull(pkg); 29311ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu // Install an app on sdcard. 29321ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu installFromRawResource(outFileName, rawResId, 29331ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu PackageManager.INSTALL_EXTERNAL, false, 29341ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 29351ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu // Unmount sdcard 29361ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu unmountMedia(); 29371ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu // Reinstall the app and make sure it gets installed on internal storage. 29381ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu installFromRawResource(outFileName, rawResId, 29391ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu PackageManager.INSTALL_REPLACE_EXISTING, false, 29401ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 29411ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu mountMedia(); 29421ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu // Verify that the app installed is on internal storage. 294325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root assertInstall(pkg, 0, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 29441ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu } catch (Exception e) { 29451ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu failStr(e.getMessage()); 29461ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu } finally { 29471ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu if (origMediaState) { 29481ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu mountMedia(); 29491ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu } else { 29501ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu unmountMedia(); 29511ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu } 29521ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu } 29531ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu } 29543c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 2955ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 2956ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * The following series of tests are related to upgrading apps with 2957edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen * different certificates. 2958ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 2959ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP1_UNSIGNED = R.raw.install_app1_unsigned; 296025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 2961ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP1_CERT1 = R.raw.install_app1_cert1; 296225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 2963ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP1_CERT2 = R.raw.install_app1_cert2; 296425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 2965ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP1_CERT1_CERT2 = R.raw.install_app1_cert1_cert2; 296625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 2967ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP1_CERT3_CERT4 = R.raw.install_app1_cert3_cert4; 296825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 2969ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP1_CERT3 = R.raw.install_app1_cert3; 297025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 2971ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP2_UNSIGNED = R.raw.install_app2_unsigned; 297225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 2973ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP2_CERT1 = R.raw.install_app2_cert1; 297425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 2975ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP2_CERT2 = R.raw.install_app2_cert2; 297625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 2977ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP2_CERT1_CERT2 = R.raw.install_app2_cert1_cert2; 297825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 2979ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP2_CERT3 = R.raw.install_app2_cert3; 2980ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu 298125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private InstallParams replaceCerts(int apk1, int apk2, boolean cleanUp, boolean fail, 298225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int retCode) throws Exception { 2983ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 2984ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk1Name = "install1.apk"; 2985ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk2Name = "install2.apk"; 2986ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageParser.Package pkg1 = getParsedPackage(apk1Name, apk1); 2987ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu try { 2988ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu InstallParams ip = installFromRawResource(apk1Name, apk1, 0, false, 2989ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2990ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource(apk2Name, apk2, rFlags, false, 2991ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2992ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu return ip; 2993ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } catch (Exception e) { 2994ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu failStr(e.getMessage()); 2995ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } finally { 2996ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (cleanUp) { 2997ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(pkg1.packageName); 2998ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2999ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 3000ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu return null; 3001ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 300225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3003ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 3004ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with two certificates can be upgraded by the 3005ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * same app signed with two certificates. 3006ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 3007f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 300825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceMatchAllCerts() throws Exception { 3009ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(APP1_CERT1_CERT2, APP1_CERT1_CERT2, true, false, -1); 3010ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 3011ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu 3012ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 3013ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with two certificates cannot be upgraded 3014ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * by an app signed with a different certificate. 3015ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 3016f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 301725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceMatchNoCerts1() throws Exception { 3018ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(APP1_CERT1_CERT2, APP1_CERT3, true, true, 30192a53332343c9fbc734595d269a2c35371227904bJeff Sharkey PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); 3020ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 302125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3022ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 3023ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with two certificates cannot be upgraded 3024ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * by an app signed with a different certificate. 3025ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 3026f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 302725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceMatchNoCerts2() throws Exception { 3028ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(APP1_CERT1_CERT2, APP1_CERT3_CERT4, true, true, 30292a53332343c9fbc734595d269a2c35371227904bJeff Sharkey PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); 3030ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 303125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3032ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 3033ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with two certificates cannot be upgraded by 3034ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * an app signed with a subset of initial certificates. 3035ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 3036f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 303725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceMatchSomeCerts1() throws Exception { 3038ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(APP1_CERT1_CERT2, APP1_CERT1, true, true, 30392a53332343c9fbc734595d269a2c35371227904bJeff Sharkey PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); 3040ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 304125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3042ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 3043ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with two certificates cannot be upgraded by 3044ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * an app signed with the last certificate. 3045ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 3046f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 304725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceMatchSomeCerts2() throws Exception { 3048ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(APP1_CERT1_CERT2, APP1_CERT2, true, true, 30492a53332343c9fbc734595d269a2c35371227904bJeff Sharkey PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); 3050ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 305125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3052ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 3053ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with a certificate can be upgraded by app 3054ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * signed with a superset of certificates. 3055ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 3056f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 305725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceMatchMoreCerts() throws Exception { 3058ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(APP1_CERT1, APP1_CERT1_CERT2, true, true, 30592a53332343c9fbc734595d269a2c35371227904bJeff Sharkey PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); 3060ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 306125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3062ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 3063ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with a certificate can be upgraded by app 3064ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * signed with a superset of certificates. Then verify that the an app 3065ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * signed with the original set of certs cannot upgrade the new one. 3066ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 3067f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 306825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceMatchMoreCertsReplaceSomeCerts() throws Exception { 3069ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu InstallParams ip = replaceCerts(APP1_CERT1, APP1_CERT1_CERT2, false, true, 30702a53332343c9fbc734595d269a2c35371227904bJeff Sharkey PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); 3071ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu try { 3072ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 3073ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource("install.apk", APP1_CERT1, rFlags, false, 3074ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu false, -1, 3075ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 3076ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } catch (Exception e) { 3077ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu failStr(e.getMessage()); 3078ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } finally { 3079ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (ip != null) { 3080ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(ip); 3081ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 3082ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 3083ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 308425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 308525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /** 308655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * The following tests are related to testing KeySets-based key rotation 308755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 308855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 308955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk which does not specify an upgrade-keyset may be upgraded 309055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * by an apk which does 309155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 309255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testNoKSToUpgradeKS() throws Exception { 309355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman replaceCerts(R.raw.keyset_sa_unone, R.raw.keyset_sa_ua, true, false, -1); 309455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 309555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 309655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 309755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk which does specify an upgrade-keyset may be downgraded to 309855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * an apk which does not 309955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 310055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testUpgradeKSToNoKS() throws Exception { 310155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman replaceCerts(R.raw.keyset_sa_ua, R.raw.keyset_sa_unone, true, false, -1); 310255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 310355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 310455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 310555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk signed by a key other than the upgrade keyset can update 310655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * an app 310755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 310855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testUpgradeKSWithWrongKey() throws Exception { 310955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman replaceCerts(R.raw.keyset_sa_ua, R.raw.keyset_sb_ua, true, true, 31102a53332343c9fbc734595d269a2c35371227904bJeff Sharkey PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); 311155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 311255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 311355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 311455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk signed by its signing key, which is not an upgrade key, 311555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * can upgrade an app. 311655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 311755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testUpgradeKSWithWrongSigningKey() throws Exception { 311855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman replaceCerts(R.raw.keyset_sa_ub, R.raw.keyset_sa_ub, true, true, 31192a53332343c9fbc734595d269a2c35371227904bJeff Sharkey PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); 312055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 312155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 312255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 312355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk signed by its upgrade key, which is not its signing key, 312455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * can upgrade an app. 312555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 312655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testUpgradeKSWithUpgradeKey() throws Exception { 312755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman replaceCerts(R.raw.keyset_sa_ub, R.raw.keyset_sb_ub, true, false, -1); 312855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 312955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 313055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk signed by its upgrade key, which is its signing key, can 313155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * upgrade an app. 313255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 313355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testUpgradeKSWithSigningUpgradeKey() throws Exception { 313455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman replaceCerts(R.raw.keyset_sa_ua, R.raw.keyset_sa_ua, true, false, -1); 313555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 313655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 313755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 313855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk signed by multiple keys, one of which is its upgrade key, 313955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * can upgrade an app. 314055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 314155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testMultipleUpgradeKSWithUpgradeKey() throws Exception { 314255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman replaceCerts(R.raw.keyset_sa_ua, R.raw.keyset_sab_ua, true, false, -1); 314355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 314455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 314555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 314655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk signed by multiple keys, one of which is its signing key, 314755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * but none of which is an upgrade key, can upgrade an app. 314855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 314955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testMultipleUpgradeKSWithSigningKey() throws Exception { 315055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman replaceCerts(R.raw.keyset_sau_ub, R.raw.keyset_sa_ua, true, true, 31512a53332343c9fbc734595d269a2c35371227904bJeff Sharkey PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE); 315255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 315355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 315455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 315555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk which defines multiple (two) upgrade keysets is 315655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * upgrade-able by either. 315755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 315855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testUpgradeKSWithMultipleUpgradeKeySets() throws Exception { 315955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman replaceCerts(R.raw.keyset_sa_ua_ub, R.raw.keyset_sa_ua, true, false, -1); 316055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman replaceCerts(R.raw.keyset_sa_ua_ub, R.raw.keyset_sb_ub, true, false, -1); 316155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 316255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 316355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 316455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk's sigs are changed after upgrading with a non-signing 316555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * key. 316655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * 316755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * TODO: consider checking against hard-coded Signatures in the Sig-tests 316855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 316955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testSigChangeAfterUpgrade() throws Exception { 317055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // install original apk and grab sigs 317155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman installFromRawResource("tmp.apk", R.raw.keyset_sa_ub, 317255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 317355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageManager pm = getPm(); 317455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String pkgName = "com.android.frameworks.coretests.keysets"; 317555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageInfo pi = pm.getPackageInfo(pkgName, PackageManager.GET_SIGNATURES); 317655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertTrue("Package should only have one signature, sig A", 317755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pi.signatures.length == 1); 317855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String sigBefore = pi.signatures[0].toCharsString(); 317955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // install apk signed by different upgrade KeySet 318055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman installFromRawResource("tmp2.apk", R.raw.keyset_sb_ub, 318155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageManager.INSTALL_REPLACE_EXISTING, false, false, -1, 318255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 318355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pi = pm.getPackageInfo(pkgName, PackageManager.GET_SIGNATURES); 318455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertTrue("Package should only have one signature, sig B", 318555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pi.signatures.length == 1); 318655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String sigAfter = pi.signatures[0].toCharsString(); 318755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertFalse("Package signatures did not change after upgrade!", 318855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman sigBefore.equals(sigAfter)); 318955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman cleanUpInstall(pkgName); 319055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 319155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 319255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 319355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk's sig is the same after upgrading with a signing 319455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * key. 319555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 319655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testSigSameAfterUpgrade() throws Exception { 319755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // install original apk and grab sigs 319855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman installFromRawResource("tmp.apk", R.raw.keyset_sa_ua, 319955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 320055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageManager pm = getPm(); 320155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String pkgName = "com.android.frameworks.coretests.keysets"; 320255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageInfo pi = pm.getPackageInfo(pkgName, PackageManager.GET_SIGNATURES); 320355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertTrue("Package should only have one signature, sig A", 320455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pi.signatures.length == 1); 320555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String sigBefore = pi.signatures[0].toCharsString(); 320655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // install apk signed by same upgrade KeySet 320755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman installFromRawResource("tmp2.apk", R.raw.keyset_sa_ua, 320855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageManager.INSTALL_REPLACE_EXISTING, false, false, -1, 320955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 321055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pi = pm.getPackageInfo(pkgName, PackageManager.GET_SIGNATURES); 321155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertTrue("Package should only have one signature, sig A", 321255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pi.signatures.length == 1); 321355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String sigAfter = pi.signatures[0].toCharsString(); 321455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertTrue("Package signatures changed after upgrade!", 321555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman sigBefore.equals(sigAfter)); 321655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman cleanUpInstall(pkgName); 321755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 321855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 321955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 322055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk's sigs are the same after upgrading with an app with 322155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * a subset of the original signing keys. 322255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 322355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testSigRemovedAfterUpgrade() throws Exception { 322455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // install original apk and grab sigs 322555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman installFromRawResource("tmp.apk", R.raw.keyset_sab_ua, 322655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 322755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageManager pm = getPm(); 322855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String pkgName = "com.android.frameworks.coretests.keysets"; 322955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageInfo pi = pm.getPackageInfo(pkgName, PackageManager.GET_SIGNATURES); 323055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertTrue("Package should have two signatures, sig A and sig B", 323155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pi.signatures.length == 2); 323255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman Set<String> sigsBefore = new HashSet<String>(); 323355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman for (int i = 0; i < pi.signatures.length; i++) { 323455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman sigsBefore.add(pi.signatures[i].toCharsString()); 323555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 323655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // install apk signed subset upgrade KeySet 323755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman installFromRawResource("tmp2.apk", R.raw.keyset_sa_ua, 323855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageManager.INSTALL_REPLACE_EXISTING, false, false, -1, 323955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 324055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pi = pm.getPackageInfo(pkgName, PackageManager.GET_SIGNATURES); 324155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertTrue("Package should only have one signature, sig A", 324255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pi.signatures.length == 1); 324355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String sigAfter = pi.signatures[0].toCharsString(); 324455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertTrue("Original package signatures did not contain new sig", 324555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman sigsBefore.contains(sigAfter)); 324655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman cleanUpInstall(pkgName); 324755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 324855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 324955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 325055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk's sigs are added to after upgrading with an app with 325155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * a superset of the original signing keys. 325255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 325355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testSigAddedAfterUpgrade() throws Exception { 325455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // install original apk and grab sigs 325555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman installFromRawResource("tmp.apk", R.raw.keyset_sa_ua, 325655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 325755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageManager pm = getPm(); 325855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String pkgName = "com.android.frameworks.coretests.keysets"; 325955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageInfo pi = pm.getPackageInfo(pkgName, PackageManager.GET_SIGNATURES); 326055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertTrue("Package should only have one signature, sig A", 326155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pi.signatures.length == 1); 326255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String sigBefore = pi.signatures[0].toCharsString(); 326355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // install apk signed subset upgrade KeySet 326455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman installFromRawResource("tmp2.apk", R.raw.keyset_sab_ua, 326555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageManager.INSTALL_REPLACE_EXISTING, false, false, -1, 326655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 326755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pi = pm.getPackageInfo(pkgName, PackageManager.GET_SIGNATURES); 326855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertTrue("Package should have two signatures, sig A and sig B", 326955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pi.signatures.length == 2); 327055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman Set<String> sigsAfter = new HashSet<String>(); 327155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman for (int i = 0; i < pi.signatures.length; i++) { 327255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman sigsAfter.add(pi.signatures[i].toCharsString()); 327355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 327455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertTrue("Package signatures did not change after upgrade!", 327555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman sigsAfter.contains(sigBefore)); 327655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman cleanUpInstall(pkgName); 327755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 327855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 327955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 328055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk gains signature-level permission after changing to the a 328155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * new signature, for which a permission should be granted. 328255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 328355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testUpgradeSigPermGained() throws Exception { 328455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // install apk which defines permission 328555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman installFromRawResource("permDef.apk", R.raw.keyset_permdef_sa_unone, 328655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 328755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // install apk which uses permission but does not have sig 328855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman installFromRawResource("permUse.apk", R.raw.keyset_permuse_sb_ua_ub, 328955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 329055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // verify that package does not have perm before 329155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageManager pm = getPm(); 329255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String permPkgName = "com.android.frameworks.coretests.keysets_permdef"; 329355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String pkgName = "com.android.frameworks.coretests.keysets"; 329455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String permName = "com.android.frameworks.coretests.keysets_permdef.keyset_perm"; 329555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertFalse("keyset permission granted to app without same signature!", 329655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pm.checkPermission(permName, pkgName) 329755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman == PackageManager.PERMISSION_GRANTED); 329855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // upgrade to apk with perm signature 329955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman installFromRawResource("permUse2.apk", R.raw.keyset_permuse_sa_ua_ub, 330055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageManager.INSTALL_REPLACE_EXISTING, false, false, -1, 330155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 330255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertTrue("keyset permission not granted to app after upgrade to same sig", 330355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pm.checkPermission(permName, pkgName) 330455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman == PackageManager.PERMISSION_GRANTED); 330555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman cleanUpInstall(permPkgName); 330655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman cleanUpInstall(pkgName); 330755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 330855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 330955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /* 331055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * Check if an apk loses signature-level permission after changing to the a 331155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman * new signature, from one which a permission should be granted. 331255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman */ 331355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman public void testUpgradeSigPermLost() throws Exception { 331455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // install apk which defines permission 331555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman installFromRawResource("permDef.apk", R.raw.keyset_permdef_sa_unone, 331655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 331755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // install apk which uses permission, signed by same sig 331855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman installFromRawResource("permUse.apk", R.raw.keyset_permuse_sa_ua_ub, 331955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 332055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // verify that package does not have perm before 332155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageManager pm = getPm(); 332255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String permPkgName = "com.android.frameworks.coretests.keysets_permdef"; 332355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String pkgName = "com.android.frameworks.coretests.keysets"; 332455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman String permName = "com.android.frameworks.coretests.keysets_permdef.keyset_perm"; 332555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertTrue("keyset permission not granted to app with same sig", 332655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pm.checkPermission(permName, pkgName) 332755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman == PackageManager.PERMISSION_GRANTED); 332855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman // upgrade to apk without perm signature 332955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman installFromRawResource("permUse2.apk", R.raw.keyset_permuse_sb_ua_ub, 333055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageManager.INSTALL_REPLACE_EXISTING, false, false, -1, 333155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 333255b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 333355b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman assertFalse("keyset permission not revoked from app which upgraded to a " 333455b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman + "different signature", 333555b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman pm.checkPermission(permName, pkgName) 333655b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman == PackageManager.PERMISSION_GRANTED); 333755b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman cleanUpInstall(permPkgName); 333855b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman cleanUpInstall(pkgName); 333955b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman } 334055b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman 334155b1078e2a1b56daa85edfd5000a5844d3c7914bdcashman /** 33429d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman * The following tests are related to testing KeySets-based API 33439d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman */ 33449d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 33459d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman /* 33469d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman * testGetSigningKeySetNull - ensure getSigningKeySet() returns null on null 33479d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman * input and when calling a package other than that which made the call. 33489d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman */ 33499d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman public void testGetSigningKeySet() throws Exception { 33509d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman PackageManager pm = getPm(); 33519d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman String mPkgName = mContext.getPackageName(); 33529d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman String otherPkgName = "com.android.frameworks.coretests.keysets_api"; 33539d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman KeySet ks; 33549d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 33559d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman ks = pm.getSigningKeySet(null); 33569d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 33579d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch (NullPointerException e) { 33589d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 33599d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 33609d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman ks = pm.getSigningKeySet("keysets.test.bogus.package"); 33619d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 33629d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch (IllegalArgumentException e) { 33639d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 33649d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman installFromRawResource("keysetApi.apk", R.raw.keyset_splat_api, 33659d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 33669d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 33679d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman ks = pm.getSigningKeySet(otherPkgName); 33689d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 33699d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch (SecurityException e) { 33709d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 33719d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman cleanUpInstall(otherPkgName); 33729d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman ks = pm.getSigningKeySet(mContext.getPackageName()); 33739d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertNotNull(ks); 33749d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 33759d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 33769d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman /* 33779d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman * testGetKeySetByAlias - same as getSigningKeySet, but for keysets defined 33789d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman * by this package. 33799d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman */ 33809d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman public void testGetKeySetByAlias() throws Exception { 33819d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman PackageManager pm = getPm(); 33829d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman String mPkgName = mContext.getPackageName(); 33839d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman String otherPkgName = "com.android.frameworks.coretests.keysets_api"; 33849d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman KeySet ks; 33859d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 33869d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman ks = pm.getKeySetByAlias(null, null); 33879d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 33889d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch (NullPointerException e) { 33899d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 33909d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 33919d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman ks = pm.getKeySetByAlias(null, "keysetBogus"); 33929d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 33939d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch (NullPointerException e) { 33949d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 33959d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 33969d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman ks = pm.getKeySetByAlias("keysets.test.bogus.package", null); 33979d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 33989d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch (NullPointerException e) { 33999d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 34009d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 34019d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman ks = pm.getKeySetByAlias("keysets.test.bogus.package", "A"); 34029d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 34039d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch(IllegalArgumentException e) { 34049d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 34059d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 34069d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman ks = pm.getKeySetByAlias(mPkgName, "keysetBogus"); 34079d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 34089d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch(IllegalArgumentException e) { 34099d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 34109d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman installFromRawResource("keysetApi.apk", R.raw.keyset_splat_api, 34119d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 34129d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 34139d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman ks = pm.getKeySetByAlias(otherPkgName, "A"); 34149d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 34159d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch (SecurityException e) { 34169d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 34179d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman cleanUpInstall(otherPkgName); 34189d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman ks = pm.getKeySetByAlias(mPkgName, "A"); 34199d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertNotNull(ks); 34209d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 34219d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 34229d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman public void testIsSignedBy() throws Exception { 34239d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman PackageManager pm = getPm(); 34249d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman String mPkgName = mContext.getPackageName(); 34259d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman String otherPkgName = "com.android.frameworks.coretests.keysets_api"; 34269d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman KeySet mSigningKS = pm.getSigningKeySet(mPkgName); 34279d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman KeySet mDefinedKS = pm.getKeySetByAlias(mPkgName, "A"); 34289d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 34299d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 34309d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedBy(null, null)); 34319d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 34329d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch (NullPointerException e) { 34339d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 34349d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 34359d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedBy(null, mSigningKS)); 34369d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 34379d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch (NullPointerException e) { 34389d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 34399d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 34409d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedBy(mPkgName, null)); 34419d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 34429d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch (NullPointerException e) { 34439d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 34449d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 34459d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedBy("keysets.test.bogus.package", mDefinedKS)); 34469d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch(IllegalArgumentException e) { 34479d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 34489d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedBy(mPkgName, mDefinedKS)); 34499d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedBy(mPkgName, new KeySet(new Binder()))); 34509d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(pm.isSignedBy(mPkgName, mSigningKS)); 34519d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 34529d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman installFromRawResource("keysetApi.apk", R.raw.keyset_splat_api, 34539d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 34549d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedBy(otherPkgName, mDefinedKS)); 34559d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(pm.isSignedBy(otherPkgName, mSigningKS)); 34569d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman cleanUpInstall(otherPkgName); 34579d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 34589d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman installFromRawResource("keysetApi.apk", R.raw.keyset_splata_api, 34599d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 34609d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(pm.isSignedBy(otherPkgName, mDefinedKS)); 34619d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(pm.isSignedBy(otherPkgName, mSigningKS)); 34629d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman cleanUpInstall(otherPkgName); 34639d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 34649d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 34659d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman public void testIsSignedByExactly() throws Exception { 34669d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman PackageManager pm = getPm(); 34679d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman String mPkgName = mContext.getPackageName(); 34689d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman String otherPkgName = "com.android.frameworks.coretests.keysets_api"; 34699d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman KeySet mSigningKS = pm.getSigningKeySet(mPkgName); 34709d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman KeySet mDefinedKS = pm.getKeySetByAlias(mPkgName, "A"); 34719d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 34729d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedBy(null, null)); 34739d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 34749d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch (NullPointerException e) { 34759d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 34769d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 34779d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedBy(null, mSigningKS)); 34789d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 34799d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch (NullPointerException e) { 34809d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 34819d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 34829d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedBy(mPkgName, null)); 34839d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(false); // should have thrown 34849d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch (NullPointerException e) { 34859d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 34869d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman try { 34879d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedByExactly("keysets.test.bogus.package", mDefinedKS)); 34889d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } catch(IllegalArgumentException e) { 34899d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 34909d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedByExactly(mPkgName, mDefinedKS)); 34919d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedByExactly(mPkgName, new KeySet(new Binder()))); 34929d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(pm.isSignedByExactly(mPkgName, mSigningKS)); 34939d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 34949d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman installFromRawResource("keysetApi.apk", R.raw.keyset_splat_api, 34959d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 34969d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedByExactly(otherPkgName, mDefinedKS)); 34979d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertTrue(pm.isSignedByExactly(otherPkgName, mSigningKS)); 34989d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman cleanUpInstall(otherPkgName); 34999d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 35009d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman installFromRawResource("keysetApi.apk", R.raw.keyset_splata_api, 35019d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 0, false, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 35029d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedByExactly(otherPkgName, mDefinedKS)); 35039d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman assertFalse(pm.isSignedByExactly(otherPkgName, mSigningKS)); 35049d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman cleanUpInstall(otherPkgName); 35059d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman } 35069d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 35079d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 35089d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman 35099d2f441f9bb2c8dcac1150e2cba1d15a86a4efb1dcashman /** 351025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * The following tests are related to testing the checkSignatures api. 3511ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 351225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private void checkSignatures(int apk1, int apk2, int expMatchResult) throws Exception { 3513ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, true, false, -1, expMatchResult); 3514ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 351525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3516f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 351725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testCheckSignaturesAllMatch() throws Exception { 3518ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = APP1_CERT1_CERT2; 3519ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = APP2_CERT1_CERT2; 3520ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSignatures(apk1, apk2, PackageManager.SIGNATURE_MATCH); 3521ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 352225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3523f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 352425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testCheckSignaturesNoMatch() throws Exception { 3525ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = APP1_CERT1; 3526ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = APP2_CERT2; 3527ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH); 3528ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 352925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3530f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 353125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testCheckSignaturesSomeMatch1() throws Exception { 3532ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = APP1_CERT1_CERT2; 3533ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = APP2_CERT1; 3534ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH); 3535ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 353625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3537f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 353825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testCheckSignaturesSomeMatch2() throws Exception { 3539ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = APP1_CERT1_CERT2; 3540ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = APP2_CERT2; 3541ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH); 3542ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 354325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3544f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 354525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testCheckSignaturesMoreMatch() throws Exception { 3546ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = APP1_CERT1; 3547ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = APP2_CERT1_CERT2; 3548ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH); 3549ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 355025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3551f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 355225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testCheckSignaturesUnknown() throws Exception { 3553ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = APP1_CERT1_CERT2; 3554ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = APP2_CERT1_CERT2; 3555ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk1Name = "install1.apk"; 3556ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk2Name = "install2.apk"; 3557ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu InstallParams ip1 = null; 3558ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu 3559ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu try { 3560ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu ip1 = installFromRawResource(apk1Name, apk1, 0, false, 3561ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 3562ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageManager pm = mContext.getPackageManager(); 3563ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu // Delete app2 3564ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu File filesDir = mContext.getFilesDir(); 3565ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu File outFile = new File(filesDir, apk2Name); 3566ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rawResId = apk2; 3567ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu Uri packageURI = getInstallablePackage(rawResId, outFile); 3568ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageParser.Package pkg = parsePackage(packageURI); 3569a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root getPm().deletePackage(pkg.packageName, null, PackageManager.DELETE_ALL_USERS); 3570ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu // Check signatures now 3571ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int match = mContext.getPackageManager().checkSignatures( 3572ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu ip1.pkg.packageName, pkg.packageName); 3573ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu assertEquals(PackageManager.SIGNATURE_UNKNOWN_PACKAGE, match); 3574ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } finally { 3575ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (ip1 != null) { 3576ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(ip1); 3577ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 3578ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 3579ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 358025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3581f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 358225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testInstallNoCertificates() throws Exception { 3583ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = APP1_UNSIGNED; 3584ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk1Name = "install1.apk"; 3585ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu InstallParams ip1 = null; 3586ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu 3587ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu try { 3588ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource(apk1Name, apk1, 0, false, 3589ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu true, PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES, 3590ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 3591ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } finally { 3592ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 3593ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 359425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 359525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root /* 359625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * The following tests are related to apps using shared uids signed with 359725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * different certs. 3598ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 3599ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED1_UNSIGNED = R.raw.install_shared1_unsigned; 360025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3601ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED1_CERT1 = R.raw.install_shared1_cert1; 360225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3603ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED1_CERT2 = R.raw.install_shared1_cert2; 360425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3605ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED1_CERT1_CERT2 = R.raw.install_shared1_cert1_cert2; 360625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3607ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED2_UNSIGNED = R.raw.install_shared2_unsigned; 360825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3609ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED2_CERT1 = R.raw.install_shared2_cert1; 361025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3611ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED2_CERT2 = R.raw.install_shared2_cert2; 361225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3613ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED2_CERT1_CERT2 = R.raw.install_shared2_cert1_cert2; 361425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 361525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root private void checkSharedSignatures(int apk1, int apk2, boolean cleanUp, boolean fail, 361625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int retCode, int expMatchResult) throws Exception { 3617ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk1Name = "install1.apk"; 3618ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk2Name = "install2.apk"; 3619ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageParser.Package pkg1 = getParsedPackage(apk1Name, apk1); 3620ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageParser.Package pkg2 = getParsedPackage(apk2Name, apk2); 3621ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu 3622ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu try { 3623ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu // Clean up before testing first. 3624ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(pkg1.packageName); 3625ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(pkg2.packageName); 362625c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root installFromRawResource(apk1Name, apk1, 0, false, false, -1, 362725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 3628ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (fail) { 362925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root installFromRawResource(apk2Name, apk2, 0, false, true, retCode, 363025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 3631ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } else { 363225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root installFromRawResource(apk2Name, apk2, 0, false, false, -1, 363325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 363425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root int match = mContext.getPackageManager().checkSignatures(pkg1.packageName, 363525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root pkg2.packageName); 3636ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu assertEquals(expMatchResult, match); 3637ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 3638ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } finally { 3639ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (cleanUp) { 3640ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(pkg1.packageName); 3641ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(pkg2.packageName); 3642ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 3643ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 3644ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 364525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3646f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 364725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testCheckSignaturesSharedAllMatch() throws Exception { 3648ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1_CERT2; 3649ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1_CERT2; 3650ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = false; 3651ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int retCode = -1; 3652ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int expMatchResult = PackageManager.SIGNATURE_MATCH; 3653ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult); 3654ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 365525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3656f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 365725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testCheckSignaturesSharedNoMatch() throws Exception { 3658ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1; 3659ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT2; 3660ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 3661ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE; 3662ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int expMatchResult = -1; 3663ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult); 3664ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 366525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3666ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 366725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * Test that an app signed with cert1 and cert2 cannot be replaced when 366825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * signed with cert1 alone. 3669ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 3670f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 367125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testCheckSignaturesSharedSomeMatch1() throws Exception { 3672ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1_CERT2; 3673ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1; 3674ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 3675ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE; 3676ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int expMatchResult = -1; 3677ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult); 3678ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 367925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3680ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 368125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * Test that an app signed with cert1 and cert2 cannot be replaced when 368225c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * signed with cert2 alone. 3683ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 3684f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 368525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testCheckSignaturesSharedSomeMatch2() throws Exception { 3686ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1_CERT2; 3687ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT2; 3688ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 3689ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE; 3690ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int expMatchResult = -1; 3691ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult); 3692ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 369325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3694f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 369525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testCheckSignaturesSharedUnknown() throws Exception { 3696ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1_CERT2; 3697ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1_CERT2; 3698ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk1Name = "install1.apk"; 3699ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk2Name = "install2.apk"; 3700ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu InstallParams ip1 = null; 3701ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu 3702ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu try { 3703ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu ip1 = installFromRawResource(apk1Name, apk1, 0, false, 3704ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 3705ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageManager pm = mContext.getPackageManager(); 3706ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu // Delete app2 3707ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageParser.Package pkg = getParsedPackage(apk2Name, apk2); 3708a3e90798b7ad3ed62e5b31842c699b2f98bd457bKenny Root getPm().deletePackage(pkg.packageName, null, PackageManager.DELETE_ALL_USERS); 3709ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu // Check signatures now 3710ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int match = mContext.getPackageManager().checkSignatures( 3711ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu ip1.pkg.packageName, pkg.packageName); 3712ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu assertEquals(PackageManager.SIGNATURE_UNKNOWN_PACKAGE, match); 3713ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } finally { 3714ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (ip1 != null) { 3715ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(ip1); 3716ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 3717ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 3718ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 3719edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 3720f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 372125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceFirstSharedMatchAllCerts() throws Exception { 3722ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1; 3723ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1; 3724ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk1 = SHARED1_CERT1; 3725ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSignatures(apk1, apk2, PackageManager.SIGNATURE_MATCH); 3726ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(apk1, rapk1, true, false, -1); 3727ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 372825c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3729f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 373025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceSecondSharedMatchAllCerts() throws Exception { 3731ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1; 3732ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1; 3733ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk2 = SHARED2_CERT1; 3734ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSignatures(apk1, apk2, PackageManager.SIGNATURE_MATCH); 3735ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(apk2, rapk2, true, false, -1); 3736ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 373725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3738f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 373925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceFirstSharedMatchSomeCerts() throws Exception { 3740ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1_CERT2; 3741ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1_CERT2; 3742ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk1 = SHARED1_CERT1; 3743ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 37442a53332343c9fbc734595d269a2c35371227904bJeff Sharkey int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; 3745ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); 3746ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true, 3747ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 3748ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 374925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3750f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 375125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceSecondSharedMatchSomeCerts() throws Exception { 3752ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1_CERT2; 3753ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1_CERT2; 3754ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk2 = SHARED2_CERT1; 3755ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 37562a53332343c9fbc734595d269a2c35371227904bJeff Sharkey int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; 3757ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); 3758ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true, 3759ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 3760ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 376125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3762f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 376325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceFirstSharedMatchNoCerts() throws Exception { 3764ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1; 3765ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1; 3766ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk1 = SHARED1_CERT2; 3767ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 37682a53332343c9fbc734595d269a2c35371227904bJeff Sharkey int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; 3769ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); 3770ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true, 3771ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 3772ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 377325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3774f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 377525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceSecondSharedMatchNoCerts() throws Exception { 3776ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1; 3777ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1; 3778ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk2 = SHARED2_CERT2; 3779ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 37802a53332343c9fbc734595d269a2c35371227904bJeff Sharkey int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; 3781ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); 3782ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true, 3783ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 3784ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 378525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3786f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 378725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceFirstSharedMatchMoreCerts() throws Exception { 3788ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1; 3789ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1; 3790ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk1 = SHARED1_CERT1_CERT2; 3791ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 37922a53332343c9fbc734595d269a2c35371227904bJeff Sharkey int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; 3793ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); 3794ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true, 3795ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 3796ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 379725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root 3798f76c56bcaa9df1d1afa711177f813dc63f399795Brett Chabot @LargeTest 379925c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testReplaceSecondSharedMatchMoreCerts() throws Exception { 3800ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1; 3801ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1; 3802ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk2 = SHARED2_CERT1_CERT2; 3803ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 38042a53332343c9fbc734595d269a2c35371227904bJeff Sharkey int retCode = PackageManager.INSTALL_FAILED_UPDATE_INCOMPATIBLE; 3805ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); 3806ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true, 3807ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 3808ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 38091683afac148f5bce186f7af7a6a8ea6294ecd379Kenny Root 38104c3915a0f73e51d0c70d93fe5b9ed125d5739b93Kenny Root /** 38114c3915a0f73e51d0c70d93fe5b9ed125d5739b93Kenny Root * Unknown features should be allowed to install. This prevents older phones 38124c3915a0f73e51d0c70d93fe5b9ed125d5739b93Kenny Root * from rejecting new packages that specify features that didn't exist when 38134c3915a0f73e51d0c70d93fe5b9ed125d5739b93Kenny Root * an older phone existed. All older phones are assumed to have those 38144c3915a0f73e51d0c70d93fe5b9ed125d5739b93Kenny Root * features. 38154c3915a0f73e51d0c70d93fe5b9ed125d5739b93Kenny Root * <p> 38164c3915a0f73e51d0c70d93fe5b9ed125d5739b93Kenny Root * Right now we allow all packages to be installed regardless of their 38174c3915a0f73e51d0c70d93fe5b9ed125d5739b93Kenny Root * features. 38184c3915a0f73e51d0c70d93fe5b9ed125d5739b93Kenny Root */ 38191683afac148f5bce186f7af7a6a8ea6294ecd379Kenny Root @LargeTest 382025c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testUsesFeatureUnknownFeature() throws Exception { 38214c3915a0f73e51d0c70d93fe5b9ed125d5739b93Kenny Root int retCode = PackageManager.INSTALL_SUCCEEDED; 38224c3915a0f73e51d0c70d93fe5b9ed125d5739b93Kenny Root installFromRawResource("install.apk", R.raw.install_uses_feature, 0, true, false, retCode, 38231683afac148f5bce186f7af7a6a8ea6294ecd379Kenny Root PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 38241683afac148f5bce186f7af7a6a8ea6294ecd379Kenny Root } 38253c6768958433a7a1f1724ab97481b2c8affcfba1Kenny Root 38261ebd74acf9977daa42133507e970dab88e08f0efKenny Root @LargeTest 382725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testInstallNonexistentFile() throws Exception { 38281ebd74acf9977daa42133507e970dab88e08f0efKenny Root int retCode = PackageManager.INSTALL_FAILED_INVALID_URI; 38291ebd74acf9977daa42133507e970dab88e08f0efKenny Root File invalidFile = new File("/nonexistent-file.apk"); 38301ebd74acf9977daa42133507e970dab88e08f0efKenny Root invokeInstallPackageFail(Uri.fromFile(invalidFile), 0, retCode); 38311ebd74acf9977daa42133507e970dab88e08f0efKenny Root } 38321ebd74acf9977daa42133507e970dab88e08f0efKenny Root 38330aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root @SmallTest 383425c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testGetVerifierDeviceIdentity() throws Exception { 38350aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root PackageManager pm = getPm(); 38360aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root VerifierDeviceIdentity id = pm.getVerifierDeviceIdentity(); 38370aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 38380aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root assertNotNull("Verifier device identity should not be null", id); 38390aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root } 38400aaa0d931716e9f57a1d84d795fab2df75092756Kenny Root 384125c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testGetInstalledPackages() throws Exception { 3842f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren List<PackageInfo> packages = getPm().getInstalledPackages(0); 3843f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("installed packages cannot be null", packages); 3844f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertTrue("installed packages cannot be empty", packages.size() > 0); 3845f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren } 3846f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren 384725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testGetUnInstalledPackages() throws Exception { 3848f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren List<PackageInfo> packages = getPm().getInstalledPackages( 3849f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren PackageManager.GET_UNINSTALLED_PACKAGES); 3850f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("installed packages cannot be null", packages); 3851f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertTrue("installed packages cannot be empty", packages.size() > 0); 3852f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren } 3853f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren 3854f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren /** 385525c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root * Test that getInstalledPackages returns all the data specified in flags. 3856f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren */ 385725c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testGetInstalledPackagesAll() throws Exception { 3858f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren int flags = PackageManager.GET_ACTIVITIES | PackageManager.GET_GIDS 3859f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren | PackageManager.GET_CONFIGURATIONS | PackageManager.GET_INSTRUMENTATION 3860f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren | PackageManager.GET_PERMISSIONS | PackageManager.GET_PROVIDERS 3861f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren | PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES 3862f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren | PackageManager.GET_SIGNATURES | PackageManager.GET_UNINSTALLED_PACKAGES; 3863f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren 3864f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren List<PackageInfo> packages = getPm().getInstalledPackages(flags); 3865f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("installed packages cannot be null", packages); 3866f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertTrue("installed packages cannot be empty", packages.size() > 0); 3867f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren 3868f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren PackageInfo packageInfo = null; 3869f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren 3870f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren // Find the package with all components specified in the AndroidManifest 3871f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren // to ensure no null values 3872f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren for (PackageInfo pi : packages) { 3873f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren if ("com.android.frameworks.coretests.install_complete_package_info" 3874f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren .equals(pi.packageName)) { 3875f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren packageInfo = pi; 3876f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren break; 3877f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren } 3878f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren } 3879f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("activities should not be null", packageInfo.activities); 3880f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("configPreferences should not be null", packageInfo.configPreferences); 3881f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("instrumentation should not be null", packageInfo.instrumentation); 3882f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("permissions should not be null", packageInfo.permissions); 3883f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("providers should not be null", packageInfo.providers); 3884f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("receivers should not be null", packageInfo.receivers); 3885f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("services should not be null", packageInfo.services); 3886f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("signatures should not be null", packageInfo.signatures); 3887f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren } 3888f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren 3889f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren /** 3890f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren * Test that getInstalledPackages returns all the data specified in 3891f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren * flags when the GET_UNINSTALLED_PACKAGES flag is set. 3892f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren */ 389325c925e6659e57f1cc8fef83be07f3917a108e3cKenny Root public void testGetUnInstalledPackagesAll() throws Exception { 3894f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren int flags = PackageManager.GET_UNINSTALLED_PACKAGES 3895f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren | PackageManager.GET_ACTIVITIES | PackageManager.GET_GIDS 3896f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren | PackageManager.GET_CONFIGURATIONS | PackageManager.GET_INSTRUMENTATION 3897f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren | PackageManager.GET_PERMISSIONS | PackageManager.GET_PROVIDERS 3898f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren | PackageManager.GET_RECEIVERS | PackageManager.GET_SERVICES 3899f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren | PackageManager.GET_SIGNATURES | PackageManager.GET_UNINSTALLED_PACKAGES; 3900f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren 3901f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren List<PackageInfo> packages = getPm().getInstalledPackages(flags); 3902f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("installed packages cannot be null", packages); 3903f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertTrue("installed packages cannot be empty", packages.size() > 0); 3904f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren 3905f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren PackageInfo packageInfo = null; 3906f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren 3907f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren // Find the package with all components specified in the AndroidManifest 3908f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren // to ensure no null values 3909f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren for (PackageInfo pi : packages) { 3910f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren if ("com.android.frameworks.coretests.install_complete_package_info" 3911f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren .equals(pi.packageName)) { 3912f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren packageInfo = pi; 3913f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren break; 3914f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren } 3915f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren } 3916f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("activities should not be null", packageInfo.activities); 3917f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("configPreferences should not be null", packageInfo.configPreferences); 3918f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("instrumentation should not be null", packageInfo.instrumentation); 3919f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("permissions should not be null", packageInfo.permissions); 3920f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("providers should not be null", packageInfo.providers); 3921f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("receivers should not be null", packageInfo.receivers); 3922f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("services should not be null", packageInfo.services); 3923f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren assertNotNull("signatures should not be null", packageInfo.signatures); 3924f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren } 3925f2f1b6c94685147a6260cc70909247a96bcbe81fMartin Wallgren 3926e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root public void testInstall_BadDex_CleanUp() throws Exception { 3927e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root int retCode = PackageManager.INSTALL_FAILED_DEXOPT; 3928e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root installFromRawResource("install.apk", R.raw.install_bad_dex, 0, true, true, retCode, 3929e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 3930e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root } 3931e15bdc2da4c74c8d16db8c1d067a42c4767d1003Kenny Root 3932d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn /*---------- Recommended install location tests ----*/ 3933b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu /* 3934b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * TODO's 3935b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * check version numbers for upgrades 3936b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * check permissions of installed packages 3937b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * how to do tests on updated system apps? 3938b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * verify updates to system apps cannot be installed on the sdcard. 3939b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu */ 3940afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu} 3941