From b0a213ef066a04181510c65cb8b71eacbd7712cf Mon Sep 17 00:00:00 2001 From: Ruslan Tkhakokhov Date: Tue, 14 Jul 2020 16:50:01 +0100 Subject: [PATCH] Refactor AppBackupUtils into BackupEligibilityRules AppBackupUtils contains static utility methods for checking backup eligibility of packages. Refactor it into an instance class called BackupEligibilityRules to better reflect the responsibilities of the class, encapsulate eligibility-related state as well as logic and simplify testing. See the bug description for full rationale. Bug: 161241479 Test: atest AppBackupUtilsTest Change-Id: I8ae47ac2a15e3c70da8feab752dd8354951224ea --- ...Utils.java => BackupEligibilityRules.java} | 97 +++++------ ...t.java => BackupEligibilityRulesTest.java} | 162 +++++++++--------- 2 files changed, 127 insertions(+), 132 deletions(-) rename services/backup/java/com/android/server/backup/utils/{AppBackupUtils.java => BackupEligibilityRules.java} (80%) rename services/tests/servicestests/src/com/android/server/backup/utils/{AppBackupUtilsTest.java => BackupEligibilityRulesTest.java} (82%) diff --git a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java b/services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java similarity index 80% rename from services/backup/java/com/android/server/backup/utils/AppBackupUtils.java rename to services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java index a616e0e9a1c6d..162921528e95c 100644 --- a/services/backup/java/com/android/server/backup/utils/AppBackupUtils.java +++ b/services/backup/java/com/android/server/backup/utils/BackupEligibilityRules.java @@ -47,12 +47,34 @@ import java.util.Set; /** * Utility methods wrapping operations on ApplicationInfo and PackageInfo. */ -public class AppBackupUtils { +public class BackupEligibilityRules { private static final boolean DEBUG = false; // Whitelist of system packages that are eligible for backup in non-system users. private static final Set systemPackagesWhitelistedForAllUsers = Sets.newArraySet(PACKAGE_MANAGER_SENTINEL, PLATFORM_PACKAGE_NAME); + private final PackageManager mPackageManager; + private final PackageManagerInternal mPackageManagerInternal; + private final int mUserId; + @OperationType private final int mOperationType; + + public static BackupEligibilityRules forBackup(PackageManager packageManager, + PackageManagerInternal packageManagerInternal, + int userId) { + return new BackupEligibilityRules(packageManager, packageManagerInternal, userId, + OperationType.BACKUP); + } + + public BackupEligibilityRules(PackageManager packageManager, + PackageManagerInternal packageManagerInternal, + int userId, + @OperationType int operationType) { + mPackageManager = packageManager; + mPackageManagerInternal = packageManagerInternal; + mUserId = userId; + mOperationType = operationType; + } + /** * Returns whether app is eligible for backup. * @@ -65,32 +87,18 @@ public class AppBackupUtils { *
  • it is the special shared-storage backup package used for 'adb backup' * */ - public static boolean appIsEligibleForBackup(ApplicationInfo app, int userId) { - return appIsEligibleForBackup( - app, LocalServices.getService(PackageManagerInternal.class), userId, - OperationType.BACKUP); - } - - public static boolean appIsEligibleForBackup(ApplicationInfo app, int userId, - @OperationType int operationType) { - return appIsEligibleForBackup( - app, LocalServices.getService(PackageManagerInternal.class), userId, operationType); - } - @VisibleForTesting - static boolean appIsEligibleForBackup( - ApplicationInfo app, PackageManagerInternal packageManager, int userId, - @OperationType int operationType) { + public boolean appIsEligibleForBackup(ApplicationInfo app) { // 1. their manifest states android:allowBackup="false" boolean appAllowsBackup = (app.flags & ApplicationInfo.FLAG_ALLOW_BACKUP) != 0; - if (!appAllowsBackup && !forceFullBackup(app.uid, operationType)) { + if (!appAllowsBackup && !forceFullBackup(app.uid, mOperationType)) { return false; } // 2. they run as a system-level uid if (UserHandle.isCore(app.uid)) { // and the backup is happening for non-system user on a non-whitelisted package. - if (userId != UserHandle.USER_SYSTEM + if (mUserId != UserHandle.USER_SYSTEM && !systemPackagesWhitelistedForAllUsers.contains(app.packageName)) { return false; } @@ -111,7 +119,7 @@ public class AppBackupUtils { return false; } - return !appIsDisabled(app, packageManager, userId); + return !appIsDisabled(app); } /** @@ -124,18 +132,16 @@ public class AppBackupUtils { * {@link BackupTransport#isAppEligibleForBackup(PackageInfo, boolean)} * */ - public static boolean appIsRunningAndEligibleForBackupWithTransport( + public boolean appIsRunningAndEligibleForBackupWithTransport( @Nullable TransportClient transportClient, - String packageName, - PackageManager pm, - int userId) { + String packageName) { try { - PackageInfo packageInfo = pm.getPackageInfoAsUser(packageName, - PackageManager.GET_SIGNING_CERTIFICATES, userId); + PackageInfo packageInfo = mPackageManager.getPackageInfoAsUser(packageName, + PackageManager.GET_SIGNING_CERTIFICATES, mUserId); ApplicationInfo applicationInfo = packageInfo.applicationInfo; - if (!appIsEligibleForBackup(applicationInfo, userId) + if (!appIsEligibleForBackup(applicationInfo) || appIsStopped(applicationInfo) - || appIsDisabled(applicationInfo, userId)) { + || appIsDisabled(applicationInfo)) { return false; } if (transportClient != null) { @@ -144,7 +150,7 @@ public class AppBackupUtils { transportClient.connectOrThrow( "AppBackupUtils.appIsRunningAndEligibleForBackupWithTransport"); return transport.isAppEligibleForBackup( - packageInfo, AppBackupUtils.appGetsFullBackup(packageInfo)); + packageInfo, appGetsFullBackup(packageInfo)); } catch (Exception e) { Slog.e(TAG, "Unable to ask about eligibility: " + e.getMessage()); } @@ -157,14 +163,11 @@ public class AppBackupUtils { } /** Avoid backups of 'disabled' apps. */ - static boolean appIsDisabled(ApplicationInfo app, int userId) { - return appIsDisabled(app, LocalServices.getService(PackageManagerInternal.class), userId); - } - @VisibleForTesting - static boolean appIsDisabled( - ApplicationInfo app, PackageManagerInternal packageManager, int userId) { - int enabledSetting = packageManager.getApplicationEnabledState(app.packageName, userId); + boolean appIsDisabled( + ApplicationInfo app) { + int enabledSetting = mPackageManagerInternal.getApplicationEnabledState(app.packageName, + mUserId); switch (enabledSetting) { case PackageManager.COMPONENT_ENABLED_STATE_DISABLED: @@ -190,7 +193,7 @@ public class AppBackupUtils { *
  • The app has just been installed. * */ - public static boolean appIsStopped(ApplicationInfo app) { + public boolean appIsStopped(ApplicationInfo app) { return ((app.flags & ApplicationInfo.FLAG_STOPPED) != 0); } @@ -198,13 +201,9 @@ public class AppBackupUtils { * Returns whether the app can get full backup. Does *not* check overall backup eligibility * policy! */ - public static boolean appGetsFullBackup(PackageInfo pkg) { - return appGetsFullBackup(pkg, OperationType.BACKUP); - } - @VisibleForTesting - public static boolean appGetsFullBackup(PackageInfo pkg, @OperationType int operationType) { - if (forceFullBackup(pkg.applicationInfo.uid, operationType)) { + public boolean appGetsFullBackup(PackageInfo pkg) { + if (forceFullBackup(pkg.applicationInfo.uid, mOperationType)) { // If this is a migration, all non-system packages get full backup. return true; } @@ -218,12 +217,11 @@ public class AppBackupUtils { return true; } - public static boolean appIgnoresIncludeExcludeRules(ApplicationInfo app, - @OperationType int operationType) { - return forceFullBackup(app.uid, operationType); + public boolean appIgnoresIncludeExcludeRules(ApplicationInfo app) { + return forceFullBackup(app.uid, mOperationType); } - private static boolean forceFullBackup(int appUid, @OperationType int operationType) { + private boolean forceFullBackup(int appUid, @OperationType int operationType) { return operationType == OperationType.MIGRATION && !UserHandle.isCore(appUid); } @@ -232,7 +230,7 @@ public class AppBackupUtils { * Returns whether the app is only capable of doing key/value. We say it's not if it allows full * backup, and it is otherwise. */ - public static boolean appIsKeyValueOnly(PackageInfo pkg) { + public boolean appIsKeyValueOnly(PackageInfo pkg) { return !appGetsFullBackup(pkg); } @@ -254,8 +252,7 @@ public class AppBackupUtils { * * Note that if {@param target} is null we return false. */ - public static boolean signaturesMatch(Signature[] storedSigs, PackageInfo target, - PackageManagerInternal pmi) { + public boolean signaturesMatch(Signature[] storedSigs, PackageInfo target) { if (target == null || target.packageName == null) { return false; } @@ -296,7 +293,7 @@ public class AppBackupUtils { // TODO(b/73988180): address the case that app has declared restoreAnyVersion and is // restoring from higher version to lower after having rotated the key (i.e. higher // version has different sig than lower version that we want to restore to) - return pmi.isDataRestoreSafe(storedSigs[0], target.packageName); + return mPackageManagerInternal.isDataRestoreSafe(storedSigs[0], target.packageName); } else { // the app couldn't have rotated keys, since it was signed with multiple sigs - do // a check to see if we find a match for all stored sigs diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/BackupEligibilityRulesTest.java similarity index 82% rename from services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java rename to services/tests/servicestests/src/com/android/server/backup/utils/BackupEligibilityRulesTest.java index 201211ef60bf6..444155d12b3fa 100644 --- a/services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java +++ b/services/tests/servicestests/src/com/android/server/backup/utils/BackupEligibilityRulesTest.java @@ -22,7 +22,6 @@ import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import android.app.backup.BackupManager; import android.app.backup.BackupManager.OperationType; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; @@ -43,11 +42,13 @@ import com.android.server.backup.UserBackupManagerService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; @SmallTest @Presubmit @RunWith(AndroidJUnit4.class) -public class AppBackupUtilsTest { +public class BackupEligibilityRulesTest { private static final String CUSTOM_BACKUP_AGENT_NAME = "custom.backup.agent"; private static final String TEST_PACKAGE_NAME = "test_package"; @@ -56,15 +57,18 @@ public class AppBackupUtilsTest { private static final Signature SIGNATURE_3 = generateSignature((byte) 3); private static final Signature SIGNATURE_4 = generateSignature((byte) 4); - private PackageManagerInternal mMockPackageManagerInternal; + @Mock private PackageManagerInternal mMockPackageManagerInternal; + @Mock private PackageManager mPackageManager; + private BackupEligibilityRules mBackupEligibilityRules; private int mUserId; @Before public void setUp() throws Exception { - mMockPackageManagerInternal = mock(PackageManagerInternal.class); + MockitoAnnotations.initMocks(this); mUserId = UserHandle.USER_SYSTEM; + mBackupEligibilityRules = getBackupEligibilityRules(OperationType.BACKUP); } @Test @@ -75,8 +79,7 @@ public class AppBackupUtilsTest { applicationInfo.backupAgentName = CUSTOM_BACKUP_AGENT_NAME; applicationInfo.packageName = TEST_PACKAGE_NAME; - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isFalse(); } @@ -90,8 +93,7 @@ public class AppBackupUtilsTest { applicationInfo.backupAgentName = null; applicationInfo.packageName = TEST_PACKAGE_NAME; - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isFalse(); } @@ -104,8 +106,7 @@ public class AppBackupUtilsTest { applicationInfo.backupAgentName = CUSTOM_BACKUP_AGENT_NAME; applicationInfo.packageName = UserBackupManagerService.SHARED_BACKUP_AGENT_PACKAGE; - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isFalse(); } @@ -121,8 +122,7 @@ public class AppBackupUtilsTest { when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId)) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isTrue(); } @@ -138,8 +138,7 @@ public class AppBackupUtilsTest { when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId)) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isTrue(); } @@ -155,8 +154,7 @@ public class AppBackupUtilsTest { when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId)) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isTrue(); } @@ -172,8 +170,7 @@ public class AppBackupUtilsTest { when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId)) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isFalse(); } @@ -189,8 +186,7 @@ public class AppBackupUtilsTest { when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId)) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isFalse(); } @@ -206,8 +202,7 @@ public class AppBackupUtilsTest { when(mMockPackageManagerInternal.getApplicationEnabledState(TEST_PACKAGE_NAME, mUserId)) .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.BACKUP); + boolean isEligible = mBackupEligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isFalse(); } @@ -218,8 +213,9 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = getApplicationInfo(Process.FIRST_APPLICATION_UID, /* flags */ 0, CUSTOM_BACKUP_AGENT_NAME); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.MIGRATION); + BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( + OperationType.MIGRATION); + boolean isEligible = eligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isTrue(); } @@ -230,8 +226,9 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = getApplicationInfo(Process.SYSTEM_UID, /* flags */ 0, CUSTOM_BACKUP_AGENT_NAME); - boolean isEligible = AppBackupUtils.appIsEligibleForBackup(applicationInfo, - mMockPackageManagerInternal, mUserId, OperationType.MIGRATION); + BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( + OperationType.MIGRATION); + boolean isEligible = eligibilityRules.appIsEligibleForBackup(applicationInfo); assertThat(isEligible).isFalse(); } @@ -248,7 +245,7 @@ public class AppBackupUtilsTest { .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DEFAULT); boolean isDisabled = - AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId); + mBackupEligibilityRules.appIsDisabled(applicationInfo); assertThat(isDisabled).isFalse(); } @@ -266,7 +263,7 @@ public class AppBackupUtilsTest { boolean isDisabled = - AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId); + mBackupEligibilityRules.appIsDisabled(applicationInfo); assertThat(isDisabled).isTrue(); } @@ -283,7 +280,7 @@ public class AppBackupUtilsTest { boolean isDisabled = - AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId); + mBackupEligibilityRules.appIsDisabled(applicationInfo); assertThat(isDisabled).isFalse(); } @@ -300,7 +297,7 @@ public class AppBackupUtilsTest { boolean isDisabled = - AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId); + mBackupEligibilityRules.appIsDisabled(applicationInfo); assertThat(isDisabled).isTrue(); } @@ -316,7 +313,7 @@ public class AppBackupUtilsTest { .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER); boolean isDisabled = - AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId); + mBackupEligibilityRules.appIsDisabled(applicationInfo); assertThat(isDisabled).isTrue(); } @@ -332,7 +329,7 @@ public class AppBackupUtilsTest { .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED); boolean isDisabled = - AppBackupUtils.appIsDisabled(applicationInfo, mMockPackageManagerInternal, mUserId); + mBackupEligibilityRules.appIsDisabled(applicationInfo); assertThat(isDisabled).isTrue(); } @@ -342,7 +339,7 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags |= ApplicationInfo.FLAG_STOPPED; - boolean isStopped = AppBackupUtils.appIsStopped(applicationInfo); + boolean isStopped = mBackupEligibilityRules.appIsStopped(applicationInfo); assertThat(isStopped).isTrue(); } @@ -352,7 +349,7 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags = ~ApplicationInfo.FLAG_STOPPED; - boolean isStopped = AppBackupUtils.appIsStopped(applicationInfo); + boolean isStopped = mBackupEligibilityRules.appIsStopped(applicationInfo); assertThat(isStopped).isFalse(); } @@ -363,7 +360,7 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = null; - boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.BACKUP); + boolean result = mBackupEligibilityRules.appGetsFullBackup(packageInfo); assertThat(result).isTrue(); } @@ -376,7 +373,7 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_FULL_BACKUP_ONLY; - boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.BACKUP); + boolean result = mBackupEligibilityRules.appGetsFullBackup(packageInfo); assertThat(result).isTrue(); } @@ -389,7 +386,7 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags = ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY; - boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.BACKUP); + boolean result = mBackupEligibilityRules.appGetsFullBackup(packageInfo); assertThat(result).isFalse(); } @@ -401,7 +398,9 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo = getApplicationInfo(Process.FIRST_APPLICATION_UID, ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY, CUSTOM_BACKUP_AGENT_NAME); - boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.MIGRATION); + BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( + OperationType.MIGRATION); + boolean result = eligibilityRules.appGetsFullBackup(packageInfo); assertThat(result).isTrue(); } @@ -413,7 +412,9 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo = getApplicationInfo(Process.SYSTEM_UID, ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY, CUSTOM_BACKUP_AGENT_NAME); - boolean result = AppBackupUtils.appGetsFullBackup(packageInfo, OperationType.MIGRATION); + BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( + OperationType.MIGRATION); + boolean result = eligibilityRules.appGetsFullBackup(packageInfo); assertThat(result).isFalse(); } @@ -424,7 +425,7 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = null; - boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo); + boolean result = mBackupEligibilityRules.appIsKeyValueOnly(packageInfo); assertThat(result).isFalse(); } @@ -437,7 +438,7 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_FULL_BACKUP_ONLY; - boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo); + boolean result = mBackupEligibilityRules.appIsKeyValueOnly(packageInfo); assertThat(result).isFalse(); } @@ -450,7 +451,7 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags = ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY; - boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo); + boolean result = mBackupEligibilityRules.appIsKeyValueOnly(packageInfo); assertThat(result).isTrue(); } @@ -460,8 +461,9 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.SYSTEM_UID; - boolean result = AppBackupUtils.appIgnoresIncludeExcludeRules(applicationInfo, + BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); + boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isFalse(); } @@ -471,8 +473,9 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.SYSTEM_UID; - boolean result = AppBackupUtils.appIgnoresIncludeExcludeRules(applicationInfo, - OperationType.BACKUP); + BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( + OperationType.MIGRATION); + boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isFalse(); } @@ -482,8 +485,9 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.FIRST_APPLICATION_UID; - boolean result = AppBackupUtils.appIgnoresIncludeExcludeRules(applicationInfo, + BackupEligibilityRules eligibilityRules = getBackupEligibilityRules( OperationType.MIGRATION); + boolean result = eligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isTrue(); } @@ -493,16 +497,14 @@ public class AppBackupUtilsTest { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.uid = Process.FIRST_APPLICATION_UID; - boolean result = AppBackupUtils.appIgnoresIncludeExcludeRules(applicationInfo, - OperationType.BACKUP); + boolean result = mBackupEligibilityRules.appIgnoresIncludeExcludeRules(applicationInfo); assertThat(result).isFalse(); } @Test public void signaturesMatch_targetIsNull_returnsFalse() throws Exception { - boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, null, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {SIGNATURE_1}, null); assertThat(result).isFalse(); } @@ -514,8 +516,7 @@ public class AppBackupUtilsTest { packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM; - boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isTrue(); } @@ -533,8 +534,7 @@ public class AppBackupUtilsTest { null)); packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(null, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(null, packageInfo); assertThat(result).isFalse(); } @@ -552,8 +552,7 @@ public class AppBackupUtilsTest { null)); packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isFalse(); } @@ -568,8 +567,8 @@ public class AppBackupUtilsTest { packageInfo.signingInfo = null; packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {SIGNATURE_1}, + packageInfo); assertThat(result).isFalse(); } @@ -583,8 +582,8 @@ public class AppBackupUtilsTest { packageInfo.signingInfo = null; packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(new Signature[] {SIGNATURE_1}, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {SIGNATURE_1}, + packageInfo); assertThat(result).isFalse(); } @@ -596,8 +595,7 @@ public class AppBackupUtilsTest { packageInfo.signingInfo = null; packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(null, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(null, packageInfo); assertThat(result).isFalse(); } @@ -610,8 +608,7 @@ public class AppBackupUtilsTest { packageInfo.signingInfo = null; packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isFalse(); } @@ -632,9 +629,8 @@ public class AppBackupUtilsTest { null)); packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch( - new Signature[] {signature3Copy, signature1Copy, signature2Copy}, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch( + new Signature[] {signature3Copy, signature1Copy, signature2Copy}, packageInfo); assertThat(result).isTrue(); } @@ -654,9 +650,8 @@ public class AppBackupUtilsTest { null)); packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch( - new Signature[]{signature2Copy, signature1Copy}, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch( + new Signature[]{signature2Copy, signature1Copy}, packageInfo); assertThat(result).isTrue(); } @@ -676,9 +671,8 @@ public class AppBackupUtilsTest { null)); packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch( - new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch( + new Signature[]{SIGNATURE_1, SIGNATURE_2, SIGNATURE_3}, packageInfo); assertThat(result).isFalse(); } @@ -698,9 +692,8 @@ public class AppBackupUtilsTest { null)); packageInfo.applicationInfo = new ApplicationInfo(); - boolean result = AppBackupUtils.signaturesMatch( - new Signature[]{signature1Copy, signature2Copy, SIGNATURE_4}, packageInfo, - mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch( + new Signature[]{signature1Copy, signature2Copy, SIGNATURE_4}, packageInfo); assertThat(result).isFalse(); } @@ -723,8 +716,8 @@ public class AppBackupUtilsTest { doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(signature1Copy, packageInfo.packageName); - boolean result = AppBackupUtils.signaturesMatch(new Signature[] {signature1Copy}, - packageInfo, mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {signature1Copy}, + packageInfo); assertThat(result).isTrue(); } @@ -749,8 +742,8 @@ public class AppBackupUtilsTest { doReturn(true).when(mMockPackageManagerInternal).isDataRestoreSafe(signature1Copy, packageInfo.packageName); - boolean result = AppBackupUtils.signaturesMatch(new Signature[] {signature1Copy}, - packageInfo, mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {signature1Copy}, + packageInfo); assertThat(result).isTrue(); } @@ -776,12 +769,17 @@ public class AppBackupUtilsTest { doReturn(false).when(mMockPackageManagerInternal).isDataRestoreSafe(signature1Copy, packageInfo.packageName); - boolean result = AppBackupUtils.signaturesMatch(new Signature[] {signature1Copy}, - packageInfo, mMockPackageManagerInternal); + boolean result = mBackupEligibilityRules.signaturesMatch(new Signature[] {signature1Copy}, + packageInfo); assertThat(result).isFalse(); } + private BackupEligibilityRules getBackupEligibilityRules(@OperationType int operationType) { + return new BackupEligibilityRules(mPackageManager, mMockPackageManagerInternal, mUserId, + operationType); + } + private static Signature generateSignature(byte i) { byte[] signatureBytes = new byte[256]; signatureBytes[0] = i;