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

Commit fab29c6f authored by JW Wang's avatar JW Wang
Browse files

Rewrite blockRollbackManager (1/n)

This is an effort to fix flaky testEnableRollbackTimeoutFailsRollback.

RollbackManager#blockRollbackManager doesn't work as intended because
PackageManagerService can't dispatch ENABLE_ROLLBACK_TIMEOUT until
abortBroadcast is called by RollbackManagerServiceImpl which happens
after blocking is finished.

See https://b.corp.google.com/issues/144732395#comment4 for a detailed
explanation.

blockRollbackManager is rewritten such that:
1. blocking takes effect only after ACTION_PACKAGE_ENABLE_ROLLBACK is
   received.
2. allows tests which involves multi-package install where multiple
   ACTION_PACKAGE_ENABLE_ROLLBACK will be broadcasted.
3. ENABLE_ROLLBACK_TIMEOUT now will be dispatched without waiting for
   blocking to finish.

Bug: 144732395
Test: atest RollbackTest
Change-Id: Ib262bc8c8f17563a4911f780c9d2e6a34803335a
parent f2e1609f
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ import android.os.UserManager;
import android.provider.DeviceConfig;
import android.util.ArraySet;
import android.util.IntArray;
import android.util.LongArrayQueue;
import android.util.Slog;
import android.util.SparseBooleanArray;

@@ -126,6 +127,11 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
    private final RollbackPackageHealthObserver mPackageHealthObserver;
    private final AppDataRollbackHelper mAppDataRollbackHelper;

    // The # of milli-seconds to sleep for each received ACTION_PACKAGE_ENABLE_ROLLBACK.
    // Used by #blockRollbackManager to test timeout in enabling rollbacks.
    // Accessed on the handler thread only.
    private final LongArrayQueue mSleepDuration = new LongArrayQueue();

    // This field stores the difference in Millis between the uptime (millis since device
    // has booted) and current time (device wall clock) - it's used to update rollback
    // timestamps when the time is changed, by the user or by change of timezone.
@@ -182,6 +188,8 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {

                    File newPackageCodePath = new File(intent.getData().getPath());

                    queueSleepIfNeeded();

                    getHandler().post(() -> {
                        boolean success =
                                enableRollback(installFlags, newPackageCodePath, user, token);
@@ -413,6 +421,19 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
        mContext.enforceCallingOrSelfPermission(
                Manifest.permission.TEST_MANAGE_ROLLBACKS,
                "blockRollbackManager");
        getHandler().post(() -> {
            mSleepDuration.addLast(millis);
        });
    }

    private void queueSleepIfNeeded() {
        if (mSleepDuration.size() == 0) {
            return;
        }
        long millis = mSleepDuration.removeFirst();
        if (millis <= 0) {
            return;
        }
        getHandler().post(() -> {
            try {
                Thread.sleep(millis);
@@ -1034,6 +1055,9 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
                    makeRollbackAvailable(rollback);
                }
            }

            // Clear the queue so it will never be leaked to next tests.
            mSleepDuration.clear();
        }
    }