1cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot/* 2cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * Copyright (C) 2010 The Android Open Source Project 3cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * 4cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * Licensed under the Apache License, Version 2.0 (the "License"); 5cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * you may not use this file except in compliance with the License. 6cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * You may obtain a copy of the License at 7cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * 8cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * http://www.apache.org/licenses/LICENSE-2.0 9cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * 10cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * Unless required by applicable law or agreed to in writing, software 11cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * distributed under the License is distributed on an "AS IS" BASIS, 12cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * See the License for the specific language governing permissions and 14cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * limitations under the License. 15cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot */ 16cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot 17cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabotpackage android.content.pm; 18cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot 19f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohetimport com.android.ddmlib.AdbCommandRejectedException; 20f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohetimport com.android.ddmlib.InstallException; 21cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabotimport com.android.ddmlib.Log; 22f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohetimport com.android.ddmlib.ShellCommandUnresponsiveException; 23f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohetimport com.android.ddmlib.SyncException; 24f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohetimport com.android.ddmlib.TimeoutException; 25cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabotimport com.android.hosttest.DeviceTestCase; 26cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabotimport com.android.hosttest.DeviceTestSuite; 27cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot 28cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabotimport java.io.File; 29cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabotimport java.io.IOException; 30cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot 31cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabotimport junit.framework.Test; 32cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot 33cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot/** 34cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * Set of tests that verify host side install cases 35cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot */ 36cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabotpublic class PackageManagerHostTests extends DeviceTestCase { 37cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot 387cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String LOG_TAG = "PackageManagerHostTests"; 3970df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen private PackageManagerHostTestUtils mPMHostUtils = null; 407cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 4170df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen private String appPrivatePath = null; 4270df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen private String deviceAppPath = null; 4370df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen private String sdcardAppPath = null; 44cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot 457cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // Various test files and their corresponding package names... 467cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 477cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // testPushAppPrivate constants 487cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // these constants must match values defined in test-apps/SimpleTestApp 497cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String SIMPLE_APK = "SimpleTestApp.apk"; 507cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String SIMPLE_PKG = "com.android.framework.simpletestapp"; 517cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 527cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // Apk with install location set to auto 537cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String AUTO_LOC_APK = "AutoLocTestApp.apk"; 547cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String AUTO_LOC_PKG = "com.android.framework.autoloctestapp"; 557cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // Apk with install location set to internalOnly 567cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String INTERNAL_LOC_APK = "InternalLocTestApp.apk"; 577cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String INTERNAL_LOC_PKG = "com.android.framework.internalloctestapp"; 587cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // Apk with install location set to preferExternal 597cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String EXTERNAL_LOC_APK = "ExternalLocTestApp.apk"; 607cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String EXTERNAL_LOC_PKG = "com.android.framework.externalloctestapp"; 61b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // Apk with install location set to auto (2 versions, for update testing) 62b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String AUTO_LOC_VERSION_V1_APK = "AutoLocVersionedTestApp_v1.apk"; 63b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String AUTO_LOC_VERSION_V2_APK = "AutoLocVersionedTestApp_v2.apk"; 64b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String AUTO_LOC_VERSION_PKG = 65b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen "com.android.framework.autolocversionedtestapp"; 66b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // Apk with install location set to preferExternal (2 versions, for update testing) 67b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String EXTERNAL_LOC_VERSION_V1_APK = "ExternalLocVersionedTestApp_v1.apk"; 68b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String EXTERNAL_LOC_VERSION_V2_APK = "ExternalLocVersionedTestApp_v2.apk"; 69b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String EXTERNAL_LOC_VERSION_PKG = 70b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen "com.android.framework.externallocversionedtestapp"; 71b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // Apk with install location set to auto (2 versions, for update testing) 72b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String NO_LOC_VERSION_V1_APK = "NoLocVersionedTestApp_v1.apk"; 73b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String NO_LOC_VERSION_V2_APK = "NoLocVersionedTestApp_v2.apk"; 74b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String NO_LOC_VERSION_PKG = 75b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen "com.android.framework.nolocversionedtestapp"; 767cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // Apk with no install location set 777cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String NO_LOC_APK = "NoLocTestApp.apk"; 787cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String NO_LOC_PKG = "com.android.framework.noloctestapp"; 797cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // Apk with 2 different versions - v1 is set to external, v2 has no location setting 807cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String UPDATE_EXTERNAL_LOC_V1_EXT_APK 817cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen = "UpdateExternalLocTestApp_v1_ext.apk"; 827cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String UPDATE_EXTERNAL_LOC_V2_NONE_APK 837cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen = "UpdateExternalLocTestApp_v2_none.apk"; 847cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String UPDATE_EXTERNAL_LOC_PKG 857cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen = "com.android.framework.updateexternalloctestapp"; 867cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // Apk with 2 different versions - v1 is set to external, v2 is set to internalOnly 877cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String UPDATE_EXT_TO_INT_LOC_V1_EXT_APK 887cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen = "UpdateExtToIntLocTestApp_v1_ext.apk"; 897cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String UPDATE_EXT_TO_INT_LOC_V2_INT_APK 907cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen = "UpdateExtToIntLocTestApp_v2_int.apk"; 917cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String UPDATE_EXT_TO_INT_LOC_PKG 927cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen = "com.android.framework.updateexttointloctestapp"; 93b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // Apk set to preferExternal, with Access Fine Location permissions set in its manifest 94b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String FL_PERMS_APK = "ExternalLocPermsFLTestApp.apk"; 95b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String FL_PERMS_PKG = "com.android.framework.externallocpermsfltestapp"; 96b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // Apk set to preferExternal, with all permissions set in manifest 97b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String ALL_PERMS_APK = "ExternalLocAllPermsTestApp.apk"; 98b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String ALL_PERMS_PKG = "com.android.framework.externallocallpermstestapp"; 997cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // Apks with the same package name, but install location set to 1007cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // one of: Internal, External, Auto, or None 1017cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String VERSATILE_LOC_PKG = "com.android.framework.versatiletestapp"; 1027cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String VERSATILE_LOC_INTERNAL_APK = "VersatileTestApp_Internal.apk"; 1037cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String VERSATILE_LOC_EXTERNAL_APK = "VersatileTestApp_External.apk"; 1047cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String VERSATILE_LOC_AUTO_APK = "VersatileTestApp_Auto.apk"; 1057cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen private static final String VERSATILE_LOC_NONE_APK = "VersatileTestApp_None.apk"; 106b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // Apks with shared UserID 107b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String SHARED_PERMS_APK = "ExternalSharedPermsTestApp.apk"; 108b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String SHARED_PERMS_PKG 109b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen = "com.android.framework.externalsharedpermstestapp"; 110b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String SHARED_PERMS_FL_APK = "ExternalSharedPermsFLTestApp.apk"; 111b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String SHARED_PERMS_FL_PKG 112b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen = "com.android.framework.externalsharedpermsfltestapp"; 113b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String SHARED_PERMS_BT_APK = "ExternalSharedPermsBTTestApp.apk"; 114b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String SHARED_PERMS_BT_PKG 115b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen = "com.android.framework.externalsharedpermsbttestapp"; 116b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // Apk with shared UserID, but signed with a different cert (the media cert) 117b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String SHARED_PERMS_DIFF_KEY_APK = "ExternalSharedPermsDiffKeyTestApp.apk"; 118b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private static final String SHARED_PERMS_DIFF_KEY_PKG 119b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen = "com.android.framework.externalsharedpermsdiffkeytestapp"; 1207cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 121cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot @Override 122cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot protected void setUp() throws Exception { 123cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot super.setUp(); 124cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot // ensure apk path has been set before test is run 125cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot assertNotNull(getTestAppPath()); 126cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot 12770df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen // setup the PackageManager host tests utilities class, and get various paths we'll need... 12870df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils = new PackageManagerHostTestUtils(getDevice()); 12970df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen appPrivatePath = mPMHostUtils.getAppPrivatePath(); 13070df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen deviceAppPath = mPMHostUtils.getDeviceAppPath(); 13170df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen sdcardAppPath = mPMHostUtils.getSDCardAppPath(); 132b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 133b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // Ensure the default is set to let the system decide where to install apps 134b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // (It's ok for individual tests to override and change this during their test, but should 135b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // reset it back when they're done) 136b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.setDevicePreferredInstallLocation( 137b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference.AUTO); 138cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot } 139cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot 140cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot /** 141cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * Get the absolute file system location of test app with given filename 142cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * @param fileName the file name of the test app apk 143cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot * @return {@link String} of absolute file path 144cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot */ 14570df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen public String getTestAppFilePath(String fileName) { 146cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot return String.format("%s%s%s", getTestAppPath(), File.separator, fileName); 147cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot } 148cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot 149cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot public static Test suite() { 150cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot return new DeviceTestSuite(PackageManagerHostTests.class); 151cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot } 152cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot 153cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot /** 15470df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen * Regression test to verify that pushing an apk to the private app directory doesn't install 15570df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen * the app, and otherwise cause the system to blow up. 1567cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * <p/> 1577cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * Assumes adb is running as root in device under test. 158b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 159f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 160f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 161f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 162f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 163f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 164f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws SyncException if the sync failed for another reason. 165f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 1667cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen */ 167f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testPushAppPrivate() throws IOException, InterruptedException, InstallException, 168f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet TimeoutException, AdbCommandRejectedException, ShellCommandUnresponsiveException, 169f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet SyncException { 17070df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen Log.i(LOG_TAG, "testing pushing an apk to /data/app-private"); 17170df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen final String apkAppPrivatePath = appPrivatePath + SIMPLE_APK; 1727cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 17370df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen // cleanup test app just in case it was accidently installed 17470df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen getDevice().uninstallPackage(SIMPLE_PKG); 17570df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.executeShellCommand("stop"); 17670df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.pushFile(getTestAppFilePath(SIMPLE_APK), apkAppPrivatePath); 1777cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 17870df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen // sanity check to make sure file is there 17970df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen assertTrue(mPMHostUtils.doesRemoteFileExist(apkAppPrivatePath)); 18070df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.executeShellCommand("start"); 1817cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 182b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.waitForPackageManager(); 1837cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 18470df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen // grep for package to make sure its not installed 18570df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen assertFalse(mPMHostUtils.doesPackageExist(SIMPLE_PKG)); 18670df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen // ensure it has been deleted from app-private 18770df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen assertFalse(mPMHostUtils.doesRemoteFileExist(apkAppPrivatePath)); 1887cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 1897cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 1907cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen /** 191b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Helper to do a standard install of an apk and verify it installed to the correct location. 1927cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * <p/> 1937cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * Assumes adb is running as root in device under test. 194b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @param apkName the file name of the test app apk 195b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @param pkgName the package name of the test app apk 196b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @param expectedLocation the file name of the test app apk 197b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 198f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 199f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 200f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 201f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 202f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 203f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 2047cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen */ 205b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen private void doStandardInstall(String apkName, String pkgName, 206b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocation expectedLocation) 207f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet throws IOException, InterruptedException, InstallException, TimeoutException, 208f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet AdbCommandRejectedException, ShellCommandUnresponsiveException { 2097cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 210b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen if (expectedLocation == PackageManagerHostTestUtils.InstallLocation.DEVICE) { 21170df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnDevice( 212b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen getTestAppFilePath(apkName), pkgName, false); 213b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 214b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen else { 215b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard( 216b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen getTestAppFilePath(apkName), pkgName, false); 217b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 218b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 219b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 220b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 221b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Installs the Auto app using the preferred device install location specified, 222b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * and verifies it was installed on the device. 223b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 224b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 225b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @param preference the device's preferred location of where to install apps 226b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @param expectedLocation the expected location of where the apk was installed 227b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 228f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 229f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 230f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 231f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 232f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 233f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 234b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 235b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen public void installAppAutoLoc(PackageManagerHostTestUtils.InstallLocPreference preference, 236b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocation expectedLocation) 237f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet throws IOException, InterruptedException, TimeoutException, AdbCommandRejectedException, 238f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException, InstallException { 239b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 240b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference savedPref = 241b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference.AUTO; 242b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 243b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 244b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen savedPref = mPMHostUtils.getDevicePreferredInstallLocation(); 245b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.setDevicePreferredInstallLocation(preference); 246b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 247b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen doStandardInstall(AUTO_LOC_APK, AUTO_LOC_PKG, expectedLocation); 2487cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 2497cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // cleanup test app 2507cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen finally { 251b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.setDevicePreferredInstallLocation(savedPref); 25270df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.uninstallApp(AUTO_LOC_PKG); 2537cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 2547cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 2557cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 2567cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen /** 257b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with its manifest set to installLocation=auto 258b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * will install the app to the device when device's preference is auto. 259b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 260b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 261b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 262f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 263f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 264f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 265f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 266f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 267f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 268b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 269f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallAppAutoLocPrefIsAuto() throws IOException, InterruptedException, 270f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, TimeoutException, AdbCommandRejectedException, ShellCommandUnresponsiveException { 271b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test installLocation=auto, prefer=auto gets installed on device"); 272b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen installAppAutoLoc(PackageManagerHostTestUtils.InstallLocPreference.AUTO, 273b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocation.DEVICE); 274b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 275b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 276b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 277b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with its manifest set to installLocation=auto 278b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * will install the app to the device when device's preference is internal. 2797cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * <p/> 2807cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * Assumes adb is running as root in device under test. 281b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 282f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 283f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 284f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 285f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 286f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 287f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 2887cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen */ 289f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallAppAutoLocPrefIsInternal() throws IOException, InterruptedException, 290f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, TimeoutException, AdbCommandRejectedException, 291f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 292b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test installLocation=auto, prefer=internal gets installed on device"); 293b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen installAppAutoLoc(PackageManagerHostTestUtils.InstallLocPreference.INTERNAL, 294b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocation.DEVICE); 295b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 296b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 297b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 298b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with its manifest set to installLocation=auto 299b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * will install the app to the SD card when device's preference is external. 300b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 301b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 302b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 303f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 304f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 305f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 306f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 307f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 308f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 309b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 310f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallAppAutoLocPrefIsExternal() throws IOException, InterruptedException, 311f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, TimeoutException, AdbCommandRejectedException, 312f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 313b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test installLocation=auto, prefer=external gets installed on device"); 314b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen installAppAutoLoc(PackageManagerHostTestUtils.InstallLocPreference.EXTERNAL, 315b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocation.DEVICE); 316b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 317b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 318b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 319b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Installs the Internal app using the preferred device install location specified, 320b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * and verifies it was installed to the location expected. 321b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 322b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 323b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @param preference the device's preferred location of where to install apps 324b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @param expectedLocation the expected location of where the apk was installed 325b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 326f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 327f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 328f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 329f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 330f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 331f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the (un)install failed. 332b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 333b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen public void installAppInternalLoc(PackageManagerHostTestUtils.InstallLocPreference preference, 334b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocation expectedLocation) 335f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet throws IOException, InterruptedException, TimeoutException, AdbCommandRejectedException, 336f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException, InstallException { 337b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 338b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference savedPref = 339b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference.AUTO; 3407cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 3417cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen try { 342b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen savedPref = mPMHostUtils.getDevicePreferredInstallLocation(); 343b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.setDevicePreferredInstallLocation(preference); 344b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 345b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen doStandardInstall(INTERNAL_LOC_APK, INTERNAL_LOC_PKG, expectedLocation); 3467cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 3477cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // cleanup test app 3487cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen finally { 349b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.setDevicePreferredInstallLocation(savedPref); 35070df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.uninstallApp(INTERNAL_LOC_PKG); 3517cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 3527cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 3537cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 3547cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen /** 355b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with its manifest set to installLocation=internalOnly 356b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * will install the app to the device when device's preference is auto. 357b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 358b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 359b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 360f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 361f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 362f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 363f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 364f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 365f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 366b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 367f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallAppInternalLocPrefIsAuto() throws IOException, InterruptedException, 368f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, TimeoutException, AdbCommandRejectedException, 369f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 370b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test installLocation=internal, prefer=auto gets installed on device"); 371b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen installAppInternalLoc(PackageManagerHostTestUtils.InstallLocPreference.AUTO, 372b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocation.DEVICE); 373b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 374b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 375b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 376b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with its manifest set to installLocation=internalOnly 377b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * will install the app to the device when device's preference is internal. 378b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 379b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 380b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 381f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 382f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 383f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 384f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 385f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 386f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 387b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 388f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallAppInternalLocPrefIsInternal() throws IOException, InterruptedException, 389f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, TimeoutException, AdbCommandRejectedException, 390f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 391b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test installLocation=internal, prefer=internal is installed on device"); 392b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen installAppInternalLoc(PackageManagerHostTestUtils.InstallLocPreference.INTERNAL, 393b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocation.DEVICE); 394b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 395b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 396b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 397b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with its manifest set to installLocation=internalOnly 398b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * will install the app to the device when device's preference is external. 399b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 400b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 401b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 402f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 403f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 404f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 405f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 406f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 407f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 408b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 409f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallAppInternalLocPrefIsExternal() throws IOException, InterruptedException, 410f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, TimeoutException, AdbCommandRejectedException, 411f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 412b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test installLocation=internal, prefer=external is installed on device"); 413b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen installAppInternalLoc(PackageManagerHostTestUtils.InstallLocPreference.EXTERNAL, 414b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocation.DEVICE); 415b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 416b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 417b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 4187cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * Regression test to verify that an app with its manifest set to installLocation=preferExternal 4197cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * will install the app to the SD card. 4207cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * <p/> 4217cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * Assumes adb is running as root in device under test. 422b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @param preference the device's preferred location of where to install apps 423b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @param expectedLocation the expected location of where the apk was installed 424b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 425f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 426f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 427f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 428f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 429f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 430f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 4317cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen */ 432b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen public void installAppExternalLoc(PackageManagerHostTestUtils.InstallLocPreference preference, 433b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocation expectedLocation) 434f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet throws IOException, InterruptedException, TimeoutException, AdbCommandRejectedException, 435f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException, InstallException { 436b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 437b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference savedPref = 438b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference.AUTO; 4397cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 4407cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen try { 441b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen savedPref = mPMHostUtils.getDevicePreferredInstallLocation(); 442b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.setDevicePreferredInstallLocation(preference); 443b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 444b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen doStandardInstall(EXTERNAL_LOC_APK, EXTERNAL_LOC_PKG, expectedLocation); 445b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 4467cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 4477cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // cleanup test app 4487cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen finally { 449b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.setDevicePreferredInstallLocation(savedPref); 45070df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.uninstallApp(EXTERNAL_LOC_PKG); 4517cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 4527cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 4537cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 4547cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen /** 455b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with its manifest set to installLocation=preferExternal 456b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * will install the app to the device when device's preference is auto. 457b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 458b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 459b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 460f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 461f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 462f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 463f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 464f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 465f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 466b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 467f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallAppExternalLocPrefIsAuto() throws IOException, InterruptedException, 468f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, TimeoutException, AdbCommandRejectedException, 469f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 470b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test installLocation=external, pref=auto gets installed on SD Card"); 471b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen installAppExternalLoc(PackageManagerHostTestUtils.InstallLocPreference.AUTO, 472b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocation.SDCARD); 473b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 474b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 475b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 476b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with its manifest set to installLocation=preferExternal 477b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * will install the app to the device when device's preference is internal. 478b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 479b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 480b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 481f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 482f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 483f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 484f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 485f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 486f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 487b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 488f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallAppExternalLocPrefIsInternal() throws IOException, InterruptedException, 489f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, TimeoutException, AdbCommandRejectedException, 490f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 491b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test installLocation=external, pref=internal gets installed on SD Card"); 492b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen installAppExternalLoc(PackageManagerHostTestUtils.InstallLocPreference.INTERNAL, 493b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocation.SDCARD); 494b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 495b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 496b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 497b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with its manifest set to installLocation=preferExternal 498b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * will install the app to the device when device's preference is external. 499b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 500b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 501b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 502f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 503f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 504f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 505f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 506f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 507f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 508b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 509f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallAppExternalLocPrefIsExternal() throws IOException, InterruptedException, 510f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, TimeoutException, AdbCommandRejectedException, 511f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 512b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test installLocation=external, pref=external gets installed on SD Card"); 513b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen installAppExternalLoc(PackageManagerHostTestUtils.InstallLocPreference.EXTERNAL, 514b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocation.SDCARD); 515b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 516b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 517b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 518b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app without installLocation in its manifest 519b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * will install the app to the device by default when the system default pref is to let the 520b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * system decide. 521b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 522b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 523b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 524f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 525f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 526f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 527f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 528f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 529f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 530b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 531f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallAppNoLocPrefIsAuto() throws IOException, InterruptedException, 532f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet TimeoutException, AdbCommandRejectedException, ShellCommandUnresponsiveException, 533f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException { 534b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test an app with no installLocation gets installed on device"); 535b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 536b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference savedPref = 537b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference.AUTO; 538b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 539b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 540b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen savedPref = mPMHostUtils.getDevicePreferredInstallLocation(); 541b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.setDevicePreferredInstallLocation( 542b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference.AUTO); 543b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnDevice( 544b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen getTestAppFilePath(NO_LOC_APK), NO_LOC_PKG, false); 545b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 546b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 547b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 548b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.setDevicePreferredInstallLocation(savedPref); 549b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(NO_LOC_PKG); 550b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 551b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 552b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 553b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 554b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app without installLocation in its manifest 555b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * will install the app to the device by default when the system default pref is to install 556b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * external. 557b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 558b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 559b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 560f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 561f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 562f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 563f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 564f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 565f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 566b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 567f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallAppNoLocPrefIsExternal() throws IOException, InterruptedException, 568f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet TimeoutException, AdbCommandRejectedException, ShellCommandUnresponsiveException, 569f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException { 570b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test an app with no installLocation gets installed on SD card"); 571b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 572b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference savedPref = 573b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference.AUTO; 574b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 575b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 576b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen savedPref = mPMHostUtils.getDevicePreferredInstallLocation(); 577b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.setDevicePreferredInstallLocation( 578b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference.EXTERNAL); 579b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard( 580b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen getTestAppFilePath(NO_LOC_APK), NO_LOC_PKG, false); 581b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 582b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 583b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 584b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.setDevicePreferredInstallLocation(savedPref); 585b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(NO_LOC_PKG); 586b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 587b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 588b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 589b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 590b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app without installLocation in its manifest 591b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * will install the app to the device by default when the system default pref is to install 592b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * internal. 593b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 594b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 595b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 596f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 597f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 598f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 599f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 600f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 601f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 602b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 603f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallAppNoLocPrefIsInternal() throws IOException, InterruptedException, 604f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet TimeoutException, AdbCommandRejectedException, ShellCommandUnresponsiveException, 605f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException { 606b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test an app with no installLocation gets installed on device"); 607b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 608b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference savedPref = 609b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference.AUTO; 610b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 611b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 612b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen savedPref = mPMHostUtils.getDevicePreferredInstallLocation(); 613b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.setDevicePreferredInstallLocation( 614b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen PackageManagerHostTestUtils.InstallLocPreference.INTERNAL); 615b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnDevice( 616b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen getTestAppFilePath(NO_LOC_APK), NO_LOC_PKG, false); 617b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 618b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 619b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 620b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.setDevicePreferredInstallLocation(savedPref); 621b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(NO_LOC_PKG); 622b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 623b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 624b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 625b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 626b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with its installLocation set to internal that is 627b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * forward-locked will get installed to the correct location. 628b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 629b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 630b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 631f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 632f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 633f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 634f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 635f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 636f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws SyncException if the sync failed for another reason. 637f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 638b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 639f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallFwdLockedAppInternal() throws IOException, InterruptedException, 640f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, SyncException, TimeoutException, AdbCommandRejectedException, 641f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 642b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test an app with installLoc set to Internal gets installed to app-private"); 643b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 644b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 645b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installFwdLockedAppAndVerifyExists( 646b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen getTestAppFilePath(INTERNAL_LOC_APK), INTERNAL_LOC_PKG, false); 647b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 648b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 649b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 650b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(INTERNAL_LOC_PKG); 651b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 652b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 653b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 654b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 655b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with its installLocation set to external that is 656b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * forward-locked will get installed to the correct location. 657b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 658b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 659b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 660f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 661f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 662f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 663f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 664f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 665f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws SyncException if the sync failed for another reason. 666f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 667b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 668f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallFwdLockedAppExternal() throws IOException, InterruptedException, 669f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, SyncException, TimeoutException, AdbCommandRejectedException, 670f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 671b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test an app with installLoc set to Internal gets installed to app-private"); 672b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 673b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 674b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installFwdLockedAppAndVerifyExists( 675b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen getTestAppFilePath(INTERNAL_LOC_APK), INTERNAL_LOC_PKG, false); 676b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 677b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 678b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 679b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(INTERNAL_LOC_PKG); 680b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 681b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 682b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 683b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 684b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with its installLocation set to external that is 685b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * forward-locked will get installed to the correct location. 686b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 687b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 688b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 689f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 690f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 691f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 692f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 693f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 694f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws SyncException if the sync failed for another reason. 695f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 696b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 697f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallFwdLockedAppAuto() throws IOException, InterruptedException, 698f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, SyncException, TimeoutException, AdbCommandRejectedException, 699f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 700b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test an app with installLoc set to Auto gets installed to app-private"); 701b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 702b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 703b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installFwdLockedAppAndVerifyExists( 704b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen getTestAppFilePath(AUTO_LOC_APK), AUTO_LOC_PKG, false); 705b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 706b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 707b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 708b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(AUTO_LOC_PKG); 709b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 710b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 711b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 712b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 713b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with no installLocation set and is 714b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * forward-locked installed will get installed to the correct location. 715b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 716b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 717b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 718f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 719f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 720f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 721f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 722f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 723f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws SyncException if the sync failed for another reason. 724f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 725b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 726f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testInstallFwdLockedAppNone() throws IOException, InterruptedException, 727f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, SyncException, TimeoutException, AdbCommandRejectedException, 728f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 729b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test an app with no installLoc set gets installed to app-private"); 730b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 731b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 732b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installFwdLockedAppAndVerifyExists( 733b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen getTestAppFilePath(NO_LOC_APK), NO_LOC_PKG, false); 734b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 735b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 736b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 737b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(NO_LOC_PKG); 738b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 739b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 740b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 741b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 7427cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * Regression test to verify that we can install an app onto the device, 7437cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * uninstall it, and reinstall it onto the SD card. 7447cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * <p/> 7457cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * Assumes adb is running as root in device under test. 746b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 747f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 748f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 749f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 750f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 751f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 752f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 7537cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen */ 7547cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // TODO: This currently relies on the app's manifest to switch from device to 7557cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // SD card install locations. We might want to make Device's installPackage() 7567cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // accept a installLocation flag so we can install a package to the 7577cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // destination of our choosing. 758f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testReinstallInternalToExternal() throws IOException, InterruptedException, 759f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, TimeoutException, AdbCommandRejectedException, 760f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 7617cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen Log.i(LOG_TAG, "Test installing an app first to the device, then to the SD Card"); 7627cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 7637cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen try { 76470df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnDevice( 76570df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen getTestAppFilePath(VERSATILE_LOC_INTERNAL_APK), VERSATILE_LOC_PKG, false); 76670df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.uninstallApp(VERSATILE_LOC_PKG); 76770df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard( 76870df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen getTestAppFilePath(VERSATILE_LOC_EXTERNAL_APK), VERSATILE_LOC_PKG, false); 7697cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 7707cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // cleanup test app 7717cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen finally { 77270df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.uninstallApp(VERSATILE_LOC_PKG); 7737cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 7747cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 7757cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 7767cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen /** 7777cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * Regression test to verify that we can install an app onto the SD Card, 7787cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * uninstall it, and reinstall it onto the device. 7797cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * <p/> 7807cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * Assumes adb is running as root in device under test. 781b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 782f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 783f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 784f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 785f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 786f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 787f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 7887cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen */ 7897cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // TODO: This currently relies on the app's manifest to switch from device to 7907cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // SD card install locations. We might want to make Device's installPackage() 7917cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // accept a installLocation flag so we can install a package to the 7927cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // destination of our choosing. 793f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testReinstallExternalToInternal() throws IOException, InterruptedException, 794f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, TimeoutException, AdbCommandRejectedException, 795f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 7967cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen Log.i(LOG_TAG, "Test installing an app first to the SD Care, then to the device"); 7977cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 7987cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen try { 7997cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // install the app externally 80070df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard( 80170df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen getTestAppFilePath(VERSATILE_LOC_EXTERNAL_APK), VERSATILE_LOC_PKG, false); 80270df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.uninstallApp(VERSATILE_LOC_PKG); 8037cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // then replace the app with one marked for internalOnly 80470df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnDevice( 80570df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen getTestAppFilePath(VERSATILE_LOC_INTERNAL_APK), VERSATILE_LOC_PKG, false); 8067cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 8077cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // cleanup test app 8087cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen finally { 80970df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.uninstallApp(VERSATILE_LOC_PKG); 8107cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 8117cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 8127cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 8137cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen /** 8147cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * Regression test to verify that updating an app on the SD card will install 815b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * the update onto the SD card as well when location is set to external for both versions 816b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 817b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 818b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 819f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 820f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 821f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 822f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 823f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 824f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 825b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 826f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testUpdateBothExternal() throws IOException, InterruptedException, InstallException, 827f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet TimeoutException, AdbCommandRejectedException, ShellCommandUnresponsiveException { 828b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test updating an app on the SD card stays on the SD card"); 829b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 830b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 831b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // install the app externally 832b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 833b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen EXTERNAL_LOC_VERSION_V1_APK), EXTERNAL_LOC_VERSION_PKG, false); 834b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // now replace the app with one where the location is still set to preferExternal 835b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 836b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen EXTERNAL_LOC_VERSION_V2_APK), EXTERNAL_LOC_VERSION_PKG, true); 837b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 838b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 839b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 840b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(EXTERNAL_LOC_VERSION_PKG); 841b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 842b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 843b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 844b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 845b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that updating an app on the SD card will install 8467cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * the update onto the SD card as well when location is not explicitly set in the 8477cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * updated apps' manifest file. 8487cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * <p/> 8497cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * Assumes adb is running as root in device under test. 850b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 851f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 852f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 853f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 854f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 855f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 856f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 8577cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen */ 858f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testUpdateToSDCard() throws IOException, InterruptedException, InstallException, 859f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet TimeoutException, AdbCommandRejectedException, ShellCommandUnresponsiveException { 8607cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen Log.i(LOG_TAG, "Test updating an app on the SD card stays on the SD card"); 8617cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 8627cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen try { 8637cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // install the app externally 86470df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 86570df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen UPDATE_EXTERNAL_LOC_V1_EXT_APK), UPDATE_EXTERNAL_LOC_PKG, false); 8667cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // now replace the app with one where the location is blank (app should stay external) 86770df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 86870df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen UPDATE_EXTERNAL_LOC_V2_NONE_APK), UPDATE_EXTERNAL_LOC_PKG, true); 8697cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 8707cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // cleanup test app 8717cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen finally { 87270df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.uninstallApp(UPDATE_EXTERNAL_LOC_PKG); 8737cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 8747cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 8757cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 8767cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen /** 8777cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * Regression test to verify that updating an app on the SD card will install 878b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * the update onto the device if the manifest has changed to installLocation=internalOnly 8797cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * <p/> 8807cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen * Assumes adb is running as root in device under test. 881b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 882f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 883f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 884f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 885f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 886f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 887f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 8887cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen */ 889f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet public void testUpdateSDCardToDevice() throws IOException, InterruptedException, 890f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet InstallException, TimeoutException, AdbCommandRejectedException, 891f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet ShellCommandUnresponsiveException { 8927cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen Log.i(LOG_TAG, "Test updating an app on the SD card to the Device through manifest change"); 8937cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen 8947cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen try { 8957cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // install the app externally 89670df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 89770df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen UPDATE_EXT_TO_INT_LOC_V1_EXT_APK), UPDATE_EXT_TO_INT_LOC_PKG, false); 898b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // now replace the app with an update marked for internalOnly...(should move internal) 89970df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnDevice(getTestAppFilePath( 90070df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen UPDATE_EXT_TO_INT_LOC_V2_INT_APK), UPDATE_EXT_TO_INT_LOC_PKG, true); 9017cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 9027cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen // cleanup test app 9037cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen finally { 90470df9ba15a2845984bcb94f029299a06c7210d49Neal Nguyen mPMHostUtils.uninstallApp(UPDATE_EXT_TO_INT_LOC_PKG); 9057cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 9067cbb92dff7622d3c79f12f1d5aae492982d95c8fNeal Nguyen } 907b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 908b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 909b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that installing and updating a forward-locked app will install 910b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * the update onto the device's forward-locked location 911b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 912b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 913b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 914f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 915f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 916f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 917f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 918f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 919f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws SyncException if the sync failed for another reason. 920f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 921b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 922b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen public void testInstallAndUpdateExternalLocForwardLockedApp() 923f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet throws IOException, InterruptedException, InstallException, SyncException, 924f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet TimeoutException, AdbCommandRejectedException, ShellCommandUnresponsiveException { 925b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test updating a forward-locked app marked preferExternal"); 926b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 927b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 928b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // first try to install the forward-locked app externally 929b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installFwdLockedAppAndVerifyExists(getTestAppFilePath( 930b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen EXTERNAL_LOC_VERSION_V1_APK), EXTERNAL_LOC_VERSION_PKG, false); 931b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // now replace the app with an update marked for internalOnly and as forward locked 932b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installFwdLockedAppAndVerifyExists(getTestAppFilePath( 933b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen EXTERNAL_LOC_VERSION_V2_APK), EXTERNAL_LOC_VERSION_PKG, true); 934b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 935b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 936b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 937b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(EXTERNAL_LOC_VERSION_PKG); 938b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 939b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 940b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 941b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 942b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that updating a forward-locked app will install 943b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * the update onto the device's forward-locked location 944b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 945b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 946b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 947f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 948f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 949f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 950f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 951f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 952f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws SyncException if the sync failed for another reason. 953f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 954b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 955b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen public void testInstallAndUpdateNoLocForwardLockedApp() 956f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet throws IOException, InterruptedException, InstallException, SyncException, 957f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet TimeoutException, AdbCommandRejectedException, ShellCommandUnresponsiveException { 958b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test updating a forward-locked app with no installLocation pref set"); 959b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 960b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 961b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // install the app 962b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installFwdLockedAppAndVerifyExists(getTestAppFilePath( 963b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen NO_LOC_VERSION_V1_APK), NO_LOC_VERSION_PKG, false); 964b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // now replace the app with an update marked for internalOnly... 965b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installFwdLockedAppAndVerifyExists(getTestAppFilePath( 966b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen NO_LOC_VERSION_V2_APK), NO_LOC_VERSION_PKG, true); 967b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 968b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 969b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 970b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(NO_LOC_VERSION_PKG); 971b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 972b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 973b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 974b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 975b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with all permissions set can be installed on SD card 976b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * and then launched without crashing. 977b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 978b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 979b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 980f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 981f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 982f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 983f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 984f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 985f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws SyncException if the sync failed for another reason. 986f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 987b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 988b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen public void testInstallAndLaunchAllPermsAppOnSD() 989f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet throws IOException, InterruptedException, InstallException, TimeoutException, 990f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet AdbCommandRejectedException, ShellCommandUnresponsiveException { 991b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test launching an app with all perms set, installed on SD card"); 992b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 993b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 994b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // install the app 995b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 996b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen ALL_PERMS_APK), ALL_PERMS_PKG, false); 997b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen boolean testsPassed = mPMHostUtils.runDeviceTestsDidAllTestsPass(ALL_PERMS_PKG); 998b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen assert(testsPassed); 999b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1000b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 1001b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 1002b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(ALL_PERMS_PKG); 1003b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1004b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1005b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1006b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 1007b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with ACCESS_FINE_LOCATION (GPS) permissions can 1008b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * run without permissions errors. 1009b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 1010b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 1011b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 1012f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 1013f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 1014f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 1015f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 1016f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 1017f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 1018b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 1019b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen public void testInstallAndLaunchFLPermsAppOnSD() 1020f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet throws IOException, InterruptedException, InstallException, TimeoutException, 1021f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet AdbCommandRejectedException, ShellCommandUnresponsiveException { 1022b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test launching an app with location perms set, installed on SD card"); 1023b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1024b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 1025b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // install the app and verify we can launch it without permissions errors 1026b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 1027b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen SHARED_PERMS_FL_APK), SHARED_PERMS_FL_PKG, false); 1028b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen boolean testsPassed = mPMHostUtils.runDeviceTestsDidAllTestsPass(SHARED_PERMS_FL_PKG); 1029b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen assert(testsPassed); 1030b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1031b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 1032b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 1033b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(SHARED_PERMS_FL_PKG); 1034b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1035b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1036b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1037b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 1038b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with BLUE_TOOTH permissions can 1039b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * run without permissions errors. 1040b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 1041b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 1042b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 1043f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 1044f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 1045f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 1046f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 1047f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 1048f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 1049b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 1050b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen public void testInstallAndLaunchBTPermsAppOnSD() 1051f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet throws IOException, InterruptedException, InstallException, TimeoutException, 1052f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet AdbCommandRejectedException, ShellCommandUnresponsiveException { 1053b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test launching an app with bluetooth perms set, installed on SD card"); 1054b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1055b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 1056b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // install the app and verify we can launch it without permissions errors 1057b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 1058b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen SHARED_PERMS_BT_APK), SHARED_PERMS_BT_PKG, false); 1059b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen boolean testsPassed = mPMHostUtils.runDeviceTestsDidAllTestsPass(SHARED_PERMS_BT_PKG); 1060b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen assert(testsPassed); 1061b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1062b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 1063b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 1064b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(SHARED_PERMS_BT_PKG); 1065b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1066b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1067b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1068b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 1069b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that a shared app with no explicit permissions throws a 1070b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * SecurityException when launched if its other shared apps are not installed. 1071b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 1072b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 1073b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 1074f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 1075f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 1076f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 1077f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 1078f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 1079f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 1080b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 1081b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen public void testInstallAndLaunchSharedPermsAppOnSD_NoPerms() 1082f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet throws IOException, InterruptedException, InstallException, TimeoutException, 1083f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet AdbCommandRejectedException, ShellCommandUnresponsiveException { 1084b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test launching an app with no explicit perms set, installed on SD card"); 1085b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1086b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 1087b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // Make sure the 2 shared apps with needed permissions are not installed... 1088b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(SHARED_PERMS_FL_PKG); 1089b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(SHARED_PERMS_BT_PKG); 1090b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1091b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // now install the app and see if when we launch it we get a permissions error 1092b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 1093b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen SHARED_PERMS_APK), SHARED_PERMS_PKG, false); 1094b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1095b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen boolean testsPassed = mPMHostUtils.runDeviceTestsDidAllTestsPass(SHARED_PERMS_PKG); 1096b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen assertEquals("Shared perms app should fail to run", false, testsPassed); 1097b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1098b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 1099b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 1100b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(SHARED_PERMS_PKG); 1101b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1102b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1103b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1104b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 1105b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that a shared app with no explicit permissions can run if its other 1106b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * shared apps are installed. 1107b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 1108b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 1109b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 1110f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 1111f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 1112f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 1113f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 1114f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 1115f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 1116b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 1117b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen public void testInstallAndLaunchSharedPermsAppOnSD_GrantedPerms() 1118f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet throws IOException, InterruptedException, InstallException, TimeoutException, 1119f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet AdbCommandRejectedException, ShellCommandUnresponsiveException { 1120b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test launching an app with no explicit perms set, installed on SD card"); 1121b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1122b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 1123b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // install the 2 shared apps with needed permissions first 1124b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 1125b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen SHARED_PERMS_FL_APK), SHARED_PERMS_FL_PKG, false); 1126b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 1127b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen SHARED_PERMS_BT_APK), SHARED_PERMS_BT_PKG, false); 1128b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1129b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // now install the test app and see if we can launch it without errors 1130b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 1131b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen SHARED_PERMS_APK), SHARED_PERMS_PKG, false); 1132b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen boolean testsPassed = mPMHostUtils.runDeviceTestsDidAllTestsPass(SHARED_PERMS_PKG); 1133b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen assert(testsPassed); 1134b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1135b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 1136b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 1137b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(SHARED_PERMS_PKG); 1138b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(SHARED_PERMS_BT_PKG); 1139b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(SHARED_PERMS_FL_PKG); 1140b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1141b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1142b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1143b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 1144b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that an app with ACCESS_FINE_LOCATION (GPS) permissions can 1145b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * run without permissions errors even after a reboot 1146b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 1147b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 1148b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 1149f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 1150f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 1151f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 1152f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 1153f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 1154f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 1155b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 1156b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen public void testInstallAndLaunchFLPermsAppOnSD_Reboot() 1157f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet throws IOException, InterruptedException, InstallException, TimeoutException, 1158f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet AdbCommandRejectedException, ShellCommandUnresponsiveException { 1159b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test launching an app with location perms set, installed on SD card"); 1160b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1161b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 1162b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // install the app and verify we can launch it without permissions errors 1163b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 1164b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen SHARED_PERMS_FL_APK), SHARED_PERMS_FL_PKG, false); 1165b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen boolean testsPassed = mPMHostUtils.runDeviceTestsDidAllTestsPass(SHARED_PERMS_FL_PKG); 1166b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen assert(testsPassed); 1167b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1168b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.rebootDevice(); 1169b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1170b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen testsPassed = mPMHostUtils.runDeviceTestsDidAllTestsPass(SHARED_PERMS_FL_PKG); 1171b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen assert(testsPassed); 1172b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1173b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 1174b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 1175b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(SHARED_PERMS_FL_PKG); 1176b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1177b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1178b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1179b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen /** 1180b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Regression test to verify that a shared app with no explicit permissions can run if its other 1181b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * shared apps are installed, even after a reboot. 1182b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * <p/> 1183b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * Assumes adb is running as root in device under test. 1184b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen * @throws InterruptedException if the thread was interrupted 1185f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws TimeoutException in case of a timeout on the connection. 1186f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws AdbCommandRejectedException if adb rejects the command 1187f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws ShellCommandUnresponsiveException if the device did not output anything for 1188f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * a period longer than the max time to output. 1189f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws IOException if connection to device was lost. 1190f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet * @throws InstallException if the install failed. 1191b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen */ 1192b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen public void testInstallAndLaunchSharedPermsAppOnSD_Reboot() 1193f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet throws IOException, InterruptedException, InstallException, TimeoutException, 1194f72181c60943dcfb642aac1dc5fa5416c1bb566eXavier Ducrohet AdbCommandRejectedException, ShellCommandUnresponsiveException { 1195b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen Log.i(LOG_TAG, "Test launching an app on SD, with no explicit perms set after reboot"); 1196b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1197b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen try { 1198b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // install the 2 shared apps with needed permissions first 1199b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 1200b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen SHARED_PERMS_FL_APK), SHARED_PERMS_FL_PKG, false); 1201b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 1202b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen SHARED_PERMS_BT_APK), SHARED_PERMS_BT_PKG, false); 1203b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1204b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // now install the test app and see if we can launch it without errors 1205b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.installAppAndVerifyExistsOnSDCard(getTestAppFilePath( 1206b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen SHARED_PERMS_APK), SHARED_PERMS_PKG, false); 1207b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen boolean testsPassed = mPMHostUtils.runDeviceTestsDidAllTestsPass(SHARED_PERMS_PKG); 1208b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen assert(testsPassed); 1209b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1210b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // reboot 1211b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.rebootDevice(); 1212b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen 1213b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // Verify we can still launch the app 1214b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen testsPassed = mPMHostUtils.runDeviceTestsDidAllTestsPass(SHARED_PERMS_PKG); 1215b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen assert(testsPassed); 1216b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1217b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen // cleanup test app 1218b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen finally { 1219b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(SHARED_PERMS_PKG); 1220b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(SHARED_PERMS_BT_PKG); 1221b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen mPMHostUtils.uninstallApp(SHARED_PERMS_FL_PKG); 1222b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1223b1fb5c301120389f0d16e8414ca813ef51f44089Neal Nguyen } 1224cb2003afee8d86683d06454ee384e539efcc9a13Brett Chabot} 1225