diff options
| author | 2019-06-28 11:55:53 +0000 | |
|---|---|---|
| committer | 2019-06-28 11:55:53 +0000 | |
| commit | cff467769f1fd9625c405843ef0d60be769a735f (patch) | |
| tree | 547e6a326e3f93948436832bcb4621cbce3d197f | |
| parent | 2dbd527be4e502a3db3562588ff7ebc7daa9c8fb (diff) | |
| parent | 798b859b2b76b3ebd6317baa9b965b5909fc7016 (diff) | |
Merge "Add TestApi to block the RollbackManagerHandlerThread."
5 files changed, 44 insertions, 2 deletions
diff --git a/api/test-current.txt b/api/test-current.txt index bf2730abcb99..f02f5ceaf504 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -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(); diff --git a/core/java/android/content/rollback/IRollbackManager.aidl b/core/java/android/content/rollback/IRollbackManager.aidl index 1b84f2987a8f..b0e31c8578b9 100644 --- a/core/java/android/content/rollback/IRollbackManager.aidl +++ b/core/java/android/content/rollback/IRollbackManager.aidl @@ -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); } diff --git a/core/java/android/content/rollback/RollbackManager.java b/core/java/android/content/rollback/RollbackManager.java index 9a10a0c4766b..b8811aa1225e 100644 --- a/core/java/android/content/rollback/RollbackManager.java +++ b/core/java/android/content/rollback/RollbackManager.java @@ -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(); + } + } } diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index 505e89df55ca..f5639a9f76f1 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -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; diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java index 8ab71fdc0bac..a27df47701b3 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java @@ -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); |