PackageManagerTests.java revision 5b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2
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
17afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapupackage com.android.unit_tests;
18afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
19b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.IMountService.Stub;
20b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
21afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.net.Uri;
22afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.FileUtils;
23afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
24afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport java.io.File;
25afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport java.io.FileInputStream;
26afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport java.io.FileNotFoundException;
27afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport java.io.FileOutputStream;
28afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport java.io.IOException;
29afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport java.io.InputStream;
30afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
31afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.app.PendingIntent;
32afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.BroadcastReceiver;
33afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.Context;
34afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.Intent;
35afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.IntentFilter;
36afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.ApplicationInfo;
37afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.IPackageDataObserver;
38afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.IPackageInstallObserver;
39b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapuimport android.content.pm.IPackageDeleteObserver;
40117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapuimport android.content.pm.PackageInfo;
41afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.PackageManager;
42afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.PackageParser;
43afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.PackageStats;
44afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.IPackageManager;
45afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.pm.PackageManager.NameNotFoundException;
46afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.res.Resources;
47afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.content.res.Resources.NotFoundException;
48afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.test.AndroidTestCase;
49afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.test.suitebuilder.annotation.LargeTest;
50afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.test.suitebuilder.annotation.MediumTest;
51afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.test.suitebuilder.annotation.SmallTest;
52afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.test.suitebuilder.annotation.Suppress;
53afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.util.DisplayMetrics;
54afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.util.Log;
55afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.Environment;
56afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.Handler;
57b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapuimport android.os.IBinder;
58b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.IMountService;
59b104340496e3a531e26c8f428c808eca0e039f50San Mehatimport android.os.storage.StorageResultCode;
60afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.RemoteException;
61afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.ServiceManager;
62afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapuimport android.os.StatFs;
63117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapuimport android.provider.Settings;
64afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
65afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapupublic class PackageManagerTests extends AndroidTestCase {
66b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    private static final boolean localLOGV = true;
67afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    public static final String TAG="PackageManagerTests";
68b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    public final long MAX_WAIT_TIME=120*1000;
69b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    public final long WAIT_TIME_INCR=20*1000;
70b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
71b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    void failStr(String errMsg) {
72b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        Log.w(TAG, "errMsg="+errMsg);
73b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        fail(errMsg);
74b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
75b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    void failStr(Exception e) {
76b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        Log.w(TAG, "e.getMessage="+e.getMessage());
77b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        Log.w(TAG, "e="+e);
78b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
79afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
80afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    @Override
81afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    protected void setUp() throws Exception {
82afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        super.setUp();
83afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
84afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
85afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    private class PackageInstallObserver extends IPackageInstallObserver.Stub {
86afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        public int returnCode;
87afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        private boolean doneFlag = false;
88afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
89afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        public void packageInstalled(String packageName, int returnCode) {
90afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            synchronized(this) {
91afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                this.returnCode = returnCode;
92afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                doneFlag = true;
93afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                notifyAll();
94afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            }
95afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
96afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
97afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        public boolean isDone() {
98afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            return doneFlag;
99afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
100afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
101afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
102afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    abstract class GenericReceiver extends BroadcastReceiver {
103afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        private boolean doneFlag = false;
104afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        boolean received = false;
105afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        Intent intent;
106afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        IntentFilter filter;
107afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        abstract boolean notifyNow(Intent intent);
108afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        @Override
109afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        public void onReceive(Context context, Intent intent) {
110afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            if (notifyNow(intent)) {
111afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                synchronized (this) {
112afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    received = true;
113afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    doneFlag = true;
114afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    this.intent = intent;
115afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    notifyAll();
116afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                }
117afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            }
118afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
119afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
120afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        public boolean isDone() {
121afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            return doneFlag;
122afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
123afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
124afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        public void setFilter(IntentFilter filter) {
125afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            this.filter = filter;
126afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
127afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
128afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
129afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    class InstallReceiver extends GenericReceiver {
130afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        String pkgName;
131afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
132afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        InstallReceiver(String pkgName) {
133afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            this.pkgName = pkgName;
134afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
135afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            filter.addDataScheme("package");
136afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            super.setFilter(filter);
137afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
138afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
139afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        public boolean notifyNow(Intent intent) {
140afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            String action = intent.getAction();
141afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            if (!Intent.ACTION_PACKAGE_ADDED.equals(action)) {
142afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                return false;
143afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            }
144afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            Uri data = intent.getData();
145afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            String installedPkg = data.getEncodedSchemeSpecificPart();
146afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            if (pkgName.equals(installedPkg)) {
147afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                return true;
148afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            }
149afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            return false;
150afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
151afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
152afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
153afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    PackageManager getPm() {
154afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        return mContext.getPackageManager();
155afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
156afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
157afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    public boolean invokeInstallPackage(Uri packageURI, int flags,
158afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            final String pkgName, GenericReceiver receiver) throws Exception {
159afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        PackageInstallObserver observer = new PackageInstallObserver();
160afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        final boolean received = false;
161afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        mContext.registerReceiver(receiver, receiver.filter);
162afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        try {
163afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            // Wait on observer
164afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            synchronized(observer) {
165b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                synchronized (receiver) {
166afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    getPm().installPackage(packageURI, observer, flags, null);
167afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    long waitTime = 0;
168afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
169afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                        observer.wait(WAIT_TIME_INCR);
170afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                        waitTime += WAIT_TIME_INCR;
171afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    }
172afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    if(!observer.isDone()) {
173afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                        throw new Exception("Timed out waiting for packageInstalled callback");
174afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    }
175afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    if (observer.returnCode != PackageManager.INSTALL_SUCCEEDED) {
176afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                        return false;
177afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    }
178afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    // Verify we received the broadcast
179afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    waitTime = 0;
180afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
181afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                        receiver.wait(WAIT_TIME_INCR);
182afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                        waitTime += WAIT_TIME_INCR;
183afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    }
184afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    if(!receiver.isDone()) {
185afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                        throw new Exception("Timed out waiting for PACKAGE_ADDED notification");
186afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    }
187afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    return receiver.received;
188afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                }
189afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            }
190afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        } finally {
191afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            mContext.unregisterReceiver(receiver);
192afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
193afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
194afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
1955b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    public boolean invokeInstallPackageFail(Uri packageURI, int flags,
1965b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu            final String pkgName, int result) throws Exception {
1975b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        PackageInstallObserver observer = new PackageInstallObserver();
1985b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        try {
1995b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu            // Wait on observer
2005b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu            synchronized(observer) {
2015b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                getPm().installPackage(packageURI, observer, flags, null);
2025b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                long waitTime = 0;
2035b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
2045b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                    observer.wait(WAIT_TIME_INCR);
2055b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                    waitTime += WAIT_TIME_INCR;
2065b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                }
2075b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                if(!observer.isDone()) {
2085b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                    throw new Exception("Timed out waiting for packageInstalled callback");
2095b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                }
2105b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                return (observer.returnCode == result);
2115b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu            }
2125b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        } finally {
2135b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        }
2145b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    }
2155b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu
216afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    Uri getInstallablePackage(int fileResId, File outFile) {
217afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        Resources res = mContext.getResources();
218afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        InputStream is = null;
219afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        try {
220afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            is = res.openRawResource(fileResId);
221afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        } catch (NotFoundException e) {
222afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            failStr("Failed to load resource with id: " + fileResId);
223afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
224afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        FileUtils.setPermissions(outFile.getPath(),
225afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IRWXO,
226afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                -1, -1);
227afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        assertTrue(FileUtils.copyToFile(is, outFile));
228afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        FileUtils.setPermissions(outFile.getPath(),
229afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IRWXO,
230afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                -1, -1);
231afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        return Uri.fromFile(outFile);
232afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
233afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
234afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    private PackageParser.Package parsePackage(Uri packageURI) {
235afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        final String archiveFilePath = packageURI.getPath();
236afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        PackageParser packageParser = new PackageParser(archiveFilePath);
237afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        File sourceFile = new File(archiveFilePath);
238afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        DisplayMetrics metrics = new DisplayMetrics();
239afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        metrics.setToDefaults();
240afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        return packageParser.parsePackage(sourceFile, archiveFilePath, metrics, 0);
241afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
242afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
243afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    private void assertInstall(String pkgName, int flags) {
244afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        try {
245afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        ApplicationInfo info = getPm().getApplicationInfo(pkgName, 0);
246afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        assertNotNull(info);
247afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        assertEquals(pkgName, info.packageName);
248afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        File dataDir = Environment.getDataDirectory();
249afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        String appInstallPath = new File(dataDir, "app").getPath();
250afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        String drmInstallPath = new File(dataDir, "app-private").getPath();
251afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        File srcDir = new File(info.sourceDir);
252afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        String srcPath = srcDir.getParent();
253afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        File publicSrcDir = new File(info.publicSourceDir);
254afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        String publicSrcPath = publicSrcDir.getParent();
255afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
256afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) {
257afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            assertTrue((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0);
258afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            assertEquals(srcPath, drmInstallPath);
259afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            assertEquals(publicSrcPath, appInstallPath);
260afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        } else {
261afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            assertFalse((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0);
2625b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu            if ((flags & PackageManager.INSTALL_EXTERNAL) != 0) {
263afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                assertTrue((info.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0);
264afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                // Hardcoded for now
265afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                assertTrue(srcPath.startsWith("/asec"));
266afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                assertTrue(publicSrcPath.startsWith("/asec"));
267afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            } else {
268afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                assertEquals(srcPath, appInstallPath);
269afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                assertEquals(publicSrcPath, appInstallPath);
270afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                assertFalse((info.flags & ApplicationInfo.FLAG_ON_SDCARD) != 0);
271afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            }
272afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
273afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        } catch (NameNotFoundException e) {
274afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            failStr("failed with exception : " + e);
275afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
276afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
2775b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    private void assertNotInstalled(String pkgName) {
2785b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        try {
2795b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu            ApplicationInfo info = getPm().getApplicationInfo(pkgName, 0);
2805b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu            fail(pkgName + " shouldnt be installed");
2815b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        } catch (NameNotFoundException e) {
2825b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        }
2835b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    }
284afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
285afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    class InstallParams {
286afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        String outFileName;
287afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        Uri packageURI;
288afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        PackageParser.Package pkg;
289afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        InstallParams(PackageParser.Package pkg, String outFileName, Uri packageURI) {
290afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            this.outFileName = outFileName;
291afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            this.packageURI = packageURI;
292afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            this.pkg = pkg;
293afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
294afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
295afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
2965b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    private InstallParams sampleInstallFromRawResource(int flags, boolean cleanUp) {
2975b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        return installFromRawResource("install.apk", R.raw.install, flags, cleanUp,
2985b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                false, -1);
2995b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    }
300afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    /*
301afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu     * Utility function that reads a apk bundled as a raw resource
302afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu     * copies it into own data directory and invokes
303afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu     * PackageManager api to install it.
304afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu     */
3055b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    private InstallParams installFromRawResource(String outFileName,
3065b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu            int rawResId, int flags, boolean cleanUp, boolean fail, int result) {
307afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        File filesDir = mContext.getFilesDir();
308afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        File outFile = new File(filesDir, outFileName);
3095b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        Uri packageURI = getInstallablePackage(rawResId, outFile);
310afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        PackageParser.Package pkg = parsePackage(packageURI);
311afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        assertNotNull(pkg);
312b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        InstallParams ip = null;
313afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        try {
314afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            try {
3155b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                if (fail) {
3165b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                    // Make sure it doesn't exist
3175b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                    getPm().deletePackage(pkg.packageName, null, 0);
3185b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                    assertTrue(invokeInstallPackageFail(packageURI, flags,
3195b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                            pkg.packageName, result));
3205b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                    assertNotInstalled(pkg.packageName);
3215b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                } else {
3225b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                    InstallReceiver receiver = new InstallReceiver(pkg.packageName);
3235b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                    assertTrue(invokeInstallPackage(packageURI, flags,
3245b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                            pkg.packageName, receiver));
3255b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                    // Verify installed information
3265b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                    assertInstall(pkg.packageName, flags);
3275b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                    ip = new InstallParams(pkg, outFileName, packageURI);
3285b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                }
329afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            } catch (Exception e) {
330afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                failStr("Failed with exception : " + e);
331afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            }
332b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            return ip;
333afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        } finally {
334afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            if (cleanUp) {
335b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                cleanUpInstall(ip);
336afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            }
337afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
338afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
339afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
340afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    @MediumTest
341afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    public void testInstallNormalInternal() {
3425b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        sampleInstallFromRawResource(0, true);
343afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
344afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
345afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    @MediumTest
346afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    public void testInstallFwdLockedInternal() {
3475b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true);
348afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
349afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
350afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    @MediumTest
351afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    public void testInstallSdcard() {
3525b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, true);
353afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
354afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
355afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    /* ------------------------- Test replacing packages --------------*/
356afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    class ReplaceReceiver extends GenericReceiver {
357afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        String pkgName;
358b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        final static int INVALID = -1;
359b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        final static int REMOVED = 1;
360b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        final static int ADDED = 2;
361b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        final static int REPLACED = 3;
362b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        int removed = INVALID;
363b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        // for updated system apps only
364b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        boolean update = false;
365afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
366afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        ReplaceReceiver(String pkgName) {
367afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            this.pkgName = pkgName;
368afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED);
369b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            filter.addAction(Intent.ACTION_PACKAGE_ADDED);
370b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            if (update) {
371b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
372b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
373b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            filter.addDataScheme("package");
374afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            super.setFilter(filter);
375afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
376afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
377afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        public boolean notifyNow(Intent intent) {
378afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            String action = intent.getAction();
379b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            Uri data = intent.getData();
380b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            String installedPkg = data.getEncodedSchemeSpecificPart();
381b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            if (pkgName == null || !pkgName.equals(installedPkg)) {
382b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                return false;
383b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
384b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
385b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                removed = REMOVED;
386b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            } else if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
387b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                if (removed != REMOVED) {
388b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    return false;
389b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                }
390b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
391b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                if (!replacing) {
392b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    return false;
393b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                }
394b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                removed = ADDED;
395b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                if (!update) {
396b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    return true;
397afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                }
398b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            } else if (Intent.ACTION_PACKAGE_REPLACED.equals(action)) {
399b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                if (removed != ADDED) {
400b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    return false;
401b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                }
402b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                removed = REPLACED;
403b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                return true;
404afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            }
405afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            return false;
406afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
407afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
408afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
409afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    /*
410afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu     * Utility function that reads a apk bundled as a raw resource
411afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu     * copies it into own data directory and invokes
412afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu     * PackageManager api to install first and then replace it
413afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu     * again.
414afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu     */
415afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    public void replaceFromRawResource(int flags) {
4165b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        InstallParams ip = sampleInstallFromRawResource(flags, false);
417b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        boolean replace = ((flags & PackageManager.INSTALL_REPLACE_EXISTING) != 0);
418afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        GenericReceiver receiver;
419b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        if (replace) {
420afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            receiver = new ReplaceReceiver(ip.pkg.packageName);
421b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            Log.i(TAG, "Creating replaceReceiver");
422afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        } else {
423afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            receiver = new InstallReceiver(ip.pkg.packageName);
424afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
425afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        try {
426afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            try {
427afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                assertEquals(invokeInstallPackage(ip.packageURI, flags,
428b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                        ip.pkg.packageName, receiver), replace);
429b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                if (replace) {
430afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                    assertInstall(ip.pkg.packageName, flags);
431afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                }
432afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            } catch (Exception e) {
433afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu                failStr("Failed with exception : " + e);
434afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu            }
435afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        } finally {
436b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            cleanUpInstall(ip);
437afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        }
438afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
439afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
440afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    @MediumTest
441afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    public void testReplaceFailNormalInternal() {
442afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        replaceFromRawResource(0);
443afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
444afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
445afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    @MediumTest
446afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    public void testReplaceFailFwdLockedInternal() {
447afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu        replaceFromRawResource(PackageManager.INSTALL_FORWARD_LOCK);
448afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
449afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
450afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    @MediumTest
451afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    public void testReplaceFailSdcard() {
4525b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        replaceFromRawResource(PackageManager.INSTALL_EXTERNAL);
453afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
454afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu
455b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    @MediumTest
456b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    public void testReplaceNormalInternal() {
457b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        replaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING);
458afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
459b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
460b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    @MediumTest
461b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    public void testReplaceFwdLockedInternal() {
462b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        replaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING |
463b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                PackageManager.INSTALL_FORWARD_LOCK);
464b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
465b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
466b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    @MediumTest
467b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    public void testReplaceSdcard() {
468b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        replaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING |
4695b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                PackageManager.INSTALL_EXTERNAL);
470b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
471b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
472b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    /* -------------- Delete tests ---*/
473b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    class DeleteObserver extends IPackageDeleteObserver.Stub {
474b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
475b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        public boolean succeeded;
476b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        private boolean doneFlag = false;
477b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
478b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        public boolean isDone() {
479b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            return doneFlag;
480b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
481b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
482b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        public void packageDeleted(boolean succeeded) throws RemoteException {
483b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            synchronized(this) {
484b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                this.succeeded = succeeded;
485b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                doneFlag = true;
486b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                notifyAll();
487b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
488b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
489b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
490b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
491b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    class DeleteReceiver extends GenericReceiver {
492b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        String pkgName;
493b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
494b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        DeleteReceiver(String pkgName) {
495b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            this.pkgName = pkgName;
496b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED);
497b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            filter.addDataScheme("package");
498b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            super.setFilter(filter);
499b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
500b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
501b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        public boolean notifyNow(Intent intent) {
502b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            String action = intent.getAction();
503b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            if (!Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
504b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                return false;
505b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
506b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            Uri data = intent.getData();
507b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            String installedPkg = data.getEncodedSchemeSpecificPart();
508b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            if (pkgName.equals(installedPkg)) {
509b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                return true;
510b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
511b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            return false;
512b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
513b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
514b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
515b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    public boolean invokeDeletePackage(Uri packageURI, int flags,
516b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            final String pkgName, GenericReceiver receiver) throws Exception {
517b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        DeleteObserver observer = new DeleteObserver();
518b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        final boolean received = false;
519b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        mContext.registerReceiver(receiver, receiver.filter);
520b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        try {
521b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            // Wait on observer
522b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            synchronized(observer) {
523b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                synchronized (receiver) {
524b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    getPm().deletePackage(pkgName, observer, flags);
525b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    long waitTime = 0;
526b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
527b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                        observer.wait(WAIT_TIME_INCR);
528b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                        waitTime += WAIT_TIME_INCR;
529b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    }
530b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    if(!observer.isDone()) {
531b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                        throw new Exception("Timed out waiting for packageInstalled callback");
532b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    }
533b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    // Verify we received the broadcast
534b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    waitTime = 0;
535b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
536b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                        receiver.wait(WAIT_TIME_INCR);
537b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                        waitTime += WAIT_TIME_INCR;
538b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    }
539b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    if(!receiver.isDone()) {
540b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                        throw new Exception("Timed out waiting for PACKAGE_ADDED notification");
541b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    }
542b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    return receiver.received;
543b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                }
544b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
545b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        } finally {
546b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            mContext.unregisterReceiver(receiver);
547b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
548b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
549b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
550b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    public void deleteFromRawResource(int iFlags, int dFlags) {
5515b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        InstallParams ip = sampleInstallFromRawResource(iFlags, false);
552b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        boolean retainData = ((dFlags & PackageManager.DONT_DELETE_DATA) != 0);
553b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        GenericReceiver receiver = new DeleteReceiver(ip.pkg.packageName);
554b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        DeleteObserver observer = new DeleteObserver();
555b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        try {
556b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            assertTrue(invokeDeletePackage(ip.packageURI, dFlags,
557b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    ip.pkg.packageName, receiver));
558b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            ApplicationInfo info = null;
559b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            Log.i(TAG, "okay4");
560b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            try {
561b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            info = getPm().getApplicationInfo(ip.pkg.packageName,
562b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    PackageManager.GET_UNINSTALLED_PACKAGES);
563b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            } catch (NameNotFoundException e) {
564b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                info = null;
565b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
566b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            if (retainData) {
567b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                assertNotNull(info);
568b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                assertEquals(info.packageName, ip.pkg.packageName);
569b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                File file = new File(info.dataDir);
570b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                assertTrue(file.exists());
571b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            } else {
572b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                assertNull(info);
573b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
574b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        } catch (Exception e) {
575b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            failStr(e);
576b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        } finally {
577b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            cleanUpInstall(ip);
578b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
579b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
580b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
581b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    @MediumTest
582b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    public void testDeleteNormalInternal() {
583b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        deleteFromRawResource(0, 0);
584b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
585b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
586b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    @MediumTest
587b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    public void testDeleteFwdLockedInternal() {
588b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, 0);
589b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
590b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
591b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    @MediumTest
592b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    public void testDeleteSdcard() {
5935b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        deleteFromRawResource(PackageManager.INSTALL_EXTERNAL, 0);
594b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
595b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
596b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    @MediumTest
597b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    public void testDeleteNormalInternalRetainData() {
598b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        deleteFromRawResource(0, PackageManager.DONT_DELETE_DATA);
599b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
600b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
601b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    @MediumTest
602b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    public void testDeleteFwdLockedInternalRetainData() {
603b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, PackageManager.DONT_DELETE_DATA);
604b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
605b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
606b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    @MediumTest
607b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    public void testDeleteSdcardRetainData() {
6085b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        deleteFromRawResource(PackageManager.INSTALL_EXTERNAL, PackageManager.DONT_DELETE_DATA);
609afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu    }
610b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
611b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    /* sdcard mount/unmount tests ******/
612b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
613b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    class SdMountReceiver extends GenericReceiver {
614b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        String pkgNames[];
615b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        boolean status = true;
616b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
617b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        SdMountReceiver(String[] pkgNames) {
618b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            this.pkgNames = pkgNames;
619b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            IntentFilter filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
620b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            super.setFilter(filter);
621b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
622b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
623b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        public boolean notifyNow(Intent intent) {
624b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            Log.i(TAG, "okay 1");
625b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            String action = intent.getAction();
626b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            if (!Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) {
627b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                return false;
628b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
629b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            String rpkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
630b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            for (String pkg : pkgNames) {
631b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                boolean found = false;
632b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                for (String rpkg : rpkgList) {
633b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    if (rpkg.equals(pkg)) {
634b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                        found = true;
635b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                        break;
636b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    }
637b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                }
638b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                if (!found) {
639b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    status = false;
640b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    return true;
641b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                }
642b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
643b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            return true;
644b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
645b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
646b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
647b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    class SdUnMountReceiver extends GenericReceiver {
648b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        String pkgNames[];
649b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        boolean status = true;
650b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
651b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        SdUnMountReceiver(String[] pkgNames) {
652b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            this.pkgNames = pkgNames;
653b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            IntentFilter filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
654b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            super.setFilter(filter);
655b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
656b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
657b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        public boolean notifyNow(Intent intent) {
658b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            String action = intent.getAction();
659b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            if (!Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
660b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                return false;
661b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
662b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            String rpkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
663b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            for (String pkg : pkgNames) {
664b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                boolean found = false;
665b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                for (String rpkg : rpkgList) {
666b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    if (rpkg.equals(pkg)) {
667b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                        found = true;
668b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                        break;
669b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    }
670b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                }
671b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                if (!found) {
672b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    status = false;
673b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    return true;
674b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                }
675b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
676b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            return true;
677b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
678b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
679b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
680b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    IMountService getMs() {
681b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        IBinder service = ServiceManager.getService("mount");
682b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        if (service != null) {
683b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            return IMountService.Stub.asInterface(service);
684b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        } else {
685b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            Log.e(TAG, "Can't get mount service");
686b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
687b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        return null;
688b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
689b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
690b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    boolean getMediaState() {
691b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        try {
692b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        String mPath = Environment.getExternalStorageDirectory().toString();
693b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        String state = getMs().getVolumeState(mPath);
694b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        return Environment.MEDIA_MOUNTED.equals(state);
695b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        } catch (RemoteException e) {
696b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            return false;
697b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
698b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
699b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
700b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    boolean mountMedia() {
701b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        if (getMediaState()) {
702b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            return true;
703b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
704b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        try {
705b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        String mPath = Environment.getExternalStorageDirectory().toString();
706b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        int ret = getMs().mountVolume(mPath);
707b104340496e3a531e26c8f428c808eca0e039f50San Mehat        return ret == StorageResultCode.OperationSucceeded;
708b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        } catch (RemoteException e) {
709b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            return false;
710b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
711b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
712b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
713b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    private boolean unmountMedia() {
714b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        if (!getMediaState()) {
715b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            return true;
716b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
717b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        try {
718b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        String mPath = Environment.getExternalStorageDirectory().toString();
719b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        int ret = getMs().unmountVolume(mPath);
720b104340496e3a531e26c8f428c808eca0e039f50San Mehat        return ret == StorageResultCode.OperationSucceeded;
721b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        } catch (RemoteException e) {
722b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            return true;
723b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
724b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
725b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
726b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    /*
727b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu     * Install package on sdcard. Unmount and then mount the media.
728b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu     * (Use PackageManagerService private api for now)
729b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu     * Make sure the installed package is available.
730b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu     * STOPSHIP will uncomment when MountService api's to mount/unmount
731b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu     * are made asynchronous.
732b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu     */
733b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    public void xxxtestMountSdNormalInternal() {
734b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        assertTrue(mountFromRawResource());
735b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
736b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
737b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    private boolean mountFromRawResource() {
738b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        // Install pkg on sdcard
7395b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        InstallParams ip = sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL |
740b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                PackageManager.INSTALL_REPLACE_EXISTING, false);
741b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        if (localLOGV) Log.i(TAG, "Installed pkg on sdcard");
742b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        boolean origState = getMediaState();
743b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        SdMountReceiver receiver = new SdMountReceiver(new String[]{ip.pkg.packageName});
744b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        try {
745b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            if (localLOGV) Log.i(TAG, "Unmounting media");
746b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            // Unmount media
747b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            assertTrue(unmountMedia());
748b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            if (localLOGV) Log.i(TAG, "Unmounted media");
749b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            try {
750b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                if (localLOGV) Log.i(TAG, "Sleeping for 10 second");
751b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                Thread.sleep(10*1000);
752b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            } catch (InterruptedException e) {
753b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                failStr(e);
754b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
755b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            // Register receiver here
756b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            PackageManager pm = getPm();
757b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            mContext.registerReceiver(receiver, receiver.filter);
758b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
759b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            // Wait on receiver
760b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            synchronized (receiver) {
761b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                if (localLOGV) Log.i(TAG, "Mounting media");
762b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                // Mount media again
763b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                assertTrue(mountMedia());
764b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                if (localLOGV) Log.i(TAG, "Mounted media");
765b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                if (localLOGV) Log.i(TAG, "Waiting for notification");
766b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                long waitTime = 0;
767b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                // Verify we received the broadcast
768b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                waitTime = 0;
769b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
770b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    receiver.wait(WAIT_TIME_INCR);
771b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    waitTime += WAIT_TIME_INCR;
772b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                }
773b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                if(!receiver.isDone()) {
774b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                    failStr("Timed out waiting for EXTERNAL_APPLICATIONS notification");
775b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                }
776b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                return receiver.received;
777b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
778b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        } catch (InterruptedException e) {
779b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            failStr(e);
780b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            return false;
781b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        } finally {
782b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            mContext.unregisterReceiver(receiver);
783b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            // Restore original media state
784b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            if (origState) {
785b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                mountMedia();
786b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            } else {
787b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu                unmountMedia();
788b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            }
789b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            if (localLOGV) Log.i(TAG, "Cleaning up install");
790b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            cleanUpInstall(ip);
791b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
792b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
793b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu
794b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    void cleanUpInstall(InstallParams ip) {
795b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        if (ip == null) {
796b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            return;
797b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
798b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        Runtime.getRuntime().gc();
799b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        Log.i(TAG, "Deleting package : " + ip.pkg.packageName);
800b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        getPm().deletePackage(ip.pkg.packageName, null, 0);
801b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        File outFile = new File(ip.outFileName);
802b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        if (outFile != null && outFile.exists()) {
803b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu            outFile.delete();
804b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu        }
805b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    }
806117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu
8075b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    public void testManifestInstallLocationInternal() {
8085b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        installFromRawResource("install.apk", R.raw.install_loc_internal,
8095b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                0, true, false, -1);
810117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu    }
811117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu
8125b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    public void testManifestInstallLocationSdcard() {
8135b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        installFromRawResource("install.apk", R.raw.install_loc_sdcard,
8145b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                PackageManager.INSTALL_EXTERNAL, true, false, -1);
815117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu    }
816117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu
8175b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    public void testManifestInstallLocationAuto() {
8185b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        installFromRawResource("install.apk", R.raw.install_loc_auto,
8195b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                0, true, false, -1);
820117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu    }
821117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu
8225b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    public void testManifestInstallLocationUnspecified() {
8235b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        installFromRawResource("install.apk", R.raw.install_loc_unspecified,
8245b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                0, true, false, -1);
825117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu    }
826117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu
8275b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu    public void testManifestInstallLocationFwdLockedSdcard() {
8285b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu        installFromRawResource("install.apk", R.raw.install_loc_sdcard,
8295b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                PackageManager.INSTALL_FORWARD_LOCK |
8305b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                PackageManager.INSTALL_EXTERNAL, true, true,
8315b993ce7bc29e43a3215a50ce6ce5d6550d4e5e2Suchi Amalapurapu                PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION);
832117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu    }
833b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu    /*
834b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu     * TODO's
835b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu     * check version numbers for upgrades
836b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu     * check permissions of installed packages
837b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu     * how to do tests on updated system apps?
838b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu     * verify updates to system apps cannot be installed on the sdcard.
839b56ae20b22fd7283df32072a431ab6d4965f3c1bSuchi Amalapurapu     */
840afbaaa189fbc18b3acbb06e03233cf3442f2b1c4Suchi Amalapurapu}
841