blob: b988920e041d233f76021a2a49edab63f531d48c [file] [log] [blame]
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -08001/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.unit_tests;
18
Suchi Amalapurapu089262d2010-03-10 14:19:21 -080019import com.android.internal.content.PackageHelper;
20
San Mehatb1043402010-02-05 08:26:50 -080021import android.os.storage.IMountService.Stub;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -080022
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080023import android.net.Uri;
24import android.os.FileUtils;
25
26import java.io.File;
27import java.io.FileInputStream;
28import java.io.FileNotFoundException;
29import java.io.FileOutputStream;
30import java.io.IOException;
31import java.io.InputStream;
32
33import android.app.PendingIntent;
34import android.content.BroadcastReceiver;
35import android.content.Context;
36import android.content.Intent;
37import android.content.IntentFilter;
38import android.content.pm.ApplicationInfo;
39import android.content.pm.IPackageDataObserver;
40import android.content.pm.IPackageInstallObserver;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -080041import android.content.pm.IPackageDeleteObserver;
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -080042import android.content.pm.IPackageMoveObserver;
Suchi Amalapurapu117818e2010-02-09 03:45:40 -080043import android.content.pm.PackageInfo;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080044import android.content.pm.PackageManager;
45import android.content.pm.PackageParser;
46import android.content.pm.PackageStats;
47import android.content.pm.IPackageManager;
48import android.content.pm.PackageManager.NameNotFoundException;
49import android.content.res.Resources;
50import android.content.res.Resources.NotFoundException;
51import android.test.AndroidTestCase;
52import android.test.suitebuilder.annotation.LargeTest;
53import android.test.suitebuilder.annotation.MediumTest;
54import android.test.suitebuilder.annotation.SmallTest;
55import android.test.suitebuilder.annotation.Suppress;
56import android.util.DisplayMetrics;
57import android.util.Log;
58import android.os.Environment;
59import android.os.Handler;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -080060import android.os.IBinder;
San Mehatb1043402010-02-05 08:26:50 -080061import android.os.storage.IMountService;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -080062import android.os.storage.IMountServiceListener;
63import android.os.storage.StorageEventListener;
64import android.os.storage.StorageManager;
San Mehatb1043402010-02-05 08:26:50 -080065import android.os.storage.StorageResultCode;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080066import android.os.RemoteException;
67import android.os.ServiceManager;
68import android.os.StatFs;
Suchi Amalapurapu117818e2010-02-09 03:45:40 -080069import android.provider.Settings;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -080070import android.provider.Settings.SettingNotFoundException;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080071
72public class PackageManagerTests extends AndroidTestCase {
Suchi Amalapurapub56ae202010-02-04 22:51:07 -080073 private static final boolean localLOGV = true;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080074 public static final String TAG="PackageManagerTests";
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -080075 public final long MAX_WAIT_TIME = 25*1000;
76 public final long WAIT_TIME_INCR = 5*1000;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -080077 private static final String SECURE_CONTAINERS_PREFIX = "/mnt/asec";
Suchi Amalapurapu089262d2010-03-10 14:19:21 -080078 private static final int APP_INSTALL_AUTO = PackageHelper.APP_INSTALL_AUTO;
79 private static final int APP_INSTALL_DEVICE = PackageHelper.APP_INSTALL_INTERNAL;
80 private static final int APP_INSTALL_SDCARD = PackageHelper.APP_INSTALL_EXTERNAL;
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -070081 private boolean mOrigState;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -080082
83 void failStr(String errMsg) {
84 Log.w(TAG, "errMsg="+errMsg);
85 fail(errMsg);
86 }
87 void failStr(Exception e) {
88 Log.w(TAG, "e.getMessage="+e.getMessage());
89 Log.w(TAG, "e="+e);
90 }
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080091
92 @Override
93 protected void setUp() throws Exception {
94 super.setUp();
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -070095 mOrigState = getMediaState();
96 }
97
98 @Override
99 protected void tearDown() throws Exception {
100 // Restore media state.
101 boolean newState = getMediaState();
102 if (newState != mOrigState) {
103 if (mOrigState) {
104 getMs().mountVolume(Environment.getExternalStorageDirectory().getPath());
105 } else {
106 getMs().unmountVolume(Environment.getExternalStorageDirectory().getPath(), true);
107 }
108 }
109 super.tearDown();
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800110 }
111
112 private class PackageInstallObserver extends IPackageInstallObserver.Stub {
113 public int returnCode;
114 private boolean doneFlag = false;
115
116 public void packageInstalled(String packageName, int returnCode) {
117 synchronized(this) {
118 this.returnCode = returnCode;
119 doneFlag = true;
120 notifyAll();
121 }
122 }
123
124 public boolean isDone() {
125 return doneFlag;
126 }
127 }
128
129 abstract class GenericReceiver extends BroadcastReceiver {
130 private boolean doneFlag = false;
131 boolean received = false;
132 Intent intent;
133 IntentFilter filter;
134 abstract boolean notifyNow(Intent intent);
135 @Override
136 public void onReceive(Context context, Intent intent) {
137 if (notifyNow(intent)) {
138 synchronized (this) {
139 received = true;
140 doneFlag = true;
141 this.intent = intent;
142 notifyAll();
143 }
144 }
145 }
146
147 public boolean isDone() {
148 return doneFlag;
149 }
150
151 public void setFilter(IntentFilter filter) {
152 this.filter = filter;
153 }
154 }
155
156 class InstallReceiver extends GenericReceiver {
157 String pkgName;
158
159 InstallReceiver(String pkgName) {
160 this.pkgName = pkgName;
161 IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
162 filter.addDataScheme("package");
163 super.setFilter(filter);
164 }
165
166 public boolean notifyNow(Intent intent) {
167 String action = intent.getAction();
168 if (!Intent.ACTION_PACKAGE_ADDED.equals(action)) {
169 return false;
170 }
171 Uri data = intent.getData();
172 String installedPkg = data.getEncodedSchemeSpecificPart();
173 if (pkgName.equals(installedPkg)) {
174 return true;
175 }
176 return false;
177 }
178 }
179
180 PackageManager getPm() {
181 return mContext.getPackageManager();
182 }
183
184 public boolean invokeInstallPackage(Uri packageURI, int flags,
185 final String pkgName, GenericReceiver receiver) throws Exception {
186 PackageInstallObserver observer = new PackageInstallObserver();
187 final boolean received = false;
188 mContext.registerReceiver(receiver, receiver.filter);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -0800189 final boolean DEBUG = true;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800190 try {
191 // Wait on observer
192 synchronized(observer) {
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800193 synchronized (receiver) {
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800194 getPm().installPackage(packageURI, observer, flags, null);
195 long waitTime = 0;
196 while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
197 observer.wait(WAIT_TIME_INCR);
198 waitTime += WAIT_TIME_INCR;
199 }
200 if(!observer.isDone()) {
201 throw new Exception("Timed out waiting for packageInstalled callback");
202 }
203 if (observer.returnCode != PackageManager.INSTALL_SUCCEEDED) {
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -0800204 Log.i(TAG, "Failed to install with error code = " + observer.returnCode);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800205 return false;
206 }
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800207 // Verify we received the broadcast
208 waitTime = 0;
209 while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
210 receiver.wait(WAIT_TIME_INCR);
211 waitTime += WAIT_TIME_INCR;
212 }
213 if(!receiver.isDone()) {
214 throw new Exception("Timed out waiting for PACKAGE_ADDED notification");
215 }
216 return receiver.received;
217 }
218 }
219 } finally {
220 mContext.unregisterReceiver(receiver);
221 }
222 }
223
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800224 public boolean invokeInstallPackageFail(Uri packageURI, int flags,
225 final String pkgName, int result) throws Exception {
226 PackageInstallObserver observer = new PackageInstallObserver();
227 try {
228 // Wait on observer
229 synchronized(observer) {
230 getPm().installPackage(packageURI, observer, flags, null);
231 long waitTime = 0;
232 while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
233 observer.wait(WAIT_TIME_INCR);
234 waitTime += WAIT_TIME_INCR;
235 }
236 if(!observer.isDone()) {
237 throw new Exception("Timed out waiting for packageInstalled callback");
238 }
239 return (observer.returnCode == result);
240 }
241 } finally {
242 }
243 }
244
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800245 Uri getInstallablePackage(int fileResId, File outFile) {
246 Resources res = mContext.getResources();
247 InputStream is = null;
248 try {
249 is = res.openRawResource(fileResId);
250 } catch (NotFoundException e) {
251 failStr("Failed to load resource with id: " + fileResId);
252 }
253 FileUtils.setPermissions(outFile.getPath(),
254 FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IRWXO,
255 -1, -1);
256 assertTrue(FileUtils.copyToFile(is, outFile));
257 FileUtils.setPermissions(outFile.getPath(),
258 FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IRWXO,
259 -1, -1);
260 return Uri.fromFile(outFile);
261 }
262
263 private PackageParser.Package parsePackage(Uri packageURI) {
264 final String archiveFilePath = packageURI.getPath();
265 PackageParser packageParser = new PackageParser(archiveFilePath);
266 File sourceFile = new File(archiveFilePath);
267 DisplayMetrics metrics = new DisplayMetrics();
268 metrics.setToDefaults();
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -0800269 PackageParser.Package pkg = packageParser.parsePackage(sourceFile, archiveFilePath, metrics, 0);
270 packageParser = null;
271 return pkg;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800272 }
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700273 private boolean checkSd(long pkgLen) {
274 String status = Environment.getExternalStorageState();
275 if (!status.equals(Environment.MEDIA_MOUNTED)) {
276 return false;
277 }
278 long sdSize = -1;
279 StatFs sdStats = new StatFs(
280 Environment.getExternalStorageDirectory().getPath());
281 sdSize = (long)sdStats.getAvailableBlocks() *
282 (long)sdStats.getBlockSize();
283 // TODO check for thesholds here
284 return pkgLen <= sdSize;
285
286 }
287 private boolean checkInt(long pkgLen) {
288 StatFs intStats = new StatFs(Environment.getDataDirectory().getPath());
289 long intSize = (long)intStats.getBlockCount() *
290 (long)intStats.getBlockSize();
291 long iSize = (long)intStats.getAvailableBlocks() *
292 (long)intStats.getBlockSize();
293 // TODO check for thresholds here?
294 return pkgLen <= iSize;
295 }
296 private static final int INSTALL_LOC_INT = 1;
297 private static final int INSTALL_LOC_SD = 2;
298 private static final int INSTALL_LOC_ERR = -1;
299 private int getInstallLoc(int flags, int expInstallLocation, long pkgLen) {
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800300 // Flags explicitly over ride everything else.
301 if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0 ) {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700302 return INSTALL_LOC_INT;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800303 } else if ((flags & PackageManager.INSTALL_EXTERNAL) != 0 ) {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700304 return INSTALL_LOC_SD;
305 } else if ((flags & PackageManager.INSTALL_INTERNAL) != 0) {
306 return INSTALL_LOC_INT;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800307 }
308 // Manifest option takes precedence next
309 if (expInstallLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL) {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700310 // TODO fitsonSd check
311 if (checkSd(pkgLen)) {
312 return INSTALL_LOC_SD;
313 }
314 if (checkInt(pkgLen)) {
315 return INSTALL_LOC_INT;
316 }
317 return INSTALL_LOC_ERR;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800318 }
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -0800319 if (expInstallLocation == PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700320 if (checkInt(pkgLen)) {
321 return INSTALL_LOC_INT;
322 }
323 return INSTALL_LOC_ERR;
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -0800324 }
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700325 if (expInstallLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
326 // Check for free memory internally
327 if (checkInt(pkgLen)) {
328 return INSTALL_LOC_INT;
329 }
330 // Check for free memory externally
331 if (checkSd(pkgLen)) {
332 return INSTALL_LOC_SD;
333 }
334 return INSTALL_LOC_ERR;
335 }
336 // Check for settings preference.
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800337 boolean checkSd = false;
338 int setLoc = 0;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800339 try {
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800340 setLoc = Settings.System.getInt(mContext.getContentResolver(), Settings.System.SET_INSTALL_LOCATION);
341 } catch (SettingNotFoundException e) {
342 failStr(e);
343 }
344 if (setLoc == 1) {
345 int userPref = APP_INSTALL_AUTO;
346 try {
347 userPref = Settings.System.getInt(mContext.getContentResolver(), Settings.System.DEFAULT_INSTALL_LOCATION);
348 } catch (SettingNotFoundException e) {
349 failStr(e);
350 }
351 if (userPref == APP_INSTALL_DEVICE) {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700352 if (checkInt(pkgLen)) {
353 return INSTALL_LOC_INT;
354 }
355 return INSTALL_LOC_ERR;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800356 } else if (userPref == APP_INSTALL_SDCARD) {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700357 if (checkSd(pkgLen)) {
358 return INSTALL_LOC_SD;
359 }
360 return INSTALL_LOC_ERR;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800361 } else if (userPref == APP_INSTALL_AUTO) {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700362 if (checkInt(pkgLen)) {
363 return INSTALL_LOC_INT;
364 }
365 // Check for free memory externally
366 if (checkSd(pkgLen)) {
367 return INSTALL_LOC_SD;
368 }
369 return INSTALL_LOC_ERR;
370
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800371 }
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700372 }
373 return INSTALL_LOC_ERR;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800374 }
375 private void assertInstall(PackageParser.Package pkg, int flags, int expInstallLocation) {
376 try {
377 String pkgName = pkg.packageName;
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700378 ApplicationInfo info = getPm().getApplicationInfo(pkgName, 0);
379 assertNotNull(info);
380 assertEquals(pkgName, info.packageName);
381 File dataDir = Environment.getDataDirectory();
382 String appInstallPath = new File(dataDir, "app").getPath();
383 String drmInstallPath = new File(dataDir, "app-private").getPath();
384 File srcDir = new File(info.sourceDir);
385 String srcPath = srcDir.getParent();
386 File publicSrcDir = new File(info.publicSourceDir);
387 String publicSrcPath = publicSrcDir.getParent();
388 long pkgLen = new File(info.sourceDir).length();
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800389
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700390 if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) {
391 assertTrue((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0);
392 assertEquals(srcPath, drmInstallPath);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800393 assertEquals(publicSrcPath, appInstallPath);
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800394 } else {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700395 assertFalse((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0);
396 int rLoc = getInstallLoc(flags, expInstallLocation, pkgLen);
397 if (rLoc == INSTALL_LOC_INT) {
398 assertEquals(srcPath, appInstallPath);
399 assertEquals(publicSrcPath, appInstallPath);
400 assertFalse((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
401 } else if (rLoc == INSTALL_LOC_SD){
402 assertTrue((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
403 assertTrue(srcPath.startsWith(SECURE_CONTAINERS_PREFIX));
404 assertTrue(publicSrcPath.startsWith(SECURE_CONTAINERS_PREFIX));
405 } else {
406 // TODO handle error. Install should have failed.
407 }
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800408 }
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800409 } catch (NameNotFoundException e) {
410 failStr("failed with exception : " + e);
411 }
412 }
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800413 private void assertNotInstalled(String pkgName) {
414 try {
415 ApplicationInfo info = getPm().getApplicationInfo(pkgName, 0);
416 fail(pkgName + " shouldnt be installed");
417 } catch (NameNotFoundException e) {
418 }
419 }
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800420
421 class InstallParams {
422 String outFileName;
423 Uri packageURI;
424 PackageParser.Package pkg;
425 InstallParams(PackageParser.Package pkg, String outFileName, Uri packageURI) {
426 this.outFileName = outFileName;
427 this.packageURI = packageURI;
428 this.pkg = pkg;
429 }
430 }
431
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800432 private InstallParams sampleInstallFromRawResource(int flags, boolean cleanUp) {
433 return installFromRawResource("install.apk", R.raw.install, flags, cleanUp,
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800434 false, -1, PackageInfo.INSTALL_LOCATION_AUTO);
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800435 }
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -0800436
437 public void clearSecureContainersForPkg(String pkgName) {
438 IMountService ms = getMs();
439 try {
440 String list[] = ms.getSecureContainerList();
441 if (list != null) {
442 for (String cid : list) {
443 boolean delete = false;
444 // STOPSHIP issues with rename should be fixed.
445 if (cid.contains(pkgName) ||
446 cid.contains("smdltmp")) {
447 Log.i(TAG, "Destroying container " + cid);
448 ms.destroySecureContainer(cid, true);
449 }
450 }
451 }
452 } catch (RemoteException e) {}
453 }
454
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800455 /*
456 * Utility function that reads a apk bundled as a raw resource
457 * copies it into own data directory and invokes
458 * PackageManager api to install it.
459 */
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800460 private InstallParams installFromRawResource(String outFileName,
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800461 int rawResId, int flags, boolean cleanUp, boolean fail, int result,
462 int expInstallLocation) {
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800463 PackageManager pm = mContext.getPackageManager();
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800464 File filesDir = mContext.getFilesDir();
465 File outFile = new File(filesDir, outFileName);
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800466 Uri packageURI = getInstallablePackage(rawResId, outFile);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800467 PackageParser.Package pkg = parsePackage(packageURI);
468 assertNotNull(pkg);
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800469 if ((flags & PackageManager.INSTALL_REPLACE_EXISTING) == 0) {
470 // Make sure the package doesn't exist
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800471 try {
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800472 ApplicationInfo appInfo = pm.getApplicationInfo(pkg.packageName,
473 PackageManager.GET_UNINSTALLED_PACKAGES);
474 GenericReceiver receiver = new DeleteReceiver(pkg.packageName);
475 invokeDeletePackage(packageURI, 0,
476 pkg.packageName, receiver);
477 } catch (NameNotFoundException e1) {
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800478 } catch (Exception e) {
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800479 failStr(e);
480 }
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800481 }
482 InstallParams ip = null;
483 try {
484 if (fail) {
485 assertTrue(invokeInstallPackageFail(packageURI, flags,
486 pkg.packageName, result));
487 assertNotInstalled(pkg.packageName);
488 } else {
489 InstallReceiver receiver = new InstallReceiver(pkg.packageName);
490 assertTrue(invokeInstallPackage(packageURI, flags,
491 pkg.packageName, receiver));
492 // Verify installed information
493 assertInstall(pkg, flags, expInstallLocation);
494 ip = new InstallParams(pkg, outFileName, packageURI);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800495 }
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800496 return ip;
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800497 } catch (Exception e) {
498 failStr("Failed with exception : " + e);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800499 } finally {
500 if (cleanUp) {
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -0800501 cleanUpInstall(ip);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800502 }
503 }
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800504 return ip;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800505 }
506
507 @MediumTest
508 public void testInstallNormalInternal() {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800509 sampleInstallFromRawResource(0, true);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800510 }
511
512 @MediumTest
513 public void testInstallFwdLockedInternal() {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800514 sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800515 }
516
517 @MediumTest
518 public void testInstallSdcard() {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800519 sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, true);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800520 }
521
522 /* ------------------------- Test replacing packages --------------*/
523 class ReplaceReceiver extends GenericReceiver {
524 String pkgName;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800525 final static int INVALID = -1;
526 final static int REMOVED = 1;
527 final static int ADDED = 2;
528 final static int REPLACED = 3;
529 int removed = INVALID;
530 // for updated system apps only
531 boolean update = false;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800532
533 ReplaceReceiver(String pkgName) {
534 this.pkgName = pkgName;
535 filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800536 filter.addAction(Intent.ACTION_PACKAGE_ADDED);
537 if (update) {
538 filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
539 }
540 filter.addDataScheme("package");
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800541 super.setFilter(filter);
542 }
543
544 public boolean notifyNow(Intent intent) {
545 String action = intent.getAction();
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800546 Uri data = intent.getData();
547 String installedPkg = data.getEncodedSchemeSpecificPart();
548 if (pkgName == null || !pkgName.equals(installedPkg)) {
549 return false;
550 }
551 if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
552 removed = REMOVED;
553 } else if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
554 if (removed != REMOVED) {
555 return false;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800556 }
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800557 boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
558 if (!replacing) {
559 return false;
560 }
561 removed = ADDED;
562 if (!update) {
563 return true;
564 }
565 } else if (Intent.ACTION_PACKAGE_REPLACED.equals(action)) {
566 if (removed != ADDED) {
567 return false;
568 }
569 removed = REPLACED;
570 return true;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800571 }
572 return false;
573 }
574 }
575
576 /*
577 * Utility function that reads a apk bundled as a raw resource
578 * copies it into own data directory and invokes
579 * PackageManager api to install first and then replace it
580 * again.
581 */
582 public void replaceFromRawResource(int flags) {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800583 InstallParams ip = sampleInstallFromRawResource(flags, false);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800584 boolean replace = ((flags & PackageManager.INSTALL_REPLACE_EXISTING) != 0);
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800585 Log.i(TAG, "replace=" + replace);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800586 GenericReceiver receiver;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800587 if (replace) {
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800588 receiver = new ReplaceReceiver(ip.pkg.packageName);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800589 Log.i(TAG, "Creating replaceReceiver");
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800590 } else {
591 receiver = new InstallReceiver(ip.pkg.packageName);
592 }
593 try {
594 try {
595 assertEquals(invokeInstallPackage(ip.packageURI, flags,
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800596 ip.pkg.packageName, receiver), replace);
597 if (replace) {
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800598 assertInstall(ip.pkg, flags, ip.pkg.installLocation);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800599 }
600 } catch (Exception e) {
601 failStr("Failed with exception : " + e);
602 }
603 } finally {
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800604 cleanUpInstall(ip);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800605 }
606 }
607
608 @MediumTest
609 public void testReplaceFailNormalInternal() {
610 replaceFromRawResource(0);
611 }
612
613 @MediumTest
614 public void testReplaceFailFwdLockedInternal() {
615 replaceFromRawResource(PackageManager.INSTALL_FORWARD_LOCK);
616 }
617
618 @MediumTest
619 public void testReplaceFailSdcard() {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800620 replaceFromRawResource(PackageManager.INSTALL_EXTERNAL);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800621 }
622
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800623 @MediumTest
624 public void testReplaceNormalInternal() {
625 replaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800626 }
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800627
628 @MediumTest
629 public void testReplaceFwdLockedInternal() {
630 replaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING |
631 PackageManager.INSTALL_FORWARD_LOCK);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800632 }
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800633
634 @MediumTest
635 public void testReplaceSdcard() {
636 replaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING |
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800637 PackageManager.INSTALL_EXTERNAL);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800638 }
639
640 /* -------------- Delete tests ---*/
641 class DeleteObserver extends IPackageDeleteObserver.Stub {
642
643 public boolean succeeded;
644 private boolean doneFlag = false;
645
646 public boolean isDone() {
647 return doneFlag;
648 }
649
650 public void packageDeleted(boolean succeeded) throws RemoteException {
651 synchronized(this) {
652 this.succeeded = succeeded;
653 doneFlag = true;
654 notifyAll();
655 }
656 }
657 }
658
659 class DeleteReceiver extends GenericReceiver {
660 String pkgName;
661
662 DeleteReceiver(String pkgName) {
663 this.pkgName = pkgName;
664 IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED);
665 filter.addDataScheme("package");
666 super.setFilter(filter);
667 }
668
669 public boolean notifyNow(Intent intent) {
670 String action = intent.getAction();
671 if (!Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
672 return false;
673 }
674 Uri data = intent.getData();
675 String installedPkg = data.getEncodedSchemeSpecificPart();
676 if (pkgName.equals(installedPkg)) {
677 return true;
678 }
679 return false;
680 }
681 }
682
683 public boolean invokeDeletePackage(Uri packageURI, int flags,
684 final String pkgName, GenericReceiver receiver) throws Exception {
685 DeleteObserver observer = new DeleteObserver();
686 final boolean received = false;
687 mContext.registerReceiver(receiver, receiver.filter);
688 try {
689 // Wait on observer
690 synchronized(observer) {
691 synchronized (receiver) {
692 getPm().deletePackage(pkgName, observer, flags);
693 long waitTime = 0;
694 while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
695 observer.wait(WAIT_TIME_INCR);
696 waitTime += WAIT_TIME_INCR;
697 }
698 if(!observer.isDone()) {
699 throw new Exception("Timed out waiting for packageInstalled callback");
700 }
701 // Verify we received the broadcast
702 waitTime = 0;
703 while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
704 receiver.wait(WAIT_TIME_INCR);
705 waitTime += WAIT_TIME_INCR;
706 }
707 if(!receiver.isDone()) {
708 throw new Exception("Timed out waiting for PACKAGE_ADDED notification");
709 }
710 return receiver.received;
711 }
712 }
713 } finally {
714 mContext.unregisterReceiver(receiver);
715 }
716 }
717
718 public void deleteFromRawResource(int iFlags, int dFlags) {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800719 InstallParams ip = sampleInstallFromRawResource(iFlags, false);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800720 boolean retainData = ((dFlags & PackageManager.DONT_DELETE_DATA) != 0);
721 GenericReceiver receiver = new DeleteReceiver(ip.pkg.packageName);
722 DeleteObserver observer = new DeleteObserver();
723 try {
724 assertTrue(invokeDeletePackage(ip.packageURI, dFlags,
725 ip.pkg.packageName, receiver));
726 ApplicationInfo info = null;
727 Log.i(TAG, "okay4");
728 try {
729 info = getPm().getApplicationInfo(ip.pkg.packageName,
730 PackageManager.GET_UNINSTALLED_PACKAGES);
731 } catch (NameNotFoundException e) {
732 info = null;
733 }
734 if (retainData) {
735 assertNotNull(info);
736 assertEquals(info.packageName, ip.pkg.packageName);
737 File file = new File(info.dataDir);
738 assertTrue(file.exists());
739 } else {
740 assertNull(info);
741 }
742 } catch (Exception e) {
743 failStr(e);
744 } finally {
745 cleanUpInstall(ip);
746 }
747 }
748
749 @MediumTest
750 public void testDeleteNormalInternal() {
751 deleteFromRawResource(0, 0);
752 }
753
754 @MediumTest
755 public void testDeleteFwdLockedInternal() {
756 deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, 0);
757 }
758
759 @MediumTest
760 public void testDeleteSdcard() {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800761 deleteFromRawResource(PackageManager.INSTALL_EXTERNAL, 0);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800762 }
763
764 @MediumTest
765 public void testDeleteNormalInternalRetainData() {
766 deleteFromRawResource(0, PackageManager.DONT_DELETE_DATA);
767 }
768
769 @MediumTest
770 public void testDeleteFwdLockedInternalRetainData() {
771 deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, PackageManager.DONT_DELETE_DATA);
772 }
773
774 @MediumTest
775 public void testDeleteSdcardRetainData() {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800776 deleteFromRawResource(PackageManager.INSTALL_EXTERNAL, PackageManager.DONT_DELETE_DATA);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800777 }
778
779 /* sdcard mount/unmount tests ******/
780
781 class SdMountReceiver extends GenericReceiver {
782 String pkgNames[];
783 boolean status = true;
784
785 SdMountReceiver(String[] pkgNames) {
786 this.pkgNames = pkgNames;
787 IntentFilter filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
788 super.setFilter(filter);
789 }
790
791 public boolean notifyNow(Intent intent) {
792 Log.i(TAG, "okay 1");
793 String action = intent.getAction();
794 if (!Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) {
795 return false;
796 }
797 String rpkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
798 for (String pkg : pkgNames) {
799 boolean found = false;
800 for (String rpkg : rpkgList) {
801 if (rpkg.equals(pkg)) {
802 found = true;
803 break;
804 }
805 }
806 if (!found) {
807 status = false;
808 return true;
809 }
810 }
811 return true;
812 }
813 }
814
815 class SdUnMountReceiver extends GenericReceiver {
816 String pkgNames[];
817 boolean status = true;
818
819 SdUnMountReceiver(String[] pkgNames) {
820 this.pkgNames = pkgNames;
821 IntentFilter filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
822 super.setFilter(filter);
823 }
824
825 public boolean notifyNow(Intent intent) {
826 String action = intent.getAction();
827 if (!Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
828 return false;
829 }
830 String rpkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
831 for (String pkg : pkgNames) {
832 boolean found = false;
833 for (String rpkg : rpkgList) {
834 if (rpkg.equals(pkg)) {
835 found = true;
836 break;
837 }
838 }
839 if (!found) {
840 status = false;
841 return true;
842 }
843 }
844 return true;
845 }
846 }
847
848 IMountService getMs() {
849 IBinder service = ServiceManager.getService("mount");
850 if (service != null) {
851 return IMountService.Stub.asInterface(service);
852 } else {
853 Log.e(TAG, "Can't get mount service");
854 }
855 return null;
856 }
857
858 boolean getMediaState() {
859 try {
860 String mPath = Environment.getExternalStorageDirectory().toString();
861 String state = getMs().getVolumeState(mPath);
862 return Environment.MEDIA_MOUNTED.equals(state);
863 } catch (RemoteException e) {
864 return false;
865 }
866 }
867
868 boolean mountMedia() {
869 if (getMediaState()) {
870 return true;
871 }
872 try {
873 String mPath = Environment.getExternalStorageDirectory().toString();
874 int ret = getMs().mountVolume(mPath);
San Mehatb1043402010-02-05 08:26:50 -0800875 return ret == StorageResultCode.OperationSucceeded;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800876 } catch (RemoteException e) {
877 return false;
878 }
879 }
880
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800881 class StorageListener extends StorageEventListener {
882 String oldState;
883 String newState;
884 String path;
885 private boolean doneFlag = false;
886 @Override
887 public void onStorageStateChanged(String path, String oldState, String newState) {
888 if (localLOGV) Log.i(TAG, "Storage state changed from " + oldState + " to " + newState);
889 synchronized (this) {
890 this.oldState = oldState;
891 this.newState = newState;
892 this.path = path;
893 doneFlag = true;
894 notifyAll();
895 }
896 }
897
898 public boolean isDone() {
899 return doneFlag;
900 }
901 }
902
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800903 private boolean unmountMedia() {
904 if (!getMediaState()) {
905 return true;
906 }
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800907 String path = Environment.getExternalStorageDirectory().toString();
908 StorageListener observer = new StorageListener();
909 StorageManager sm = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
910 sm.registerListener(observer);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800911 try {
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800912 // Wait on observer
913 synchronized(observer) {
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800914 getMs().unmountVolume(path, true);
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800915 long waitTime = 0;
916 while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
917 observer.wait(WAIT_TIME_INCR);
918 waitTime += WAIT_TIME_INCR;
919 }
920 if(!observer.isDone()) {
921 throw new Exception("Timed out waiting for packageInstalled callback");
922 }
923 return true;
924 }
925 } catch (Exception e) {
926 return false;
927 } finally {
928 sm.unregisterListener(observer);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800929 }
930 }
931
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800932 private boolean mountFromRawResource() {
933 // Install pkg on sdcard
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800934 InstallParams ip = sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, false);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800935 if (localLOGV) Log.i(TAG, "Installed pkg on sdcard");
936 boolean origState = getMediaState();
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800937 boolean registeredReceiver = false;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800938 SdMountReceiver receiver = new SdMountReceiver(new String[]{ip.pkg.packageName});
939 try {
940 if (localLOGV) Log.i(TAG, "Unmounting media");
941 // Unmount media
942 assertTrue(unmountMedia());
943 if (localLOGV) Log.i(TAG, "Unmounted media");
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800944 // Register receiver here
945 PackageManager pm = getPm();
946 mContext.registerReceiver(receiver, receiver.filter);
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800947 registeredReceiver = true;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800948
949 // Wait on receiver
950 synchronized (receiver) {
951 if (localLOGV) Log.i(TAG, "Mounting media");
952 // Mount media again
953 assertTrue(mountMedia());
954 if (localLOGV) Log.i(TAG, "Mounted media");
955 if (localLOGV) Log.i(TAG, "Waiting for notification");
956 long waitTime = 0;
957 // Verify we received the broadcast
958 waitTime = 0;
959 while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
960 receiver.wait(WAIT_TIME_INCR);
961 waitTime += WAIT_TIME_INCR;
962 }
963 if(!receiver.isDone()) {
964 failStr("Timed out waiting for EXTERNAL_APPLICATIONS notification");
965 }
966 return receiver.received;
967 }
968 } catch (InterruptedException e) {
969 failStr(e);
970 return false;
971 } finally {
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800972 if (registeredReceiver) mContext.unregisterReceiver(receiver);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800973 // Restore original media state
974 if (origState) {
975 mountMedia();
976 } else {
977 unmountMedia();
978 }
979 if (localLOGV) Log.i(TAG, "Cleaning up install");
980 cleanUpInstall(ip);
981 }
982 }
983
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800984 /*
985 * Install package on sdcard. Unmount and then mount the media.
986 * (Use PackageManagerService private api for now)
987 * Make sure the installed package is available.
988 * STOPSHIP will uncomment when MountService api's to mount/unmount
989 * are made asynchronous.
990 */
991 public void xxxtestMountSdNormalInternal() {
992 assertTrue(mountFromRawResource());
993 }
994
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800995 void cleanUpInstall(InstallParams ip) {
996 if (ip == null) {
997 return;
998 }
999 Runtime.getRuntime().gc();
1000 Log.i(TAG, "Deleting package : " + ip.pkg.packageName);
1001 getPm().deletePackage(ip.pkg.packageName, null, 0);
1002 File outFile = new File(ip.outFileName);
1003 if (outFile != null && outFile.exists()) {
1004 outFile.delete();
1005 }
1006 }
Suchi Amalapurapu117818e2010-02-09 03:45:40 -08001007
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -08001008 public void testManifestInstallLocationInternal() {
1009 installFromRawResource("install.apk", R.raw.install_loc_internal,
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -08001010 0, true, false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
Suchi Amalapurapu117818e2010-02-09 03:45:40 -08001011 }
1012
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -08001013 public void testManifestInstallLocationSdcard() {
1014 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -08001015 0, true, false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
Suchi Amalapurapu117818e2010-02-09 03:45:40 -08001016 }
1017
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -08001018 public void testManifestInstallLocationAuto() {
1019 installFromRawResource("install.apk", R.raw.install_loc_auto,
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -08001020 0, true, false, -1, PackageInfo.INSTALL_LOCATION_AUTO);
Suchi Amalapurapu117818e2010-02-09 03:45:40 -08001021 }
1022
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -08001023 public void testManifestInstallLocationUnspecified() {
1024 installFromRawResource("install.apk", R.raw.install_loc_unspecified,
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -08001025 0, true, false, -1, PackageInfo.INSTALL_LOCATION_AUTO);
Suchi Amalapurapu117818e2010-02-09 03:45:40 -08001026 }
1027
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001028 public void testManifestInstallLocationFwdLockedFlagSdcard() {
1029 installFromRawResource("install.apk", R.raw.install_loc_unspecified,
1030 PackageManager.INSTALL_FORWARD_LOCK |
1031 PackageManager.INSTALL_EXTERNAL, true, true,
1032 PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION,
1033 PackageInfo.INSTALL_LOCATION_AUTO);
1034 }
1035
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -08001036 public void testManifestInstallLocationFwdLockedSdcard() {
1037 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -08001038 PackageManager.INSTALL_FORWARD_LOCK, true, false,
1039 -1,
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001040 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1041 }
1042
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001043 /*
1044 * Install a package on internal flash via PackageManager install flag. Replace
1045 * the package via flag to install on sdcard. Make sure the new flag overrides
1046 * the old install location.
1047 */
1048 public void testReplaceFlagInternalSdcard() {
1049 int iFlags = 0;
1050 int rFlags = PackageManager.INSTALL_EXTERNAL;
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001051 InstallParams ip = sampleInstallFromRawResource(iFlags, false);
1052 GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName);
1053 int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING;
1054 try {
1055 assertEquals(invokeInstallPackage(ip.packageURI, replaceFlags,
1056 ip.pkg.packageName, receiver), true);
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001057 assertInstall(ip.pkg, rFlags, ip.pkg.installLocation);
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001058 } catch (Exception e) {
1059 failStr("Failed with exception : " + e);
1060 } finally {
1061 cleanUpInstall(ip);
1062 }
1063 }
1064
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001065 /*
1066 * Install a package on sdcard via PackageManager install flag. Replace
1067 * the package with no flags or manifest option and make sure the old
1068 * install location is retained.
1069 */
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001070 public void testReplaceFlagSdcardInternal() {
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001071 int iFlags = PackageManager.INSTALL_EXTERNAL;
1072 int rFlags = 0;
1073 InstallParams ip = sampleInstallFromRawResource(iFlags, false);
1074 GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName);
1075 int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING;
1076 try {
1077 assertEquals(invokeInstallPackage(ip.packageURI, replaceFlags,
1078 ip.pkg.packageName, receiver), true);
1079 assertInstall(ip.pkg, iFlags, ip.pkg.installLocation);
1080 } catch (Exception e) {
1081 failStr("Failed with exception : " + e);
1082 } finally {
1083 cleanUpInstall(ip);
1084 }
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001085 }
1086
1087 public void testManifestInstallLocationReplaceInternalSdcard() {
1088 int iFlags = 0;
1089 int iApk = R.raw.install_loc_unspecified;
1090 int rFlags = 0;
1091 int rApk = R.raw.install_loc_sdcard;
1092 InstallParams ip = installFromRawResource("install.apk", iApk,
1093 iFlags, false,
1094 false, -1, PackageInfo.INSTALL_LOCATION_AUTO);
1095 GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName);
1096 int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING;
1097 try {
1098 InstallParams rp = installFromRawResource("install.apk", rApk,
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001099 replaceFlags, false,
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001100 false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1101 assertInstall(rp.pkg, replaceFlags, rp.pkg.installLocation);
1102 } catch (Exception e) {
1103 failStr("Failed with exception : " + e);
1104 } finally {
1105 cleanUpInstall(ip);
1106 }
1107 }
1108
1109 public void testManifestInstallLocationReplaceSdcardInternal() {
1110 int iFlags = 0;
1111 int iApk = R.raw.install_loc_sdcard;
1112 int rFlags = 0;
1113 int rApk = R.raw.install_loc_unspecified;
1114 InstallParams ip = installFromRawResource("install.apk", iApk,
1115 iFlags, false,
1116 false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001117 int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING;
1118 try {
1119 InstallParams rp = installFromRawResource("install.apk", rApk,
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001120 replaceFlags, false,
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001121 false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1122 assertInstall(rp.pkg, replaceFlags, ip.pkg.installLocation);
1123 } catch (Exception e) {
1124 failStr("Failed with exception : " + e);
1125 } finally {
1126 cleanUpInstall(ip);
1127 }
Suchi Amalapurapu117818e2010-02-09 03:45:40 -08001128 }
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001129
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001130 class MoveReceiver extends GenericReceiver {
1131 String pkgName;
1132 final static int INVALID = -1;
1133 final static int REMOVED = 1;
1134 final static int ADDED = 2;
1135 int removed = INVALID;
1136
1137 MoveReceiver(String pkgName) {
1138 this.pkgName = pkgName;
1139 filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
1140 filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
1141 super.setFilter(filter);
1142 }
1143
1144 public boolean notifyNow(Intent intent) {
1145 String action = intent.getAction();
1146 Log.i(TAG, "MoveReceiver::" + action);
1147 if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
1148 String[] list = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
1149 if (list != null) {
1150 for (String pkg : list) {
1151 if (pkg.equals(pkgName)) {
1152 removed = REMOVED;
1153 break;
1154 }
1155 }
1156 }
1157 removed = REMOVED;
1158 } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) {
1159 if (removed != REMOVED) {
1160 return false;
1161 }
1162 String[] list = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
1163 if (list != null) {
1164 for (String pkg : list) {
1165 if (pkg.equals(pkgName)) {
1166 removed = ADDED;
1167 return true;
1168 }
1169 }
1170 }
1171 }
1172 return false;
1173 }
1174 }
1175
1176 private class PackageMoveObserver extends IPackageMoveObserver.Stub {
1177 public int returnCode;
1178 private boolean doneFlag = false;
1179
1180 public void packageMoved(String packageName, int returnCode) {
1181 synchronized(this) {
1182 this.returnCode = returnCode;
1183 doneFlag = true;
1184 notifyAll();
1185 }
1186 }
1187
1188 public boolean isDone() {
1189 return doneFlag;
1190 }
1191 }
1192
1193 public boolean invokeMovePackage(String pkgName, int flags,
1194 GenericReceiver receiver) throws Exception {
1195 PackageMoveObserver observer = new PackageMoveObserver();
1196 final boolean received = false;
1197 mContext.registerReceiver(receiver, receiver.filter);
1198 try {
1199 // Wait on observer
1200 synchronized(observer) {
1201 synchronized (receiver) {
1202 getPm().movePackage(pkgName, observer, flags);
1203 long waitTime = 0;
1204 while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
1205 observer.wait(WAIT_TIME_INCR);
1206 waitTime += WAIT_TIME_INCR;
1207 }
1208 if(!observer.isDone()) {
1209 throw new Exception("Timed out waiting for pkgmove callback");
1210 }
1211 if (observer.returnCode != PackageManager.MOVE_SUCCEEDED) {
1212 return false;
1213 }
1214 // Verify we received the broadcast
1215 waitTime = 0;
1216 while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
1217 receiver.wait(WAIT_TIME_INCR);
1218 waitTime += WAIT_TIME_INCR;
1219 }
1220 if(!receiver.isDone()) {
1221 throw new Exception("Timed out waiting for MOVE notifications");
1222 }
1223 return receiver.received;
1224 }
1225 }
1226 } finally {
1227 mContext.unregisterReceiver(receiver);
1228 }
1229 }
1230
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -08001231 private int getInstallLoc() {
1232 boolean userSetting = false;
1233 int origDefaultLoc = PackageInfo.INSTALL_LOCATION_AUTO;
1234 try {
1235 userSetting = Settings.System.getInt(mContext.getContentResolver(), Settings.System.SET_INSTALL_LOCATION) != 0;
1236 origDefaultLoc = Settings.System.getInt(mContext.getContentResolver(), Settings.System.DEFAULT_INSTALL_LOCATION);
1237 } catch (SettingNotFoundException e1) {
1238 }
1239 return origDefaultLoc;
1240 }
1241
1242 private void setInstallLoc(int loc) {
1243 Settings.System.putInt(mContext.getContentResolver(),
1244 Settings.System.DEFAULT_INSTALL_LOCATION, loc);
1245 }
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001246 /*
1247 * Utility function that reads a apk bundled as a raw resource
1248 * copies it into own data directory and invokes
1249 * PackageManager api to install first and then replace it
1250 * again.
1251 */
1252 public void moveFromRawResource(int installFlags, int moveFlags,
1253 int expRetCode) {
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -08001254 int origDefaultLoc = getInstallLoc();
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001255 setInstallLoc(PackageHelper.APP_INSTALL_AUTO);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001256 // Install first
1257 InstallParams ip = sampleInstallFromRawResource(installFlags, false);
1258 ApplicationInfo oldAppInfo = null;
1259 try {
1260 oldAppInfo = getPm().getApplicationInfo(ip.pkg.packageName, 0);
1261 } catch (NameNotFoundException e) {
1262 failStr("Pkg hasnt been installed correctly");
1263 }
1264
1265 // Create receiver based on expRetCode
1266 MoveReceiver receiver = new MoveReceiver(ip.pkg.packageName);
1267 try {
1268 boolean retCode = invokeMovePackage(ip.pkg.packageName, moveFlags,
1269 receiver);
1270 if (expRetCode == PackageManager.MOVE_SUCCEEDED) {
1271 assertTrue(retCode);
1272 ApplicationInfo info = getPm().getApplicationInfo(ip.pkg.packageName, 0);
1273 assertNotNull(info);
1274 if ((moveFlags & PackageManager.MOVE_INTERNAL) != 0) {
Suchi Amalapurapu6069beb2010-03-10 09:46:49 -08001275 assertTrue((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == 0);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001276 } else if ((moveFlags & PackageManager.MOVE_EXTERNAL_MEDIA) != 0){
Suchi Amalapurapu6069beb2010-03-10 09:46:49 -08001277 assertTrue((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001278 }
1279 } else {
1280 assertFalse(retCode);
1281 ApplicationInfo info = getPm().getApplicationInfo(ip.pkg.packageName, 0);
1282 assertNotNull(info);
1283 assertEquals(oldAppInfo.flags, info.flags);
1284 }
1285 } catch (Exception e) {
1286 failStr("Failed with exception : " + e);
1287 } finally {
1288 cleanUpInstall(ip);
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -08001289 // Restore default install location
1290 setInstallLoc(origDefaultLoc);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001291 }
1292 }
1293
1294 public void testMoveAppInternalToExternal() {
1295 moveFromRawResource(0, PackageManager.MOVE_EXTERNAL_MEDIA,
1296 PackageManager.MOVE_SUCCEEDED);
1297 }
1298
1299 public void testMoveAppInternalToInternal() {
1300 moveFromRawResource(0, PackageManager.MOVE_INTERNAL,
1301 PackageManager.MOVE_FAILED_INVALID_LOCATION);
1302 }
1303
1304 public void testMoveAppExternalToExternal() {
1305 moveFromRawResource(PackageManager.INSTALL_EXTERNAL, PackageManager.MOVE_EXTERNAL_MEDIA,
1306 PackageManager.MOVE_FAILED_INVALID_LOCATION);
1307 }
1308 public void testMoveAppExternalToInternal() {
1309 moveFromRawResource(PackageManager.INSTALL_EXTERNAL, PackageManager.MOVE_INTERNAL,
1310 PackageManager.MOVE_SUCCEEDED);
1311 }
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001312
1313 /*
1314 * Test that an install error code is returned when media is unmounted
1315 * and package installed on sdcard via package manager flag.
1316 */
1317 public void testInstallSdcardUnmount() {
1318 boolean origState = getMediaState();
1319 try {
1320 // Unmount sdcard
1321 assertTrue(unmountMedia());
1322 // Try to install and make sure an error code is returned.
1323 assertNull(installFromRawResource("install.apk", R.raw.install,
1324 PackageManager.INSTALL_EXTERNAL, false,
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001325 true, PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE,
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001326 PackageInfo.INSTALL_LOCATION_AUTO));
1327 } finally {
1328 // Restore original media state
1329 if (origState) {
1330 mountMedia();
1331 } else {
1332 unmountMedia();
1333 }
1334 }
1335 }
1336
1337 /*
1338 * Unmount sdcard. Try installing an app with manifest option to install
1339 * on sdcard. Make sure it gets installed on internal flash.
1340 */
1341 public void testInstallManifestSdcardUnmount() {
1342 boolean origState = getMediaState();
1343 try {
1344 // Unmount sdcard
1345 assertTrue(unmountMedia());
1346 // Try to install and make sure an error code is returned.
1347 assertNotNull(installFromRawResource("install.apk", R.raw.install_loc_sdcard,
1348 0, false,
1349 false, -1,
1350 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY));
1351 } finally {
1352 // Restore original media state
1353 if (origState) {
1354 mountMedia();
1355 } else {
1356 unmountMedia();
1357 }
1358 }
1359 }
1360
1361 /*---------- Recommended install location tests ----*/
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001362 /* Precedence: FlagManifestExistingUser
1363 * PrecedenceSuffixes:
1364 * Flag : FlagI, FlagE, FlagF
1365 * I - internal, E - external, F - forward locked, Flag suffix absent if not using any option.
1366 * Manifest: ManifestI, ManifestE, ManifestA, Manifest suffix absent if not using any option.
1367 * Existing: Existing suffix absent if not existing.
1368 * User: UserI, UserE, UserA, User suffix absent if not existing.
1369 *
1370 */
1371 /*
1372 * Install an app on internal flash
1373 */
1374 public void testFlagI() {
1375 sampleInstallFromRawResource(PackageManager.INSTALL_INTERNAL, true);
1376 }
1377 /*
1378 * Install an app on sdcard.
1379 */
1380 public void testFlagE() {
1381 sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, true);
1382 }
1383
1384 /*
1385 * Install an app on sdcard.
1386 */
1387 public void testFlagF() {
1388 sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true);
1389 }
1390 /*
1391 * Install an app with both internal and external flags set. should fail
1392 */
1393 public void testFlagIE() {
1394 installFromRawResource("install.apk", R.raw.install,
1395 PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_INTERNAL,
1396 false,
1397 true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION,
1398 PackageInfo.INSTALL_LOCATION_AUTO);
1399 }
1400
1401 /*
1402 * Install an app with both internal and external flags set. should fail
1403 */
1404 public void testFlagIF() {
1405 sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK |
1406 PackageManager.INSTALL_INTERNAL, true);
1407 }
1408 /*
1409 * Install an app with both internal and external flags set. should fail
1410 */
1411 public void testFlagEF() {
1412 installFromRawResource("install.apk", R.raw.install,
1413 PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_EXTERNAL,
1414 false,
1415 true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION,
1416 PackageInfo.INSTALL_LOCATION_AUTO);
1417 }
1418 /*
1419 * Install an app with both internal and external flags set. should fail
1420 */
1421 public void testFlagIEF() {
1422 installFromRawResource("install.apk", R.raw.install,
1423 PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_INTERNAL |
1424 PackageManager.INSTALL_EXTERNAL,
1425 false,
1426 true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION,
1427 PackageInfo.INSTALL_LOCATION_AUTO);
1428 }
1429 /*
1430 * Install an app with both internal and manifest option set.
1431 * should install on internal.
1432 */
1433 public void testFlagIManifestI() {
1434 installFromRawResource("install.apk", R.raw.install_loc_internal,
1435 PackageManager.INSTALL_INTERNAL,
1436 true,
1437 false, -1,
1438 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
1439 }
1440 /*
1441 * Install an app with both internal and manifest preference for
1442 * preferExternal. Should install on internal.
1443 */
1444 public void testFlagIManifestE() {
1445 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
1446 PackageManager.INSTALL_INTERNAL,
1447 true,
1448 false, -1,
1449 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
1450 }
1451 /*
1452 * Install an app with both internal and manifest preference for
1453 * auto. should install internal.
1454 */
1455 public void testFlagIManifestA() {
1456 installFromRawResource("install.apk", R.raw.install_loc_auto,
1457 PackageManager.INSTALL_INTERNAL,
1458 true,
1459 false, -1,
1460 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
1461 }
1462 /*
1463 * Install an app with both external and manifest option set.
1464 * should install externally.
1465 */
1466 public void testFlagEManifestI() {
1467 installFromRawResource("install.apk", R.raw.install_loc_internal,
1468 PackageManager.INSTALL_EXTERNAL,
1469 true,
1470 false, -1,
1471 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1472 }
1473 /*
1474 * Install an app with both external and manifest preference for
1475 * preferExternal. Should install externally.
1476 */
1477 public void testFlagEManifestE() {
1478 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
1479 PackageManager.INSTALL_EXTERNAL,
1480 true,
1481 false, -1,
1482 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1483 }
1484 /*
1485 * Install an app with both external and manifest preference for
1486 * auto. should install on external media.
1487 */
1488 public void testFlagEManifestA() {
1489 installFromRawResource("install.apk", R.raw.install_loc_auto,
1490 PackageManager.INSTALL_EXTERNAL,
1491 true,
1492 false, -1,
1493 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1494 }
1495 /*
1496 * Install an app with fwd locked flag set and install location set to
1497 * internal. should install internally.
1498 */
1499 public void testFlagFManifestI() {
1500 installFromRawResource("install.apk", R.raw.install_loc_internal,
1501 PackageManager.INSTALL_EXTERNAL,
1502 true,
1503 false, -1,
1504 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1505 }
1506 /*
1507 * Install an app with fwd locked flag set and install location set to
1508 * preferExternal. should install internally.
1509 */
1510 public void testFlagFManifestE() {
1511 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
1512 PackageManager.INSTALL_EXTERNAL,
1513 true,
1514 false, -1,
1515 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1516 }
1517 /*
1518 * Install an app with fwd locked flag set and install location set to
1519 * auto. should install internally.
1520 */
1521 public void testFlagFManifestA() {
1522 installFromRawResource("install.apk", R.raw.install_loc_auto,
1523 PackageManager.INSTALL_EXTERNAL,
1524 true,
1525 false, -1,
1526 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1527 }
1528 /* The following test functions verify install location for existing apps.
1529 * ie existing app can be installed internally or externally. If install
1530 * flag is explicitly set it should override current location. If manifest location
1531 * is set, that should over ride current location too. if not the existing install
1532 * location should be honoured.
1533 * testFlagI/E/F/ExistingI/E -
1534 */
1535 public void testFlagIExistingI() {
1536 int iFlags = PackageManager.INSTALL_INTERNAL;
1537 int rFlags = PackageManager.INSTALL_INTERNAL | PackageManager.INSTALL_REPLACE_EXISTING;
1538 // First install.
1539 installFromRawResource("install.apk", R.raw.install,
1540 iFlags,
1541 false,
1542 false, -1,
1543 -1);
1544 // Replace now
1545 installFromRawResource("install.apk", R.raw.install,
1546 rFlags,
1547 true,
1548 false, -1,
1549 -1);
1550 }
1551 public void testFlagIExistingE() {
1552 int iFlags = PackageManager.INSTALL_EXTERNAL;
1553 int rFlags = PackageManager.INSTALL_INTERNAL | PackageManager.INSTALL_REPLACE_EXISTING;
1554 // First install.
1555 installFromRawResource("install.apk", R.raw.install,
1556 iFlags,
1557 false,
1558 false, -1,
1559 -1);
1560 // Replace now
1561 installFromRawResource("install.apk", R.raw.install,
1562 rFlags,
1563 true,
1564 false, -1,
1565 -1);
1566 }
1567 public void testFlagEExistingI() {
1568 int iFlags = PackageManager.INSTALL_INTERNAL;
1569 int rFlags = PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_REPLACE_EXISTING;
1570 // First install.
1571 installFromRawResource("install.apk", R.raw.install,
1572 iFlags,
1573 false,
1574 false, -1,
1575 -1);
1576 // Replace now
1577 installFromRawResource("install.apk", R.raw.install,
1578 rFlags,
1579 true,
1580 false, -1,
1581 -1);
1582 }
1583 public void testFlagEExistingE() {
1584 int iFlags = PackageManager.INSTALL_EXTERNAL;
1585 int rFlags = PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_REPLACE_EXISTING;
1586 // First install.
1587 installFromRawResource("install.apk", R.raw.install,
1588 iFlags,
1589 false,
1590 false, -1,
1591 -1);
1592 // Replace now
1593 installFromRawResource("install.apk", R.raw.install,
1594 rFlags,
1595 true,
1596 false, -1,
1597 -1);
1598 }
1599 public void testFlagFExistingI() {
1600 int iFlags = PackageManager.INSTALL_INTERNAL;
1601 int rFlags = PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_REPLACE_EXISTING;
1602 // First install.
1603 installFromRawResource("install.apk", R.raw.install,
1604 iFlags,
1605 false,
1606 false, -1,
1607 -1);
1608 // Replace now
1609 installFromRawResource("install.apk", R.raw.install,
1610 rFlags,
1611 true,
1612 false, -1,
1613 -1);
1614 }
1615 public void testFlagFExistingE() {
1616 int iFlags = PackageManager.INSTALL_EXTERNAL;
1617 int rFlags = PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_REPLACE_EXISTING;
1618 // First install.
1619 installFromRawResource("install.apk", R.raw.install,
1620 iFlags,
1621 false,
1622 false, -1,
1623 -1);
1624 // Replace now
1625 installFromRawResource("install.apk", R.raw.install,
1626 rFlags,
1627 true,
1628 false, -1,
1629 -1);
1630 }
1631 /*
1632 * The following set of tests verify the installation of apps with
1633 * install location attribute set to internalOnly, preferExternal and auto.
1634 * The manifest option should dictate the install location.
1635 * public void testManifestI/E/A
1636 * TODO out of memory fall back behaviour.
1637 */
1638 public void testManifestI() {
1639 installFromRawResource("install.apk", R.raw.install_loc_internal,
1640 0,
1641 true,
1642 false, -1,
1643 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
1644 }
1645 public void testManifestE() {
1646 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
1647 0,
1648 true,
1649 false, -1,
1650 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1651 }
1652 public void testManifestA() {
1653 installFromRawResource("install.apk", R.raw.install_loc_auto,
1654 0,
1655 true,
1656 false, -1,
1657 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
1658 }
1659 /*
1660 * The following set of tests verify the installation of apps
1661 * with install location attribute set to internalOnly, preferExternal and auto
1662 * for already existing apps. The manifest option should take precedence.
1663 * TODO add out of memory fall back behaviour.
1664 * testManifestI/E/AExistingI/E
1665 */
1666 public void testManifestIExistingI() {
1667 int iFlags = PackageManager.INSTALL_INTERNAL;
1668 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
1669 // First install.
1670 installFromRawResource("install.apk", R.raw.install,
1671 iFlags,
1672 false,
1673 false, -1,
1674 -1);
1675 // Replace now
1676 installFromRawResource("install.apk", R.raw.install_loc_internal,
1677 rFlags,
1678 true,
1679 false, -1,
1680 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
1681 }
1682 public void testManifestIExistingE() {
1683 int iFlags = PackageManager.INSTALL_EXTERNAL;
1684 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
1685 // First install.
1686 installFromRawResource("install.apk", R.raw.install,
1687 iFlags,
1688 false,
1689 false, -1,
1690 -1);
1691 // Replace now
1692 installFromRawResource("install.apk", R.raw.install_loc_internal,
1693 rFlags,
1694 true,
1695 false, -1,
1696 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
1697 }
1698 public void testManifestEExistingI() {
1699 int iFlags = PackageManager.INSTALL_INTERNAL;
1700 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
1701 // First install.
1702 installFromRawResource("install.apk", R.raw.install,
1703 iFlags,
1704 false,
1705 false, -1,
1706 -1);
1707 // Replace now
1708 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
1709 rFlags,
1710 true,
1711 false, -1,
1712 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1713 }
1714 public void testManifestEExistingE() {
1715 int iFlags = PackageManager.INSTALL_EXTERNAL;
1716 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
1717 // First install.
1718 installFromRawResource("install.apk", R.raw.install,
1719 iFlags,
1720 false,
1721 false, -1,
1722 -1);
1723 // Replace now
1724 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
1725 rFlags,
1726 true,
1727 false, -1,
1728 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1729 }
1730 public void testManifestAExistingI() {
1731 int iFlags = PackageManager.INSTALL_INTERNAL;
1732 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
1733 // First install.
1734 installFromRawResource("install.apk", R.raw.install,
1735 iFlags,
1736 false,
1737 false, -1,
1738 -1);
1739 // Replace now
1740 installFromRawResource("install.apk", R.raw.install_loc_auto,
1741 rFlags,
1742 true,
1743 false, -1,
1744 PackageInfo.INSTALL_LOCATION_AUTO);
1745 }
1746 public void testManifestAExistingE() {
1747 int iFlags = PackageManager.INSTALL_EXTERNAL;
1748 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
1749 // First install.
1750 installFromRawResource("install.apk", R.raw.install,
1751 iFlags,
1752 false,
1753 false, -1,
1754 -1);
1755 // Replace now
1756 installFromRawResource("install.apk", R.raw.install_loc_auto,
1757 rFlags,
1758 true,
1759 false, -1,
1760 PackageInfo.INSTALL_LOCATION_AUTO);
1761 }
1762 /*
1763 * The following set of tests check install location for existing
1764 * application based on user setting.
1765 */
1766 private void setExistingXUserX(int userSetting, int iFlags) {
1767 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
1768 // First install.
1769 installFromRawResource("install.apk", R.raw.install,
1770 iFlags,
1771 false,
1772 false, -1,
1773 -1);
1774 // Watch out for this.
1775 int iloc = PackageInfo.INSTALL_LOCATION_AUTO;
1776 if ((iFlags & PackageManager.INSTALL_INTERNAL) != 0) {
1777 iloc = PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY;
1778 } else if ((iFlags & PackageManager.INSTALL_EXTERNAL) != 0) {
1779 iloc = PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL;
1780 }
1781 int origSetting = getInstallLoc();
1782 try {
1783 // Set user setting
1784 setInstallLoc(userSetting);
1785 // Replace now
1786 installFromRawResource("install.apk", R.raw.install,
1787 rFlags,
1788 true,
1789 false, -1,
1790 iloc);
1791 } finally {
1792 setInstallLoc(origSetting);
1793 }
1794 }
1795 public void testExistingIUserI() {
1796 int userSetting = PackageHelper.APP_INSTALL_INTERNAL;
1797 int iFlags = PackageManager.INSTALL_INTERNAL;
1798 setExistingXUserX(userSetting, iFlags);
1799 }
1800 public void testExistingIUserE() {
1801 int userSetting = PackageHelper.APP_INSTALL_EXTERNAL;
1802 int iFlags = PackageManager.INSTALL_INTERNAL;
1803 setExistingXUserX(userSetting, iFlags);
1804 }
1805 public void testExistingIUserA() {
1806 int userSetting = PackageHelper.APP_INSTALL_AUTO;
1807 int iFlags = PackageManager.INSTALL_INTERNAL;
1808 setExistingXUserX(userSetting, iFlags);
1809 }
1810 public void testExistingEUserI() {
1811 int userSetting = PackageHelper.APP_INSTALL_INTERNAL;
1812 int iFlags = PackageManager.INSTALL_EXTERNAL;
1813 setExistingXUserX(userSetting, iFlags);
1814 }
1815 public void testExistingEUserE() {
1816 int userSetting = PackageHelper.APP_INSTALL_EXTERNAL;
1817 int iFlags = PackageManager.INSTALL_EXTERNAL;
1818 setExistingXUserX(userSetting, iFlags);
1819 }
1820 public void testExistingEUserA() {
1821 int userSetting = PackageHelper.APP_INSTALL_AUTO;
1822 int iFlags = PackageManager.INSTALL_EXTERNAL;
1823 setExistingXUserX(userSetting, iFlags);
1824 }
1825 /*
1826 * The following set of tests verify that the user setting defines
1827 * the install location.
1828 *
1829 */
1830 private void setUserX(int userSetting) {
1831 int origSetting = getInstallLoc();
1832 int iloc = PackageInfo.INSTALL_LOCATION_AUTO;
1833 if (userSetting == PackageHelper.APP_INSTALL_AUTO) {
1834 iloc = PackageInfo.INSTALL_LOCATION_AUTO;
1835 } else if (userSetting == PackageHelper.APP_INSTALL_EXTERNAL) {
1836 iloc = PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL;
1837 } else if (userSetting == PackageHelper.APP_INSTALL_INTERNAL) {
1838 iloc = PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY;
1839 }
1840 try {
1841 // Set user setting
1842 setInstallLoc(userSetting);
1843 // Replace now
1844 installFromRawResource("install.apk", R.raw.install,
1845 0,
1846 true,
1847 false, -1,
1848 iloc);
1849 } finally {
1850 setInstallLoc(origSetting);
1851 }
1852 }
1853 public void testUserI() {
1854 int userSetting = PackageHelper.APP_INSTALL_INTERNAL;
1855 setUserX(userSetting);
1856 }
1857 public void testUserE() {
1858 int userSetting = PackageHelper.APP_INSTALL_EXTERNAL;
1859 setUserX(userSetting);
1860 }
1861 public void testUserA() {
1862 int userSetting = PackageHelper.APP_INSTALL_AUTO;
1863 setUserX(userSetting);
1864 }
Suchi Amalapurapub56ae202010-02-04 22:51:07 -08001865 /*
1866 * TODO's
1867 * check version numbers for upgrades
1868 * check permissions of installed packages
1869 * how to do tests on updated system apps?
1870 * verify updates to system apps cannot be installed on the sdcard.
1871 */
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -08001872}