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