diff options
author | 2025-02-19 15:17:14 -0800 | |
---|---|---|
committer | 2025-02-19 15:48:52 -0800 | |
commit | 988f374699238bfbe0017308e1f14f56626eebc6 (patch) | |
tree | 136e4e0865f2e8d02f57b2c7e170eaa9268ce5a8 | |
parent | 2c6f80fe58f9ec4b77605e3b0afb7ee1b4bdb868 (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.java | 19 | ||||
-rw-r--r-- | tests/utils/testutils/java/android/os/test/TestLooper.java | 44 |
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) { |