blob: 1899bed8ef4565f3c2fae52395ed7cc82db461b3 [file] [log] [blame]
Kevin DuBois305bef12019-10-09 13:23:27 -07001/*
2 * Copyright 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -080017// TODO(b/129481165): remove the #pragma below and fix conversion issues
18#pragma clang diagnostic push
19#pragma clang diagnostic ignored "-Wconversion"
20
Kevin DuBois305bef12019-10-09 13:23:27 -070021#undef LOG_TAG
22#define LOG_TAG "LibSurfaceFlingerUnittests"
23#define LOG_NDEBUG 0
24
25#include "Scheduler/TimeKeeper.h"
Kevin DuBoise4f27a82019-11-12 11:41:41 -080026#include "Scheduler/VSyncDispatchTimerQueue.h"
Kevin DuBois305bef12019-10-09 13:23:27 -070027#include "Scheduler/VSyncTracker.h"
28
29#include <gmock/gmock.h>
30#include <gtest/gtest.h>
31#include <thread>
32
33using namespace testing;
34using namespace std::literals;
35namespace android::scheduler {
36
37class MockVSyncTracker : public VSyncTracker {
38public:
39 MockVSyncTracker(nsecs_t period) : mPeriod{period} {
40 ON_CALL(*this, nextAnticipatedVSyncTimeFrom(_))
41 .WillByDefault(Invoke(this, &MockVSyncTracker::nextVSyncTime));
Kevin DuBois02d5ed92020-01-27 11:05:46 -080042 ON_CALL(*this, addVsyncTimestamp(_)).WillByDefault(Return(true));
Kevin DuBois305bef12019-10-09 13:23:27 -070043 }
44
Kevin DuBois02d5ed92020-01-27 11:05:46 -080045 MOCK_METHOD1(addVsyncTimestamp, bool(nsecs_t));
Kevin DuBois305bef12019-10-09 13:23:27 -070046 MOCK_CONST_METHOD1(nextAnticipatedVSyncTimeFrom, nsecs_t(nsecs_t));
Kevin DuBois2fd3cea2019-11-14 08:52:45 -080047 MOCK_CONST_METHOD0(currentPeriod, nsecs_t());
Kevin DuBoisee2ad9f2019-11-21 11:10:57 -080048 MOCK_METHOD1(setPeriod, void(nsecs_t));
Kevin DuBoisc3e9e8e2020-01-07 09:06:52 -080049 MOCK_METHOD0(resetModel, void());
Ady Abraham5e7371c2020-03-24 14:47:24 -070050 MOCK_CONST_METHOD1(dump, void(std::string&));
Kevin DuBois305bef12019-10-09 13:23:27 -070051
52 nsecs_t nextVSyncTime(nsecs_t timePoint) const {
53 if (timePoint % mPeriod == 0) {
54 return timePoint;
55 }
56 return (timePoint - (timePoint % mPeriod) + mPeriod);
57 }
58
59protected:
60 nsecs_t const mPeriod;
61};
62
63class ControllableClock : public TimeKeeper {
64public:
65 ControllableClock() {
66 ON_CALL(*this, alarmIn(_, _))
67 .WillByDefault(Invoke(this, &ControllableClock::alarmInDefaultBehavior));
68 ON_CALL(*this, now()).WillByDefault(Invoke(this, &ControllableClock::fakeTime));
69 }
70
71 MOCK_CONST_METHOD0(now, nsecs_t());
72 MOCK_METHOD2(alarmIn, void(std::function<void()> const&, nsecs_t time));
73 MOCK_METHOD0(alarmCancel, void());
Ady Abraham75398722020-04-07 14:08:45 -070074 MOCK_CONST_METHOD1(dump, void(std::string&));
Kevin DuBois305bef12019-10-09 13:23:27 -070075
76 void alarmInDefaultBehavior(std::function<void()> const& callback, nsecs_t time) {
77 mCallback = callback;
78 mNextCallbackTime = time + mCurrentTime;
79 }
80
81 nsecs_t fakeTime() const { return mCurrentTime; }
82
83 void advanceToNextCallback() {
84 mCurrentTime = mNextCallbackTime;
85 if (mCallback) {
86 mCallback();
87 }
88 }
89
90 void advanceBy(nsecs_t advancement) {
91 mCurrentTime += advancement;
92 if (mCurrentTime >= mNextCallbackTime && mCallback) {
93 mCallback();
94 }
95 };
96
97private:
98 std::function<void()> mCallback;
99 nsecs_t mNextCallbackTime = 0;
100 nsecs_t mCurrentTime = 0;
101};
102
103class CountingCallback {
104public:
105 CountingCallback(VSyncDispatch& dispatch)
106 : mDispatch(dispatch),
107 mToken(dispatch.registerCallback(std::bind(&CountingCallback::counter, this,
Kevin DuBois2968afc2020-01-14 09:48:50 -0800108 std::placeholders::_1,
109 std::placeholders::_2),
Kevin DuBois305bef12019-10-09 13:23:27 -0700110 "test")) {}
111 ~CountingCallback() { mDispatch.unregisterCallback(mToken); }
112
113 operator VSyncDispatch::CallbackToken() const { return mToken; }
114
Kevin DuBois2968afc2020-01-14 09:48:50 -0800115 void counter(nsecs_t time, nsecs_t) { mCalls.push_back(time); }
Kevin DuBois305bef12019-10-09 13:23:27 -0700116
117 VSyncDispatch& mDispatch;
118 VSyncDispatch::CallbackToken mToken;
119 std::vector<nsecs_t> mCalls;
120};
121
122class PausingCallback {
123public:
124 PausingCallback(VSyncDispatch& dispatch, std::chrono::milliseconds pauseAmount)
125 : mDispatch(dispatch),
126 mToken(dispatch.registerCallback(std::bind(&PausingCallback::pause, this,
Kevin DuBois2968afc2020-01-14 09:48:50 -0800127 std::placeholders::_1,
128 std::placeholders::_2),
Kevin DuBois305bef12019-10-09 13:23:27 -0700129 "test")),
130 mRegistered(true),
131 mPauseAmount(pauseAmount) {}
132 ~PausingCallback() { unregister(); }
133
134 operator VSyncDispatch::CallbackToken() const { return mToken; }
135
Kevin DuBois2968afc2020-01-14 09:48:50 -0800136 void pause(nsecs_t, nsecs_t) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700137 std::unique_lock<std::mutex> lk(mMutex);
138 mPause = true;
139 mCv.notify_all();
140
141 mCv.wait_for(lk, mPauseAmount, [this] { return !mPause; });
142
143 mResourcePresent = (mResource.lock() != nullptr);
144 }
145
146 bool waitForPause() {
147 std::unique_lock<std::mutex> lk(mMutex);
148 auto waiting = mCv.wait_for(lk, 10s, [this] { return mPause; });
149 return waiting;
150 }
151
152 void stashResource(std::weak_ptr<void> const& resource) { mResource = resource; }
153
154 bool resourcePresent() { return mResourcePresent; }
155
156 void unpause() {
157 std::unique_lock<std::mutex> lk(mMutex);
158 mPause = false;
159 mCv.notify_all();
160 }
161
162 void unregister() {
163 if (mRegistered) {
164 mDispatch.unregisterCallback(mToken);
165 mRegistered = false;
166 }
167 }
168
169 VSyncDispatch& mDispatch;
170 VSyncDispatch::CallbackToken mToken;
171 bool mRegistered = true;
172
173 std::mutex mMutex;
174 std::condition_variable mCv;
175 bool mPause = false;
176 std::weak_ptr<void> mResource;
177 bool mResourcePresent = false;
178 std::chrono::milliseconds const mPauseAmount;
179};
180
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800181class VSyncDispatchTimerQueueTest : public testing::Test {
Kevin DuBois305bef12019-10-09 13:23:27 -0700182protected:
183 std::unique_ptr<TimeKeeper> createTimeKeeper() {
184 class TimeKeeperWrapper : public TimeKeeper {
185 public:
186 TimeKeeperWrapper(TimeKeeper& control) : mControllableClock(control) {}
187 void alarmIn(std::function<void()> const& callback, nsecs_t time) final {
188 mControllableClock.alarmIn(callback, time);
189 }
190 void alarmCancel() final { mControllableClock.alarmCancel(); }
191 nsecs_t now() const final { return mControllableClock.now(); }
Ady Abraham75398722020-04-07 14:08:45 -0700192 void dump(std::string&) const final {}
Kevin DuBois305bef12019-10-09 13:23:27 -0700193
194 private:
195 TimeKeeper& mControllableClock;
196 };
197 return std::make_unique<TimeKeeperWrapper>(mMockClock);
198 }
199
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800200 ~VSyncDispatchTimerQueueTest() {
Kevin DuBois305bef12019-10-09 13:23:27 -0700201 // destructor of dispatch will cancelAlarm(). Ignore final cancel in common test.
202 Mock::VerifyAndClearExpectations(&mMockClock);
203 }
204
205 void advanceToNextCallback() { mMockClock.advanceToNextCallback(); }
206
207 NiceMock<ControllableClock> mMockClock;
208 static nsecs_t constexpr mDispatchGroupThreshold = 5;
209 nsecs_t const mPeriod = 1000;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800210 nsecs_t const mVsyncMoveThreshold = 300;
Kevin DuBois305bef12019-10-09 13:23:27 -0700211 NiceMock<MockVSyncTracker> mStubTracker{mPeriod};
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800212 VSyncDispatchTimerQueue mDispatch{createTimeKeeper(), mStubTracker, mDispatchGroupThreshold,
213 mVsyncMoveThreshold};
Kevin DuBois305bef12019-10-09 13:23:27 -0700214};
215
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800216TEST_F(VSyncDispatchTimerQueueTest, unregistersSetAlarmOnDestruction) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700217 EXPECT_CALL(mMockClock, alarmIn(_, 900));
218 EXPECT_CALL(mMockClock, alarmCancel());
219 {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800220 VSyncDispatchTimerQueue mDispatch{createTimeKeeper(), mStubTracker, mDispatchGroupThreshold,
221 mVsyncMoveThreshold};
Kevin DuBois305bef12019-10-09 13:23:27 -0700222 CountingCallback cb(mDispatch);
223 EXPECT_EQ(mDispatch.schedule(cb, 100, 1000), ScheduleResult::Scheduled);
224 }
225}
226
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800227TEST_F(VSyncDispatchTimerQueueTest, basicAlarmSettingFuture) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700228 auto intended = mPeriod - 230;
229 EXPECT_CALL(mMockClock, alarmIn(_, 900));
230
231 CountingCallback cb(mDispatch);
232 EXPECT_EQ(mDispatch.schedule(cb, 100, intended), ScheduleResult::Scheduled);
233 advanceToNextCallback();
234
235 ASSERT_THAT(cb.mCalls.size(), Eq(1));
236 EXPECT_THAT(cb.mCalls[0], Eq(mPeriod));
237}
238
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800239TEST_F(VSyncDispatchTimerQueueTest, basicAlarmSettingFutureWithAdjustmentToTrueVsync) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700240 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(1000)).WillOnce(Return(1150));
241 EXPECT_CALL(mMockClock, alarmIn(_, 1050));
242
243 CountingCallback cb(mDispatch);
244 mDispatch.schedule(cb, 100, mPeriod);
245 advanceToNextCallback();
246
247 ASSERT_THAT(cb.mCalls.size(), Eq(1));
248 EXPECT_THAT(cb.mCalls[0], Eq(1150));
249}
250
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800251TEST_F(VSyncDispatchTimerQueueTest, basicAlarmSettingAdjustmentPast) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700252 auto const now = 234;
253 mMockClock.advanceBy(234);
254 auto const workDuration = 10 * mPeriod;
255 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(now + workDuration))
256 .WillOnce(Return(mPeriod * 11));
257 EXPECT_CALL(mMockClock, alarmIn(_, mPeriod - now));
258
259 CountingCallback cb(mDispatch);
260 EXPECT_EQ(mDispatch.schedule(cb, workDuration, mPeriod), ScheduleResult::Scheduled);
261}
262
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800263TEST_F(VSyncDispatchTimerQueueTest, basicAlarmCancel) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700264 EXPECT_CALL(mMockClock, alarmIn(_, 900));
265 EXPECT_CALL(mMockClock, alarmCancel());
266
267 CountingCallback cb(mDispatch);
268 EXPECT_EQ(mDispatch.schedule(cb, 100, mPeriod), ScheduleResult::Scheduled);
269 EXPECT_EQ(mDispatch.cancel(cb), CancelResult::Cancelled);
270}
271
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800272TEST_F(VSyncDispatchTimerQueueTest, basicAlarmCancelTooLate) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700273 EXPECT_CALL(mMockClock, alarmIn(_, 900));
274 EXPECT_CALL(mMockClock, alarmCancel());
275
276 CountingCallback cb(mDispatch);
277 EXPECT_EQ(mDispatch.schedule(cb, 100, mPeriod), ScheduleResult::Scheduled);
278 mMockClock.advanceBy(950);
279 EXPECT_EQ(mDispatch.cancel(cb), CancelResult::TooLate);
280}
281
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800282TEST_F(VSyncDispatchTimerQueueTest, basicAlarmCancelTooLateWhenRunning) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700283 EXPECT_CALL(mMockClock, alarmIn(_, 900));
284 EXPECT_CALL(mMockClock, alarmCancel());
285
286 PausingCallback cb(mDispatch, std::chrono::duration_cast<std::chrono::milliseconds>(1s));
287 EXPECT_EQ(mDispatch.schedule(cb, 100, mPeriod), ScheduleResult::Scheduled);
288
289 std::thread pausingThread([&] { mMockClock.advanceToNextCallback(); });
290 EXPECT_TRUE(cb.waitForPause());
291 EXPECT_EQ(mDispatch.cancel(cb), CancelResult::TooLate);
292 cb.unpause();
293 pausingThread.join();
294}
295
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800296TEST_F(VSyncDispatchTimerQueueTest, unregisterSynchronizes) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700297 EXPECT_CALL(mMockClock, alarmIn(_, 900));
298 EXPECT_CALL(mMockClock, alarmCancel());
299
300 auto resource = std::make_shared<int>(110);
301
302 PausingCallback cb(mDispatch, 50ms);
303 cb.stashResource(resource);
304 EXPECT_EQ(mDispatch.schedule(cb, 100, mPeriod), ScheduleResult::Scheduled);
305
306 std::thread pausingThread([&] { mMockClock.advanceToNextCallback(); });
307 EXPECT_TRUE(cb.waitForPause());
308
309 cb.unregister();
310 resource.reset();
311
312 cb.unpause();
313 pausingThread.join();
314
315 EXPECT_TRUE(cb.resourcePresent());
316}
317
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800318TEST_F(VSyncDispatchTimerQueueTest, basicTwoAlarmSetting) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700319 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(1000))
320 .Times(4)
321 .WillOnce(Return(1055))
322 .WillOnce(Return(1063))
323 .WillOnce(Return(1063))
324 .WillOnce(Return(1075));
325
326 Sequence seq;
327 EXPECT_CALL(mMockClock, alarmIn(_, 955)).InSequence(seq);
328 EXPECT_CALL(mMockClock, alarmIn(_, 813)).InSequence(seq);
329 EXPECT_CALL(mMockClock, alarmIn(_, 162)).InSequence(seq);
330
331 CountingCallback cb0(mDispatch);
332 CountingCallback cb1(mDispatch);
333
334 mDispatch.schedule(cb0, 100, mPeriod);
335 mDispatch.schedule(cb1, 250, mPeriod);
336
337 advanceToNextCallback();
338 advanceToNextCallback();
339
340 ASSERT_THAT(cb0.mCalls.size(), Eq(1));
341 EXPECT_THAT(cb0.mCalls[0], Eq(1075));
342 ASSERT_THAT(cb1.mCalls.size(), Eq(1));
343 EXPECT_THAT(cb1.mCalls[0], Eq(1063));
344}
345
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800346TEST_F(VSyncDispatchTimerQueueTest, rearmsFaroutTimeoutWhenCancellingCloseOne) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700347 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(_))
348 .Times(4)
349 .WillOnce(Return(10000))
350 .WillOnce(Return(1000))
351 .WillOnce(Return(10000))
352 .WillOnce(Return(10000));
353
354 Sequence seq;
355 EXPECT_CALL(mMockClock, alarmIn(_, 9900)).InSequence(seq);
356 EXPECT_CALL(mMockClock, alarmIn(_, 750)).InSequence(seq);
357 EXPECT_CALL(mMockClock, alarmIn(_, 9900)).InSequence(seq);
358
359 CountingCallback cb0(mDispatch);
360 CountingCallback cb1(mDispatch);
361
362 mDispatch.schedule(cb0, 100, mPeriod * 10);
363 mDispatch.schedule(cb1, 250, mPeriod);
364 mDispatch.cancel(cb1);
365}
366
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800367TEST_F(VSyncDispatchTimerQueueTest, noUnnecessaryRearmsWhenRescheduling) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700368 Sequence seq;
369 EXPECT_CALL(mMockClock, alarmIn(_, 600)).InSequence(seq);
370 EXPECT_CALL(mMockClock, alarmIn(_, 100)).InSequence(seq);
371
372 CountingCallback cb0(mDispatch);
373 CountingCallback cb1(mDispatch);
374
375 mDispatch.schedule(cb0, 400, 1000);
376 mDispatch.schedule(cb1, 200, 1000);
377 mDispatch.schedule(cb1, 300, 1000);
378 advanceToNextCallback();
379}
380
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800381TEST_F(VSyncDispatchTimerQueueTest, necessaryRearmsWhenModifying) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700382 Sequence seq;
383 EXPECT_CALL(mMockClock, alarmIn(_, 600)).InSequence(seq);
384 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
385 EXPECT_CALL(mMockClock, alarmIn(_, 100)).InSequence(seq);
386
387 CountingCallback cb0(mDispatch);
388 CountingCallback cb1(mDispatch);
389
390 mDispatch.schedule(cb0, 400, 1000);
391 mDispatch.schedule(cb1, 200, 1000);
392 mDispatch.schedule(cb1, 500, 1000);
393 advanceToNextCallback();
394}
395
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800396TEST_F(VSyncDispatchTimerQueueTest, modifyIntoGroup) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700397 Sequence seq;
398 EXPECT_CALL(mMockClock, alarmIn(_, 600)).InSequence(seq);
399 EXPECT_CALL(mMockClock, alarmIn(_, 1000)).InSequence(seq);
400 EXPECT_CALL(mMockClock, alarmIn(_, 990)).InSequence(seq);
401 EXPECT_CALL(mMockClock, alarmIn(_, 10)).InSequence(seq);
402
403 auto offset = 400;
404 auto closeOffset = offset + mDispatchGroupThreshold - 1;
405 auto notCloseOffset = offset + 2 * mDispatchGroupThreshold;
406
407 CountingCallback cb0(mDispatch);
408 CountingCallback cb1(mDispatch);
409
410 mDispatch.schedule(cb0, 400, 1000);
411 mDispatch.schedule(cb1, 200, 1000);
412 mDispatch.schedule(cb1, closeOffset, 1000);
413
414 advanceToNextCallback();
415 ASSERT_THAT(cb0.mCalls.size(), Eq(1));
416 EXPECT_THAT(cb0.mCalls[0], Eq(mPeriod));
417 ASSERT_THAT(cb1.mCalls.size(), Eq(1));
418 EXPECT_THAT(cb1.mCalls[0], Eq(mPeriod));
419
420 mDispatch.schedule(cb0, 400, 2000);
421 mDispatch.schedule(cb1, notCloseOffset, 2000);
422 advanceToNextCallback();
423 ASSERT_THAT(cb1.mCalls.size(), Eq(2));
424 EXPECT_THAT(cb1.mCalls[1], Eq(2000));
425
426 advanceToNextCallback();
427 ASSERT_THAT(cb0.mCalls.size(), Eq(2));
428 EXPECT_THAT(cb0.mCalls[1], Eq(2000));
429}
430
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800431TEST_F(VSyncDispatchTimerQueueTest, rearmsWhenEndingAndDoesntCancel) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700432 EXPECT_CALL(mMockClock, alarmIn(_, 900));
433 EXPECT_CALL(mMockClock, alarmIn(_, 800));
434 EXPECT_CALL(mMockClock, alarmIn(_, 100));
435 EXPECT_CALL(mMockClock, alarmCancel());
436
437 CountingCallback cb0(mDispatch);
438 CountingCallback cb1(mDispatch);
439
440 mDispatch.schedule(cb0, 100, 1000);
441 mDispatch.schedule(cb1, 200, 1000);
442 advanceToNextCallback();
443 EXPECT_EQ(mDispatch.cancel(cb0), CancelResult::Cancelled);
444}
445
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800446TEST_F(VSyncDispatchTimerQueueTest, setAlarmCallsAtCorrectTimeWithChangingVsync) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700447 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(_))
448 .Times(3)
449 .WillOnce(Return(950))
450 .WillOnce(Return(1975))
451 .WillOnce(Return(2950));
452
453 CountingCallback cb(mDispatch);
454 mDispatch.schedule(cb, 100, 920);
455
456 mMockClock.advanceBy(850);
457 EXPECT_THAT(cb.mCalls.size(), Eq(1));
458
459 mDispatch.schedule(cb, 100, 1900);
460 mMockClock.advanceBy(900);
461 EXPECT_THAT(cb.mCalls.size(), Eq(1));
462 mMockClock.advanceBy(125);
463 EXPECT_THAT(cb.mCalls.size(), Eq(2));
464
465 mDispatch.schedule(cb, 100, 2900);
466 mMockClock.advanceBy(975);
467 EXPECT_THAT(cb.mCalls.size(), Eq(3));
468}
469
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800470TEST_F(VSyncDispatchTimerQueueTest, callbackReentrancy) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700471 Sequence seq;
472 EXPECT_CALL(mMockClock, alarmIn(_, 900)).InSequence(seq);
473 EXPECT_CALL(mMockClock, alarmIn(_, 1000)).InSequence(seq);
474
475 VSyncDispatch::CallbackToken tmp;
Kevin DuBois2968afc2020-01-14 09:48:50 -0800476 tmp = mDispatch.registerCallback([&](auto, auto) { mDispatch.schedule(tmp, 100, 2000); },
477 "o.o");
Kevin DuBois305bef12019-10-09 13:23:27 -0700478
479 mDispatch.schedule(tmp, 100, 1000);
480 advanceToNextCallback();
481}
482
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800483TEST_F(VSyncDispatchTimerQueueTest, callbackReentrantWithPastWakeup) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700484 VSyncDispatch::CallbackToken tmp;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800485 std::optional<nsecs_t> lastTarget;
Kevin DuBois305bef12019-10-09 13:23:27 -0700486 tmp = mDispatch.registerCallback(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800487 [&](auto timestamp, auto) {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800488 EXPECT_EQ(mDispatch.schedule(tmp, 400, timestamp - mVsyncMoveThreshold),
489 ScheduleResult::Scheduled);
490 EXPECT_EQ(mDispatch.schedule(tmp, 400, timestamp), ScheduleResult::Scheduled);
491 EXPECT_EQ(mDispatch.schedule(tmp, 400, timestamp + mVsyncMoveThreshold),
492 ScheduleResult::Scheduled);
493 lastTarget = timestamp;
Kevin DuBois305bef12019-10-09 13:23:27 -0700494 },
495 "oo");
496
497 mDispatch.schedule(tmp, 999, 1000);
498 advanceToNextCallback();
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800499 EXPECT_THAT(lastTarget, Eq(1000));
500
501 advanceToNextCallback();
502 EXPECT_THAT(lastTarget, Eq(2000));
Kevin DuBois305bef12019-10-09 13:23:27 -0700503}
504
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800505TEST_F(VSyncDispatchTimerQueueTest, modificationsAroundVsyncTime) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700506 Sequence seq;
507 EXPECT_CALL(mMockClock, alarmIn(_, 1000)).InSequence(seq);
508 EXPECT_CALL(mMockClock, alarmIn(_, 200)).InSequence(seq);
509 EXPECT_CALL(mMockClock, alarmIn(_, 1000)).InSequence(seq);
510 EXPECT_CALL(mMockClock, alarmIn(_, 150)).InSequence(seq);
511
512 CountingCallback cb(mDispatch);
513 mDispatch.schedule(cb, 0, 1000);
514
515 mMockClock.advanceBy(750);
516 mDispatch.schedule(cb, 50, 1000);
517
518 advanceToNextCallback();
519 mDispatch.schedule(cb, 50, 2000);
520
521 mMockClock.advanceBy(800);
522 mDispatch.schedule(cb, 100, 2000);
523}
524
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800525TEST_F(VSyncDispatchTimerQueueTest, lateModifications) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700526 Sequence seq;
527 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
528 EXPECT_CALL(mMockClock, alarmIn(_, 400)).InSequence(seq);
529 EXPECT_CALL(mMockClock, alarmIn(_, 350)).InSequence(seq);
530 EXPECT_CALL(mMockClock, alarmIn(_, 950)).InSequence(seq);
531
532 CountingCallback cb0(mDispatch);
533 CountingCallback cb1(mDispatch);
534
535 mDispatch.schedule(cb0, 500, 1000);
536 mDispatch.schedule(cb1, 100, 1000);
537
538 advanceToNextCallback();
539 mDispatch.schedule(cb0, 200, 2000);
540 mDispatch.schedule(cb1, 150, 1000);
541
542 advanceToNextCallback();
543 advanceToNextCallback();
544}
545
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800546TEST_F(VSyncDispatchTimerQueueTest, doesntCancelPriorValidTimerForFutureMod) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700547 Sequence seq;
548 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
549
550 CountingCallback cb0(mDispatch);
551 CountingCallback cb1(mDispatch);
552 mDispatch.schedule(cb0, 500, 1000);
553 mDispatch.schedule(cb1, 500, 20000);
554}
555
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800556TEST_F(VSyncDispatchTimerQueueTest, setsTimerAfterCancellation) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700557 Sequence seq;
558 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
559 EXPECT_CALL(mMockClock, alarmCancel()).InSequence(seq);
560 EXPECT_CALL(mMockClock, alarmIn(_, 900)).InSequence(seq);
561
562 CountingCallback cb0(mDispatch);
563 mDispatch.schedule(cb0, 500, 1000);
564 mDispatch.cancel(cb0);
565 mDispatch.schedule(cb0, 100, 1000);
566}
567
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800568TEST_F(VSyncDispatchTimerQueueTest, makingUpIdsError) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700569 VSyncDispatch::CallbackToken token(100);
570 EXPECT_THAT(mDispatch.schedule(token, 100, 1000), Eq(ScheduleResult::Error));
571 EXPECT_THAT(mDispatch.cancel(token), Eq(CancelResult::Error));
572}
573
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800574TEST_F(VSyncDispatchTimerQueueTest, canMoveCallbackBackwardsInTime) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700575 CountingCallback cb0(mDispatch);
576 EXPECT_EQ(mDispatch.schedule(cb0, 500, 1000), ScheduleResult::Scheduled);
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800577 EXPECT_EQ(mDispatch.schedule(cb0, 100, 1000), ScheduleResult::Scheduled);
578}
579
580// b/1450138150
581TEST_F(VSyncDispatchTimerQueueTest, doesNotMoveCallbackBackwardsAndSkipAScheduledTargetVSync) {
582 EXPECT_CALL(mMockClock, alarmIn(_, 500));
583 CountingCallback cb(mDispatch);
584 EXPECT_EQ(mDispatch.schedule(cb, 500, 1000), ScheduleResult::Scheduled);
585 mMockClock.advanceBy(400);
586
587 EXPECT_EQ(mDispatch.schedule(cb, 800, 1000), ScheduleResult::Scheduled);
588 advanceToNextCallback();
589 ASSERT_THAT(cb.mCalls.size(), Eq(1));
590}
591
592TEST_F(VSyncDispatchTimerQueueTest, targetOffsetMovingBackALittleCanStillSchedule) {
593 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(1000))
594 .Times(2)
595 .WillOnce(Return(1000))
596 .WillOnce(Return(1002));
597 CountingCallback cb(mDispatch);
598 EXPECT_EQ(mDispatch.schedule(cb, 500, 1000), ScheduleResult::Scheduled);
599 mMockClock.advanceBy(400);
600 EXPECT_EQ(mDispatch.schedule(cb, 400, 1000), ScheduleResult::Scheduled);
Kevin DuBois305bef12019-10-09 13:23:27 -0700601}
602
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800603TEST_F(VSyncDispatchTimerQueueTest, canScheduleNegativeOffsetAgainstDifferentPeriods) {
604 CountingCallback cb0(mDispatch);
605 EXPECT_EQ(mDispatch.schedule(cb0, 500, 1000), ScheduleResult::Scheduled);
606 advanceToNextCallback();
607 EXPECT_EQ(mDispatch.schedule(cb0, 1100, 2000), ScheduleResult::Scheduled);
608}
609
610TEST_F(VSyncDispatchTimerQueueTest, canScheduleLargeNegativeOffset) {
611 Sequence seq;
612 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
613 EXPECT_CALL(mMockClock, alarmIn(_, 600)).InSequence(seq);
614 CountingCallback cb0(mDispatch);
615 EXPECT_EQ(mDispatch.schedule(cb0, 500, 1000), ScheduleResult::Scheduled);
616 advanceToNextCallback();
617 EXPECT_EQ(mDispatch.schedule(cb0, 1900, 2000), ScheduleResult::Scheduled);
618}
619
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800620TEST_F(VSyncDispatchTimerQueueTest, scheduleUpdatesDoesNotAffectSchedulingState) {
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800621 EXPECT_CALL(mMockClock, alarmIn(_, 600));
622
623 CountingCallback cb(mDispatch);
624 EXPECT_EQ(mDispatch.schedule(cb, 400, 1000), ScheduleResult::Scheduled);
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800625
626 EXPECT_EQ(mDispatch.schedule(cb, 1400, 1000), ScheduleResult::Scheduled);
627
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800628 advanceToNextCallback();
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800629}
630
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800631TEST_F(VSyncDispatchTimerQueueTest, helperMove) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700632 EXPECT_CALL(mMockClock, alarmIn(_, 500)).Times(1);
633 EXPECT_CALL(mMockClock, alarmCancel()).Times(1);
634
635 VSyncCallbackRegistration cb(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800636 mDispatch, [](auto, auto) {}, "");
Kevin DuBois305bef12019-10-09 13:23:27 -0700637 VSyncCallbackRegistration cb1(std::move(cb));
638 cb.schedule(100, 1000);
639 cb.cancel();
640
641 cb1.schedule(500, 1000);
642 cb1.cancel();
643}
644
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800645TEST_F(VSyncDispatchTimerQueueTest, helperMoveAssign) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700646 EXPECT_CALL(mMockClock, alarmIn(_, 500)).Times(1);
647 EXPECT_CALL(mMockClock, alarmCancel()).Times(1);
648
649 VSyncCallbackRegistration cb(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800650 mDispatch, [](auto, auto) {}, "");
Kevin DuBois305bef12019-10-09 13:23:27 -0700651 VSyncCallbackRegistration cb1(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800652 mDispatch, [](auto, auto) {}, "");
Kevin DuBois305bef12019-10-09 13:23:27 -0700653 cb1 = std::move(cb);
654 cb.schedule(100, 1000);
655 cb.cancel();
656
657 cb1.schedule(500, 1000);
658 cb1.cancel();
659}
660
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800661class VSyncDispatchTimerQueueEntryTest : public testing::Test {
Kevin DuBois305bef12019-10-09 13:23:27 -0700662protected:
663 nsecs_t const mPeriod = 1000;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800664 nsecs_t const mVsyncMoveThreshold = 200;
Kevin DuBois305bef12019-10-09 13:23:27 -0700665 NiceMock<MockVSyncTracker> mStubTracker{mPeriod};
666};
667
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800668TEST_F(VSyncDispatchTimerQueueEntryTest, stateAfterInitialization) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700669 std::string name("basicname");
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800670 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800671 name, [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700672 EXPECT_THAT(entry.name(), Eq(name));
673 EXPECT_FALSE(entry.lastExecutedVsyncTarget());
674 EXPECT_FALSE(entry.wakeupTime());
675}
676
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800677TEST_F(VSyncDispatchTimerQueueEntryTest, stateScheduling) {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800678 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800679 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700680
681 EXPECT_FALSE(entry.wakeupTime());
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800682 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
683 auto const wakeup = entry.wakeupTime();
684 ASSERT_TRUE(wakeup);
685 EXPECT_THAT(*wakeup, Eq(900));
Kevin DuBois305bef12019-10-09 13:23:27 -0700686
687 entry.disarm();
688 EXPECT_FALSE(entry.wakeupTime());
689}
690
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800691TEST_F(VSyncDispatchTimerQueueEntryTest, stateSchedulingReallyLongWakeupLatency) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700692 auto const duration = 500;
693 auto const now = 8750;
694
695 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(now + duration))
696 .Times(1)
697 .WillOnce(Return(10000));
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800698 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800699 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700700
701 EXPECT_FALSE(entry.wakeupTime());
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800702 EXPECT_THAT(entry.schedule(500, 994, mStubTracker, now), Eq(ScheduleResult::Scheduled));
703 auto const wakeup = entry.wakeupTime();
704 ASSERT_TRUE(wakeup);
705 EXPECT_THAT(*wakeup, Eq(9500));
Kevin DuBois305bef12019-10-09 13:23:27 -0700706}
707
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800708TEST_F(VSyncDispatchTimerQueueEntryTest, runCallback) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700709 auto callCount = 0;
Kevin DuBois2968afc2020-01-14 09:48:50 -0800710 auto vsyncCalledTime = 0;
711 auto wakeupCalledTime = 0;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800712 VSyncDispatchTimerQueueEntry entry(
713 "test",
Kevin DuBois2968afc2020-01-14 09:48:50 -0800714 [&](auto vsyncTime, auto wakeupTime) {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800715 callCount++;
Kevin DuBois2968afc2020-01-14 09:48:50 -0800716 vsyncCalledTime = vsyncTime;
717 wakeupCalledTime = wakeupTime;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800718 },
719 mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700720
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800721 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
722 auto const wakeup = entry.wakeupTime();
723 ASSERT_TRUE(wakeup);
724 EXPECT_THAT(*wakeup, Eq(900));
Kevin DuBois305bef12019-10-09 13:23:27 -0700725
Kevin DuBois2968afc2020-01-14 09:48:50 -0800726 entry.callback(entry.executing(), *wakeup);
Kevin DuBois305bef12019-10-09 13:23:27 -0700727
728 EXPECT_THAT(callCount, Eq(1));
Kevin DuBois2968afc2020-01-14 09:48:50 -0800729 EXPECT_THAT(vsyncCalledTime, Eq(mPeriod));
730 EXPECT_THAT(wakeupCalledTime, Eq(*wakeup));
Kevin DuBois305bef12019-10-09 13:23:27 -0700731 EXPECT_FALSE(entry.wakeupTime());
732 auto lastCalledTarget = entry.lastExecutedVsyncTarget();
733 ASSERT_TRUE(lastCalledTarget);
734 EXPECT_THAT(*lastCalledTarget, Eq(mPeriod));
735}
736
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800737TEST_F(VSyncDispatchTimerQueueEntryTest, updateCallback) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700738 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(_))
739 .Times(2)
740 .WillOnce(Return(1000))
741 .WillOnce(Return(1020));
742
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800743 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800744 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700745
746 EXPECT_FALSE(entry.wakeupTime());
747 entry.update(mStubTracker, 0);
748 EXPECT_FALSE(entry.wakeupTime());
749
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800750 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
751 auto wakeup = entry.wakeupTime();
752 ASSERT_TRUE(wakeup);
Kevin DuBois305bef12019-10-09 13:23:27 -0700753 EXPECT_THAT(wakeup, Eq(900));
754
755 entry.update(mStubTracker, 0);
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800756 wakeup = entry.wakeupTime();
757 ASSERT_TRUE(wakeup);
758 EXPECT_THAT(*wakeup, Eq(920));
Kevin DuBois305bef12019-10-09 13:23:27 -0700759}
760
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800761TEST_F(VSyncDispatchTimerQueueEntryTest, skipsUpdateIfJustScheduled) {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800762 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800763 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800764 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBois305bef12019-10-09 13:23:27 -0700765 entry.update(mStubTracker, 0);
766
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800767 auto const wakeup = entry.wakeupTime();
768 ASSERT_TRUE(wakeup);
769 EXPECT_THAT(*wakeup, Eq(wakeup));
770}
771
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800772TEST_F(VSyncDispatchTimerQueueEntryTest, willSnapToNextTargettableVSync) {
773 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800774 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800775 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800776 entry.executing(); // 1000 is executing
777 // had 1000 not been executing, this could have been scheduled for time 800.
778 EXPECT_THAT(entry.schedule(200, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
779 EXPECT_THAT(*entry.wakeupTime(), Eq(1800));
780
781 EXPECT_THAT(entry.schedule(50, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
782 EXPECT_THAT(*entry.wakeupTime(), Eq(1950));
783
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800784 EXPECT_THAT(entry.schedule(200, 1001, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800785 EXPECT_THAT(*entry.wakeupTime(), Eq(1800));
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800786}
787
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800788TEST_F(VSyncDispatchTimerQueueEntryTest,
789 willRequestNextEstimateWhenSnappingToNextTargettableVSync) {
790 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800791 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800792
793 Sequence seq;
794 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(500))
795 .InSequence(seq)
796 .WillOnce(Return(1000));
797 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(500))
798 .InSequence(seq)
799 .WillOnce(Return(1000));
800 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(1000 + mVsyncMoveThreshold))
801 .InSequence(seq)
802 .WillOnce(Return(2000));
803
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800804 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800805
806 entry.executing(); // 1000 is executing
807
808 EXPECT_THAT(entry.schedule(200, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
809}
810
811TEST_F(VSyncDispatchTimerQueueEntryTest, reportsScheduledIfStillTime) {
812 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800813 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800814 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
815 EXPECT_THAT(entry.schedule(200, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
816 EXPECT_THAT(entry.schedule(50, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
817 EXPECT_THAT(entry.schedule(1200, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBois305bef12019-10-09 13:23:27 -0700818}
819
820} // namespace android::scheduler
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -0800821
822// TODO(b/129481165): remove the #pragma below and fix conversion issues
823#pragma clang diagnostic pop // ignored "-Wconversion"