summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Maciej Żenczykowski <maze@google.com> 2025-02-19 15:17:14 -0800
committer Maciej Żenczykowski <maze@google.com> 2025-02-19 15:48:52 -0800
commit988f374699238bfbe0017308e1f14f56626eebc6 (patch)
tree136e4e0865f2e8d02f57b2c7e170eaa9268ce5a8
parent2c6f80fe58f9ec4b77605e3b0afb7ee1b4bdb868 (diff)
Revert "Use Flag instead of method check to detect new message queue testability API"
This reverts commit 949e5e48020db3c8d5b3b0a2b1b3d9120cab4ad2. Reason for revert: somehow incompatible with mainline R/S/T/U/V https://android-build.corp.google.com/test_investigate/?blocking=blocking&status=none&invocationId=I90800010367953228&testResultId=TR09129634304861714&legacy= java.lang.NoClassDefFoundError: android.net.connectivity.android.os.test.TestLooper at android.net.connectivity.com.android.server.connectivity.MulticastRoutingCoordinatorServiceTest.prepareService(MulticastRoutingCoordinatorServiceTest.kt:153) at android.net.connectivity.com.android.server.connectivity.MulticastRoutingCoordinatorServiceTest.testConstructor_multicastRoutingSocketIsCreated(MulticastRoutingCoordinatorServiceTest.kt:204) ... 8 trimmed Caused by: java.lang.NoSuchMethodError: No static method messageQueueTestability()Z in class Lcom/android/internal/hidden_from_bootclasspath/android/os/Flags; or its super classes (declaration of 'com.android.internal.hidden_from_bootclasspath.android.os.Flags' appears in /system/framework/framework.jar!classes4.dex) at android.net.connectivity.android.os.test.TestLooper.newTestabilityApisSupported(TestLooper.java:71) at android.net.connectivity.android.os.test.TestLooper.<clinit>(TestLooper.java:84) at android.net.connectivity.com.android.server.connectivity.MulticastRoutingCoordinatorServiceTest.prepareService(MulticastRoutingCoordinatorServiceTest.kt:153) at android.net.connectivity.com.android.server.connectivity.MulticastRoutingCoordinatorServiceTest.testMulticastRouting_applyForwardNone(MulticastRoutingCoordinatorServiceTest.kt:210) ... 9 more Change-Id: I40192ddd4366792b6d8742826e575b2569337c85
-rw-r--r--tests/testables/src/android/testing/TestableLooper.java19
-rw-r--r--tests/utils/testutils/java/android/os/test/TestLooper.java44
2 files changed, 38 insertions, 25 deletions
diff --git a/tests/testables/src/android/testing/TestableLooper.java b/tests/testables/src/android/testing/TestableLooper.java
index 7a19add1d1b9..8cd89ce89e83 100644
--- a/tests/testables/src/android/testing/TestableLooper.java
+++ b/tests/testables/src/android/testing/TestableLooper.java
@@ -34,6 +34,7 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
+import java.lang.reflect.Method;
import java.util.ArrayDeque;
import java.util.Map;
import java.util.Objects;
@@ -73,15 +74,21 @@ public class TestableLooper {
/**
* Baklava introduces new {@link TestLooperManager} APIs that we can use instead of reflection.
*/
- private static boolean newTestabilityApisSupported() {
- return android.os.Flags.messageQueueTestability();
+ private static boolean isAtLeastBaklava() {
+ Method[] methods = TestLooperManager.class.getMethods();
+ for (Method method : methods) {
+ if (method.getName().equals("peekWhen")) {
+ return true;
+ }
+ }
+ return false;
// TODO(shayba): delete the above, uncomment the below.
// SDK_INT has not yet ramped to Baklava in all 25Q2 builds.
// return Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA;
}
static {
- if (newTestabilityApisSupported()) {
+ if (isAtLeastBaklava()) {
MESSAGE_QUEUE_MESSAGES_FIELD = null;
MESSAGE_NEXT_FIELD = null;
MESSAGE_WHEN_FIELD = null;
@@ -241,14 +248,14 @@ public class TestableLooper {
}
public void moveTimeForward(long milliSeconds) {
- if (newTestabilityApisSupported()) {
- moveTimeForwardModern(milliSeconds);
+ if (isAtLeastBaklava()) {
+ moveTimeForwardBaklava(milliSeconds);
} else {
moveTimeForwardLegacy(milliSeconds);
}
}
- private void moveTimeForwardModern(long milliSeconds) {
+ private void moveTimeForwardBaklava(long milliSeconds) {
// Drain all Messages from the queue.
Queue<Message> messages = new ArrayDeque<>();
while (true) {
diff --git a/tests/utils/testutils/java/android/os/test/TestLooper.java b/tests/utils/testutils/java/android/os/test/TestLooper.java
index c7a36dd3f9d8..4d379e45a81a 100644
--- a/tests/utils/testutils/java/android/os/test/TestLooper.java
+++ b/tests/utils/testutils/java/android/os/test/TestLooper.java
@@ -65,13 +65,19 @@ public class TestLooper {
private AutoDispatchThread mAutoDispatchThread;
/**
- * Modern introduces new {@link TestLooperManager} APIs that we can use instead of reflection.
+ * Baklava introduces new {@link TestLooperManager} APIs that we can use instead of reflection.
*/
- private static boolean newTestabilityApisSupported() {
- return android.os.Flags.messageQueueTestability();
+ private static boolean isAtLeastBaklava() {
+ Method[] methods = TestLooperManager.class.getMethods();
+ for (Method method : methods) {
+ if (method.getName().equals("peekWhen")) {
+ return true;
+ }
+ }
+ return false;
// TODO(shayba): delete the above, uncomment the below.
- // SDK_INT has not yet ramped to Modern in all 25Q2 builds.
- // return Build.VERSION.SDK_INT >= Build.VERSION_CODES.Modern;
+ // SDK_INT has not yet ramped to Baklava in all 25Q2 builds.
+ // return Build.VERSION.SDK_INT >= Build.VERSION_CODES.BAKLAVA;
}
static {
@@ -81,7 +87,7 @@ public class TestLooper {
THREAD_LOCAL_LOOPER_FIELD = Looper.class.getDeclaredField("sThreadLocal");
THREAD_LOCAL_LOOPER_FIELD.setAccessible(true);
- if (newTestabilityApisSupported()) {
+ if (isAtLeastBaklava()) {
MESSAGE_QUEUE_MESSAGES_FIELD = null;
MESSAGE_NEXT_FIELD = null;
MESSAGE_WHEN_FIELD = null;
@@ -130,7 +136,7 @@ public class TestLooper {
throw new RuntimeException("Reflection error constructing or accessing looper", e);
}
- if (newTestabilityApisSupported()) {
+ if (isAtLeastBaklava()) {
mTestLooperManager =
InstrumentationRegistry.getInstrumentation().acquireLooperManager(mLooper);
} else {
@@ -159,14 +165,14 @@ public class TestLooper {
}
public void moveTimeForward(long milliSeconds) {
- if (newTestabilityApisSupported()) {
- moveTimeForwardModern(milliSeconds);
+ if (isAtLeastBaklava()) {
+ moveTimeForwardBaklava(milliSeconds);
} else {
moveTimeForwardLegacy(milliSeconds);
}
}
- private void moveTimeForwardModern(long milliSeconds) {
+ private void moveTimeForwardBaklava(long milliSeconds) {
// Drain all Messages from the queue.
Queue<Message> messages = new ArrayDeque<>();
while (true) {
@@ -259,14 +265,14 @@ public class TestLooper {
* @return true if there are pending messages in the message queue
*/
public boolean isIdle() {
- if (newTestabilityApisSupported()) {
- return isIdleModern();
+ if (isAtLeastBaklava()) {
+ return isIdleBaklava();
} else {
return isIdleLegacy();
}
}
- private boolean isIdleModern() {
+ private boolean isIdleBaklava() {
Long when = mTestLooperManager.peekWhen();
return when != null && currentTime() >= when;
}
@@ -280,14 +286,14 @@ public class TestLooper {
* @return the next message in the Looper's message queue or null if there is none
*/
public Message nextMessage() {
- if (newTestabilityApisSupported()) {
- return nextMessageModern();
+ if (isAtLeastBaklava()) {
+ return nextMessageBaklava();
} else {
return nextMessageLegacy();
}
}
- private Message nextMessageModern() {
+ private Message nextMessageBaklava() {
if (isIdle()) {
return mTestLooperManager.poll();
} else {
@@ -308,14 +314,14 @@ public class TestLooper {
* Asserts that there is a message in the queue
*/
public void dispatchNext() {
- if (newTestabilityApisSupported()) {
- dispatchNextModern();
+ if (isAtLeastBaklava()) {
+ dispatchNextBaklava();
} else {
dispatchNextLegacy();
}
}
- private void dispatchNextModern() {
+ private void dispatchNextBaklava() {
assertTrue(isIdle());
Message msg = mTestLooperManager.poll();
if (msg == null) {