blob: 7c2851679a253bd30ea115ccba03639fbc91a0e8 [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
Brett Chabota3de7452010-03-25 13:49:26 -070017package android.content.pm;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080018
Brett Chabota3de7452010-03-25 13:49:26 -070019import com.android.frameworks.coretests.R;
Suchi Amalapurapu089262d2010-03-10 14:19:21 -080020import com.android.internal.content.PackageHelper;
21
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080022import android.content.BroadcastReceiver;
23import android.content.Context;
24import android.content.Intent;
25import android.content.IntentFilter;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080026import android.content.pm.PackageManager.NameNotFoundException;
27import android.content.res.Resources;
28import android.content.res.Resources.NotFoundException;
Brett Chabota3de7452010-03-25 13:49:26 -070029import android.net.Uri;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080030import android.os.Environment;
Brett Chabota3de7452010-03-25 13:49:26 -070031import android.os.FileUtils;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -080032import android.os.IBinder;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080033import android.os.RemoteException;
34import android.os.ServiceManager;
35import android.os.StatFs;
Brett Chabota3de7452010-03-25 13:49:26 -070036import android.os.storage.IMountService;
37import android.os.storage.StorageListener;
38import android.os.storage.StorageManager;
39import android.os.storage.StorageResultCode;
Suchi Amalapurapu117818e2010-02-09 03:45:40 -080040import android.provider.Settings;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -080041import android.provider.Settings.SettingNotFoundException;
Brett Chabota3de7452010-03-25 13:49:26 -070042import android.test.AndroidTestCase;
Brett Chabotf76c56b2010-07-26 17:28:17 -070043import android.test.suitebuilder.annotation.LargeTest;
Brett Chabota3de7452010-03-25 13:49:26 -070044import android.util.DisplayMetrics;
45import android.util.Log;
46
47import java.io.File;
48import java.io.InputStream;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080049
50public class PackageManagerTests extends AndroidTestCase {
Suchi Amalapurapub56ae202010-02-04 22:51:07 -080051 private static final boolean localLOGV = true;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080052 public static final String TAG="PackageManagerTests";
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -080053 public final long MAX_WAIT_TIME = 25*1000;
54 public final long WAIT_TIME_INCR = 5*1000;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -080055 private static final String SECURE_CONTAINERS_PREFIX = "/mnt/asec";
Suchi Amalapurapu089262d2010-03-10 14:19:21 -080056 private static final int APP_INSTALL_AUTO = PackageHelper.APP_INSTALL_AUTO;
57 private static final int APP_INSTALL_DEVICE = PackageHelper.APP_INSTALL_INTERNAL;
58 private static final int APP_INSTALL_SDCARD = PackageHelper.APP_INSTALL_EXTERNAL;
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -070059 private boolean mOrigState;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -080060
61 void failStr(String errMsg) {
62 Log.w(TAG, "errMsg="+errMsg);
63 fail(errMsg);
64 }
65 void failStr(Exception e) {
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -070066 failStr(e.getMessage());
Suchi Amalapurapub56ae202010-02-04 22:51:07 -080067 }
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080068
69 @Override
70 protected void setUp() throws Exception {
71 super.setUp();
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -070072 mOrigState = getMediaState();
Suchi Amalapurapue99bb5f2010-03-19 14:36:49 -070073 if (!mountMedia()) {
74 Log.i(TAG, "sdcard not mounted? Some of these tests might fail");
75 }
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -070076 }
77
78 @Override
79 protected void tearDown() throws Exception {
80 // Restore media state.
81 boolean newState = getMediaState();
82 if (newState != mOrigState) {
83 if (mOrigState) {
84 getMs().mountVolume(Environment.getExternalStorageDirectory().getPath());
85 } else {
86 getMs().unmountVolume(Environment.getExternalStorageDirectory().getPath(), true);
87 }
88 }
89 super.tearDown();
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -080090 }
91
92 private class PackageInstallObserver extends IPackageInstallObserver.Stub {
93 public int returnCode;
94 private boolean doneFlag = false;
95
96 public void packageInstalled(String packageName, int returnCode) {
97 synchronized(this) {
98 this.returnCode = returnCode;
99 doneFlag = true;
100 notifyAll();
101 }
102 }
103
104 public boolean isDone() {
105 return doneFlag;
106 }
107 }
108
109 abstract class GenericReceiver extends BroadcastReceiver {
110 private boolean doneFlag = false;
111 boolean received = false;
112 Intent intent;
113 IntentFilter filter;
114 abstract boolean notifyNow(Intent intent);
115 @Override
116 public void onReceive(Context context, Intent intent) {
117 if (notifyNow(intent)) {
118 synchronized (this) {
119 received = true;
120 doneFlag = true;
121 this.intent = intent;
122 notifyAll();
123 }
124 }
125 }
126
127 public boolean isDone() {
128 return doneFlag;
129 }
130
131 public void setFilter(IntentFilter filter) {
132 this.filter = filter;
133 }
134 }
135
136 class InstallReceiver extends GenericReceiver {
137 String pkgName;
138
139 InstallReceiver(String pkgName) {
140 this.pkgName = pkgName;
141 IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
142 filter.addDataScheme("package");
143 super.setFilter(filter);
144 }
145
146 public boolean notifyNow(Intent intent) {
147 String action = intent.getAction();
148 if (!Intent.ACTION_PACKAGE_ADDED.equals(action)) {
149 return false;
150 }
151 Uri data = intent.getData();
152 String installedPkg = data.getEncodedSchemeSpecificPart();
153 if (pkgName.equals(installedPkg)) {
154 return true;
155 }
156 return false;
157 }
158 }
159
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700160 private PackageManager getPm() {
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800161 return mContext.getPackageManager();
162 }
163
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700164 private IPackageManager getIPm() {
165 IPackageManager ipm = IPackageManager.Stub.asInterface(
166 ServiceManager.getService("package"));
167 return ipm;
168 }
169
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800170 public boolean invokeInstallPackage(Uri packageURI, int flags,
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700171 GenericReceiver receiver) throws Exception {
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800172 PackageInstallObserver observer = new PackageInstallObserver();
173 final boolean received = false;
174 mContext.registerReceiver(receiver, receiver.filter);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -0800175 final boolean DEBUG = true;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800176 try {
177 // Wait on observer
178 synchronized(observer) {
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800179 synchronized (receiver) {
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800180 getPm().installPackage(packageURI, observer, flags, null);
181 long waitTime = 0;
182 while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
183 observer.wait(WAIT_TIME_INCR);
184 waitTime += WAIT_TIME_INCR;
185 }
186 if(!observer.isDone()) {
187 throw new Exception("Timed out waiting for packageInstalled callback");
188 }
189 if (observer.returnCode != PackageManager.INSTALL_SUCCEEDED) {
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -0800190 Log.i(TAG, "Failed to install with error code = " + observer.returnCode);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800191 return false;
192 }
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800193 // Verify we received the broadcast
194 waitTime = 0;
195 while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
196 receiver.wait(WAIT_TIME_INCR);
197 waitTime += WAIT_TIME_INCR;
198 }
199 if(!receiver.isDone()) {
200 throw new Exception("Timed out waiting for PACKAGE_ADDED notification");
201 }
202 return receiver.received;
203 }
204 }
205 } finally {
206 mContext.unregisterReceiver(receiver);
207 }
208 }
209
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700210 public void invokeInstallPackageFail(Uri packageURI, int flags, int result) throws Exception {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800211 PackageInstallObserver observer = new PackageInstallObserver();
212 try {
213 // Wait on observer
214 synchronized(observer) {
215 getPm().installPackage(packageURI, observer, flags, null);
216 long waitTime = 0;
217 while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
218 observer.wait(WAIT_TIME_INCR);
219 waitTime += WAIT_TIME_INCR;
220 }
221 if(!observer.isDone()) {
222 throw new Exception("Timed out waiting for packageInstalled callback");
223 }
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700224 assertEquals(observer.returnCode, result);
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800225 }
226 } finally {
227 }
228 }
229
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800230 Uri getInstallablePackage(int fileResId, File outFile) {
231 Resources res = mContext.getResources();
232 InputStream is = null;
233 try {
234 is = res.openRawResource(fileResId);
235 } catch (NotFoundException e) {
236 failStr("Failed to load resource with id: " + fileResId);
237 }
238 FileUtils.setPermissions(outFile.getPath(),
239 FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IRWXO,
240 -1, -1);
241 assertTrue(FileUtils.copyToFile(is, outFile));
242 FileUtils.setPermissions(outFile.getPath(),
243 FileUtils.S_IRWXU | FileUtils.S_IRWXG | FileUtils.S_IRWXO,
244 -1, -1);
245 return Uri.fromFile(outFile);
246 }
247
248 private PackageParser.Package parsePackage(Uri packageURI) {
249 final String archiveFilePath = packageURI.getPath();
250 PackageParser packageParser = new PackageParser(archiveFilePath);
251 File sourceFile = new File(archiveFilePath);
252 DisplayMetrics metrics = new DisplayMetrics();
253 metrics.setToDefaults();
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -0800254 PackageParser.Package pkg = packageParser.parsePackage(sourceFile, archiveFilePath, metrics, 0);
255 packageParser = null;
256 return pkg;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800257 }
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700258 private boolean checkSd(long pkgLen) {
259 String status = Environment.getExternalStorageState();
260 if (!status.equals(Environment.MEDIA_MOUNTED)) {
261 return false;
262 }
263 long sdSize = -1;
264 StatFs sdStats = new StatFs(
265 Environment.getExternalStorageDirectory().getPath());
266 sdSize = (long)sdStats.getAvailableBlocks() *
267 (long)sdStats.getBlockSize();
268 // TODO check for thesholds here
269 return pkgLen <= sdSize;
Neal Nguyenedb979a2010-04-22 13:54:32 -0700270
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700271 }
272 private boolean checkInt(long pkgLen) {
273 StatFs intStats = new StatFs(Environment.getDataDirectory().getPath());
274 long intSize = (long)intStats.getBlockCount() *
275 (long)intStats.getBlockSize();
276 long iSize = (long)intStats.getAvailableBlocks() *
277 (long)intStats.getBlockSize();
278 // TODO check for thresholds here?
279 return pkgLen <= iSize;
280 }
281 private static final int INSTALL_LOC_INT = 1;
282 private static final int INSTALL_LOC_SD = 2;
283 private static final int INSTALL_LOC_ERR = -1;
284 private int getInstallLoc(int flags, int expInstallLocation, long pkgLen) {
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800285 // Flags explicitly over ride everything else.
286 if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0 ) {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700287 return INSTALL_LOC_INT;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800288 } else if ((flags & PackageManager.INSTALL_EXTERNAL) != 0 ) {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700289 return INSTALL_LOC_SD;
290 } else if ((flags & PackageManager.INSTALL_INTERNAL) != 0) {
291 return INSTALL_LOC_INT;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800292 }
293 // Manifest option takes precedence next
294 if (expInstallLocation == PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL) {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700295 if (checkSd(pkgLen)) {
296 return INSTALL_LOC_SD;
297 }
298 if (checkInt(pkgLen)) {
299 return INSTALL_LOC_INT;
300 }
301 return INSTALL_LOC_ERR;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800302 }
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -0800303 if (expInstallLocation == PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY) {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700304 if (checkInt(pkgLen)) {
305 return INSTALL_LOC_INT;
306 }
307 return INSTALL_LOC_ERR;
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -0800308 }
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700309 if (expInstallLocation == PackageInfo.INSTALL_LOCATION_AUTO) {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700310 // Check for free memory internally
311 if (checkInt(pkgLen)) {
312 return INSTALL_LOC_INT;
313 }
314 // Check for free memory externally
315 if (checkSd(pkgLen)) {
316 return INSTALL_LOC_SD;
317 }
318 return INSTALL_LOC_ERR;
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700319 }
320 // Check for settings preference.
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800321 boolean checkSd = false;
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700322 int userPref = getDefaultInstallLoc();
323 if (userPref == APP_INSTALL_DEVICE) {
324 if (checkInt(pkgLen)) {
325 return INSTALL_LOC_INT;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800326 }
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700327 return INSTALL_LOC_ERR;
328 } else if (userPref == APP_INSTALL_SDCARD) {
329 if (checkSd(pkgLen)) {
330 return INSTALL_LOC_SD;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800331 }
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700332 return INSTALL_LOC_ERR;
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -0700333 }
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700334 // Default system policy for apps with no manifest option specified.
335 // Check for free memory internally
336 if (checkInt(pkgLen)) {
337 return INSTALL_LOC_INT;
338 }
339 return INSTALL_LOC_ERR;
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800340 }
Neal Nguyenedb979a2010-04-22 13:54:32 -0700341
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800342 private void assertInstall(PackageParser.Package pkg, int flags, int expInstallLocation) {
343 try {
344 String pkgName = pkg.packageName;
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700345 ApplicationInfo info = getPm().getApplicationInfo(pkgName, 0);
346 assertNotNull(info);
347 assertEquals(pkgName, info.packageName);
348 File dataDir = Environment.getDataDirectory();
349 String appInstallPath = new File(dataDir, "app").getPath();
350 String drmInstallPath = new File(dataDir, "app-private").getPath();
351 File srcDir = new File(info.sourceDir);
352 String srcPath = srcDir.getParent();
353 File publicSrcDir = new File(info.publicSourceDir);
354 String publicSrcPath = publicSrcDir.getParent();
355 long pkgLen = new File(info.sourceDir).length();
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800356
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700357 if ((flags & PackageManager.INSTALL_FORWARD_LOCK) != 0) {
358 assertTrue((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0);
359 assertEquals(srcPath, drmInstallPath);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800360 assertEquals(publicSrcPath, appInstallPath);
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800361 } else {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -0700362 assertFalse((info.flags & ApplicationInfo.FLAG_FORWARD_LOCK) != 0);
363 int rLoc = getInstallLoc(flags, expInstallLocation, pkgLen);
364 if (rLoc == INSTALL_LOC_INT) {
365 assertEquals(srcPath, appInstallPath);
366 assertEquals(publicSrcPath, appInstallPath);
367 assertFalse((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
368 } else if (rLoc == INSTALL_LOC_SD){
369 assertTrue((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
370 assertTrue(srcPath.startsWith(SECURE_CONTAINERS_PREFIX));
371 assertTrue(publicSrcPath.startsWith(SECURE_CONTAINERS_PREFIX));
372 } else {
373 // TODO handle error. Install should have failed.
374 }
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800375 }
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800376 } catch (NameNotFoundException e) {
377 failStr("failed with exception : " + e);
378 }
379 }
Neal Nguyenedb979a2010-04-22 13:54:32 -0700380
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800381 private void assertNotInstalled(String pkgName) {
382 try {
383 ApplicationInfo info = getPm().getApplicationInfo(pkgName, 0);
384 fail(pkgName + " shouldnt be installed");
385 } catch (NameNotFoundException e) {
386 }
387 }
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800388
389 class InstallParams {
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800390 Uri packageURI;
391 PackageParser.Package pkg;
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700392 InstallParams(String outFileName, int rawResId) {
393 this.pkg = getParsedPackage(outFileName, rawResId);
394 this.packageURI = Uri.fromFile(new File(pkg.mScanPath));
395 }
396 InstallParams(PackageParser.Package pkg) {
397 this.packageURI = Uri.fromFile(new File(pkg.mScanPath));
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800398 this.pkg = pkg;
399 }
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700400 long getApkSize() {
401 File file = new File(pkg.mScanPath);
402 return file.length();
403 }
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800404 }
405
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800406 private InstallParams sampleInstallFromRawResource(int flags, boolean cleanUp) {
407 return installFromRawResource("install.apk", R.raw.install, flags, cleanUp,
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -0700408 false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800409 }
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -0800410
Dianne Hackbornd4310ac2010-03-16 22:55:08 -0700411 static final String PERM_PACKAGE = "package";
412 static final String PERM_DEFINED = "defined";
413 static final String PERM_UNDEFINED = "undefined";
414 static final String PERM_USED = "used";
415 static final String PERM_NOTUSED = "notused";
Neal Nguyenedb979a2010-04-22 13:54:32 -0700416
Dianne Hackbornd4310ac2010-03-16 22:55:08 -0700417 private void assertPermissions(String[] cmds) {
418 final PackageManager pm = getPm();
419 String pkg = null;
420 PackageInfo pkgInfo = null;
421 String mode = PERM_DEFINED;
422 int i = 0;
423 while (i < cmds.length) {
424 String cmd = cmds[i++];
425 if (cmd == PERM_PACKAGE) {
426 pkg = cmds[i++];
427 try {
428 pkgInfo = pm.getPackageInfo(pkg,
429 PackageManager.GET_PERMISSIONS
430 | PackageManager.GET_UNINSTALLED_PACKAGES);
431 } catch (NameNotFoundException e) {
432 pkgInfo = null;
433 }
434 } else if (cmd == PERM_DEFINED || cmd == PERM_UNDEFINED
435 || cmd == PERM_USED || cmd == PERM_NOTUSED) {
436 mode = cmds[i++];
437 } else {
438 if (mode == PERM_DEFINED) {
439 try {
440 PermissionInfo pi = pm.getPermissionInfo(cmd, 0);
441 assertNotNull(pi);
442 assertEquals(pi.packageName, pkg);
443 assertEquals(pi.name, cmd);
444 assertNotNull(pkgInfo);
445 boolean found = false;
446 for (int j=0; j<pkgInfo.permissions.length && !found; j++) {
447 if (pkgInfo.permissions[j].name.equals(cmd)) {
448 found = true;
449 }
450 }
451 if (!found) {
452 fail("Permission not found: " + cmd);
453 }
454 } catch (NameNotFoundException e) {
455 throw new RuntimeException(e);
456 }
457 } else if (mode == PERM_UNDEFINED) {
458 try {
459 pm.getPermissionInfo(cmd, 0);
460 throw new RuntimeException("Permission exists: " + cmd);
461 } catch (NameNotFoundException e) {
462 }
463 if (pkgInfo != null) {
464 boolean found = false;
465 for (int j=0; j<pkgInfo.permissions.length && !found; j++) {
466 if (pkgInfo.permissions[j].name.equals(cmd)) {
467 found = true;
468 }
469 }
470 if (found) {
471 fail("Permission still exists: " + cmd);
472 }
473 }
474 } else if (mode == PERM_USED || mode == PERM_NOTUSED) {
475 boolean found = false;
476 for (int j=0; j<pkgInfo.requestedPermissions.length && !found; j++) {
477 if (pkgInfo.requestedPermissions[j].equals(cmd)) {
478 found = true;
479 }
480 }
481 if (!found) {
482 fail("Permission not requested: " + cmd);
483 }
484 if (mode == PERM_USED) {
485 if (pm.checkPermission(cmd, pkg)
486 != PackageManager.PERMISSION_GRANTED) {
487 fail("Permission not granted: " + cmd);
488 }
489 } else {
490 if (pm.checkPermission(cmd, pkg)
491 != PackageManager.PERMISSION_DENIED) {
492 fail("Permission granted: " + cmd);
493 }
494 }
495 }
496 }
497 }
498 }
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -0800499
Suchi Amalapurapuae181712010-03-30 14:01:02 -0700500 private PackageParser.Package getParsedPackage(String outFileName, int rawResId) {
501 PackageManager pm = mContext.getPackageManager();
502 File filesDir = mContext.getFilesDir();
503 File outFile = new File(filesDir, outFileName);
504 Uri packageURI = getInstallablePackage(rawResId, outFile);
505 PackageParser.Package pkg = parsePackage(packageURI);
506 return pkg;
507 }
508
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800509 /*
510 * Utility function that reads a apk bundled as a raw resource
511 * copies it into own data directory and invokes
512 * PackageManager api to install it.
513 */
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700514 private void installFromRawResource(InstallParams ip,
515 int flags, boolean cleanUp, boolean fail, int result,
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800516 int expInstallLocation) {
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800517 PackageManager pm = mContext.getPackageManager();
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700518 PackageParser.Package pkg = ip.pkg;
519 Uri packageURI = ip.packageURI;
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800520 if ((flags & PackageManager.INSTALL_REPLACE_EXISTING) == 0) {
521 // Make sure the package doesn't exist
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800522 try {
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800523 ApplicationInfo appInfo = pm.getApplicationInfo(pkg.packageName,
524 PackageManager.GET_UNINSTALLED_PACKAGES);
525 GenericReceiver receiver = new DeleteReceiver(pkg.packageName);
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700526 invokeDeletePackage(pkg.packageName, 0, receiver);
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800527 } catch (NameNotFoundException e1) {
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800528 } catch (Exception e) {
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800529 failStr(e);
530 }
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800531 }
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800532 try {
533 if (fail) {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700534 invokeInstallPackageFail(packageURI, flags, result);
Suchi Amalapurapuae181712010-03-30 14:01:02 -0700535 if ((flags & PackageManager.INSTALL_REPLACE_EXISTING) == 0) {
536 assertNotInstalled(pkg.packageName);
537 }
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800538 } else {
539 InstallReceiver receiver = new InstallReceiver(pkg.packageName);
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700540 assertTrue(invokeInstallPackage(packageURI, flags, receiver));
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800541 // Verify installed information
542 assertInstall(pkg, flags, expInstallLocation);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800543 }
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800544 } catch (Exception e) {
545 failStr("Failed with exception : " + e);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800546 } finally {
547 if (cleanUp) {
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -0800548 cleanUpInstall(ip);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800549 }
550 }
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700551 }
552
553 /*
554 * Utility function that reads a apk bundled as a raw resource
555 * copies it into own data directory and invokes
556 * PackageManager api to install it.
557 */
558 private InstallParams installFromRawResource(String outFileName,
559 int rawResId, int flags, boolean cleanUp, boolean fail, int result,
560 int expInstallLocation) {
561 PackageManager pm = mContext.getPackageManager();
562 InstallParams ip = new InstallParams(outFileName, rawResId);
563 installFromRawResource(ip, flags, cleanUp, fail, result, expInstallLocation);
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800564 return ip;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800565 }
566
Brett Chabotf76c56b2010-07-26 17:28:17 -0700567 @LargeTest
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800568 public void testInstallNormalInternal() {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800569 sampleInstallFromRawResource(0, true);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800570 }
571
Brett Chabotf76c56b2010-07-26 17:28:17 -0700572 @LargeTest
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800573 public void testInstallFwdLockedInternal() {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800574 sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800575 }
576
Brett Chabotf76c56b2010-07-26 17:28:17 -0700577 @LargeTest
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800578 public void testInstallSdcard() {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800579 sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, true);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800580 }
581
582 /* ------------------------- Test replacing packages --------------*/
583 class ReplaceReceiver extends GenericReceiver {
584 String pkgName;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800585 final static int INVALID = -1;
586 final static int REMOVED = 1;
587 final static int ADDED = 2;
588 final static int REPLACED = 3;
589 int removed = INVALID;
590 // for updated system apps only
591 boolean update = false;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800592
593 ReplaceReceiver(String pkgName) {
594 this.pkgName = pkgName;
595 filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800596 filter.addAction(Intent.ACTION_PACKAGE_ADDED);
597 if (update) {
598 filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
599 }
600 filter.addDataScheme("package");
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800601 super.setFilter(filter);
602 }
603
604 public boolean notifyNow(Intent intent) {
605 String action = intent.getAction();
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800606 Uri data = intent.getData();
607 String installedPkg = data.getEncodedSchemeSpecificPart();
608 if (pkgName == null || !pkgName.equals(installedPkg)) {
609 return false;
610 }
611 if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
612 removed = REMOVED;
613 } else if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
614 if (removed != REMOVED) {
615 return false;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800616 }
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800617 boolean replacing = intent.getBooleanExtra(Intent.EXTRA_REPLACING, false);
618 if (!replacing) {
619 return false;
620 }
621 removed = ADDED;
622 if (!update) {
623 return true;
624 }
625 } else if (Intent.ACTION_PACKAGE_REPLACED.equals(action)) {
626 if (removed != ADDED) {
627 return false;
628 }
629 removed = REPLACED;
630 return true;
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800631 }
632 return false;
633 }
634 }
635
636 /*
637 * Utility function that reads a apk bundled as a raw resource
638 * copies it into own data directory and invokes
639 * PackageManager api to install first and then replace it
640 * again.
641 */
Suchi Amalapurapuae181712010-03-30 14:01:02 -0700642 private void sampleReplaceFromRawResource(int flags) {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800643 InstallParams ip = sampleInstallFromRawResource(flags, false);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800644 boolean replace = ((flags & PackageManager.INSTALL_REPLACE_EXISTING) != 0);
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800645 Log.i(TAG, "replace=" + replace);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800646 GenericReceiver receiver;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800647 if (replace) {
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800648 receiver = new ReplaceReceiver(ip.pkg.packageName);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800649 Log.i(TAG, "Creating replaceReceiver");
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800650 } else {
651 receiver = new InstallReceiver(ip.pkg.packageName);
652 }
653 try {
654 try {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700655 assertEquals(invokeInstallPackage(ip.packageURI, flags, receiver), replace);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800656 if (replace) {
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800657 assertInstall(ip.pkg, flags, ip.pkg.installLocation);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800658 }
659 } catch (Exception e) {
660 failStr("Failed with exception : " + e);
661 }
662 } finally {
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800663 cleanUpInstall(ip);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800664 }
665 }
666
Brett Chabotf76c56b2010-07-26 17:28:17 -0700667 @LargeTest
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800668 public void testReplaceFailNormalInternal() {
Suchi Amalapurapuae181712010-03-30 14:01:02 -0700669 sampleReplaceFromRawResource(0);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800670 }
671
Brett Chabotf76c56b2010-07-26 17:28:17 -0700672 @LargeTest
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800673 public void testReplaceFailFwdLockedInternal() {
Suchi Amalapurapuae181712010-03-30 14:01:02 -0700674 sampleReplaceFromRawResource(PackageManager.INSTALL_FORWARD_LOCK);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800675 }
676
Brett Chabotf76c56b2010-07-26 17:28:17 -0700677 @LargeTest
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800678 public void testReplaceFailSdcard() {
Suchi Amalapurapuae181712010-03-30 14:01:02 -0700679 sampleReplaceFromRawResource(PackageManager.INSTALL_EXTERNAL);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800680 }
681
Brett Chabotf76c56b2010-07-26 17:28:17 -0700682 @LargeTest
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800683 public void testReplaceNormalInternal() {
Suchi Amalapurapuae181712010-03-30 14:01:02 -0700684 sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800685 }
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800686
Brett Chabotf76c56b2010-07-26 17:28:17 -0700687 @LargeTest
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800688 public void testReplaceFwdLockedInternal() {
Suchi Amalapurapuae181712010-03-30 14:01:02 -0700689 sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING |
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800690 PackageManager.INSTALL_FORWARD_LOCK);
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -0800691 }
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800692
Brett Chabotf76c56b2010-07-26 17:28:17 -0700693 @LargeTest
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800694 public void testReplaceSdcard() {
Suchi Amalapurapuae181712010-03-30 14:01:02 -0700695 sampleReplaceFromRawResource(PackageManager.INSTALL_REPLACE_EXISTING |
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800696 PackageManager.INSTALL_EXTERNAL);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800697 }
698
699 /* -------------- Delete tests ---*/
700 class DeleteObserver extends IPackageDeleteObserver.Stub {
701
702 public boolean succeeded;
703 private boolean doneFlag = false;
704
705 public boolean isDone() {
706 return doneFlag;
707 }
708
709 public void packageDeleted(boolean succeeded) throws RemoteException {
710 synchronized(this) {
711 this.succeeded = succeeded;
712 doneFlag = true;
713 notifyAll();
714 }
715 }
716 }
717
718 class DeleteReceiver extends GenericReceiver {
719 String pkgName;
720
721 DeleteReceiver(String pkgName) {
722 this.pkgName = pkgName;
723 IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_REMOVED);
724 filter.addDataScheme("package");
725 super.setFilter(filter);
726 }
727
728 public boolean notifyNow(Intent intent) {
729 String action = intent.getAction();
730 if (!Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
731 return false;
732 }
733 Uri data = intent.getData();
734 String installedPkg = data.getEncodedSchemeSpecificPart();
735 if (pkgName.equals(installedPkg)) {
736 return true;
737 }
738 return false;
739 }
740 }
741
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700742 public boolean invokeDeletePackage(final String pkgName, int flags,
743 GenericReceiver receiver) throws Exception {
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800744 DeleteObserver observer = new DeleteObserver();
745 final boolean received = false;
746 mContext.registerReceiver(receiver, receiver.filter);
747 try {
748 // Wait on observer
749 synchronized(observer) {
750 synchronized (receiver) {
751 getPm().deletePackage(pkgName, observer, flags);
752 long waitTime = 0;
753 while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
754 observer.wait(WAIT_TIME_INCR);
755 waitTime += WAIT_TIME_INCR;
756 }
757 if(!observer.isDone()) {
758 throw new Exception("Timed out waiting for packageInstalled callback");
759 }
760 // Verify we received the broadcast
761 waitTime = 0;
762 while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
763 receiver.wait(WAIT_TIME_INCR);
764 waitTime += WAIT_TIME_INCR;
765 }
766 if(!receiver.isDone()) {
Suchi Amalapurapuc7537ee2010-03-24 09:27:19 -0700767 throw new Exception("Timed out waiting for PACKAGE_REMOVED notification");
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800768 }
769 return receiver.received;
770 }
771 }
772 } finally {
773 mContext.unregisterReceiver(receiver);
774 }
775 }
776
777 public void deleteFromRawResource(int iFlags, int dFlags) {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800778 InstallParams ip = sampleInstallFromRawResource(iFlags, false);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800779 boolean retainData = ((dFlags & PackageManager.DONT_DELETE_DATA) != 0);
780 GenericReceiver receiver = new DeleteReceiver(ip.pkg.packageName);
781 DeleteObserver observer = new DeleteObserver();
782 try {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700783 assertTrue(invokeDeletePackage(ip.pkg.packageName, dFlags, receiver));
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800784 ApplicationInfo info = null;
785 Log.i(TAG, "okay4");
786 try {
787 info = getPm().getApplicationInfo(ip.pkg.packageName,
788 PackageManager.GET_UNINSTALLED_PACKAGES);
789 } catch (NameNotFoundException e) {
790 info = null;
791 }
792 if (retainData) {
793 assertNotNull(info);
794 assertEquals(info.packageName, ip.pkg.packageName);
795 File file = new File(info.dataDir);
796 assertTrue(file.exists());
797 } else {
798 assertNull(info);
799 }
800 } catch (Exception e) {
801 failStr(e);
802 } finally {
803 cleanUpInstall(ip);
804 }
805 }
806
Brett Chabotf76c56b2010-07-26 17:28:17 -0700807 @LargeTest
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800808 public void testDeleteNormalInternal() {
809 deleteFromRawResource(0, 0);
810 }
811
Brett Chabotf76c56b2010-07-26 17:28:17 -0700812 @LargeTest
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800813 public void testDeleteFwdLockedInternal() {
814 deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, 0);
815 }
816
Brett Chabotf76c56b2010-07-26 17:28:17 -0700817 @LargeTest
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800818 public void testDeleteSdcard() {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800819 deleteFromRawResource(PackageManager.INSTALL_EXTERNAL, 0);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800820 }
821
Brett Chabotf76c56b2010-07-26 17:28:17 -0700822 @LargeTest
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800823 public void testDeleteNormalInternalRetainData() {
824 deleteFromRawResource(0, PackageManager.DONT_DELETE_DATA);
825 }
826
Brett Chabotf76c56b2010-07-26 17:28:17 -0700827 @LargeTest
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800828 public void testDeleteFwdLockedInternalRetainData() {
829 deleteFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, PackageManager.DONT_DELETE_DATA);
830 }
831
Brett Chabotf76c56b2010-07-26 17:28:17 -0700832 @LargeTest
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800833 public void testDeleteSdcardRetainData() {
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -0800834 deleteFromRawResource(PackageManager.INSTALL_EXTERNAL, PackageManager.DONT_DELETE_DATA);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800835 }
836
837 /* sdcard mount/unmount tests ******/
838
839 class SdMountReceiver extends GenericReceiver {
840 String pkgNames[];
841 boolean status = true;
842
843 SdMountReceiver(String[] pkgNames) {
844 this.pkgNames = pkgNames;
845 IntentFilter filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
846 super.setFilter(filter);
847 }
848
849 public boolean notifyNow(Intent intent) {
850 Log.i(TAG, "okay 1");
851 String action = intent.getAction();
852 if (!Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) {
853 return false;
854 }
855 String rpkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
856 for (String pkg : pkgNames) {
857 boolean found = false;
858 for (String rpkg : rpkgList) {
859 if (rpkg.equals(pkg)) {
860 found = true;
861 break;
862 }
863 }
864 if (!found) {
865 status = false;
866 return true;
867 }
868 }
869 return true;
870 }
871 }
872
873 class SdUnMountReceiver extends GenericReceiver {
874 String pkgNames[];
875 boolean status = true;
876
877 SdUnMountReceiver(String[] pkgNames) {
878 this.pkgNames = pkgNames;
879 IntentFilter filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
880 super.setFilter(filter);
881 }
882
883 public boolean notifyNow(Intent intent) {
884 String action = intent.getAction();
885 if (!Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
886 return false;
887 }
888 String rpkgList[] = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
889 for (String pkg : pkgNames) {
890 boolean found = false;
891 for (String rpkg : rpkgList) {
892 if (rpkg.equals(pkg)) {
893 found = true;
894 break;
895 }
896 }
897 if (!found) {
898 status = false;
899 return true;
900 }
901 }
902 return true;
903 }
904 }
905
906 IMountService getMs() {
907 IBinder service = ServiceManager.getService("mount");
908 if (service != null) {
909 return IMountService.Stub.asInterface(service);
910 } else {
911 Log.e(TAG, "Can't get mount service");
912 }
913 return null;
914 }
915
916 boolean getMediaState() {
917 try {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700918 String mPath = Environment.getExternalStorageDirectory().getPath();
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800919 String state = getMs().getVolumeState(mPath);
920 return Environment.MEDIA_MOUNTED.equals(state);
921 } catch (RemoteException e) {
922 return false;
923 }
924 }
925
926 boolean mountMedia() {
927 if (getMediaState()) {
928 return true;
929 }
930 try {
931 String mPath = Environment.getExternalStorageDirectory().toString();
932 int ret = getMs().mountVolume(mPath);
San Mehatb1043402010-02-05 08:26:50 -0800933 return ret == StorageResultCode.OperationSucceeded;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800934 } catch (RemoteException e) {
935 return false;
936 }
937 }
938
939 private boolean unmountMedia() {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700940 String path = Environment.getExternalStorageDirectory().getPath();
941 try {
942 String state = getMs().getVolumeState(path);
943 if (Environment.MEDIA_UNMOUNTED.equals(state)) {
944 return true;
945 }
946 } catch (RemoteException e) {
947 failStr(e);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800948 }
Neal Nguyenedb979a2010-04-22 13:54:32 -0700949
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800950 StorageListener observer = new StorageListener();
951 StorageManager sm = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
952 sm.registerListener(observer);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800953 try {
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800954 // Wait on observer
955 synchronized(observer) {
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -0800956 getMs().unmountVolume(path, true);
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800957 long waitTime = 0;
958 while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
959 observer.wait(WAIT_TIME_INCR);
960 waitTime += WAIT_TIME_INCR;
961 }
962 if(!observer.isDone()) {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700963 throw new Exception("Timed out waiting for unmount media notification");
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800964 }
965 return true;
966 }
967 } catch (Exception e) {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -0700968 Log.e(TAG, "Exception : " + e);
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800969 return false;
970 } finally {
971 sm.unregisterListener(observer);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800972 }
973 }
974
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800975 private boolean mountFromRawResource() {
976 // Install pkg on sdcard
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800977 InstallParams ip = sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, false);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800978 if (localLOGV) Log.i(TAG, "Installed pkg on sdcard");
979 boolean origState = getMediaState();
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800980 boolean registeredReceiver = false;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800981 SdMountReceiver receiver = new SdMountReceiver(new String[]{ip.pkg.packageName});
982 try {
983 if (localLOGV) Log.i(TAG, "Unmounting media");
984 // Unmount media
985 assertTrue(unmountMedia());
986 if (localLOGV) Log.i(TAG, "Unmounted media");
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800987 // Register receiver here
988 PackageManager pm = getPm();
989 mContext.registerReceiver(receiver, receiver.filter);
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -0800990 registeredReceiver = true;
Suchi Amalapurapub56ae202010-02-04 22:51:07 -0800991
992 // Wait on receiver
993 synchronized (receiver) {
994 if (localLOGV) Log.i(TAG, "Mounting media");
995 // Mount media again
996 assertTrue(mountMedia());
997 if (localLOGV) Log.i(TAG, "Mounted media");
998 if (localLOGV) Log.i(TAG, "Waiting for notification");
999 long waitTime = 0;
1000 // Verify we received the broadcast
1001 waitTime = 0;
1002 while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
1003 receiver.wait(WAIT_TIME_INCR);
1004 waitTime += WAIT_TIME_INCR;
1005 }
1006 if(!receiver.isDone()) {
1007 failStr("Timed out waiting for EXTERNAL_APPLICATIONS notification");
1008 }
1009 return receiver.received;
1010 }
1011 } catch (InterruptedException e) {
1012 failStr(e);
1013 return false;
1014 } finally {
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -08001015 if (registeredReceiver) mContext.unregisterReceiver(receiver);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -08001016 // Restore original media state
1017 if (origState) {
1018 mountMedia();
1019 } else {
1020 unmountMedia();
1021 }
1022 if (localLOGV) Log.i(TAG, "Cleaning up install");
1023 cleanUpInstall(ip);
1024 }
1025 }
1026
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -08001027 /*
1028 * Install package on sdcard. Unmount and then mount the media.
1029 * (Use PackageManagerService private api for now)
1030 * Make sure the installed package is available.
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -08001031 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001032 @LargeTest
Suchi Amalapurapufb7bacf2010-05-18 14:38:18 -07001033 public void testMountSdNormalInternal() {
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -08001034 assertTrue(mountFromRawResource());
1035 }
1036
Suchi Amalapurapub56ae202010-02-04 22:51:07 -08001037 void cleanUpInstall(InstallParams ip) {
1038 if (ip == null) {
1039 return;
1040 }
1041 Runtime.getRuntime().gc();
1042 Log.i(TAG, "Deleting package : " + ip.pkg.packageName);
1043 getPm().deletePackage(ip.pkg.packageName, null, 0);
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07001044 File outFile = new File(ip.pkg.mScanPath);
Suchi Amalapurapub56ae202010-02-04 22:51:07 -08001045 if (outFile != null && outFile.exists()) {
1046 outFile.delete();
1047 }
1048 }
Suchi Amalapurapuae181712010-03-30 14:01:02 -07001049 void cleanUpInstall(String pkgName) {
1050 if (pkgName == null) {
1051 return;
1052 }
1053 Log.i(TAG, "Deleting package : " + pkgName);
1054 try {
1055 ApplicationInfo info = getPm().getApplicationInfo(pkgName,
1056 PackageManager.GET_UNINSTALLED_PACKAGES);
1057 if (info != null) {
1058 getPm().deletePackage(pkgName, null, 0);
1059 }
1060 } catch (NameNotFoundException e) {}
1061 }
Suchi Amalapurapu117818e2010-02-09 03:45:40 -08001062
Brett Chabotf76c56b2010-07-26 17:28:17 -07001063 @LargeTest
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -08001064 public void testManifestInstallLocationInternal() {
1065 installFromRawResource("install.apk", R.raw.install_loc_internal,
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -08001066 0, true, false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
Suchi Amalapurapu117818e2010-02-09 03:45:40 -08001067 }
1068
Brett Chabotf76c56b2010-07-26 17:28:17 -07001069 @LargeTest
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -08001070 public void testManifestInstallLocationSdcard() {
1071 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -08001072 0, true, false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
Suchi Amalapurapu117818e2010-02-09 03:45:40 -08001073 }
1074
Brett Chabotf76c56b2010-07-26 17:28:17 -07001075 @LargeTest
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -08001076 public void testManifestInstallLocationAuto() {
1077 installFromRawResource("install.apk", R.raw.install_loc_auto,
Suchi Amalapurapucf6eaea2010-02-23 19:37:45 -08001078 0, true, false, -1, PackageInfo.INSTALL_LOCATION_AUTO);
Suchi Amalapurapu117818e2010-02-09 03:45:40 -08001079 }
1080
Brett Chabotf76c56b2010-07-26 17:28:17 -07001081 @LargeTest
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -08001082 public void testManifestInstallLocationUnspecified() {
1083 installFromRawResource("install.apk", R.raw.install_loc_unspecified,
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07001084 0, true, false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
Suchi Amalapurapu117818e2010-02-09 03:45:40 -08001085 }
1086
Brett Chabotf76c56b2010-07-26 17:28:17 -07001087 @LargeTest
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001088 public void testManifestInstallLocationFwdLockedFlagSdcard() {
1089 installFromRawResource("install.apk", R.raw.install_loc_unspecified,
1090 PackageManager.INSTALL_FORWARD_LOCK |
1091 PackageManager.INSTALL_EXTERNAL, true, true,
1092 PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION,
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07001093 PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001094 }
1095
Brett Chabotf76c56b2010-07-26 17:28:17 -07001096 @LargeTest
Suchi Amalapurapu5b993ce2010-02-12 09:43:29 -08001097 public void testManifestInstallLocationFwdLockedSdcard() {
1098 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -08001099 PackageManager.INSTALL_FORWARD_LOCK, true, false,
1100 -1,
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001101 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1102 }
1103
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001104 /*
1105 * Install a package on internal flash via PackageManager install flag. Replace
1106 * the package via flag to install on sdcard. Make sure the new flag overrides
1107 * the old install location.
1108 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001109 @LargeTest
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001110 public void testReplaceFlagInternalSdcard() {
1111 int iFlags = 0;
1112 int rFlags = PackageManager.INSTALL_EXTERNAL;
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001113 InstallParams ip = sampleInstallFromRawResource(iFlags, false);
1114 GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName);
1115 int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING;
1116 try {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07001117 assertEquals(invokeInstallPackage(ip.packageURI, replaceFlags, receiver), true);
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001118 assertInstall(ip.pkg, rFlags, ip.pkg.installLocation);
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001119 } catch (Exception e) {
1120 failStr("Failed with exception : " + e);
1121 } finally {
1122 cleanUpInstall(ip);
1123 }
1124 }
1125
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001126 /*
1127 * Install a package on sdcard via PackageManager install flag. Replace
1128 * the package with no flags or manifest option and make sure the old
1129 * install location is retained.
1130 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001131 @LargeTest
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001132 public void testReplaceFlagSdcardInternal() {
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001133 int iFlags = PackageManager.INSTALL_EXTERNAL;
1134 int rFlags = 0;
1135 InstallParams ip = sampleInstallFromRawResource(iFlags, false);
1136 GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName);
1137 int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING;
1138 try {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07001139 assertEquals(invokeInstallPackage(ip.packageURI, replaceFlags, receiver), true);
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001140 assertInstall(ip.pkg, iFlags, ip.pkg.installLocation);
1141 } catch (Exception e) {
1142 failStr("Failed with exception : " + e);
1143 } finally {
1144 cleanUpInstall(ip);
1145 }
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001146 }
1147
Brett Chabotf76c56b2010-07-26 17:28:17 -07001148 @LargeTest
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001149 public void testManifestInstallLocationReplaceInternalSdcard() {
1150 int iFlags = 0;
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07001151 int iApk = R.raw.install_loc_internal;
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001152 int rFlags = 0;
1153 int rApk = R.raw.install_loc_sdcard;
1154 InstallParams ip = installFromRawResource("install.apk", iApk,
1155 iFlags, false,
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07001156 false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001157 GenericReceiver receiver = new ReplaceReceiver(ip.pkg.packageName);
1158 int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING;
1159 try {
1160 InstallParams rp = installFromRawResource("install.apk", rApk,
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001161 replaceFlags, false,
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001162 false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1163 assertInstall(rp.pkg, replaceFlags, rp.pkg.installLocation);
1164 } catch (Exception e) {
1165 failStr("Failed with exception : " + e);
1166 } finally {
1167 cleanUpInstall(ip);
1168 }
1169 }
1170
Brett Chabotf76c56b2010-07-26 17:28:17 -07001171 @LargeTest
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001172 public void testManifestInstallLocationReplaceSdcardInternal() {
1173 int iFlags = 0;
1174 int iApk = R.raw.install_loc_sdcard;
1175 int rFlags = 0;
1176 int rApk = R.raw.install_loc_unspecified;
1177 InstallParams ip = installFromRawResource("install.apk", iApk,
1178 iFlags, false,
1179 false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001180 int replaceFlags = rFlags | PackageManager.INSTALL_REPLACE_EXISTING;
1181 try {
1182 InstallParams rp = installFromRawResource("install.apk", rApk,
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001183 replaceFlags, false,
Suchi Amalapurapua2b6c372010-03-05 17:40:11 -08001184 false, -1, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1185 assertInstall(rp.pkg, replaceFlags, ip.pkg.installLocation);
1186 } catch (Exception e) {
1187 failStr("Failed with exception : " + e);
1188 } finally {
1189 cleanUpInstall(ip);
1190 }
Suchi Amalapurapu117818e2010-02-09 03:45:40 -08001191 }
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001192
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001193 class MoveReceiver extends GenericReceiver {
1194 String pkgName;
1195 final static int INVALID = -1;
1196 final static int REMOVED = 1;
1197 final static int ADDED = 2;
1198 int removed = INVALID;
1199
1200 MoveReceiver(String pkgName) {
1201 this.pkgName = pkgName;
1202 filter = new IntentFilter(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
1203 filter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
1204 super.setFilter(filter);
1205 }
1206
1207 public boolean notifyNow(Intent intent) {
1208 String action = intent.getAction();
1209 Log.i(TAG, "MoveReceiver::" + action);
1210 if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
1211 String[] list = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
1212 if (list != null) {
1213 for (String pkg : list) {
1214 if (pkg.equals(pkgName)) {
1215 removed = REMOVED;
1216 break;
1217 }
1218 }
1219 }
1220 removed = REMOVED;
1221 } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) {
1222 if (removed != REMOVED) {
1223 return false;
1224 }
1225 String[] list = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
1226 if (list != null) {
1227 for (String pkg : list) {
1228 if (pkg.equals(pkgName)) {
1229 removed = ADDED;
1230 return true;
1231 }
1232 }
1233 }
1234 }
1235 return false;
1236 }
1237 }
1238
1239 private class PackageMoveObserver extends IPackageMoveObserver.Stub {
1240 public int returnCode;
1241 private boolean doneFlag = false;
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001242 public String packageName;
1243 public PackageMoveObserver(String pkgName) {
1244 packageName = pkgName;
1245 }
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001246 public void packageMoved(String packageName, int returnCode) {
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001247 Log.i("DEBUG_MOVE::", "pkg = " + packageName + ", " + "ret = " + returnCode);
1248 if (!packageName.equals(this.packageName)) {
1249 return;
1250 }
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001251 synchronized(this) {
1252 this.returnCode = returnCode;
1253 doneFlag = true;
1254 notifyAll();
1255 }
1256 }
1257
1258 public boolean isDone() {
1259 return doneFlag;
1260 }
1261 }
1262
1263 public boolean invokeMovePackage(String pkgName, int flags,
1264 GenericReceiver receiver) throws Exception {
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001265 PackageMoveObserver observer = new PackageMoveObserver(pkgName);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001266 final boolean received = false;
1267 mContext.registerReceiver(receiver, receiver.filter);
1268 try {
1269 // Wait on observer
1270 synchronized(observer) {
1271 synchronized (receiver) {
1272 getPm().movePackage(pkgName, observer, flags);
1273 long waitTime = 0;
1274 while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
1275 observer.wait(WAIT_TIME_INCR);
1276 waitTime += WAIT_TIME_INCR;
1277 }
1278 if(!observer.isDone()) {
1279 throw new Exception("Timed out waiting for pkgmove callback");
1280 }
1281 if (observer.returnCode != PackageManager.MOVE_SUCCEEDED) {
1282 return false;
1283 }
1284 // Verify we received the broadcast
1285 waitTime = 0;
1286 while((!receiver.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
1287 receiver.wait(WAIT_TIME_INCR);
1288 waitTime += WAIT_TIME_INCR;
1289 }
1290 if(!receiver.isDone()) {
1291 throw new Exception("Timed out waiting for MOVE notifications");
1292 }
1293 return receiver.received;
1294 }
1295 }
1296 } finally {
1297 mContext.unregisterReceiver(receiver);
1298 }
1299 }
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001300 private boolean invokeMovePackageFail(String pkgName, int flags, int errCode) throws Exception {
1301 PackageMoveObserver observer = new PackageMoveObserver(pkgName);
1302 try {
1303 // Wait on observer
1304 synchronized(observer) {
1305 getPm().movePackage(pkgName, observer, flags);
1306 long waitTime = 0;
1307 while((!observer.isDone()) && (waitTime < MAX_WAIT_TIME) ) {
1308 observer.wait(WAIT_TIME_INCR);
1309 waitTime += WAIT_TIME_INCR;
1310 }
1311 if(!observer.isDone()) {
1312 throw new Exception("Timed out waiting for pkgmove callback");
1313 }
1314 assertEquals(errCode, observer.returnCode);
1315 }
1316 } finally {
1317 }
1318 return true;
1319 }
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001320
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07001321 private int getDefaultInstallLoc() {
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -08001322 int origDefaultLoc = PackageInfo.INSTALL_LOCATION_AUTO;
1323 try {
Suchi Amalapurapu40e47252010-04-07 16:15:50 -07001324 origDefaultLoc = Settings.System.getInt(mContext.getContentResolver(), Settings.Secure.DEFAULT_INSTALL_LOCATION);
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -08001325 } catch (SettingNotFoundException e1) {
1326 }
1327 return origDefaultLoc;
1328 }
1329
1330 private void setInstallLoc(int loc) {
1331 Settings.System.putInt(mContext.getContentResolver(),
Suchi Amalapurapu40e47252010-04-07 16:15:50 -07001332 Settings.Secure.DEFAULT_INSTALL_LOCATION, loc);
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -08001333 }
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001334 /*
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001335 * Tests for moving apps between internal and external storage
1336 */
1337 /*
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001338 * Utility function that reads a apk bundled as a raw resource
1339 * copies it into own data directory and invokes
1340 * PackageManager api to install first and then replace it
1341 * again.
1342 */
Neal Nguyenedb979a2010-04-22 13:54:32 -07001343
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001344 private void moveFromRawResource(String outFileName,
1345 int rawResId, int installFlags, int moveFlags, boolean cleanUp,
1346 boolean fail, int result) {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07001347 int origDefaultLoc = getDefaultInstallLoc();
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001348 InstallParams ip = null;
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001349 try {
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001350 setInstallLoc(PackageHelper.APP_INSTALL_AUTO);
1351 // Install first
1352 ip = installFromRawResource("install.apk", rawResId, installFlags, false,
1353 false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
1354 ApplicationInfo oldAppInfo = getPm().getApplicationInfo(ip.pkg.packageName, 0);
1355 if (fail) {
1356 assertTrue(invokeMovePackageFail(ip.pkg.packageName, moveFlags, result));
1357 ApplicationInfo info = getPm().getApplicationInfo(ip.pkg.packageName, 0);
1358 assertNotNull(info);
1359 assertEquals(oldAppInfo.flags, info.flags);
1360 } else {
1361 // Create receiver based on expRetCode
1362 MoveReceiver receiver = new MoveReceiver(ip.pkg.packageName);
1363 boolean retCode = invokeMovePackage(ip.pkg.packageName, moveFlags,
1364 receiver);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001365 assertTrue(retCode);
1366 ApplicationInfo info = getPm().getApplicationInfo(ip.pkg.packageName, 0);
1367 assertNotNull(info);
1368 if ((moveFlags & PackageManager.MOVE_INTERNAL) != 0) {
Suchi Amalapurapu6069beb2010-03-10 09:46:49 -08001369 assertTrue((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) == 0);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001370 } else if ((moveFlags & PackageManager.MOVE_EXTERNAL_MEDIA) != 0){
Suchi Amalapurapu6069beb2010-03-10 09:46:49 -08001371 assertTrue((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001372 }
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001373 }
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001374 } catch (NameNotFoundException e) {
1375 failStr("Pkg hasnt been installed correctly");
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001376 } catch (Exception e) {
1377 failStr("Failed with exception : " + e);
1378 } finally {
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001379 if (ip != null) {
1380 cleanUpInstall(ip);
1381 }
Suchi Amalapurapu9b10ef52010-03-03 09:45:24 -08001382 // Restore default install location
1383 setInstallLoc(origDefaultLoc);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001384 }
1385 }
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001386 private void sampleMoveFromRawResource(int installFlags, int moveFlags, boolean fail,
1387 int result) {
1388 moveFromRawResource("install.apk",
1389 R.raw.install, installFlags, moveFlags, true,
1390 fail, result);
1391 }
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001392
Brett Chabotf76c56b2010-07-26 17:28:17 -07001393 @LargeTest
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001394 public void testMoveAppInternalToExternal() {
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001395 int installFlags = PackageManager.INSTALL_INTERNAL;
1396 int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA;
1397 boolean fail = false;
1398 int result = PackageManager.MOVE_SUCCEEDED;
1399 sampleMoveFromRawResource(installFlags, moveFlags, fail, result);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001400 }
1401
Brett Chabotf76c56b2010-07-26 17:28:17 -07001402 @LargeTest
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001403 public void testMoveAppInternalToInternal() {
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001404 int installFlags = PackageManager.INSTALL_INTERNAL;
1405 int moveFlags = PackageManager.MOVE_INTERNAL;
1406 boolean fail = true;
1407 int result = PackageManager.MOVE_FAILED_INVALID_LOCATION;
1408 sampleMoveFromRawResource(installFlags, moveFlags, fail, result);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001409 }
1410
Brett Chabotf76c56b2010-07-26 17:28:17 -07001411 @LargeTest
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001412 public void testMoveAppExternalToExternal() {
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001413 int installFlags = PackageManager.INSTALL_EXTERNAL;
1414 int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA;
1415 boolean fail = true;
1416 int result = PackageManager.MOVE_FAILED_INVALID_LOCATION;
1417 sampleMoveFromRawResource(installFlags, moveFlags, fail, result);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001418 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001419 @LargeTest
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001420 public void testMoveAppExternalToInternal() {
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001421 int installFlags = PackageManager.INSTALL_EXTERNAL;
1422 int moveFlags = PackageManager.MOVE_INTERNAL;
1423 boolean fail = false;
1424 int result = PackageManager.MOVE_SUCCEEDED;
1425 sampleMoveFromRawResource(installFlags, moveFlags, fail, result);
Suchi Amalapurapu8946dd32010-02-19 09:19:34 -08001426 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001427 @LargeTest
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001428 public void testMoveAppForwardLocked() {
1429 int installFlags = PackageManager.INSTALL_FORWARD_LOCK;
1430 int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA;
1431 boolean fail = true;
1432 int result = PackageManager.MOVE_FAILED_FORWARD_LOCKED;
1433 sampleMoveFromRawResource(installFlags, moveFlags, fail, result);
1434 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001435 @LargeTest
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001436 public void testMoveAppFailInternalToExternalDelete() {
1437 int installFlags = 0;
1438 int moveFlags = PackageManager.MOVE_EXTERNAL_MEDIA;
1439 boolean fail = true;
1440 final int result = PackageManager.MOVE_FAILED_DOESNT_EXIST;
Neal Nguyenedb979a2010-04-22 13:54:32 -07001441
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001442 int rawResId = R.raw.install;
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07001443 int origDefaultLoc = getDefaultInstallLoc();
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001444 InstallParams ip = null;
1445 try {
1446 PackageManager pm = getPm();
1447 setInstallLoc(PackageHelper.APP_INSTALL_AUTO);
1448 // Install first
1449 ip = installFromRawResource("install.apk", R.raw.install, installFlags, false,
1450 false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
1451 // Delete the package now retaining data.
Suchi Amalapurapu9a212ad2010-05-18 11:06:53 -07001452 GenericReceiver receiver = new DeleteReceiver(ip.pkg.packageName);
1453 invokeDeletePackage(ip.pkg.packageName, PackageManager.DONT_DELETE_DATA, receiver);
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001454 assertTrue(invokeMovePackageFail(ip.pkg.packageName, moveFlags, result));
1455 } catch (Exception e) {
1456 failStr(e);
1457 } finally {
1458 if (ip != null) {
1459 cleanUpInstall(ip);
1460 }
1461 // Restore default install location
1462 setInstallLoc(origDefaultLoc);
1463 }
1464 }
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001465 /*
1466 * Test that an install error code is returned when media is unmounted
1467 * and package installed on sdcard via package manager flag.
1468 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001469 @LargeTest
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001470 public void testInstallSdcardUnmount() {
1471 boolean origState = getMediaState();
1472 try {
1473 // Unmount sdcard
1474 assertTrue(unmountMedia());
1475 // Try to install and make sure an error code is returned.
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07001476 installFromRawResource("install.apk", R.raw.install,
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001477 PackageManager.INSTALL_EXTERNAL, false,
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001478 true, PackageManager.INSTALL_FAILED_MEDIA_UNAVAILABLE,
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07001479 PackageInfo.INSTALL_LOCATION_AUTO);
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001480 } finally {
1481 // Restore original media state
1482 if (origState) {
1483 mountMedia();
1484 } else {
1485 unmountMedia();
1486 }
1487 }
1488 }
1489
1490 /*
Neal Nguyenedb979a2010-04-22 13:54:32 -07001491 * Unmount sdcard. Try installing an app with manifest option to install
1492 * on sdcard. Make sure it gets installed on internal flash.
1493 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001494 @LargeTest
Neal Nguyenedb979a2010-04-22 13:54:32 -07001495 public void testInstallManifestSdcardUnmount() {
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001496 boolean origState = getMediaState();
1497 try {
1498 // Unmount sdcard
1499 assertTrue(unmountMedia());
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07001500 InstallParams ip = new InstallParams("install.apk", R.raw.install_loc_sdcard);
1501 installFromRawResource(ip, 0, true, false, -1,
1502 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
Suchi Amalapurapu8a9ab242010-03-11 16:49:16 -08001503 } finally {
1504 // Restore original media state
1505 if (origState) {
1506 mountMedia();
1507 } else {
1508 unmountMedia();
1509 }
1510 }
1511 }
1512
1513 /*---------- Recommended install location tests ----*/
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001514 /* Precedence: FlagManifestExistingUser
1515 * PrecedenceSuffixes:
1516 * Flag : FlagI, FlagE, FlagF
1517 * I - internal, E - external, F - forward locked, Flag suffix absent if not using any option.
1518 * Manifest: ManifestI, ManifestE, ManifestA, Manifest suffix absent if not using any option.
1519 * Existing: Existing suffix absent if not existing.
Neal Nguyenedb979a2010-04-22 13:54:32 -07001520 * User: UserI, UserE, UserA, User suffix absent if not existing.
1521 *
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001522 */
1523 /*
1524 * Install an app on internal flash
1525 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001526 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001527 public void testFlagI() {
1528 sampleInstallFromRawResource(PackageManager.INSTALL_INTERNAL, true);
1529 }
1530 /*
1531 * Install an app on sdcard.
1532 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001533 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001534 public void testFlagE() {
1535 sampleInstallFromRawResource(PackageManager.INSTALL_EXTERNAL, true);
1536 }
1537
1538 /*
1539 * Install an app on sdcard.
1540 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001541 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001542 public void testFlagF() {
1543 sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK, true);
1544 }
1545 /*
1546 * Install an app with both internal and external flags set. should fail
1547 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001548 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001549 public void testFlagIE() {
1550 installFromRawResource("install.apk", R.raw.install,
1551 PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_INTERNAL,
1552 false,
1553 true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION,
1554 PackageInfo.INSTALL_LOCATION_AUTO);
1555 }
1556
1557 /*
1558 * Install an app with both internal and external flags set. should fail
1559 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001560 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001561 public void testFlagIF() {
1562 sampleInstallFromRawResource(PackageManager.INSTALL_FORWARD_LOCK |
1563 PackageManager.INSTALL_INTERNAL, true);
1564 }
1565 /*
1566 * Install an app with both internal and external flags set. should fail
1567 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001568 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001569 public void testFlagEF() {
1570 installFromRawResource("install.apk", R.raw.install,
1571 PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_EXTERNAL,
1572 false,
1573 true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION,
1574 PackageInfo.INSTALL_LOCATION_AUTO);
1575 }
1576 /*
1577 * Install an app with both internal and external flags set. should fail
1578 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001579 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001580 public void testFlagIEF() {
1581 installFromRawResource("install.apk", R.raw.install,
1582 PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_INTERNAL |
1583 PackageManager.INSTALL_EXTERNAL,
1584 false,
1585 true, PackageManager.INSTALL_FAILED_INVALID_INSTALL_LOCATION,
1586 PackageInfo.INSTALL_LOCATION_AUTO);
1587 }
1588 /*
1589 * Install an app with both internal and manifest option set.
1590 * should install on internal.
1591 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001592 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001593 public void testFlagIManifestI() {
1594 installFromRawResource("install.apk", R.raw.install_loc_internal,
1595 PackageManager.INSTALL_INTERNAL,
1596 true,
1597 false, -1,
1598 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
1599 }
1600 /*
1601 * Install an app with both internal and manifest preference for
1602 * preferExternal. Should install on internal.
1603 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001604 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001605 public void testFlagIManifestE() {
1606 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
1607 PackageManager.INSTALL_INTERNAL,
1608 true,
1609 false, -1,
1610 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
1611 }
1612 /*
1613 * Install an app with both internal and manifest preference for
1614 * auto. should install internal.
1615 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001616 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001617 public void testFlagIManifestA() {
1618 installFromRawResource("install.apk", R.raw.install_loc_auto,
1619 PackageManager.INSTALL_INTERNAL,
1620 true,
1621 false, -1,
1622 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
1623 }
1624 /*
1625 * Install an app with both external and manifest option set.
1626 * should install externally.
1627 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001628 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001629 public void testFlagEManifestI() {
1630 installFromRawResource("install.apk", R.raw.install_loc_internal,
1631 PackageManager.INSTALL_EXTERNAL,
1632 true,
1633 false, -1,
1634 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1635 }
1636 /*
1637 * Install an app with both external and manifest preference for
1638 * preferExternal. Should install externally.
1639 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001640 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001641 public void testFlagEManifestE() {
1642 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
1643 PackageManager.INSTALL_EXTERNAL,
1644 true,
1645 false, -1,
1646 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1647 }
1648 /*
1649 * Install an app with both external and manifest preference for
1650 * auto. should install on external media.
1651 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001652 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001653 public void testFlagEManifestA() {
1654 installFromRawResource("install.apk", R.raw.install_loc_auto,
1655 PackageManager.INSTALL_EXTERNAL,
1656 true,
1657 false, -1,
1658 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1659 }
1660 /*
1661 * Install an app with fwd locked flag set and install location set to
1662 * internal. should install internally.
1663 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001664 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001665 public void testFlagFManifestI() {
1666 installFromRawResource("install.apk", R.raw.install_loc_internal,
1667 PackageManager.INSTALL_EXTERNAL,
1668 true,
1669 false, -1,
1670 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1671 }
1672 /*
1673 * Install an app with fwd locked flag set and install location set to
1674 * preferExternal. should install internally.
1675 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001676 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001677 public void testFlagFManifestE() {
1678 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
1679 PackageManager.INSTALL_EXTERNAL,
1680 true,
1681 false, -1,
1682 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1683 }
1684 /*
1685 * Install an app with fwd locked flag set and install location set to
1686 * auto. should install internally.
1687 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001688 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001689 public void testFlagFManifestA() {
1690 installFromRawResource("install.apk", R.raw.install_loc_auto,
1691 PackageManager.INSTALL_EXTERNAL,
1692 true,
1693 false, -1,
1694 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1695 }
1696 /* The following test functions verify install location for existing apps.
1697 * ie existing app can be installed internally or externally. If install
1698 * flag is explicitly set it should override current location. If manifest location
1699 * is set, that should over ride current location too. if not the existing install
1700 * location should be honoured.
Neal Nguyenedb979a2010-04-22 13:54:32 -07001701 * testFlagI/E/F/ExistingI/E -
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001702 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001703 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001704 public void testFlagIExistingI() {
1705 int iFlags = PackageManager.INSTALL_INTERNAL;
1706 int rFlags = PackageManager.INSTALL_INTERNAL | PackageManager.INSTALL_REPLACE_EXISTING;
1707 // First install.
1708 installFromRawResource("install.apk", R.raw.install,
1709 iFlags,
1710 false,
1711 false, -1,
1712 -1);
1713 // Replace now
1714 installFromRawResource("install.apk", R.raw.install,
1715 rFlags,
1716 true,
1717 false, -1,
1718 -1);
1719 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001720 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001721 public void testFlagIExistingE() {
1722 int iFlags = PackageManager.INSTALL_EXTERNAL;
1723 int rFlags = PackageManager.INSTALL_INTERNAL | PackageManager.INSTALL_REPLACE_EXISTING;
1724 // First install.
1725 installFromRawResource("install.apk", R.raw.install,
1726 iFlags,
1727 false,
1728 false, -1,
1729 -1);
1730 // Replace now
1731 installFromRawResource("install.apk", R.raw.install,
1732 rFlags,
1733 true,
1734 false, -1,
1735 -1);
1736 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001737 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001738 public void testFlagEExistingI() {
1739 int iFlags = PackageManager.INSTALL_INTERNAL;
1740 int rFlags = PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_REPLACE_EXISTING;
1741 // First install.
1742 installFromRawResource("install.apk", R.raw.install,
1743 iFlags,
1744 false,
1745 false, -1,
1746 -1);
1747 // Replace now
1748 installFromRawResource("install.apk", R.raw.install,
1749 rFlags,
1750 true,
1751 false, -1,
1752 -1);
1753 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001754 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001755 public void testFlagEExistingE() {
1756 int iFlags = PackageManager.INSTALL_EXTERNAL;
1757 int rFlags = PackageManager.INSTALL_EXTERNAL | PackageManager.INSTALL_REPLACE_EXISTING;
1758 // First install.
1759 installFromRawResource("install.apk", R.raw.install,
1760 iFlags,
1761 false,
1762 false, -1,
1763 -1);
1764 // Replace now
1765 installFromRawResource("install.apk", R.raw.install,
1766 rFlags,
1767 true,
1768 false, -1,
1769 -1);
1770 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001771 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001772 public void testFlagFExistingI() {
1773 int iFlags = PackageManager.INSTALL_INTERNAL;
1774 int rFlags = PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_REPLACE_EXISTING;
1775 // First install.
1776 installFromRawResource("install.apk", R.raw.install,
1777 iFlags,
1778 false,
1779 false, -1,
1780 -1);
1781 // Replace now
1782 installFromRawResource("install.apk", R.raw.install,
1783 rFlags,
1784 true,
1785 false, -1,
1786 -1);
1787 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001788 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001789 public void testFlagFExistingE() {
1790 int iFlags = PackageManager.INSTALL_EXTERNAL;
1791 int rFlags = PackageManager.INSTALL_FORWARD_LOCK | PackageManager.INSTALL_REPLACE_EXISTING;
1792 // First install.
1793 installFromRawResource("install.apk", R.raw.install,
1794 iFlags,
1795 false,
1796 false, -1,
1797 -1);
1798 // Replace now
1799 installFromRawResource("install.apk", R.raw.install,
1800 rFlags,
1801 true,
1802 false, -1,
1803 -1);
1804 }
1805 /*
1806 * The following set of tests verify the installation of apps with
1807 * install location attribute set to internalOnly, preferExternal and auto.
1808 * The manifest option should dictate the install location.
1809 * public void testManifestI/E/A
1810 * TODO out of memory fall back behaviour.
1811 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001812 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001813 public void testManifestI() {
1814 installFromRawResource("install.apk", R.raw.install_loc_internal,
1815 0,
1816 true,
1817 false, -1,
1818 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
1819 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001820 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001821 public void testManifestE() {
1822 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
1823 0,
1824 true,
1825 false, -1,
1826 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1827 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001828 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001829 public void testManifestA() {
1830 installFromRawResource("install.apk", R.raw.install_loc_auto,
1831 0,
1832 true,
1833 false, -1,
1834 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
1835 }
1836 /*
1837 * The following set of tests verify the installation of apps
1838 * with install location attribute set to internalOnly, preferExternal and auto
1839 * for already existing apps. The manifest option should take precedence.
1840 * TODO add out of memory fall back behaviour.
Neal Nguyenedb979a2010-04-22 13:54:32 -07001841 * testManifestI/E/AExistingI/E
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001842 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07001843 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001844 public void testManifestIExistingI() {
1845 int iFlags = PackageManager.INSTALL_INTERNAL;
1846 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
1847 // First install.
1848 installFromRawResource("install.apk", R.raw.install,
1849 iFlags,
1850 false,
1851 false, -1,
1852 -1);
1853 // Replace now
1854 installFromRawResource("install.apk", R.raw.install_loc_internal,
1855 rFlags,
1856 true,
1857 false, -1,
1858 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
1859 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001860 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001861 public void testManifestIExistingE() {
1862 int iFlags = PackageManager.INSTALL_EXTERNAL;
1863 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
1864 // First install.
1865 installFromRawResource("install.apk", R.raw.install,
1866 iFlags,
1867 false,
1868 false, -1,
1869 -1);
1870 // Replace now
1871 installFromRawResource("install.apk", R.raw.install_loc_internal,
1872 rFlags,
1873 true,
1874 false, -1,
1875 PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
1876 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001877 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001878 public void testManifestEExistingI() {
1879 int iFlags = PackageManager.INSTALL_INTERNAL;
1880 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
1881 // First install.
1882 installFromRawResource("install.apk", R.raw.install,
1883 iFlags,
1884 false,
1885 false, -1,
1886 -1);
1887 // Replace now
1888 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
1889 rFlags,
1890 true,
1891 false, -1,
1892 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1893 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001894 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001895 public void testManifestEExistingE() {
1896 int iFlags = PackageManager.INSTALL_EXTERNAL;
1897 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
1898 // First install.
1899 installFromRawResource("install.apk", R.raw.install,
1900 iFlags,
1901 false,
1902 false, -1,
1903 -1);
1904 // Replace now
1905 installFromRawResource("install.apk", R.raw.install_loc_sdcard,
1906 rFlags,
1907 true,
1908 false, -1,
1909 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
1910 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001911 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001912 public void testManifestAExistingI() {
1913 int iFlags = PackageManager.INSTALL_INTERNAL;
1914 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
1915 // First install.
1916 installFromRawResource("install.apk", R.raw.install,
1917 iFlags,
1918 false,
1919 false, -1,
1920 -1);
1921 // Replace now
1922 installFromRawResource("install.apk", R.raw.install_loc_auto,
1923 rFlags,
1924 true,
1925 false, -1,
1926 PackageInfo.INSTALL_LOCATION_AUTO);
1927 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001928 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001929 public void testManifestAExistingE() {
1930 int iFlags = PackageManager.INSTALL_EXTERNAL;
1931 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
1932 // First install.
1933 installFromRawResource("install.apk", R.raw.install,
1934 iFlags,
1935 false,
1936 false, -1,
1937 -1);
1938 // Replace now
1939 installFromRawResource("install.apk", R.raw.install_loc_auto,
1940 rFlags,
1941 true,
1942 false, -1,
Suchi Amalapurapu30f775b2010-04-06 11:41:23 -07001943 PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001944 }
1945 /*
1946 * The following set of tests check install location for existing
1947 * application based on user setting.
1948 */
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07001949 private int getExpectedInstallLocation(int userSetting) {
1950 int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
1951 boolean enable = getUserSettingSetInstallLocation();
1952 if (enable) {
1953 if (userSetting == PackageHelper.APP_INSTALL_AUTO) {
1954 iloc = PackageInfo.INSTALL_LOCATION_AUTO;
1955 } else if (userSetting == PackageHelper.APP_INSTALL_EXTERNAL) {
1956 iloc = PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL;
1957 } else if (userSetting == PackageHelper.APP_INSTALL_INTERNAL) {
1958 iloc = PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY;
1959 }
1960 }
1961 return iloc;
1962 }
1963 private void setExistingXUserX(int userSetting, int iFlags, int iloc) {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001964 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
1965 // First install.
1966 installFromRawResource("install.apk", R.raw.install,
1967 iFlags,
1968 false,
1969 false, -1,
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07001970 PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07001971 int origSetting = getDefaultInstallLoc();
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001972 try {
1973 // Set user setting
1974 setInstallLoc(userSetting);
1975 // Replace now
1976 installFromRawResource("install.apk", R.raw.install,
1977 rFlags,
1978 true,
1979 false, -1,
1980 iloc);
1981 } finally {
1982 setInstallLoc(origSetting);
1983 }
1984 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001985 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001986 public void testExistingIUserI() {
1987 int userSetting = PackageHelper.APP_INSTALL_INTERNAL;
1988 int iFlags = PackageManager.INSTALL_INTERNAL;
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07001989 setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001990 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001991 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001992 public void testExistingIUserE() {
1993 int userSetting = PackageHelper.APP_INSTALL_EXTERNAL;
1994 int iFlags = PackageManager.INSTALL_INTERNAL;
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07001995 setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001996 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07001997 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07001998 public void testExistingIUserA() {
1999 int userSetting = PackageHelper.APP_INSTALL_AUTO;
2000 int iFlags = PackageManager.INSTALL_INTERNAL;
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002001 setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002002 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002003 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002004 public void testExistingEUserI() {
2005 int userSetting = PackageHelper.APP_INSTALL_INTERNAL;
2006 int iFlags = PackageManager.INSTALL_EXTERNAL;
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002007 setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002008 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002009 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002010 public void testExistingEUserE() {
2011 int userSetting = PackageHelper.APP_INSTALL_EXTERNAL;
2012 int iFlags = PackageManager.INSTALL_EXTERNAL;
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002013 setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002014 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002015 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002016 public void testExistingEUserA() {
2017 int userSetting = PackageHelper.APP_INSTALL_AUTO;
2018 int iFlags = PackageManager.INSTALL_EXTERNAL;
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002019 setExistingXUserX(userSetting, iFlags, PackageInfo.INSTALL_LOCATION_PREFER_EXTERNAL);
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002020 }
2021 /*
2022 * The following set of tests verify that the user setting defines
2023 * the install location.
Neal Nguyenedb979a2010-04-22 13:54:32 -07002024 *
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002025 */
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002026 private boolean getUserSettingSetInstallLocation() {
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002027 try {
Suchi Amalapurapu40e47252010-04-07 16:15:50 -07002028 return Settings.System.getInt(mContext.getContentResolver(), Settings.Secure.SET_INSTALL_LOCATION) != 0;
Neal Nguyenedb979a2010-04-22 13:54:32 -07002029
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002030 } catch (SettingNotFoundException e1) {
2031 }
2032 return false;
2033 }
2034
2035 private void setUserSettingSetInstallLocation(boolean value) {
2036 Settings.System.putInt(mContext.getContentResolver(),
Suchi Amalapurapu40e47252010-04-07 16:15:50 -07002037 Settings.Secure.SET_INSTALL_LOCATION, value ? 1 : 0);
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002038 }
2039 private void setUserX(boolean enable, int userSetting, int iloc) {
2040 boolean origUserSetting = getUserSettingSetInstallLocation();
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07002041 int origSetting = getDefaultInstallLoc();
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002042 try {
2043 setUserSettingSetInstallLocation(enable);
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002044 // Set user setting
2045 setInstallLoc(userSetting);
2046 // Replace now
2047 installFromRawResource("install.apk", R.raw.install,
2048 0,
2049 true,
2050 false, -1,
2051 iloc);
2052 } finally {
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002053 // Restore original setting
2054 setUserSettingSetInstallLocation(origUserSetting);
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002055 setInstallLoc(origSetting);
2056 }
2057 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002058 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002059 public void testUserI() {
2060 int userSetting = PackageHelper.APP_INSTALL_INTERNAL;
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002061 int iloc = getExpectedInstallLocation(userSetting);
2062 setUserX(true, userSetting, iloc);
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002063 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002064 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002065 public void testUserE() {
2066 int userSetting = PackageHelper.APP_INSTALL_EXTERNAL;
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002067 int iloc = getExpectedInstallLocation(userSetting);
2068 setUserX(true, userSetting, iloc);
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002069 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002070 @LargeTest
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002071 public void testUserA() {
2072 int userSetting = PackageHelper.APP_INSTALL_AUTO;
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002073 int iloc = getExpectedInstallLocation(userSetting);
2074 setUserX(true, userSetting, iloc);
2075 }
2076 /*
2077 * The following set of tests turn on/off the basic
2078 * user setting for turning on install location.
2079 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07002080 @LargeTest
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002081 public void testUserPrefOffUserI() {
2082 int userSetting = PackageHelper.APP_INSTALL_INTERNAL;
2083 int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
2084 setUserX(false, userSetting, iloc);
2085 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002086 @LargeTest
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002087 public void testUserPrefOffUserE() {
2088 int userSetting = PackageHelper.APP_INSTALL_EXTERNAL;
2089 int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
2090 setUserX(false, userSetting, iloc);
2091 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002092 @LargeTest
Suchi Amalapurapu90d8ee62010-03-18 11:38:35 -07002093 public void testUserPrefOffA() {
2094 int userSetting = PackageHelper.APP_INSTALL_AUTO;
2095 int iloc = PackageInfo.INSTALL_LOCATION_UNSPECIFIED;
2096 setUserX(false, userSetting, iloc);
Suchi Amalapurapu14b6abd2010-03-17 08:37:04 -07002097 }
Neal Nguyenedb979a2010-04-22 13:54:32 -07002098
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002099 static final String BASE_PERMISSIONS_DEFINED[] = new String[] {
2100 PERM_PACKAGE, "com.android.unit_tests.install_decl_perm",
2101 PERM_DEFINED,
Brett Chabot0dc59e72010-04-01 18:21:38 -07002102 "com.android.frameworks.coretests.NORMAL",
2103 "com.android.frameworks.coretests.DANGEROUS",
2104 "com.android.frameworks.coretests.SIGNATURE",
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002105 };
Neal Nguyenedb979a2010-04-22 13:54:32 -07002106
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002107 static final String BASE_PERMISSIONS_UNDEFINED[] = new String[] {
Brett Chabot0dc59e72010-04-01 18:21:38 -07002108 PERM_PACKAGE, "com.android.frameworks.coretests.install_decl_perm",
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002109 PERM_UNDEFINED,
Brett Chabot0dc59e72010-04-01 18:21:38 -07002110 "com.android.frameworks.coretests.NORMAL",
2111 "com.android.frameworks.coretests.DANGEROUS",
2112 "com.android.frameworks.coretests.SIGNATURE",
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002113 };
Neal Nguyenedb979a2010-04-22 13:54:32 -07002114
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002115 static final String BASE_PERMISSIONS_USED[] = new String[] {
Brett Chabot0dc59e72010-04-01 18:21:38 -07002116 PERM_PACKAGE, "com.android.frameworks.coretests.install_use_perm_good",
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002117 PERM_USED,
Brett Chabot0dc59e72010-04-01 18:21:38 -07002118 "com.android.frameworks.coretests.NORMAL",
2119 "com.android.frameworks.coretests.DANGEROUS",
2120 "com.android.frameworks.coretests.SIGNATURE",
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002121 };
Neal Nguyenedb979a2010-04-22 13:54:32 -07002122
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002123 static final String BASE_PERMISSIONS_NOTUSED[] = new String[] {
Brett Chabot0dc59e72010-04-01 18:21:38 -07002124 PERM_PACKAGE, "com.android.frameworks.coretests.install_use_perm_good",
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002125 PERM_NOTUSED,
Brett Chabot0dc59e72010-04-01 18:21:38 -07002126 "com.android.frameworks.coretests.NORMAL",
2127 "com.android.frameworks.coretests.DANGEROUS",
2128 "com.android.frameworks.coretests.SIGNATURE",
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002129 };
Neal Nguyenedb979a2010-04-22 13:54:32 -07002130
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002131 static final String BASE_PERMISSIONS_SIGUSED[] = new String[] {
Brett Chabot0dc59e72010-04-01 18:21:38 -07002132 PERM_PACKAGE, "com.android.frameworks.coretests.install_use_perm_good",
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002133 PERM_USED,
Brett Chabot0dc59e72010-04-01 18:21:38 -07002134 "com.android.frameworks.coretests.SIGNATURE",
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002135 PERM_NOTUSED,
Brett Chabot0dc59e72010-04-01 18:21:38 -07002136 "com.android.frameworks.coretests.NORMAL",
2137 "com.android.frameworks.coretests.DANGEROUS",
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002138 };
Neal Nguyenedb979a2010-04-22 13:54:32 -07002139
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002140 /*
2141 * Ensure that permissions are properly declared.
2142 */
Neal Nguyenedb979a2010-04-22 13:54:32 -07002143 @LargeTest
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002144 public void testInstallDeclaresPermissions() {
2145 InstallParams ip = null;
2146 InstallParams ip2 = null;
2147 try {
2148 // **: Upon installing a package, are its declared permissions published?
Neal Nguyenedb979a2010-04-22 13:54:32 -07002149
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002150 int iFlags = PackageManager.INSTALL_INTERNAL;
2151 int iApk = R.raw.install_decl_perm;
2152 ip = installFromRawResource("install.apk", iApk,
2153 iFlags, false,
2154 false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
2155 assertInstall(ip.pkg, iFlags, ip.pkg.installLocation);
2156 assertPermissions(BASE_PERMISSIONS_DEFINED);
Neal Nguyenedb979a2010-04-22 13:54:32 -07002157
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002158 // **: Upon installing package, are its permissions granted?
Neal Nguyenedb979a2010-04-22 13:54:32 -07002159
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002160 int i2Flags = PackageManager.INSTALL_INTERNAL;
2161 int i2Apk = R.raw.install_use_perm_good;
2162 ip2 = installFromRawResource("install2.apk", i2Apk,
2163 i2Flags, false,
2164 false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
2165 assertInstall(ip2.pkg, i2Flags, ip2.pkg.installLocation);
2166 assertPermissions(BASE_PERMISSIONS_USED);
Neal Nguyenedb979a2010-04-22 13:54:32 -07002167
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002168 // **: Upon removing but not deleting, are permissions retained?
Neal Nguyenedb979a2010-04-22 13:54:32 -07002169
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002170 GenericReceiver receiver = new DeleteReceiver(ip.pkg.packageName);
Neal Nguyenedb979a2010-04-22 13:54:32 -07002171
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002172 try {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07002173 invokeDeletePackage(ip.pkg.packageName, PackageManager.DONT_DELETE_DATA, receiver);
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002174 } catch (Exception e) {
2175 failStr(e);
2176 }
2177 assertPermissions(BASE_PERMISSIONS_DEFINED);
2178 assertPermissions(BASE_PERMISSIONS_USED);
Neal Nguyenedb979a2010-04-22 13:54:32 -07002179
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002180 // **: Upon re-installing, are permissions retained?
Neal Nguyenedb979a2010-04-22 13:54:32 -07002181
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002182 ip = installFromRawResource("install.apk", iApk,
2183 iFlags | PackageManager.INSTALL_REPLACE_EXISTING, false,
2184 false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
2185 assertInstall(ip.pkg, iFlags, ip.pkg.installLocation);
2186 assertPermissions(BASE_PERMISSIONS_DEFINED);
2187 assertPermissions(BASE_PERMISSIONS_USED);
Neal Nguyenedb979a2010-04-22 13:54:32 -07002188
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002189 // **: Upon deleting package, are all permissions removed?
Neal Nguyenedb979a2010-04-22 13:54:32 -07002190
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002191 try {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07002192 invokeDeletePackage(ip.pkg.packageName, 0, receiver);
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002193 ip = null;
2194 } catch (Exception e) {
2195 failStr(e);
2196 }
2197 assertPermissions(BASE_PERMISSIONS_UNDEFINED);
2198 assertPermissions(BASE_PERMISSIONS_NOTUSED);
Neal Nguyenedb979a2010-04-22 13:54:32 -07002199
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002200 // **: Delete package using permissions; nothing to check here.
Neal Nguyenedb979a2010-04-22 13:54:32 -07002201
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002202 GenericReceiver receiver2 = new DeleteReceiver(ip2.pkg.packageName);
2203 try {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07002204 invokeDeletePackage(ip2.pkg.packageName, 0, receiver);
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002205 ip2 = null;
2206 } catch (Exception e) {
2207 failStr(e);
2208 }
Neal Nguyenedb979a2010-04-22 13:54:32 -07002209
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002210 // **: Re-install package using permissions; no permissions can be granted.
Neal Nguyenedb979a2010-04-22 13:54:32 -07002211
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002212 ip2 = installFromRawResource("install2.apk", i2Apk,
2213 i2Flags, false,
2214 false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
2215 assertInstall(ip2.pkg, i2Flags, ip2.pkg.installLocation);
2216 assertPermissions(BASE_PERMISSIONS_NOTUSED);
Neal Nguyenedb979a2010-04-22 13:54:32 -07002217
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002218 // **: Upon installing declaring package, are sig permissions granted
2219 // to other apps (but not other perms)?
Neal Nguyenedb979a2010-04-22 13:54:32 -07002220
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002221 ip = installFromRawResource("install.apk", iApk,
2222 iFlags, false,
2223 false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
2224 assertInstall(ip.pkg, iFlags, ip.pkg.installLocation);
2225 assertPermissions(BASE_PERMISSIONS_DEFINED);
2226 assertPermissions(BASE_PERMISSIONS_SIGUSED);
Neal Nguyenedb979a2010-04-22 13:54:32 -07002227
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002228 // **: Re-install package using permissions; are all permissions granted?
Neal Nguyenedb979a2010-04-22 13:54:32 -07002229
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002230 ip2 = installFromRawResource("install2.apk", i2Apk,
2231 i2Flags | PackageManager.INSTALL_REPLACE_EXISTING, false,
2232 false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
2233 assertInstall(ip2.pkg, i2Flags, ip2.pkg.installLocation);
2234 assertPermissions(BASE_PERMISSIONS_NOTUSED);
Neal Nguyenedb979a2010-04-22 13:54:32 -07002235
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002236 // **: Upon deleting package, are all permissions removed?
Neal Nguyenedb979a2010-04-22 13:54:32 -07002237
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002238 try {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07002239 invokeDeletePackage(ip.pkg.packageName, 0, receiver);
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002240 ip = null;
2241 } catch (Exception e) {
2242 failStr(e);
2243 }
2244 assertPermissions(BASE_PERMISSIONS_UNDEFINED);
2245 assertPermissions(BASE_PERMISSIONS_NOTUSED);
Neal Nguyenedb979a2010-04-22 13:54:32 -07002246
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002247 // **: Delete package using permissions; nothing to check here.
Neal Nguyenedb979a2010-04-22 13:54:32 -07002248
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002249 try {
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07002250 invokeDeletePackage(ip2.pkg.packageName, 0, receiver);
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002251 ip2 = null;
2252 } catch (Exception e) {
2253 failStr(e);
2254 }
Neal Nguyenedb979a2010-04-22 13:54:32 -07002255
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002256 } finally {
2257 if (ip2 != null) {
2258 cleanUpInstall(ip2);
2259 }
2260 if (ip != null) {
2261 cleanUpInstall(ip);
2262 }
2263 }
2264 }
2265
Suchi Amalapurapuebb83ad2010-03-19 11:55:29 -07002266 /*
2267 * Ensure that permissions are properly declared.
2268 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07002269 @LargeTest
Suchi Amalapurapuebb83ad2010-03-19 11:55:29 -07002270 public void testInstallOnSdPermissionsUnmount() {
2271 InstallParams ip = null;
2272 boolean origMediaState = getMediaState();
2273 try {
2274 // **: Upon installing a package, are its declared permissions published?
2275 int iFlags = PackageManager.INSTALL_INTERNAL;
2276 int iApk = R.raw.install_decl_perm;
2277 ip = installFromRawResource("install.apk", iApk,
2278 iFlags, false,
2279 false, -1, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
2280 assertInstall(ip.pkg, iFlags, ip.pkg.installLocation);
2281 assertPermissions(BASE_PERMISSIONS_DEFINED);
2282 // Unmount media here
2283 assertTrue(unmountMedia());
2284 // Mount media again
2285 mountMedia();
2286 //Check permissions now
2287 assertPermissions(BASE_PERMISSIONS_DEFINED);
2288 } finally {
2289 if (ip != null) {
2290 cleanUpInstall(ip);
2291 }
2292 }
2293 }
Suchi Amalapurapuc7537ee2010-03-24 09:27:19 -07002294
2295 /* This test creates a stale container via MountService and then installs
2296 * a package and verifies that the stale container is cleaned up and install
2297 * is successful.
2298 * Please note that this test is very closely tied to the framework's
2299 * naming convention for secure containers.
2300 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07002301 @LargeTest
Suchi Amalapurapuc7537ee2010-03-24 09:27:19 -07002302 public void testInstallSdcardStaleContainer() {
2303 boolean origMediaState = getMediaState();
2304 try {
2305 String outFileName = "install.apk";
2306 int rawResId = R.raw.install;
2307 PackageManager pm = mContext.getPackageManager();
2308 File filesDir = mContext.getFilesDir();
2309 File outFile = new File(filesDir, outFileName);
2310 Uri packageURI = getInstallablePackage(rawResId, outFile);
2311 PackageParser.Package pkg = parsePackage(packageURI);
2312 assertNotNull(pkg);
2313 // Install an app on sdcard.
2314 installFromRawResource(outFileName, rawResId,
2315 PackageManager.INSTALL_EXTERNAL, false,
2316 false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2317 // Unmount sdcard
2318 unmountMedia();
2319 // Delete the app on sdcard to leave a stale container on sdcard.
2320 GenericReceiver receiver = new DeleteReceiver(pkg.packageName);
Suchi Amalapurapu315a5fb2010-04-13 14:32:16 -07002321 assertTrue(invokeDeletePackage(pkg.packageName, 0, receiver));
Suchi Amalapurapuc7537ee2010-03-24 09:27:19 -07002322 mountMedia();
2323 // Reinstall the app and make sure it gets installed.
2324 installFromRawResource(outFileName, rawResId,
2325 PackageManager.INSTALL_EXTERNAL, true,
2326 false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
Neal Nguyenedb979a2010-04-22 13:54:32 -07002327 } catch (Exception e) {
Suchi Amalapurapuc7537ee2010-03-24 09:27:19 -07002328 failStr(e.getMessage());
2329 } finally {
2330 if (origMediaState) {
2331 mountMedia();
2332 } else {
2333 unmountMedia();
2334 }
2335
2336 }
2337 }
Suchi Amalapurapu1ace5bc2010-05-13 12:05:53 -07002338
2339 /* This test installs an application on sdcard and unmounts media.
2340 * The app is then re-installed on internal storage. The sdcard is mounted
2341 * and verified that the re-installation on internal storage takes precedence.
2342 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07002343 @LargeTest
Suchi Amalapurapu1ace5bc2010-05-13 12:05:53 -07002344 public void testInstallSdcardStaleContainerReinstall() {
2345 boolean origMediaState = getMediaState();
2346 try {
2347 // Mount media first
2348 mountMedia();
2349 String outFileName = "install.apk";
2350 int rawResId = R.raw.install;
2351 PackageManager pm = mContext.getPackageManager();
2352 File filesDir = mContext.getFilesDir();
2353 File outFile = new File(filesDir, outFileName);
2354 Uri packageURI = getInstallablePackage(rawResId, outFile);
2355 PackageParser.Package pkg = parsePackage(packageURI);
2356 assertNotNull(pkg);
2357 // Install an app on sdcard.
2358 installFromRawResource(outFileName, rawResId,
2359 PackageManager.INSTALL_EXTERNAL, false,
2360 false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2361 // Unmount sdcard
2362 unmountMedia();
2363 // Reinstall the app and make sure it gets installed on internal storage.
2364 installFromRawResource(outFileName, rawResId,
2365 PackageManager.INSTALL_REPLACE_EXISTING, false,
2366 false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2367 mountMedia();
2368 // Verify that the app installed is on internal storage.
2369 assertInstall(pkg, 0, PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY);
2370 } catch (Exception e) {
2371 failStr(e.getMessage());
2372 } finally {
2373 if (origMediaState) {
2374 mountMedia();
2375 } else {
2376 unmountMedia();
2377 }
2378
2379 }
2380 }
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002381 /*
2382 * The following series of tests are related to upgrading apps with
Neal Nguyenedb979a2010-04-22 13:54:32 -07002383 * different certificates.
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002384 */
2385 private int APP1_UNSIGNED = R.raw.install_app1_unsigned;
2386 private int APP1_CERT1 = R.raw.install_app1_cert1;
2387 private int APP1_CERT2 = R.raw.install_app1_cert2;
2388 private int APP1_CERT1_CERT2 = R.raw.install_app1_cert1_cert2;
2389 private int APP1_CERT3_CERT4 = R.raw.install_app1_cert3_cert4;
2390 private int APP1_CERT3 = R.raw.install_app1_cert3;
2391 private int APP2_UNSIGNED = R.raw.install_app2_unsigned;
2392 private int APP2_CERT1 = R.raw.install_app2_cert1;
2393 private int APP2_CERT2 = R.raw.install_app2_cert2;
2394 private int APP2_CERT1_CERT2 = R.raw.install_app2_cert1_cert2;
2395 private int APP2_CERT3 = R.raw.install_app2_cert3;
2396
2397 private InstallParams replaceCerts(int apk1, int apk2, boolean cleanUp, boolean fail, int retCode) {
2398 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
2399 String apk1Name = "install1.apk";
2400 String apk2Name = "install2.apk";
2401 PackageParser.Package pkg1 = getParsedPackage(apk1Name, apk1);
2402 try {
2403 InstallParams ip = installFromRawResource(apk1Name, apk1, 0, false,
2404 false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2405 installFromRawResource(apk2Name, apk2, rFlags, false,
2406 fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2407 return ip;
2408 } catch (Exception e) {
2409 failStr(e.getMessage());
2410 } finally {
2411 if (cleanUp) {
2412 cleanUpInstall(pkg1.packageName);
2413 }
2414 }
2415 return null;
2416 }
2417 /*
2418 * Test that an app signed with two certificates can be upgraded by the
2419 * same app signed with two certificates.
2420 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07002421 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002422 public void testReplaceMatchAllCerts() {
2423 replaceCerts(APP1_CERT1_CERT2, APP1_CERT1_CERT2, true, false, -1);
2424 }
2425
2426 /*
2427 * Test that an app signed with two certificates cannot be upgraded
2428 * by an app signed with a different certificate.
2429 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07002430 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002431 public void testReplaceMatchNoCerts1() {
2432 replaceCerts(APP1_CERT1_CERT2, APP1_CERT3, true, true,
2433 PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
2434 }
2435 /*
2436 * Test that an app signed with two certificates cannot be upgraded
2437 * by an app signed with a different certificate.
2438 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07002439 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002440 public void testReplaceMatchNoCerts2() {
2441 replaceCerts(APP1_CERT1_CERT2, APP1_CERT3_CERT4, true, true,
2442 PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
2443 }
2444 /*
2445 * Test that an app signed with two certificates cannot be upgraded by
2446 * an app signed with a subset of initial certificates.
2447 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07002448 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002449 public void testReplaceMatchSomeCerts1() {
2450 replaceCerts(APP1_CERT1_CERT2, APP1_CERT1, true, true,
2451 PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
2452 }
2453 /*
2454 * Test that an app signed with two certificates cannot be upgraded by
2455 * an app signed with the last certificate.
2456 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07002457 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002458 public void testReplaceMatchSomeCerts2() {
2459 replaceCerts(APP1_CERT1_CERT2, APP1_CERT2, true, true,
2460 PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
2461 }
2462 /*
2463 * Test that an app signed with a certificate can be upgraded by app
2464 * signed with a superset of certificates.
2465 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07002466 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002467 public void testReplaceMatchMoreCerts() {
2468 replaceCerts(APP1_CERT1, APP1_CERT1_CERT2, true, true,
2469 PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
2470 }
2471 /*
2472 * Test that an app signed with a certificate can be upgraded by app
2473 * signed with a superset of certificates. Then verify that the an app
2474 * signed with the original set of certs cannot upgrade the new one.
2475 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07002476 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002477 public void testReplaceMatchMoreCertsReplaceSomeCerts() {
2478 InstallParams ip = replaceCerts(APP1_CERT1, APP1_CERT1_CERT2, false, true,
2479 PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES);
2480 try {
2481 int rFlags = PackageManager.INSTALL_REPLACE_EXISTING;
2482 installFromRawResource("install.apk", APP1_CERT1, rFlags, false,
2483 false, -1,
2484 PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2485 } catch (Exception e) {
2486 failStr(e.getMessage());
2487 } finally {
2488 if (ip != null) {
2489 cleanUpInstall(ip);
2490 }
2491 }
2492 }
2493 /*
2494 * The following tests are related to testing the checkSignatures
2495 * api.
2496 */
2497 private void checkSignatures(int apk1, int apk2, int expMatchResult) {
2498 checkSharedSignatures(apk1, apk2, true, false, -1, expMatchResult);
2499 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002500 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002501 public void testCheckSignaturesAllMatch() {
2502 int apk1 = APP1_CERT1_CERT2;
2503 int apk2 = APP2_CERT1_CERT2;
2504 checkSignatures(apk1, apk2, PackageManager.SIGNATURE_MATCH);
2505 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002506 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002507 public void testCheckSignaturesNoMatch() {
2508 int apk1 = APP1_CERT1;
2509 int apk2 = APP2_CERT2;
2510 checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH);
2511 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002512 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002513 public void testCheckSignaturesSomeMatch1() {
2514 int apk1 = APP1_CERT1_CERT2;
2515 int apk2 = APP2_CERT1;
2516 checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH);
2517 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002518 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002519 public void testCheckSignaturesSomeMatch2() {
2520 int apk1 = APP1_CERT1_CERT2;
2521 int apk2 = APP2_CERT2;
2522 checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH);
2523 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002524 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002525 public void testCheckSignaturesMoreMatch() {
2526 int apk1 = APP1_CERT1;
2527 int apk2 = APP2_CERT1_CERT2;
2528 checkSignatures(apk1, apk2, PackageManager.SIGNATURE_NO_MATCH);
2529 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002530 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002531 public void testCheckSignaturesUnknown() {
2532 int apk1 = APP1_CERT1_CERT2;
2533 int apk2 = APP2_CERT1_CERT2;
2534 String apk1Name = "install1.apk";
2535 String apk2Name = "install2.apk";
2536 InstallParams ip1 = null;
2537
2538 try {
2539 ip1 = installFromRawResource(apk1Name, apk1, 0, false,
2540 false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2541 PackageManager pm = mContext.getPackageManager();
2542 // Delete app2
2543 File filesDir = mContext.getFilesDir();
2544 File outFile = new File(filesDir, apk2Name);
2545 int rawResId = apk2;
2546 Uri packageURI = getInstallablePackage(rawResId, outFile);
2547 PackageParser.Package pkg = parsePackage(packageURI);
2548 getPm().deletePackage(pkg.packageName, null, 0);
2549 // Check signatures now
2550 int match = mContext.getPackageManager().checkSignatures(
2551 ip1.pkg.packageName, pkg.packageName);
2552 assertEquals(PackageManager.SIGNATURE_UNKNOWN_PACKAGE, match);
2553 } finally {
2554 if (ip1 != null) {
2555 cleanUpInstall(ip1);
2556 }
2557 }
2558 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002559 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002560 public void testInstallNoCertificates() {
2561 int apk1 = APP1_UNSIGNED;
2562 String apk1Name = "install1.apk";
2563 InstallParams ip1 = null;
2564
2565 try {
2566 installFromRawResource(apk1Name, apk1, 0, false,
2567 true, PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES,
2568 PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2569 } finally {
2570 }
2571 }
2572 /* The following tests are related to apps using shared uids signed
2573 * with different certs.
2574 */
2575 private int SHARED1_UNSIGNED = R.raw.install_shared1_unsigned;
2576 private int SHARED1_CERT1 = R.raw.install_shared1_cert1;
2577 private int SHARED1_CERT2 = R.raw.install_shared1_cert2;
2578 private int SHARED1_CERT1_CERT2 = R.raw.install_shared1_cert1_cert2;
2579 private int SHARED2_UNSIGNED = R.raw.install_shared2_unsigned;
2580 private int SHARED2_CERT1 = R.raw.install_shared2_cert1;
2581 private int SHARED2_CERT2 = R.raw.install_shared2_cert2;
2582 private int SHARED2_CERT1_CERT2 = R.raw.install_shared2_cert1_cert2;
2583 private void checkSharedSignatures(int apk1, int apk2, boolean cleanUp, boolean fail, int retCode, int expMatchResult) {
2584 String apk1Name = "install1.apk";
2585 String apk2Name = "install2.apk";
2586 PackageParser.Package pkg1 = getParsedPackage(apk1Name, apk1);
2587 PackageParser.Package pkg2 = getParsedPackage(apk2Name, apk2);
2588
2589 try {
2590 // Clean up before testing first.
2591 cleanUpInstall(pkg1.packageName);
2592 cleanUpInstall(pkg2.packageName);
2593 installFromRawResource(apk1Name, apk1, 0, false,
2594 false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2595 if (fail) {
2596 installFromRawResource(apk2Name, apk2, 0, false,
2597 true, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2598 } else {
2599 installFromRawResource(apk2Name, apk2, 0, false,
2600 false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2601 int match = mContext.getPackageManager().checkSignatures(
2602 pkg1.packageName, pkg2.packageName);
2603 assertEquals(expMatchResult, match);
2604 }
2605 } finally {
2606 if (cleanUp) {
2607 cleanUpInstall(pkg1.packageName);
2608 cleanUpInstall(pkg2.packageName);
2609 }
2610 }
2611 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002612 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002613 public void testCheckSignaturesSharedAllMatch() {
2614 int apk1 = SHARED1_CERT1_CERT2;
2615 int apk2 = SHARED2_CERT1_CERT2;
2616 boolean fail = false;
2617 int retCode = -1;
2618 int expMatchResult = PackageManager.SIGNATURE_MATCH;
2619 checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult);
2620 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002621 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002622 public void testCheckSignaturesSharedNoMatch() {
2623 int apk1 = SHARED1_CERT1;
2624 int apk2 = SHARED2_CERT2;
2625 boolean fail = true;
2626 int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
2627 int expMatchResult = -1;
2628 checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult);
2629 }
2630 /*
2631 * Test that an app signed with cert1 and cert2 cannot be replaced when signed with cert1 alone.
2632 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07002633 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002634 public void testCheckSignaturesSharedSomeMatch1() {
2635 int apk1 = SHARED1_CERT1_CERT2;
2636 int apk2 = SHARED2_CERT1;
2637 boolean fail = true;
2638 int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
2639 int expMatchResult = -1;
2640 checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult);
2641 }
2642 /*
2643 * Test that an app signed with cert1 and cert2 cannot be replaced when signed with cert2 alone.
2644 */
Brett Chabotf76c56b2010-07-26 17:28:17 -07002645 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002646 public void testCheckSignaturesSharedSomeMatch2() {
2647 int apk1 = SHARED1_CERT1_CERT2;
2648 int apk2 = SHARED2_CERT2;
2649 boolean fail = true;
2650 int retCode = PackageManager.INSTALL_FAILED_SHARED_USER_INCOMPATIBLE;
2651 int expMatchResult = -1;
2652 checkSharedSignatures(apk1, apk2, true, fail, retCode, expMatchResult);
2653 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002654 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002655 public void testCheckSignaturesSharedUnknown() {
2656 int apk1 = SHARED1_CERT1_CERT2;
2657 int apk2 = SHARED2_CERT1_CERT2;
2658 String apk1Name = "install1.apk";
2659 String apk2Name = "install2.apk";
2660 InstallParams ip1 = null;
2661
2662 try {
2663 ip1 = installFromRawResource(apk1Name, apk1, 0, false,
2664 false, -1, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2665 PackageManager pm = mContext.getPackageManager();
2666 // Delete app2
2667 PackageParser.Package pkg = getParsedPackage(apk2Name, apk2);
2668 getPm().deletePackage(pkg.packageName, null, 0);
2669 // Check signatures now
2670 int match = mContext.getPackageManager().checkSignatures(
2671 ip1.pkg.packageName, pkg.packageName);
2672 assertEquals(PackageManager.SIGNATURE_UNKNOWN_PACKAGE, match);
2673 } finally {
2674 if (ip1 != null) {
2675 cleanUpInstall(ip1);
2676 }
2677 }
2678 }
Neal Nguyenedb979a2010-04-22 13:54:32 -07002679
Brett Chabotf76c56b2010-07-26 17:28:17 -07002680 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002681 public void testReplaceFirstSharedMatchAllCerts() {
2682 int apk1 = SHARED1_CERT1;
2683 int apk2 = SHARED2_CERT1;
2684 int rapk1 = SHARED1_CERT1;
2685 checkSignatures(apk1, apk2, PackageManager.SIGNATURE_MATCH);
2686 replaceCerts(apk1, rapk1, true, false, -1);
2687 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002688 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002689 public void testReplaceSecondSharedMatchAllCerts() {
2690 int apk1 = SHARED1_CERT1;
2691 int apk2 = SHARED2_CERT1;
2692 int rapk2 = SHARED2_CERT1;
2693 checkSignatures(apk1, apk2, PackageManager.SIGNATURE_MATCH);
2694 replaceCerts(apk2, rapk2, true, false, -1);
2695 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002696 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002697 public void testReplaceFirstSharedMatchSomeCerts() {
2698 int apk1 = SHARED1_CERT1_CERT2;
2699 int apk2 = SHARED2_CERT1_CERT2;
2700 int rapk1 = SHARED1_CERT1;
2701 boolean fail = true;
2702 int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
2703 checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
2704 installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true,
2705 fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2706 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002707 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002708 public void testReplaceSecondSharedMatchSomeCerts() {
2709 int apk1 = SHARED1_CERT1_CERT2;
2710 int apk2 = SHARED2_CERT1_CERT2;
2711 int rapk2 = SHARED2_CERT1;
2712 boolean fail = true;
2713 int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
2714 checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
2715 installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true,
2716 fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2717 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002718 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002719 public void testReplaceFirstSharedMatchNoCerts() {
2720 int apk1 = SHARED1_CERT1;
2721 int apk2 = SHARED2_CERT1;
2722 int rapk1 = SHARED1_CERT2;
2723 boolean fail = true;
2724 int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
2725 checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
2726 installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true,
2727 fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2728 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002729 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002730 public void testReplaceSecondSharedMatchNoCerts() {
2731 int apk1 = SHARED1_CERT1;
2732 int apk2 = SHARED2_CERT1;
2733 int rapk2 = SHARED2_CERT2;
2734 boolean fail = true;
2735 int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
2736 checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
2737 installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true,
2738 fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2739 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002740 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002741 public void testReplaceFirstSharedMatchMoreCerts() {
2742 int apk1 = SHARED1_CERT1;
2743 int apk2 = SHARED2_CERT1;
2744 int rapk1 = SHARED1_CERT1_CERT2;
2745 boolean fail = true;
2746 int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
2747 checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
2748 installFromRawResource("install.apk", rapk1, PackageManager.INSTALL_REPLACE_EXISTING, true,
2749 fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2750 }
Brett Chabotf76c56b2010-07-26 17:28:17 -07002751 @LargeTest
Suchi Amalapurapuae181712010-03-30 14:01:02 -07002752 public void testReplaceSecondSharedMatchMoreCerts() {
2753 int apk1 = SHARED1_CERT1;
2754 int apk2 = SHARED2_CERT1;
2755 int rapk2 = SHARED2_CERT1_CERT2;
2756 boolean fail = true;
2757 int retCode = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES;
2758 checkSharedSignatures(apk1, apk2, false, false, -1, PackageManager.SIGNATURE_MATCH);
2759 installFromRawResource("install.apk", rapk2, PackageManager.INSTALL_REPLACE_EXISTING, true,
2760 fail, retCode, PackageInfo.INSTALL_LOCATION_UNSPECIFIED);
2761 }
Dianne Hackbornd4310ac2010-03-16 22:55:08 -07002762 /*---------- Recommended install location tests ----*/
Suchi Amalapurapub56ae202010-02-04 22:51:07 -08002763 /*
2764 * TODO's
2765 * check version numbers for upgrades
2766 * check permissions of installed packages
2767 * how to do tests on updated system apps?
2768 * verify updates to system apps cannot be installed on the sdcard.
2769 */
Suchi Amalapurapuafbaaa12010-02-03 11:24:49 -08002770}