diff options
| author | 2017-05-10 10:46:54 +0000 | |
|---|---|---|
| committer | 2017-05-10 10:47:00 +0000 | |
| commit | 7e87b672f07605420c69e7d8210830f4ec4d4123 (patch) | |
| tree | 8feb59b51307ec21b4fee02082053460af351c83 | |
| parent | 4d147ff91832f3134ae713e5e545035c92cf1d2a (diff) | |
| parent | a08220b8175bc008edc5a163007db1d04431a6be (diff) | |
Merge "Add tests for chooseRestorePolicy."
2 files changed, 1356 insertions, 4 deletions
diff --git a/services/tests/servicestests/src/com/android/server/backup/testutils/PackageManagerStub.java b/services/tests/servicestests/src/com/android/server/backup/testutils/PackageManagerStub.java new file mode 100644 index 000000000000..f124df9cf7cb --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/backup/testutils/PackageManagerStub.java @@ -0,0 +1,1002 @@ +package com.android.server.backup.testutils; + +import android.app.PackageInstallObserver; +import android.content.ComponentName; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.IntentSender; +import android.content.pm.ActivityInfo; +import android.content.pm.ApplicationInfo; +import android.content.pm.ChangedPackages; +import android.content.pm.FeatureInfo; +import android.content.pm.IPackageDataObserver; +import android.content.pm.IPackageDeleteObserver; +import android.content.pm.IPackageInstallObserver; +import android.content.pm.IPackageStatsObserver; +import android.content.pm.InstantAppInfo; +import android.content.pm.InstrumentationInfo; +import android.content.pm.IntentFilterVerificationInfo; +import android.content.pm.KeySet; +import android.content.pm.PackageInfo; +import android.content.pm.PackageInstaller; +import android.content.pm.PackageItemInfo; +import android.content.pm.PackageManager; +import android.content.pm.PermissionGroupInfo; +import android.content.pm.PermissionInfo; +import android.content.pm.ProviderInfo; +import android.content.pm.ResolveInfo; +import android.content.pm.ServiceInfo; +import android.content.pm.SharedLibraryInfo; +import android.content.pm.VerifierDeviceIdentity; +import android.content.pm.VersionedPackage; +import android.content.res.Resources; +import android.content.res.XmlResourceParser; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.os.Handler; +import android.os.UserHandle; +import android.os.storage.VolumeInfo; + +import java.util.List; + +/** + * Stub for PackageManager to use in tests. + */ +public class PackageManagerStub extends PackageManager { + public static PackageInfo sPackageInfo; + + @Override + public PackageInfo getPackageInfo(String packageName, int flags) + throws NameNotFoundException { + if (sPackageInfo == null) { + throw new NameNotFoundException(); + } + + return sPackageInfo; + } + + @Override + public PackageInfo getPackageInfo(VersionedPackage versionedPackage, int flags) + throws NameNotFoundException { + return null; + } + + @Override + public PackageInfo getPackageInfoAsUser(String packageName, int flags, int userId) + throws NameNotFoundException { + return null; + } + + @Override + public String[] currentToCanonicalPackageNames(String[] names) { + return new String[0]; + } + + @Override + public String[] canonicalToCurrentPackageNames(String[] names) { + return new String[0]; + } + + @Override + public Intent getLaunchIntentForPackage(String packageName) { + return null; + } + + @Override + public Intent getLeanbackLaunchIntentForPackage(String packageName) { + return null; + } + + @Override + public int[] getPackageGids(String packageName) throws NameNotFoundException { + return new int[0]; + } + + @Override + public int[] getPackageGids(String packageName, int flags) + throws NameNotFoundException { + return new int[0]; + } + + @Override + public int getPackageUid(String packageName, int flags) + throws NameNotFoundException { + return 0; + } + + @Override + public int getPackageUidAsUser(String packageName, int userId) + throws NameNotFoundException { + return 0; + } + + @Override + public int getPackageUidAsUser(String packageName, int flags, int userId) + throws NameNotFoundException { + return 0; + } + + @Override + public PermissionInfo getPermissionInfo(String name, int flags) + throws NameNotFoundException { + return null; + } + + @Override + public List<PermissionInfo> queryPermissionsByGroup(String group, int flags) + throws NameNotFoundException { + return null; + } + + @Override + public boolean isPermissionReviewModeEnabled() { + return false; + } + + @Override + public PermissionGroupInfo getPermissionGroupInfo(String name, int flags) + throws NameNotFoundException { + return null; + } + + @Override + public List<PermissionGroupInfo> getAllPermissionGroups(int flags) { + return null; + } + + @Override + public ApplicationInfo getApplicationInfo(String packageName, int flags) + throws NameNotFoundException { + return null; + } + + @Override + public ApplicationInfo getApplicationInfoAsUser(String packageName, int flags, int userId) + throws NameNotFoundException { + return null; + } + + @Override + public ActivityInfo getActivityInfo(ComponentName component, int flags) + throws NameNotFoundException { + return null; + } + + @Override + public ActivityInfo getReceiverInfo(ComponentName component, int flags) + throws NameNotFoundException { + return null; + } + + @Override + public ServiceInfo getServiceInfo(ComponentName component, int flags) + throws NameNotFoundException { + return null; + } + + @Override + public ProviderInfo getProviderInfo(ComponentName component, int flags) + throws NameNotFoundException { + return null; + } + + @Override + public List<PackageInfo> getInstalledPackages(int flags) { + return null; + } + + @Override + public List<PackageInfo> getPackagesHoldingPermissions(String[] permissions, int flags) { + return null; + } + + @Override + public List<PackageInfo> getInstalledPackagesAsUser(int flags, int userId) { + return null; + } + + @Override + public int checkPermission(String permName, String pkgName) { + return 0; + } + + @Override + public boolean isPermissionRevokedByPolicy(String permName, String pkgName) { + return false; + } + + @Override + public String getPermissionControllerPackageName() { + return null; + } + + @Override + public boolean addPermission(PermissionInfo info) { + return false; + } + + @Override + public boolean addPermissionAsync(PermissionInfo info) { + return false; + } + + @Override + public void removePermission(String name) { + + } + + @Override + public void grantRuntimePermission(String packageName, String permissionName, + UserHandle user) { + + } + + @Override + public void revokeRuntimePermission(String packageName, String permissionName, + UserHandle user) { + + } + + @Override + public int getPermissionFlags(String permissionName, String packageName, UserHandle user) { + return 0; + } + + @Override + public void updatePermissionFlags(String permissionName, String packageName, int flagMask, + int flagValues, UserHandle user) { + + } + + @Override + public boolean shouldShowRequestPermissionRationale(String permission) { + return false; + } + + @Override + public int checkSignatures(String pkg1, String pkg2) { + return 0; + } + + @Override + public int checkSignatures(int uid1, int uid2) { + return 0; + } + + @Override + public String[] getPackagesForUid(int uid) { + return new String[0]; + } + + @Override + public String getNameForUid(int uid) { + return null; + } + + @Override + public int getUidForSharedUser(String sharedUserName) + throws NameNotFoundException { + return 0; + } + + @Override + public List<ApplicationInfo> getInstalledApplications(int flags) { + return null; + } + + @Override + public List<ApplicationInfo> getInstalledApplicationsAsUser(int flags, int userId) { + return null; + } + + @Override + public List<InstantAppInfo> getInstantApps() { + return null; + } + + @Override + public Drawable getInstantAppIcon(String packageName) { + return null; + } + + @Override + public boolean isInstantApp() { + return false; + } + + @Override + public boolean isInstantApp(String packageName) { + return false; + } + + @Override + public int getInstantAppCookieMaxBytes() { + return 0; + } + + @Override + public int getInstantAppCookieMaxSize() { + return 0; + } + + @Override + public byte[] getInstantAppCookie() { + return new byte[0]; + } + + @Override + public void clearInstantAppCookie() { + + } + + @Override + public void updateInstantAppCookie(byte[] cookie) { + + } + + @Override + public boolean setInstantAppCookie(byte[] cookie) { + return false; + } + + @Override + public String[] getSystemSharedLibraryNames() { + return new String[0]; + } + + @Override + public List<SharedLibraryInfo> getSharedLibraries(int flags) { + return null; + } + + @Override + public List<SharedLibraryInfo> getSharedLibrariesAsUser(int flags, int userId) { + return null; + } + + @Override + public String getServicesSystemSharedLibraryPackageName() { + return null; + } + + @Override + public String getSharedSystemSharedLibraryPackageName() { + return null; + } + + @Override + public ChangedPackages getChangedPackages(int sequenceNumber) { + return null; + } + + @Override + public FeatureInfo[] getSystemAvailableFeatures() { + return new FeatureInfo[0]; + } + + @Override + public boolean hasSystemFeature(String name) { + return false; + } + + @Override + public boolean hasSystemFeature(String name, int version) { + return false; + } + + @Override + public ResolveInfo resolveActivity(Intent intent, int flags) { + return null; + } + + @Override + public ResolveInfo resolveActivityAsUser(Intent intent, int flags, int userId) { + return null; + } + + @Override + public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) { + return null; + } + + @Override + public List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent, int flags, int userId) { + return null; + } + + @Override + public List<ResolveInfo> queryIntentActivityOptions(ComponentName caller, + Intent[] specifics, + Intent intent, int flags) { + return null; + } + + @Override + public List<ResolveInfo> queryBroadcastReceivers(Intent intent, int flags) { + return null; + } + + @Override + public List<ResolveInfo> queryBroadcastReceiversAsUser(Intent intent, int flags, + int userId) { + return null; + } + + @Override + public ResolveInfo resolveService(Intent intent, int flags) { + return null; + } + + @Override + public List<ResolveInfo> queryIntentServices(Intent intent, int flags) { + return null; + } + + @Override + public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int flags, int userId) { + return null; + } + + @Override + public List<ResolveInfo> queryIntentContentProvidersAsUser(Intent intent, int flags, + int userId) { + return null; + } + + @Override + public List<ResolveInfo> queryIntentContentProviders(Intent intent, int flags) { + return null; + } + + @Override + public ProviderInfo resolveContentProvider(String name, int flags) { + return null; + } + + @Override + public ProviderInfo resolveContentProviderAsUser(String name, int flags, int userId) { + return null; + } + + @Override + public List<ProviderInfo> queryContentProviders(String processName, int uid, int flags) { + return null; + } + + @Override + public InstrumentationInfo getInstrumentationInfo(ComponentName className, int flags) + throws NameNotFoundException { + return null; + } + + @Override + public List<InstrumentationInfo> queryInstrumentation(String targetPackage, int flags) { + return null; + } + + @Override + public Drawable getDrawable(String packageName, int resid, ApplicationInfo appInfo) { + return null; + } + + @Override + public Drawable getActivityIcon(ComponentName activityName) + throws NameNotFoundException { + return null; + } + + @Override + public Drawable getActivityIcon(Intent intent) throws NameNotFoundException { + return null; + } + + @Override + public Drawable getActivityBanner(ComponentName activityName) + throws NameNotFoundException { + return null; + } + + @Override + public Drawable getActivityBanner(Intent intent) throws NameNotFoundException { + return null; + } + + @Override + public Drawable getDefaultActivityIcon() { + return null; + } + + @Override + public Drawable getApplicationIcon(ApplicationInfo info) { + return null; + } + + @Override + public Drawable getApplicationIcon(String packageName) + throws NameNotFoundException { + return null; + } + + @Override + public Drawable getApplicationBanner(ApplicationInfo info) { + return null; + } + + @Override + public Drawable getApplicationBanner(String packageName) + throws NameNotFoundException { + return null; + } + + @Override + public Drawable getActivityLogo(ComponentName activityName) + throws NameNotFoundException { + return null; + } + + @Override + public Drawable getActivityLogo(Intent intent) throws NameNotFoundException { + return null; + } + + @Override + public Drawable getApplicationLogo(ApplicationInfo info) { + return null; + } + + @Override + public Drawable getApplicationLogo(String packageName) + throws NameNotFoundException { + return null; + } + + @Override + public Drawable getUserBadgedIcon(Drawable icon, UserHandle user) { + return null; + } + + @Override + public Drawable getUserBadgedDrawableForDensity(Drawable drawable, UserHandle user, + Rect badgeLocation, int badgeDensity) { + return null; + } + + @Override + public Drawable getUserBadgeForDensity(UserHandle user, int density) { + return null; + } + + @Override + public Drawable getUserBadgeForDensityNoBackground(UserHandle user, int density) { + return null; + } + + @Override + public CharSequence getUserBadgedLabel(CharSequence label, UserHandle user) { + return null; + } + + @Override + public CharSequence getText(String packageName, int resid, ApplicationInfo appInfo) { + return null; + } + + @Override + public XmlResourceParser getXml(String packageName, int resid, ApplicationInfo appInfo) { + return null; + } + + @Override + public CharSequence getApplicationLabel(ApplicationInfo info) { + return null; + } + + @Override + public Resources getResourcesForActivity(ComponentName activityName) + throws NameNotFoundException { + return null; + } + + @Override + public Resources getResourcesForApplication(ApplicationInfo app) + throws NameNotFoundException { + return null; + } + + @Override + public Resources getResourcesForApplication(String appPackageName) + throws NameNotFoundException { + return null; + } + + @Override + public Resources getResourcesForApplicationAsUser(String appPackageName, int userId) + throws NameNotFoundException { + return null; + } + + @Override + public void installPackage(Uri packageURI, IPackageInstallObserver observer, int flags, + String installerPackageName) { + + } + + @Override + public void installPackage(Uri packageURI, PackageInstallObserver observer, int flags, + String installerPackageName) { + + } + + @Override + public int installExistingPackage(String packageName) + throws NameNotFoundException { + return 0; + } + + @Override + public int installExistingPackageAsUser(String packageName, int userId) + throws NameNotFoundException { + return 0; + } + + @Override + public void verifyPendingInstall(int id, int verificationCode) { + + } + + @Override + public void extendVerificationTimeout(int id, int verificationCodeAtTimeout, + long millisecondsToDelay) { + + } + + @Override + public void verifyIntentFilter(int verificationId, int verificationCode, + List<String> failedDomains) { + + } + + @Override + public int getIntentVerificationStatusAsUser(String packageName, int userId) { + return 0; + } + + @Override + public boolean updateIntentVerificationStatusAsUser(String packageName, int status, + int userId) { + return false; + } + + @Override + public List<IntentFilterVerificationInfo> getIntentFilterVerifications(String packageName) { + return null; + } + + @Override + public List<IntentFilter> getAllIntentFilters(String packageName) { + return null; + } + + @Override + public String getDefaultBrowserPackageNameAsUser(int userId) { + return null; + } + + @Override + public boolean setDefaultBrowserPackageNameAsUser(String packageName, int userId) { + return false; + } + + @Override + public void setInstallerPackageName(String targetPackage, String installerPackageName) { + + } + + @Override + public void setUpdateAvailable(String packageName, boolean updateAvaialble) { + + } + + @Override + public void deletePackage(String packageName, IPackageDeleteObserver observer, int flags) { + + } + + @Override + public void deletePackageAsUser(String packageName, IPackageDeleteObserver observer, + int flags, + int userId) { + + } + + @Override + public String getInstallerPackageName(String packageName) { + return null; + } + + @Override + public void clearApplicationUserData(String packageName, IPackageDataObserver observer) { + + } + + @Override + public void deleteApplicationCacheFiles(String packageName, IPackageDataObserver observer) { + + } + + @Override + public void deleteApplicationCacheFilesAsUser(String packageName, int userId, + IPackageDataObserver observer) { + + } + + @Override + public void freeStorageAndNotify(String volumeUuid, long freeStorageSize, + IPackageDataObserver observer) { + + } + + @Override + public void freeStorage(String volumeUuid, long freeStorageSize, IntentSender pi) { + + } + + @Override + public void getPackageSizeInfoAsUser(String packageName, int userId, + IPackageStatsObserver observer) { + + } + + @Override + public void addPackageToPreferred(String packageName) { + + } + + @Override + public void removePackageFromPreferred(String packageName) { + + } + + @Override + public List<PackageInfo> getPreferredPackages(int flags) { + return null; + } + + @Override + public void addPreferredActivity(IntentFilter filter, int match, ComponentName[] set, + ComponentName activity) { + + } + + @Override + public void replacePreferredActivity(IntentFilter filter, int match, ComponentName[] set, + ComponentName activity) { + + } + + @Override + public void clearPackagePreferredActivities(String packageName) { + + } + + @Override + public int getPreferredActivities(List<IntentFilter> outFilters, + List<ComponentName> outActivities, String packageName) { + return 0; + } + + @Override + public ComponentName getHomeActivities(List<ResolveInfo> outActivities) { + return null; + } + + @Override + public void setComponentEnabledSetting(ComponentName componentName, int newState, + int flags) { + + } + + @Override + public int getComponentEnabledSetting(ComponentName componentName) { + return 0; + } + + @Override + public void setApplicationEnabledSetting(String packageName, int newState, int flags) { + + } + + @Override + public int getApplicationEnabledSetting(String packageName) { + return 0; + } + + @Override + public void flushPackageRestrictionsAsUser(int userId) { + + } + + @Override + public boolean setApplicationHiddenSettingAsUser(String packageName, boolean hidden, + UserHandle userHandle) { + return false; + } + + @Override + public boolean getApplicationHiddenSettingAsUser(String packageName, + UserHandle userHandle) { + return false; + } + + @Override + public boolean isSafeMode() { + return false; + } + + @Override + public void addOnPermissionsChangeListener( + OnPermissionsChangedListener listener) { + + } + + @Override + public void removeOnPermissionsChangeListener( + OnPermissionsChangedListener listener) { + + } + + @Override + public KeySet getKeySetByAlias(String packageName, String alias) { + return null; + } + + @Override + public KeySet getSigningKeySet(String packageName) { + return null; + } + + @Override + public boolean isSignedBy(String packageName, KeySet ks) { + return false; + } + + @Override + public boolean isSignedByExactly(String packageName, KeySet ks) { + return false; + } + + @Override + public String[] setPackagesSuspendedAsUser(String[] packageNames, boolean suspended, + int userId) { + return new String[0]; + } + + @Override + public boolean isPackageSuspendedForUser(String packageName, int userId) { + return false; + } + + @Override + public void setApplicationCategoryHint(String packageName, int categoryHint) { + + } + + @Override + public int getMoveStatus(int moveId) { + return 0; + } + + @Override + public void registerMoveCallback(MoveCallback callback, Handler handler) { + + } + + @Override + public void unregisterMoveCallback(MoveCallback callback) { + + } + + @Override + public int movePackage(String packageName, VolumeInfo vol) { + return 0; + } + + @Override + public VolumeInfo getPackageCurrentVolume(ApplicationInfo app) { + return null; + } + + @Override + public List<VolumeInfo> getPackageCandidateVolumes(ApplicationInfo app) { + return null; + } + + @Override + public int movePrimaryStorage(VolumeInfo vol) { + return 0; + } + + @Override + public VolumeInfo getPrimaryStorageCurrentVolume() { + return null; + } + + @Override + public List<VolumeInfo> getPrimaryStorageCandidateVolumes() { + return null; + } + + @Override + public VerifierDeviceIdentity getVerifierDeviceIdentity() { + return null; + } + + @Override + public boolean isUpgrade() { + return false; + } + + @Override + public PackageInstaller getPackageInstaller() { + return null; + } + + @Override + public void addCrossProfileIntentFilter(IntentFilter filter, int sourceUserId, + int targetUserId, + int flags) { + + } + + @Override + public void clearCrossProfileIntentFilters(int sourceUserId) { + + } + + @Override + public Drawable loadItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo) { + return null; + } + + @Override + public Drawable loadUnbadgedItemIcon(PackageItemInfo itemInfo, ApplicationInfo appInfo) { + return null; + } + + @Override + public boolean isPackageAvailable(String packageName) { + return false; + } + + @Override + public int getInstallReason(String packageName, UserHandle user) { + return 0; + } + + @Override + public boolean canRequestPackageInstalls() { + return false; + } + + @Override + public ComponentName getInstantAppResolverSettingsComponent() { + return null; + } + + @Override + public ComponentName getInstantAppInstallerComponent() { + return null; + } + + @Override + public String getInstantAppAndroidId(String packageName, UserHandle user) { + return null; + } + + @Override + public void registerDexModule(String dexModulePath, + DexModuleRegisterCallback callback) { + + } +} diff --git a/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java b/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java index 63578b0ecb49..8784dd5aa33b 100644 --- a/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java +++ b/services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java @@ -16,11 +16,30 @@ package com.android.server.backup.utils; +import static android.app.backup.BackupManagerMonitor.EXTRA_LOG_EVENT_ID; +import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_APK_NOT_INSTALLED; +import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_CANNOT_RESTORE_WITHOUT_APK; +import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE_ALLOW_BACKUP_FALSE; +import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_FULL_RESTORE_SIGNATURE_MISMATCH; +import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_RESTORE_ANY_VERSION; +import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_SYSTEM_APP_NO_AGENT; +import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_VERSIONS_MATCH; +import static android.app.backup.BackupManagerMonitor.LOG_EVENT_ID_VERSION_OF_BACKUP_OLDER; + import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.internal.verification.VerificationModeFactory.times; + import android.app.backup.IBackupManagerMonitor; import android.content.Context; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageInfo; import android.content.pm.Signature; +import android.os.Bundle; +import android.os.Process; import android.platform.test.annotations.Presubmit; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; @@ -29,16 +48,20 @@ import android.support.test.runner.AndroidJUnit4; import com.android.frameworks.servicestests.R; import com.android.server.backup.FileMetadata; import com.android.server.backup.restore.PerformAdbRestoreTask; +import com.android.server.backup.restore.RestorePolicy; +import com.android.server.backup.testutils.PackageManagerStub; import com.google.common.hash.Hashing; 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; import java.io.InputStream; +import java.util.List; @SmallTest @Presubmit @@ -48,11 +71,13 @@ public class TarBackupReaderTest { private static final String TELEPHONY_PACKAGE_SIGNATURE_SHA256 = "301aa3cb081134501c45f1422abc66c24224fd5ded5fdc8f17e697176fd866aa"; private static final int TELEPHONY_PACKAGE_VERSION = 25; + private static final Signature FAKE_SIGNATURE_1 = new Signature("1234"); + private static final Signature FAKE_SIGNATURE_2 = new Signature("5678"); + + @Mock private BytesReadListener mBytesReadListenerMock; + @Mock private IBackupManagerMonitor mBackupManagerMonitorMock; - @Mock - private BytesReadListener mBytesReadListenerMock; - @Mock - private IBackupManagerMonitor mBackupManagerMonitorMock; + private final PackageManagerStub mPackageManagerStub = new PackageManagerStub(); private Context mContext; @Before @@ -137,4 +162,329 @@ public class TarBackupReaderTest { String signatureSha256 = Hashing.sha256().hashBytes(signatures[0].toByteArray()).toString(); assertThat(signatureSha256).isEqualTo(TELEPHONY_PACKAGE_SIGNATURE_SHA256); } + + @Test + public void chooseRestorePolicy_signaturesIsNull_returnsIgnore() throws Exception { + InputStream inputStream = mContext.getResources().openRawResource( + R.raw.backup_telephony_no_password); + InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream( + inputStream, null); + TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream, + mBytesReadListenerMock, mBackupManagerMonitorMock); + + RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub, + true /* allowApks */, new FileMetadata(), null /* signatures */); + + assertThat(policy).isEqualTo(RestorePolicy.IGNORE); + verifyZeroInteractions(mBackupManagerMonitorMock); + } + + @Test + public void chooseRestorePolicy_packageDoesNotExistAndAllowApksAndHasApk_returnsAcceptIfApk() + throws Exception { + InputStream inputStream = mContext.getResources().openRawResource( + R.raw.backup_telephony_no_password); + InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream( + inputStream, null); + TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream, + mBytesReadListenerMock, mBackupManagerMonitorMock); + FileMetadata info = new FileMetadata(); + info.hasApk = true; + PackageManagerStub.sPackageInfo = null; + + RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub, + true /* allowApks */, info, new Signature[0] /* signatures */); + + assertThat(policy).isEqualTo(RestorePolicy.ACCEPT_IF_APK); + ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class); + verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture()); + assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo( + LOG_EVENT_ID_APK_NOT_INSTALLED); + } + + @Test + public void + chooseRestorePolicy_packageDoesNotExistAndAllowApksAndDoesNotHaveApk_returnsAcceptIfApkLogsCannotRestore() + throws Exception { + InputStream inputStream = mContext.getResources().openRawResource( + R.raw.backup_telephony_no_password); + InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream( + inputStream, null); + TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream, + mBytesReadListenerMock, mBackupManagerMonitorMock); + FileMetadata info = new FileMetadata(); + info.hasApk = false; + PackageManagerStub.sPackageInfo = null; + + RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub, + true /* allowApks */, info, new Signature[0] /* signatures */); + + assertThat(policy).isEqualTo(RestorePolicy.ACCEPT_IF_APK); + ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class); + verify(mBackupManagerMonitorMock, times(2)).onEvent(bundleCaptor.capture()); + List<Bundle> eventBundles = bundleCaptor.getAllValues(); + assertThat(eventBundles).hasSize(2); + assertThat(eventBundles.get(0).get(EXTRA_LOG_EVENT_ID)).isEqualTo( + LOG_EVENT_ID_APK_NOT_INSTALLED); + assertThat(eventBundles.get(1).get(EXTRA_LOG_EVENT_ID)).isEqualTo( + LOG_EVENT_ID_CANNOT_RESTORE_WITHOUT_APK); + } + + @Test + public void chooseRestorePolicy_packageDoesNotExistAndDoesNotAllowApks_returnsIgnore() + throws Exception { + InputStream inputStream = mContext.getResources().openRawResource( + R.raw.backup_telephony_no_password); + InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream( + inputStream, null); + TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream, + mBytesReadListenerMock, mBackupManagerMonitorMock); + PackageManagerStub.sPackageInfo = null; + + RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub, + false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */); + + assertThat(policy).isEqualTo(RestorePolicy.IGNORE); + ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class); + verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture()); + assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo( + LOG_EVENT_ID_APK_NOT_INSTALLED); + } + + @Test + public void chooseRestorePolicy_doesNotAllowsBackup_returnsIgnore() throws Exception { + InputStream inputStream = mContext.getResources().openRawResource( + R.raw.backup_telephony_no_password); + InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream( + inputStream, null); + TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream, + mBytesReadListenerMock, mBackupManagerMonitorMock); + + PackageInfo packageInfo = new PackageInfo(); + packageInfo.applicationInfo = new ApplicationInfo(); + packageInfo.applicationInfo.flags = ~ApplicationInfo.FLAG_ALLOW_BACKUP; + PackageManagerStub.sPackageInfo = packageInfo; + + RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub, + false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */); + + assertThat(policy).isEqualTo(RestorePolicy.IGNORE); + ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class); + verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture()); + assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo( + LOG_EVENT_ID_FULL_RESTORE_ALLOW_BACKUP_FALSE); + } + + @Test + public void chooseRestorePolicy_systemAppWithNoAgent_returnsIgnore() throws Exception { + InputStream inputStream = mContext.getResources().openRawResource( + R.raw.backup_telephony_no_password); + InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream( + inputStream, null); + TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream, + mBytesReadListenerMock, mBackupManagerMonitorMock); + + PackageInfo packageInfo = new PackageInfo(); + packageInfo.applicationInfo = new ApplicationInfo(); + packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; + packageInfo.applicationInfo.uid = Process.SYSTEM_UID; + packageInfo.applicationInfo.backupAgentName = null; + PackageManagerStub.sPackageInfo = packageInfo; + + RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub, + false /* allowApks */, new FileMetadata(), new Signature[0] /* signatures */); + + assertThat(policy).isEqualTo(RestorePolicy.IGNORE); + ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class); + verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture()); + assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo( + LOG_EVENT_ID_SYSTEM_APP_NO_AGENT); + } + + @Test + public void chooseRestorePolicy_nonSystemAppSignaturesDoNotMatch_returnsIgnore() + throws Exception { + InputStream inputStream = mContext.getResources().openRawResource( + R.raw.backup_telephony_no_password); + InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream( + inputStream, null); + TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream, + mBytesReadListenerMock, mBackupManagerMonitorMock); + Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1}; + + PackageInfo packageInfo = new PackageInfo(); + packageInfo.applicationInfo = new ApplicationInfo(); + packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; + packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID; + packageInfo.applicationInfo.backupAgentName = null; + packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_2}; + PackageManagerStub.sPackageInfo = packageInfo; + + RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub, + false /* allowApks */, new FileMetadata(), signatures); + + assertThat(policy).isEqualTo(RestorePolicy.IGNORE); + ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class); + verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture()); + assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo( + LOG_EVENT_ID_FULL_RESTORE_SIGNATURE_MISMATCH); + } + + @Test + public void chooseRestorePolicy_systemAppWithBackupAgentAndRestoreAnyVersion_returnsAccept() throws Exception { + InputStream inputStream = mContext.getResources().openRawResource( + R.raw.backup_telephony_no_password); + InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream( + inputStream, null); + TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream, + mBytesReadListenerMock, mBackupManagerMonitorMock); + Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1}; + + PackageInfo packageInfo = new PackageInfo(); + packageInfo.applicationInfo = new ApplicationInfo(); + packageInfo.applicationInfo.flags |= + ApplicationInfo.FLAG_ALLOW_BACKUP | ApplicationInfo.FLAG_RESTORE_ANY_VERSION; + packageInfo.applicationInfo.uid = Process.SYSTEM_UID; + packageInfo.applicationInfo.backupAgentName = "backup.agent"; + packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1}; + PackageManagerStub.sPackageInfo = packageInfo; + + RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub, + false /* allowApks */, new FileMetadata(), signatures); + + assertThat(policy).isEqualTo(RestorePolicy.ACCEPT); + ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class); + verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture()); + assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo( + LOG_EVENT_ID_RESTORE_ANY_VERSION); + } + + @Test + public void chooseRestorePolicy_restoreAnyVersion_returnsAccept() throws Exception { + InputStream inputStream = mContext.getResources().openRawResource( + R.raw.backup_telephony_no_password); + InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream( + inputStream, null); + TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream, + mBytesReadListenerMock, mBackupManagerMonitorMock); + Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1}; + + PackageInfo packageInfo = new PackageInfo(); + packageInfo.applicationInfo = new ApplicationInfo(); + packageInfo.applicationInfo.flags |= + ApplicationInfo.FLAG_ALLOW_BACKUP | ApplicationInfo.FLAG_RESTORE_ANY_VERSION; + packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID; + packageInfo.applicationInfo.backupAgentName = null; + packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1}; + PackageManagerStub.sPackageInfo = packageInfo; + + RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub, + false /* allowApks */, new FileMetadata(), signatures); + + assertThat(policy).isEqualTo(RestorePolicy.ACCEPT); + ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class); + verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture()); + assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo( + LOG_EVENT_ID_RESTORE_ANY_VERSION); + } + + @Test + public void chooseRestorePolicy_notRestoreAnyVersionButVersionMatch_returnsAccept() + throws Exception { + InputStream inputStream = mContext.getResources().openRawResource( + R.raw.backup_telephony_no_password); + InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream( + inputStream, null); + TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream, + mBytesReadListenerMock, mBackupManagerMonitorMock); + Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1}; + FileMetadata info = new FileMetadata(); + info.version = 1; + + PackageInfo packageInfo = new PackageInfo(); + packageInfo.applicationInfo = new ApplicationInfo(); + packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; + packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION; + packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID; + packageInfo.applicationInfo.backupAgentName = null; + packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1}; + packageInfo.versionCode = 2; + PackageManagerStub.sPackageInfo = packageInfo; + + RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub, + false /* allowApks */, info, signatures); + + assertThat(policy).isEqualTo(RestorePolicy.ACCEPT); + ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class); + verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture()); + assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo( + LOG_EVENT_ID_VERSIONS_MATCH); + } + + @Test + public void + chooseRestorePolicy_notRestoreAnyVersionAndVersionMismatchButAllowApksAndHasApk_returnsAcceptIfApk() + throws Exception { + InputStream inputStream = mContext.getResources().openRawResource( + R.raw.backup_telephony_no_password); + InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream( + inputStream, null); + TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream, + mBytesReadListenerMock, mBackupManagerMonitorMock); + Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1}; + FileMetadata info = new FileMetadata(); + info.version = 2; + info.hasApk = true; + + PackageInfo packageInfo = new PackageInfo(); + packageInfo.applicationInfo = new ApplicationInfo(); + packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; + packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION; + packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID; + packageInfo.applicationInfo.backupAgentName = null; + packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1}; + packageInfo.versionCode = 1; + PackageManagerStub.sPackageInfo = packageInfo; + + RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub, + true /* allowApks */, info, signatures); + + assertThat(policy).isEqualTo(RestorePolicy.ACCEPT_IF_APK); + verifyNoMoreInteractions(mBackupManagerMonitorMock); + } + + @Test + public void + chooseRestorePolicy_notRestoreAnyVersionAndVersionMismatchAndDoesNotAllowApks_returnsIgnore() + throws Exception { + InputStream inputStream = mContext.getResources().openRawResource( + R.raw.backup_telephony_no_password); + InputStream tarInputStream = PerformAdbRestoreTask.parseBackupFileHeaderAndReturnTarStream( + inputStream, null); + TarBackupReader tarBackupReader = new TarBackupReader(tarInputStream, + mBytesReadListenerMock, mBackupManagerMonitorMock); + Signature[] signatures = new Signature[]{FAKE_SIGNATURE_1}; + FileMetadata info = new FileMetadata(); + info.version = 2; + + PackageInfo packageInfo = new PackageInfo(); + packageInfo.applicationInfo = new ApplicationInfo(); + packageInfo.applicationInfo.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; + packageInfo.applicationInfo.flags &= ~ApplicationInfo.FLAG_RESTORE_ANY_VERSION; + packageInfo.applicationInfo.uid = Process.FIRST_APPLICATION_UID; + packageInfo.applicationInfo.backupAgentName = null; + packageInfo.signatures = new Signature[]{FAKE_SIGNATURE_1}; + packageInfo.versionCode = 1; + PackageManagerStub.sPackageInfo = packageInfo; + + RestorePolicy policy = tarBackupReader.chooseRestorePolicy(mPackageManagerStub, + false /* allowApks */, info, signatures); + + assertThat(policy).isEqualTo(RestorePolicy.IGNORE); + ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class); + verify(mBackupManagerMonitorMock).onEvent(bundleCaptor.capture()); + assertThat(bundleCaptor.getValue().get(EXTRA_LOG_EVENT_ID)).isEqualTo( + LOG_EVENT_ID_VERSION_OF_BACKUP_OLDER); + } + }
\ No newline at end of file |