Loading services/backup/java/com/android/server/backup/utils/AppBackupUtils.java +4 −2 Original line number Diff line number Diff line Loading @@ -91,6 +91,7 @@ public class AppBackupUtils { /** * Old style: directly match the stored vs on device signature blocks. */ // TODO(b/37977154): Resolve questionable policies. public static boolean signaturesMatch(Signature[] storedSigs, PackageInfo target) { if (target == null) { return false; Loading @@ -110,7 +111,7 @@ public class AppBackupUtils { } // Allow unsigned apps, but not signed on one device and unsigned on the other // !!! TODO: is this the right policy? // TODO(b/37977154): is this the right policy? Signature[] deviceSigs = target.signatures; if (RefactoredBackupManagerService.MORE_DEBUG) { Slog.v(RefactoredBackupManagerService.TAG, "signaturesMatch(): stored=" + storedSigs Loading @@ -120,11 +121,12 @@ public class AppBackupUtils { && (deviceSigs == null || deviceSigs.length == 0)) { return true; } // TODO(b/37977154): This allows empty stored signature, is this right? if (storedSigs == null || deviceSigs == null) { return false; } // !!! TODO: this demands that every stored signature match one // TODO(b/37977154): this demands that every stored signature match one // that is present on device, and does not demand the converse. // Is this this right policy? int nStored = storedSigs.length; Loading services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java +349 −6 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.server.backup.utils; import static com.google.common.truth.Truth.assertThat; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.Signature; import android.os.Process; import android.platform.test.annotations.Presubmit; import android.support.test.filters.SmallTest; Loading @@ -29,6 +31,8 @@ import com.android.server.backup.RefactoredBackupManagerService; import org.junit.Test; import org.junit.runner.RunWith; import java.util.Random; @SmallTest @Presubmit @RunWith(AndroidJUnit4.class) Loading @@ -36,8 +40,10 @@ public class AppBackupUtilsTest { private static final String CUSTOM_BACKUP_AGENT_NAME = "custom.backup.agent"; private static final String TEST_PACKAGE_NAME = "test_package"; private final Random mRandom = new Random(1000000009); @Test public void appIsEligibleForBackup_backupNotAllowed_returnsFalse() { public void appIsEligibleForBackup_backupNotAllowed_returnsFalse() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags = 0; applicationInfo.uid = Process.FIRST_APPLICATION_UID; Loading @@ -50,7 +56,8 @@ public class AppBackupUtilsTest { } @Test public void appIsEligibleForBackup_systemAppWithoutCustomBackupAgent_returnsFalse() { public void appIsEligibleForBackup_systemAppWithoutCustomBackupAgent_returnsFalse() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; applicationInfo.uid = Process.SYSTEM_UID; Loading @@ -63,7 +70,7 @@ public class AppBackupUtilsTest { } @Test public void appIsEligibleForBackup_sharedStorageBackupPackage_returnsFalse() { public void appIsEligibleForBackup_sharedStorageBackupPackage_returnsFalse() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; applicationInfo.uid = Process.SYSTEM_UID; Loading @@ -76,7 +83,8 @@ public class AppBackupUtilsTest { } @Test public void appIsEligibleForBackup_systemAppWithCustomBackupAgent_returnsTrue() { public void appIsEligibleForBackup_systemAppWithCustomBackupAgent_returnsTrue() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; applicationInfo.uid = Process.SYSTEM_UID; Loading @@ -89,7 +97,8 @@ public class AppBackupUtilsTest { } @Test public void appIsEligibleForBackup_nonSystemAppWithoutCustomBackupAgent_returnsTrue() { public void appIsEligibleForBackup_nonSystemAppWithoutCustomBackupAgent_returnsTrue() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; applicationInfo.uid = Process.FIRST_APPLICATION_UID; Loading @@ -102,7 +111,8 @@ public class AppBackupUtilsTest { } @Test public void appIsEligibleForBackup_nonSystemAppWithCustomBackupAgent_returnsTrue() { public void appIsEligibleForBackup_nonSystemAppWithCustomBackupAgent_returnsTrue() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; applicationInfo.uid = Process.FIRST_APPLICATION_UID; Loading @@ -114,4 +124,337 @@ public class AppBackupUtilsTest { assertThat(isEligible).isTrue(); } @Test public void appIsStopped_returnsTrue() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags |= ApplicationInfo.FLAG_STOPPED; boolean isStopped = AppBackupUtils.appIsStopped(applicationInfo); assertThat(isStopped).isTrue(); } @Test public void appIsStopped_returnsFalse() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags = ~ApplicationInfo.FLAG_STOPPED; boolean isStopped = AppBackupUtils.appIsStopped(applicationInfo); assertThat(isStopped).isFalse(); } @Test public void appGetsFullBackup_noCustomBackupAgent_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = null; boolean result = AppBackupUtils.appGetsFullBackup(packageInfo); assertThat(result).isTrue(); } @Test public void appGetsFullBackup_withCustomBackupAgentAndFullBackupOnlyFlag_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_FULL_BACKUP_ONLY; boolean result = AppBackupUtils.appGetsFullBackup(packageInfo); assertThat(result).isTrue(); } @Test public void appGetsFullBackup_withCustomBackupAgentAndWithoutFullBackupOnlyFlag_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags = ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY; boolean result = AppBackupUtils.appGetsFullBackup(packageInfo); assertThat(result).isFalse(); } @Test public void appIsKeyValueOnly_noCustomBackupAgent_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = null; boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo); assertThat(result).isFalse(); } @Test public void appIsKeyValueOnly_withCustomBackupAgentAndFullBackupOnlyFlag_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_FULL_BACKUP_ONLY; boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo); assertThat(result).isFalse(); } @Test public void appIsKeyValueOnly_withCustomBackupAgentAndWithoutFullBackupOnlyFlag_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags = ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY; boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_targetIsNull_returnsFalse() throws Exception { boolean result = AppBackupUtils.signaturesMatch(new Signature[0], null); assertThat(result).isFalse(); } @Test public void signaturesMatch_systemApplication_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM; boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_allowsUnsignedApps_bothSignaturesNull_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = null; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(null, packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_allowsUnsignedApps_bothSignaturesEmpty_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[0]; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_allowsUnsignedApps_storedSignatureNullTargetSignatureEmpty_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[0]; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(null, packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_allowsUnsignedApps_storedSignatureEmptyTargetSignatureNull_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = null; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_disallowsAppsUnsignedOnOnlyOneDevice_storedSignatureIsNull_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[]{generateRandomSignature()}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(null, packageInfo); assertThat(result).isFalse(); } @Test public void signaturesMatch_disallowsAppsUnsignedOnOnlyOneDevice_targetSignatureIsNull_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = null; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(new Signature[]{generateRandomSignature()}, packageInfo); assertThat(result).isFalse(); } @Test public void signaturesMatch_signaturesMatch_returnsTrue() throws Exception { Signature signature1 = generateRandomSignature(); Signature signature2 = generateRandomSignature(); Signature signature3 = generateRandomSignature(); assertThat(signature1).isNotEqualTo(signature2); assertThat(signature2).isNotEqualTo(signature3); assertThat(signature1).isNotEqualTo(signature3); Signature signature1Copy = new Signature(signature1.toByteArray()); Signature signature2Copy = new Signature(signature2.toByteArray()); Signature signature3Copy = new Signature(signature3.toByteArray()); assertThat(signature1Copy).isEqualTo(signature1); assertThat(signature2Copy).isEqualTo(signature2); assertThat(signature3Copy).isEqualTo(signature3); PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[]{signature1, signature2, signature3}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch( new Signature[]{signature3Copy, signature1Copy, signature2Copy}, packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_extraSignatureInTarget_returnsTrue() throws Exception { Signature signature1 = generateRandomSignature(); Signature signature2 = generateRandomSignature(); Signature signature3 = generateRandomSignature(); assertThat(signature1).isNotEqualTo(signature2); assertThat(signature2).isNotEqualTo(signature3); assertThat(signature1).isNotEqualTo(signature3); Signature signature1Copy = new Signature(signature1.toByteArray()); Signature signature2Copy = new Signature(signature2.toByteArray()); assertThat(signature1Copy).isEqualTo(signature1); assertThat(signature2Copy).isEqualTo(signature2); PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[]{signature1, signature2, signature3}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch( new Signature[]{signature2Copy, signature1Copy}, packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_extraSignatureInStored_returnsFalse() throws Exception { Signature signature1 = generateRandomSignature(); Signature signature2 = generateRandomSignature(); Signature signature3 = generateRandomSignature(); assertThat(signature1).isNotEqualTo(signature2); assertThat(signature2).isNotEqualTo(signature3); assertThat(signature1).isNotEqualTo(signature3); Signature signature1Copy = new Signature(signature1.toByteArray()); Signature signature2Copy = new Signature(signature2.toByteArray()); assertThat(signature1Copy).isEqualTo(signature1); assertThat(signature2Copy).isEqualTo(signature2); PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[]{signature1Copy, signature2Copy}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch( new Signature[]{signature1, signature2, signature3}, packageInfo); assertThat(result).isFalse(); } @Test public void signaturesMatch_emptyStoredSignatures_returnsTrue() throws Exception { Signature signature1 = generateRandomSignature(); Signature signature2 = generateRandomSignature(); Signature signature3 = generateRandomSignature(); assertThat(signature1).isNotEqualTo(signature2); assertThat(signature2).isNotEqualTo(signature3); assertThat(signature1).isNotEqualTo(signature3); PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[]{signature1, signature2, signature3}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_emptyTargetSignatures_returnsFalse() throws Exception { Signature signature1 = generateRandomSignature(); Signature signature2 = generateRandomSignature(); Signature signature3 = generateRandomSignature(); assertThat(signature1).isNotEqualTo(signature2); assertThat(signature2).isNotEqualTo(signature3); assertThat(signature1).isNotEqualTo(signature3); PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[0]; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch( new Signature[]{signature1, signature2, signature3}, packageInfo); assertThat(result).isFalse(); } @Test public void signaturesMatch_oneNonMatchingSignature_returnsFalse() throws Exception { Signature signature1 = generateRandomSignature(); Signature signature2 = generateRandomSignature(); Signature signature3 = generateRandomSignature(); Signature signature4 = generateRandomSignature(); assertThat(signature1).isNotEqualTo(signature2); assertThat(signature2).isNotEqualTo(signature3); assertThat(signature1).isNotEqualTo(signature3); assertThat(signature1).isNotEqualTo(signature4); assertThat(signature2).isNotEqualTo(signature4); assertThat(signature3).isNotEqualTo(signature4); Signature signature1Copy = new Signature(signature1.toByteArray()); Signature signature2Copy = new Signature(signature2.toByteArray()); assertThat(signature1Copy).isEqualTo(signature1); assertThat(signature2Copy).isEqualTo(signature2); PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[]{signature1, signature2, signature3}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch( new Signature[]{signature1Copy, signature2Copy, signature4}, packageInfo); assertThat(result).isFalse(); } private Signature generateRandomSignature() { byte[] signatureBytes = new byte[256]; mRandom.nextBytes(signatureBytes); return new Signature(signatureBytes); } } services/tests/servicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java +7 −0 Original line number Diff line number Diff line Loading @@ -31,13 +31,20 @@ import android.app.backup.IBackupManagerMonitor; import android.content.pm.PackageInfo; import android.os.Bundle; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @SmallTest @Presubmit @RunWith(AndroidJUnit4.class) public class BackupManagerMonitorUtilsTest { @Mock private IBackupManagerMonitor mMonitorMock; Loading services/tests/servicestests/src/com/android/server/backup/utils/BackupObserverUtilsTest.java +7 −0 Original line number Diff line number Diff line Loading @@ -22,12 +22,19 @@ import static org.mockito.Mockito.verify; import android.app.backup.BackupProgress; import android.app.backup.IBackupObserver; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; 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 BackupObserverUtilsTest { private static final String PACKAGE_NAME = "some.package"; Loading services/tests/servicestests/src/com/android/server/backup/utils/FullBackupRestoreObserverUtilsTest.java +7 −0 Original line number Diff line number Diff line Loading @@ -23,12 +23,19 @@ import static org.mockito.Mockito.verify; import android.app.backup.IFullBackupRestoreObserver; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; 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 FullBackupRestoreObserverUtilsTest { private static final String PACKAGE_NAME = "some.package"; @Mock Loading Loading
services/backup/java/com/android/server/backup/utils/AppBackupUtils.java +4 −2 Original line number Diff line number Diff line Loading @@ -91,6 +91,7 @@ public class AppBackupUtils { /** * Old style: directly match the stored vs on device signature blocks. */ // TODO(b/37977154): Resolve questionable policies. public static boolean signaturesMatch(Signature[] storedSigs, PackageInfo target) { if (target == null) { return false; Loading @@ -110,7 +111,7 @@ public class AppBackupUtils { } // Allow unsigned apps, but not signed on one device and unsigned on the other // !!! TODO: is this the right policy? // TODO(b/37977154): is this the right policy? Signature[] deviceSigs = target.signatures; if (RefactoredBackupManagerService.MORE_DEBUG) { Slog.v(RefactoredBackupManagerService.TAG, "signaturesMatch(): stored=" + storedSigs Loading @@ -120,11 +121,12 @@ public class AppBackupUtils { && (deviceSigs == null || deviceSigs.length == 0)) { return true; } // TODO(b/37977154): This allows empty stored signature, is this right? if (storedSigs == null || deviceSigs == null) { return false; } // !!! TODO: this demands that every stored signature match one // TODO(b/37977154): this demands that every stored signature match one // that is present on device, and does not demand the converse. // Is this this right policy? int nStored = storedSigs.length; Loading
services/tests/servicestests/src/com/android/server/backup/utils/AppBackupUtilsTest.java +349 −6 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ package com.android.server.backup.utils; import static com.google.common.truth.Truth.assertThat; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.Signature; import android.os.Process; import android.platform.test.annotations.Presubmit; import android.support.test.filters.SmallTest; Loading @@ -29,6 +31,8 @@ import com.android.server.backup.RefactoredBackupManagerService; import org.junit.Test; import org.junit.runner.RunWith; import java.util.Random; @SmallTest @Presubmit @RunWith(AndroidJUnit4.class) Loading @@ -36,8 +40,10 @@ public class AppBackupUtilsTest { private static final String CUSTOM_BACKUP_AGENT_NAME = "custom.backup.agent"; private static final String TEST_PACKAGE_NAME = "test_package"; private final Random mRandom = new Random(1000000009); @Test public void appIsEligibleForBackup_backupNotAllowed_returnsFalse() { public void appIsEligibleForBackup_backupNotAllowed_returnsFalse() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags = 0; applicationInfo.uid = Process.FIRST_APPLICATION_UID; Loading @@ -50,7 +56,8 @@ public class AppBackupUtilsTest { } @Test public void appIsEligibleForBackup_systemAppWithoutCustomBackupAgent_returnsFalse() { public void appIsEligibleForBackup_systemAppWithoutCustomBackupAgent_returnsFalse() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; applicationInfo.uid = Process.SYSTEM_UID; Loading @@ -63,7 +70,7 @@ public class AppBackupUtilsTest { } @Test public void appIsEligibleForBackup_sharedStorageBackupPackage_returnsFalse() { public void appIsEligibleForBackup_sharedStorageBackupPackage_returnsFalse() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; applicationInfo.uid = Process.SYSTEM_UID; Loading @@ -76,7 +83,8 @@ public class AppBackupUtilsTest { } @Test public void appIsEligibleForBackup_systemAppWithCustomBackupAgent_returnsTrue() { public void appIsEligibleForBackup_systemAppWithCustomBackupAgent_returnsTrue() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; applicationInfo.uid = Process.SYSTEM_UID; Loading @@ -89,7 +97,8 @@ public class AppBackupUtilsTest { } @Test public void appIsEligibleForBackup_nonSystemAppWithoutCustomBackupAgent_returnsTrue() { public void appIsEligibleForBackup_nonSystemAppWithoutCustomBackupAgent_returnsTrue() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; applicationInfo.uid = Process.FIRST_APPLICATION_UID; Loading @@ -102,7 +111,8 @@ public class AppBackupUtilsTest { } @Test public void appIsEligibleForBackup_nonSystemAppWithCustomBackupAgent_returnsTrue() { public void appIsEligibleForBackup_nonSystemAppWithCustomBackupAgent_returnsTrue() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; applicationInfo.uid = Process.FIRST_APPLICATION_UID; Loading @@ -114,4 +124,337 @@ public class AppBackupUtilsTest { assertThat(isEligible).isTrue(); } @Test public void appIsStopped_returnsTrue() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags |= ApplicationInfo.FLAG_STOPPED; boolean isStopped = AppBackupUtils.appIsStopped(applicationInfo); assertThat(isStopped).isTrue(); } @Test public void appIsStopped_returnsFalse() throws Exception { ApplicationInfo applicationInfo = new ApplicationInfo(); applicationInfo.flags = ~ApplicationInfo.FLAG_STOPPED; boolean isStopped = AppBackupUtils.appIsStopped(applicationInfo); assertThat(isStopped).isFalse(); } @Test public void appGetsFullBackup_noCustomBackupAgent_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = null; boolean result = AppBackupUtils.appGetsFullBackup(packageInfo); assertThat(result).isTrue(); } @Test public void appGetsFullBackup_withCustomBackupAgentAndFullBackupOnlyFlag_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_FULL_BACKUP_ONLY; boolean result = AppBackupUtils.appGetsFullBackup(packageInfo); assertThat(result).isTrue(); } @Test public void appGetsFullBackup_withCustomBackupAgentAndWithoutFullBackupOnlyFlag_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags = ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY; boolean result = AppBackupUtils.appGetsFullBackup(packageInfo); assertThat(result).isFalse(); } @Test public void appIsKeyValueOnly_noCustomBackupAgent_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = null; boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo); assertThat(result).isFalse(); } @Test public void appIsKeyValueOnly_withCustomBackupAgentAndFullBackupOnlyFlag_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_FULL_BACKUP_ONLY; boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo); assertThat(result).isFalse(); } @Test public void appIsKeyValueOnly_withCustomBackupAgentAndWithoutFullBackupOnlyFlag_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.backupAgentName = "backup.agent"; packageInfo.applicationInfo.flags = ~ApplicationInfo.FLAG_FULL_BACKUP_ONLY; boolean result = AppBackupUtils.appIsKeyValueOnly(packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_targetIsNull_returnsFalse() throws Exception { boolean result = AppBackupUtils.signaturesMatch(new Signature[0], null); assertThat(result).isFalse(); } @Test public void signaturesMatch_systemApplication_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.applicationInfo = new ApplicationInfo(); packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_SYSTEM; boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_allowsUnsignedApps_bothSignaturesNull_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = null; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(null, packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_allowsUnsignedApps_bothSignaturesEmpty_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[0]; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_allowsUnsignedApps_storedSignatureNullTargetSignatureEmpty_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[0]; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(null, packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_allowsUnsignedApps_storedSignatureEmptyTargetSignatureNull_returnsTrue() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = null; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_disallowsAppsUnsignedOnOnlyOneDevice_storedSignatureIsNull_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[]{generateRandomSignature()}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(null, packageInfo); assertThat(result).isFalse(); } @Test public void signaturesMatch_disallowsAppsUnsignedOnOnlyOneDevice_targetSignatureIsNull_returnsFalse() throws Exception { PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = null; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(new Signature[]{generateRandomSignature()}, packageInfo); assertThat(result).isFalse(); } @Test public void signaturesMatch_signaturesMatch_returnsTrue() throws Exception { Signature signature1 = generateRandomSignature(); Signature signature2 = generateRandomSignature(); Signature signature3 = generateRandomSignature(); assertThat(signature1).isNotEqualTo(signature2); assertThat(signature2).isNotEqualTo(signature3); assertThat(signature1).isNotEqualTo(signature3); Signature signature1Copy = new Signature(signature1.toByteArray()); Signature signature2Copy = new Signature(signature2.toByteArray()); Signature signature3Copy = new Signature(signature3.toByteArray()); assertThat(signature1Copy).isEqualTo(signature1); assertThat(signature2Copy).isEqualTo(signature2); assertThat(signature3Copy).isEqualTo(signature3); PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[]{signature1, signature2, signature3}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch( new Signature[]{signature3Copy, signature1Copy, signature2Copy}, packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_extraSignatureInTarget_returnsTrue() throws Exception { Signature signature1 = generateRandomSignature(); Signature signature2 = generateRandomSignature(); Signature signature3 = generateRandomSignature(); assertThat(signature1).isNotEqualTo(signature2); assertThat(signature2).isNotEqualTo(signature3); assertThat(signature1).isNotEqualTo(signature3); Signature signature1Copy = new Signature(signature1.toByteArray()); Signature signature2Copy = new Signature(signature2.toByteArray()); assertThat(signature1Copy).isEqualTo(signature1); assertThat(signature2Copy).isEqualTo(signature2); PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[]{signature1, signature2, signature3}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch( new Signature[]{signature2Copy, signature1Copy}, packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_extraSignatureInStored_returnsFalse() throws Exception { Signature signature1 = generateRandomSignature(); Signature signature2 = generateRandomSignature(); Signature signature3 = generateRandomSignature(); assertThat(signature1).isNotEqualTo(signature2); assertThat(signature2).isNotEqualTo(signature3); assertThat(signature1).isNotEqualTo(signature3); Signature signature1Copy = new Signature(signature1.toByteArray()); Signature signature2Copy = new Signature(signature2.toByteArray()); assertThat(signature1Copy).isEqualTo(signature1); assertThat(signature2Copy).isEqualTo(signature2); PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[]{signature1Copy, signature2Copy}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch( new Signature[]{signature1, signature2, signature3}, packageInfo); assertThat(result).isFalse(); } @Test public void signaturesMatch_emptyStoredSignatures_returnsTrue() throws Exception { Signature signature1 = generateRandomSignature(); Signature signature2 = generateRandomSignature(); Signature signature3 = generateRandomSignature(); assertThat(signature1).isNotEqualTo(signature2); assertThat(signature2).isNotEqualTo(signature3); assertThat(signature1).isNotEqualTo(signature3); PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[]{signature1, signature2, signature3}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch(new Signature[0], packageInfo); assertThat(result).isTrue(); } @Test public void signaturesMatch_emptyTargetSignatures_returnsFalse() throws Exception { Signature signature1 = generateRandomSignature(); Signature signature2 = generateRandomSignature(); Signature signature3 = generateRandomSignature(); assertThat(signature1).isNotEqualTo(signature2); assertThat(signature2).isNotEqualTo(signature3); assertThat(signature1).isNotEqualTo(signature3); PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[0]; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch( new Signature[]{signature1, signature2, signature3}, packageInfo); assertThat(result).isFalse(); } @Test public void signaturesMatch_oneNonMatchingSignature_returnsFalse() throws Exception { Signature signature1 = generateRandomSignature(); Signature signature2 = generateRandomSignature(); Signature signature3 = generateRandomSignature(); Signature signature4 = generateRandomSignature(); assertThat(signature1).isNotEqualTo(signature2); assertThat(signature2).isNotEqualTo(signature3); assertThat(signature1).isNotEqualTo(signature3); assertThat(signature1).isNotEqualTo(signature4); assertThat(signature2).isNotEqualTo(signature4); assertThat(signature3).isNotEqualTo(signature4); Signature signature1Copy = new Signature(signature1.toByteArray()); Signature signature2Copy = new Signature(signature2.toByteArray()); assertThat(signature1Copy).isEqualTo(signature1); assertThat(signature2Copy).isEqualTo(signature2); PackageInfo packageInfo = new PackageInfo(); packageInfo.signatures = new Signature[]{signature1, signature2, signature3}; packageInfo.applicationInfo = new ApplicationInfo(); boolean result = AppBackupUtils.signaturesMatch( new Signature[]{signature1Copy, signature2Copy, signature4}, packageInfo); assertThat(result).isFalse(); } private Signature generateRandomSignature() { byte[] signatureBytes = new byte[256]; mRandom.nextBytes(signatureBytes); return new Signature(signatureBytes); } }
services/tests/servicestests/src/com/android/server/backup/utils/BackupManagerMonitorUtilsTest.java +7 −0 Original line number Diff line number Diff line Loading @@ -31,13 +31,20 @@ import android.app.backup.IBackupManagerMonitor; import android.content.pm.PackageInfo; import android.os.Bundle; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @SmallTest @Presubmit @RunWith(AndroidJUnit4.class) public class BackupManagerMonitorUtilsTest { @Mock private IBackupManagerMonitor mMonitorMock; Loading
services/tests/servicestests/src/com/android/server/backup/utils/BackupObserverUtilsTest.java +7 −0 Original line number Diff line number Diff line Loading @@ -22,12 +22,19 @@ import static org.mockito.Mockito.verify; import android.app.backup.BackupProgress; import android.app.backup.IBackupObserver; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; 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 BackupObserverUtilsTest { private static final String PACKAGE_NAME = "some.package"; Loading
services/tests/servicestests/src/com/android/server/backup/utils/FullBackupRestoreObserverUtilsTest.java +7 −0 Original line number Diff line number Diff line Loading @@ -23,12 +23,19 @@ import static org.mockito.Mockito.verify; import android.app.backup.IFullBackupRestoreObserver; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; 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 FullBackupRestoreObserverUtilsTest { private static final String PACKAGE_NAME = "some.package"; @Mock Loading