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