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

Commit 13d6dcaf authored by Annie Meng's avatar Annie Meng Committed by android-build-merger
Browse files

Merge "Fix KeyValueBackupTaskTest shadow errors" into qt-dev

am: e6763f28

Change-Id: I188d0a2905fd532333e55b0fc5191d0b63c5af86
parents 69e574f3 e6763f28
Loading
Loading
Loading
Loading
+11 −18
Original line number Diff line number Diff line
@@ -23,22 +23,20 @@ import static com.android.server.backup.UserBackupManagerService.SHARED_BACKUP_A
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;

import android.annotation.Nullable;
import android.app.AppGlobals;
import android.app.backup.BackupTransport;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.content.pm.SigningInfo;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.Slog;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.backup.IBackupTransport;
import com.android.internal.util.ArrayUtils;
import com.android.server.LocalServices;
import com.android.server.backup.transport.TransportClient;

import com.google.android.collect.Sets;
@@ -67,12 +65,13 @@ public class AppBackupUtils {
     * </ol>
     */
    public static boolean appIsEligibleForBackup(ApplicationInfo app, int userId) {
        return appIsEligibleForBackup(app, AppGlobals.getPackageManager(), userId);
        return appIsEligibleForBackup(
                app, LocalServices.getService(PackageManagerInternal.class), userId);
    }

    @VisibleForTesting
    static boolean appIsEligibleForBackup(ApplicationInfo app,
        IPackageManager packageManager, int userId) {
    static boolean appIsEligibleForBackup(
            ApplicationInfo app, PackageManagerInternal packageManager, int userId) {
        // 1. their manifest states android:allowBackup="false"
        if ((app.flags & ApplicationInfo.FLAG_ALLOW_BACKUP) == 0) {
            return false;
@@ -108,9 +107,9 @@ public class AppBackupUtils {
    /**
     * Returns whether an app is eligible for backup at runtime. That is, the app has to:
     * <ol>
     *     <li>Return true for {@link #appIsEligibleForBackup(ApplicationInfo, PackageManager)}
     *     <li>Return true for {@link #appIsEligibleForBackup(ApplicationInfo, int)}
     *     <li>Return false for {@link #appIsStopped(ApplicationInfo)}
     *     <li>Return false for {@link #appIsDisabled(ApplicationInfo, PackageManager)}
     *     <li>Return false for {@link #appIsDisabled(ApplicationInfo, int)}
     *     <li>Be eligible for the transport via
     *         {@link BackupTransport#isAppEligibleForBackup(PackageInfo, boolean)}
     * </ol>
@@ -149,19 +148,13 @@ public class AppBackupUtils {

    /** Avoid backups of 'disabled' apps. */
    static boolean appIsDisabled(ApplicationInfo app, int userId) {
        return appIsDisabled(app, AppGlobals.getPackageManager(), userId);
        return appIsDisabled(app, LocalServices.getService(PackageManagerInternal.class), userId);
    }

    @VisibleForTesting
    static boolean appIsDisabled(ApplicationInfo app,
        IPackageManager packageManager, int userId) {
        int enabledSetting;
        try {
            enabledSetting = packageManager.getApplicationEnabledSetting(app.packageName, userId);
        } catch (RemoteException e) {
            Slog.e(TAG, "Failed to get application enabled setting: " + e);
            return false;
        }
    static boolean appIsDisabled(
            ApplicationInfo app, PackageManagerInternal packageManager, int userId) {
        int enabledSetting = packageManager.getApplicationEnabledState(app.packageName, userId);

        switch (enabledSetting) {
            case PackageManager.COMPONENT_ENABLED_STATE_DISABLED:
+20 −14
Original line number Diff line number Diff line
@@ -86,6 +86,7 @@ import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.net.Uri;
import android.os.ConditionVariable;
import android.os.DeadObjectException;
@@ -100,6 +101,7 @@ import android.util.Pair;

import com.android.internal.backup.IBackupTransport;
import com.android.server.EventLogTags;
import com.android.server.LocalServices;
import com.android.server.backup.BackupRestoreTask;
import com.android.server.backup.DataChangedJournal;
import com.android.server.backup.KeyValueBackupJob;
@@ -116,7 +118,6 @@ import com.android.server.backup.testing.TransportTestUtils;
import com.android.server.backup.testing.TransportTestUtils.TransportMock;
import com.android.server.testing.shadows.FrameworkShadowLooper;
import com.android.server.testing.shadows.ShadowApplicationPackageManager;
import com.android.server.testing.shadows.ShadowBackupActivityThread;
import com.android.server.testing.shadows.ShadowBackupDataInput;
import com.android.server.testing.shadows.ShadowBackupDataOutput;
import com.android.server.testing.shadows.ShadowEventLog;
@@ -163,8 +164,7 @@ import java.util.stream.Stream;
            ShadowBackupDataInput.class,
            ShadowBackupDataOutput.class,
            ShadowEventLog.class,
            ShadowQueuedWork.class,
            ShadowBackupActivityThread.class,
            ShadowQueuedWork.class
        })
@Presubmit
public class KeyValueBackupTaskTest {
@@ -179,6 +179,7 @@ public class KeyValueBackupTaskTest {
    @Mock private IBackupObserver mObserver;
    @Mock private IBackupManagerMonitor mMonitor;
    @Mock private OnTaskFinishedListener mListener;
    @Mock private PackageManagerInternal mPackageManagerInternal;
    private UserBackupManagerService mBackupManagerService;
    private TransportData mTransport;
    private ShadowLooper mShadowBackupLooper;
@@ -243,6 +244,11 @@ public class KeyValueBackupTaskTest {
        mShadowBackupLooper = shadowOf(mBackupHandler.getLooper());
        ShadowEventLog.setUp();
        mReporter = spy(new KeyValueBackupReporter(mBackupManagerService, mObserver, mMonitor));

        when(mPackageManagerInternal.getApplicationEnabledState(any(), anyInt()))
                .thenReturn(PackageManager.COMPONENT_ENABLED_STATE_ENABLED);
        LocalServices.removeServiceForTest(PackageManagerInternal.class);
        LocalServices.addService(PackageManagerInternal.class, mPackageManagerInternal);
    }

    @After
@@ -471,7 +477,7 @@ public class KeyValueBackupTaskTest {
        TransportMock transportMock = setUpInitializedTransport(mTransport);
        setUpAgentWithData(PACKAGE_1);
        BackupAgent pmAgent = spy(createPmAgent());
        when(mBackupManagerService.makeMetadataAgent()).thenReturn(forward(pmAgent));
        doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
        KeyValueBackupTask task = createKeyValueBackupTask(transportMock, true, PACKAGE_1);

        runTask(task);
@@ -484,7 +490,7 @@ public class KeyValueBackupTaskTest {
        TransportMock transportMock = setUpInitializedTransport(mTransport);
        setUpAgentWithData(PACKAGE_1);
        BackupAgent pmAgent = spy(createPmAgent());
        when(mBackupManagerService.makeMetadataAgent()).thenReturn(forward(pmAgent));
        doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
        KeyValueBackupTask task =
                createKeyValueBackupTask(transportMock, true, PACKAGE_1, PM_PACKAGE);

@@ -498,7 +504,7 @@ public class KeyValueBackupTaskTest {
        TransportMock transportMock = setUpInitializedTransport(mTransport);
        setUpAgentWithData(PACKAGE_1);
        BackupAgent pmAgent = spy(createPmAgent());
        when(mBackupManagerService.makeMetadataAgent()).thenReturn(forward(pmAgent));
        doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
        KeyValueBackupTask task = createKeyValueBackupTask(transportMock, false, PACKAGE_1);

        runTask(task);
@@ -1307,7 +1313,7 @@ public class KeyValueBackupTaskTest {
                        argThat(packageInfo(PM_PACKAGE)), any(), anyInt()))
                .then(copyBackupDataTo(backupDataPath));
        BackupAgent pmAgent = spy(createPmAgent());
        when(mBackupManagerService.makeMetadataAgent()).thenReturn(forward(pmAgent));
        doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
        agentOnBackupDo(
                pmAgent,
                (oldState, dataOutput, newState) -> {
@@ -1371,7 +1377,7 @@ public class KeyValueBackupTaskTest {
        setUpAgent(PACKAGE_1);
        when(transportMock.transport.finishBackup()).thenReturn(BackupTransport.TRANSPORT_OK);
        BackupAgent pmAgent = spy(createPmAgent());
        when(mBackupManagerService.makeMetadataAgent()).thenReturn(forward(pmAgent));
        doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
        agentOnBackupDo(
                pmAgent,
                (oldState, dataOutput, newState) -> {
@@ -1395,7 +1401,7 @@ public class KeyValueBackupTaskTest {
        setUpAgent(PACKAGE_1);
        when(transportMock.transport.finishBackup()).thenReturn(BackupTransport.TRANSPORT_OK);
        BackupAgent pmAgent = spy(createPmAgent());
        when(mBackupManagerService.makeMetadataAgent()).thenReturn(forward(pmAgent));
        doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
        agentOnBackupDo(
                pmAgent,
                (oldState, dataOutput, newState) -> {
@@ -1957,7 +1963,7 @@ public class KeyValueBackupTaskTest {
        TransportMock transportMock = setUpInitializedTransport(mTransport);
        setUpAgent(PACKAGE_1);
        BackupAgent pmAgent = createThrowingPmAgent(new RuntimeException());
        when(mBackupManagerService.makeMetadataAgent()).thenReturn(pmAgent);
        doReturn(pmAgent).when(mBackupManagerService).makeMetadataAgent();
        KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1);

        runTask(task);
@@ -1970,7 +1976,7 @@ public class KeyValueBackupTaskTest {
        TransportMock transportMock = setUpInitializedTransport(mTransport);
        setUpAgent(PACKAGE_1);
        BackupAgent pmAgent = createThrowingPmAgent(new RuntimeException());
        when(mBackupManagerService.makeMetadataAgent()).thenReturn(pmAgent);
        doReturn(pmAgent).when(mBackupManagerService).makeMetadataAgent();
        KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1);

        runTask(task);
@@ -1983,7 +1989,7 @@ public class KeyValueBackupTaskTest {
        TransportMock transportMock = setUpInitializedTransport(mTransport);
        setUpAgent(PACKAGE_1);
        BackupAgent pmAgent = createThrowingPmAgent(new RuntimeException());
        when(mBackupManagerService.makeMetadataAgent()).thenReturn(pmAgent);
        doReturn(pmAgent).when(mBackupManagerService).makeMetadataAgent();
        KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1);

        runTask(task);
@@ -1996,7 +2002,7 @@ public class KeyValueBackupTaskTest {
        TransportMock transportMock = setUpInitializedTransport(mTransport);
        setUpAgent(PACKAGE_1);
        BackupAgent pmAgent = spy(createPmAgent());
        when(mBackupManagerService.makeMetadataAgent()).thenReturn(forward(pmAgent));
        doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
        KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1);
        agentOnBackupDo(
                pmAgent, (oldState, dataOutput, newState) -> runInWorkerThread(task::markCancel));
@@ -2011,7 +2017,7 @@ public class KeyValueBackupTaskTest {
        TransportMock transportMock = setUpInitializedTransport(mTransport);
        setUpAgent(PACKAGE_1);
        BackupAgent pmAgent = spy(createPmAgent());
        when(mBackupManagerService.makeMetadataAgent()).thenReturn(forward(pmAgent));
        doReturn(forward(pmAgent)).when(mBackupManagerService).makeMetadataAgent();
        KeyValueBackupTask task = createKeyValueBackupTask(transportMock, PACKAGE_1);
        agentOnBackupDo(
                pmAgent, (oldState, dataOutput, newState) -> runInWorkerThread(task::markCancel));
+0 −79
Original line number Diff line number Diff line
/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.server.testing.shadows;

import android.app.ActivityThread;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.os.RemoteException;

import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.shadows.ShadowActivityThread;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import javax.annotation.Nonnull;

/**
 * Extends the existing {@link ShadowActivityThread} to add support for
 * {@link PackageManager#getApplicationEnabledSetting(String)} in the shadow {@link PackageManager}
 * returned  by {@link ShadowBackupActivityThread#getPackageManager()}.
 */
@Implements(value = ActivityThread.class, isInAndroidSdk = false, looseSignatures = true)
public class ShadowBackupActivityThread extends ShadowActivityThread {
    @Implementation
    public static Object getPackageManager() {
        ClassLoader classLoader = ShadowActivityThread.class.getClassLoader();
        Class<?> iPackageManagerClass;
        try {
            iPackageManagerClass = classLoader.loadClass("android.content.pm.IPackageManager");
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }

        return Proxy.newProxyInstance(
                classLoader,
                new Class[] {iPackageManagerClass},
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, @Nonnull Method method, Object[] args)
                            throws Exception {
                        if (method.getName().equals("getApplicationInfo")) {
                            String packageName = (String) args[0];
                            int flags = (Integer) args[1];

                            try {
                                return RuntimeEnvironment.application
                                        .getPackageManager()
                                        .getApplicationInfo(packageName, flags);
                            } catch (PackageManager.NameNotFoundException e) {
                                throw new RemoteException(e.getMessage());
                            }
                        } else if (method.getName().equals("getApplicationEnabledSetting")) {
                            return 0;
                        } else {
                            return null;
                        }
                    }
                });
    }
}