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

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

Merge "Add TestApi to block the RollbackManagerHandlerThread."

parents 2dbd527b 798b859b
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -795,6 +795,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);