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.server.pm; 18 19 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; 20 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; 21 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER; 22 import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; 23 24 import static org.hamcrest.CoreMatchers.equalTo; 25 import static org.hamcrest.CoreMatchers.is; 26 import static org.hamcrest.CoreMatchers.not; 27 import static org.hamcrest.CoreMatchers.notNullValue; 28 import static org.hamcrest.CoreMatchers.nullValue; 29 import static org.junit.Assert.assertNotSame; 30 import static org.junit.Assert.assertSame; 31 import static org.junit.Assert.assertThat; 32 import static org.junit.Assert.assertTrue; 33 import static org.junit.Assert.fail; 34 35 import android.annotation.NonNull; 36 import android.content.Context; 37 import android.content.pm.ApplicationInfo; 38 import android.content.pm.PackageParser; 39 import android.content.pm.PackageUserState; 40 import android.content.pm.UserInfo; 41 import android.os.BaseBundle; 42 import android.os.PersistableBundle; 43 import android.os.UserHandle; 44 import android.os.UserManagerInternal; 45 import android.support.test.InstrumentationRegistry; 46 import android.support.test.filters.SmallTest; 47 import android.support.test.runner.AndroidJUnit4; 48 import android.util.ArrayMap; 49 import android.util.ArraySet; 50 import android.util.Log; 51 import android.util.LongSparseArray; 52 53 import com.android.internal.os.AtomicFile; 54 import com.android.server.LocalServices; 55 import com.android.server.pm.permission.PermissionManagerInternal; 56 import com.android.server.pm.permission.PermissionManagerService; 57 58 import org.junit.After; 59 import org.junit.Before; 60 import org.junit.Test; 61 import org.junit.runner.RunWith; 62 63 import java.io.File; 64 import java.io.FileOutputStream; 65 import java.io.IOException; 66 import java.security.PublicKey; 67 import java.util.ArrayList; 68 import java.util.Arrays; 69 import java.util.List; 70 71 @RunWith(AndroidJUnit4.class) 72 @SmallTest 73 public class PackageManagerSettingsTests { 74 private static final String PACKAGE_NAME_2 = "com.android.app2"; 75 private static final String PACKAGE_NAME_3 = "com.android.app3"; 76 private static final String PACKAGE_NAME_1 = "com.android.app1"; 77 public static final String TAG = "PackageManagerSettingsTests"; 78 protected final String PREFIX = "android.content.pm"; 79 80 /** make sure our initialized KeySetManagerService metadata matches packages.xml */ 81 @Test 82 public void testReadKeySetSettings() 83 throws ReflectiveOperationException, IllegalAccessException { 84 /* write out files and read */ 85 writeOldFiles(); 86 final Context context = InstrumentationRegistry.getContext(); 87 final Object lock = new Object(); 88 PermissionManagerInternal pmInt = PermissionManagerService.create(context, null, lock); 89 Settings settings = 90 new Settings(context.getFilesDir(), pmInt.getPermissionSettings(), lock); 91 assertThat(settings.readLPw(createFakeUsers()), is(true)); 92 verifyKeySetMetaData(settings); 93 } 94 95 /** read in data, write it out, and read it back in. Verify same. */ 96 @Test 97 public void testWriteKeySetSettings() 98 throws ReflectiveOperationException, IllegalAccessException { 99 // write out files and read 100 writeOldFiles(); 101 final Context context = InstrumentationRegistry.getContext(); 102 final Object lock = new Object(); 103 PermissionManagerInternal pmInt = PermissionManagerService.create(context, null, lock); 104 Settings settings = 105 new Settings(context.getFilesDir(), pmInt.getPermissionSettings(), lock); 106 assertThat(settings.readLPw(createFakeUsers()), is(true)); 107 108 // write out, read back in and verify the same 109 settings.writeLPr(); 110 assertThat(settings.readLPw(createFakeUsers()), is(true)); 111 verifyKeySetMetaData(settings); 112 } 113 114 @Test 115 public void testSettingsReadOld() { 116 // Write the package files and make sure they're parsed properly the first time 117 writeOldFiles(); 118 final Context context = InstrumentationRegistry.getContext(); 119 final Object lock = new Object(); 120 PermissionManagerInternal pmInt = PermissionManagerService.create(context, null, lock); 121 Settings settings = 122 new Settings(context.getFilesDir(), pmInt.getPermissionSettings(), lock); 123 assertThat(settings.readLPw(createFakeUsers()), is(true)); 124 assertThat(settings.getPackageLPr(PACKAGE_NAME_3), is(notNullValue())); 125 assertThat(settings.getPackageLPr(PACKAGE_NAME_1), is(notNullValue())); 126 127 PackageSetting ps = settings.getPackageLPr(PACKAGE_NAME_1); 128 assertThat(ps.getEnabled(0), is(COMPONENT_ENABLED_STATE_DEFAULT)); 129 assertThat(ps.getNotLaunched(0), is(true)); 130 131 ps = settings.getPackageLPr(PACKAGE_NAME_2); 132 assertThat(ps.getStopped(0), is(false)); 133 assertThat(ps.getEnabled(0), is(COMPONENT_ENABLED_STATE_DISABLED_USER)); 134 assertThat(ps.getEnabled(1), is(COMPONENT_ENABLED_STATE_DEFAULT)); 135 } 136 137 @Test 138 public void testNewPackageRestrictionsFile() throws ReflectiveOperationException { 139 // Write the package files and make sure they're parsed properly the first time 140 writeOldFiles(); 141 final Context context = InstrumentationRegistry.getContext(); 142 final Object lock = new Object(); 143 PermissionManagerInternal pmInt = PermissionManagerService.create(context, null, lock); 144 Settings settings = 145 new Settings(context.getFilesDir(), pmInt.getPermissionSettings(), lock); 146 assertThat(settings.readLPw(createFakeUsers()), is(true)); 147 settings.writeLPr(); 148 149 // Create Settings again to make it read from the new files 150 settings = 151 new Settings(context.getFilesDir(), pmInt.getPermissionSettings(), lock); 152 assertThat(settings.readLPw(createFakeUsers()), is(true)); 153 154 PackageSetting ps = settings.getPackageLPr(PACKAGE_NAME_2); 155 assertThat(ps.getEnabled(0), is(COMPONENT_ENABLED_STATE_DISABLED_USER)); 156 assertThat(ps.getEnabled(1), is(COMPONENT_ENABLED_STATE_DEFAULT)); 157 } 158 159 private PersistableBundle getPersistableBundle(String packageName, long longVal, 160 double doubleVal, boolean boolVal, String textVal) { 161 final PersistableBundle bundle = new PersistableBundle(); 162 bundle.putString(packageName + ".TEXT_VALUE", textVal); 163 bundle.putLong(packageName + ".LONG_VALUE", longVal); 164 bundle.putBoolean(packageName + ".BOOL_VALUE", boolVal); 165 bundle.putDouble(packageName + ".DOUBLE_VALUE", doubleVal); 166 return bundle; 167 } 168 169 @Test 170 public void testReadPackageRestrictions_oldSuspendInfo() { 171 writePackageRestrictions_oldSuspendInfoXml(0); 172 final Object lock = new Object(); 173 final Context context = InstrumentationRegistry.getTargetContext(); 174 final Settings settingsUnderTest = new Settings(context.getFilesDir(), null, lock); 175 settingsUnderTest.mPackages.put(PACKAGE_NAME_1, createPackageSetting(PACKAGE_NAME_1)); 176 settingsUnderTest.mPackages.put(PACKAGE_NAME_2, createPackageSetting(PACKAGE_NAME_2)); 177 settingsUnderTest.readPackageRestrictionsLPr(0); 178 179 final PackageSetting ps1 = settingsUnderTest.mPackages.get(PACKAGE_NAME_1); 180 final PackageUserState packageUserState1 = ps1.readUserState(0); 181 assertThat(packageUserState1.suspended, is(true)); 182 assertThat("android".equals(packageUserState1.suspendingPackage), is(true)); 183 184 final PackageSetting ps2 = settingsUnderTest.mPackages.get(PACKAGE_NAME_2); 185 final PackageUserState packageUserState2 = ps2.readUserState(0); 186 assertThat(packageUserState2.suspended, is(false)); 187 assertThat(packageUserState2.suspendingPackage, is(nullValue())); 188 } 189 190 @Test 191 public void testReadWritePackageRestrictions_newSuspendInfo() { 192 final Context context = InstrumentationRegistry.getTargetContext(); 193 final Settings settingsUnderTest = new Settings(context.getFilesDir(), null, new Object()); 194 final PackageSetting ps1 = createPackageSetting(PACKAGE_NAME_1); 195 final PackageSetting ps2 = createPackageSetting(PACKAGE_NAME_2); 196 final PackageSetting ps3 = createPackageSetting(PACKAGE_NAME_3); 197 198 final PersistableBundle appExtras1 = getPersistableBundle( 199 PACKAGE_NAME_1, 1L, 0.01, true, "appString1"); 200 final PersistableBundle launcherExtras1 = getPersistableBundle( 201 PACKAGE_NAME_1, 10L, 0.1, false, "launcherString1"); 202 ps1.setSuspended(true, "suspendingPackage1", "dialogMsg1", appExtras1, launcherExtras1, 0); 203 settingsUnderTest.mPackages.put(PACKAGE_NAME_1, ps1); 204 205 ps2.setSuspended(true, "suspendingPackage2", "dialogMsg2", null, null, 0); 206 settingsUnderTest.mPackages.put(PACKAGE_NAME_2, ps2); 207 208 ps3.setSuspended(false, "irrelevant", "irrevelant2", null, null, 0); 209 settingsUnderTest.mPackages.put(PACKAGE_NAME_3, ps3); 210 211 settingsUnderTest.writePackageRestrictionsLPr(0); 212 213 settingsUnderTest.mPackages.clear(); 214 settingsUnderTest.mPackages.put(PACKAGE_NAME_1, createPackageSetting(PACKAGE_NAME_1)); 215 settingsUnderTest.mPackages.put(PACKAGE_NAME_2, createPackageSetting(PACKAGE_NAME_2)); 216 settingsUnderTest.mPackages.put(PACKAGE_NAME_3, createPackageSetting(PACKAGE_NAME_3)); 217 // now read and verify 218 settingsUnderTest.readPackageRestrictionsLPr(0); 219 final PackageUserState readPus1 = settingsUnderTest.mPackages.get(PACKAGE_NAME_1). 220 readUserState(0); 221 assertThat(readPus1.suspended, is(true)); 222 assertThat(readPus1.suspendingPackage, equalTo("suspendingPackage1")); 223 assertThat(readPus1.dialogMessage, equalTo("dialogMsg1")); 224 assertThat(BaseBundle.kindofEquals(readPus1.suspendedAppExtras, appExtras1), is(true)); 225 assertThat(BaseBundle.kindofEquals(readPus1.suspendedLauncherExtras, launcherExtras1), 226 is(true)); 227 228 final PackageUserState readPus2 = settingsUnderTest.mPackages.get(PACKAGE_NAME_2). 229 readUserState(0); 230 assertThat(readPus2.suspended, is(true)); 231 assertThat(readPus2.suspendingPackage, equalTo("suspendingPackage2")); 232 assertThat(readPus2.dialogMessage, equalTo("dialogMsg2")); 233 assertThat(readPus2.suspendedAppExtras, is(nullValue())); 234 assertThat(readPus2.suspendedLauncherExtras, is(nullValue())); 235 236 final PackageUserState readPus3 = settingsUnderTest.mPackages.get(PACKAGE_NAME_3). 237 readUserState(0); 238 assertThat(readPus3.suspended, is(false)); 239 assertThat(readPus3.suspendingPackage, is(nullValue())); 240 assertThat(readPus3.dialogMessage, is(nullValue())); 241 assertThat(readPus3.suspendedAppExtras, is(nullValue())); 242 assertThat(readPus3.suspendedLauncherExtras, is(nullValue())); 243 } 244 245 @Test 246 public void testPackageRestrictionsSuspendedDefault() { 247 final PackageSetting defaultSetting = createPackageSetting(PACKAGE_NAME_1); 248 assertThat(defaultSetting.getSuspended(0), is(false)); 249 } 250 251 @Test 252 public void testEnableDisable() { 253 // Write the package files and make sure they're parsed properly the first time 254 writeOldFiles(); 255 final Context context = InstrumentationRegistry.getContext(); 256 final Object lock = new Object(); 257 PermissionManagerInternal pmInt = PermissionManagerService.create(context, null, lock); 258 Settings settings = 259 new Settings(context.getFilesDir(), pmInt.getPermissionSettings(), lock); 260 assertThat(settings.readLPw(createFakeUsers()), is(true)); 261 262 // Enable/Disable a package 263 PackageSetting ps = settings.getPackageLPr(PACKAGE_NAME_1); 264 ps.setEnabled(COMPONENT_ENABLED_STATE_DISABLED, 0, null); 265 ps.setEnabled(COMPONENT_ENABLED_STATE_ENABLED, 1, null); 266 assertThat(ps.getEnabled(0), is(COMPONENT_ENABLED_STATE_DISABLED)); 267 assertThat(ps.getEnabled(1), is(COMPONENT_ENABLED_STATE_ENABLED)); 268 269 // Enable/Disable a component 270 ArraySet<String> components = new ArraySet<String>(); 271 String component1 = PACKAGE_NAME_1 + "/.Component1"; 272 components.add(component1); 273 ps.setDisabledComponents(components, 0); 274 ArraySet<String> componentsDisabled = ps.getDisabledComponents(0); 275 assertThat(componentsDisabled.size(), is(1)); 276 assertThat(componentsDisabled.toArray()[0], is(component1)); 277 boolean hasEnabled = 278 ps.getEnabledComponents(0) != null && ps.getEnabledComponents(1).size() > 0; 279 assertThat(hasEnabled, is(false)); 280 281 // User 1 should not have any disabled components 282 boolean hasDisabled = 283 ps.getDisabledComponents(1) != null && ps.getDisabledComponents(1).size() > 0; 284 assertThat(hasDisabled, is(false)); 285 ps.setEnabledComponents(components, 1); 286 assertThat(ps.getEnabledComponents(1).size(), is(1)); 287 hasEnabled = ps.getEnabledComponents(0) != null && ps.getEnabledComponents(0).size() > 0; 288 assertThat(hasEnabled, is(false)); 289 } 290 291 private static final String PACKAGE_NAME = "com.android.bar"; 292 private static final String REAL_PACKAGE_NAME = "com.android.foo"; 293 private static final String PARENT_PACKAGE_NAME = "com.android.bar.parent"; 294 private static final String CHILD_PACKAGE_NAME_01 = "com.android.bar.child01"; 295 private static final String CHILD_PACKAGE_NAME_02 = "com.android.bar.child02"; 296 private static final String CHILD_PACKAGE_NAME_03 = "com.android.bar.child03"; 297 private static final File INITIAL_CODE_PATH = 298 new File(InstrumentationRegistry.getContext().getFilesDir(), "com.android.bar-1"); 299 private static final File UPDATED_CODE_PATH = 300 new File(InstrumentationRegistry.getContext().getFilesDir(), "com.android.bar-2"); 301 private static final long INITIAL_VERSION_CODE = 10023L; 302 private static final long UPDATED_VERSION_CODE = 10025L; 303 304 @Test 305 public void testPackageStateCopy01() { 306 final List<String> childPackageNames = new ArrayList<>(); 307 childPackageNames.add(CHILD_PACKAGE_NAME_01); 308 childPackageNames.add(CHILD_PACKAGE_NAME_02); 309 childPackageNames.add(CHILD_PACKAGE_NAME_03); 310 final PackageSetting origPkgSetting01 = new PackageSetting( 311 PACKAGE_NAME, 312 REAL_PACKAGE_NAME, 313 INITIAL_CODE_PATH /*codePath*/, 314 INITIAL_CODE_PATH /*resourcePath*/, 315 null /*legacyNativeLibraryPathString*/, 316 "x86_64" /*primaryCpuAbiString*/, 317 "x86" /*secondaryCpuAbiString*/, 318 null /*cpuAbiOverrideString*/, 319 INITIAL_VERSION_CODE, 320 ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_HAS_CODE, 321 ApplicationInfo.PRIVATE_FLAG_PRIVILEGED|ApplicationInfo.PRIVATE_FLAG_HIDDEN, 322 PARENT_PACKAGE_NAME, 323 childPackageNames, 324 0, 325 null /*usesStaticLibraries*/, 326 null /*usesStaticLibrariesVersions*/); 327 final PackageSetting testPkgSetting01 = new PackageSetting(origPkgSetting01); 328 verifySettingCopy(origPkgSetting01, testPkgSetting01); 329 } 330 331 @Test 332 public void testPackageStateCopy02() { 333 final List<String> childPackageNames = new ArrayList<>(); 334 childPackageNames.add(CHILD_PACKAGE_NAME_01); 335 childPackageNames.add(CHILD_PACKAGE_NAME_02); 336 childPackageNames.add(CHILD_PACKAGE_NAME_03); 337 final PackageSetting origPkgSetting01 = new PackageSetting( 338 PACKAGE_NAME /*pkgName*/, 339 REAL_PACKAGE_NAME /*realPkgName*/, 340 INITIAL_CODE_PATH /*codePath*/, 341 INITIAL_CODE_PATH /*resourcePath*/, 342 null /*legacyNativeLibraryPathString*/, 343 "x86_64" /*primaryCpuAbiString*/, 344 "x86" /*secondaryCpuAbiString*/, 345 null /*cpuAbiOverrideString*/, 346 INITIAL_VERSION_CODE, 347 ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_HAS_CODE, 348 ApplicationInfo.PRIVATE_FLAG_PRIVILEGED|ApplicationInfo.PRIVATE_FLAG_HIDDEN, 349 PARENT_PACKAGE_NAME, 350 childPackageNames, 351 0, 352 null /*usesStaticLibraries*/, 353 null /*usesStaticLibrariesVersions*/); 354 final PackageSetting testPkgSetting01 = new PackageSetting( 355 PACKAGE_NAME /*pkgName*/, 356 REAL_PACKAGE_NAME /*realPkgName*/, 357 UPDATED_CODE_PATH /*codePath*/, 358 UPDATED_CODE_PATH /*resourcePath*/, 359 null /*legacyNativeLibraryPathString*/, 360 null /*primaryCpuAbiString*/, 361 null /*secondaryCpuAbiString*/, 362 null /*cpuAbiOverrideString*/, 363 UPDATED_VERSION_CODE, 364 0 /*pkgFlags*/, 365 0 /*pkgPrivateFlags*/, 366 null /*parentPkgName*/, 367 null /*childPkgNames*/, 368 0, 369 null /*usesStaticLibraries*/, 370 null /*usesStaticLibrariesVersions*/); 371 testPkgSetting01.copyFrom(origPkgSetting01); 372 verifySettingCopy(origPkgSetting01, testPkgSetting01); 373 } 374 375 /** Update package */ 376 @Test 377 public void testUpdatePackageSetting01() throws PackageManagerException { 378 final PackageSetting testPkgSetting01 = 379 createPackageSetting(0 /*sharedUserId*/, 0 /*pkgFlags*/); 380 testPkgSetting01.setInstalled(false /*installed*/, 0 /*userId*/); 381 assertThat(testPkgSetting01.pkgFlags, is(0)); 382 assertThat(testPkgSetting01.pkgPrivateFlags, is(0)); 383 final PackageSetting oldPkgSetting01 = new PackageSetting(testPkgSetting01); 384 Settings.updatePackageSetting( 385 testPkgSetting01, 386 null /*disabledPkg*/, 387 null /*sharedUser*/, 388 UPDATED_CODE_PATH /*codePath*/, 389 UPDATED_CODE_PATH /*resourcePath*/, 390 null /*legacyNativeLibraryPath*/, 391 "arm64-v8a" /*primaryCpuAbi*/, 392 "armeabi" /*secondaryCpuAbi*/, 393 0 /*pkgFlags*/, 394 0 /*pkgPrivateFlags*/, 395 null /*childPkgNames*/, 396 UserManagerService.getInstance(), 397 null /*usesStaticLibraries*/, 398 null /*usesStaticLibrariesVersions*/); 399 assertThat(testPkgSetting01.primaryCpuAbiString, is("arm64-v8a")); 400 assertThat(testPkgSetting01.secondaryCpuAbiString, is("armeabi")); 401 assertThat(testPkgSetting01.pkgFlags, is(0)); 402 assertThat(testPkgSetting01.pkgPrivateFlags, is(0)); 403 final PackageUserState userState = testPkgSetting01.readUserState(0); 404 final PackageUserState oldUserState = oldPkgSetting01.readUserState(0); 405 verifyUserState(userState, oldUserState, false /*userStateChanged*/, false /*notLaunched*/, 406 false /*stopped*/, false /*installed*/); 407 } 408 409 /** Update package; package now on /system, install for user '0' */ 410 @Test 411 public void testUpdatePackageSetting02() throws PackageManagerException { 412 final PackageSetting testPkgSetting01 = 413 createPackageSetting(0 /*sharedUserId*/, 0 /*pkgFlags*/); 414 testPkgSetting01.setInstalled(false /*installed*/, 0 /*userId*/); 415 assertThat(testPkgSetting01.pkgFlags, is(0)); 416 assertThat(testPkgSetting01.pkgPrivateFlags, is(0)); 417 final PackageSetting oldPkgSetting01 = new PackageSetting(testPkgSetting01); 418 Settings.updatePackageSetting( 419 testPkgSetting01, 420 null /*disabledPkg*/, 421 null /*sharedUser*/, 422 UPDATED_CODE_PATH /*codePath*/, 423 UPDATED_CODE_PATH /*resourcePath*/, 424 null /*legacyNativeLibraryPath*/, 425 "arm64-v8a" /*primaryCpuAbi*/, 426 "armeabi" /*secondaryCpuAbi*/, 427 ApplicationInfo.FLAG_SYSTEM /*pkgFlags*/, 428 ApplicationInfo.PRIVATE_FLAG_PRIVILEGED /*pkgPrivateFlags*/, 429 null /*childPkgNames*/, 430 UserManagerService.getInstance(), 431 null /*usesStaticLibraries*/, 432 null /*usesStaticLibrariesVersions*/); 433 assertThat(testPkgSetting01.primaryCpuAbiString, is("arm64-v8a")); 434 assertThat(testPkgSetting01.secondaryCpuAbiString, is("armeabi")); 435 assertThat(testPkgSetting01.pkgFlags, is(ApplicationInfo.FLAG_SYSTEM)); 436 assertThat(testPkgSetting01.pkgPrivateFlags, is(ApplicationInfo.PRIVATE_FLAG_PRIVILEGED)); 437 final PackageUserState userState = testPkgSetting01.readUserState(0); 438 final PackageUserState oldUserState = oldPkgSetting01.readUserState(0); 439 // WARNING: When creating a shallow copy of the PackageSetting we do NOT create 440 // new contained objects. For example, this means that changes to the user state 441 // in testPkgSetting01 will also change the user state in its copy. 442 verifyUserState(userState, oldUserState, false /*userStateChanged*/, false /*notLaunched*/, 443 false /*stopped*/, true /*installed*/); 444 } 445 446 /** Update package; changing shared user throws exception */ 447 @Test 448 public void testUpdatePackageSetting03() { 449 final Context context = InstrumentationRegistry.getContext(); 450 final Object lock = new Object(); 451 PermissionManagerInternal pmInt = PermissionManagerService.create(context, null, lock); 452 final Settings testSettings01 = 453 new Settings(context.getFilesDir(), pmInt.getPermissionSettings(), lock); 454 final SharedUserSetting testUserSetting01 = createSharedUserSetting( 455 testSettings01, "TestUser", 10064, 0 /*pkgFlags*/, 0 /*pkgPrivateFlags*/); 456 final PackageSetting testPkgSetting01 = 457 createPackageSetting(0 /*sharedUserId*/, 0 /*pkgFlags*/); 458 try { 459 Settings.updatePackageSetting( 460 testPkgSetting01, 461 null /*disabledPkg*/, 462 testUserSetting01 /*sharedUser*/, 463 UPDATED_CODE_PATH /*codePath*/, 464 null /*resourcePath*/, 465 null /*legacyNativeLibraryPath*/, 466 "arm64-v8a" /*primaryCpuAbi*/, 467 "armeabi" /*secondaryCpuAbi*/, 468 0 /*pkgFlags*/, 469 0 /*pkgPrivateFlags*/, 470 null /*childPkgNames*/, 471 UserManagerService.getInstance(), 472 null /*usesStaticLibraries*/, 473 null /*usesStaticLibrariesVersions*/); 474 fail("Expected a PackageManagerException"); 475 } catch (PackageManagerException expected) { 476 } 477 } 478 479 /** Create a new PackageSetting based on an original package setting */ 480 @Test 481 public void testCreateNewSetting01() { 482 final PackageSetting originalPkgSetting01 = 483 createPackageSetting(0 /*sharedUserId*/, 0 /*pkgFlags*/); 484 final PackageSignatures originalSignatures = originalPkgSetting01.signatures; 485 final PackageSetting testPkgSetting01 = Settings.createNewSetting( 486 REAL_PACKAGE_NAME, 487 originalPkgSetting01 /*originalPkg*/, 488 null /*disabledPkg*/, 489 null /*realPkgName*/, 490 null /*sharedUser*/, 491 UPDATED_CODE_PATH /*codePath*/, 492 UPDATED_CODE_PATH /*resourcePath*/, 493 null /*legacyNativeLibraryPath*/, 494 "arm64-v8a" /*primaryCpuAbi*/, 495 "armeabi" /*secondaryCpuAbi*/, 496 UPDATED_VERSION_CODE /*versionCode*/, 497 ApplicationInfo.FLAG_SYSTEM /*pkgFlags*/, 498 ApplicationInfo.PRIVATE_FLAG_PRIVILEGED /*pkgPrivateFlags*/, 499 null /*installUser*/, 500 false /*allowInstall*/, 501 false /*instantApp*/, 502 false /*virtualPreload*/, 503 null /*parentPkgName*/, 504 null /*childPkgNames*/, 505 UserManagerService.getInstance(), 506 null /*usesStaticLibraries*/, 507 null /*usesStaticLibrariesVersions*/); 508 assertThat(testPkgSetting01.codePath, is(UPDATED_CODE_PATH)); 509 assertThat(testPkgSetting01.name, is(PACKAGE_NAME)); 510 assertThat(testPkgSetting01.pkgFlags, is(ApplicationInfo.FLAG_SYSTEM)); 511 assertThat(testPkgSetting01.pkgPrivateFlags, is(ApplicationInfo.PRIVATE_FLAG_PRIVILEGED)); 512 assertThat(testPkgSetting01.primaryCpuAbiString, is("arm64-v8a")); 513 assertThat(testPkgSetting01.resourcePath, is(UPDATED_CODE_PATH)); 514 assertThat(testPkgSetting01.secondaryCpuAbiString, is("armeabi")); 515 // signatures object must be different 516 assertNotSame(testPkgSetting01.signatures, originalSignatures); 517 assertThat(testPkgSetting01.versionCode, is(UPDATED_VERSION_CODE)); 518 final PackageUserState userState = testPkgSetting01.readUserState(0); 519 verifyUserState(userState, null /*oldUserState*/, false /*userStateChanged*/, 520 false /*notLaunched*/, false /*stopped*/, true /*installed*/); 521 } 522 523 /** Create a new non-system PackageSetting */ 524 @Test 525 public void testCreateNewSetting02() { 526 final PackageSetting testPkgSetting01 = Settings.createNewSetting( 527 PACKAGE_NAME, 528 null /*originalPkg*/, 529 null /*disabledPkg*/, 530 null /*realPkgName*/, 531 null /*sharedUser*/, 532 INITIAL_CODE_PATH /*codePath*/, 533 INITIAL_CODE_PATH /*resourcePath*/, 534 null /*legacyNativeLibraryPath*/, 535 "x86_64" /*primaryCpuAbiString*/, 536 "x86" /*secondaryCpuAbiString*/, 537 INITIAL_VERSION_CODE /*versionCode*/, 538 0 /*pkgFlags*/, 539 0 /*pkgPrivateFlags*/, 540 UserHandle.SYSTEM /*installUser*/, 541 true /*allowInstall*/, 542 false /*instantApp*/, 543 false /*virtualPreload*/, 544 null /*parentPkgName*/, 545 null /*childPkgNames*/, 546 UserManagerService.getInstance(), 547 null /*usesStaticLibraries*/, 548 null /*usesStaticLibrariesVersions*/); 549 assertThat(testPkgSetting01.appId, is(0)); 550 assertThat(testPkgSetting01.codePath, is(INITIAL_CODE_PATH)); 551 assertThat(testPkgSetting01.name, is(PACKAGE_NAME)); 552 assertThat(testPkgSetting01.pkgFlags, is(0)); 553 assertThat(testPkgSetting01.pkgPrivateFlags, is(0)); 554 assertThat(testPkgSetting01.primaryCpuAbiString, is("x86_64")); 555 assertThat(testPkgSetting01.resourcePath, is(INITIAL_CODE_PATH)); 556 assertThat(testPkgSetting01.secondaryCpuAbiString, is("x86")); 557 assertThat(testPkgSetting01.versionCode, is(INITIAL_VERSION_CODE)); 558 // by default, the package is considered stopped 559 final PackageUserState userState = testPkgSetting01.readUserState(0); 560 verifyUserState(userState, null /*oldUserState*/, false /*userStateChanged*/, 561 true /*notLaunched*/, true /*stopped*/, true /*installed*/); 562 } 563 564 /** Create PackageSetting for a shared user */ 565 @Test 566 public void testCreateNewSetting03() { 567 final Context context = InstrumentationRegistry.getContext(); 568 final Object lock = new Object(); 569 PermissionManagerInternal pmInt = PermissionManagerService.create(context, null, lock); 570 final Settings testSettings01 = 571 new Settings(context.getFilesDir(), pmInt.getPermissionSettings(), lock); 572 final SharedUserSetting testUserSetting01 = createSharedUserSetting( 573 testSettings01, "TestUser", 10064, 0 /*pkgFlags*/, 0 /*pkgPrivateFlags*/); 574 final PackageSetting testPkgSetting01 = Settings.createNewSetting( 575 PACKAGE_NAME, 576 null /*originalPkg*/, 577 null /*disabledPkg*/, 578 null /*realPkgName*/, 579 testUserSetting01 /*sharedUser*/, 580 INITIAL_CODE_PATH /*codePath*/, 581 INITIAL_CODE_PATH /*resourcePath*/, 582 null /*legacyNativeLibraryPath*/, 583 "x86_64" /*primaryCpuAbiString*/, 584 "x86" /*secondaryCpuAbiString*/, 585 INITIAL_VERSION_CODE /*versionCode*/, 586 0 /*pkgFlags*/, 587 0 /*pkgPrivateFlags*/, 588 null /*installUser*/, 589 false /*allowInstall*/, 590 false /*instantApp*/, 591 false /*virtualPreload*/, 592 null /*parentPkgName*/, 593 null /*childPkgNames*/, 594 UserManagerService.getInstance(), 595 null /*usesStaticLibraries*/, 596 null /*usesStaticLibrariesVersions*/); 597 assertThat(testPkgSetting01.appId, is(10064)); 598 assertThat(testPkgSetting01.codePath, is(INITIAL_CODE_PATH)); 599 assertThat(testPkgSetting01.name, is(PACKAGE_NAME)); 600 assertThat(testPkgSetting01.pkgFlags, is(0)); 601 assertThat(testPkgSetting01.pkgPrivateFlags, is(0)); 602 assertThat(testPkgSetting01.primaryCpuAbiString, is("x86_64")); 603 assertThat(testPkgSetting01.resourcePath, is(INITIAL_CODE_PATH)); 604 assertThat(testPkgSetting01.secondaryCpuAbiString, is("x86")); 605 assertThat(testPkgSetting01.versionCode, is(INITIAL_VERSION_CODE)); 606 final PackageUserState userState = testPkgSetting01.readUserState(0); 607 verifyUserState(userState, null /*oldUserState*/, false /*userStateChanged*/, 608 false /*notLaunched*/, false /*stopped*/, true /*installed*/); 609 } 610 611 /** Create a new PackageSetting based on a disabled package setting */ 612 @Test 613 public void testCreateNewSetting04() { 614 final PackageSetting disabledPkgSetting01 = 615 createPackageSetting(0 /*sharedUserId*/, 0 /*pkgFlags*/); 616 disabledPkgSetting01.appId = 10064; 617 final PackageSignatures disabledSignatures = disabledPkgSetting01.signatures; 618 final PackageSetting testPkgSetting01 = Settings.createNewSetting( 619 PACKAGE_NAME, 620 null /*originalPkg*/, 621 disabledPkgSetting01 /*disabledPkg*/, 622 null /*realPkgName*/, 623 null /*sharedUser*/, 624 UPDATED_CODE_PATH /*codePath*/, 625 UPDATED_CODE_PATH /*resourcePath*/, 626 null /*legacyNativeLibraryPath*/, 627 "arm64-v8a" /*primaryCpuAbi*/, 628 "armeabi" /*secondaryCpuAbi*/, 629 UPDATED_VERSION_CODE /*versionCode*/, 630 0 /*pkgFlags*/, 631 0 /*pkgPrivateFlags*/, 632 null /*installUser*/, 633 false /*allowInstall*/, 634 false /*instantApp*/, 635 false /*virtualPreload*/, 636 null /*parentPkgName*/, 637 null /*childPkgNames*/, 638 UserManagerService.getInstance(), 639 null /*usesStaticLibraries*/, 640 null /*usesStaticLibrariesVersions*/); 641 assertThat(testPkgSetting01.appId, is(10064)); 642 assertThat(testPkgSetting01.codePath, is(UPDATED_CODE_PATH)); 643 assertThat(testPkgSetting01.name, is(PACKAGE_NAME)); 644 assertThat(testPkgSetting01.pkgFlags, is(0)); 645 assertThat(testPkgSetting01.pkgPrivateFlags, is(0)); 646 assertThat(testPkgSetting01.primaryCpuAbiString, is("arm64-v8a")); 647 assertThat(testPkgSetting01.resourcePath, is(UPDATED_CODE_PATH)); 648 assertThat(testPkgSetting01.secondaryCpuAbiString, is("armeabi")); 649 assertNotSame(testPkgSetting01.signatures, disabledSignatures); 650 assertThat(testPkgSetting01.versionCode, is(UPDATED_VERSION_CODE)); 651 final PackageUserState userState = testPkgSetting01.readUserState(0); 652 verifyUserState(userState, null /*oldUserState*/, false /*userStateChanged*/, 653 false /*notLaunched*/, false /*stopped*/, true /*installed*/); 654 } 655 656 private <T> void assertArrayEquals(T[] a, T[] b) { 657 assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b), 658 Arrays.equals(a, b)); 659 } 660 661 private void assertArrayEquals(int[] a, int[] b) { 662 assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b), 663 Arrays.equals(a, b)); 664 } 665 666 private void assertArrayEquals(long[] a, long[] b) { 667 assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b), 668 Arrays.equals(a, b)); 669 } 670 671 private void verifyUserState(PackageUserState userState, PackageUserState oldUserState, 672 boolean userStateChanged) { 673 verifyUserState(userState, oldUserState, userStateChanged, false /*notLaunched*/, 674 false /*stopped*/, true /*installed*/); 675 } 676 677 private void verifyUserState(PackageUserState userState, PackageUserState oldUserState, 678 boolean userStateChanged, boolean notLaunched, boolean stopped, boolean installed) { 679 assertThat(userState.enabled, is(0)); 680 assertThat(userState.hidden, is(false)); 681 assertThat(userState.installed, is(installed)); 682 assertThat(userState.notLaunched, is(notLaunched)); 683 assertThat(userState.stopped, is(stopped)); 684 assertThat(userState.suspended, is(false)); 685 if (oldUserState != null) { 686 assertThat(userState.equals(oldUserState), is(not(userStateChanged))); 687 } 688 } 689 690 private void verifySettingCopy(PackageSetting origPkgSetting, PackageSetting testPkgSetting) { 691 assertThat(origPkgSetting, is(not(testPkgSetting))); 692 assertThat(origPkgSetting.appId, is(testPkgSetting.appId)); 693 // different but equal objects 694 assertNotSame(origPkgSetting.childPackageNames, testPkgSetting.childPackageNames); 695 assertThat(origPkgSetting.childPackageNames, is(testPkgSetting.childPackageNames)); 696 assertSame(origPkgSetting.codePath, testPkgSetting.codePath); 697 assertThat(origPkgSetting.codePath, is(testPkgSetting.codePath)); 698 assertSame(origPkgSetting.codePathString, testPkgSetting.codePathString); 699 assertThat(origPkgSetting.codePathString, is(testPkgSetting.codePathString)); 700 assertSame(origPkgSetting.cpuAbiOverrideString, testPkgSetting.cpuAbiOverrideString); 701 assertThat(origPkgSetting.cpuAbiOverrideString, is(testPkgSetting.cpuAbiOverrideString)); 702 assertThat(origPkgSetting.firstInstallTime, is(testPkgSetting.firstInstallTime)); 703 assertSame(origPkgSetting.installerPackageName, testPkgSetting.installerPackageName); 704 assertThat(origPkgSetting.installerPackageName, is(testPkgSetting.installerPackageName)); 705 assertThat(origPkgSetting.installPermissionsFixed, 706 is(testPkgSetting.installPermissionsFixed)); 707 assertThat(origPkgSetting.isOrphaned, is(testPkgSetting.isOrphaned)); 708 assertSame(origPkgSetting.keySetData, testPkgSetting.keySetData); 709 assertThat(origPkgSetting.keySetData, is(testPkgSetting.keySetData)); 710 assertThat(origPkgSetting.lastUpdateTime, is(testPkgSetting.lastUpdateTime)); 711 assertSame(origPkgSetting.legacyNativeLibraryPathString, 712 testPkgSetting.legacyNativeLibraryPathString); 713 assertThat(origPkgSetting.legacyNativeLibraryPathString, 714 is(testPkgSetting.legacyNativeLibraryPathString)); 715 assertNotSame(origPkgSetting.mPermissionsState, testPkgSetting.mPermissionsState); 716 assertThat(origPkgSetting.mPermissionsState, is(testPkgSetting.mPermissionsState)); 717 assertThat(origPkgSetting.name, is(testPkgSetting.name)); 718 // oldCodePaths is _not_ copied 719 // assertNotSame(origPkgSetting.oldCodePaths, testPkgSetting.oldCodePaths); 720 // assertThat(origPkgSetting.oldCodePaths, is(not(testPkgSetting.oldCodePaths))); 721 assertSame(origPkgSetting.parentPackageName, testPkgSetting.parentPackageName); 722 assertThat(origPkgSetting.parentPackageName, is(testPkgSetting.parentPackageName)); 723 assertSame(origPkgSetting.pkg, testPkgSetting.pkg); 724 // No equals() method for this object 725 // assertThat(origPkgSetting.pkg, is(testPkgSetting.pkg)); 726 assertThat(origPkgSetting.pkgFlags, is(testPkgSetting.pkgFlags)); 727 assertThat(origPkgSetting.pkgPrivateFlags, is(testPkgSetting.pkgPrivateFlags)); 728 assertSame(origPkgSetting.primaryCpuAbiString, testPkgSetting.primaryCpuAbiString); 729 assertThat(origPkgSetting.primaryCpuAbiString, is(testPkgSetting.primaryCpuAbiString)); 730 assertThat(origPkgSetting.realName, is(testPkgSetting.realName)); 731 assertSame(origPkgSetting.resourcePath, testPkgSetting.resourcePath); 732 assertThat(origPkgSetting.resourcePath, is(testPkgSetting.resourcePath)); 733 assertSame(origPkgSetting.resourcePathString, testPkgSetting.resourcePathString); 734 assertThat(origPkgSetting.resourcePathString, is(testPkgSetting.resourcePathString)); 735 assertSame(origPkgSetting.secondaryCpuAbiString, testPkgSetting.secondaryCpuAbiString); 736 assertThat(origPkgSetting.secondaryCpuAbiString, is(testPkgSetting.secondaryCpuAbiString)); 737 assertSame(origPkgSetting.sharedUser, testPkgSetting.sharedUser); 738 assertThat(origPkgSetting.sharedUser, is(testPkgSetting.sharedUser)); 739 assertSame(origPkgSetting.signatures, testPkgSetting.signatures); 740 assertThat(origPkgSetting.signatures, is(testPkgSetting.signatures)); 741 assertThat(origPkgSetting.timeStamp, is(testPkgSetting.timeStamp)); 742 assertThat(origPkgSetting.uidError, is(testPkgSetting.uidError)); 743 assertNotSame(origPkgSetting.getUserState(), is(testPkgSetting.getUserState())); 744 // No equals() method for SparseArray object 745 // assertThat(origPkgSetting.getUserState(), is(testPkgSetting.getUserState())); 746 assertSame(origPkgSetting.verificationInfo, testPkgSetting.verificationInfo); 747 assertThat(origPkgSetting.verificationInfo, is(testPkgSetting.verificationInfo)); 748 assertThat(origPkgSetting.versionCode, is(testPkgSetting.versionCode)); 749 assertSame(origPkgSetting.volumeUuid, testPkgSetting.volumeUuid); 750 assertThat(origPkgSetting.volumeUuid, is(testPkgSetting.volumeUuid)); 751 } 752 753 private SharedUserSetting createSharedUserSetting(Settings settings, String userName, 754 int sharedUserId, int pkgFlags, int pkgPrivateFlags) { 755 return settings.addSharedUserLPw( 756 userName, 757 sharedUserId, 758 pkgFlags, 759 pkgPrivateFlags); 760 } 761 private PackageSetting createPackageSetting(int sharedUserId, int pkgFlags) { 762 return new PackageSetting( 763 PACKAGE_NAME, 764 REAL_PACKAGE_NAME, 765 INITIAL_CODE_PATH /*codePath*/, 766 INITIAL_CODE_PATH /*resourcePath*/, 767 null /*legacyNativeLibraryPathString*/, 768 "x86_64" /*primaryCpuAbiString*/, 769 "x86" /*secondaryCpuAbiString*/, 770 null /*cpuAbiOverrideString*/, 771 INITIAL_VERSION_CODE, 772 pkgFlags, 773 0 /*privateFlags*/, 774 null /*parentPackageName*/, 775 null /*childPackageNames*/, 776 sharedUserId, 777 null /*usesStaticLibraries*/, 778 null /*usesStaticLibrariesVersions*/); 779 } 780 781 private PackageSetting createPackageSetting(String packageName) { 782 return new PackageSetting( 783 packageName, 784 packageName, 785 INITIAL_CODE_PATH /*codePath*/, 786 INITIAL_CODE_PATH /*resourcePath*/, 787 null /*legacyNativeLibraryPathString*/, 788 "x86_64" /*primaryCpuAbiString*/, 789 "x86" /*secondaryCpuAbiString*/, 790 null /*cpuAbiOverrideString*/, 791 INITIAL_VERSION_CODE, 792 0, 793 0 /*privateFlags*/, 794 null /*parentPackageName*/, 795 null /*childPackageNames*/, 796 0, 797 null /*usesStaticLibraries*/, 798 null /*usesStaticLibrariesVersions*/); 799 } 800 801 private @NonNull List<UserInfo> createFakeUsers() { 802 ArrayList<UserInfo> users = new ArrayList<>(); 803 users.add(new UserInfo(UserHandle.USER_SYSTEM, "test user", UserInfo.FLAG_INITIALIZED)); 804 return users; 805 } 806 807 private void writeFile(File file, byte[] data) { 808 file.mkdirs(); 809 try { 810 AtomicFile aFile = new AtomicFile(file); 811 FileOutputStream fos = aFile.startWrite(); 812 fos.write(data); 813 aFile.finishWrite(fos); 814 } catch (IOException ioe) { 815 Log.e(TAG, "Cannot write file " + file.getPath()); 816 } 817 } 818 819 private void writePackagesXml() { 820 writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/packages.xml"), 821 ("<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" 822 + "<packages>" 823 + "<last-platform-version internal=\"15\" external=\"0\" fingerprint=\"foo\" />" 824 + "<permission-trees>" 825 + "<item name=\"com.google.android.permtree\" package=\"com.google.android.permpackage\" />" 826 + "</permission-trees>" 827 + "<permissions>" 828 + "<item name=\"android.permission.WRITE_CALL_LOG\" package=\"android\" protection=\"1\" />" 829 + "<item name=\"android.permission.ASEC_ACCESS\" package=\"android\" protection=\"2\" />" 830 + "<item name=\"android.permission.ACCESS_WIMAX_STATE\" package=\"android\" />" 831 + "<item name=\"android.permission.REBOOT\" package=\"android\" protection=\"18\" />" 832 + "</permissions>" 833 + "<package name=\"com.android.app1\" codePath=\"/system/app/app1.apk\" nativeLibraryPath=\"/data/data/com.android.app1/lib\" flags=\"1\" ft=\"1360e2caa70\" it=\"135f2f80d08\" ut=\"1360e2caa70\" version=\"1109\" sharedUserId=\"11000\">" 834 + "<sigs count=\"1\">" 835 + "<cert index=\"0\" key=\"" + KeySetStrings.ctsKeySetCertA + "\" />" 836 + "</sigs>" 837 + "<proper-signing-keyset identifier=\"1\" />" 838 + "</package>" 839 + "<package name=\"com.android.app2\" codePath=\"/system/app/app2.apk\" nativeLibraryPath=\"/data/data/com.android.app2/lib\" flags=\"1\" ft=\"1360e578718\" it=\"135f2f80d08\" ut=\"1360e578718\" version=\"15\" enabled=\"3\" userId=\"11001\">" 840 + "<sigs count=\"1\">" 841 + "<cert index=\"0\" />" 842 + "</sigs>" 843 + "<proper-signing-keyset identifier=\"1\" />" 844 + "<defined-keyset alias=\"AB\" identifier=\"4\" />" 845 + "</package>" 846 + "<package name=\"com.android.app3\" codePath=\"/system/app/app3.apk\" nativeLibraryPath=\"/data/data/com.android.app3/lib\" flags=\"1\" ft=\"1360e577b60\" it=\"135f2f80d08\" ut=\"1360e577b60\" version=\"15\" userId=\"11030\">" 847 + "<sigs count=\"1\">" 848 + "<cert index=\"1\" key=\"" + KeySetStrings.ctsKeySetCertB + "\" />" 849 + "</sigs>" 850 + "<proper-signing-keyset identifier=\"2\" />" 851 + "<upgrade-keyset identifier=\"3\" />" 852 + "<defined-keyset alias=\"C\" identifier=\"3\" />" 853 + "</package>" 854 + "<shared-user name=\"com.android.shared1\" userId=\"11000\">" 855 + "<sigs count=\"1\">" 856 + "<cert index=\"1\" />" 857 + "</sigs>" 858 + "<perms>" 859 + "<item name=\"android.permission.REBOOT\" />" 860 + "</perms>" 861 + "</shared-user>" 862 + "<keyset-settings version=\"1\">" 863 + "<keys>" 864 + "<public-key identifier=\"1\" value=\"" + KeySetStrings.ctsKeySetPublicKeyA + "\" />" 865 + "<public-key identifier=\"2\" value=\"" + KeySetStrings.ctsKeySetPublicKeyB + "\" />" 866 + "<public-key identifier=\"3\" value=\"" + KeySetStrings.ctsKeySetPublicKeyC + "\" />" 867 + "</keys>" 868 + "<keysets>" 869 + "<keyset identifier=\"1\">" 870 + "<key-id identifier=\"1\" />" 871 + "</keyset>" 872 + "<keyset identifier=\"2\">" 873 + "<key-id identifier=\"2\" />" 874 + "</keyset>" 875 + "<keyset identifier=\"3\">" 876 + "<key-id identifier=\"3\" />" 877 + "</keyset>" 878 + "<keyset identifier=\"4\">" 879 + "<key-id identifier=\"1\" />" 880 + "<key-id identifier=\"2\" />" 881 + "</keyset>" 882 + "</keysets>" 883 + "<lastIssuedKeyId value=\"3\" />" 884 + "<lastIssuedKeySetId value=\"4\" />" 885 + "</keyset-settings>" 886 + "</packages>").getBytes()); 887 } 888 889 private void writePackageRestrictions_oldSuspendInfoXml(final int userId) { 890 writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/users/" 891 + userId + "/package-restrictions.xml"), 892 ( "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n" 893 + "<package-restrictions>\n" 894 + " <pkg name=\"" + PACKAGE_NAME_1 + "\" suspended=\"true\" />" 895 + " <pkg name=\"" + PACKAGE_NAME_2 + "\" suspended=\"false\" />" 896 + " <preferred-activities />\n" 897 + " <persistent-preferred-activities />\n" 898 + " <crossProfile-intent-filters />\n" 899 + " <default-apps />\n" 900 + "</package-restrictions>\n") 901 .getBytes()); 902 } 903 904 private void writeStoppedPackagesXml() { 905 writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/packages-stopped.xml"), 906 ( "<?xml version='1.0' encoding='utf-8' standalone='yes' ?>" 907 + "<stopped-packages>" 908 + "<pkg name=\"com.android.app1\" nl=\"1\" />" 909 + "<pkg name=\"com.android.app3\" nl=\"1\" />" 910 + "</stopped-packages>") 911 .getBytes()); 912 } 913 914 private void writePackagesList() { 915 writeFile(new File(InstrumentationRegistry.getContext().getFilesDir(), "system/packages.list"), 916 ( "com.android.app1 11000 0 /data/data/com.android.app1 seinfo1" 917 + "com.android.app2 11001 0 /data/data/com.android.app2 seinfo2" 918 + "com.android.app3 11030 0 /data/data/com.android.app3 seinfo3") 919 .getBytes()); 920 } 921 922 private void deleteSystemFolder() { 923 File systemFolder = new File(InstrumentationRegistry.getContext().getFilesDir(), "system"); 924 deleteFolder(systemFolder); 925 } 926 927 private static void deleteFolder(File folder) { 928 File[] files = folder.listFiles(); 929 if (files != null) { 930 for (File file : files) { 931 deleteFolder(file); 932 } 933 } 934 folder.delete(); 935 } 936 937 private void writeOldFiles() { 938 deleteSystemFolder(); 939 writePackagesXml(); 940 writeStoppedPackagesXml(); 941 writePackagesList(); 942 } 943 944 @Before 945 public void createUserManagerServiceRef() throws ReflectiveOperationException { 946 InstrumentationRegistry.getInstrumentation().runOnMainSync((Runnable) () -> { 947 try { 948 // unregister the user manager from the local service 949 LocalServices.removeServiceForTest(UserManagerInternal.class); 950 new UserManagerService(InstrumentationRegistry.getContext()); 951 } catch (Exception e) { 952 e.printStackTrace(); 953 fail("Could not create user manager service; " + e); 954 } 955 }); 956 } 957 958 @After 959 public void tearDown() throws Exception { 960 deleteFolder(InstrumentationRegistry.getTargetContext().getFilesDir()); 961 } 962 963 private void verifyKeySetMetaData(Settings settings) 964 throws ReflectiveOperationException, IllegalAccessException { 965 ArrayMap<String, PackageSetting> packages = settings.mPackages; 966 KeySetManagerService ksms = settings.mKeySetManagerService; 967 968 /* verify keyset and public key ref counts */ 969 assertThat(KeySetUtils.getKeySetRefCount(ksms, 1), is(2)); 970 assertThat(KeySetUtils.getKeySetRefCount(ksms, 2), is(1)); 971 assertThat(KeySetUtils.getKeySetRefCount(ksms, 3), is(1)); 972 assertThat(KeySetUtils.getKeySetRefCount(ksms, 4), is(1)); 973 assertThat(KeySetUtils.getPubKeyRefCount(ksms, 1), is(2)); 974 assertThat(KeySetUtils.getPubKeyRefCount(ksms, 2), is(2)); 975 assertThat(KeySetUtils.getPubKeyRefCount(ksms, 3), is(1)); 976 977 /* verify public keys properly read */ 978 PublicKey keyA = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyA); 979 PublicKey keyB = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyB); 980 PublicKey keyC = PackageParser.parsePublicKey(KeySetStrings.ctsKeySetPublicKeyC); 981 assertThat(KeySetUtils.getPubKey(ksms, 1), is(keyA)); 982 assertThat(KeySetUtils.getPubKey(ksms, 2), is(keyB)); 983 assertThat(KeySetUtils.getPubKey(ksms, 3), is(keyC)); 984 985 /* verify mapping is correct (ks -> pub keys) */ 986 LongSparseArray<ArraySet<Long>> ksMapping = KeySetUtils.getKeySetMapping(ksms); 987 ArraySet<Long> mapping = ksMapping.get(1); 988 assertThat(mapping.size(), is(1)); 989 assertThat(mapping.contains(new Long(1)), is(true)); 990 mapping = ksMapping.get(2); 991 assertThat(mapping.size(), is(1)); 992 assertThat(mapping.contains(new Long(2)), is(true)); 993 mapping = ksMapping.get(3); 994 assertThat(mapping.size(), is(1)); 995 assertThat(mapping.contains(new Long(3)), is(true)); 996 mapping = ksMapping.get(4); 997 assertThat(mapping.size(), is(2)); 998 assertThat(mapping.contains(new Long(1)), is(true)); 999 assertThat(mapping.contains(new Long(2)), is(true)); 1000 1001 /* verify lastIssuedIds are consistent */ 1002 assertThat(KeySetUtils.getLastIssuedKeyId(ksms), is(3L)); 1003 assertThat(KeySetUtils.getLastIssuedKeySetId(ksms), is(4L)); 1004 1005 /* verify packages have been given the appropriate information */ 1006 PackageSetting ps = packages.get("com.android.app1"); 1007 assertThat(ps.keySetData.getProperSigningKeySet(), is(1L)); 1008 ps = packages.get("com.android.app2"); 1009 assertThat(ps.keySetData.getProperSigningKeySet(), is(1L)); 1010 assertThat(ps.keySetData.getAliases().get("AB"), is(4L)); 1011 ps = packages.get("com.android.app3"); 1012 assertThat(ps.keySetData.getProperSigningKeySet(), is(2L)); 1013 assertThat(ps.keySetData.getAliases().get("C"), is(3L)); 1014 assertThat(ps.keySetData.getUpgradeKeySets().length, is(1)); 1015 assertThat(ps.keySetData.getUpgradeKeySets()[0], is(3L)); 1016 } 1017 } 1018