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

Commit 798b859b authored by Richard Uhler's avatar Richard Uhler
Browse files

Add TestApi to block the RollbackManagerHandlerThread.

To eliminate flakiness when testing timeout conditions for
RollbackTest.testEnableRollbackTimeoutFailsRollback.

Test: atest RollbackTest.testEnableRollbackTimeoutFailsRollback in a loop
Bug: 134373106
Change-Id: I01f3e769711ffa51fa714ff4bc81e70887f427ad
parent 482c2c99
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -789,6 +789,7 @@ package android.content.rollback {
  }

  public final class RollbackManager {
    method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void blockRollbackManager(long);
    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) public void commitRollback(int, @NonNull java.util.List<android.content.pm.VersionedPackage>, @NonNull android.content.IntentSender);
    method @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS) public void expireRollbackForPackage(@NonNull String);
    method @RequiresPermission(anyOf={android.Manifest.permission.MANAGE_ROLLBACKS, android.Manifest.permission.TEST_MANAGE_ROLLBACKS}) @NonNull public java.util.List<android.content.rollback.RollbackInfo> getAvailableRollbacks();
+3 −0
Original line number Diff line number Diff line
@@ -51,4 +51,7 @@ interface IRollbackManager {
    // Used by the staging manager to notify the RollbackManager of the apk
    // session for a staged session.
    void notifyStagedApkSession(int originalSessionId, int apkSessionId);

    // For test purposes only.
    void blockRollbackManager(long millis);
}
+21 −0
Original line number Diff line number Diff line
@@ -250,4 +250,25 @@ public final class RollbackManager {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Block the RollbackManager for a specified amount of time.
     * This API is meant to facilitate testing of race conditions in
     * RollbackManager. Blocks RollbackManager from processing anything for
     * the given number of milliseconds.
     *
     * @param millis number of milliseconds to block the RollbackManager for
     * @throws SecurityException if the caller does not have appropriate permissions.
     *
     * @hide
     */
    @RequiresPermission(android.Manifest.permission.TEST_MANAGE_ROLLBACKS)
    @TestApi
    public void blockRollbackManager(long millis) {
        try {
            mBinder.blockRollbackManager(millis);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }
}
+15 −2
Original line number Diff line number Diff line
@@ -45,10 +45,9 @@ import android.os.Handler;
import android.os.HandlerThread;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.UserHandle;   // duped to avoid merge conflict
import android.os.UserManager;  // out of order to avoid merge conflict
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.DeviceConfig;
import android.util.ArraySet;
import android.util.IntArray;
@@ -575,6 +574,20 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
        }
    }

    @Override
    public void blockRollbackManager(long millis) {
        mContext.enforceCallingOrSelfPermission(
                Manifest.permission.TEST_MANAGE_ROLLBACKS,
                "blockRollbackManager");
        getHandler().post(() -> {
            try {
                Thread.sleep(millis);
            } catch (InterruptedException e) {
                // ignored.
            }
        });
    }

    void onUnlockUser(int userId) {
        getHandler().post(() -> {
            final List<RollbackData> rollbacks;
+4 −0
Original line number Diff line number Diff line
@@ -1058,6 +1058,10 @@ public class RollbackTest {

            Uninstall.packages(TestApp.A);
            Install.single(TestApp.A1).commit();

            // Block the RollbackManager to make extra sure it will not be
            // able to enable the rollback in time.
            rm.blockRollbackManager(TimeUnit.SECONDS.toMillis(1));
            Install.single(TestApp.A2).setEnableRollback().commit();

            assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2);