Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7cc326b0 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add more tests for AppBackupUtils."

parents 69320958 23c6007c
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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
@@ -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;
+349 −6
Original line number Diff line number Diff line
@@ -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;
@@ -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)
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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);
    }
}
+7 −0
Original line number Diff line number Diff line
@@ -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;

+7 −0
Original line number Diff line number Diff line
@@ -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";

+7 −0
Original line number Diff line number Diff line
@@ -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