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