1 /* 2 * Copyright (C) 2012 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 17 package com.android.framework.tests; 18 19 import com.android.tradefed.config.Option; 20 import com.android.tradefed.config.Option.Importance; 21 import com.android.tradefed.device.DeviceNotAvailableException; 22 import com.android.tradefed.log.LogUtil.CLog; 23 import com.android.tradefed.testtype.DeviceTestCase; 24 import com.android.tradefed.util.FileUtil; 25 26 import java.io.File; 27 28 public class PackageManagerOTATests extends DeviceTestCase { 29 30 @Option(name = "test-app-path", description = 31 "path to the app repository containing test apks", importance = Importance.IF_UNSET) 32 private File mTestAppRepositoryPath = null; 33 @Option(name = "use-priv-path", description = 34 "set to true if the special priviledged app directory should be used; default is false", 35 importance = Importance.IF_UNSET) 36 private boolean mUsePrivAppDirectory = false; 37 38 private PackageManagerOTATestUtils mUtils = null; 39 private String mSystemAppPath = "/system/app/version_test.apk"; 40 private String mDiffSystemAppPath = "/system/app/version_test_diff.apk"; 41 42 // String constants use for the tests. 43 private static final String PACKAGE_XPATH = "/packages/package[@name=\"" + 44 "com.android.frameworks.coretests.version_test\"]"; 45 private static final String UPDATE_PACKAGE_XPATH = "/packages/updated-package[@name=\"" + 46 "com.android.frameworks.coretests.version_test\"]"; 47 private static final String VERSION_XPATH = "/packages/package[@name=\"" + 48 "com.android.frameworks.coretests.version_test\"]/@version"; 49 private static final String CODE_PATH_XPATH = "/packages/package[@name=\"" + 50 "com.android.frameworks.coretests.version_test\"]/@codePath"; 51 private static final String VERSION_1_APK = "FrameworkCoreTests_version_1.apk"; 52 private static final String VERSION_2_APK = "FrameworkCoreTests_version_2.apk"; 53 private static final String VERSION_3_APK = "FrameworkCoreTests_version_3.apk"; 54 private static final String VERSION_1_NO_SYS_PERMISSION_APK = 55 "FrameworkCoreTests_version_1_nosys.apk"; 56 private static final String DATA_APP_DIRECTORY = "/data/app/"; 57 private static final String PACKAGE_NAME = "com.android.frameworks.coretests.version_test"; 58 private static final String VIBRATE_PERMISSION = "android.permission.VIBRATE"; 59 private static final String CACHE_PERMISSION = "android.permission.ACCESS_CACHE_FILESYSTEM"; 60 61 62 // Temporary file used when examine the packages xml file from the device. 63 private File mPackageXml = null; 64 65 @Override 66 protected void setUp() throws Exception { 67 super.setUp(); 68 mUtils = new PackageManagerOTATestUtils(getDevice()); 69 70 if (mUsePrivAppDirectory) { 71 mSystemAppPath = "/system/priv-app/version_test.apk"; 72 mDiffSystemAppPath = "/system/priv-app/version_test_diff.apk"; 73 } 74 75 // Clean up any potential old files from previous tests. 76 // delete from /system if exists 77 getDevice().enableAdbRoot(); 78 mUtils.removeSystemApp(mSystemAppPath, false); 79 mUtils.removeSystemApp(mDiffSystemAppPath, false); 80 mUtils.restartSystem(); 81 // delete from /data if there is one 82 getDevice().uninstallPackage(PACKAGE_NAME); 83 84 String res = getDevice().executeShellCommand("pm path " + PACKAGE_NAME).trim(); 85 assertTrue("Package should not be installed before test", res.isEmpty()); 86 } 87 88 @Override 89 protected void tearDown() throws Exception { 90 // Clean up. 91 if (mPackageXml != null) { 92 FileUtil.deleteFile(mPackageXml); 93 } 94 } 95 96 /** 97 * Get the absolute file system location of test app with given filename 98 * 99 * @param fileName the file name of the test app apk 100 * @return {@link String} of absolute file path 101 */ 102 public File getTestAppFilePath(String fileName) { 103 // need to check both data/app/apkFileName and 104 // data/app/apkFileName/apkFileName 105 File file = FileUtil.getFileForPath(mTestAppRepositoryPath, fileName); 106 if (file.exists()) { 107 return file; 108 } 109 110 int index = fileName.lastIndexOf('.'); 111 String dir = fileName.substring(0, index); 112 file = FileUtil.getFileForPath(mTestAppRepositoryPath, dir, fileName); 113 CLog.d("Test path : %s", file.getAbsolutePath()); 114 return file; 115 } 116 117 /** 118 * Test case when system app added is newer than update. 119 * <p/> 120 * Assumes adb is running as root in device under test. 121 * 122 * @throws DeviceNotAvailableException 123 */ 124 public void testSystemAppAddedNewerThanUpdate() throws DeviceNotAvailableException { 125 mUtils.installFile(getTestAppFilePath(VERSION_1_APK), true); 126 mPackageXml = mUtils.pullPackagesXML(); 127 assertNotNull("Failed to pull packages xml file from device", mPackageXml); 128 assertTrue("Initial package should be installed", 129 mUtils.expectExists(mPackageXml, PACKAGE_XPATH)); 130 assertTrue("Package version should be 1", 131 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "1")); 132 assertFalse("Updated-package should not be present", 133 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 134 assertFalse("Package should not have FLAG_SYSTEM", 135 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 136 assertTrue("VIBRATE permission should be granted", 137 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 138 assertFalse("ACCESS_CACHE_FILESYSTEM permission should NOT be granted", 139 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 140 141 mUtils.pushSystemApp(getTestAppFilePath(VERSION_2_APK), mSystemAppPath); 142 mPackageXml = mUtils.pullPackagesXML(); 143 assertTrue("After system app push, package should still be installed", 144 mUtils.expectExists(mPackageXml, PACKAGE_XPATH)); 145 assertTrue("After system app push, system app should be visible", 146 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "2")); 147 assertFalse("Updated-package should not be present", 148 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 149 assertTrue("Package should have FLAG_SYSTEM", 150 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 151 assertTrue("VIBRATE permission should be granted", 152 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 153 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 154 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 155 } 156 157 /** 158 * Test case when system app added is older than update. 159 * <p/> 160 * Assumes adb is running as root in device under test. 161 * 162 * @throws DeviceNotAvailableException 163 */ 164 public void testSystemAppAddedOlderThanUpdate() throws DeviceNotAvailableException { 165 mUtils.installFile(getTestAppFilePath(VERSION_2_APK), true); 166 mPackageXml = mUtils.pullPackagesXML(); 167 assertNotNull("Failed to pull packages xml file from device", mPackageXml); 168 assertTrue("Initial package should be installed", 169 mUtils.expectExists(mPackageXml, PACKAGE_XPATH)); 170 assertTrue("Package version should be 2", 171 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "2")); 172 assertFalse("Updated-package should not be present", 173 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 174 assertFalse("Package should not have FLAG_SYSTEM", 175 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 176 assertTrue("VIBRATE permission should be granted", 177 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 178 assertFalse("ACCESS_CACHE_FILESYSTEM permission should NOT be granted", 179 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 180 181 mUtils.pushSystemApp(getTestAppFilePath(VERSION_1_APK), mSystemAppPath); 182 mPackageXml = mUtils.pullPackagesXML(); 183 assertTrue("After system app push, package should still be installed", 184 mUtils.expectExists(mPackageXml, PACKAGE_XPATH)); 185 assertTrue("After system app push, system app should be visible", 186 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "2")); 187 assertTrue("Updated-package should be present", 188 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 189 assertTrue("Package should have FLAG_SYSTEM", 190 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 191 assertTrue("VIBRATE permission should be granted", 192 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 193 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 194 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 195 } 196 197 /** 198 * Test when system app gets removed. 199 * <p/> 200 * Assumes adb is running as root in device under test. 201 * 202 * @throws DeviceNotAvailableException 203 */ 204 public void testSystemAppRemoved() throws DeviceNotAvailableException { 205 mUtils.pushSystemApp(getTestAppFilePath(VERSION_1_APK), mSystemAppPath); 206 mPackageXml = mUtils.pullPackagesXML(); 207 assertTrue("Initial package should be installed", 208 mUtils.expectExists(mPackageXml, PACKAGE_XPATH)); 209 assertTrue("Package should have FLAG_SYSTEM", 210 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 211 assertFalse("Updated-package should not be present", 212 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 213 mUtils.removeSystemApp(mSystemAppPath, true); 214 mPackageXml = mUtils.pullPackagesXML(); 215 assertFalse("Package should not be installed", 216 mUtils.expectExists(mPackageXml, PACKAGE_XPATH)); 217 assertFalse("Updated-package should not be present", 218 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 219 } 220 221 /** 222 * Test when update has a newer version. 223 * <p/> 224 * Assumes adb is running as root in device under test. 225 * 226 * @throws DeviceNotAvailableException 227 */ 228 public void testSystemAppUpdatedNewerVersion() throws DeviceNotAvailableException { 229 mUtils.pushSystemApp(getTestAppFilePath(VERSION_2_APK), mSystemAppPath); 230 mPackageXml = mUtils.pullPackagesXML(); 231 assertTrue("The package should be installed", 232 mUtils.expectExists(mPackageXml, PACKAGE_XPATH)); 233 assertTrue("Package version should be 2", 234 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "2")); 235 assertFalse("Updated-package should not be present", 236 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 237 assertTrue("Package should have FLAG_SYSTEM", 238 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 239 assertTrue("VIBRATE permission should be granted", 240 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 241 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 242 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 243 244 mUtils.installFile(getTestAppFilePath(VERSION_3_APK), true); 245 mPackageXml = mUtils.pullPackagesXML(); 246 assertFalse("After system app upgrade, the path should be the upgraded app on /data", 247 mUtils.expectEquals(mPackageXml, CODE_PATH_XPATH, mSystemAppPath)); 248 assertTrue("Package version should be 3", 249 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "3")); 250 assertTrue("Updated-package should be present", 251 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 252 assertTrue("Package should have FLAG_SYSTEM", 253 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 254 assertTrue("VIBRATE permission should be granted", 255 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 256 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 257 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 258 259 mUtils.restartSystem(); 260 mPackageXml = mUtils.pullPackagesXML(); 261 assertFalse("After system app upgrade, the path should be the upgraded app on /data", 262 mUtils.expectEquals(mPackageXml, CODE_PATH_XPATH, mSystemAppPath)); 263 assertTrue("Package version should be 3", 264 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "3")); 265 assertTrue("Updated-package should be present", 266 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 267 assertTrue("Package should have FLAG_SYSTEM", 268 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 269 assertTrue("VIBRATE permission should be granted", 270 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 271 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 272 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 273 274 mUtils.restartSystem(); 275 mPackageXml = mUtils.pullPackagesXML(); 276 assertFalse("After system app upgrade, the path should be the upgraded app on /data", 277 mUtils.expectEquals(mPackageXml, CODE_PATH_XPATH, mSystemAppPath)); 278 assertTrue("Package version should be 3", 279 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "3")); 280 assertTrue("Updated-package should be present", 281 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 282 assertTrue("Package should have FLAG_SYSTEM", 283 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 284 assertTrue("VIBRATE permission should be granted", 285 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 286 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 287 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 288 } 289 290 /** 291 * Test when update has an older version. 292 * <p/> 293 * Assumes adb is running as root in device under test. 294 * 295 * @throws DeviceNotAvailableException 296 */ 297 public void testSystemAppUpdatedOlderVersion() throws DeviceNotAvailableException { 298 mUtils.pushSystemApp(getTestAppFilePath(VERSION_2_APK), mSystemAppPath); 299 mPackageXml = mUtils.pullPackagesXML(); 300 assertTrue("After system app push, the package should be installed", 301 mUtils.expectExists(mPackageXml, PACKAGE_XPATH)); 302 assertTrue("Package version should be 2", 303 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "2")); 304 assertFalse("Updated-package should not be present", 305 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 306 assertTrue("Package should have FLAG_SYSTEM", 307 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 308 assertTrue("VIBRATE permission should be granted", 309 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 310 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 311 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 312 313 // The "-d" command forces a downgrade. 314 mUtils.installFile(getTestAppFilePath(VERSION_1_APK), true, "-d"); 315 mPackageXml = mUtils.pullPackagesXML(); 316 assertTrue("After system app upgrade, the path should be the upgraded app on /data", 317 mUtils.expectStartsWith(mPackageXml, CODE_PATH_XPATH, 318 DATA_APP_DIRECTORY + PACKAGE_NAME)); 319 assertTrue("Package version should be 1", 320 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "1")); 321 assertTrue("Updated-package should be present", 322 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 323 assertTrue("Package should have FLAG_SYSTEM", 324 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 325 assertTrue("VIBRATE permission should be granted", 326 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 327 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 328 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 329 330 mUtils.restartSystem(); 331 mPackageXml = mUtils.pullPackagesXML(); 332 assertTrue("After reboot, the path should be the be installed", 333 mUtils.expectEquals(mPackageXml, CODE_PATH_XPATH, mSystemAppPath)); 334 assertTrue("Package version should be 2", 335 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "2")); 336 assertFalse("Updated-package should NOT be present", 337 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 338 assertTrue("Package should have FLAG_SYSTEM", 339 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 340 assertTrue("VIBRATE permission should be granted", 341 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 342 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 343 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 344 345 mUtils.restartSystem(); 346 mPackageXml = mUtils.pullPackagesXML(); 347 assertTrue("After reboot, the path should be the be installed", 348 mUtils.expectEquals(mPackageXml, CODE_PATH_XPATH, mSystemAppPath)); 349 assertTrue("Package version should be 2", 350 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "2")); 351 assertFalse("Updated-package should NOT be present", 352 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 353 assertTrue("Package should have FLAG_SYSTEM", 354 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 355 assertTrue("VIBRATE permission should be granted", 356 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 357 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 358 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 359 } 360 361 /** 362 * Test when updated system app has the same version. Package manager is expected to use 363 * the newly installed upgrade. 364 * <p/> 365 * Assumes adb is running as root in device under test. 366 * 367 * @throws DeviceNotAvailableException 368 */ 369 public void testSystemAppUpdatedSameVersion_PreferUpdatedApk() 370 throws DeviceNotAvailableException { 371 mUtils.pushSystemApp(getTestAppFilePath(VERSION_2_APK), mSystemAppPath); 372 mPackageXml = mUtils.pullPackagesXML(); 373 assertTrue("The package should be installed", 374 mUtils.expectExists(mPackageXml, PACKAGE_XPATH)); 375 assertTrue("Package version should be 2", 376 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "2")); 377 assertFalse("Updated-package should not be present", 378 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 379 assertTrue("Package should have FLAG_SYSTEM", 380 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 381 assertTrue("VIBRATE permission should be granted", 382 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 383 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 384 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 385 386 mUtils.installFile(getTestAppFilePath(VERSION_2_APK), true); 387 mPackageXml = mUtils.pullPackagesXML(); 388 assertFalse("After system app upgrade, the path should be the upgraded app in /data", 389 mUtils.expectEquals(mPackageXml, CODE_PATH_XPATH, mSystemAppPath)); 390 assertTrue("Package version should be 2", 391 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "2")); 392 assertTrue("Updated-package should be present", 393 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 394 assertTrue("Package should have FLAG_SYSTEM", 395 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 396 assertTrue("VIBRATE permission should be granted", 397 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 398 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 399 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 400 401 mUtils.restartSystem(); 402 mPackageXml = mUtils.pullPackagesXML(); 403 assertFalse("After reboot, the path should be the upgraded app in /data", 404 mUtils.expectEquals(mPackageXml, CODE_PATH_XPATH, mSystemAppPath)); 405 assertTrue("Package version should be 2", 406 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "2")); 407 assertTrue("Updated-package should be present", 408 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 409 assertTrue("Package should have FLAG_SYSTEM", 410 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 411 assertTrue("VIBRATE permission should be granted", 412 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 413 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 414 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 415 416 } 417 418 /** 419 * Test when update has system app removed. 420 * <p/> 421 * Assumes adb is running as root in device under test. 422 * 423 * @throws DeviceNotAvailableException 424 */ 425 public void testUpdatedSystemAppRemoved() throws DeviceNotAvailableException { 426 mUtils.pushSystemApp(getTestAppFilePath(VERSION_1_APK), mSystemAppPath); 427 mUtils.installFile(getTestAppFilePath(VERSION_2_APK), true); 428 mPackageXml = mUtils.pullPackagesXML(); 429 assertTrue("Package should be installed", 430 mUtils.expectExists(mPackageXml, PACKAGE_XPATH)); 431 assertTrue("Updated-package should be present", 432 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 433 assertTrue("Package should have FLAG_SYSTEM", 434 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 435 assertTrue("VIBRATE permission should be granted", 436 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 437 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 438 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 439 440 mUtils.removeSystemApp(mSystemAppPath, true); 441 mPackageXml = mUtils.pullPackagesXML(); 442 assertTrue("Package should still be installed", 443 mUtils.expectExists(mPackageXml, PACKAGE_XPATH)); 444 assertFalse("Updated-package entry should not be present", 445 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 446 assertFalse("Package should not have FLAG_SYSTEM", 447 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 448 assertTrue("VIBRATE permission should be granted", 449 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 450 assertFalse("ACCESS_CACHE_FILESYSTEM permission should NOT be granted", 451 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 452 } 453 454 /** 455 * Test when system app is updated with a new permission. Specifically: 456 * <ol> 457 * <li>system app FOO is present, does not declare system permission</li> 458 * <li>FOO is overlain by an installed update that declares new permission</li> 459 * <li>FOO is replaced during an OTA, but installed update still has higher version number</li> 460 * <li>Verify permission is granted</li> 461 * </ol> 462 * 463 * @throws DeviceNotAvailableException 464 */ 465 public void testSystemAppUpdatedNewPermission() throws DeviceNotAvailableException { 466 mUtils.pushSystemApp(getTestAppFilePath(VERSION_1_NO_SYS_PERMISSION_APK), mSystemAppPath); 467 mPackageXml = mUtils.pullPackagesXML(); 468 assertTrue("The package should be installed", 469 mUtils.expectExists(mPackageXml, PACKAGE_XPATH)); 470 assertTrue("Package version should be 1", 471 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "1")); 472 assertFalse("Updated-package should not be present", 473 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 474 assertTrue("Package should have FLAG_SYSTEM", 475 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 476 assertTrue("VIBRATE permission should be granted", 477 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 478 assertFalse("ACCESS_CACHE_FILESYSTEM permission should NOT be granted", 479 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 480 481 mUtils.installFile(getTestAppFilePath(VERSION_3_APK), true); 482 mPackageXml = mUtils.pullPackagesXML(); 483 assertFalse("After system app upgrade, the path should be the upgraded app on /data", 484 mUtils.expectEquals(mPackageXml, CODE_PATH_XPATH, mSystemAppPath)); 485 assertTrue("Package version should be 3", 486 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "3")); 487 assertTrue("Updated-package should be present", 488 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 489 assertTrue("Package should have FLAG_SYSTEM", 490 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 491 assertTrue("VIBRATE permission should be granted", 492 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 493 assertFalse("ACCESS_CACHE_FILESYSTEM permission should NOT be granted", 494 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 495 496 mUtils.pushSystemApp(getTestAppFilePath(VERSION_2_APK), mSystemAppPath); 497 mUtils.restartSystem(); 498 mPackageXml = mUtils.pullPackagesXML(); 499 assertFalse("After reboot, the path should be the data app", 500 mUtils.expectEquals(mPackageXml, CODE_PATH_XPATH, mSystemAppPath)); 501 assertTrue("Package version should be 3", 502 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "3")); 503 assertTrue("Updated-package should be present", 504 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 505 assertTrue("Package should have FLAG_SYSTEM", 506 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 507 assertTrue("VIBRATE permission should be granted", 508 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 509 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 510 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 511 512 mUtils.restartSystem(); 513 mPackageXml = mUtils.pullPackagesXML(); 514 assertFalse("After reboot, the path should be the data app", 515 mUtils.expectEquals(mPackageXml, CODE_PATH_XPATH, mSystemAppPath)); 516 assertTrue("Package version should be 3", 517 mUtils.expectEquals(mPackageXml, VERSION_XPATH, "3")); 518 assertTrue("Updated-package should be present", 519 mUtils.expectExists(mPackageXml, UPDATE_PACKAGE_XPATH)); 520 assertTrue("Package should have FLAG_SYSTEM", 521 mUtils.packageHasFlag(PACKAGE_NAME, " SYSTEM ")); 522 assertTrue("VIBRATE permission should be granted", 523 mUtils.packageHasPermission(PACKAGE_NAME, VIBRATE_PERMISSION)); 524 assertTrue("ACCESS_CACHE_FILESYSTEM permission should be granted", 525 mUtils.packageHasPermission(PACKAGE_NAME, CACHE_PERMISSION)); 526 } 527 } 528