summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2017-05-10 10:46:54 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2017-05-10 10:47:00 +0000
commit7e87b672f07605420c69e7d8210830f4ec4d4123 (patch)
tree8feb59b51307ec21b4fee02082053460af351c83
parent4d147ff91832f3134ae713e5e545035c92cf1d2a (diff)
parenta08220b8175bc008edc5a163007db1d04431a6be (diff)
Merge "Add tests for chooseRestorePolicy."
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/testutils/PackageManagerStub.java1002
-rw-r--r--services/tests/servicestests/src/com/android/server/backup/utils/TarBackupReaderTest.java358
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