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