Merge "Fix testable looper threading" into pi-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
5a36c134b7
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user