summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2019-06-28 11:55:53 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-06-28 11:55:53 +0000
commitcff467769f1fd9625c405843ef0d60be769a735f (patch)
tree547e6a326e3f93948436832bcb4621cbce3d197f
parent2dbd527be4e502a3db3562588ff7ebc7daa9c8fb (diff)
parent798b859b2b76b3ebd6317baa9b965b5909fc7016 (diff)
Merge "Add TestApi to block the RollbackManagerHandlerThread."
-rw-r--r--api/test-current.txt1
-rw-r--r--core/java/android/content/rollback/IRollbackManager.aidl3
-rw-r--r--core/java/android/content/rollback/RollbackManager.java21
-rw-r--r--services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java17
-rw-r--r--tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java4
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);