diff options
3 files changed, 27 insertions, 8 deletions
diff --git a/tests/testables/src/android/testing/TestableInstrumentation.java b/tests/testables/src/android/testing/TestableInstrumentation.java index 93fed859cf39..3207b486b329 100644 --- a/tests/testables/src/android/testing/TestableInstrumentation.java +++ b/tests/testables/src/android/testing/TestableInstrumentation.java @@ -77,7 +77,7 @@ public class TestableInstrumentation extends AndroidJUnitRunner { private TestLooperManager mManager; public MainLooperManager() { - mMainHandler = new Handler(Looper.getMainLooper()); + mMainHandler = Handler.createAsync(Looper.getMainLooper()); startManaging(); } diff --git a/tests/testables/src/android/testing/TestableLooper.java b/tests/testables/src/android/testing/TestableLooper.java index f1a70921a469..f8d223ab91b6 100644 --- a/tests/testables/src/android/testing/TestableLooper.java +++ b/tests/testables/src/android/testing/TestableLooper.java @@ -51,12 +51,12 @@ public class TestableLooper { this(acquireLooperManager(l), l); } - private TestableLooper(TestLooperManager wrapper, Looper l) throws Exception { + private TestableLooper(TestLooperManager wrapper, Looper l) { mQueueWrapper = wrapper; setupQueue(l); } - private TestableLooper(Looper looper, boolean b) throws Exception { + private TestableLooper(Looper looper, boolean b) { setupQueue(looper); } @@ -64,7 +64,7 @@ public class TestableLooper { return mLooper; } - private void setupQueue(Looper l) throws Exception { + private void setupQueue(Looper l) { mLooper = l; mQueue = mLooper.getQueue(); mHandler = new Handler(mLooper); @@ -75,7 +75,7 @@ public class TestableLooper { * the looper will not be available for any subsequent tests. This is * automatically handled for tests using {@link RunWithLooper}. */ - public void destroy() throws NoSuchFieldException, IllegalAccessException { + public void destroy() { mQueueWrapper.release(); if (mLooper == Looper.getMainLooper()) { TestableInstrumentation.releaseMain(); @@ -133,7 +133,7 @@ public class TestableLooper { if (mMessageHandler != null) { if (mMessageHandler.onMessageHandled(result)) { - result.getTarget().dispatchMessage(result); + mQueueWrapper.execute(result); mQueueWrapper.recycle(result); } else { mQueueWrapper.recycle(result); @@ -141,7 +141,7 @@ public class TestableLooper { return false; } } else { - result.getTarget().dispatchMessage(result); + mQueueWrapper.execute(result); mQueueWrapper.recycle(result); } } else { @@ -238,7 +238,7 @@ public class TestableLooper { super(base.getMethod()); mLooper = other.mLooper; mTestableLooper = other; - mHandler = new Handler(mLooper); + mHandler = Handler.createAsync(mLooper); } public static FrameworkMethod get(FrameworkMethod base, boolean setAsMain, Object test) { diff --git a/tests/testables/tests/src/android/testing/TestableLooperTest.java b/tests/testables/tests/src/android/testing/TestableLooperTest.java index 13e72bad1dc3..25f6a48871d3 100644 --- a/tests/testables/tests/src/android/testing/TestableLooperTest.java +++ b/tests/testables/tests/src/android/testing/TestableLooperTest.java @@ -16,6 +16,7 @@ package android.testing; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; @@ -158,4 +159,22 @@ public class TestableLooperTest { public void testMainLooperAnnotation() { assertEquals(Looper.myLooper(), Looper.getMainLooper()); } + + @Test + public void testCorrectLooperExecution() throws Exception { + boolean[] hasRun = new boolean[] { false }; + Runnable r = () -> { + assertEquals("Should run on main looper", Looper.getMainLooper(), Looper.myLooper()); + hasRun[0] = true; + }; + TestableLooper testableLooper = new TestableLooper(Looper.getMainLooper()); + try { + new Handler(Looper.getMainLooper()).post(r); + testableLooper.processAllMessages(); + + assertTrue(hasRun[0]); + } finally { + testableLooper.destroy(); + } + } } |