17901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown//
27901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown// Copyright 2010 The Android Open Source Project
37901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown//
47901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
57901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#include <utils/Looper.h>
67901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#include <utils/Timers.h>
77901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#include <utils/StopWatch.h>
87901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#include <gtest/gtest.h>
97901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#include <unistd.h>
107901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#include <time.h>
117901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
127901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#include "TestHelpers.h"
137901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
147901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown// # of milliseconds to fudge stopwatch measurements
157901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown#define TIMING_TOLERANCE_MS 25
167901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
177901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownnamespace android {
187901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
193e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brownenum {
203e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    MSG_TEST1 = 1,
213e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    MSG_TEST2 = 2,
223e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    MSG_TEST3 = 3,
233e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    MSG_TEST4 = 4,
243e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown};
253e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
267901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownclass DelayedWake : public DelayedTask {
277901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    sp<Looper> mLooper;
287901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
297901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownpublic:
307901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    DelayedWake(int delayMillis, const sp<Looper> looper) :
317901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        DelayedTask(delayMillis), mLooper(looper) {
327901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    }
337901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
347901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownprotected:
357901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    virtual void doTask() {
367901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        mLooper->wake();
377901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    }
387901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown};
397901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
407901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownclass DelayedWriteSignal : public DelayedTask {
417901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Pipe* mPipe;
427901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
437901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownpublic:
447901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    DelayedWriteSignal(int delayMillis, Pipe* pipe) :
457901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        DelayedTask(delayMillis), mPipe(pipe) {
467901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    }
477901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
487901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownprotected:
497901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    virtual void doTask() {
507901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        mPipe->writeSignal();
517901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    }
527901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown};
537901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
547901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownclass CallbackHandler {
557901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownpublic:
567901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    void setCallback(const sp<Looper>& looper, int fd, int events) {
577901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        looper->addFd(fd, 0, events, staticHandler, this);
587901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    }
597901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
607901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownprotected:
617901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    virtual ~CallbackHandler() { }
627901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
637901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    virtual int handler(int fd, int events) = 0;
647901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
657901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownprivate:
667901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    static int staticHandler(int fd, int events, void* data) {
677901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        return static_cast<CallbackHandler*>(data)->handler(fd, events);
687901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    }
697901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown};
707901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
717901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownclass StubCallbackHandler : public CallbackHandler {
727901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownpublic:
737901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int nextResult;
747901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int callbackCount;
757901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
767901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int fd;
777901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int events;
787901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
797901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StubCallbackHandler(int nextResult) : nextResult(nextResult),
807901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            callbackCount(0), fd(-1), events(-1) {
817901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    }
827901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
837901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownprotected:
847901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    virtual int handler(int fd, int events) {
857901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        callbackCount += 1;
867901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        this->fd = fd;
877901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        this->events = events;
887901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        return nextResult;
897901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    }
907901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown};
917901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
923e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brownclass StubMessageHandler : public MessageHandler {
933e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brownpublic:
943e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    Vector<Message> messages;
953e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
963e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    virtual void handleMessage(const Message& message) {
973e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown        messages.push(message);
983e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    }
993e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown};
1003e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
1017901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownclass LooperTest : public testing::Test {
1027901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brownprotected:
1037901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    sp<Looper> mLooper;
1047901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1057901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    virtual void SetUp() {
1067901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        mLooper = new Looper(true);
1077901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    }
1087901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1097901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    virtual void TearDown() {
1107901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown        mLooper.clear();
1117901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    }
1127901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown};
1137901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1147901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1157901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndNotAwoken_WaitsForTimeout) {
1167901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StopWatch stopWatch("pollOnce");
1177901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->pollOnce(100);
1187901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
1197901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1207901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
1217901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "elapsed time should approx. equal timeout";
1221693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_TIMEOUT, result)
1231693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be LOOPER_POLL_TIMEOUT";
1247901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
1257901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1267901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndAwokenBeforeWaiting_ImmediatelyReturns) {
1277901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    mLooper->wake();
1287901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1297901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StopWatch stopWatch("pollOnce");
1307901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->pollOnce(1000);
1317901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
1327901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1337901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
1347901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "elapsed time should approx. zero because wake() was called before waiting";
1351693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_WAKE, result)
1361693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because loop was awoken";
1377901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
1387901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1397901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndAwokenWhileWaiting_PromptlyReturns) {
1407901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    sp<DelayedWake> delayedWake = new DelayedWake(100, mLooper);
141e71b9147756ab4da306e4c16461ad23936769603Brian Carlstrom    delayedWake->run("LooperTest");
1427901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1437901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StopWatch stopWatch("pollOnce");
1447901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->pollOnce(1000);
1457901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
1467901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1477901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
1487901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "elapsed time should approx. equal wake delay";
1491693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_WAKE, result)
1501693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because loop was awoken";
1517901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
1527901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1537901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, PollOnce_WhenZeroTimeoutAndNoRegisteredFDs_ImmediatelyReturns) {
1547901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StopWatch stopWatch("pollOnce");
1557901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->pollOnce(0);
1567901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
1577901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1587901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
1597901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "elapsed time should be approx. zero";
1601693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_TIMEOUT, result)
1611693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_TIMEOUT";
1627901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
1637901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1647901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, PollOnce_WhenZeroTimeoutAndNoSignalledFDs_ImmediatelyReturns) {
1657901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Pipe pipe;
1667901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StubCallbackHandler handler(true);
1677901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1681693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
1697901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1707901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StopWatch stopWatch("pollOnce");
1717901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->pollOnce(0);
1727901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
1737901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1747901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
1757901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "elapsed time should be approx. zero";
1761693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_TIMEOUT, result)
1771693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_TIMEOUT";
1787901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(0, handler.callbackCount)
1797901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "callback should not have been invoked because FD was not signalled";
1807901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
1817901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1827901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, PollOnce_WhenZeroTimeoutAndSignalledFD_ImmediatelyInvokesCallbackAndReturns) {
1837901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Pipe pipe;
1847901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StubCallbackHandler handler(true);
1857901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1867901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    ASSERT_EQ(OK, pipe.writeSignal());
1871693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
1887901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1897901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StopWatch stopWatch("pollOnce");
1907901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->pollOnce(0);
1917901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
1927901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
1937901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
1947901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "elapsed time should be approx. zero";
1951693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_CALLBACK, result)
1961693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because FD was signalled";
1977901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(1, handler.callbackCount)
1987901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "callback should be invoked exactly once";
1997901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(pipe.receiveFd, handler.fd)
2007901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "callback should have received pipe fd as parameter";
2011693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::EVENT_INPUT, handler.events)
2021693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "callback should have received Looper::EVENT_INPUT as events";
2037901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
2047901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2057901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndNoSignalledFDs_WaitsForTimeoutAndReturns) {
2067901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Pipe pipe;
2077901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StubCallbackHandler handler(true);
2087901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2091693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
2107901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2117901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StopWatch stopWatch("pollOnce");
2127901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->pollOnce(100);
2137901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
2147901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2157901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
2167901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "elapsed time should approx. equal timeout";
2171693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_TIMEOUT, result)
2181693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_TIMEOUT";
2197901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(0, handler.callbackCount)
2207901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "callback should not have been invoked because FD was not signalled";
2217901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
2227901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2237901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndSignalledFDBeforeWaiting_ImmediatelyInvokesCallbackAndReturns) {
2247901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Pipe pipe;
2257901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StubCallbackHandler handler(true);
2267901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2277901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    pipe.writeSignal();
2281693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
2297901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2307901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StopWatch stopWatch("pollOnce");
2317901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->pollOnce(100);
2327901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
2337901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2347901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    ASSERT_EQ(OK, pipe.readSignal())
2357901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "signal should actually have been written";
2367901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
2377901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "elapsed time should be approx. zero";
2381693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_CALLBACK, result)
2391693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because FD was signalled";
2407901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(1, handler.callbackCount)
2417901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "callback should be invoked exactly once";
2427901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(pipe.receiveFd, handler.fd)
2437901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "callback should have received pipe fd as parameter";
2441693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::EVENT_INPUT, handler.events)
2451693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "callback should have received Looper::EVENT_INPUT as events";
2467901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
2477901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2487901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndSignalledFDWhileWaiting_PromptlyInvokesCallbackAndReturns) {
2497901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Pipe pipe;
2507901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StubCallbackHandler handler(true);
2517901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    sp<DelayedWriteSignal> delayedWriteSignal = new DelayedWriteSignal(100, & pipe);
2527901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2531693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
254e71b9147756ab4da306e4c16461ad23936769603Brian Carlstrom    delayedWriteSignal->run("LooperTest");
2557901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2567901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StopWatch stopWatch("pollOnce");
2577901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->pollOnce(1000);
2587901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
2597901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2607901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    ASSERT_EQ(OK, pipe.readSignal())
2617901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "signal should actually have been written";
2627901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
2637901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "elapsed time should approx. equal signal delay";
2641693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_CALLBACK, result)
2651693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because FD was signalled";
2667901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(1, handler.callbackCount)
2677901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "callback should be invoked exactly once";
2687901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(pipe.receiveFd, handler.fd)
2697901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "callback should have received pipe fd as parameter";
2701693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::EVENT_INPUT, handler.events)
2711693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "callback should have received Looper::EVENT_INPUT as events";
2727901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
2737901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2747901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, PollOnce_WhenCallbackAddedThenRemoved_CallbackShouldNotBeInvoked) {
2757901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Pipe pipe;
2767901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StubCallbackHandler handler(true);
2777901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2781693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
2797901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    pipe.writeSignal(); // would cause FD to be considered signalled
2807901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    mLooper->removeFd(pipe.receiveFd);
2817901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2827901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StopWatch stopWatch("pollOnce");
2837901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->pollOnce(100);
2847901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
2857901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2867901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    ASSERT_EQ(OK, pipe.readSignal())
2877901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "signal should actually have been written";
2887901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
2897901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "elapsed time should approx. equal timeout because FD was no longer registered";
2901693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_TIMEOUT, result)
2911693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_TIMEOUT";
2927901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(0, handler.callbackCount)
2937901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "callback should not be invoked";
2947901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
2957901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
2967901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, PollOnce_WhenCallbackReturnsFalse_CallbackShouldNotBeInvokedAgainLater) {
2977901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Pipe pipe;
2987901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StubCallbackHandler handler(false);
2997901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3001693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
3017901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3027901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    // First loop: Callback is registered and FD is signalled.
3037901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    pipe.writeSignal();
3047901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3057901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StopWatch stopWatch("pollOnce");
3067901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->pollOnce(0);
3077901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
3087901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3097901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    ASSERT_EQ(OK, pipe.readSignal())
3107901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "signal should actually have been written";
3117901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
3127901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "elapsed time should approx. equal zero because FD was already signalled";
3131693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_CALLBACK, result)
3141693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because FD was signalled";
3157901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(1, handler.callbackCount)
3167901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "callback should be invoked";
3177901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3187901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    // Second loop: Callback is no longer registered and FD is signalled.
3197901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    pipe.writeSignal();
3207901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3217901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    stopWatch.reset();
3227901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    result = mLooper->pollOnce(0);
3237901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
3247901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3257901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    ASSERT_EQ(OK, pipe.readSignal())
3267901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "signal should actually have been written";
3277901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
3287901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "elapsed time should approx. equal zero because timeout was zero";
3291693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_TIMEOUT, result)
3301693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_TIMEOUT";
3317901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(1, handler.callbackCount)
3327901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "callback should not be invoked this time";
3337901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
3347901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3357901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, PollOnce_WhenNonCallbackFdIsSignalled_ReturnsIdent) {
3367901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    const int expectedIdent = 5;
3377901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    void* expectedData = this;
3387901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3397901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Pipe pipe;
3407901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3417901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    pipe.writeSignal();
3421693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    mLooper->addFd(pipe.receiveFd, expectedIdent, Looper::EVENT_INPUT, NULL, expectedData);
3437901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3447901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StopWatch stopWatch("pollOnce");
3457901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int fd;
3467901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int events;
3477901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    void* data;
3487901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->pollOnce(100, &fd, &events, &data);
3497901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
3507901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3517901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    ASSERT_EQ(OK, pipe.readSignal())
3527901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "signal should actually have been written";
3537901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
3547901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "elapsed time should be approx. zero";
3557901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(expectedIdent, result)
3567901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "pollOnce result should be the ident of the FD that was signalled";
3577901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(pipe.receiveFd, fd)
3587901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "pollOnce should have returned the received pipe fd";
3591693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::EVENT_INPUT, events)
3601693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce should have returned Looper::EVENT_INPUT as events";
3617901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(expectedData, data)
3627901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "pollOnce should have returned the data";
3637901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
3647901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3657901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, AddFd_WhenCallbackAdded_ReturnsOne) {
3667901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Pipe pipe;
3671693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    int result = mLooper->addFd(pipe.receiveFd, 0, Looper::EVENT_INPUT, NULL, NULL);
3687901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3697901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(1, result)
3707901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "addFd should return 1 because FD was added";
3717901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
3727901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3737901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, AddFd_WhenIdentIsNegativeAndCallbackIsNull_ReturnsError) {
3747901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Pipe pipe;
3751693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    int result = mLooper->addFd(pipe.receiveFd, -1, Looper::EVENT_INPUT, NULL, NULL);
3767901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3777901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(-1, result)
3787901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "addFd should return -1 because arguments were invalid";
3797901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
3807901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3817901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, AddFd_WhenNoCallbackAndAllowNonCallbacksIsFalse_ReturnsError) {
3827901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Pipe pipe;
3837901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    sp<Looper> looper = new Looper(false /*allowNonCallbacks*/);
3847901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = looper->addFd(pipe.receiveFd, 0, 0, NULL, NULL);
3857901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3867901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(-1, result)
3877901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "addFd should return -1 because arguments were invalid";
3887901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
3897901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3907901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, RemoveFd_WhenCallbackNotAdded_ReturnsZero) {
3917901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->removeFd(1);
3927901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3937901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(0, result)
3947901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "removeFd should return 0 because FD not registered";
3957901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
3967901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
3977901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, RemoveFd_WhenCallbackAddedThenRemovedTwice_ReturnsOnceFirstTimeAndReturnsZeroSecondTime) {
3987901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Pipe pipe;
3997901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StubCallbackHandler handler(false);
4001693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
4017901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4027901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    // First time.
4037901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->removeFd(pipe.receiveFd);
4047901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4057901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(1, result)
4067901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "removeFd should return 1 first time because FD was registered";
4077901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4087901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    // Second time.
4097901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    result = mLooper->removeFd(pipe.receiveFd);
4107901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4117901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(0, result)
4127901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "removeFd should return 0 second time because FD was no longer registered";
4137901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
4147901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4157901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff BrownTEST_F(LooperTest, PollOnce_WhenCallbackAddedTwice_OnlySecondCallbackShouldBeInvoked) {
4167901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    Pipe pipe;
4177901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StubCallbackHandler handler1(true);
4187901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StubCallbackHandler handler2(true);
4197901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4201693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    handler1.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
4211693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    handler2.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT); // replace it
4227901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    pipe.writeSignal(); // would cause FD to be considered signalled
4237901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4247901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    StopWatch stopWatch("pollOnce");
4257901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int result = mLooper->pollOnce(100);
4267901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
4277901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4287901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    ASSERT_EQ(OK, pipe.readSignal())
4297901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "signal should actually have been written";
4307901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
4317901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "elapsed time should approx. zero because FD was already signalled";
4321693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_CALLBACK, result)
4331693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because FD was signalled";
4347901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(0, handler1.callbackCount)
4357901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "original handler callback should not be invoked because it was replaced";
4367901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown    EXPECT_EQ(1, handler2.callbackCount)
4377901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown            << "replacement handler callback should be invoked";
4387901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown}
4397901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
4403e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff BrownTEST_F(LooperTest, SendMessage_WhenOneMessageIsEnqueue_ShouldInvokeHandlerDuringNextPoll) {
4413e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
4423e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST1));
4433e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
4443e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    StopWatch stopWatch("pollOnce");
4453e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int result = mLooper->pollOnce(100);
4463e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
4473e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
4483e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
4493e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "elapsed time should approx. zero because message was already sent";
4501693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_CALLBACK, result)
4511693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
4523e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
4533e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
4543e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
4553e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
4563e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown}
4573e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
4583e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff BrownTEST_F(LooperTest, SendMessage_WhenMultipleMessagesAreEnqueued_ShouldInvokeHandlersInOrderDuringNextPoll) {
4593e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    sp<StubMessageHandler> handler1 = new StubMessageHandler();
4603e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    sp<StubMessageHandler> handler2 = new StubMessageHandler();
4613e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessage(handler1, Message(MSG_TEST1));
4623e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessage(handler2, Message(MSG_TEST2));
4633e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessage(handler1, Message(MSG_TEST3));
4643e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessage(handler1, Message(MSG_TEST4));
4653e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
4663e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    StopWatch stopWatch("pollOnce");
4673e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int result = mLooper->pollOnce(1000);
4683e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
4693e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
4703e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
4713e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "elapsed time should approx. zero because message was already sent";
4721693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_CALLBACK, result)
4731693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
4743e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(3), handler1->messages.size())
4753e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
4763e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(MSG_TEST1, handler1->messages[0].what)
4773e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
4783e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(MSG_TEST3, handler1->messages[1].what)
4793e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
4803e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(MSG_TEST4, handler1->messages[2].what)
4813e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
4823e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(1), handler2->messages.size())
4833e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
4843e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(MSG_TEST2, handler2->messages[0].what)
4853e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
4863e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown}
4873e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
4883e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff BrownTEST_F(LooperTest, SendMessageDelayed_WhenSentToTheFuture_ShouldInvokeHandlerAfterDelayTime) {
4893e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
4903e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessageDelayed(ms2ns(100), handler, Message(MSG_TEST1));
4913e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
4923e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    StopWatch stopWatch("pollOnce");
4933e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int result = mLooper->pollOnce(1000);
4943e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
4953e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
4963e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
4973e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "first poll should end quickly because next message timeout was computed";
4981693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_WAKE, result)
4991693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_WAKE due to wakeup";
5003e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(0), handler->messages.size())
5013e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "no message handled yet";
5023e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5033e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    result = mLooper->pollOnce(1000);
5043e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
5053e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5063e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
5073e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
5083e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
5093e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
5103e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
5113e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "second poll should end around the time of the delayed message dispatch";
5121693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_CALLBACK, result)
5131693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
5143e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5153e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    result = mLooper->pollOnce(100);
5163e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
5173e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5183e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_NEAR(100 + 100, elapsedMillis, TIMING_TOLERANCE_MS)
5193e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "third poll should timeout";
5201693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_TIMEOUT, result)
5211693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_TIMEOUT because there were no messages left";
5223e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown}
5233e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5243e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff BrownTEST_F(LooperTest, SendMessageDelayed_WhenSentToThePast_ShouldInvokeHandlerDuringNextPoll) {
5253e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
5263e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessageDelayed(ms2ns(-1000), handler, Message(MSG_TEST1));
5273e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5283e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    StopWatch stopWatch("pollOnce");
5293e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int result = mLooper->pollOnce(100);
5303e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
5313e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5323e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
5333e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "elapsed time should approx. zero because message was already sent";
5341693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_CALLBACK, result)
5351693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
5363e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
5373e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
5383e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
5393e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
5403e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown}
5413e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5423e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff BrownTEST_F(LooperTest, SendMessageDelayed_WhenSentToThePresent_ShouldInvokeHandlerDuringNextPoll) {
5433e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
5443e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessageDelayed(0, handler, Message(MSG_TEST1));
5453e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5463e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    StopWatch stopWatch("pollOnce");
5473e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int result = mLooper->pollOnce(100);
5483e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
5493e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5503e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
5513e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "elapsed time should approx. zero because message was already sent";
5521693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_CALLBACK, result)
5531693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
5543e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
5553e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
5563e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
5573e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
5583e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown}
5593e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5603e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff BrownTEST_F(LooperTest, SendMessageAtTime_WhenSentToTheFuture_ShouldInvokeHandlerAfterDelayTime) {
5613e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
5623e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
5633e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessageAtTime(now + ms2ns(100), handler, Message(MSG_TEST1));
5643e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5653e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    StopWatch stopWatch("pollOnce");
5663e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int result = mLooper->pollOnce(1000);
5673e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
5683e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5693e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
5703e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "first poll should end quickly because next message timeout was computed";
5711693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_WAKE, result)
5721693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_WAKE due to wakeup";
5733e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(0), handler->messages.size())
5743e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "no message handled yet";
5753e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5763e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    result = mLooper->pollOnce(1000);
5773e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
5783e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5793e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
5803e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
5813e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
5823e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
5833e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
5843e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "second poll should end around the time of the delayed message dispatch";
5851693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_CALLBACK, result)
5861693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
5873e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5883e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    result = mLooper->pollOnce(100);
5893e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
5903e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5913e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_NEAR(100 + 100, elapsedMillis, TIMING_TOLERANCE_MS)
5923e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "third poll should timeout";
5931693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_TIMEOUT, result)
5941693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_TIMEOUT because there were no messages left";
5953e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown}
5963e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
5973e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff BrownTEST_F(LooperTest, SendMessageAtTime_WhenSentToThePast_ShouldInvokeHandlerDuringNextPoll) {
5983e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
5993e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
6003e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessageAtTime(now - ms2ns(1000), handler, Message(MSG_TEST1));
6013e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6023e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    StopWatch stopWatch("pollOnce");
6033e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int result = mLooper->pollOnce(100);
6043e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
6053e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6063e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
6073e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "elapsed time should approx. zero because message was already sent";
6081693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_CALLBACK, result)
6091693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
6103e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
6113e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
6123e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
6133e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
6143e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown}
6153e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6163e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff BrownTEST_F(LooperTest, SendMessageAtTime_WhenSentToThePresent_ShouldInvokeHandlerDuringNextPoll) {
6173e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
6183e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
6193e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessageAtTime(now, handler, Message(MSG_TEST1));
6203e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6213e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    StopWatch stopWatch("pollOnce");
6223e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int result = mLooper->pollOnce(100);
6233e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
6243e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6253e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
6263e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "elapsed time should approx. zero because message was already sent";
6271693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_CALLBACK, result)
6281693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
6293e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
6303e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
6313e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
6323e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
6333e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown}
6343e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6353e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff BrownTEST_F(LooperTest, RemoveMessage_WhenRemovingAllMessagesForHandler_ShouldRemoveThoseMessage) {
6363e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
6373e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST1));
6383e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST2));
6393e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST3));
6403e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->removeMessages(handler);
6413e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6423e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    StopWatch stopWatch("pollOnce");
6433e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int result = mLooper->pollOnce(0);
6443e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
6453e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6463e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
6473e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "elapsed time should approx. zero because message was sent so looper was awoken";
6481693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_WAKE, result)
6491693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_WAKE because looper was awoken";
6503e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(0), handler->messages.size())
6513e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "no messages to handle";
6523e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6533e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    result = mLooper->pollOnce(0);
6543e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6551693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_TIMEOUT, result)
6561693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_TIMEOUT because there was nothing to do";
6573e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(0), handler->messages.size())
6583e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "no messages to handle";
6593e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown}
6603e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6613e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff BrownTEST_F(LooperTest, RemoveMessage_WhenRemovingSomeMessagesForHandler_ShouldRemoveThoseMessage) {
6623e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
6633e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST1));
6643e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST2));
6653e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST3));
6663e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST4));
6673e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->removeMessages(handler, MSG_TEST3);
6683e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    mLooper->removeMessages(handler, MSG_TEST1);
6693e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6703e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    StopWatch stopWatch("pollOnce");
6713e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int result = mLooper->pollOnce(0);
6723e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
6733e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6743e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
6753e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "elapsed time should approx. zero because message was sent so looper was awoken";
6761693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_CALLBACK, result)
6771693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_CALLBACK because two messages were sent";
6783e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(2), handler->messages.size())
6793e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "no messages to handle";
6803e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(MSG_TEST2, handler->messages[0].what)
6813e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
6823e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(MSG_TEST4, handler->messages[1].what)
6833e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "handled message";
6843e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6853e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    result = mLooper->pollOnce(0);
6863e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown
6871693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom    EXPECT_EQ(Looper::POLL_TIMEOUT, result)
6881693d7e48f976c2615100378c7e98d245e0213beBrian Carlstrom            << "pollOnce result should be Looper::POLL_TIMEOUT because there was nothing to do";
6893e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown    EXPECT_EQ(size_t(2), handler->messages.size())
6903e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown            << "no more messages to handle";
6913e2e38bc5bbf658eb9940f72974270b11c5b84e1Jeff Brown}
6927901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown
6937901eb25c60b1df00050d6c3772505d8dcfcdab9Jeff Brown} // namespace android
694