blob: 6fdc0edc95f6b82ce2b536d3ca1f75ab7ff70f77 [file] [log] [blame]
Jeff Brown7901eb22010-09-13 23:17:30 -07001//
2// Copyright 2010 The Android Open Source Project
3//
4
5#include <utils/Looper.h>
6#include <utils/Timers.h>
7#include <utils/StopWatch.h>
8#include <gtest/gtest.h>
9#include <unistd.h>
10#include <time.h>
11
Elliott Hughes01705e42019-02-07 12:41:37 -080012#include <utils/threads.h>
Jeff Brown7901eb22010-09-13 23:17:30 -070013
14// # of milliseconds to fudge stopwatch measurements
15#define TIMING_TOLERANCE_MS 25
16
17namespace android {
18
Jeff Brown3e2e38b2011-03-02 14:41:58 -080019enum {
20 MSG_TEST1 = 1,
21 MSG_TEST2 = 2,
22 MSG_TEST3 = 3,
23 MSG_TEST4 = 4,
24};
25
Elliott Hughes01705e42019-02-07 12:41:37 -080026class Pipe {
27public:
28 int sendFd;
29 int receiveFd;
30
31 Pipe() {
32 int fds[2];
33 ::pipe(fds);
34
35 receiveFd = fds[0];
36 sendFd = fds[1];
37 }
38
39 ~Pipe() {
40 if (sendFd != -1) {
41 ::close(sendFd);
42 }
43
44 if (receiveFd != -1) {
45 ::close(receiveFd);
46 }
47 }
48
49 status_t writeSignal() {
50 ssize_t nWritten = ::write(sendFd, "*", 1);
51 return nWritten == 1 ? 0 : -errno;
52 }
53
54 status_t readSignal() {
55 char buf[1];
56 ssize_t nRead = ::read(receiveFd, buf, 1);
57 return nRead == 1 ? 0 : nRead == 0 ? -EPIPE : -errno;
58 }
59};
60
61class DelayedTask : public Thread {
62 int mDelayMillis;
63
64public:
65 explicit DelayedTask(int delayMillis) : mDelayMillis(delayMillis) { }
66
67protected:
68 virtual ~DelayedTask() { }
69
70 virtual void doTask() = 0;
71
72 virtual bool threadLoop() {
73 usleep(mDelayMillis * 1000);
74 doTask();
75 return false;
76 }
77};
78
Jeff Brown7901eb22010-09-13 23:17:30 -070079class DelayedWake : public DelayedTask {
80 sp<Looper> mLooper;
81
82public:
83 DelayedWake(int delayMillis, const sp<Looper> looper) :
84 DelayedTask(delayMillis), mLooper(looper) {
85 }
86
87protected:
88 virtual void doTask() {
89 mLooper->wake();
90 }
91};
92
93class DelayedWriteSignal : public DelayedTask {
94 Pipe* mPipe;
95
96public:
97 DelayedWriteSignal(int delayMillis, Pipe* pipe) :
98 DelayedTask(delayMillis), mPipe(pipe) {
99 }
100
101protected:
102 virtual void doTask() {
103 mPipe->writeSignal();
104 }
105};
106
107class CallbackHandler {
108public:
109 void setCallback(const sp<Looper>& looper, int fd, int events) {
110 looper->addFd(fd, 0, events, staticHandler, this);
111 }
112
113protected:
114 virtual ~CallbackHandler() { }
115
116 virtual int handler(int fd, int events) = 0;
117
118private:
119 static int staticHandler(int fd, int events, void* data) {
120 return static_cast<CallbackHandler*>(data)->handler(fd, events);
121 }
122};
123
124class StubCallbackHandler : public CallbackHandler {
125public:
126 int nextResult;
127 int callbackCount;
128
129 int fd;
130 int events;
131
Chih-Hung Hsieh034c4752016-07-12 13:50:44 -0700132 explicit StubCallbackHandler(int nextResult) : nextResult(nextResult),
Jeff Brown7901eb22010-09-13 23:17:30 -0700133 callbackCount(0), fd(-1), events(-1) {
134 }
135
136protected:
137 virtual int handler(int fd, int events) {
138 callbackCount += 1;
139 this->fd = fd;
140 this->events = events;
141 return nextResult;
142 }
143};
144
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800145class StubMessageHandler : public MessageHandler {
146public:
147 Vector<Message> messages;
148
149 virtual void handleMessage(const Message& message) {
150 messages.push(message);
151 }
152};
153
Jeff Brown7901eb22010-09-13 23:17:30 -0700154class LooperTest : public testing::Test {
155protected:
156 sp<Looper> mLooper;
157
158 virtual void SetUp() {
159 mLooper = new Looper(true);
160 }
161
162 virtual void TearDown() {
163 mLooper.clear();
164 }
165};
166
167
168TEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndNotAwoken_WaitsForTimeout) {
169 StopWatch stopWatch("pollOnce");
170 int result = mLooper->pollOnce(100);
171 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
172
173 EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
174 << "elapsed time should approx. equal timeout";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800175 EXPECT_EQ(Looper::POLL_TIMEOUT, result)
176 << "pollOnce result should be LOOPER_POLL_TIMEOUT";
Jeff Brown7901eb22010-09-13 23:17:30 -0700177}
178
179TEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndAwokenBeforeWaiting_ImmediatelyReturns) {
180 mLooper->wake();
181
182 StopWatch stopWatch("pollOnce");
183 int result = mLooper->pollOnce(1000);
184 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
185
186 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
187 << "elapsed time should approx. zero because wake() was called before waiting";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800188 EXPECT_EQ(Looper::POLL_WAKE, result)
189 << "pollOnce result should be Looper::POLL_CALLBACK because loop was awoken";
Jeff Brown7901eb22010-09-13 23:17:30 -0700190}
191
192TEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndAwokenWhileWaiting_PromptlyReturns) {
193 sp<DelayedWake> delayedWake = new DelayedWake(100, mLooper);
Brian Carlstrome71b9142016-03-12 16:08:12 -0800194 delayedWake->run("LooperTest");
Jeff Brown7901eb22010-09-13 23:17:30 -0700195
196 StopWatch stopWatch("pollOnce");
197 int result = mLooper->pollOnce(1000);
198 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
199
200 EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
201 << "elapsed time should approx. equal wake delay";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800202 EXPECT_EQ(Looper::POLL_WAKE, result)
203 << "pollOnce result should be Looper::POLL_CALLBACK because loop was awoken";
Jeff Brown7901eb22010-09-13 23:17:30 -0700204}
205
206TEST_F(LooperTest, PollOnce_WhenZeroTimeoutAndNoRegisteredFDs_ImmediatelyReturns) {
207 StopWatch stopWatch("pollOnce");
208 int result = mLooper->pollOnce(0);
209 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
210
211 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
212 << "elapsed time should be approx. zero";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800213 EXPECT_EQ(Looper::POLL_TIMEOUT, result)
214 << "pollOnce result should be Looper::POLL_TIMEOUT";
Jeff Brown7901eb22010-09-13 23:17:30 -0700215}
216
217TEST_F(LooperTest, PollOnce_WhenZeroTimeoutAndNoSignalledFDs_ImmediatelyReturns) {
218 Pipe pipe;
219 StubCallbackHandler handler(true);
220
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800221 handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
Jeff Brown7901eb22010-09-13 23:17:30 -0700222
223 StopWatch stopWatch("pollOnce");
224 int result = mLooper->pollOnce(0);
225 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
226
227 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
228 << "elapsed time should be approx. zero";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800229 EXPECT_EQ(Looper::POLL_TIMEOUT, result)
230 << "pollOnce result should be Looper::POLL_TIMEOUT";
Jeff Brown7901eb22010-09-13 23:17:30 -0700231 EXPECT_EQ(0, handler.callbackCount)
232 << "callback should not have been invoked because FD was not signalled";
233}
234
235TEST_F(LooperTest, PollOnce_WhenZeroTimeoutAndSignalledFD_ImmediatelyInvokesCallbackAndReturns) {
236 Pipe pipe;
237 StubCallbackHandler handler(true);
238
239 ASSERT_EQ(OK, pipe.writeSignal());
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800240 handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
Jeff Brown7901eb22010-09-13 23:17:30 -0700241
242 StopWatch stopWatch("pollOnce");
243 int result = mLooper->pollOnce(0);
244 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
245
246 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
247 << "elapsed time should be approx. zero";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800248 EXPECT_EQ(Looper::POLL_CALLBACK, result)
249 << "pollOnce result should be Looper::POLL_CALLBACK because FD was signalled";
Jeff Brown7901eb22010-09-13 23:17:30 -0700250 EXPECT_EQ(1, handler.callbackCount)
251 << "callback should be invoked exactly once";
252 EXPECT_EQ(pipe.receiveFd, handler.fd)
253 << "callback should have received pipe fd as parameter";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800254 EXPECT_EQ(Looper::EVENT_INPUT, handler.events)
255 << "callback should have received Looper::EVENT_INPUT as events";
Jeff Brown7901eb22010-09-13 23:17:30 -0700256}
257
258TEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndNoSignalledFDs_WaitsForTimeoutAndReturns) {
259 Pipe pipe;
260 StubCallbackHandler handler(true);
261
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800262 handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
Jeff Brown7901eb22010-09-13 23:17:30 -0700263
264 StopWatch stopWatch("pollOnce");
265 int result = mLooper->pollOnce(100);
266 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
267
268 EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
269 << "elapsed time should approx. equal timeout";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800270 EXPECT_EQ(Looper::POLL_TIMEOUT, result)
271 << "pollOnce result should be Looper::POLL_TIMEOUT";
Jeff Brown7901eb22010-09-13 23:17:30 -0700272 EXPECT_EQ(0, handler.callbackCount)
273 << "callback should not have been invoked because FD was not signalled";
274}
275
276TEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndSignalledFDBeforeWaiting_ImmediatelyInvokesCallbackAndReturns) {
277 Pipe pipe;
278 StubCallbackHandler handler(true);
279
280 pipe.writeSignal();
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800281 handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
Jeff Brown7901eb22010-09-13 23:17:30 -0700282
283 StopWatch stopWatch("pollOnce");
284 int result = mLooper->pollOnce(100);
285 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
286
287 ASSERT_EQ(OK, pipe.readSignal())
288 << "signal should actually have been written";
289 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
290 << "elapsed time should be approx. zero";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800291 EXPECT_EQ(Looper::POLL_CALLBACK, result)
292 << "pollOnce result should be Looper::POLL_CALLBACK because FD was signalled";
Jeff Brown7901eb22010-09-13 23:17:30 -0700293 EXPECT_EQ(1, handler.callbackCount)
294 << "callback should be invoked exactly once";
295 EXPECT_EQ(pipe.receiveFd, handler.fd)
296 << "callback should have received pipe fd as parameter";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800297 EXPECT_EQ(Looper::EVENT_INPUT, handler.events)
298 << "callback should have received Looper::EVENT_INPUT as events";
Jeff Brown7901eb22010-09-13 23:17:30 -0700299}
300
301TEST_F(LooperTest, PollOnce_WhenNonZeroTimeoutAndSignalledFDWhileWaiting_PromptlyInvokesCallbackAndReturns) {
302 Pipe pipe;
303 StubCallbackHandler handler(true);
304 sp<DelayedWriteSignal> delayedWriteSignal = new DelayedWriteSignal(100, & pipe);
305
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800306 handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
Brian Carlstrome71b9142016-03-12 16:08:12 -0800307 delayedWriteSignal->run("LooperTest");
Jeff Brown7901eb22010-09-13 23:17:30 -0700308
309 StopWatch stopWatch("pollOnce");
310 int result = mLooper->pollOnce(1000);
311 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
312
313 ASSERT_EQ(OK, pipe.readSignal())
314 << "signal should actually have been written";
315 EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
316 << "elapsed time should approx. equal signal delay";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800317 EXPECT_EQ(Looper::POLL_CALLBACK, result)
318 << "pollOnce result should be Looper::POLL_CALLBACK because FD was signalled";
Jeff Brown7901eb22010-09-13 23:17:30 -0700319 EXPECT_EQ(1, handler.callbackCount)
320 << "callback should be invoked exactly once";
321 EXPECT_EQ(pipe.receiveFd, handler.fd)
322 << "callback should have received pipe fd as parameter";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800323 EXPECT_EQ(Looper::EVENT_INPUT, handler.events)
324 << "callback should have received Looper::EVENT_INPUT as events";
Jeff Brown7901eb22010-09-13 23:17:30 -0700325}
326
327TEST_F(LooperTest, PollOnce_WhenCallbackAddedThenRemoved_CallbackShouldNotBeInvoked) {
328 Pipe pipe;
329 StubCallbackHandler handler(true);
330
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800331 handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
Jeff Brown7901eb22010-09-13 23:17:30 -0700332 pipe.writeSignal(); // would cause FD to be considered signalled
333 mLooper->removeFd(pipe.receiveFd);
334
335 StopWatch stopWatch("pollOnce");
336 int result = mLooper->pollOnce(100);
337 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
338
339 ASSERT_EQ(OK, pipe.readSignal())
340 << "signal should actually have been written";
341 EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
342 << "elapsed time should approx. equal timeout because FD was no longer registered";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800343 EXPECT_EQ(Looper::POLL_TIMEOUT, result)
344 << "pollOnce result should be Looper::POLL_TIMEOUT";
Jeff Brown7901eb22010-09-13 23:17:30 -0700345 EXPECT_EQ(0, handler.callbackCount)
346 << "callback should not be invoked";
347}
348
349TEST_F(LooperTest, PollOnce_WhenCallbackReturnsFalse_CallbackShouldNotBeInvokedAgainLater) {
350 Pipe pipe;
351 StubCallbackHandler handler(false);
352
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800353 handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
Jeff Brown7901eb22010-09-13 23:17:30 -0700354
355 // First loop: Callback is registered and FD is signalled.
356 pipe.writeSignal();
357
358 StopWatch stopWatch("pollOnce");
359 int result = mLooper->pollOnce(0);
360 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
361
362 ASSERT_EQ(OK, pipe.readSignal())
363 << "signal should actually have been written";
364 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
365 << "elapsed time should approx. equal zero because FD was already signalled";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800366 EXPECT_EQ(Looper::POLL_CALLBACK, result)
367 << "pollOnce result should be Looper::POLL_CALLBACK because FD was signalled";
Jeff Brown7901eb22010-09-13 23:17:30 -0700368 EXPECT_EQ(1, handler.callbackCount)
369 << "callback should be invoked";
370
371 // Second loop: Callback is no longer registered and FD is signalled.
372 pipe.writeSignal();
373
374 stopWatch.reset();
375 result = mLooper->pollOnce(0);
376 elapsedMillis = ns2ms(stopWatch.elapsedTime());
377
378 ASSERT_EQ(OK, pipe.readSignal())
379 << "signal should actually have been written";
380 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
381 << "elapsed time should approx. equal zero because timeout was zero";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800382 EXPECT_EQ(Looper::POLL_TIMEOUT, result)
383 << "pollOnce result should be Looper::POLL_TIMEOUT";
Jeff Brown7901eb22010-09-13 23:17:30 -0700384 EXPECT_EQ(1, handler.callbackCount)
385 << "callback should not be invoked this time";
386}
387
388TEST_F(LooperTest, PollOnce_WhenNonCallbackFdIsSignalled_ReturnsIdent) {
389 const int expectedIdent = 5;
390 void* expectedData = this;
391
392 Pipe pipe;
393
394 pipe.writeSignal();
Yi Konge1731a42018-07-16 18:11:34 -0700395 mLooper->addFd(pipe.receiveFd, expectedIdent, Looper::EVENT_INPUT, nullptr, expectedData);
Jeff Brown7901eb22010-09-13 23:17:30 -0700396
397 StopWatch stopWatch("pollOnce");
398 int fd;
399 int events;
400 void* data;
401 int result = mLooper->pollOnce(100, &fd, &events, &data);
402 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
403
404 ASSERT_EQ(OK, pipe.readSignal())
405 << "signal should actually have been written";
406 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
407 << "elapsed time should be approx. zero";
408 EXPECT_EQ(expectedIdent, result)
409 << "pollOnce result should be the ident of the FD that was signalled";
410 EXPECT_EQ(pipe.receiveFd, fd)
411 << "pollOnce should have returned the received pipe fd";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800412 EXPECT_EQ(Looper::EVENT_INPUT, events)
413 << "pollOnce should have returned Looper::EVENT_INPUT as events";
Jeff Brown7901eb22010-09-13 23:17:30 -0700414 EXPECT_EQ(expectedData, data)
415 << "pollOnce should have returned the data";
416}
417
418TEST_F(LooperTest, AddFd_WhenCallbackAdded_ReturnsOne) {
419 Pipe pipe;
Yi Konge1731a42018-07-16 18:11:34 -0700420 int result = mLooper->addFd(pipe.receiveFd, 0, Looper::EVENT_INPUT, nullptr, nullptr);
Jeff Brown7901eb22010-09-13 23:17:30 -0700421
422 EXPECT_EQ(1, result)
423 << "addFd should return 1 because FD was added";
424}
425
Jeff Brown7901eb22010-09-13 23:17:30 -0700426TEST_F(LooperTest, AddFd_WhenIdentIsNegativeAndCallbackIsNull_ReturnsError) {
427 Pipe pipe;
Yi Konge1731a42018-07-16 18:11:34 -0700428 int result = mLooper->addFd(pipe.receiveFd, -1, Looper::EVENT_INPUT, nullptr, nullptr);
Jeff Brown7901eb22010-09-13 23:17:30 -0700429
430 EXPECT_EQ(-1, result)
431 << "addFd should return -1 because arguments were invalid";
432}
433
434TEST_F(LooperTest, AddFd_WhenNoCallbackAndAllowNonCallbacksIsFalse_ReturnsError) {
435 Pipe pipe;
436 sp<Looper> looper = new Looper(false /*allowNonCallbacks*/);
Yi Konge1731a42018-07-16 18:11:34 -0700437 int result = looper->addFd(pipe.receiveFd, 0, 0, nullptr, nullptr);
Jeff Brown7901eb22010-09-13 23:17:30 -0700438
439 EXPECT_EQ(-1, result)
440 << "addFd should return -1 because arguments were invalid";
441}
442
443TEST_F(LooperTest, RemoveFd_WhenCallbackNotAdded_ReturnsZero) {
444 int result = mLooper->removeFd(1);
445
446 EXPECT_EQ(0, result)
447 << "removeFd should return 0 because FD not registered";
448}
449
450TEST_F(LooperTest, RemoveFd_WhenCallbackAddedThenRemovedTwice_ReturnsOnceFirstTimeAndReturnsZeroSecondTime) {
451 Pipe pipe;
452 StubCallbackHandler handler(false);
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800453 handler.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
Jeff Brown7901eb22010-09-13 23:17:30 -0700454
455 // First time.
456 int result = mLooper->removeFd(pipe.receiveFd);
457
458 EXPECT_EQ(1, result)
459 << "removeFd should return 1 first time because FD was registered";
460
461 // Second time.
462 result = mLooper->removeFd(pipe.receiveFd);
463
464 EXPECT_EQ(0, result)
465 << "removeFd should return 0 second time because FD was no longer registered";
466}
467
468TEST_F(LooperTest, PollOnce_WhenCallbackAddedTwice_OnlySecondCallbackShouldBeInvoked) {
469 Pipe pipe;
470 StubCallbackHandler handler1(true);
471 StubCallbackHandler handler2(true);
472
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800473 handler1.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT);
474 handler2.setCallback(mLooper, pipe.receiveFd, Looper::EVENT_INPUT); // replace it
Jeff Brown7901eb22010-09-13 23:17:30 -0700475 pipe.writeSignal(); // would cause FD to be considered signalled
476
477 StopWatch stopWatch("pollOnce");
478 int result = mLooper->pollOnce(100);
479 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
480
481 ASSERT_EQ(OK, pipe.readSignal())
482 << "signal should actually have been written";
483 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
484 << "elapsed time should approx. zero because FD was already signalled";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800485 EXPECT_EQ(Looper::POLL_CALLBACK, result)
486 << "pollOnce result should be Looper::POLL_CALLBACK because FD was signalled";
Jeff Brown7901eb22010-09-13 23:17:30 -0700487 EXPECT_EQ(0, handler1.callbackCount)
488 << "original handler callback should not be invoked because it was replaced";
489 EXPECT_EQ(1, handler2.callbackCount)
490 << "replacement handler callback should be invoked";
491}
492
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800493TEST_F(LooperTest, SendMessage_WhenOneMessageIsEnqueue_ShouldInvokeHandlerDuringNextPoll) {
494 sp<StubMessageHandler> handler = new StubMessageHandler();
495 mLooper->sendMessage(handler, Message(MSG_TEST1));
496
497 StopWatch stopWatch("pollOnce");
498 int result = mLooper->pollOnce(100);
499 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
500
501 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
502 << "elapsed time should approx. zero because message was already sent";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800503 EXPECT_EQ(Looper::POLL_CALLBACK, result)
504 << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800505 EXPECT_EQ(size_t(1), handler->messages.size())
506 << "handled message";
507 EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
508 << "handled message";
509}
510
511TEST_F(LooperTest, SendMessage_WhenMultipleMessagesAreEnqueued_ShouldInvokeHandlersInOrderDuringNextPoll) {
512 sp<StubMessageHandler> handler1 = new StubMessageHandler();
513 sp<StubMessageHandler> handler2 = new StubMessageHandler();
514 mLooper->sendMessage(handler1, Message(MSG_TEST1));
515 mLooper->sendMessage(handler2, Message(MSG_TEST2));
516 mLooper->sendMessage(handler1, Message(MSG_TEST3));
517 mLooper->sendMessage(handler1, Message(MSG_TEST4));
518
519 StopWatch stopWatch("pollOnce");
520 int result = mLooper->pollOnce(1000);
521 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
522
523 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
524 << "elapsed time should approx. zero because message was already sent";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800525 EXPECT_EQ(Looper::POLL_CALLBACK, result)
526 << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800527 EXPECT_EQ(size_t(3), handler1->messages.size())
528 << "handled message";
529 EXPECT_EQ(MSG_TEST1, handler1->messages[0].what)
530 << "handled message";
531 EXPECT_EQ(MSG_TEST3, handler1->messages[1].what)
532 << "handled message";
533 EXPECT_EQ(MSG_TEST4, handler1->messages[2].what)
534 << "handled message";
535 EXPECT_EQ(size_t(1), handler2->messages.size())
536 << "handled message";
537 EXPECT_EQ(MSG_TEST2, handler2->messages[0].what)
538 << "handled message";
539}
540
541TEST_F(LooperTest, SendMessageDelayed_WhenSentToTheFuture_ShouldInvokeHandlerAfterDelayTime) {
542 sp<StubMessageHandler> handler = new StubMessageHandler();
543 mLooper->sendMessageDelayed(ms2ns(100), handler, Message(MSG_TEST1));
544
545 StopWatch stopWatch("pollOnce");
546 int result = mLooper->pollOnce(1000);
547 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
548
549 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
550 << "first poll should end quickly because next message timeout was computed";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800551 EXPECT_EQ(Looper::POLL_WAKE, result)
552 << "pollOnce result should be Looper::POLL_WAKE due to wakeup";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800553 EXPECT_EQ(size_t(0), handler->messages.size())
554 << "no message handled yet";
555
556 result = mLooper->pollOnce(1000);
557 elapsedMillis = ns2ms(stopWatch.elapsedTime());
558
559 EXPECT_EQ(size_t(1), handler->messages.size())
560 << "handled message";
561 EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
562 << "handled message";
563 EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
564 << "second poll should end around the time of the delayed message dispatch";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800565 EXPECT_EQ(Looper::POLL_CALLBACK, result)
566 << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800567
568 result = mLooper->pollOnce(100);
569 elapsedMillis = ns2ms(stopWatch.elapsedTime());
570
571 EXPECT_NEAR(100 + 100, elapsedMillis, TIMING_TOLERANCE_MS)
572 << "third poll should timeout";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800573 EXPECT_EQ(Looper::POLL_TIMEOUT, result)
574 << "pollOnce result should be Looper::POLL_TIMEOUT because there were no messages left";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800575}
576
577TEST_F(LooperTest, SendMessageDelayed_WhenSentToThePast_ShouldInvokeHandlerDuringNextPoll) {
578 sp<StubMessageHandler> handler = new StubMessageHandler();
579 mLooper->sendMessageDelayed(ms2ns(-1000), handler, Message(MSG_TEST1));
580
581 StopWatch stopWatch("pollOnce");
582 int result = mLooper->pollOnce(100);
583 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
584
585 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
586 << "elapsed time should approx. zero because message was already sent";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800587 EXPECT_EQ(Looper::POLL_CALLBACK, result)
588 << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800589 EXPECT_EQ(size_t(1), handler->messages.size())
590 << "handled message";
591 EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
592 << "handled message";
593}
594
595TEST_F(LooperTest, SendMessageDelayed_WhenSentToThePresent_ShouldInvokeHandlerDuringNextPoll) {
596 sp<StubMessageHandler> handler = new StubMessageHandler();
597 mLooper->sendMessageDelayed(0, handler, Message(MSG_TEST1));
598
599 StopWatch stopWatch("pollOnce");
600 int result = mLooper->pollOnce(100);
601 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
602
603 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
604 << "elapsed time should approx. zero because message was already sent";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800605 EXPECT_EQ(Looper::POLL_CALLBACK, result)
606 << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800607 EXPECT_EQ(size_t(1), handler->messages.size())
608 << "handled message";
609 EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
610 << "handled message";
611}
612
613TEST_F(LooperTest, SendMessageAtTime_WhenSentToTheFuture_ShouldInvokeHandlerAfterDelayTime) {
614 nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
615 sp<StubMessageHandler> handler = new StubMessageHandler();
616 mLooper->sendMessageAtTime(now + ms2ns(100), handler, Message(MSG_TEST1));
617
618 StopWatch stopWatch("pollOnce");
619 int result = mLooper->pollOnce(1000);
620 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
621
622 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
623 << "first poll should end quickly because next message timeout was computed";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800624 EXPECT_EQ(Looper::POLL_WAKE, result)
625 << "pollOnce result should be Looper::POLL_WAKE due to wakeup";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800626 EXPECT_EQ(size_t(0), handler->messages.size())
627 << "no message handled yet";
628
629 result = mLooper->pollOnce(1000);
630 elapsedMillis = ns2ms(stopWatch.elapsedTime());
631
632 EXPECT_EQ(size_t(1), handler->messages.size())
633 << "handled message";
634 EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
635 << "handled message";
636 EXPECT_NEAR(100, elapsedMillis, TIMING_TOLERANCE_MS)
637 << "second poll should end around the time of the delayed message dispatch";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800638 EXPECT_EQ(Looper::POLL_CALLBACK, result)
639 << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800640
641 result = mLooper->pollOnce(100);
642 elapsedMillis = ns2ms(stopWatch.elapsedTime());
643
644 EXPECT_NEAR(100 + 100, elapsedMillis, TIMING_TOLERANCE_MS)
645 << "third poll should timeout";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800646 EXPECT_EQ(Looper::POLL_TIMEOUT, result)
647 << "pollOnce result should be Looper::POLL_TIMEOUT because there were no messages left";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800648}
649
650TEST_F(LooperTest, SendMessageAtTime_WhenSentToThePast_ShouldInvokeHandlerDuringNextPoll) {
651 nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
652 sp<StubMessageHandler> handler = new StubMessageHandler();
653 mLooper->sendMessageAtTime(now - ms2ns(1000), handler, Message(MSG_TEST1));
654
655 StopWatch stopWatch("pollOnce");
656 int result = mLooper->pollOnce(100);
657 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
658
659 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
660 << "elapsed time should approx. zero because message was already sent";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800661 EXPECT_EQ(Looper::POLL_CALLBACK, result)
662 << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800663 EXPECT_EQ(size_t(1), handler->messages.size())
664 << "handled message";
665 EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
666 << "handled message";
667}
668
669TEST_F(LooperTest, SendMessageAtTime_WhenSentToThePresent_ShouldInvokeHandlerDuringNextPoll) {
670 nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC);
671 sp<StubMessageHandler> handler = new StubMessageHandler();
672 mLooper->sendMessageAtTime(now, handler, Message(MSG_TEST1));
673
674 StopWatch stopWatch("pollOnce");
675 int result = mLooper->pollOnce(100);
676 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
677
678 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
679 << "elapsed time should approx. zero because message was already sent";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800680 EXPECT_EQ(Looper::POLL_CALLBACK, result)
681 << "pollOnce result should be Looper::POLL_CALLBACK because message was sent";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800682 EXPECT_EQ(size_t(1), handler->messages.size())
683 << "handled message";
684 EXPECT_EQ(MSG_TEST1, handler->messages[0].what)
685 << "handled message";
686}
687
688TEST_F(LooperTest, RemoveMessage_WhenRemovingAllMessagesForHandler_ShouldRemoveThoseMessage) {
689 sp<StubMessageHandler> handler = new StubMessageHandler();
690 mLooper->sendMessage(handler, Message(MSG_TEST1));
691 mLooper->sendMessage(handler, Message(MSG_TEST2));
692 mLooper->sendMessage(handler, Message(MSG_TEST3));
693 mLooper->removeMessages(handler);
694
695 StopWatch stopWatch("pollOnce");
696 int result = mLooper->pollOnce(0);
697 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
698
699 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
700 << "elapsed time should approx. zero because message was sent so looper was awoken";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800701 EXPECT_EQ(Looper::POLL_WAKE, result)
702 << "pollOnce result should be Looper::POLL_WAKE because looper was awoken";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800703 EXPECT_EQ(size_t(0), handler->messages.size())
704 << "no messages to handle";
705
706 result = mLooper->pollOnce(0);
707
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800708 EXPECT_EQ(Looper::POLL_TIMEOUT, result)
709 << "pollOnce result should be Looper::POLL_TIMEOUT because there was nothing to do";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800710 EXPECT_EQ(size_t(0), handler->messages.size())
711 << "no messages to handle";
712}
713
714TEST_F(LooperTest, RemoveMessage_WhenRemovingSomeMessagesForHandler_ShouldRemoveThoseMessage) {
715 sp<StubMessageHandler> handler = new StubMessageHandler();
716 mLooper->sendMessage(handler, Message(MSG_TEST1));
717 mLooper->sendMessage(handler, Message(MSG_TEST2));
718 mLooper->sendMessage(handler, Message(MSG_TEST3));
719 mLooper->sendMessage(handler, Message(MSG_TEST4));
720 mLooper->removeMessages(handler, MSG_TEST3);
721 mLooper->removeMessages(handler, MSG_TEST1);
722
723 StopWatch stopWatch("pollOnce");
724 int result = mLooper->pollOnce(0);
725 int32_t elapsedMillis = ns2ms(stopWatch.elapsedTime());
726
727 EXPECT_NEAR(0, elapsedMillis, TIMING_TOLERANCE_MS)
728 << "elapsed time should approx. zero because message was sent so looper was awoken";
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800729 EXPECT_EQ(Looper::POLL_CALLBACK, result)
730 << "pollOnce result should be Looper::POLL_CALLBACK because two messages were sent";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800731 EXPECT_EQ(size_t(2), handler->messages.size())
732 << "no messages to handle";
733 EXPECT_EQ(MSG_TEST2, handler->messages[0].what)
734 << "handled message";
735 EXPECT_EQ(MSG_TEST4, handler->messages[1].what)
736 << "handled message";
737
738 result = mLooper->pollOnce(0);
739
Brian Carlstrom1693d7e2013-12-11 22:46:45 -0800740 EXPECT_EQ(Looper::POLL_TIMEOUT, result)
741 << "pollOnce result should be Looper::POLL_TIMEOUT because there was nothing to do";
Jeff Brown3e2e38b2011-03-02 14:41:58 -0800742 EXPECT_EQ(size_t(2), handler->messages.size())
743 << "no more messages to handle";
744}
Jeff Brown7901eb22010-09-13 23:17:30 -0700745
746} // namespace android