Merge "Fix testable looper threading" into pi-dev

This commit is contained in:
TreeHugger Robot
2018-05-16 15:22:37 +00:00
committed by Android (Google) Code Review
3 changed files with 27 additions and 8 deletions

View File

@@ -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();
}

View File

@@ -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) {

View File

@@ -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();
}
}
}