Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5a36c134 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Fix testable looper threading" into pi-dev

parents 2b0ead73 1e352f4c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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();
        }

+7 −7
Original line number Diff line number Diff line
@@ -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) {
+19 −0
Original line number Diff line number Diff line
@@ -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();
        }
    }
}