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 19a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport com.android.frameworks.coretests.R; 20089262dc022d87e31eefc536025be6c015c7ebdeSuchi Amalapurapuimport com.android.internal.content.PackageHelper; 21089262dc022d87e31eefc536025be6c015c7ebdeSuchi Amalapurapu 22afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.BroadcastReceiver; 23afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.Context; 24afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.Intent; 25afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.IntentFilter; 26ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapuimport android.content.pm.ApplicationInfo; 2730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapuimport android.content.pm.IPackageMoveObserver; 28ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapuimport android.content.pm.PackageInfo; 29ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapuimport android.content.pm.PackageManager; 30ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapuimport android.content.pm.PackageParser; 31afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.PackageManager.NameNotFoundException; 32afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.res.Resources; 33afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.res.Resources.NotFoundException; 34a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.net.Uri; 35ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapuimport android.test.AndroidTestCase; 36edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyenimport android.test.suitebuilder.annotation.SmallTest; 37edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyenimport android.test.suitebuilder.annotation.MediumTest; 38edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyenimport android.test.suitebuilder.annotation.LargeTest; 39ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapuimport android.test.suitebuilder.annotation.Suppress; 40ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapuimport android.util.DisplayMetrics; 41ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapuimport android.util.Log; 42afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.Environment; 43a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.os.FileUtils; 44b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapuimport android.os.IBinder; 45afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.RemoteException; 46afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.ServiceManager; 47afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.StatFs; 48a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.os.storage.IMountService; 49a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.os.storage.StorageListener; 50a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.os.storage.StorageManager; 51a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.os.storage.StorageResultCode; 52117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapuimport android.provider.Settings; 53cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapuimport android.provider.Settings.SettingNotFoundException; 54a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.test.AndroidTestCase; 55a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.util.DisplayMetrics; 56a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport android.util.Log; 57a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabot 58a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport java.io.File; 59a3de74555120cc4dc205a3f93ef44c843b8d64a8Brett Chabotimport java.io.InputStream; 60afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 61afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapupublic class PackageManagerTests extends AndroidTestCase { 62b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu private static final boolean localLOGV = true; 63afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public static final String TAG="PackageManagerTests"; 648a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu public final long MAX_WAIT_TIME = 25*1000; 658a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu public final long WAIT_TIME_INCR = 5*1000; 66cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu private static final String SECURE_CONTAINERS_PREFIX = "/mnt/asec"; 67089262dc022d87e31eefc536025be6c015c7ebdeSuchi Amalapurapu private static final int APP_INSTALL_AUTO = PackageHelper.APP_INSTALL_AUTO; 68089262dc022d87e31eefc536025be6c015c7ebdeSuchi Amalapurapu private static final int APP_INSTALL_DEVICE = PackageHelper.APP_INSTALL_INTERNAL; 69089262dc022d87e31eefc536025be6c015c7ebdeSuchi Amalapurapu private static final int APP_INSTALL_SDCARD = PackageHelper.APP_INSTALL_EXTERNAL; 7014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu private boolean mOrigState; 71b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 72b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu void failStr(String errMsg) { 73b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.w(TAG, "errMsg="+errMsg); 74b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu fail(errMsg); 75b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 76b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu void failStr(Exception e) { 7790d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu failStr(e.getMessage()); 78b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 79afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 80afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu @Override 81afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu protected void setUp() throws Exception { 82afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu super.setUp(); 8314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu mOrigState = getMediaState(); 84e99bb5f10b90736d10cee9729b56cba156fc0921Suchi Amalapurapu if (!mountMedia()) { 85e99bb5f10b90736d10cee9729b56cba156fc0921Suchi Amalapurapu Log.i(TAG, "sdcard not mounted? Some of these tests might fail"); 86e99bb5f10b90736d10cee9729b56cba156fc0921Suchi Amalapurapu } 8714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 8814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu 8914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu @Override 9014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu protected void tearDown() throws Exception { 9114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Restore media state. 9214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu boolean newState = getMediaState(); 9314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (newState != mOrigState) { 9414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (mOrigState) { 9514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu getMs().mountVolume(Environment.getExternalStorageDirectory().getPath()); 9614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } else { 9714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu getMs().unmountVolume(Environment.getExternalStorageDirectory().getPath(), true); 9814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 9914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 10014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu super.tearDown(); 101afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 102afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 103afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu private class PackageInstallObserver extends IPackageInstallObserver.Stub { 104afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public int returnCode; 105afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu private boolean doneFlag = false; 106afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 107afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void packageInstalled(String packageName, int returnCode) { 108afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu synchronized(this) { 109afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.returnCode = returnCode; 110afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu doneFlag = true; 111afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu notifyAll(); 112afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 113afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 114afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 115afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public boolean isDone() { 116afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return doneFlag; 117afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 118afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 119afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 120afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu abstract class GenericReceiver extends BroadcastReceiver { 121afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu private boolean doneFlag = false; 122afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu boolean received = false; 123afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Intent intent; 124afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu IntentFilter filter; 125afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu abstract boolean notifyNow(Intent intent); 126afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu @Override 127afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void onReceive(Context context, Intent intent) { 128afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if (notifyNow(intent)) { 129afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu synchronized (this) { 130afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu received = true; 131afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu doneFlag = true; 132afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.intent = intent; 133afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu notifyAll(); 134afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 135afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 136afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 137afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 138afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public boolean isDone() { 139afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return doneFlag; 140afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 141afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 142afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void setFilter(IntentFilter filter) { 143afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.filter = filter; 144afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 145afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 146afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 147afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu class InstallReceiver extends GenericReceiver { 148afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String pkgName; 149afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 150afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu InstallReceiver(String pkgName) { 151afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.pkgName = pkgName; 152afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED); 153afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu filter.addDataScheme("package"); 154afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu super.setFilter(filter); 155afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 156afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 157afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public boolean notifyNow(Intent intent) { 158afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String action = intent.getAction(); 159afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if (!Intent.ACTION_PACKAGE_ADDED.equals(action)) { 160afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return false; 161afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 162afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Uri data = intent.getData(); 163afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String installedPkg = data.getEncodedSchemeSpecificPart(); 164afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if (pkgName.equals(installedPkg)) { 165afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return true; 166afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 167afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return false; 168afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 169afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 170afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 171315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu private PackageManager getPm() { 172afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return mContext.getPackageManager(); 173afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 174afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 175315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu private IPackageManager getIPm() { 176315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu IPackageManager ipm = IPackageManager.Stub.asInterface( 177315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu ServiceManager.getService("package")); 178315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return ipm; 179315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 180315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu 181afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public boolean invokeInstallPackage(Uri packageURI, int flags, 182315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu GenericReceiver receiver) throws Exception { 183afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu PackageInstallObserver observer = new PackageInstallObserver(); 184afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu final boolean received = false; 185afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu mContext.registerReceiver(receiver, receiver.filter); 1868946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu final boolean DEBUG = true; 187afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 188afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu // Wait on observer 189afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu synchronized(observer) { 190b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu synchronized (receiver) { 191afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu getPm().installPackage(packageURI, observer, flags, null); 192afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu long waitTime = 0; 193afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 194afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu observer.wait(WAIT_TIME_INCR); 195afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu waitTime += WAIT_TIME_INCR; 196afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 197afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if(!observer.isDone()) { 198afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu throw new Exception("Timed out waiting for packageInstalled callback"); 199afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 200afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if (observer.returnCode != PackageManager.INSTALL_SUCCEEDED) { 2018946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu Log.i(TAG, "Failed to install with error code = " + observer.returnCode); 202afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return false; 203afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 204afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu // Verify we received the broadcast 205afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu waitTime = 0; 206afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 207afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu receiver.wait(WAIT_TIME_INCR); 208afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu waitTime += WAIT_TIME_INCR; 209afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 210afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if(!receiver.isDone()) { 211afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu throw new Exception("Timed out waiting for PACKAGE_ADDED notification"); 212afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 213afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return receiver.received; 214afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 215afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 216afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } finally { 217afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu mContext.unregisterReceiver(receiver); 218afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 219afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 220afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 221315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu public void invokeInstallPackageFail(Uri packageURI, int flags, int result) throws Exception { 2225b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu PackageInstallObserver observer = new PackageInstallObserver(); 2235b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu try { 2245b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu // Wait on observer 2255b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu synchronized(observer) { 2265b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu getPm().installPackage(packageURI, observer, flags, null); 2275b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu long waitTime = 0; 2285b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 2295b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu observer.wait(WAIT_TIME_INCR); 2305b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu waitTime += WAIT_TIME_INCR; 2315b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 2325b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu if(!observer.isDone()) { 2335b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu throw new Exception("Timed out waiting for packageInstalled callback"); 2345b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 235315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu assertEquals(observer.returnCode, result); 2365b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 2375b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } finally { 2385b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 2395b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 2405b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu 241afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Uri getInstallablePackage(int fileResId, File outFile) { 242afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Resources res = mContext.getResources(); 243afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu InputStream is = null; 244afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 245afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu is = res.openRawResource(fileResId); 246afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } catch (NotFoundException e) { 247afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu failStr("Failed to load resource with id: " + fileResId); 248afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 249afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu FileUtils.setPermissions(outFile.getPath(), 250afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IRWXO, 251afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu -1, -1); 252afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertTrue(FileUtils.copyToFile(is, outFile)); 253afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu FileUtils.setPermissions(outFile.getPath(), 254afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IRWXO, 255afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu -1, -1); 256afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return Uri.fromFile(outFile); 257afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 258afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 259afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu private PackageParser.Package parsePackage(Uri packageURI) { 260afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu final String archiveFilePath = packageURI.getPath(); 261afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu PackageParser packageParser = new PackageParser(archiveFilePath); 262afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu File sourceFile = new File(archiveFilePath); 263afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu DisplayMetrics metrics = new DisplayMetrics(); 264afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu metrics.setToDefaults(); 2658946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu PackageParser.Package pkg = packageParser.parsePackage(sourceFile, archiveFilePath, metrics, 0); 2668946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu packageParser = null; 2678946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu return pkg; 268afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 26914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu private boolean checkSd(long pkgLen) { 27014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu String status = Environment.getExternalStorageState(); 27114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (!status.equals(Environment.MEDIA_MOUNTED)) { 27214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return false; 27314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 27414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu long sdSize = -1; 27514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu StatFs sdStats = new StatFs( 27614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu Environment.getExternalStorageDirectory().getPath()); 27714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu sdSize = (long)sdStats.getAvailableBlocks() * 27814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu (long)sdStats.getBlockSize(); 27914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // TODO check for thesholds here 28014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return pkgLen <= sdSize; 281edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 28214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 28314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu private boolean checkInt(long pkgLen) { 28414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu StatFs intStats = new StatFs(Environment.getDataDirectory().getPath()); 28514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu long intSize = (long)intStats.getBlockCount() * 28614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu (long)intStats.getBlockSize(); 28714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu long iSize = (long)intStats.getAvailableBlocks() * 28814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu (long)intStats.getBlockSize(); 28914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // TODO check for thresholds here? 29014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return pkgLen <= iSize; 29114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 29214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu private static final int INSTALL_LOC_INT = 1; 29314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu private static final int INSTALL_LOC_SD = 2; 29414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu private static final int INSTALL_LOC_ERR = -1; 29514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu private int getInstallLoc(int flags, int expInstallLocation, long pkgLen) { 296cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu // Flags explicitly over ride everything else. 297cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0 ) { 29814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return INSTALL_LOC_INT; 299cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } else if ((flags & PackageManager.INSTALL_EXTERNAL) != 0 ) { 30014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return INSTALL_LOC_SD; 30114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } else if ((flags & PackageManager.INSTALL_INTERNAL) != 0) { 30214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return INSTALL_LOC_INT; 303cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 304cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu // Manifest option takes precedence next 305cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu if (expInstallLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL) { 30614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (checkSd(pkgLen)) { 30714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return INSTALL_LOC_SD; 30814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 30914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (checkInt(pkgLen)) { 31014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return INSTALL_LOC_INT; 31114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 31214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return INSTALL_LOC_ERR; 313cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 3149b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu if (expInstallLocation == PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) { 31514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (checkInt(pkgLen)) { 31614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return INSTALL_LOC_INT; 31714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 31814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu return INSTALL_LOC_ERR; 3199b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu } 32014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (expInstallLocation == PackageInfo.INSTALL_LOCATION_AUTO) { 321315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu // Check for free memory internally 322315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu if (checkInt(pkgLen)) { 323315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_INT; 324315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 325315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu // Check for free memory externally 326315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu if (checkSd(pkgLen)) { 327315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_SD; 328315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 329315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_ERR; 33014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 33114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Check for settings preference. 332cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu boolean checkSd = false; 333315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu int userPref = getDefaultInstallLoc(); 334315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu if (userPref == APP_INSTALL_DEVICE) { 335315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu if (checkInt(pkgLen)) { 336315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_INT; 337cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 338315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_ERR; 339315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } else if (userPref == APP_INSTALL_SDCARD) { 340315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu if (checkSd(pkgLen)) { 341315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_SD; 342cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 343315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_ERR; 344315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 345315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu // Default system policy for apps with no manifest option specified. 346315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu // Check for free memory internally 347315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu if (checkInt(pkgLen)) { 348315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_INT; 34990d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu } 350315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return INSTALL_LOC_ERR; 351cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 352edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 353cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu private void assertInstall(PackageParser.Package pkg, int flags, int expInstallLocation) { 354afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 355cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu String pkgName = pkg.packageName; 35614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu ApplicationInfo info = getPm().getApplicationInfo(pkgName, 0); 35714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu assertNotNull(info); 35814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu assertEquals(pkgName, info.packageName); 35914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu File dataDir = Environment.getDataDirectory(); 36014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu String appInstallPath = new File(dataDir, "app").getPath(); 36114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu String drmInstallPath = new File(dataDir, "app-private").getPath(); 36214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu File srcDir = new File(info.sourceDir); 36314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu String srcPath = srcDir.getParent(); 36414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu File publicSrcDir = new File(info.publicSourceDir); 36514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu String publicSrcPath = publicSrcDir.getParent(); 36614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu long pkgLen = new File(info.sourceDir).length(); 36714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu 36814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) { 36914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu assertTrue((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0); 37014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu assertEquals(srcPath, drmInstallPath); 371afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu assertEquals(publicSrcPath, appInstallPath); 372cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } else { 37314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu assertFalse((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0); 37414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int rLoc = getInstallLoc(flags, expInstallLocation, pkgLen); 37514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu if (rLoc == INSTALL_LOC_INT) { 37614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu assertEquals(srcPath, appInstallPath); 37714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu assertEquals(publicSrcPath, appInstallPath); 37814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu assertFalse((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0); 37914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } else if (rLoc == INSTALL_LOC_SD){ 38014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu assertTrue((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0); 38114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu assertTrue(srcPath.startsWith(SECURE_CONTAINERS_PREFIX)); 38214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu assertTrue(publicSrcPath.startsWith(SECURE_CONTAINERS_PREFIX)); 38314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } else { 38414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // TODO handle error. Install should have failed. 38514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 386afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 387afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } catch (NameNotFoundException e) { 388afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu failStr("failed with exception : " + e); 389afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 390afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 391edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 3925b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu private void assertNotInstalled(String pkgName) { 3935b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu try { 3945b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu ApplicationInfo info = getPm().getApplicationInfo(pkgName, 0); 3955b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu fail(pkgName + " shouldnt be installed"); 3965b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } catch (NameNotFoundException e) { 3975b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 3985b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 399afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 400afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu class InstallParams { 401afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu Uri packageURI; 402afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu PackageParser.Package pkg; 403315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu InstallParams(String outFileName, int rawResId) { 404315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu this.pkg = getParsedPackage(outFileName, rawResId); 405315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu this.packageURI = Uri.fromFile(new File(pkg.mScanPath)); 406315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 407315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu InstallParams(PackageParser.Package pkg) { 408315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu this.packageURI = Uri.fromFile(new File(pkg.mScanPath)); 409afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.pkg = pkg; 410afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 411315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu long getApkSize() { 412315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu File file = new File(pkg.mScanPath); 413315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return file.length(); 414315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 415afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 416afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 4175b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu private InstallParams sampleInstallFromRawResource(int flags, boolean cleanUp) { 4185b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu return installFromRawResource("install.apk", R.raw.install, flags, cleanUp, 41990d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 4205b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu } 4218946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 422d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String PERM_PACKAGE = "package"; 423d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String PERM_DEFINED = "defined"; 424d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String PERM_UNDEFINED = "undefined"; 425d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String PERM_USED = "used"; 426d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String PERM_NOTUSED = "notused"; 427edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 428d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn private void assertPermissions(String[] cmds) { 429d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn final PackageManager pm = getPm(); 430d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn String pkg = null; 431d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PackageInfo pkgInfo = null; 432d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn String mode = PERM_DEFINED; 433d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn int i = 0; 434d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn while (i < cmds.length) { 435d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn String cmd = cmds[i++]; 436d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (cmd == PERM_PACKAGE) { 437d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn pkg = cmds[i++]; 438d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 439d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn pkgInfo = pm.getPackageInfo(pkg, 440d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PackageManager.GET_PERMISSIONS 441d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn | PackageManager.GET_UNINSTALLED_PACKAGES); 442d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (NameNotFoundException e) { 443d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn pkgInfo = null; 444d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 445d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } else if (cmd == PERM_DEFINED || cmd == PERM_UNDEFINED 446d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn || cmd == PERM_USED || cmd == PERM_NOTUSED) { 447d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn mode = cmds[i++]; 448d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } else { 449d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (mode == PERM_DEFINED) { 450d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 451d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PermissionInfo pi = pm.getPermissionInfo(cmd, 0); 452d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertNotNull(pi); 453d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertEquals(pi.packageName, pkg); 454d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertEquals(pi.name, cmd); 455d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertNotNull(pkgInfo); 456d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn boolean found = false; 457d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn for (int j=0; j<pkgInfo.permissions.length && !found; j++) { 458d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (pkgInfo.permissions[j].name.equals(cmd)) { 459d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn found = true; 460d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 461d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 462d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (!found) { 463d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn fail("Permission not found: " + cmd); 464d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 465d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (NameNotFoundException e) { 466d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn throw new RuntimeException(e); 467d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 468d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } else if (mode == PERM_UNDEFINED) { 469d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 470d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn pm.getPermissionInfo(cmd, 0); 471d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn throw new RuntimeException("Permission exists: " + cmd); 472d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (NameNotFoundException e) { 473d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 474d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (pkgInfo != null) { 475d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn boolean found = false; 476d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn for (int j=0; j<pkgInfo.permissions.length && !found; j++) { 477d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (pkgInfo.permissions[j].name.equals(cmd)) { 478d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn found = true; 479d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 480d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 481d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (found) { 482d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn fail("Permission still exists: " + cmd); 483d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 484d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 485d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } else if (mode == PERM_USED || mode == PERM_NOTUSED) { 486d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn boolean found = false; 487d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn for (int j=0; j<pkgInfo.requestedPermissions.length && !found; j++) { 488d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (pkgInfo.requestedPermissions[j].equals(cmd)) { 489d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn found = true; 490d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 491d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 492d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (!found) { 493d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn fail("Permission not requested: " + cmd); 494d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 495d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (mode == PERM_USED) { 496d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (pm.checkPermission(cmd, pkg) 497d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn != PackageManager.PERMISSION_GRANTED) { 498d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn fail("Permission not granted: " + cmd); 499d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 500d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } else { 501d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (pm.checkPermission(cmd, pkg) 502d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn != PackageManager.PERMISSION_DENIED) { 503d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn fail("Permission granted: " + cmd); 504d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 505d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 506d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 507d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 508d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 509d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 5108946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 511ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private PackageParser.Package getParsedPackage(String outFileName, int rawResId) { 512ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageManager pm = mContext.getPackageManager(); 513ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu File filesDir = mContext.getFilesDir(); 514ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu File outFile = new File(filesDir, outFileName); 515ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu Uri packageURI = getInstallablePackage(rawResId, outFile); 516ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageParser.Package pkg = parsePackage(packageURI); 517ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu return pkg; 518ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 519ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu 520afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu /* 521afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * Utility function that reads a apk bundled as a raw resource 522afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * copies it into own data directory and invokes 523afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * PackageManager api to install it. 524afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu */ 525315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu private void installFromRawResource(InstallParams ip, 526315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu int flags, boolean cleanUp, boolean fail, int result, 527cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu int expInstallLocation) { 5288a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu PackageManager pm = mContext.getPackageManager(); 529315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu PackageParser.Package pkg = ip.pkg; 530315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu Uri packageURI = ip.packageURI; 5318a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu if ((flags & PackageManager.INSTALL_REPLACE_EXISTING) == 0) { 5328a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu // Make sure the package doesn't exist 533afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 5348a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu ApplicationInfo appInfo = pm.getApplicationInfo(pkg.packageName, 5358a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 5368a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu GenericReceiver receiver = new DeleteReceiver(pkg.packageName); 537315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu invokeDeletePackage(pkg.packageName, 0, receiver); 5388a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } catch (NameNotFoundException e1) { 539afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } catch (Exception e) { 5408a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu failStr(e); 5418a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 5428a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 5438a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu try { 5448a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu if (fail) { 545315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu invokeInstallPackageFail(packageURI, flags, result); 546ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if ((flags & PackageManager.INSTALL_REPLACE_EXISTING) == 0) { 547ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu assertNotInstalled(pkg.packageName); 548ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 5498a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } else { 5508a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu InstallReceiver receiver = new InstallReceiver(pkg.packageName); 551315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu assertTrue(invokeInstallPackage(packageURI, flags, receiver)); 5528a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu // Verify installed information 5538a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu assertInstall(pkg, flags, expInstallLocation); 554afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 5558a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } catch (Exception e) { 5568a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu failStr("Failed with exception : " + e); 557afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } finally { 558afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu if (cleanUp) { 5599b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu cleanUpInstall(ip); 560afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 561afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 562315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 563315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu 564315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu /* 565315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu * Utility function that reads a apk bundled as a raw resource 566315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu * copies it into own data directory and invokes 567315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu * PackageManager api to install it. 568315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu */ 569315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu private InstallParams installFromRawResource(String outFileName, 570315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu int rawResId, int flags, boolean cleanUp, boolean fail, int result, 571315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu int expInstallLocation) { 572315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu PackageManager pm = mContext.getPackageManager(); 573315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu InstallParams ip = new InstallParams(outFileName, rawResId); 574315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu installFromRawResource(ip, flags, cleanUp, fail, result, expInstallLocation); 5758a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu return ip; 576afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 577afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 578edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 579afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void testInstallNormalInternal() { 5805b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu sampleInstallFromRawResource(0, true); 581afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 582afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 583edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 584afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void testInstallFwdLockedInternal() { 5855b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true); 586afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 587afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 588edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 589afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void testInstallSdcard() { 5905b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, true); 591afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 592afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 593afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu /* ------------------------- Test replacing packages --------------*/ 594afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu class ReplaceReceiver extends GenericReceiver { 595afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String pkgName; 596b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final static int INVALID = -1; 597b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final static int REMOVED = 1; 598b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final static int ADDED = 2; 599b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final static int REPLACED = 3; 600b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu int removed = INVALID; 601b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // for updated system apps only 602b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean update = false; 603afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 604afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu ReplaceReceiver(String pkgName) { 605afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu this.pkgName = pkgName; 606afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED); 607b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu filter.addAction(Intent.ACTION_PACKAGE_ADDED); 608b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (update) { 609b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu filter.addAction(Intent.ACTION_PACKAGE_REPLACED); 610b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 611b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu filter.addDataScheme("package"); 612afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu super.setFilter(filter); 613afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 614afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 615afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public boolean notifyNow(Intent intent) { 616afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu String action = intent.getAction(); 617b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Uri data = intent.getData(); 618b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String installedPkg = data.getEncodedSchemeSpecificPart(); 619b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (pkgName == null || !pkgName.equals(installedPkg)) { 620b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 621b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 622b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) { 623b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu removed = REMOVED; 624b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else if (Intent.ACTION_PACKAGE_ADDED.equals(action)) { 625b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (removed != REMOVED) { 626b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 627b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 628b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); 629b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!replacing) { 630b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 631b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 632b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu removed = ADDED; 633b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!update) { 634b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 635afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 636b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else if (Intent.ACTION_PACKAGE_REPLACED.equals(action)) { 637b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (removed != ADDED) { 638b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 639b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 640b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu removed = REPLACED; 641b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 642afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 643afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu return false; 644afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 645afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 646afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 647afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu /* 648afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * Utility function that reads a apk bundled as a raw resource 649afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * copies it into own data directory and invokes 650afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * PackageManager api to install first and then replace it 651afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu * again. 652afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu */ 653ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private void sampleReplaceFromRawResource(int flags) { 6545b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu InstallParams ip = sampleInstallFromRawResource(flags, false); 655b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean replace = ((flags & PackageManager.INSTALL_REPLACE_EXISTING) != 0); 656cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu Log.i(TAG, "replace=" + replace); 657afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu GenericReceiver receiver; 658b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (replace) { 659afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu receiver = new ReplaceReceiver(ip.pkg.packageName); 660b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.i(TAG, "Creating replaceReceiver"); 661afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } else { 662afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu receiver = new InstallReceiver(ip.pkg.packageName); 663afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 664afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 665afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu try { 666315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu assertEquals(invokeInstallPackage(ip.packageURI, flags, receiver), replace); 667b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (replace) { 668cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu assertInstall(ip.pkg, flags, ip.pkg.installLocation); 669afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 670afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } catch (Exception e) { 671afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu failStr("Failed with exception : " + e); 672afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 673afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } finally { 674b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu cleanUpInstall(ip); 675afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 676afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 677afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 678edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 679afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void testReplaceFailNormalInternal() { 680ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu sampleReplaceFromRawResource(0); 681afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 682afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 683edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 684afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void testReplaceFailFwdLockedInternal() { 685ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu sampleReplaceFromRawResource(PackageManager.INSTALL_FORWARD_LOCK); 686afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 687afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 688edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 689afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu public void testReplaceFailSdcard() { 690ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu sampleReplaceFromRawResource(PackageManager.INSTALL_EXTERNAL); 691afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 692afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu 693edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 694b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testReplaceNormalInternal() { 695ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING); 696afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 697b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 698edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 699b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testReplaceFwdLockedInternal() { 700ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING | 701b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu PackageManager.INSTALL_FORWARD_LOCK); 702b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 703b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 704edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 705b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testReplaceSdcard() { 706ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING | 7075b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu PackageManager.INSTALL_EXTERNAL); 708b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 709b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 710b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu /* -------------- Delete tests ---*/ 711b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu class DeleteObserver extends IPackageDeleteObserver.Stub { 712b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 713b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public boolean succeeded; 714b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu private boolean doneFlag = false; 715b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 716b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public boolean isDone() { 717b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return doneFlag; 718b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 719b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 720b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void packageDeleted(boolean succeeded) throws RemoteException { 721b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu synchronized(this) { 722b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu this.succeeded = succeeded; 723b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu doneFlag = true; 724b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu notifyAll(); 725b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 726b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 727b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 728b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 729b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu class DeleteReceiver extends GenericReceiver { 730b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String pkgName; 731b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 732b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu DeleteReceiver(String pkgName) { 733b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu this.pkgName = pkgName; 734b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED); 735b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu filter.addDataScheme("package"); 736b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu super.setFilter(filter); 737b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 738b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 739b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public boolean notifyNow(Intent intent) { 740b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String action = intent.getAction(); 741b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!Intent.ACTION_PACKAGE_REMOVED.equals(action)) { 742b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 743b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 744b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Uri data = intent.getData(); 745b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String installedPkg = data.getEncodedSchemeSpecificPart(); 746b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (pkgName.equals(installedPkg)) { 747b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 748b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 749b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 750b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 751b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 752b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 753315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu public boolean invokeDeletePackage(final String pkgName, int flags, 754315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu GenericReceiver receiver) throws Exception { 755b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu DeleteObserver observer = new DeleteObserver(); 756b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu final boolean received = false; 757b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu mContext.registerReceiver(receiver, receiver.filter); 758b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 759b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Wait on observer 760b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu synchronized(observer) { 761b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu synchronized (receiver) { 762b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu getPm().deletePackage(pkgName, observer, flags); 763b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu long waitTime = 0; 764b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 765b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu observer.wait(WAIT_TIME_INCR); 766b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu waitTime += WAIT_TIME_INCR; 767b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 768b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if(!observer.isDone()) { 769b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu throw new Exception("Timed out waiting for packageInstalled callback"); 770b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 771b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Verify we received the broadcast 772b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu waitTime = 0; 773b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 774b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu receiver.wait(WAIT_TIME_INCR); 775b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu waitTime += WAIT_TIME_INCR; 776b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 777b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if(!receiver.isDone()) { 778c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu throw new Exception("Timed out waiting for PACKAGE_REMOVED notification"); 779b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 780b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return receiver.received; 781b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 782b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 783b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } finally { 784b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu mContext.unregisterReceiver(receiver); 785b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 786b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 787b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 788b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void deleteFromRawResource(int iFlags, int dFlags) { 7895b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu InstallParams ip = sampleInstallFromRawResource(iFlags, false); 790b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean retainData = ((dFlags & PackageManager.DONT_DELETE_DATA) != 0); 791b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu GenericReceiver receiver = new DeleteReceiver(ip.pkg.packageName); 792b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu DeleteObserver observer = new DeleteObserver(); 793b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 794315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu assertTrue(invokeDeletePackage(ip.pkg.packageName, dFlags, receiver)); 795b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu ApplicationInfo info = null; 796b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.i(TAG, "okay4"); 797b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 798b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu info = getPm().getApplicationInfo(ip.pkg.packageName, 799b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 800b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (NameNotFoundException e) { 801b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu info = null; 802b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 803b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (retainData) { 804b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertNotNull(info); 805b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertEquals(info.packageName, ip.pkg.packageName); 806b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu File file = new File(info.dataDir); 807b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertTrue(file.exists()); 808b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else { 809b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertNull(info); 810b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 811b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (Exception e) { 812b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu failStr(e); 813b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } finally { 814b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu cleanUpInstall(ip); 815b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 816b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 817b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 818edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 819b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testDeleteNormalInternal() { 820b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu deleteFromRawResource(0, 0); 821b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 822b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 823edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 824b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testDeleteFwdLockedInternal() { 825b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, 0); 826b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 827b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 828edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 829b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testDeleteSdcard() { 8305b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu deleteFromRawResource(PackageManager.INSTALL_EXTERNAL, 0); 831b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 832b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 833edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 834b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testDeleteNormalInternalRetainData() { 835b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu deleteFromRawResource(0, PackageManager.DONT_DELETE_DATA); 836b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 837b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 838edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 839b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testDeleteFwdLockedInternalRetainData() { 840b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, PackageManager.DONT_DELETE_DATA); 841b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 842b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 843edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 844b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public void testDeleteSdcardRetainData() { 8455b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu deleteFromRawResource(PackageManager.INSTALL_EXTERNAL, PackageManager.DONT_DELETE_DATA); 846afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu } 847b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 848b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu /* sdcard mount/unmount tests ******/ 849b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 850b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu class SdMountReceiver extends GenericReceiver { 851b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String pkgNames[]; 852b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean status = true; 853b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 854b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu SdMountReceiver(String[] pkgNames) { 855b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu this.pkgNames = pkgNames; 856b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IntentFilter filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); 857b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu super.setFilter(filter); 858b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 859b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 860b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public boolean notifyNow(Intent intent) { 861b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.i(TAG, "okay 1"); 862b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String action = intent.getAction(); 863b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) { 864b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 865b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 866b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String rpkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); 867b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu for (String pkg : pkgNames) { 868b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean found = false; 869b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu for (String rpkg : rpkgList) { 870b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (rpkg.equals(pkg)) { 871b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu found = true; 872b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu break; 873b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 874b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 875b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!found) { 876b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu status = false; 877b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 878b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 879b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 880b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 881b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 882b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 883b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 884b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu class SdUnMountReceiver extends GenericReceiver { 885b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String pkgNames[]; 886b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean status = true; 887b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 888b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu SdUnMountReceiver(String[] pkgNames) { 889b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu this.pkgNames = pkgNames; 890b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IntentFilter filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); 891b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu super.setFilter(filter); 892b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 893b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 894b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu public boolean notifyNow(Intent intent) { 895b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String action = intent.getAction(); 896b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { 897b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 898b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 899b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String rpkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); 900b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu for (String pkg : pkgNames) { 901b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean found = false; 902b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu for (String rpkg : rpkgList) { 903b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (rpkg.equals(pkg)) { 904b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu found = true; 905b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu break; 906b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 907b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 908b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (!found) { 909b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu status = false; 910b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 911b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 912b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 913b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 914b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 915b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 916b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 917b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IMountService getMs() { 918b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu IBinder service = ServiceManager.getService("mount"); 919b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (service != null) { 920b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return IMountService.Stub.asInterface(service); 921b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else { 922b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.e(TAG, "Can't get mount service"); 923b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 924b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return null; 925b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 926b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 927b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean getMediaState() { 928b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 929315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu String mPath = Environment.getExternalStorageDirectory().getPath(); 930b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String state = getMs().getVolumeState(mPath); 931b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return Environment.MEDIA_MOUNTED.equals(state); 932b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (RemoteException e) { 933b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 934b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 935b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 936b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 937b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean mountMedia() { 938b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (getMediaState()) { 939b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return true; 940b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 941b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 942b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu String mPath = Environment.getExternalStorageDirectory().toString(); 943b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu int ret = getMs().mountVolume(mPath); 944b104340496e3a531e26c8f428c808eca0e039f50San Mehat return ret == StorageResultCode.OperationSucceeded; 945b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (RemoteException e) { 946b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 947b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 948b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 949b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 950b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu private boolean unmountMedia() { 951315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu String path = Environment.getExternalStorageDirectory().getPath(); 952315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu try { 953315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu String state = getMs().getVolumeState(path); 954315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu if (Environment.MEDIA_UNMOUNTED.equals(state)) { 955315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu return true; 956315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } 957315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu } catch (RemoteException e) { 958315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu failStr(e); 959b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 960edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 961cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu StorageListener observer = new StorageListener(); 962cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu StorageManager sm = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE); 963cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu sm.registerListener(observer); 964b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 965cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu // Wait on observer 966cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu synchronized(observer) { 9678a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu getMs().unmountVolume(path, true); 968cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu long waitTime = 0; 969cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 970cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu observer.wait(WAIT_TIME_INCR); 971cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu waitTime += WAIT_TIME_INCR; 972cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 973cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu if(!observer.isDone()) { 974315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu throw new Exception("Timed out waiting for unmount media notification"); 975cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 976cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu return true; 977cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 978cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } catch (Exception e) { 979315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu Log.e(TAG, "Exception : " + e); 980cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu return false; 981cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } finally { 982cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu sm.unregisterListener(observer); 983b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 984b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 985b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 986b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu private boolean mountFromRawResource() { 987b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Install pkg on sdcard 988cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu InstallParams ip = sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, false); 989b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Installed pkg on sdcard"); 990b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu boolean origState = getMediaState(); 991cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu boolean registeredReceiver = false; 992b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu SdMountReceiver receiver = new SdMountReceiver(new String[]{ip.pkg.packageName}); 993b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu try { 994b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Unmounting media"); 995b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Unmount media 996b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertTrue(unmountMedia()); 997b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Unmounted media"); 998b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Register receiver here 999b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu PackageManager pm = getPm(); 1000b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu mContext.registerReceiver(receiver, receiver.filter); 1001cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu registeredReceiver = true; 1002b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1003b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Wait on receiver 1004b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu synchronized (receiver) { 1005b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Mounting media"); 1006b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Mount media again 1007b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu assertTrue(mountMedia()); 1008b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Mounted media"); 1009b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Waiting for notification"); 1010b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu long waitTime = 0; 1011b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Verify we received the broadcast 1012b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu waitTime = 0; 1013b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 1014b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu receiver.wait(WAIT_TIME_INCR); 1015b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu waitTime += WAIT_TIME_INCR; 1016b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1017b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if(!receiver.isDone()) { 1018b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu failStr("Timed out waiting for EXTERNAL_APPLICATIONS notification"); 1019b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1020b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return receiver.received; 1021b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1022b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } catch (InterruptedException e) { 1023b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu failStr(e); 1024b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return false; 1025b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } finally { 1026cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu if (registeredReceiver) mContext.unregisterReceiver(receiver); 1027b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu // Restore original media state 1028b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (origState) { 1029b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu mountMedia(); 1030b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } else { 1031b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu unmountMedia(); 1032b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1033b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (localLOGV) Log.i(TAG, "Cleaning up install"); 1034b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu cleanUpInstall(ip); 1035b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1036b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1037b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu 1038cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu /* 1039cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu * Install package on sdcard. Unmount and then mount the media. 1040cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu * (Use PackageManagerService private api for now) 1041cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu * Make sure the installed package is available. 1042cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu */ 1043fb7bacf6ba9504f3a863dc954b6147985fc74778Suchi Amalapurapu @MediumTest 1044fb7bacf6ba9504f3a863dc954b6147985fc74778Suchi Amalapurapu public void testMountSdNormalInternal() { 1045cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu assertTrue(mountFromRawResource()); 1046cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu } 1047cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu 1048b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu void cleanUpInstall(InstallParams ip) { 1049b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (ip == null) { 1050b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu return; 1051b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1052b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Runtime.getRuntime().gc(); 1053b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu Log.i(TAG, "Deleting package : " + ip.pkg.packageName); 1054b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu getPm().deletePackage(ip.pkg.packageName, null, 0); 1055315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu File outFile = new File(ip.pkg.mScanPath); 1056b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu if (outFile != null && outFile.exists()) { 1057b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu outFile.delete(); 1058b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1059b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu } 1060ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu void cleanUpInstall(String pkgName) { 1061ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (pkgName == null) { 1062ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu return; 1063ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 1064ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu Log.i(TAG, "Deleting package : " + pkgName); 1065ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu try { 1066ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu ApplicationInfo info = getPm().getApplicationInfo(pkgName, 1067ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageManager.GET_UNINSTALLED_PACKAGES); 1068ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (info != null) { 1069ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu getPm().deletePackage(pkgName, null, 0); 1070ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 1071ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } catch (NameNotFoundException e) {} 1072ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 1073117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 1074edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 10755b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu public void testManifestInstallLocationInternal() { 10765b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_internal, 1077cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu 0, true, false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 1078117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 1079117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 1080edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 10815b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu public void testManifestInstallLocationSdcard() { 10825b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_sdcard, 1083cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu 0, true, false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 1084117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 1085117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 1086edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 10875b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu public void testManifestInstallLocationAuto() { 10885b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_auto, 1089cf6eaeaae9e6745dd6e07540812c79821d7043c2Suchi Amalapurapu 0, true, false, -1, PackageInfo.INSTALL_LOCATION_AUTO); 1090117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 1091117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 1092edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 10935b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu public void testManifestInstallLocationUnspecified() { 10945b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_unspecified, 109590d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu 0, true, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 1096117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 1097117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 1098edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 1099a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public void testManifestInstallLocationFwdLockedFlagSdcard() { 1100a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_unspecified, 1101a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu PackageManager.INSTALL_FORWARD_LOCK | 1102a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu PackageManager.INSTALL_EXTERNAL, true, true, 1103a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION, 110490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 1105a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1106a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 1107edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 11085b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu public void testManifestInstallLocationFwdLockedSdcard() { 11095b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_sdcard, 11109b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu PackageManager.INSTALL_FORWARD_LOCK, true, false, 11119b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu -1, 1112a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 1113a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1114a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 11158a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu /* 11168a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * Install a package on internal flash via PackageManager install flag. Replace 11178a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * the package via flag to install on sdcard. Make sure the new flag overrides 11188a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * the old install location. 11198a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu */ 1120edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 11218a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu public void testReplaceFlagInternalSdcard() { 11228a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu int iFlags = 0; 11238a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu int rFlags = PackageManager.INSTALL_EXTERNAL; 1124a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu InstallParams ip = sampleInstallFromRawResource(iFlags, false); 1125a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName); 1126a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING; 1127a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu try { 1128315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu assertEquals(invokeInstallPackage(ip.packageURI, replaceFlags, receiver), true); 11298a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu assertInstall(ip.pkg, rFlags, ip.pkg.installLocation); 1130a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } catch (Exception e) { 1131a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu failStr("Failed with exception : " + e); 1132a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } finally { 1133a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu cleanUpInstall(ip); 1134a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1135a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1136a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 11378a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu /* 11388a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * Install a package on sdcard via PackageManager install flag. Replace 11398a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * the package with no flags or manifest option and make sure the old 11408a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * install location is retained. 11418a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu */ 1142edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 1143a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public void testReplaceFlagSdcardInternal() { 11448a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu int iFlags = PackageManager.INSTALL_EXTERNAL; 11458a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu int rFlags = 0; 11468a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu InstallParams ip = sampleInstallFromRawResource(iFlags, false); 11478a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName); 11488a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING; 11498a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu try { 1150315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu assertEquals(invokeInstallPackage(ip.packageURI, replaceFlags, receiver), true); 11518a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu assertInstall(ip.pkg, iFlags, ip.pkg.installLocation); 11528a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } catch (Exception e) { 11538a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu failStr("Failed with exception : " + e); 11548a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } finally { 11558a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu cleanUpInstall(ip); 11568a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 1157a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1158a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 1159edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 1160a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public void testManifestInstallLocationReplaceInternalSdcard() { 1161a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int iFlags = 0; 116290d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int iApk = R.raw.install_loc_internal; 1163a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int rFlags = 0; 1164a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int rApk = R.raw.install_loc_sdcard; 1165a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu InstallParams ip = installFromRawResource("install.apk", iApk, 1166a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu iFlags, false, 116790d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 1168a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName); 1169a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING; 1170a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu try { 1171a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu InstallParams rp = installFromRawResource("install.apk", rApk, 11728a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu replaceFlags, false, 1173a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 1174a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu assertInstall(rp.pkg, replaceFlags, rp.pkg.installLocation); 1175a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } catch (Exception e) { 1176a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu failStr("Failed with exception : " + e); 1177a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } finally { 1178a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu cleanUpInstall(ip); 1179a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1180a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1181a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 1182edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 1183a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public void testManifestInstallLocationReplaceSdcardInternal() { 1184a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int iFlags = 0; 1185a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int iApk = R.raw.install_loc_sdcard; 1186a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int rFlags = 0; 1187a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int rApk = R.raw.install_loc_unspecified; 1188a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu InstallParams ip = installFromRawResource("install.apk", iApk, 1189a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu iFlags, false, 1190a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 1191a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING; 1192a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu try { 1193a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu InstallParams rp = installFromRawResource("install.apk", rApk, 11948a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu replaceFlags, false, 1195a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 1196a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu assertInstall(rp.pkg, replaceFlags, ip.pkg.installLocation); 1197a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } catch (Exception e) { 1198a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu failStr("Failed with exception : " + e); 1199a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } finally { 1200a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu cleanUpInstall(ip); 1201a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 1202117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu } 12038946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 12048946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu class MoveReceiver extends GenericReceiver { 12058946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu String pkgName; 12068946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu final static int INVALID = -1; 12078946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu final static int REMOVED = 1; 12088946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu final static int ADDED = 2; 12098946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu int removed = INVALID; 12108946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 12118946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu MoveReceiver(String pkgName) { 12128946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu this.pkgName = pkgName; 12138946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE); 12148946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE); 12158946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu super.setFilter(filter); 12168946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12178946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 12188946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu public boolean notifyNow(Intent intent) { 12198946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu String action = intent.getAction(); 12208946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu Log.i(TAG, "MoveReceiver::" + action); 12218946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { 12228946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu String[] list = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); 12238946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if (list != null) { 12248946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu for (String pkg : list) { 12258946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if (pkg.equals(pkgName)) { 12268946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu removed = REMOVED; 12278946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu break; 12288946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12298946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12308946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12318946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu removed = REMOVED; 12328946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) { 12338946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if (removed != REMOVED) { 12348946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu return false; 12358946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12368946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu String[] list = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); 12378946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if (list != null) { 12388946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu for (String pkg : list) { 12398946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if (pkg.equals(pkgName)) { 12408946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu removed = ADDED; 12418946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu return true; 12428946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12438946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12448946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12458946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12468946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu return false; 12478946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12488946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12498946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 12508946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu private class PackageMoveObserver extends IPackageMoveObserver.Stub { 12518946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu public int returnCode; 12528946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu private boolean doneFlag = false; 125330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu public String packageName; 125430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu public PackageMoveObserver(String pkgName) { 125530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu packageName = pkgName; 125630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 12578946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu public void packageMoved(String packageName, int returnCode) { 125830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu Log.i("DEBUG_MOVE::", "pkg = " + packageName + ", " + "ret = " + returnCode); 125930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu if (!packageName.equals(this.packageName)) { 126030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu return; 126130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 12628946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu synchronized(this) { 12638946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu this.returnCode = returnCode; 12648946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu doneFlag = true; 12658946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu notifyAll(); 12668946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12678946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12688946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 12698946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu public boolean isDone() { 12708946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu return doneFlag; 12718946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12728946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12738946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 12748946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu public boolean invokeMovePackage(String pkgName, int flags, 12758946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu GenericReceiver receiver) throws Exception { 127630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu PackageMoveObserver observer = new PackageMoveObserver(pkgName); 12778946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu final boolean received = false; 12788946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu mContext.registerReceiver(receiver, receiver.filter); 12798946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu try { 12808946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu // Wait on observer 12818946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu synchronized(observer) { 12828946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu synchronized (receiver) { 12838946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu getPm().movePackage(pkgName, observer, flags); 12848946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu long waitTime = 0; 12858946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 12868946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu observer.wait(WAIT_TIME_INCR); 12878946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu waitTime += WAIT_TIME_INCR; 12888946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12898946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if(!observer.isDone()) { 12908946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu throw new Exception("Timed out waiting for pkgmove callback"); 12918946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12928946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if (observer.returnCode != PackageManager.MOVE_SUCCEEDED) { 12938946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu return false; 12948946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 12958946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu // Verify we received the broadcast 12968946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu waitTime = 0; 12978946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 12988946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu receiver.wait(WAIT_TIME_INCR); 12998946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu waitTime += WAIT_TIME_INCR; 13008946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 13018946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if(!receiver.isDone()) { 13028946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu throw new Exception("Timed out waiting for MOVE notifications"); 13038946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 13048946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu return receiver.received; 13058946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 13068946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 13078946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } finally { 13088946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu mContext.unregisterReceiver(receiver); 13098946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 13108946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 131130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu private boolean invokeMovePackageFail(String pkgName, int flags, int errCode) throws Exception { 131230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu PackageMoveObserver observer = new PackageMoveObserver(pkgName); 131330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu try { 131430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu // Wait on observer 131530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu synchronized(observer) { 131630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu getPm().movePackage(pkgName, observer, flags); 131730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu long waitTime = 0; 131830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) { 131930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu observer.wait(WAIT_TIME_INCR); 132030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu waitTime += WAIT_TIME_INCR; 132130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 132230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu if(!observer.isDone()) { 132330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu throw new Exception("Timed out waiting for pkgmove callback"); 132430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 132530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu assertEquals(errCode, observer.returnCode); 132630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 132730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } finally { 132830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 132930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu return true; 133030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 13318946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 1332315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu private int getDefaultInstallLoc() { 13339b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu int origDefaultLoc = PackageInfo.INSTALL_LOCATION_AUTO; 13349b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu try { 133540e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu origDefaultLoc = Settings.System.getInt(mContext.getContentResolver(), Settings.Secure.DEFAULT_INSTALL_LOCATION); 13369b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu } catch (SettingNotFoundException e1) { 13379b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu } 13389b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu return origDefaultLoc; 13399b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu } 13409b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu 13419b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu private void setInstallLoc(int loc) { 13429b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu Settings.System.putInt(mContext.getContentResolver(), 134340e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu Settings.Secure.DEFAULT_INSTALL_LOCATION, loc); 13449b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu } 13458946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu /* 134630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu * Tests for moving apps between internal and external storage 134730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu */ 134830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu /* 13498946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu * Utility function that reads a apk bundled as a raw resource 13508946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu * copies it into own data directory and invokes 13518946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu * PackageManager api to install first and then replace it 13528946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu * again. 13538946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu */ 1354edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 135530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu private void moveFromRawResource(String outFileName, 135630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int rawResId, int installFlags, int moveFlags, boolean cleanUp, 135730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu boolean fail, int result) { 1358315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu int origDefaultLoc = getDefaultInstallLoc(); 135930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu InstallParams ip = null; 13608946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu try { 136130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu setInstallLoc(PackageHelper.APP_INSTALL_AUTO); 136230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu // Install first 136330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu ip = installFromRawResource("install.apk", rawResId, installFlags, false, 136430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 136530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu ApplicationInfo oldAppInfo = getPm().getApplicationInfo(ip.pkg.packageName, 0); 136630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu if (fail) { 136730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu assertTrue(invokeMovePackageFail(ip.pkg.packageName, moveFlags, result)); 136830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu ApplicationInfo info = getPm().getApplicationInfo(ip.pkg.packageName, 0); 136930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu assertNotNull(info); 137030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu assertEquals(oldAppInfo.flags, info.flags); 137130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } else { 137230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu // Create receiver based on expRetCode 137330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu MoveReceiver receiver = new MoveReceiver(ip.pkg.packageName); 137430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu boolean retCode = invokeMovePackage(ip.pkg.packageName, moveFlags, 137530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu receiver); 13768946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu assertTrue(retCode); 13778946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu ApplicationInfo info = getPm().getApplicationInfo(ip.pkg.packageName, 0); 13788946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu assertNotNull(info); 13798946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu if ((moveFlags & PackageManager.MOVE_INTERNAL) != 0) { 13806069beb2dfed6da837bf7faa3db3f6119edc017aSuchi Amalapurapu assertTrue((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == 0); 13818946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } else if ((moveFlags & PackageManager.MOVE_EXTERNAL_MEDIA) != 0){ 13826069beb2dfed6da837bf7faa3db3f6119edc017aSuchi Amalapurapu assertTrue((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0); 13838946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 13848946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 138530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } catch (NameNotFoundException e) { 138630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu failStr("Pkg hasnt been installed correctly"); 13878946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } catch (Exception e) { 13888946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu failStr("Failed with exception : " + e); 13898946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } finally { 139030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu if (ip != null) { 139130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu cleanUpInstall(ip); 139230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 13939b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu // Restore default install location 13949b10ef5fe85e9d29721ff0cd15161f960d38a8dbSuchi Amalapurapu setInstallLoc(origDefaultLoc); 13958946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 13968946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 139730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu private void sampleMoveFromRawResource(int installFlags, int moveFlags, boolean fail, 139830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int result) { 139930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu moveFromRawResource("install.apk", 140030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu R.raw.install, installFlags, moveFlags, true, 140130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu fail, result); 140230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 14038946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 1404edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 14058946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu public void testMoveAppInternalToExternal() { 140630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int installFlags = PackageManager.INSTALL_INTERNAL; 140730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA; 140830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu boolean fail = false; 140930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int result = PackageManager.MOVE_SUCCEEDED; 141030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu sampleMoveFromRawResource(installFlags, moveFlags, fail, result); 14118946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 14128946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 1413edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 14148946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu public void testMoveAppInternalToInternal() { 141530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int installFlags = PackageManager.INSTALL_INTERNAL; 141630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int moveFlags = PackageManager.MOVE_INTERNAL; 141730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu boolean fail = true; 141830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int result = PackageManager.MOVE_FAILED_INVALID_LOCATION; 141930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu sampleMoveFromRawResource(installFlags, moveFlags, fail, result); 14208946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 14218946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu 1422edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 14238946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu public void testMoveAppExternalToExternal() { 142430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int installFlags = PackageManager.INSTALL_EXTERNAL; 142530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA; 142630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu boolean fail = true; 142730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int result = PackageManager.MOVE_FAILED_INVALID_LOCATION; 142830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu sampleMoveFromRawResource(installFlags, moveFlags, fail, result); 14298946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 1430edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 14318946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu public void testMoveAppExternalToInternal() { 143230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int installFlags = PackageManager.INSTALL_EXTERNAL; 143330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int moveFlags = PackageManager.MOVE_INTERNAL; 143430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu boolean fail = false; 143530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int result = PackageManager.MOVE_SUCCEEDED; 143630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu sampleMoveFromRawResource(installFlags, moveFlags, fail, result); 143730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 1438edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 143930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu public void testMoveAppForwardLocked() { 144030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int installFlags = PackageManager.INSTALL_FORWARD_LOCK; 144130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA; 144230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu boolean fail = true; 144330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int result = PackageManager.MOVE_FAILED_FORWARD_LOCKED; 144430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu sampleMoveFromRawResource(installFlags, moveFlags, fail, result); 144530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 14469a212adcffbc4b32d51f512889b33ba584647aa9Suchi Amalapurapu @MediumTest 144730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu public void testMoveAppFailInternalToExternalDelete() { 144830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int installFlags = 0; 144930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA; 145030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu boolean fail = true; 145130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu final int result = PackageManager.MOVE_FAILED_DOESNT_EXIST; 1452edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 145330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu int rawResId = R.raw.install; 1454315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu int origDefaultLoc = getDefaultInstallLoc(); 145530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu InstallParams ip = null; 145630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu try { 145730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu PackageManager pm = getPm(); 145830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu setInstallLoc(PackageHelper.APP_INSTALL_AUTO); 145930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu // Install first 146030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu ip = installFromRawResource("install.apk", R.raw.install, installFlags, false, 146130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 146230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu // Delete the package now retaining data. 14639a212adcffbc4b32d51f512889b33ba584647aa9Suchi Amalapurapu GenericReceiver receiver = new DeleteReceiver(ip.pkg.packageName); 14649a212adcffbc4b32d51f512889b33ba584647aa9Suchi Amalapurapu invokeDeletePackage(ip.pkg.packageName, PackageManager.DONT_DELETE_DATA, receiver); 146530f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu assertTrue(invokeMovePackageFail(ip.pkg.packageName, moveFlags, result)); 146630f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } catch (Exception e) { 146730f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu failStr(e); 146830f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } finally { 146930f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu if (ip != null) { 147030f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu cleanUpInstall(ip); 147130f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 147230f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu // Restore default install location 147330f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu setInstallLoc(origDefaultLoc); 147430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu } 14758946dd3355fc1dcbad872c0546e356474d4cc5deSuchi Amalapurapu } 14768a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu /* 14778a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * Test that an install error code is returned when media is unmounted 14788a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu * and package installed on sdcard via package manager flag. 14798a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu */ 1480edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 14818a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu public void testInstallSdcardUnmount() { 14828a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu boolean origState = getMediaState(); 14838a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu try { 14848a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu // Unmount sdcard 14858a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu assertTrue(unmountMedia()); 14868a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu // Try to install and make sure an error code is returned. 1487315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 14888a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu PackageManager.INSTALL_EXTERNAL, false, 148914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE, 1490315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_AUTO); 14918a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } finally { 14928a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu // Restore original media state 14938a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu if (origState) { 14948a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu mountMedia(); 14958a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } else { 14968a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu unmountMedia(); 14978a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 14988a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 14998a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 15008a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu 15018a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu /* 1502edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen * Unmount sdcard. Try installing an app with manifest option to install 1503edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen * on sdcard. Make sure it gets installed on internal flash. 1504edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen */ 1505edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 1506edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen public void testInstallManifestSdcardUnmount() { 15078a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu boolean origState = getMediaState(); 15088a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu try { 15098a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu // Unmount sdcard 15108a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu assertTrue(unmountMedia()); 1511315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu InstallParams ip = new InstallParams("install.apk", R.raw.install_loc_sdcard); 1512315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu installFromRawResource(ip, 0, true, false, -1, 1513315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 15148a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } finally { 15158a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu // Restore original media state 15168a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu if (origState) { 15178a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu mountMedia(); 15188a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } else { 15198a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu unmountMedia(); 15208a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 15218a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 15228a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu } 15238a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu 15248a9ab24a5c9b595ac0268fcade4b5bbfe7c45c2dSuchi Amalapurapu /*---------- Recommended install location tests ----*/ 152514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* Precedence: FlagManifestExistingUser 152614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * PrecedenceSuffixes: 152714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Flag : FlagI, FlagE, FlagF 152814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * I - internal, E - external, F - forward locked, Flag suffix absent if not using any option. 152914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Manifest: ManifestI, ManifestE, ManifestA, Manifest suffix absent if not using any option. 153014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Existing: Existing suffix absent if not existing. 1531edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen * User: UserI, UserE, UserA, User suffix absent if not existing. 1532edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen * 153314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 153414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 153514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app on internal flash 153614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1537edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 153814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagI() { 153914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu sampleInstallFromRawResource(PackageManager.INSTALL_INTERNAL, true); 154014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 154114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 154214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app on sdcard. 154314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1544edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 154514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagE() { 154614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, true); 154714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 154814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu 154914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 155014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app on sdcard. 155114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1552edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 155314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagF() { 155414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true); 155514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 155614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 155714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app with both internal and external flags set. should fail 155814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1559edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 156014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagIE() { 156114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 156214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_INTERNAL, 156314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 156414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION, 156514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_AUTO); 156614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 156714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu 156814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 156914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app with both internal and external flags set. should fail 157014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1571edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 157214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagIF() { 157314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK | 157414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageManager.INSTALL_INTERNAL, true); 157514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 157614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 157714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app with both internal and external flags set. should fail 157814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1579edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 158014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagEF() { 158114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 158214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_EXTERNAL, 158314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 158414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION, 158514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_AUTO); 158614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 158714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 158814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app with both internal and external flags set. should fail 158914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1590edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 159114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagIEF() { 159214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 159314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_INTERNAL | 159414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageManager.INSTALL_EXTERNAL, 159514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 159614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION, 159714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_AUTO); 159814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 159914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 160014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app with both internal and manifest option set. 160114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * should install on internal. 160214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1603edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 160414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagIManifestI() { 160514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_internal, 160614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageManager.INSTALL_INTERNAL, 160714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 160814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 160914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 161014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 161114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 161214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app with both internal and manifest preference for 161314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * preferExternal. Should install on internal. 161414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1615edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 161614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagIManifestE() { 161714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_sdcard, 161814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageManager.INSTALL_INTERNAL, 161914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 162014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 162114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 162214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 162314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 162414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app with both internal and manifest preference for 162514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * auto. should install internal. 162614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1627edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 162814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagIManifestA() { 162914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_auto, 163014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageManager.INSTALL_INTERNAL, 163114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 163214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 163314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 163414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 163514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 163614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app with both external and manifest option set. 163714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * should install externally. 163814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1639edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 164014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagEManifestI() { 164114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_internal, 164214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageManager.INSTALL_EXTERNAL, 164314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 164414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 164514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 164614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 164714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 164814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app with both external and manifest preference for 164914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * preferExternal. Should install externally. 165014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1651edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 165214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagEManifestE() { 165314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_sdcard, 165414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageManager.INSTALL_EXTERNAL, 165514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 165614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 165714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 165814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 165914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 166014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app with both external and manifest preference for 166114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * auto. should install on external media. 166214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1663edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 166414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagEManifestA() { 166514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_auto, 166614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageManager.INSTALL_EXTERNAL, 166714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 166814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 166914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 167014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 167114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 167214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app with fwd locked flag set and install location set to 167314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * internal. should install internally. 167414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1675edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 167614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagFManifestI() { 167714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_internal, 167814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageManager.INSTALL_EXTERNAL, 167914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 168014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 168114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 168214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 168314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 168414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app with fwd locked flag set and install location set to 168514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * preferExternal. should install internally. 168614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1687edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 168814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagFManifestE() { 168914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_sdcard, 169014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageManager.INSTALL_EXTERNAL, 169114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 169214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 169314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 169414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 169514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 169614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * Install an app with fwd locked flag set and install location set to 169714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * auto. should install internally. 169814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1699edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 170014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagFManifestA() { 170114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_auto, 170214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageManager.INSTALL_EXTERNAL, 170314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 170414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 170514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 170614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 170714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* The following test functions verify install location for existing apps. 170814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * ie existing app can be installed internally or externally. If install 170914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * flag is explicitly set it should override current location. If manifest location 171014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * is set, that should over ride current location too. if not the existing install 171114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * location should be honoured. 1712edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen * testFlagI/E/F/ExistingI/E - 171314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1714edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 171514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagIExistingI() { 171614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_INTERNAL; 171714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int rFlags = PackageManager.INSTALL_INTERNAL | PackageManager.INSTALL_REPLACE_EXISTING; 171814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // First install. 171914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 172014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iFlags, 172114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 172214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 172314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 172414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Replace now 172514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 172614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu rFlags, 172714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 172814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 172914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 173014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 1731edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 173214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagIExistingE() { 173314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_EXTERNAL; 173414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int rFlags = PackageManager.INSTALL_INTERNAL | PackageManager.INSTALL_REPLACE_EXISTING; 173514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // First install. 173614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 173714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iFlags, 173814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 173914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 174014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 174114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Replace now 174214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 174314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu rFlags, 174414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 174514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 174614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 174714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 1748edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 174914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagEExistingI() { 175014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_INTERNAL; 175114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int rFlags = PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_REPLACE_EXISTING; 175214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // First install. 175314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 175414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iFlags, 175514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 175614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 175714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 175814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Replace now 175914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 176014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu rFlags, 176114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 176214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 176314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 176414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 1765edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 176614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagEExistingE() { 176714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_EXTERNAL; 176814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int rFlags = PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_REPLACE_EXISTING; 176914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // First install. 177014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 177114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iFlags, 177214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 177314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 177414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 177514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Replace now 177614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 177714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu rFlags, 177814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 177914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 178014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 178114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 1782edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 178314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagFExistingI() { 178414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_INTERNAL; 178514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int rFlags = PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_REPLACE_EXISTING; 178614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // First install. 178714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 178814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iFlags, 178914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 179014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 179114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 179214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Replace now 179314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 179414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu rFlags, 179514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 179614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 179714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 179814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 1799edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 180014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testFlagFExistingE() { 180114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_EXTERNAL; 180214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int rFlags = PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_REPLACE_EXISTING; 180314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // First install. 180414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 180514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iFlags, 180614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 180714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 180814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 180914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Replace now 181014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 181114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu rFlags, 181214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 181314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 181414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 181514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 181614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 181714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * The following set of tests verify the installation of apps with 181814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * install location attribute set to internalOnly, preferExternal and auto. 181914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * The manifest option should dictate the install location. 182014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * public void testManifestI/E/A 182114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * TODO out of memory fall back behaviour. 182214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1823edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 182414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testManifestI() { 182514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_internal, 182614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu 0, 182714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 182814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 182914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 183014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 1831edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 183214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testManifestE() { 183314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_sdcard, 183414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu 0, 183514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 183614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 183714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 183814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 1839edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 184014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testManifestA() { 184114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_auto, 184214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu 0, 184314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 184414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 184514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 184614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 184714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 184814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * The following set of tests verify the installation of apps 184914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * with install location attribute set to internalOnly, preferExternal and auto 185014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * for already existing apps. The manifest option should take precedence. 185114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * TODO add out of memory fall back behaviour. 1852edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen * testManifestI/E/AExistingI/E 185314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 1854edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 185514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testManifestIExistingI() { 185614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_INTERNAL; 185714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 185814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // First install. 185914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 186014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iFlags, 186114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 186214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 186314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 186414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Replace now 186514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_internal, 186614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu rFlags, 186714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 186814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 186914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 187014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 1871edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 187214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testManifestIExistingE() { 187314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_EXTERNAL; 187414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 187514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // First install. 187614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 187714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iFlags, 187814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 187914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 188014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 188114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Replace now 188214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_internal, 188314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu rFlags, 188414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 188514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 188614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 188714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 1888edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 188914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testManifestEExistingI() { 189014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_INTERNAL; 189114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 189214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // First install. 189314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 189414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iFlags, 189514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 189614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 189714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 189814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Replace now 189914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_sdcard, 190014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu rFlags, 190114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 190214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 190314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 190414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 1905edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 190614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testManifestEExistingE() { 190714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_EXTERNAL; 190814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 190914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // First install. 191014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 191114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iFlags, 191214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 191314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 191414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 191514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Replace now 191614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_sdcard, 191714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu rFlags, 191814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 191914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 192014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 192114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 1922edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 192314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testManifestAExistingI() { 192414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_INTERNAL; 192514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 192614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // First install. 192714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 192814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iFlags, 192914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 193014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 193114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 193214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Replace now 193314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_auto, 193414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu rFlags, 193514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 193614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 193714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu PackageInfo.INSTALL_LOCATION_AUTO); 193814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 1939edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 194014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testManifestAExistingE() { 194114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_EXTERNAL; 194214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 194314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // First install. 194414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 194514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iFlags, 194614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 194714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 194814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu -1); 194914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Replace now 195014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install_loc_auto, 195114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu rFlags, 195214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 195314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 195430f775b12ac7d0ff39eef201f997fe54ac60465aSuchi Amalapurapu PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 195514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 195614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 195714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * The following set of tests check install location for existing 195814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * application based on user setting. 195914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 196090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu private int getExpectedInstallLocation(int userSetting) { 196190d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; 196290d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu boolean enable = getUserSettingSetInstallLocation(); 196390d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu if (enable) { 196490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu if (userSetting == PackageHelper.APP_INSTALL_AUTO) { 196590d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu iloc = PackageInfo.INSTALL_LOCATION_AUTO; 196690d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu } else if (userSetting == PackageHelper.APP_INSTALL_EXTERNAL) { 196790d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu iloc = PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL; 196890d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu } else if (userSetting == PackageHelper.APP_INSTALL_INTERNAL) { 196990d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu iloc = PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY; 197090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu } 197190d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu } 197290d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu return iloc; 197390d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu } 197490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu private void setExistingXUserX(int userSetting, int iFlags, int iloc) { 197514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 197614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // First install. 197714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 197814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iFlags, 197914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, 198014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 198190d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 1982315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu int origSetting = getDefaultInstallLoc(); 198314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu try { 198414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Set user setting 198514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu setInstallLoc(userSetting); 198614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Replace now 198714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 198814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu rFlags, 198914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 199014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 199114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iloc); 199214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } finally { 199314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu setInstallLoc(origSetting); 199414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 199514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 1996edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 199714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testExistingIUserI() { 199814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int userSetting = PackageHelper.APP_INSTALL_INTERNAL; 199914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_INTERNAL; 200090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 200114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 2002edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 200314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testExistingIUserE() { 200414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int userSetting = PackageHelper.APP_INSTALL_EXTERNAL; 200514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_INTERNAL; 200690d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 200714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 2008edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 200914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testExistingIUserA() { 201014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int userSetting = PackageHelper.APP_INSTALL_AUTO; 201114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_INTERNAL; 201290d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 201314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 2014edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 201514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testExistingEUserI() { 201614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int userSetting = PackageHelper.APP_INSTALL_INTERNAL; 201714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_EXTERNAL; 201890d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 201914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 2020edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 202114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testExistingEUserE() { 202214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int userSetting = PackageHelper.APP_INSTALL_EXTERNAL; 202314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_EXTERNAL; 202490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 202514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 2026edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 202714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testExistingEUserA() { 202814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int userSetting = PackageHelper.APP_INSTALL_AUTO; 202914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int iFlags = PackageManager.INSTALL_EXTERNAL; 203090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL); 203114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 203214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu /* 203314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * The following set of tests verify that the user setting defines 203414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu * the install location. 2035edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen * 203614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu */ 203790d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu private boolean getUserSettingSetInstallLocation() { 203890d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu try { 203940e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu return Settings.System.getInt(mContext.getContentResolver(), Settings.Secure.SET_INSTALL_LOCATION) != 0; 2040edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 204190d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu } catch (SettingNotFoundException e1) { 204214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 204390d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu return false; 204490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu } 204590d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu 204690d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu private void setUserSettingSetInstallLocation(boolean value) { 204790d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu Settings.System.putInt(mContext.getContentResolver(), 204840e472521a544f26cb6956995788f7c36fff1404Suchi Amalapurapu Settings.Secure.SET_INSTALL_LOCATION, value ? 1 : 0); 204990d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu } 205090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu private void setUserX(boolean enable, int userSetting, int iloc) { 205190d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu boolean origUserSetting = getUserSettingSetInstallLocation(); 2052315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu int origSetting = getDefaultInstallLoc(); 205314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu try { 205490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu setUserSettingSetInstallLocation(enable); 205514b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Set user setting 205614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu setInstallLoc(userSetting); 205714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu // Replace now 205814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu installFromRawResource("install.apk", R.raw.install, 205914b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu 0, 206014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu true, 206114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu false, -1, 206214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu iloc); 206314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } finally { 206490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu // Restore original setting 206590d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu setUserSettingSetInstallLocation(origUserSetting); 206614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu setInstallLoc(origSetting); 206714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 206814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 2069edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 207014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testUserI() { 207114b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int userSetting = PackageHelper.APP_INSTALL_INTERNAL; 207290d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int iloc = getExpectedInstallLocation(userSetting); 207390d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu setUserX(true, userSetting, iloc); 207414b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 2075edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 207614b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testUserE() { 207714b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int userSetting = PackageHelper.APP_INSTALL_EXTERNAL; 207890d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int iloc = getExpectedInstallLocation(userSetting); 207990d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu setUserX(true, userSetting, iloc); 208014b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 2081edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 208214b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu public void testUserA() { 208314b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu int userSetting = PackageHelper.APP_INSTALL_AUTO; 208490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int iloc = getExpectedInstallLocation(userSetting); 208590d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu setUserX(true, userSetting, iloc); 208690d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu } 208790d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu /* 208890d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu * The following set of tests turn on/off the basic 208990d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu * user setting for turning on install location. 209090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu */ 2091edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 209290d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu public void testUserPrefOffUserI() { 209390d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int userSetting = PackageHelper.APP_INSTALL_INTERNAL; 209490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; 209590d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu setUserX(false, userSetting, iloc); 209690d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu } 2097edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 209890d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu public void testUserPrefOffUserE() { 209990d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int userSetting = PackageHelper.APP_INSTALL_EXTERNAL; 210090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; 210190d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu setUserX(false, userSetting, iloc); 210290d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu } 2103edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 210490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu public void testUserPrefOffA() { 210590d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int userSetting = PackageHelper.APP_INSTALL_AUTO; 210690d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; 210790d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu setUserX(false, userSetting, iloc); 210814b6abda1309631d49d4bebbb0317a7e1dfc0a50Suchi Amalapurapu } 2109edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2110d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String BASE_PERMISSIONS_DEFINED[] = new String[] { 2111d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PERM_PACKAGE, "com.android.unit_tests.install_decl_perm", 2112d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PERM_DEFINED, 21130dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.NORMAL", 21140dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.DANGEROUS", 21150dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.SIGNATURE", 2116d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn }; 2117edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2118d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String BASE_PERMISSIONS_UNDEFINED[] = new String[] { 21190dc59e78e18493aecd37427531d093e800846c3eBrett Chabot PERM_PACKAGE, "com.android.frameworks.coretests.install_decl_perm", 2120d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PERM_UNDEFINED, 21210dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.NORMAL", 21220dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.DANGEROUS", 21230dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.SIGNATURE", 2124d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn }; 2125edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2126d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String BASE_PERMISSIONS_USED[] = new String[] { 21270dc59e78e18493aecd37427531d093e800846c3eBrett Chabot PERM_PACKAGE, "com.android.frameworks.coretests.install_use_perm_good", 2128d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PERM_USED, 21290dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.NORMAL", 21300dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.DANGEROUS", 21310dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.SIGNATURE", 2132d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn }; 2133edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2134d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String BASE_PERMISSIONS_NOTUSED[] = new String[] { 21350dc59e78e18493aecd37427531d093e800846c3eBrett Chabot PERM_PACKAGE, "com.android.frameworks.coretests.install_use_perm_good", 2136d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PERM_NOTUSED, 21370dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.NORMAL", 21380dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.DANGEROUS", 21390dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.SIGNATURE", 2140d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn }; 2141edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2142d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn static final String BASE_PERMISSIONS_SIGUSED[] = new String[] { 21430dc59e78e18493aecd37427531d093e800846c3eBrett Chabot PERM_PACKAGE, "com.android.frameworks.coretests.install_use_perm_good", 2144d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PERM_USED, 21450dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.SIGNATURE", 2146d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn PERM_NOTUSED, 21470dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.NORMAL", 21480dc59e78e18493aecd37427531d093e800846c3eBrett Chabot "com.android.frameworks.coretests.DANGEROUS", 2149d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn }; 2150edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2151d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn /* 2152d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn * Ensure that permissions are properly declared. 2153d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn */ 2154edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @LargeTest 2155d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn public void testInstallDeclaresPermissions() { 2156d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn InstallParams ip = null; 2157d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn InstallParams ip2 = null; 2158d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 2159d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Upon installing a package, are its declared permissions published? 2160edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2161d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn int iFlags = PackageManager.INSTALL_INTERNAL; 2162d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn int iApk = R.raw.install_decl_perm; 2163d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip = installFromRawResource("install.apk", iApk, 2164d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn iFlags, false, 2165d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 2166d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertInstall(ip.pkg, iFlags, ip.pkg.installLocation); 2167d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_DEFINED); 2168edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2169d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Upon installing package, are its permissions granted? 2170edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2171d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn int i2Flags = PackageManager.INSTALL_INTERNAL; 2172d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn int i2Apk = R.raw.install_use_perm_good; 2173d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip2 = installFromRawResource("install2.apk", i2Apk, 2174d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn i2Flags, false, 2175d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 2176d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertInstall(ip2.pkg, i2Flags, ip2.pkg.installLocation); 2177d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_USED); 2178edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2179d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Upon removing but not deleting, are permissions retained? 2180edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2181d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn GenericReceiver receiver = new DeleteReceiver(ip.pkg.packageName); 2182edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2183d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 2184315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu invokeDeletePackage(ip.pkg.packageName, PackageManager.DONT_DELETE_DATA, receiver); 2185d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (Exception e) { 2186d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn failStr(e); 2187d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2188d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_DEFINED); 2189d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_USED); 2190edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2191d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Upon re-installing, are permissions retained? 2192edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2193d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip = installFromRawResource("install.apk", iApk, 2194d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn iFlags | PackageManager.INSTALL_REPLACE_EXISTING, false, 2195d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 2196d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertInstall(ip.pkg, iFlags, ip.pkg.installLocation); 2197d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_DEFINED); 2198d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_USED); 2199edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2200d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Upon deleting package, are all permissions removed? 2201edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2202d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 2203315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu invokeDeletePackage(ip.pkg.packageName, 0, receiver); 2204d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip = null; 2205d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (Exception e) { 2206d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn failStr(e); 2207d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2208d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_UNDEFINED); 2209d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_NOTUSED); 2210edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2211d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Delete package using permissions; nothing to check here. 2212edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2213d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn GenericReceiver receiver2 = new DeleteReceiver(ip2.pkg.packageName); 2214d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 2215315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu invokeDeletePackage(ip2.pkg.packageName, 0, receiver); 2216d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip2 = null; 2217d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (Exception e) { 2218d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn failStr(e); 2219d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2220edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2221d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Re-install package using permissions; no permissions can be granted. 2222edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2223d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip2 = installFromRawResource("install2.apk", i2Apk, 2224d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn i2Flags, false, 2225d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 2226d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertInstall(ip2.pkg, i2Flags, ip2.pkg.installLocation); 2227d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_NOTUSED); 2228edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2229d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Upon installing declaring package, are sig permissions granted 2230d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // to other apps (but not other perms)? 2231edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2232d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip = installFromRawResource("install.apk", iApk, 2233d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn iFlags, false, 2234d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 2235d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertInstall(ip.pkg, iFlags, ip.pkg.installLocation); 2236d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_DEFINED); 2237d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_SIGUSED); 2238edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2239d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Re-install package using permissions; are all permissions granted? 2240edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2241d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip2 = installFromRawResource("install2.apk", i2Apk, 2242d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn i2Flags | PackageManager.INSTALL_REPLACE_EXISTING, false, 2243d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 2244d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertInstall(ip2.pkg, i2Flags, ip2.pkg.installLocation); 2245d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_NOTUSED); 2246edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2247d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Upon deleting package, are all permissions removed? 2248edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2249d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 2250315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu invokeDeletePackage(ip.pkg.packageName, 0, receiver); 2251d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip = null; 2252d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (Exception e) { 2253d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn failStr(e); 2254d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2255d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_UNDEFINED); 2256d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn assertPermissions(BASE_PERMISSIONS_NOTUSED); 2257edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2258d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn // **: Delete package using permissions; nothing to check here. 2259edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2260d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn try { 2261315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu invokeDeletePackage(ip2.pkg.packageName, 0, receiver); 2262d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn ip2 = null; 2263d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } catch (Exception e) { 2264d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn failStr(e); 2265d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2266edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2267d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } finally { 2268d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (ip2 != null) { 2269d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn cleanUpInstall(ip2); 2270d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2271d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn if (ip != null) { 2272d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn cleanUpInstall(ip); 2273d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2274d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2275d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn } 2276d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn 2277ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu /* 2278ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu * Ensure that permissions are properly declared. 2279ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu */ 2280edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2281ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu public void testInstallOnSdPermissionsUnmount() { 2282ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu InstallParams ip = null; 2283ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu boolean origMediaState = getMediaState(); 2284ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu try { 2285ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu // **: Upon installing a package, are its declared permissions published? 2286ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu int iFlags = PackageManager.INSTALL_INTERNAL; 2287ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu int iApk = R.raw.install_decl_perm; 2288ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu ip = installFromRawResource("install.apk", iApk, 2289ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu iFlags, false, 2290ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 2291ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu assertInstall(ip.pkg, iFlags, ip.pkg.installLocation); 2292ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu assertPermissions(BASE_PERMISSIONS_DEFINED); 2293ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu // Unmount media here 2294ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu assertTrue(unmountMedia()); 2295ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu // Mount media again 2296ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu mountMedia(); 2297ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu //Check permissions now 2298ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu assertPermissions(BASE_PERMISSIONS_DEFINED); 2299ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu } finally { 2300ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu if (ip != null) { 2301ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu cleanUpInstall(ip); 2302ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu } 2303ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu } 2304ebb83ade1eefb8a92990cc7b676d829b111cb7bfSuchi Amalapurapu } 2305c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu 2306c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu /* This test creates a stale container via MountService and then installs 2307c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu * a package and verifies that the stale container is cleaned up and install 2308c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu * is successful. 2309c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu * Please note that this test is very closely tied to the framework's 2310c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu * naming convention for secure containers. 2311c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu */ 2312edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2313c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu public void testInstallSdcardStaleContainer() { 2314c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu boolean origMediaState = getMediaState(); 2315c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu try { 2316c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu String outFileName = "install.apk"; 2317c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu int rawResId = R.raw.install; 2318c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu PackageManager pm = mContext.getPackageManager(); 2319c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu File filesDir = mContext.getFilesDir(); 2320c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu File outFile = new File(filesDir, outFileName); 2321c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu Uri packageURI = getInstallablePackage(rawResId, outFile); 2322c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu PackageParser.Package pkg = parsePackage(packageURI); 2323c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu assertNotNull(pkg); 2324c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu // Install an app on sdcard. 2325c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu installFromRawResource(outFileName, rawResId, 2326c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu PackageManager.INSTALL_EXTERNAL, false, 2327c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2328c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu // Unmount sdcard 2329c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu unmountMedia(); 2330c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu // Delete the app on sdcard to leave a stale container on sdcard. 2331c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu GenericReceiver receiver = new DeleteReceiver(pkg.packageName); 2332315a5fb91dbafe6073435a13d937cee9d26877f6Suchi Amalapurapu assertTrue(invokeDeletePackage(pkg.packageName, 0, receiver)); 2333c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu mountMedia(); 2334c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu // Reinstall the app and make sure it gets installed. 2335c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu installFromRawResource(outFileName, rawResId, 2336c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu PackageManager.INSTALL_EXTERNAL, true, 2337c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2338edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen } catch (Exception e) { 2339c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu failStr(e.getMessage()); 2340c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu } finally { 2341c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu if (origMediaState) { 2342c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu mountMedia(); 2343c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu } else { 2344c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu unmountMedia(); 2345c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu } 2346c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu 2347c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu } 2348c7537ee7b6a7d7c857a02170fa9f41461e5d075bSuchi Amalapurapu } 23491ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu 23501ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu /* This test installs an application on sdcard and unmounts media. 23511ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu * The app is then re-installed on internal storage. The sdcard is mounted 23521ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu * and verified that the re-installation on internal storage takes precedence. 23531ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu */ 23541ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu @MediumTest 23551ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu public void testInstallSdcardStaleContainerReinstall() { 23561ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu boolean origMediaState = getMediaState(); 23571ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu try { 23581ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu // Mount media first 23591ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu mountMedia(); 23601ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu String outFileName = "install.apk"; 23611ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu int rawResId = R.raw.install; 23621ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu PackageManager pm = mContext.getPackageManager(); 23631ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu File filesDir = mContext.getFilesDir(); 23641ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu File outFile = new File(filesDir, outFileName); 23651ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu Uri packageURI = getInstallablePackage(rawResId, outFile); 23661ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu PackageParser.Package pkg = parsePackage(packageURI); 23671ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu assertNotNull(pkg); 23681ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu // Install an app on sdcard. 23691ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu installFromRawResource(outFileName, rawResId, 23701ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu PackageManager.INSTALL_EXTERNAL, false, 23711ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 23721ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu // Unmount sdcard 23731ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu unmountMedia(); 23741ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu // Reinstall the app and make sure it gets installed on internal storage. 23751ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu installFromRawResource(outFileName, rawResId, 23761ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu PackageManager.INSTALL_REPLACE_EXISTING, false, 23771ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 23781ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu mountMedia(); 23791ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu // Verify that the app installed is on internal storage. 23801ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu assertInstall(pkg, 0, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY); 23811ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu } catch (Exception e) { 23821ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu failStr(e.getMessage()); 23831ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu } finally { 23841ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu if (origMediaState) { 23851ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu mountMedia(); 23861ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu } else { 23871ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu unmountMedia(); 23881ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu } 23891ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu 23901ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu } 23911ace5bc070b7271a3f5835b13e326875785f718cSuchi Amalapurapu } 2392ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 2393ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * The following series of tests are related to upgrading apps with 2394edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen * different certificates. 2395ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 2396ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP1_UNSIGNED = R.raw.install_app1_unsigned; 2397ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP1_CERT1 = R.raw.install_app1_cert1; 2398ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP1_CERT2 = R.raw.install_app1_cert2; 2399ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP1_CERT1_CERT2 = R.raw.install_app1_cert1_cert2; 2400ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP1_CERT3_CERT4 = R.raw.install_app1_cert3_cert4; 2401ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP1_CERT3 = R.raw.install_app1_cert3; 2402ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP2_UNSIGNED = R.raw.install_app2_unsigned; 2403ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP2_CERT1 = R.raw.install_app2_cert1; 2404ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP2_CERT2 = R.raw.install_app2_cert2; 2405ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP2_CERT1_CERT2 = R.raw.install_app2_cert1_cert2; 2406ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int APP2_CERT3 = R.raw.install_app2_cert3; 2407ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu 2408ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private InstallParams replaceCerts(int apk1, int apk2, boolean cleanUp, boolean fail, int retCode) { 2409ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 2410ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk1Name = "install1.apk"; 2411ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk2Name = "install2.apk"; 2412ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageParser.Package pkg1 = getParsedPackage(apk1Name, apk1); 2413ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu try { 2414ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu InstallParams ip = installFromRawResource(apk1Name, apk1, 0, false, 2415ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2416ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource(apk2Name, apk2, rFlags, false, 2417ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2418ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu return ip; 2419ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } catch (Exception e) { 2420ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu failStr(e.getMessage()); 2421ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } finally { 2422ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (cleanUp) { 2423ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(pkg1.packageName); 2424ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2425ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2426ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu return null; 2427ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2428ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 2429ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with two certificates can be upgraded by the 2430ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * same app signed with two certificates. 2431ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 2432edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2433ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceMatchAllCerts() { 2434ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(APP1_CERT1_CERT2, APP1_CERT1_CERT2, true, false, -1); 2435ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2436ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu 2437ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 2438ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with two certificates cannot be upgraded 2439ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * by an app signed with a different certificate. 2440ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 2441edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2442ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceMatchNoCerts1() { 2443ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(APP1_CERT1_CERT2, APP1_CERT3, true, true, 2444ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES); 2445ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2446ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 2447ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with two certificates cannot be upgraded 2448ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * by an app signed with a different certificate. 2449ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 2450edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2451ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceMatchNoCerts2() { 2452ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(APP1_CERT1_CERT2, APP1_CERT3_CERT4, true, true, 2453ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES); 2454ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2455ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 2456ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with two certificates cannot be upgraded by 2457ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * an app signed with a subset of initial certificates. 2458ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 2459edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2460ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceMatchSomeCerts1() { 2461ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(APP1_CERT1_CERT2, APP1_CERT1, true, true, 2462ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES); 2463ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2464ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 2465ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with two certificates cannot be upgraded by 2466ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * an app signed with the last certificate. 2467ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 2468edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2469ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceMatchSomeCerts2() { 2470ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(APP1_CERT1_CERT2, APP1_CERT2, true, true, 2471ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES); 2472ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2473ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 2474ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with a certificate can be upgraded by app 2475ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * signed with a superset of certificates. 2476ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 2477edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2478ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceMatchMoreCerts() { 2479ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(APP1_CERT1, APP1_CERT1_CERT2, true, true, 2480ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES); 2481ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2482ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 2483ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with a certificate can be upgraded by app 2484ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * signed with a superset of certificates. Then verify that the an app 2485ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * signed with the original set of certs cannot upgrade the new one. 2486ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 2487edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2488ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceMatchMoreCertsReplaceSomeCerts() { 2489ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu InstallParams ip = replaceCerts(APP1_CERT1, APP1_CERT1_CERT2, false, true, 2490ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES); 2491ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu try { 2492ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rFlags = PackageManager.INSTALL_REPLACE_EXISTING; 2493ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource("install.apk", APP1_CERT1, rFlags, false, 2494ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu false, -1, 2495ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2496ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } catch (Exception e) { 2497ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu failStr(e.getMessage()); 2498ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } finally { 2499ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (ip != null) { 2500ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(ip); 2501ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2502ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2503ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2504ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 2505ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * The following tests are related to testing the checkSignatures 2506ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * api. 2507ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 2508ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private void checkSignatures(int apk1, int apk2, int expMatchResult) { 2509ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, true, false, -1, expMatchResult); 2510ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2511edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2512ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testCheckSignaturesAllMatch() { 2513ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = APP1_CERT1_CERT2; 2514ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = APP2_CERT1_CERT2; 2515ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSignatures(apk1, apk2, PackageManager.SIGNATURE_MATCH); 2516ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2517edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2518ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testCheckSignaturesNoMatch() { 2519ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = APP1_CERT1; 2520ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = APP2_CERT2; 2521ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH); 2522ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2523edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2524ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testCheckSignaturesSomeMatch1() { 2525ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = APP1_CERT1_CERT2; 2526ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = APP2_CERT1; 2527ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH); 2528ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2529edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2530ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testCheckSignaturesSomeMatch2() { 2531ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = APP1_CERT1_CERT2; 2532ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = APP2_CERT2; 2533ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH); 2534ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2535edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2536ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testCheckSignaturesMoreMatch() { 2537ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = APP1_CERT1; 2538ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = APP2_CERT1_CERT2; 2539ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH); 2540ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2541edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2542ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testCheckSignaturesUnknown() { 2543ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = APP1_CERT1_CERT2; 2544ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = APP2_CERT1_CERT2; 2545ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk1Name = "install1.apk"; 2546ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk2Name = "install2.apk"; 2547ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu InstallParams ip1 = null; 2548ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu 2549ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu try { 2550ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu ip1 = installFromRawResource(apk1Name, apk1, 0, false, 2551ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2552ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageManager pm = mContext.getPackageManager(); 2553ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu // Delete app2 2554ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu File filesDir = mContext.getFilesDir(); 2555ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu File outFile = new File(filesDir, apk2Name); 2556ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rawResId = apk2; 2557ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu Uri packageURI = getInstallablePackage(rawResId, outFile); 2558ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageParser.Package pkg = parsePackage(packageURI); 2559ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu getPm().deletePackage(pkg.packageName, null, 0); 2560ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu // Check signatures now 2561ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int match = mContext.getPackageManager().checkSignatures( 2562ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu ip1.pkg.packageName, pkg.packageName); 2563ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu assertEquals(PackageManager.SIGNATURE_UNKNOWN_PACKAGE, match); 2564ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } finally { 2565ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (ip1 != null) { 2566ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(ip1); 2567ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2568ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2569ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2570edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2571ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testInstallNoCertificates() { 2572ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = APP1_UNSIGNED; 2573ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk1Name = "install1.apk"; 2574ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu InstallParams ip1 = null; 2575ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu 2576ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu try { 2577ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource(apk1Name, apk1, 0, false, 2578ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu true, PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES, 2579ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2580ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } finally { 2581ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2582ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2583ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* The following tests are related to apps using shared uids signed 2584ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * with different certs. 2585ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 2586ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED1_UNSIGNED = R.raw.install_shared1_unsigned; 2587ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED1_CERT1 = R.raw.install_shared1_cert1; 2588ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED1_CERT2 = R.raw.install_shared1_cert2; 2589ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED1_CERT1_CERT2 = R.raw.install_shared1_cert1_cert2; 2590ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED2_UNSIGNED = R.raw.install_shared2_unsigned; 2591ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED2_CERT1 = R.raw.install_shared2_cert1; 2592ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED2_CERT2 = R.raw.install_shared2_cert2; 2593ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private int SHARED2_CERT1_CERT2 = R.raw.install_shared2_cert1_cert2; 2594ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu private void checkSharedSignatures(int apk1, int apk2, boolean cleanUp, boolean fail, int retCode, int expMatchResult) { 2595ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk1Name = "install1.apk"; 2596ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk2Name = "install2.apk"; 2597ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageParser.Package pkg1 = getParsedPackage(apk1Name, apk1); 2598ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageParser.Package pkg2 = getParsedPackage(apk2Name, apk2); 2599ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu 2600ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu try { 2601ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu // Clean up before testing first. 2602ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(pkg1.packageName); 2603ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(pkg2.packageName); 2604ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource(apk1Name, apk1, 0, false, 2605ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2606ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (fail) { 2607ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource(apk2Name, apk2, 0, false, 2608ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu true, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2609ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } else { 2610ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource(apk2Name, apk2, 0, false, 2611ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2612ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int match = mContext.getPackageManager().checkSignatures( 2613ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu pkg1.packageName, pkg2.packageName); 2614ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu assertEquals(expMatchResult, match); 2615ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2616ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } finally { 2617ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (cleanUp) { 2618ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(pkg1.packageName); 2619ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(pkg2.packageName); 2620ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2621ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2622ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2623edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2624ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testCheckSignaturesSharedAllMatch() { 2625ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1_CERT2; 2626ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1_CERT2; 2627ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = false; 2628ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int retCode = -1; 2629ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int expMatchResult = PackageManager.SIGNATURE_MATCH; 2630ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult); 2631ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2632edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2633ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testCheckSignaturesSharedNoMatch() { 2634ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1; 2635ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT2; 2636ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 2637ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE; 2638ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int expMatchResult = -1; 2639ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult); 2640ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2641ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 2642ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with cert1 and cert2 cannot be replaced when signed with cert1 alone. 2643ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 2644edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2645ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testCheckSignaturesSharedSomeMatch1() { 2646ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1_CERT2; 2647ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1; 2648ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 2649ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE; 2650ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int expMatchResult = -1; 2651ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult); 2652ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2653ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu /* 2654ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu * Test that an app signed with cert1 and cert2 cannot be replaced when signed with cert2 alone. 2655ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu */ 2656edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2657ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testCheckSignaturesSharedSomeMatch2() { 2658ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1_CERT2; 2659ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT2; 2660ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 2661ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE; 2662ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int expMatchResult = -1; 2663ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult); 2664ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2665edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2666ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testCheckSignaturesSharedUnknown() { 2667ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1_CERT2; 2668ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1_CERT2; 2669ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk1Name = "install1.apk"; 2670ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu String apk2Name = "install2.apk"; 2671ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu InstallParams ip1 = null; 2672ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu 2673ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu try { 2674ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu ip1 = installFromRawResource(apk1Name, apk1, 0, false, 2675ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2676ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageManager pm = mContext.getPackageManager(); 2677ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu // Delete app2 2678ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu PackageParser.Package pkg = getParsedPackage(apk2Name, apk2); 2679ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu getPm().deletePackage(pkg.packageName, null, 0); 2680ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu // Check signatures now 2681ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int match = mContext.getPackageManager().checkSignatures( 2682ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu ip1.pkg.packageName, pkg.packageName); 2683ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu assertEquals(PackageManager.SIGNATURE_UNKNOWN_PACKAGE, match); 2684ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } finally { 2685ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu if (ip1 != null) { 2686ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu cleanUpInstall(ip1); 2687ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2688ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2689ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2690edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen 2691edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2692ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceFirstSharedMatchAllCerts() { 2693ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1; 2694ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1; 2695ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk1 = SHARED1_CERT1; 2696ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSignatures(apk1, apk2, PackageManager.SIGNATURE_MATCH); 2697ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(apk1, rapk1, true, false, -1); 2698ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2699edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2700ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceSecondSharedMatchAllCerts() { 2701ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1; 2702ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1; 2703ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk2 = SHARED2_CERT1; 2704ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSignatures(apk1, apk2, PackageManager.SIGNATURE_MATCH); 2705ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu replaceCerts(apk2, rapk2, true, false, -1); 2706ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2707edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2708ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceFirstSharedMatchSomeCerts() { 2709ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1_CERT2; 2710ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1_CERT2; 2711ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk1 = SHARED1_CERT1; 2712ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 2713ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; 2714ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); 2715ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true, 2716ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2717ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2718edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2719ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceSecondSharedMatchSomeCerts() { 2720ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1_CERT2; 2721ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1_CERT2; 2722ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk2 = SHARED2_CERT1; 2723ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 2724ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; 2725ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); 2726ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true, 2727ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2728ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2729edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2730ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceFirstSharedMatchNoCerts() { 2731ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1; 2732ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1; 2733ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk1 = SHARED1_CERT2; 2734ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 2735ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; 2736ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); 2737ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true, 2738ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2739ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2740edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2741ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceSecondSharedMatchNoCerts() { 2742ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1; 2743ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1; 2744ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk2 = SHARED2_CERT2; 2745ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 2746ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; 2747ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); 2748ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true, 2749ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2750ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2751edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2752ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceFirstSharedMatchMoreCerts() { 2753ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1; 2754ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1; 2755ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk1 = SHARED1_CERT1_CERT2; 2756ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 2757ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; 2758ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); 2759ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true, 2760ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2761ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2762edb979a331ba3cdb12e9b7ce3944611cff1b51aaNeal Nguyen @MediumTest 2763ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu public void testReplaceSecondSharedMatchMoreCerts() { 2764ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk1 = SHARED1_CERT1; 2765ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int apk2 = SHARED2_CERT1; 2766ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int rapk2 = SHARED2_CERT1_CERT2; 2767ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu boolean fail = true; 2768ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; 2769ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH); 2770ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true, 2771ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED); 2772ae18171acd3c70fc6d27fc6bbe85828e0f928fadSuchi Amalapurapu } 2773d4310ac944e5f3063bb23558ba25ccf76fec0968Dianne Hackborn /*---------- Recommended install location tests ----*/ 2774b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu /* 2775b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * TODO's 2776b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * check version numbers for upgrades 2777b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * check permissions of installed packages 2778b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * how to do tests on updated system apps? 2779b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu * verify updates to system apps cannot be installed on the sdcard. 2780b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu */ 2781afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu} 2782