14fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown//
24fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown// Copyright 2010 The Android Open Source Project
34fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown//
44fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
54fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#include <utils/Looper.h>
64fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#include <utils/Timers.h>
74fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#include <utils/StopWatch.h>
84fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#include <gtest/gtest.h>
94fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#include <unistd.h>
104fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#include <time.h>
114fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
124fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#include "TestHelpers.h"
134fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
144fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown// # of milliseconds to fudge stopwatch measurements
154fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#define TIMING_TOLERANCE_MS 25
164fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
174fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownnamespace android {
184fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownenum {
2005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    MSG_TEST1 = 1,
2105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    MSG_TEST2 = 2,
2205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    MSG_TEST3 = 3,
2305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    MSG_TEST4 = 4,
2405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown};
2505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
264fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownclass DelayedWake : public DelayedTask {
274fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    sp<Looper> mLooper;
284fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
294fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownpublic:
304fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    DelayedWake(int delayMillis, const sp<Looper> looper) :
314fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        DelayedTask(delayMillis), mLooper(looper) {
324fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    }
334fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
344fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownprotected:
354fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    virtual void doTask() {
364fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        mLooper->wake();
374fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    }
384fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown};
394fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
404fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownclass DelayedWriteSignal : public DelayedTask {
414fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    Pipe* mPipe;
424fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
434fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownpublic:
444fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    DelayedWriteSignal(int delayMillis, Pipe* pipe) :
454fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        DelayedTask(delayMillis), mPipe(pipe) {
464fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    }
474fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
484fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownprotected:
494fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    virtual void doTask() {
504fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        mPipe->writeSignal();
514fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    }
524fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown};
534fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
544fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownclass CallbackHandler {
554fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownpublic:
564fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    void setCallback(const sp<Looper>& looper, int fd, int events) {
574fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        looper->addFd(fd, 0, events, staticHandler, this);
584fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    }
594fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
604fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownprotected:
614fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    virtual ~CallbackHandler() { }
624fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
634fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    virtual int handler(int fd, int events) = 0;
644fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
654fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownprivate:
664fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    static int staticHandler(int fd, int events, void* data) {
674fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        return static_cast<CallbackHandler*>(data)->handler(fd, events);
684fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    }
694fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown};
704fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
714fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownclass StubCallbackHandler : public CallbackHandler {
724fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownpublic:
734fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int nextResult;
744fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int callbackCount;
754fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
764fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int fd;
774fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int events;
784fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
794fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StubCallbackHandler(int nextResult) : nextResult(nextResult),
804fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            callbackCount(0), fd(-1), events(-1) {
814fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    }
824fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
834fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownprotected:
844fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    virtual int handler(int fd, int events) {
854fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        callbackCount += 1;
864fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        this->fd = fd;
874fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        this->events = events;
884fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        return nextResult;
894fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    }
904fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown};
914fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
9205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownclass StubMessageHandler : public MessageHandler {
9305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brownpublic:
9405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    Vector<Message> messages;
9505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
9605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    virtual void handleMessage(const Message& message) {
9705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown        messages.push(message);
9805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    }
9905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown};
10005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
1014fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownclass LooperTest : public testing::Test {
1024fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownprotected:
1034fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    sp<Looper> mLooper;
1044fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1054fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    virtual void SetUp() {
1064fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        mLooper = new Looper(true);
1074fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    }
1084fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1094fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    virtual void TearDown() {
1104fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown        mLooper.clear();
1114fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    }
1124fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown};
1134fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1144fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1154fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndNotAwoken_WaitsForTimeout) {
1164fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StopWatch stopWatch("pollOnce");
1174fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->pollOnce(100);
1184fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
1194fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1204fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
1214fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "elapsed time should approx. equal timeout";
1224fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
1234fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT";
1244fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
1254fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1264fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndAwokenBeforeWaiting_ImmediatelyReturns) {
1274fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    mLooper->wake();
1284fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1294fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StopWatch stopWatch("pollOnce");
1304fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->pollOnce(1000);
1314fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
1324fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1334fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
1344fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "elapsed time should approx. zero because wake() was called before waiting";
1354fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_POLL_WAKE, result)
1364fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because loop was awoken";
1374fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
1384fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1394fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndAwokenWhileWaiting_PromptlyReturns) {
1404fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    sp<DelayedWake> delayedWake = new DelayedWake(100, mLooper);
1414fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    delayedWake->run();
1424fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1434fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StopWatch stopWatch("pollOnce");
1444fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->pollOnce(1000);
1454fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
1464fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1474fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
1484fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "elapsed time should approx. equal wake delay";
1494fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_POLL_WAKE, result)
1504fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because loop was awoken";
1514fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
1524fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1534fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, PollOnce_WhenZeroTimeoutAndNoRegisteredFDs_ImmediatelyReturns) {
1544fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StopWatch stopWatch("pollOnce");
1554fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->pollOnce(0);
1564fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
1574fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1584fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
1594fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "elapsed time should be approx. zero";
1604fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
1614fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT";
1624fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
1634fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1644fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, PollOnce_WhenZeroTimeoutAndNoSignalledFDs_ImmediatelyReturns) {
1654fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    Pipe pipe;
1664fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StubCallbackHandler handler(true);
1674fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1684fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
1694fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1704fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StopWatch stopWatch("pollOnce");
1714fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->pollOnce(0);
1724fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
1734fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1744fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
1754fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "elapsed time should be approx. zero";
1764fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
1774fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT";
1784fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(0, handler.callbackCount)
1794fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "callback should not have been invoked because FD was not signalled";
1804fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
1814fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1824fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, PollOnce_WhenZeroTimeoutAndSignalledFD_ImmediatelyInvokesCallbackAndReturns) {
1834fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    Pipe pipe;
1844fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StubCallbackHandler handler(true);
1854fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1864fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    ASSERT_EQ(OK, pipe.writeSignal());
1874fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
1884fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1894fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StopWatch stopWatch("pollOnce");
1904fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->pollOnce(0);
1914fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
1924fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
1934fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
1944fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "elapsed time should be approx. zero";
1954fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
1964fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because FD was signalled";
1974fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(1, handler.callbackCount)
1984fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "callback should be invoked exactly once";
1994fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(pipe.receiveFd, handler.fd)
2004fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "callback should have received pipe fd as parameter";
2014fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_EVENT_INPUT, handler.events)
2024fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "callback should have received ALOOPER_EVENT_INPUT as events";
2034fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
2044fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2054fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndNoSignalledFDs_WaitsForTimeoutAndReturns) {
2064fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    Pipe pipe;
2074fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StubCallbackHandler handler(true);
2084fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2094fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
2104fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2114fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StopWatch stopWatch("pollOnce");
2124fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->pollOnce(100);
2134fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
2144fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2154fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
2164fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "elapsed time should approx. equal timeout";
2174fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
2184fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT";
2194fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(0, handler.callbackCount)
2204fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "callback should not have been invoked because FD was not signalled";
2214fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
2224fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2234fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndSignalledFDBeforeWaiting_ImmediatelyInvokesCallbackAndReturns) {
2244fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    Pipe pipe;
2254fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StubCallbackHandler handler(true);
2264fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2274fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    pipe.writeSignal();
2284fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
2294fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2304fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StopWatch stopWatch("pollOnce");
2314fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->pollOnce(100);
2324fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
2334fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2344fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    ASSERT_EQ(OK, pipe.readSignal())
2354fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "signal should actually have been written";
2364fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
2374fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "elapsed time should be approx. zero";
2384fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
2394fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because FD was signalled";
2404fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(1, handler.callbackCount)
2414fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "callback should be invoked exactly once";
2424fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(pipe.receiveFd, handler.fd)
2434fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "callback should have received pipe fd as parameter";
2444fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_EVENT_INPUT, handler.events)
2454fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "callback should have received ALOOPER_EVENT_INPUT as events";
2464fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
2474fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2484fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndSignalledFDWhileWaiting_PromptlyInvokesCallbackAndReturns) {
2494fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    Pipe pipe;
2504fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StubCallbackHandler handler(true);
2514fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    sp<DelayedWriteSignal> delayedWriteSignal = new DelayedWriteSignal(100, & pipe);
2524fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2534fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
2544fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    delayedWriteSignal->run();
2554fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2564fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StopWatch stopWatch("pollOnce");
2574fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->pollOnce(1000);
2584fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
2594fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2604fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    ASSERT_EQ(OK, pipe.readSignal())
2614fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "signal should actually have been written";
2624fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
2634fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "elapsed time should approx. equal signal delay";
2644fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
2654fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because FD was signalled";
2664fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(1, handler.callbackCount)
2674fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "callback should be invoked exactly once";
2684fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(pipe.receiveFd, handler.fd)
2694fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "callback should have received pipe fd as parameter";
2704fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_EVENT_INPUT, handler.events)
2714fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "callback should have received ALOOPER_EVENT_INPUT as events";
2724fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
2734fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2744fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, PollOnce_WhenCallbackAddedThenRemoved_CallbackShouldNotBeInvoked) {
2754fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    Pipe pipe;
2764fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StubCallbackHandler handler(true);
2774fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2784fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
2794fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    pipe.writeSignal(); // would cause FD to be considered signalled
2804fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    mLooper->removeFd(pipe.receiveFd);
2814fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2824fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StopWatch stopWatch("pollOnce");
2834fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->pollOnce(100);
2844fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
2854fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2864fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    ASSERT_EQ(OK, pipe.readSignal())
2874fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "signal should actually have been written";
2884fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
2894fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "elapsed time should approx. equal timeout because FD was no longer registered";
2904fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
2914fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT";
2924fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(0, handler.callbackCount)
2934fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "callback should not be invoked";
2944fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
2954fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
2964fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, PollOnce_WhenCallbackReturnsFalse_CallbackShouldNotBeInvokedAgainLater) {
2974fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    Pipe pipe;
2984fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StubCallbackHandler handler(false);
2994fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3004fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
3014fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3024fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    // First loop: Callback is registered and FD is signalled.
3034fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    pipe.writeSignal();
3044fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3054fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StopWatch stopWatch("pollOnce");
3064fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->pollOnce(0);
3074fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
3084fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3094fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    ASSERT_EQ(OK, pipe.readSignal())
3104fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "signal should actually have been written";
3114fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
3124fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "elapsed time should approx. equal zero because FD was already signalled";
3134fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
3144fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because FD was signalled";
3154fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(1, handler.callbackCount)
3164fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "callback should be invoked";
3174fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3184fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    // Second loop: Callback is no longer registered and FD is signalled.
3194fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    pipe.writeSignal();
3204fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3214fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    stopWatch.reset();
3224fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    result = mLooper->pollOnce(0);
3234fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
3244fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3254fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    ASSERT_EQ(OK, pipe.readSignal())
3264fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "signal should actually have been written";
3274fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
3284fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "elapsed time should approx. equal zero because timeout was zero";
3294fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
3304fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT";
3314fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(1, handler.callbackCount)
3324fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "callback should not be invoked this time";
3334fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
3344fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3354fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, PollOnce_WhenNonCallbackFdIsSignalled_ReturnsIdent) {
3364fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    const int expectedIdent = 5;
3374fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    void* expectedData = this;
3384fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3394fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    Pipe pipe;
3404fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3414fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    pipe.writeSignal();
3424fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    mLooper->addFd(pipe.receiveFd, expectedIdent, ALOOPER_EVENT_INPUT, NULL, expectedData);
3434fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3444fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StopWatch stopWatch("pollOnce");
3454fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int fd;
3464fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int events;
3474fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    void* data;
3484fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->pollOnce(100, &fd, &events, &data);
3494fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
3504fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3514fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    ASSERT_EQ(OK, pipe.readSignal())
3524fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "signal should actually have been written";
3534fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
3544fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "elapsed time should be approx. zero";
3554fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(expectedIdent, result)
3564fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce result should be the ident of the FD that was signalled";
3574fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(pipe.receiveFd, fd)
3584fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce should have returned the received pipe fd";
3594fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_EVENT_INPUT, events)
3604fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce should have returned ALOOPER_EVENT_INPUT as events";
3614fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(expectedData, data)
3624fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce should have returned the data";
3634fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
3644fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3654fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, AddFd_WhenCallbackAdded_ReturnsOne) {
3664fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    Pipe pipe;
3674fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->addFd(pipe.receiveFd, 0, ALOOPER_EVENT_INPUT, NULL, NULL);
3684fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3694fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(1, result)
3704fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "addFd should return 1 because FD was added";
3714fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
3724fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3734fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, AddFd_WhenIdentIsNegativeAndCallbackIsNull_ReturnsError) {
3744fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    Pipe pipe;
3754fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->addFd(pipe.receiveFd, -1, ALOOPER_EVENT_INPUT, NULL, NULL);
3764fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3774fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(-1, result)
3784fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "addFd should return -1 because arguments were invalid";
3794fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
3804fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3814fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, AddFd_WhenNoCallbackAndAllowNonCallbacksIsFalse_ReturnsError) {
3824fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    Pipe pipe;
3834fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    sp<Looper> looper = new Looper(false /*allowNonCallbacks*/);
3844fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = looper->addFd(pipe.receiveFd, 0, 0, NULL, NULL);
3854fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3864fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(-1, result)
3874fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "addFd should return -1 because arguments were invalid";
3884fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
3894fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3904fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, RemoveFd_WhenCallbackNotAdded_ReturnsZero) {
3914fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->removeFd(1);
3924fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3934fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(0, result)
3944fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "removeFd should return 0 because FD not registered";
3954fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
3964fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
3974fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, RemoveFd_WhenCallbackAddedThenRemovedTwice_ReturnsOnceFirstTimeAndReturnsZeroSecondTime) {
3984fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    Pipe pipe;
3994fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StubCallbackHandler handler(false);
4004fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
4014fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
4024fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    // First time.
4034fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->removeFd(pipe.receiveFd);
4044fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
4054fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(1, result)
4064fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "removeFd should return 1 first time because FD was registered";
4074fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
4084fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    // Second time.
4094fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    result = mLooper->removeFd(pipe.receiveFd);
4104fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
4114fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(0, result)
4124fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "removeFd should return 0 second time because FD was no longer registered";
4134fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
4144fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
4154fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff BrownTEST_F(LooperTest, PollOnce_WhenCallbackAddedTwice_OnlySecondCallbackShouldBeInvoked) {
4164fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    Pipe pipe;
4174fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StubCallbackHandler handler1(true);
4184fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StubCallbackHandler handler2(true);
4194fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
4204fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    handler1.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
4214fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    handler2.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT); // replace it
4224fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    pipe.writeSignal(); // would cause FD to be considered signalled
4234fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
4244fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    StopWatch stopWatch("pollOnce");
4254fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int result = mLooper->pollOnce(100);
4264fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
4274fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
4284fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    ASSERT_EQ(OK, pipe.readSignal())
4294fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "signal should actually have been written";
4304fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
4314fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "elapsed time should approx. zero because FD was already signalled";
4324fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
4334fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because FD was signalled";
4344fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(0, handler1.callbackCount)
4354fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "original handler callback should not be invoked because it was replaced";
4364fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown    EXPECT_EQ(1, handler2.callbackCount)
4374fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown            << "replacement handler callback should be invoked";
4384fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown}
4394fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
44005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff BrownTEST_F(LooperTest, SendMessage_WhenOneMessageIsEnqueue_ShouldInvokeHandlerDuringNextPoll) {
44105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
44205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST1));
44305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
44405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    StopWatch stopWatch("pollOnce");
44505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int result = mLooper->pollOnce(100);
44605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
44705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
44805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
44905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "elapsed time should approx. zero because message was already sent";
45005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
45105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
45205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
45305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
45405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
45505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
45605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown}
45705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
45805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff BrownTEST_F(LooperTest, SendMessage_WhenMultipleMessagesAreEnqueued_ShouldInvokeHandlersInOrderDuringNextPoll) {
45905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    sp<StubMessageHandler> handler1 = new StubMessageHandler();
46005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    sp<StubMessageHandler> handler2 = new StubMessageHandler();
46105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessage(handler1, Message(MSG_TEST1));
46205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessage(handler2, Message(MSG_TEST2));
46305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessage(handler1, Message(MSG_TEST3));
46405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessage(handler1, Message(MSG_TEST4));
46505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
46605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    StopWatch stopWatch("pollOnce");
46705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int result = mLooper->pollOnce(1000);
46805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
46905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
47005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
47105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "elapsed time should approx. zero because message was already sent";
47205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
47305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
47405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(3), handler1->messages.size())
47505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
47605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(MSG_TEST1, handler1->messages[0].what)
47705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
47805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(MSG_TEST3, handler1->messages[1].what)
47905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
48005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(MSG_TEST4, handler1->messages[2].what)
48105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
48205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(1), handler2->messages.size())
48305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
48405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(MSG_TEST2, handler2->messages[0].what)
48505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
48605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown}
48705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
48805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff BrownTEST_F(LooperTest, SendMessageDelayed_WhenSentToTheFuture_ShouldInvokeHandlerAfterDelayTime) {
48905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
49005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessageDelayed(ms2ns(100), handler, Message(MSG_TEST1));
49105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
49205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    StopWatch stopWatch("pollOnce");
49305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int result = mLooper->pollOnce(1000);
49405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
49505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
49605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
49705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "first poll should end quickly because next message timeout was computed";
49805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_WAKE, result)
49905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_WAKE due to wakeup";
50005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(0), handler->messages.size())
50105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "no message handled yet";
50205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
50305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    result = mLooper->pollOnce(1000);
50405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
50505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
50605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
50705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
50805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
50905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
51005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
51105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "second poll should end around the time of the delayed message dispatch";
51205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
51305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
51405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
51505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    result = mLooper->pollOnce(100);
51605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
51705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
51805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_NEAR(100 + 100, elapsedMillis, TIMING_TOLERANCE_MS)
51905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "third poll should timeout";
52005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
52105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT because there were no messages left";
52205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown}
52305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
52405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff BrownTEST_F(LooperTest, SendMessageDelayed_WhenSentToThePast_ShouldInvokeHandlerDuringNextPoll) {
52505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
52605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessageDelayed(ms2ns(-1000), handler, Message(MSG_TEST1));
52705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
52805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    StopWatch stopWatch("pollOnce");
52905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int result = mLooper->pollOnce(100);
53005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
53105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
53205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
53305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "elapsed time should approx. zero because message was already sent";
53405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
53505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
53605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
53705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
53805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
53905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
54005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown}
54105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
54205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff BrownTEST_F(LooperTest, SendMessageDelayed_WhenSentToThePresent_ShouldInvokeHandlerDuringNextPoll) {
54305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
54405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessageDelayed(0, handler, Message(MSG_TEST1));
54505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
54605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    StopWatch stopWatch("pollOnce");
54705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int result = mLooper->pollOnce(100);
54805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
54905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
55005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
55105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "elapsed time should approx. zero because message was already sent";
55205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
55305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
55405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
55505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
55605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
55705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
55805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown}
55905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
56005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff BrownTEST_F(LooperTest, SendMessageAtTime_WhenSentToTheFuture_ShouldInvokeHandlerAfterDelayTime) {
56105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
56205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
56305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessageAtTime(now + ms2ns(100), handler, Message(MSG_TEST1));
56405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
56505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    StopWatch stopWatch("pollOnce");
56605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int result = mLooper->pollOnce(1000);
56705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
56805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
56905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
57005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "first poll should end quickly because next message timeout was computed";
57105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_WAKE, result)
57205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_WAKE due to wakeup";
57305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(0), handler->messages.size())
57405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "no message handled yet";
57505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
57605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    result = mLooper->pollOnce(1000);
57705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
57805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
57905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
58005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
58105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
58205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
58305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
58405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "second poll should end around the time of the delayed message dispatch";
58505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
58605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
58705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
58805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    result = mLooper->pollOnce(100);
58905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
59005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
59105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_NEAR(100 + 100, elapsedMillis, TIMING_TOLERANCE_MS)
59205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "third poll should timeout";
59305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
59405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT because there were no messages left";
59505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown}
59605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
59705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff BrownTEST_F(LooperTest, SendMessageAtTime_WhenSentToThePast_ShouldInvokeHandlerDuringNextPoll) {
59805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
59905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
60005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessageAtTime(now - ms2ns(1000), handler, Message(MSG_TEST1));
60105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
60205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    StopWatch stopWatch("pollOnce");
60305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int result = mLooper->pollOnce(100);
60405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
60505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
60605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
60705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "elapsed time should approx. zero because message was already sent";
60805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
60905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
61005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
61105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
61205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
61305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
61405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown}
61505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
61605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff BrownTEST_F(LooperTest, SendMessageAtTime_WhenSentToThePresent_ShouldInvokeHandlerDuringNextPoll) {
61705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
61805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
61905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessageAtTime(now, handler, Message(MSG_TEST1));
62005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
62105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    StopWatch stopWatch("pollOnce");
62205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int result = mLooper->pollOnce(100);
62305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
62405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
62505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
62605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "elapsed time should approx. zero because message was already sent";
62705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
62805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
62905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
63005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
63105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
63205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
63305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown}
63405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
63505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff BrownTEST_F(LooperTest, RemoveMessage_WhenRemovingAllMessagesForHandler_ShouldRemoveThoseMessage) {
63605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
63705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST1));
63805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST2));
63905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST3));
64005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->removeMessages(handler);
64105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
64205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    StopWatch stopWatch("pollOnce");
64305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int result = mLooper->pollOnce(0);
64405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
64505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
64605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
64705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "elapsed time should approx. zero because message was sent so looper was awoken";
64805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_WAKE, result)
64905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_WAKE because looper was awoken";
65005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(0), handler->messages.size())
65105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "no messages to handle";
65205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
65305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    result = mLooper->pollOnce(0);
65405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
65505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
65605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT because there was nothing to do";
65705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(0), handler->messages.size())
65805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "no messages to handle";
65905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown}
66005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
66105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff BrownTEST_F(LooperTest, RemoveMessage_WhenRemovingSomeMessagesForHandler_ShouldRemoveThoseMessage) {
66205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
66305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST1));
66405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST2));
66505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST3));
66605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST4));
66705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->removeMessages(handler, MSG_TEST3);
66805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    mLooper->removeMessages(handler, MSG_TEST1);
66905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
67005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    StopWatch stopWatch("pollOnce");
67105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int result = mLooper->pollOnce(0);
67205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
67305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
67405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
67505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "elapsed time should approx. zero because message was sent so looper was awoken";
67605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
67705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because two messages were sent";
67805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(2), handler->messages.size())
67905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "no messages to handle";
68005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(MSG_TEST2, handler->messages[0].what)
68105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
68205dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(MSG_TEST4, handler->messages[1].what)
68305dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "handled message";
68405dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
68505dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    result = mLooper->pollOnce(0);
68605dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown
68705dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
68805dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT because there was nothing to do";
68905dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown    EXPECT_EQ(size_t(2), handler->messages.size())
69005dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown            << "no more messages to handle";
69105dc66ada6b61a6bdf806ffaa62617ac5394695dJeff Brown}
6924fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown
6934fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown} // namespace android
694