159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown//
259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown// Copyright 2010 The Android Open Source Project
359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown//
459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#include <utils/Looper.h>
659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#include <utils/Timers.h>
759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#include <utils/StopWatch.h>
859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#include <gtest/gtest.h>
959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#include <unistd.h>
1059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#include <time.h>
1159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
1259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#include "TestHelpers.h"
1359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
1459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown// # of milliseconds to fudge stopwatch measurements
1559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown#define TIMING_TOLERANCE_MS 25
1659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
1759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownnamespace android {
1859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
1980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brownenum {
2080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    MSG_TEST1 = 1,
2180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    MSG_TEST2 = 2,
2280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    MSG_TEST3 = 3,
2380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    MSG_TEST4 = 4,
2480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown};
2580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
2659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownclass DelayedWake : public DelayedTask {
2759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    sp<Looper> mLooper;
2859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
2959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownpublic:
3059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    DelayedWake(int delayMillis, const sp<Looper> looper) :
3159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown        DelayedTask(delayMillis), mLooper(looper) {
3259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    }
3359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
3459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownprotected:
3559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    virtual void doTask() {
3659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown        mLooper->wake();
3759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    }
3859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown};
3959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
4059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownclass DelayedWriteSignal : public DelayedTask {
4159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    Pipe* mPipe;
4259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
4359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownpublic:
4459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    DelayedWriteSignal(int delayMillis, Pipe* pipe) :
4559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown        DelayedTask(delayMillis), mPipe(pipe) {
4659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    }
4759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
4859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownprotected:
4959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    virtual void doTask() {
5059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown        mPipe->writeSignal();
5159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    }
5259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown};
5359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
5459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownclass CallbackHandler {
5559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownpublic:
5659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    void setCallback(const sp<Looper>& looper, int fd, int events) {
5759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown        looper->addFd(fd, 0, events, staticHandler, this);
5859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    }
5959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
6059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownprotected:
6159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    virtual ~CallbackHandler() { }
6259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
6359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    virtual int handler(int fd, int events) = 0;
6459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
6559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownprivate:
6659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    static int staticHandler(int fd, int events, void* data) {
6759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown        return static_cast<CallbackHandler*>(data)->handler(fd, events);
6859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    }
6959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown};
7059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
7159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownclass StubCallbackHandler : public CallbackHandler {
7259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownpublic:
7359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int nextResult;
7459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int callbackCount;
7559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
7659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int fd;
7759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int events;
7859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
7959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StubCallbackHandler(int nextResult) : nextResult(nextResult),
8059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            callbackCount(0), fd(-1), events(-1) {
8159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    }
8259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
8359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownprotected:
8459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    virtual int handler(int fd, int events) {
8559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown        callbackCount += 1;
8659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown        this->fd = fd;
8759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown        this->events = events;
8859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown        return nextResult;
8959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    }
9059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown};
9159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
9280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brownclass StubMessageHandler : public MessageHandler {
9380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brownpublic:
9480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    Vector<Message> messages;
9580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
9680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    virtual void handleMessage(const Message& message) {
9780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown        messages.push(message);
9880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    }
9980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown};
10080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
10159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownclass LooperTest : public testing::Test {
10259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brownprotected:
10359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    sp<Looper> mLooper;
10459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
10559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    virtual void SetUp() {
10659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown        mLooper = new Looper(true);
10759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    }
10859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
10959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    virtual void TearDown() {
11059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown        mLooper.clear();
11159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    }
11259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown};
11359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
11459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
11559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndNotAwoken_WaitsForTimeout) {
11659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StopWatch stopWatch("pollOnce");
11759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->pollOnce(100);
11859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
11959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
12059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
12159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "elapsed time should approx. equal timeout";
12259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
12359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT";
12459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
12559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
12659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndAwokenBeforeWaiting_ImmediatelyReturns) {
12759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    mLooper->wake();
12859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
12959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StopWatch stopWatch("pollOnce");
13059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->pollOnce(1000);
13159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
13259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
13359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
13459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "elapsed time should approx. zero because wake() was called before waiting";
13559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_POLL_WAKE, result)
13659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because loop was awoken";
13759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
13859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
13959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndAwokenWhileWaiting_PromptlyReturns) {
14059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    sp<DelayedWake> delayedWake = new DelayedWake(100, mLooper);
14159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    delayedWake->run();
14259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
14359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StopWatch stopWatch("pollOnce");
14459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->pollOnce(1000);
14559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
14659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
14759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
14859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "elapsed time should approx. equal wake delay";
14959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_POLL_WAKE, result)
15059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because loop was awoken";
15159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
15259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
15359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, PollOnce_WhenZeroTimeoutAndNoRegisteredFDs_ImmediatelyReturns) {
15459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StopWatch stopWatch("pollOnce");
15559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->pollOnce(0);
15659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
15759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
15859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
15959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "elapsed time should be approx. zero";
16059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
16159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT";
16259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
16359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
16459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, PollOnce_WhenZeroTimeoutAndNoSignalledFDs_ImmediatelyReturns) {
16559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    Pipe pipe;
16659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StubCallbackHandler handler(true);
16759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
16859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
16959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
17059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StopWatch stopWatch("pollOnce");
17159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->pollOnce(0);
17259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
17359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
17459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
17559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "elapsed time should be approx. zero";
17659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
17759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT";
17859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(0, handler.callbackCount)
17959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "callback should not have been invoked because FD was not signalled";
18059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
18159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
18259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, PollOnce_WhenZeroTimeoutAndSignalledFD_ImmediatelyInvokesCallbackAndReturns) {
18359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    Pipe pipe;
18459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StubCallbackHandler handler(true);
18559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
18659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    ASSERT_EQ(OK, pipe.writeSignal());
18759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
18859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
18959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StopWatch stopWatch("pollOnce");
19059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->pollOnce(0);
19159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
19259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
19359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
19459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "elapsed time should be approx. zero";
19559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
19659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because FD was signalled";
19759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(1, handler.callbackCount)
19859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "callback should be invoked exactly once";
19959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(pipe.receiveFd, handler.fd)
20059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "callback should have received pipe fd as parameter";
20159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_EVENT_INPUT, handler.events)
20259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "callback should have received ALOOPER_EVENT_INPUT as events";
20359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
20459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
20559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndNoSignalledFDs_WaitsForTimeoutAndReturns) {
20659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    Pipe pipe;
20759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StubCallbackHandler handler(true);
20859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
20959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
21059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
21159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StopWatch stopWatch("pollOnce");
21259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->pollOnce(100);
21359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
21459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
21559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
21659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "elapsed time should approx. equal timeout";
21759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
21859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT";
21959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(0, handler.callbackCount)
22059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "callback should not have been invoked because FD was not signalled";
22159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
22259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
22359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndSignalledFDBeforeWaiting_ImmediatelyInvokesCallbackAndReturns) {
22459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    Pipe pipe;
22559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StubCallbackHandler handler(true);
22659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
22759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    pipe.writeSignal();
22859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
22959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
23059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StopWatch stopWatch("pollOnce");
23159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->pollOnce(100);
23259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
23359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
23459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    ASSERT_EQ(OK, pipe.readSignal())
23559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "signal should actually have been written";
23659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
23759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "elapsed time should be approx. zero";
23859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
23959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because FD was signalled";
24059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(1, handler.callbackCount)
24159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "callback should be invoked exactly once";
24259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(pipe.receiveFd, handler.fd)
24359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "callback should have received pipe fd as parameter";
24459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_EVENT_INPUT, handler.events)
24559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "callback should have received ALOOPER_EVENT_INPUT as events";
24659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
24759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
24859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndSignalledFDWhileWaiting_PromptlyInvokesCallbackAndReturns) {
24959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    Pipe pipe;
25059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StubCallbackHandler handler(true);
25159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    sp<DelayedWriteSignal> delayedWriteSignal = new DelayedWriteSignal(100, & pipe);
25259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
25359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
25459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    delayedWriteSignal->run();
25559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
25659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StopWatch stopWatch("pollOnce");
25759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->pollOnce(1000);
25859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
25959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
26059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    ASSERT_EQ(OK, pipe.readSignal())
26159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "signal should actually have been written";
26259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
26359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "elapsed time should approx. equal signal delay";
26459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
26559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because FD was signalled";
26659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(1, handler.callbackCount)
26759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "callback should be invoked exactly once";
26859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(pipe.receiveFd, handler.fd)
26959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "callback should have received pipe fd as parameter";
27059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_EVENT_INPUT, handler.events)
27159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "callback should have received ALOOPER_EVENT_INPUT as events";
27259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
27359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
27459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, PollOnce_WhenCallbackAddedThenRemoved_CallbackShouldNotBeInvoked) {
27559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    Pipe pipe;
27659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StubCallbackHandler handler(true);
27759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
27859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
27959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    pipe.writeSignal(); // would cause FD to be considered signalled
28059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    mLooper->removeFd(pipe.receiveFd);
28159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
28259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StopWatch stopWatch("pollOnce");
28359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->pollOnce(100);
28459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
28559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
28659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    ASSERT_EQ(OK, pipe.readSignal())
28759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "signal should actually have been written";
28859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
28959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "elapsed time should approx. equal timeout because FD was no longer registered";
29059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
29159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT";
29259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(0, handler.callbackCount)
29359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "callback should not be invoked";
29459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
29559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
29659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, PollOnce_WhenCallbackReturnsFalse_CallbackShouldNotBeInvokedAgainLater) {
29759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    Pipe pipe;
29859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StubCallbackHandler handler(false);
29959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
30059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
30159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
30259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    // First loop: Callback is registered and FD is signalled.
30359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    pipe.writeSignal();
30459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
30559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StopWatch stopWatch("pollOnce");
30659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->pollOnce(0);
30759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
30859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
30959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    ASSERT_EQ(OK, pipe.readSignal())
31059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "signal should actually have been written";
31159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
31259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "elapsed time should approx. equal zero because FD was already signalled";
31359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
31459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because FD was signalled";
31559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(1, handler.callbackCount)
31659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "callback should be invoked";
31759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
31859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    // Second loop: Callback is no longer registered and FD is signalled.
31959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    pipe.writeSignal();
32059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
32159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    stopWatch.reset();
32259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    result = mLooper->pollOnce(0);
32359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
32459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
32559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    ASSERT_EQ(OK, pipe.readSignal())
32659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "signal should actually have been written";
32759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
32859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "elapsed time should approx. equal zero because timeout was zero";
32959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
33059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT";
33159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(1, handler.callbackCount)
33259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "callback should not be invoked this time";
33359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
33459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
33559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, PollOnce_WhenNonCallbackFdIsSignalled_ReturnsIdent) {
33659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    const int expectedIdent = 5;
33759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    void* expectedData = this;
33859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
33959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    Pipe pipe;
34059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
34159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    pipe.writeSignal();
34259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    mLooper->addFd(pipe.receiveFd, expectedIdent, ALOOPER_EVENT_INPUT, NULL, expectedData);
34359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
34459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StopWatch stopWatch("pollOnce");
34559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int fd;
34659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int events;
34759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    void* data;
34859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->pollOnce(100, &fd, &events, &data);
34959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
35059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
35159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    ASSERT_EQ(OK, pipe.readSignal())
35259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "signal should actually have been written";
35359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
35459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "elapsed time should be approx. zero";
35559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(expectedIdent, result)
35659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce result should be the ident of the FD that was signalled";
35759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(pipe.receiveFd, fd)
35859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce should have returned the received pipe fd";
35959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_EVENT_INPUT, events)
36059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce should have returned ALOOPER_EVENT_INPUT as events";
36159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(expectedData, data)
36259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce should have returned the data";
36359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
36459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
36559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, AddFd_WhenCallbackAdded_ReturnsOne) {
36659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    Pipe pipe;
36759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->addFd(pipe.receiveFd, 0, ALOOPER_EVENT_INPUT, NULL, NULL);
36859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
36959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(1, result)
37059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "addFd should return 1 because FD was added";
37159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
37259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
37359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, AddFd_WhenIdentIsNegativeAndCallbackIsNull_ReturnsError) {
37459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    Pipe pipe;
37559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->addFd(pipe.receiveFd, -1, ALOOPER_EVENT_INPUT, NULL, NULL);
37659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
37759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(-1, result)
37859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "addFd should return -1 because arguments were invalid";
37959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
38059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
38159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, AddFd_WhenNoCallbackAndAllowNonCallbacksIsFalse_ReturnsError) {
38259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    Pipe pipe;
38359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    sp<Looper> looper = new Looper(false /*allowNonCallbacks*/);
38459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = looper->addFd(pipe.receiveFd, 0, 0, NULL, NULL);
38559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
38659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(-1, result)
38759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "addFd should return -1 because arguments were invalid";
38859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
38959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
39059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, RemoveFd_WhenCallbackNotAdded_ReturnsZero) {
39159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->removeFd(1);
39259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
39359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(0, result)
39459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "removeFd should return 0 because FD not registered";
39559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
39659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
39759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, RemoveFd_WhenCallbackAddedThenRemovedTwice_ReturnsOnceFirstTimeAndReturnsZeroSecondTime) {
39859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    Pipe pipe;
39959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StubCallbackHandler handler(false);
40059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    handler.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
40159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
40259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    // First time.
40359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->removeFd(pipe.receiveFd);
40459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
40559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(1, result)
40659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "removeFd should return 1 first time because FD was registered";
40759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
40859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    // Second time.
40959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    result = mLooper->removeFd(pipe.receiveFd);
41059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
41159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(0, result)
41259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "removeFd should return 0 second time because FD was no longer registered";
41359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
41459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
41559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff BrownTEST_F(LooperTest, PollOnce_WhenCallbackAddedTwice_OnlySecondCallbackShouldBeInvoked) {
41659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    Pipe pipe;
41759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StubCallbackHandler handler1(true);
41859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StubCallbackHandler handler2(true);
41959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
42059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    handler1.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT);
42159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    handler2.setCallback(mLooper, pipe.receiveFd, ALOOPER_EVENT_INPUT); // replace it
42259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    pipe.writeSignal(); // would cause FD to be considered signalled
42359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
42459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    StopWatch stopWatch("pollOnce");
42559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int result = mLooper->pollOnce(100);
42659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
42759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
42859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    ASSERT_EQ(OK, pipe.readSignal())
42959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "signal should actually have been written";
43059abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
43159abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "elapsed time should approx. zero because FD was already signalled";
43259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
43359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because FD was signalled";
43459abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(0, handler1.callbackCount)
43559abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "original handler callback should not be invoked because it was replaced";
43659abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown    EXPECT_EQ(1, handler2.callbackCount)
43759abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown            << "replacement handler callback should be invoked";
43859abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown}
43959abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
44080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff BrownTEST_F(LooperTest, SendMessage_WhenOneMessageIsEnqueue_ShouldInvokeHandlerDuringNextPoll) {
44180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
44280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST1));
44380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
44480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    StopWatch stopWatch("pollOnce");
44580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int result = mLooper->pollOnce(100);
44680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
44780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
44880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
44980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "elapsed time should approx. zero because message was already sent";
45080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
45180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
45280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
45380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
45480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
45580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
45680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown}
45780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
45880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff BrownTEST_F(LooperTest, SendMessage_WhenMultipleMessagesAreEnqueued_ShouldInvokeHandlersInOrderDuringNextPoll) {
45980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    sp<StubMessageHandler> handler1 = new StubMessageHandler();
46080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    sp<StubMessageHandler> handler2 = new StubMessageHandler();
46180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessage(handler1, Message(MSG_TEST1));
46280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessage(handler2, Message(MSG_TEST2));
46380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessage(handler1, Message(MSG_TEST3));
46480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessage(handler1, Message(MSG_TEST4));
46580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
46680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    StopWatch stopWatch("pollOnce");
46780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int result = mLooper->pollOnce(1000);
46880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
46980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
47080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
47180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "elapsed time should approx. zero because message was already sent";
47280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
47380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
47480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(3), handler1->messages.size())
47580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
47680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(MSG_TEST1, handler1->messages[0].what)
47780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
47880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(MSG_TEST3, handler1->messages[1].what)
47980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
48080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(MSG_TEST4, handler1->messages[2].what)
48180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
48280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(1), handler2->messages.size())
48380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
48480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(MSG_TEST2, handler2->messages[0].what)
48580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
48680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown}
48780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
48880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff BrownTEST_F(LooperTest, SendMessageDelayed_WhenSentToTheFuture_ShouldInvokeHandlerAfterDelayTime) {
48980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
49080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessageDelayed(ms2ns(100), handler, Message(MSG_TEST1));
49180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
49280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    StopWatch stopWatch("pollOnce");
49380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int result = mLooper->pollOnce(1000);
49480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
49580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
49680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
49780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "first poll should end quickly because next message timeout was computed";
49880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_WAKE, result)
49980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_WAKE due to wakeup";
50080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(0), handler->messages.size())
50180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "no message handled yet";
50280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
50380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    result = mLooper->pollOnce(1000);
50480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
50580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
50680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
50780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
50880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
50980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
51080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
51180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "second poll should end around the time of the delayed message dispatch";
51280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
51380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
51480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
51580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    result = mLooper->pollOnce(100);
51680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
51780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
51880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_NEAR(100 + 100, elapsedMillis, TIMING_TOLERANCE_MS)
51980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "third poll should timeout";
52080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
52180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT because there were no messages left";
52280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown}
52380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
52480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff BrownTEST_F(LooperTest, SendMessageDelayed_WhenSentToThePast_ShouldInvokeHandlerDuringNextPoll) {
52580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
52680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessageDelayed(ms2ns(-1000), handler, Message(MSG_TEST1));
52780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
52880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    StopWatch stopWatch("pollOnce");
52980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int result = mLooper->pollOnce(100);
53080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
53180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
53280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
53380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "elapsed time should approx. zero because message was already sent";
53480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
53580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
53680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
53780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
53880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
53980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
54080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown}
54180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
54280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff BrownTEST_F(LooperTest, SendMessageDelayed_WhenSentToThePresent_ShouldInvokeHandlerDuringNextPoll) {
54380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
54480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessageDelayed(0, handler, Message(MSG_TEST1));
54580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
54680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    StopWatch stopWatch("pollOnce");
54780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int result = mLooper->pollOnce(100);
54880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
54980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
55080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
55180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "elapsed time should approx. zero because message was already sent";
55280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
55380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
55480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
55580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
55680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
55780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
55880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown}
55980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
56080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff BrownTEST_F(LooperTest, SendMessageAtTime_WhenSentToTheFuture_ShouldInvokeHandlerAfterDelayTime) {
56180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
56280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
56380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessageAtTime(now + ms2ns(100), handler, Message(MSG_TEST1));
56480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
56580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    StopWatch stopWatch("pollOnce");
56680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int result = mLooper->pollOnce(1000);
56780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
56880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
56980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
57080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "first poll should end quickly because next message timeout was computed";
57180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_WAKE, result)
57280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_WAKE due to wakeup";
57380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(0), handler->messages.size())
57480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "no message handled yet";
57580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
57680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    result = mLooper->pollOnce(1000);
57780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
57880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
57980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
58080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
58180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
58280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
58380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
58480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "second poll should end around the time of the delayed message dispatch";
58580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
58680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
58780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
58880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    result = mLooper->pollOnce(100);
58980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    elapsedMillis = ns2ms(stopWatch.elapsedTime());
59080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
59180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_NEAR(100 + 100, elapsedMillis, TIMING_TOLERANCE_MS)
59280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "third poll should timeout";
59380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
59480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT because there were no messages left";
59580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown}
59680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
59780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff BrownTEST_F(LooperTest, SendMessageAtTime_WhenSentToThePast_ShouldInvokeHandlerDuringNextPoll) {
59880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
59980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
60080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessageAtTime(now - ms2ns(1000), handler, Message(MSG_TEST1));
60180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
60280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    StopWatch stopWatch("pollOnce");
60380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int result = mLooper->pollOnce(100);
60480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
60580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
60680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
60780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "elapsed time should approx. zero because message was already sent";
60880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
60980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
61080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
61180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
61280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
61380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
61480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown}
61580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
61680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff BrownTEST_F(LooperTest, SendMessageAtTime_WhenSentToThePresent_ShouldInvokeHandlerDuringNextPoll) {
61780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
61880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
61980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessageAtTime(now, handler, Message(MSG_TEST1));
62080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
62180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    StopWatch stopWatch("pollOnce");
62280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int result = mLooper->pollOnce(100);
62380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
62480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
62580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
62680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "elapsed time should approx. zero because message was already sent";
62780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
62880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because message was sent";
62980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(1), handler->messages.size())
63080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
63180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
63280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
63380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown}
63480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
63580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff BrownTEST_F(LooperTest, RemoveMessage_WhenRemovingAllMessagesForHandler_ShouldRemoveThoseMessage) {
63680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
63780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST1));
63880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST2));
63980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST3));
64080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->removeMessages(handler);
64180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
64280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    StopWatch stopWatch("pollOnce");
64380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int result = mLooper->pollOnce(0);
64480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
64580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
64680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
64780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "elapsed time should approx. zero because message was sent so looper was awoken";
64880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_WAKE, result)
64980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_WAKE because looper was awoken";
65080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(0), handler->messages.size())
65180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "no messages to handle";
65280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
65380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    result = mLooper->pollOnce(0);
65480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
65580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
65680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT because there was nothing to do";
65780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(0), handler->messages.size())
65880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "no messages to handle";
65980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown}
66080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
66180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff BrownTEST_F(LooperTest, RemoveMessage_WhenRemovingSomeMessagesForHandler_ShouldRemoveThoseMessage) {
66280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    sp<StubMessageHandler> handler = new StubMessageHandler();
66380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST1));
66480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST2));
66580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST3));
66680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->sendMessage(handler, Message(MSG_TEST4));
66780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->removeMessages(handler, MSG_TEST3);
66880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    mLooper->removeMessages(handler, MSG_TEST1);
66980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
67080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    StopWatch stopWatch("pollOnce");
67180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int result = mLooper->pollOnce(0);
67280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
67380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
67480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
67580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "elapsed time should approx. zero because message was sent so looper was awoken";
67680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_CALLBACK, result)
67780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_CALLBACK because two messages were sent";
67880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(2), handler->messages.size())
67980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "no messages to handle";
68080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(MSG_TEST2, handler->messages[0].what)
68180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
68280f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(MSG_TEST4, handler->messages[1].what)
68380f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "handled message";
68480f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
68580f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    result = mLooper->pollOnce(0);
68680f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown
68780f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(ALOOPER_POLL_TIMEOUT, result)
68880f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "pollOnce result should be ALOOPER_POLL_TIMEOUT because there was nothing to do";
68980f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown    EXPECT_EQ(size_t(2), handler->messages.size())
69080f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown            << "no more messages to handle";
69180f3e7cc1506bbb4bec458e15629805a7c1df7eeJeff Brown}
69259abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown
69359abe7e0909bf4b7bf7b9601e1e40a05f6d4fd8aJeff Brown} // namespace android
694