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