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

Commit 907afab8 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Cleaning up deprecate_flags_and_settings_resets" into main

parents 61bfd25e ac294c00
Loading
Loading
Loading
Loading
+1 −7
Original line number Diff line number Diff line
@@ -47,7 +47,6 @@ import android.crashrecovery.flags.Flags;
import android.os.RecoverySystem;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.FlagsParameterization;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.DeviceConfig;
@@ -135,8 +134,7 @@ public class RescuePartyTest {
    @Parameters(name = "{0}")
    public static List<FlagsParameterization> getFlags() {
        return FlagsParameterization.allCombinationsOf(
                Flags.FLAG_RECOVERABILITY_DETECTION,
                Flags.FLAG_DEPRECATE_FLAGS_AND_SETTINGS_RESETS);
                Flags.FLAG_RECOVERABILITY_DETECTION);
    }

    public RescuePartyTest(FlagsParameterization flags) {
@@ -248,7 +246,6 @@ public class RescuePartyTest {
    }

    @Test
    @EnableFlags(Flags.FLAG_DEPRECATE_FLAGS_AND_SETTINGS_RESETS)
    public void testBootLoopNoFlags() {
        // this is old test where the flag needs to be disabled
        noteBoot(1);
@@ -260,7 +257,6 @@ public class RescuePartyTest {
    }

    @Test
    @EnableFlags(Flags.FLAG_DEPRECATE_FLAGS_AND_SETTINGS_RESETS)
    public void testPersistentAppCrashNoFlags() {
        // this is old test where the flag needs to be disabled
        noteAppCrash(1, true);
@@ -396,7 +392,6 @@ public class RescuePartyTest {
    }

    @Test
    @EnableFlags(Flags.FLAG_DEPRECATE_FLAGS_AND_SETTINGS_RESETS)
    public void testHealthCheckLevelsNoFlags() {
        // this is old test where the flag needs to be disabled
        RescuePartyObserver observer = RescuePartyObserver.getInstance(mMockContext);
@@ -416,7 +411,6 @@ public class RescuePartyTest {
    }

    @Test
    @EnableFlags(Flags.FLAG_DEPRECATE_FLAGS_AND_SETTINGS_RESETS)
    public void testBootLoopLevelsNoFlags() {
        RescuePartyObserver observer = RescuePartyObserver.getInstance(mMockContext);

+0 −277
Original line number Diff line number Diff line
@@ -48,8 +48,6 @@ import android.net.ConnectivityModuleConnector.ConnectivityModuleHealthListener;
import android.os.Handler;
import android.os.SystemProperties;
import android.os.test.TestLooper;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.DeviceConfig;
import android.util.AtomicFile;
@@ -305,90 +303,6 @@ public class CrashRecoveryTest {
    }

    @Test
    @DisableFlags(Flags.FLAG_DEPRECATE_FLAGS_AND_SETTINGS_RESETS)
    public void testBootLoopWithRescuePartyAndRollbackObserver() throws Exception {
        PackageWatchdog watchdog = createWatchdog();
        RescuePartyObserver rescuePartyObserver = setUpRescuePartyObserver(watchdog);
        RollbackPackageHealthObserver rollbackObserver =
                setUpRollbackPackageHealthObserver(watchdog);

        verify(rescuePartyObserver, never()).onExecuteBootLoopMitigation(1);
        verify(rollbackObserver, never()).onExecuteBootLoopMitigation(1);
        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_COUNT; i++) {
            watchdog.noteBoot();
        }
        mTestLooper.dispatchAll();
        verify(rescuePartyObserver).onExecuteBootLoopMitigation(1);
        verify(rescuePartyObserver, never()).onExecuteBootLoopMitigation(2);
        verify(rollbackObserver, never()).onExecuteBootLoopMitigation(1);

        watchdog.noteBoot();

        mTestLooper.dispatchAll();
        verify(rescuePartyObserver).onExecuteBootLoopMitigation(2);
        verify(rescuePartyObserver, never()).onExecuteBootLoopMitigation(3);
        verify(rollbackObserver, never()).onExecuteBootLoopMitigation(2);

        watchdog.noteBoot();

        mTestLooper.dispatchAll();
        verify(rescuePartyObserver, never()).onExecuteBootLoopMitigation(3);
        verify(rollbackObserver).onExecuteBootLoopMitigation(1);
        verify(rollbackObserver, never()).onExecuteBootLoopMitigation(2);
        // Update the list of available rollbacks after executing bootloop mitigation once
        when(mRollbackManager.getAvailableRollbacks()).thenReturn(List.of(ROLLBACK_INFO_HIGH,
                ROLLBACK_INFO_MANUAL));

        watchdog.noteBoot();

        mTestLooper.dispatchAll();
        verify(rescuePartyObserver).onExecuteBootLoopMitigation(3);
        verify(rescuePartyObserver, never()).onExecuteBootLoopMitigation(4);
        verify(rollbackObserver, never()).onExecuteBootLoopMitigation(2);

        watchdog.noteBoot();

        mTestLooper.dispatchAll();
        verify(rescuePartyObserver).onExecuteBootLoopMitigation(4);
        verify(rescuePartyObserver, never()).onExecuteBootLoopMitigation(5);
        verify(rollbackObserver, never()).onExecuteBootLoopMitigation(2);

        watchdog.noteBoot();

        mTestLooper.dispatchAll();
        verify(rescuePartyObserver).onExecuteBootLoopMitigation(5);
        verify(rescuePartyObserver, never()).onExecuteBootLoopMitigation(6);
        verify(rollbackObserver, never()).onExecuteBootLoopMitigation(2);

        watchdog.noteBoot();

        mTestLooper.dispatchAll();
        verify(rescuePartyObserver, never()).onExecuteBootLoopMitigation(6);
        verify(rollbackObserver).onExecuteBootLoopMitigation(2);
        verify(rollbackObserver, never()).onExecuteBootLoopMitigation(3);
        // Update the list of available rollbacks after executing bootloop mitigation
        when(mRollbackManager.getAvailableRollbacks()).thenReturn(List.of(ROLLBACK_INFO_MANUAL));

        watchdog.noteBoot();

        mTestLooper.dispatchAll();
        verify(rescuePartyObserver).onExecuteBootLoopMitigation(6);
        verify(rescuePartyObserver, never()).onExecuteBootLoopMitigation(7);
        verify(rollbackObserver, never()).onExecuteBootLoopMitigation(3);

        moveTimeForwardAndDispatch(PackageWatchdog.DEFAULT_DEESCALATION_WINDOW_MS + 1);
        Mockito.reset(rescuePartyObserver);

        for (int i = 0; i < PackageWatchdog.DEFAULT_BOOT_LOOP_TRIGGER_COUNT; i++) {
            watchdog.noteBoot();
        }
        mTestLooper.dispatchAll();
        verify(rescuePartyObserver).onExecuteBootLoopMitigation(1);
        verify(rescuePartyObserver, never()).onExecuteBootLoopMitigation(2);
    }

    @Test
    @EnableFlags(Flags.FLAG_DEPRECATE_FLAGS_AND_SETTINGS_RESETS)
    public void testBootLoopWithRescuePartyAndRollbackObserverNoFlags() throws Exception {
        PackageWatchdog watchdog = createWatchdog();
        RescuePartyObserver rescuePartyObserver = setUpRescuePartyObserver(watchdog);
@@ -443,80 +357,6 @@ public class CrashRecoveryTest {
    }

    @Test
    @DisableFlags(Flags.FLAG_DEPRECATE_FLAGS_AND_SETTINGS_RESETS)
    public void testCrashLoopWithRescuePartyAndRollbackObserver() throws Exception {
        PackageWatchdog watchdog = createWatchdog();
        RescuePartyObserver rescuePartyObserver = setUpRescuePartyObserver(watchdog);
        RollbackPackageHealthObserver rollbackObserver =
                setUpRollbackPackageHealthObserver(watchdog);
        VersionedPackage versionedPackageA = new VersionedPackage(APP_A, VERSION_CODE);

        when(mMockPackageManager.getApplicationInfo(anyString(), anyInt())).then(inv -> {
            ApplicationInfo info = new ApplicationInfo();
            info.flags |= ApplicationInfo.FLAG_PERSISTENT
                    | ApplicationInfo.FLAG_SYSTEM;
            return info;
        });

        raiseFatalFailureAndDispatch(watchdog,
                Arrays.asList(versionedPackageA), PackageWatchdog.FAILURE_REASON_APP_CRASH);

        // Mitigation: SCOPED_DEVICE_CONFIG_RESET
        verify(rescuePartyObserver).onExecuteHealthCheckMitigation(versionedPackageA,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 1);
        verify(rescuePartyObserver, never()).onExecuteHealthCheckMitigation(versionedPackageA,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 2);
        verify(rollbackObserver, never()).onExecuteHealthCheckMitigation(versionedPackageA,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 1);

        raiseFatalFailureAndDispatch(watchdog,
                Arrays.asList(versionedPackageA), PackageWatchdog.FAILURE_REASON_APP_CRASH);

        // Mitigation: ALL_DEVICE_CONFIG_RESET
        verify(rescuePartyObserver).onExecuteHealthCheckMitigation(versionedPackageA,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 2);
        verify(rescuePartyObserver, never()).onExecuteHealthCheckMitigation(versionedPackageA,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 3);
        verify(rollbackObserver, never()).onExecuteHealthCheckMitigation(versionedPackageA,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 1);

        raiseFatalFailureAndDispatch(watchdog,
                Arrays.asList(versionedPackageA), PackageWatchdog.FAILURE_REASON_APP_CRASH);

        // Mitigation: WARM_REBOOT
        verify(rescuePartyObserver).onExecuteHealthCheckMitigation(versionedPackageA,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 3);
        verify(rescuePartyObserver, never()).onExecuteHealthCheckMitigation(versionedPackageA,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 4);
        verify(rollbackObserver, never()).onExecuteHealthCheckMitigation(versionedPackageA,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 1);

        raiseFatalFailureAndDispatch(watchdog,
                Arrays.asList(versionedPackageA), PackageWatchdog.FAILURE_REASON_APP_CRASH);

        // Mitigation: Low impact rollback
        verify(rollbackObserver).onExecuteHealthCheckMitigation(versionedPackageA,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 1);
        verify(rescuePartyObserver, never()).onExecuteHealthCheckMitigation(versionedPackageA,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 4);

        // update available rollbacks to mock rollbacks being applied after the call to
        // rollbackObserver.onExecuteHealthCheckMitigation
        when(mRollbackManager.getAvailableRollbacks()).thenReturn(
                List.of(ROLLBACK_INFO_HIGH, ROLLBACK_INFO_MANUAL));

        raiseFatalFailureAndDispatch(watchdog,
                Arrays.asList(versionedPackageA), PackageWatchdog.FAILURE_REASON_APP_CRASH);

        // DEFAULT_MAJOR_USER_IMPACT_LEVEL_THRESHOLD reached. No more mitigations applied
        verify(rescuePartyObserver, never()).onExecuteHealthCheckMitigation(versionedPackageA,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 4);
        verify(rollbackObserver, never()).onExecuteHealthCheckMitigation(versionedPackageA,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 2);
    }

    @Test
    @EnableFlags(Flags.FLAG_DEPRECATE_FLAGS_AND_SETTINGS_RESETS)
    public void testCrashLoopWithRescuePartyAndRollbackObserverEnableDeprecateFlagReset()
            throws Exception {
        PackageWatchdog watchdog = createWatchdog();
@@ -569,123 +409,6 @@ public class CrashRecoveryTest {
    }

    @Test
    @DisableFlags(Flags.FLAG_DEPRECATE_FLAGS_AND_SETTINGS_RESETS)
    public void testCrashLoopSystemUIWithRescuePartyAndRollbackObserver() throws Exception {
        PackageWatchdog watchdog = createWatchdog();
        RescuePartyObserver rescuePartyObserver = setUpRescuePartyObserver(watchdog);
        RollbackPackageHealthObserver rollbackObserver =
                setUpRollbackPackageHealthObserver(watchdog);
        String systemUi = "com.android.systemui";
        VersionedPackage versionedPackageUi = new VersionedPackage(
                systemUi, VERSION_CODE);
        RollbackInfo rollbackInfoUi = getRollbackInfo(systemUi, VERSION_CODE, 1,
                PackageManager.ROLLBACK_USER_IMPACT_LOW);
        when(mRollbackManager.getAvailableRollbacks()).thenReturn(List.of(ROLLBACK_INFO_LOW,
                ROLLBACK_INFO_HIGH, ROLLBACK_INFO_MANUAL, rollbackInfoUi));

        when(mMockPackageManager.getApplicationInfo(anyString(), anyInt())).then(inv -> {
            ApplicationInfo info = new ApplicationInfo();
            info.flags |= ApplicationInfo.FLAG_PERSISTENT
                    | ApplicationInfo.FLAG_SYSTEM;
            return info;
        });

        raiseFatalFailureAndDispatch(watchdog,
                Arrays.asList(versionedPackageUi), PackageWatchdog.FAILURE_REASON_APP_CRASH);

        // Mitigation: SCOPED_DEVICE_CONFIG_RESET
        verify(rescuePartyObserver).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 1);
        verify(rescuePartyObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 2);
        verify(rollbackObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 1);

        raiseFatalFailureAndDispatch(watchdog,
                Arrays.asList(versionedPackageUi), PackageWatchdog.FAILURE_REASON_APP_CRASH);

        // Mitigation: ALL_DEVICE_CONFIG_RESET
        verify(rescuePartyObserver).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 2);
        verify(rescuePartyObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 3);
        verify(rollbackObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 1);

        raiseFatalFailureAndDispatch(watchdog,
                Arrays.asList(versionedPackageUi), PackageWatchdog.FAILURE_REASON_APP_CRASH);

        // Mitigation: WARM_REBOOT
        verify(rescuePartyObserver).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 3);
        verify(rescuePartyObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 4);
        verify(rollbackObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 1);

        raiseFatalFailureAndDispatch(watchdog,
                Arrays.asList(versionedPackageUi), PackageWatchdog.FAILURE_REASON_APP_CRASH);

        // Mitigation: Low impact rollback
        verify(rollbackObserver).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 1);
        verify(rescuePartyObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 4);
        verify(rollbackObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 2);

        // update available rollbacks to mock rollbacks being applied after the call to
        // rollbackObserver.onExecuteHealthCheckMitigation
        when(mRollbackManager.getAvailableRollbacks()).thenReturn(
                List.of(ROLLBACK_INFO_HIGH, ROLLBACK_INFO_MANUAL));

        raiseFatalFailureAndDispatch(watchdog,
                Arrays.asList(versionedPackageUi), PackageWatchdog.FAILURE_REASON_APP_CRASH);

        // Mitigation: RESET_SETTINGS_UNTRUSTED_DEFAULTS
        verify(rescuePartyObserver).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 4);
        verify(rescuePartyObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 5);
        verify(rollbackObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 2);

        raiseFatalFailureAndDispatch(watchdog,
                Arrays.asList(versionedPackageUi), PackageWatchdog.FAILURE_REASON_APP_CRASH);

        // Mitigation: RESET_SETTINGS_UNTRUSTED_CHANGES
        verify(rescuePartyObserver).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 5);
        verify(rescuePartyObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 6);
        verify(rollbackObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 2);

        raiseFatalFailureAndDispatch(watchdog,
                Arrays.asList(versionedPackageUi), PackageWatchdog.FAILURE_REASON_APP_CRASH);

        // Mitigation: RESET_SETTINGS_TRUSTED_DEFAULTS
        verify(rescuePartyObserver).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 6);
        verify(rescuePartyObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 7);
        verify(rollbackObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 2);

        raiseFatalFailureAndDispatch(watchdog,
                Arrays.asList(versionedPackageUi), PackageWatchdog.FAILURE_REASON_APP_CRASH);

        // Mitigation: Factory reset. High impact rollbacks are performed only for boot loops.
        verify(rescuePartyObserver).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 7);
        verify(rescuePartyObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 8);
        verify(rollbackObserver, never()).onExecuteHealthCheckMitigation(versionedPackageUi,
                PackageWatchdog.FAILURE_REASON_APP_CRASH, 2);
    }

    @Test
    @EnableFlags(Flags.FLAG_DEPRECATE_FLAGS_AND_SETTINGS_RESETS)
    public void testCrashLoopSystemUIWithRescuePartyAndRollbackObserverEnableDeprecateFlagReset()
            throws Exception {
        PackageWatchdog watchdog = createWatchdog();