blob: 3543361f7b8fcee2d5567c7dc72316f71219da6e [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());
74
75 void alarmInDefaultBehavior(std::function<void()> const& callback, nsecs_t time) {
76 mCallback = callback;
77 mNextCallbackTime = time + mCurrentTime;
78 }
79
80 nsecs_t fakeTime() const { return mCurrentTime; }
81
82 void advanceToNextCallback() {
83 mCurrentTime = mNextCallbackTime;
84 if (mCallback) {
85 mCallback();
86 }
87 }
88
89 void advanceBy(nsecs_t advancement) {
90 mCurrentTime += advancement;
91 if (mCurrentTime >= mNextCallbackTime && mCallback) {
92 mCallback();
93 }
94 };
95
96private:
97 std::function<void()> mCallback;
98 nsecs_t mNextCallbackTime = 0;
99 nsecs_t mCurrentTime = 0;
100};
101
102class CountingCallback {
103public:
104 CountingCallback(VSyncDispatch& dispatch)
105 : mDispatch(dispatch),
106 mToken(dispatch.registerCallback(std::bind(&CountingCallback::counter, this,
Kevin DuBois2968afc2020-01-14 09:48:50 -0800107 std::placeholders::_1,
108 std::placeholders::_2),
Kevin DuBois305bef12019-10-09 13:23:27 -0700109 "test")) {}
110 ~CountingCallback() { mDispatch.unregisterCallback(mToken); }
111
112 operator VSyncDispatch::CallbackToken() const { return mToken; }
113
Kevin DuBois2968afc2020-01-14 09:48:50 -0800114 void counter(nsecs_t time, nsecs_t) { mCalls.push_back(time); }
Kevin DuBois305bef12019-10-09 13:23:27 -0700115
116 VSyncDispatch& mDispatch;
117 VSyncDispatch::CallbackToken mToken;
118 std::vector<nsecs_t> mCalls;
119};
120
121class PausingCallback {
122public:
123 PausingCallback(VSyncDispatch& dispatch, std::chrono::milliseconds pauseAmount)
124 : mDispatch(dispatch),
125 mToken(dispatch.registerCallback(std::bind(&PausingCallback::pause, this,
Kevin DuBois2968afc2020-01-14 09:48:50 -0800126 std::placeholders::_1,
127 std::placeholders::_2),
Kevin DuBois305bef12019-10-09 13:23:27 -0700128 "test")),
129 mRegistered(true),
130 mPauseAmount(pauseAmount) {}
131 ~PausingCallback() { unregister(); }
132
133 operator VSyncDispatch::CallbackToken() const { return mToken; }
134
Kevin DuBois2968afc2020-01-14 09:48:50 -0800135 void pause(nsecs_t, nsecs_t) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700136 std::unique_lock<std::mutex> lk(mMutex);
137 mPause = true;
138 mCv.notify_all();
139
140 mCv.wait_for(lk, mPauseAmount, [this] { return !mPause; });
141
142 mResourcePresent = (mResource.lock() != nullptr);
143 }
144
145 bool waitForPause() {
146 std::unique_lock<std::mutex> lk(mMutex);
147 auto waiting = mCv.wait_for(lk, 10s, [this] { return mPause; });
148 return waiting;
149 }
150
151 void stashResource(std::weak_ptr<void> const& resource) { mResource = resource; }
152
153 bool resourcePresent() { return mResourcePresent; }
154
155 void unpause() {
156 std::unique_lock<std::mutex> lk(mMutex);
157 mPause = false;
158 mCv.notify_all();
159 }
160
161 void unregister() {
162 if (mRegistered) {
163 mDispatch.unregisterCallback(mToken);
164 mRegistered = false;
165 }
166 }
167
168 VSyncDispatch& mDispatch;
169 VSyncDispatch::CallbackToken mToken;
170 bool mRegistered = true;
171
172 std::mutex mMutex;
173 std::condition_variable mCv;
174 bool mPause = false;
175 std::weak_ptr<void> mResource;
176 bool mResourcePresent = false;
177 std::chrono::milliseconds const mPauseAmount;
178};
179
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800180class VSyncDispatchTimerQueueTest : public testing::Test {
Kevin DuBois305bef12019-10-09 13:23:27 -0700181protected:
182 std::unique_ptr<TimeKeeper> createTimeKeeper() {
183 class TimeKeeperWrapper : public TimeKeeper {
184 public:
185 TimeKeeperWrapper(TimeKeeper& control) : mControllableClock(control) {}
186 void alarmIn(std::function<void()> const& callback, nsecs_t time) final {
187 mControllableClock.alarmIn(callback, time);
188 }
189 void alarmCancel() final { mControllableClock.alarmCancel(); }
190 nsecs_t now() const final { return mControllableClock.now(); }
191
192 private:
193 TimeKeeper& mControllableClock;
194 };
195 return std::make_unique<TimeKeeperWrapper>(mMockClock);
196 }
197
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800198 ~VSyncDispatchTimerQueueTest() {
Kevin DuBois305bef12019-10-09 13:23:27 -0700199 // destructor of dispatch will cancelAlarm(). Ignore final cancel in common test.
200 Mock::VerifyAndClearExpectations(&mMockClock);
201 }
202
203 void advanceToNextCallback() { mMockClock.advanceToNextCallback(); }
204
205 NiceMock<ControllableClock> mMockClock;
206 static nsecs_t constexpr mDispatchGroupThreshold = 5;
207 nsecs_t const mPeriod = 1000;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800208 nsecs_t const mVsyncMoveThreshold = 300;
Kevin DuBois305bef12019-10-09 13:23:27 -0700209 NiceMock<MockVSyncTracker> mStubTracker{mPeriod};
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800210 VSyncDispatchTimerQueue mDispatch{createTimeKeeper(), mStubTracker, mDispatchGroupThreshold,
211 mVsyncMoveThreshold};
Kevin DuBois305bef12019-10-09 13:23:27 -0700212};
213
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800214TEST_F(VSyncDispatchTimerQueueTest, unregistersSetAlarmOnDestruction) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700215 EXPECT_CALL(mMockClock, alarmIn(_, 900));
216 EXPECT_CALL(mMockClock, alarmCancel());
217 {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800218 VSyncDispatchTimerQueue mDispatch{createTimeKeeper(), mStubTracker, mDispatchGroupThreshold,
219 mVsyncMoveThreshold};
Kevin DuBois305bef12019-10-09 13:23:27 -0700220 CountingCallback cb(mDispatch);
221 EXPECT_EQ(mDispatch.schedule(cb, 100, 1000), ScheduleResult::Scheduled);
222 }
223}
224
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800225TEST_F(VSyncDispatchTimerQueueTest, basicAlarmSettingFuture) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700226 auto intended = mPeriod - 230;
227 EXPECT_CALL(mMockClock, alarmIn(_, 900));
228
229 CountingCallback cb(mDispatch);
230 EXPECT_EQ(mDispatch.schedule(cb, 100, intended), ScheduleResult::Scheduled);
231 advanceToNextCallback();
232
233 ASSERT_THAT(cb.mCalls.size(), Eq(1));
234 EXPECT_THAT(cb.mCalls[0], Eq(mPeriod));
235}
236
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800237TEST_F(VSyncDispatchTimerQueueTest, basicAlarmSettingFutureWithAdjustmentToTrueVsync) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700238 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(1000)).WillOnce(Return(1150));
239 EXPECT_CALL(mMockClock, alarmIn(_, 1050));
240
241 CountingCallback cb(mDispatch);
242 mDispatch.schedule(cb, 100, mPeriod);
243 advanceToNextCallback();
244
245 ASSERT_THAT(cb.mCalls.size(), Eq(1));
246 EXPECT_THAT(cb.mCalls[0], Eq(1150));
247}
248
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800249TEST_F(VSyncDispatchTimerQueueTest, basicAlarmSettingAdjustmentPast) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700250 auto const now = 234;
251 mMockClock.advanceBy(234);
252 auto const workDuration = 10 * mPeriod;
253 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(now + workDuration))
254 .WillOnce(Return(mPeriod * 11));
255 EXPECT_CALL(mMockClock, alarmIn(_, mPeriod - now));
256
257 CountingCallback cb(mDispatch);
258 EXPECT_EQ(mDispatch.schedule(cb, workDuration, mPeriod), ScheduleResult::Scheduled);
259}
260
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800261TEST_F(VSyncDispatchTimerQueueTest, basicAlarmCancel) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700262 EXPECT_CALL(mMockClock, alarmIn(_, 900));
263 EXPECT_CALL(mMockClock, alarmCancel());
264
265 CountingCallback cb(mDispatch);
266 EXPECT_EQ(mDispatch.schedule(cb, 100, mPeriod), ScheduleResult::Scheduled);
267 EXPECT_EQ(mDispatch.cancel(cb), CancelResult::Cancelled);
268}
269
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800270TEST_F(VSyncDispatchTimerQueueTest, basicAlarmCancelTooLate) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700271 EXPECT_CALL(mMockClock, alarmIn(_, 900));
272 EXPECT_CALL(mMockClock, alarmCancel());
273
274 CountingCallback cb(mDispatch);
275 EXPECT_EQ(mDispatch.schedule(cb, 100, mPeriod), ScheduleResult::Scheduled);
276 mMockClock.advanceBy(950);
277 EXPECT_EQ(mDispatch.cancel(cb), CancelResult::TooLate);
278}
279
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800280TEST_F(VSyncDispatchTimerQueueTest, basicAlarmCancelTooLateWhenRunning) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700281 EXPECT_CALL(mMockClock, alarmIn(_, 900));
282 EXPECT_CALL(mMockClock, alarmCancel());
283
284 PausingCallback cb(mDispatch, std::chrono::duration_cast<std::chrono::milliseconds>(1s));
285 EXPECT_EQ(mDispatch.schedule(cb, 100, mPeriod), ScheduleResult::Scheduled);
286
287 std::thread pausingThread([&] { mMockClock.advanceToNextCallback(); });
288 EXPECT_TRUE(cb.waitForPause());
289 EXPECT_EQ(mDispatch.cancel(cb), CancelResult::TooLate);
290 cb.unpause();
291 pausingThread.join();
292}
293
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800294TEST_F(VSyncDispatchTimerQueueTest, unregisterSynchronizes) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700295 EXPECT_CALL(mMockClock, alarmIn(_, 900));
296 EXPECT_CALL(mMockClock, alarmCancel());
297
298 auto resource = std::make_shared<int>(110);
299
300 PausingCallback cb(mDispatch, 50ms);
301 cb.stashResource(resource);
302 EXPECT_EQ(mDispatch.schedule(cb, 100, mPeriod), ScheduleResult::Scheduled);
303
304 std::thread pausingThread([&] { mMockClock.advanceToNextCallback(); });
305 EXPECT_TRUE(cb.waitForPause());
306
307 cb.unregister();
308 resource.reset();
309
310 cb.unpause();
311 pausingThread.join();
312
313 EXPECT_TRUE(cb.resourcePresent());
314}
315
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800316TEST_F(VSyncDispatchTimerQueueTest, basicTwoAlarmSetting) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700317 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(1000))
318 .Times(4)
319 .WillOnce(Return(1055))
320 .WillOnce(Return(1063))
321 .WillOnce(Return(1063))
322 .WillOnce(Return(1075));
323
324 Sequence seq;
325 EXPECT_CALL(mMockClock, alarmIn(_, 955)).InSequence(seq);
326 EXPECT_CALL(mMockClock, alarmIn(_, 813)).InSequence(seq);
327 EXPECT_CALL(mMockClock, alarmIn(_, 162)).InSequence(seq);
328
329 CountingCallback cb0(mDispatch);
330 CountingCallback cb1(mDispatch);
331
332 mDispatch.schedule(cb0, 100, mPeriod);
333 mDispatch.schedule(cb1, 250, mPeriod);
334
335 advanceToNextCallback();
336 advanceToNextCallback();
337
338 ASSERT_THAT(cb0.mCalls.size(), Eq(1));
339 EXPECT_THAT(cb0.mCalls[0], Eq(1075));
340 ASSERT_THAT(cb1.mCalls.size(), Eq(1));
341 EXPECT_THAT(cb1.mCalls[0], Eq(1063));
342}
343
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800344TEST_F(VSyncDispatchTimerQueueTest, rearmsFaroutTimeoutWhenCancellingCloseOne) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700345 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(_))
346 .Times(4)
347 .WillOnce(Return(10000))
348 .WillOnce(Return(1000))
349 .WillOnce(Return(10000))
350 .WillOnce(Return(10000));
351
352 Sequence seq;
353 EXPECT_CALL(mMockClock, alarmIn(_, 9900)).InSequence(seq);
354 EXPECT_CALL(mMockClock, alarmIn(_, 750)).InSequence(seq);
355 EXPECT_CALL(mMockClock, alarmIn(_, 9900)).InSequence(seq);
356
357 CountingCallback cb0(mDispatch);
358 CountingCallback cb1(mDispatch);
359
360 mDispatch.schedule(cb0, 100, mPeriod * 10);
361 mDispatch.schedule(cb1, 250, mPeriod);
362 mDispatch.cancel(cb1);
363}
364
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800365TEST_F(VSyncDispatchTimerQueueTest, noUnnecessaryRearmsWhenRescheduling) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700366 Sequence seq;
367 EXPECT_CALL(mMockClock, alarmIn(_, 600)).InSequence(seq);
368 EXPECT_CALL(mMockClock, alarmIn(_, 100)).InSequence(seq);
369
370 CountingCallback cb0(mDispatch);
371 CountingCallback cb1(mDispatch);
372
373 mDispatch.schedule(cb0, 400, 1000);
374 mDispatch.schedule(cb1, 200, 1000);
375 mDispatch.schedule(cb1, 300, 1000);
376 advanceToNextCallback();
377}
378
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800379TEST_F(VSyncDispatchTimerQueueTest, necessaryRearmsWhenModifying) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700380 Sequence seq;
381 EXPECT_CALL(mMockClock, alarmIn(_, 600)).InSequence(seq);
382 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
383 EXPECT_CALL(mMockClock, alarmIn(_, 100)).InSequence(seq);
384
385 CountingCallback cb0(mDispatch);
386 CountingCallback cb1(mDispatch);
387
388 mDispatch.schedule(cb0, 400, 1000);
389 mDispatch.schedule(cb1, 200, 1000);
390 mDispatch.schedule(cb1, 500, 1000);
391 advanceToNextCallback();
392}
393
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800394TEST_F(VSyncDispatchTimerQueueTest, modifyIntoGroup) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700395 Sequence seq;
396 EXPECT_CALL(mMockClock, alarmIn(_, 600)).InSequence(seq);
397 EXPECT_CALL(mMockClock, alarmIn(_, 1000)).InSequence(seq);
398 EXPECT_CALL(mMockClock, alarmIn(_, 990)).InSequence(seq);
399 EXPECT_CALL(mMockClock, alarmIn(_, 10)).InSequence(seq);
400
401 auto offset = 400;
402 auto closeOffset = offset + mDispatchGroupThreshold - 1;
403 auto notCloseOffset = offset + 2 * mDispatchGroupThreshold;
404
405 CountingCallback cb0(mDispatch);
406 CountingCallback cb1(mDispatch);
407
408 mDispatch.schedule(cb0, 400, 1000);
409 mDispatch.schedule(cb1, 200, 1000);
410 mDispatch.schedule(cb1, closeOffset, 1000);
411
412 advanceToNextCallback();
413 ASSERT_THAT(cb0.mCalls.size(), Eq(1));
414 EXPECT_THAT(cb0.mCalls[0], Eq(mPeriod));
415 ASSERT_THAT(cb1.mCalls.size(), Eq(1));
416 EXPECT_THAT(cb1.mCalls[0], Eq(mPeriod));
417
418 mDispatch.schedule(cb0, 400, 2000);
419 mDispatch.schedule(cb1, notCloseOffset, 2000);
420 advanceToNextCallback();
421 ASSERT_THAT(cb1.mCalls.size(), Eq(2));
422 EXPECT_THAT(cb1.mCalls[1], Eq(2000));
423
424 advanceToNextCallback();
425 ASSERT_THAT(cb0.mCalls.size(), Eq(2));
426 EXPECT_THAT(cb0.mCalls[1], Eq(2000));
427}
428
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800429TEST_F(VSyncDispatchTimerQueueTest, rearmsWhenEndingAndDoesntCancel) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700430 EXPECT_CALL(mMockClock, alarmIn(_, 900));
431 EXPECT_CALL(mMockClock, alarmIn(_, 800));
432 EXPECT_CALL(mMockClock, alarmIn(_, 100));
433 EXPECT_CALL(mMockClock, alarmCancel());
434
435 CountingCallback cb0(mDispatch);
436 CountingCallback cb1(mDispatch);
437
438 mDispatch.schedule(cb0, 100, 1000);
439 mDispatch.schedule(cb1, 200, 1000);
440 advanceToNextCallback();
441 EXPECT_EQ(mDispatch.cancel(cb0), CancelResult::Cancelled);
442}
443
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800444TEST_F(VSyncDispatchTimerQueueTest, setAlarmCallsAtCorrectTimeWithChangingVsync) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700445 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(_))
446 .Times(3)
447 .WillOnce(Return(950))
448 .WillOnce(Return(1975))
449 .WillOnce(Return(2950));
450
451 CountingCallback cb(mDispatch);
452 mDispatch.schedule(cb, 100, 920);
453
454 mMockClock.advanceBy(850);
455 EXPECT_THAT(cb.mCalls.size(), Eq(1));
456
457 mDispatch.schedule(cb, 100, 1900);
458 mMockClock.advanceBy(900);
459 EXPECT_THAT(cb.mCalls.size(), Eq(1));
460 mMockClock.advanceBy(125);
461 EXPECT_THAT(cb.mCalls.size(), Eq(2));
462
463 mDispatch.schedule(cb, 100, 2900);
464 mMockClock.advanceBy(975);
465 EXPECT_THAT(cb.mCalls.size(), Eq(3));
466}
467
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800468TEST_F(VSyncDispatchTimerQueueTest, callbackReentrancy) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700469 Sequence seq;
470 EXPECT_CALL(mMockClock, alarmIn(_, 900)).InSequence(seq);
471 EXPECT_CALL(mMockClock, alarmIn(_, 1000)).InSequence(seq);
472
473 VSyncDispatch::CallbackToken tmp;
Kevin DuBois2968afc2020-01-14 09:48:50 -0800474 tmp = mDispatch.registerCallback([&](auto, auto) { mDispatch.schedule(tmp, 100, 2000); },
475 "o.o");
Kevin DuBois305bef12019-10-09 13:23:27 -0700476
477 mDispatch.schedule(tmp, 100, 1000);
478 advanceToNextCallback();
479}
480
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800481TEST_F(VSyncDispatchTimerQueueTest, callbackReentrantWithPastWakeup) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700482 VSyncDispatch::CallbackToken tmp;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800483 std::optional<nsecs_t> lastTarget;
Kevin DuBois305bef12019-10-09 13:23:27 -0700484 tmp = mDispatch.registerCallback(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800485 [&](auto timestamp, auto) {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800486 EXPECT_EQ(mDispatch.schedule(tmp, 400, timestamp - mVsyncMoveThreshold),
487 ScheduleResult::Scheduled);
488 EXPECT_EQ(mDispatch.schedule(tmp, 400, timestamp), ScheduleResult::Scheduled);
489 EXPECT_EQ(mDispatch.schedule(tmp, 400, timestamp + mVsyncMoveThreshold),
490 ScheduleResult::Scheduled);
491 lastTarget = timestamp;
Kevin DuBois305bef12019-10-09 13:23:27 -0700492 },
493 "oo");
494
495 mDispatch.schedule(tmp, 999, 1000);
496 advanceToNextCallback();
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800497 EXPECT_THAT(lastTarget, Eq(1000));
498
499 advanceToNextCallback();
500 EXPECT_THAT(lastTarget, Eq(2000));
Kevin DuBois305bef12019-10-09 13:23:27 -0700501}
502
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800503TEST_F(VSyncDispatchTimerQueueTest, modificationsAroundVsyncTime) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700504 Sequence seq;
505 EXPECT_CALL(mMockClock, alarmIn(_, 1000)).InSequence(seq);
506 EXPECT_CALL(mMockClock, alarmIn(_, 200)).InSequence(seq);
507 EXPECT_CALL(mMockClock, alarmIn(_, 1000)).InSequence(seq);
508 EXPECT_CALL(mMockClock, alarmIn(_, 150)).InSequence(seq);
509
510 CountingCallback cb(mDispatch);
511 mDispatch.schedule(cb, 0, 1000);
512
513 mMockClock.advanceBy(750);
514 mDispatch.schedule(cb, 50, 1000);
515
516 advanceToNextCallback();
517 mDispatch.schedule(cb, 50, 2000);
518
519 mMockClock.advanceBy(800);
520 mDispatch.schedule(cb, 100, 2000);
521}
522
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800523TEST_F(VSyncDispatchTimerQueueTest, lateModifications) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700524 Sequence seq;
525 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
526 EXPECT_CALL(mMockClock, alarmIn(_, 400)).InSequence(seq);
527 EXPECT_CALL(mMockClock, alarmIn(_, 350)).InSequence(seq);
528 EXPECT_CALL(mMockClock, alarmIn(_, 950)).InSequence(seq);
529
530 CountingCallback cb0(mDispatch);
531 CountingCallback cb1(mDispatch);
532
533 mDispatch.schedule(cb0, 500, 1000);
534 mDispatch.schedule(cb1, 100, 1000);
535
536 advanceToNextCallback();
537 mDispatch.schedule(cb0, 200, 2000);
538 mDispatch.schedule(cb1, 150, 1000);
539
540 advanceToNextCallback();
541 advanceToNextCallback();
542}
543
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800544TEST_F(VSyncDispatchTimerQueueTest, doesntCancelPriorValidTimerForFutureMod) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700545 Sequence seq;
546 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
547
548 CountingCallback cb0(mDispatch);
549 CountingCallback cb1(mDispatch);
550 mDispatch.schedule(cb0, 500, 1000);
551 mDispatch.schedule(cb1, 500, 20000);
552}
553
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800554TEST_F(VSyncDispatchTimerQueueTest, setsTimerAfterCancellation) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700555 Sequence seq;
556 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
557 EXPECT_CALL(mMockClock, alarmCancel()).InSequence(seq);
558 EXPECT_CALL(mMockClock, alarmIn(_, 900)).InSequence(seq);
559
560 CountingCallback cb0(mDispatch);
561 mDispatch.schedule(cb0, 500, 1000);
562 mDispatch.cancel(cb0);
563 mDispatch.schedule(cb0, 100, 1000);
564}
565
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800566TEST_F(VSyncDispatchTimerQueueTest, makingUpIdsError) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700567 VSyncDispatch::CallbackToken token(100);
568 EXPECT_THAT(mDispatch.schedule(token, 100, 1000), Eq(ScheduleResult::Error));
569 EXPECT_THAT(mDispatch.cancel(token), Eq(CancelResult::Error));
570}
571
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800572TEST_F(VSyncDispatchTimerQueueTest, canMoveCallbackBackwardsInTime) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700573 CountingCallback cb0(mDispatch);
574 EXPECT_EQ(mDispatch.schedule(cb0, 500, 1000), ScheduleResult::Scheduled);
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800575 EXPECT_EQ(mDispatch.schedule(cb0, 100, 1000), ScheduleResult::Scheduled);
576}
577
578// b/1450138150
579TEST_F(VSyncDispatchTimerQueueTest, doesNotMoveCallbackBackwardsAndSkipAScheduledTargetVSync) {
580 EXPECT_CALL(mMockClock, alarmIn(_, 500));
581 CountingCallback cb(mDispatch);
582 EXPECT_EQ(mDispatch.schedule(cb, 500, 1000), ScheduleResult::Scheduled);
583 mMockClock.advanceBy(400);
584
585 EXPECT_EQ(mDispatch.schedule(cb, 800, 1000), ScheduleResult::Scheduled);
586 advanceToNextCallback();
587 ASSERT_THAT(cb.mCalls.size(), Eq(1));
588}
589
590TEST_F(VSyncDispatchTimerQueueTest, targetOffsetMovingBackALittleCanStillSchedule) {
591 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(1000))
592 .Times(2)
593 .WillOnce(Return(1000))
594 .WillOnce(Return(1002));
595 CountingCallback cb(mDispatch);
596 EXPECT_EQ(mDispatch.schedule(cb, 500, 1000), ScheduleResult::Scheduled);
597 mMockClock.advanceBy(400);
598 EXPECT_EQ(mDispatch.schedule(cb, 400, 1000), ScheduleResult::Scheduled);
Kevin DuBois305bef12019-10-09 13:23:27 -0700599}
600
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800601TEST_F(VSyncDispatchTimerQueueTest, canScheduleNegativeOffsetAgainstDifferentPeriods) {
602 CountingCallback cb0(mDispatch);
603 EXPECT_EQ(mDispatch.schedule(cb0, 500, 1000), ScheduleResult::Scheduled);
604 advanceToNextCallback();
605 EXPECT_EQ(mDispatch.schedule(cb0, 1100, 2000), ScheduleResult::Scheduled);
606}
607
608TEST_F(VSyncDispatchTimerQueueTest, canScheduleLargeNegativeOffset) {
609 Sequence seq;
610 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
611 EXPECT_CALL(mMockClock, alarmIn(_, 600)).InSequence(seq);
612 CountingCallback cb0(mDispatch);
613 EXPECT_EQ(mDispatch.schedule(cb0, 500, 1000), ScheduleResult::Scheduled);
614 advanceToNextCallback();
615 EXPECT_EQ(mDispatch.schedule(cb0, 1900, 2000), ScheduleResult::Scheduled);
616}
617
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800618TEST_F(VSyncDispatchTimerQueueTest, scheduleUpdatesDoesNotAffectSchedulingState) {
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800619 EXPECT_CALL(mMockClock, alarmIn(_, 600));
620
621 CountingCallback cb(mDispatch);
622 EXPECT_EQ(mDispatch.schedule(cb, 400, 1000), ScheduleResult::Scheduled);
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800623
624 EXPECT_EQ(mDispatch.schedule(cb, 1400, 1000), ScheduleResult::Scheduled);
625
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800626 advanceToNextCallback();
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800627}
628
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800629TEST_F(VSyncDispatchTimerQueueTest, helperMove) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700630 EXPECT_CALL(mMockClock, alarmIn(_, 500)).Times(1);
631 EXPECT_CALL(mMockClock, alarmCancel()).Times(1);
632
633 VSyncCallbackRegistration cb(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800634 mDispatch, [](auto, auto) {}, "");
Kevin DuBois305bef12019-10-09 13:23:27 -0700635 VSyncCallbackRegistration cb1(std::move(cb));
636 cb.schedule(100, 1000);
637 cb.cancel();
638
639 cb1.schedule(500, 1000);
640 cb1.cancel();
641}
642
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800643TEST_F(VSyncDispatchTimerQueueTest, helperMoveAssign) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700644 EXPECT_CALL(mMockClock, alarmIn(_, 500)).Times(1);
645 EXPECT_CALL(mMockClock, alarmCancel()).Times(1);
646
647 VSyncCallbackRegistration cb(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800648 mDispatch, [](auto, auto) {}, "");
Kevin DuBois305bef12019-10-09 13:23:27 -0700649 VSyncCallbackRegistration cb1(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800650 mDispatch, [](auto, auto) {}, "");
Kevin DuBois305bef12019-10-09 13:23:27 -0700651 cb1 = std::move(cb);
652 cb.schedule(100, 1000);
653 cb.cancel();
654
655 cb1.schedule(500, 1000);
656 cb1.cancel();
657}
658
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800659class VSyncDispatchTimerQueueEntryTest : public testing::Test {
Kevin DuBois305bef12019-10-09 13:23:27 -0700660protected:
661 nsecs_t const mPeriod = 1000;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800662 nsecs_t const mVsyncMoveThreshold = 200;
Kevin DuBois305bef12019-10-09 13:23:27 -0700663 NiceMock<MockVSyncTracker> mStubTracker{mPeriod};
664};
665
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800666TEST_F(VSyncDispatchTimerQueueEntryTest, stateAfterInitialization) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700667 std::string name("basicname");
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800668 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800669 name, [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700670 EXPECT_THAT(entry.name(), Eq(name));
671 EXPECT_FALSE(entry.lastExecutedVsyncTarget());
672 EXPECT_FALSE(entry.wakeupTime());
673}
674
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800675TEST_F(VSyncDispatchTimerQueueEntryTest, stateScheduling) {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800676 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800677 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700678
679 EXPECT_FALSE(entry.wakeupTime());
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800680 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
681 auto const wakeup = entry.wakeupTime();
682 ASSERT_TRUE(wakeup);
683 EXPECT_THAT(*wakeup, Eq(900));
Kevin DuBois305bef12019-10-09 13:23:27 -0700684
685 entry.disarm();
686 EXPECT_FALSE(entry.wakeupTime());
687}
688
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800689TEST_F(VSyncDispatchTimerQueueEntryTest, stateSchedulingReallyLongWakeupLatency) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700690 auto const duration = 500;
691 auto const now = 8750;
692
693 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(now + duration))
694 .Times(1)
695 .WillOnce(Return(10000));
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800696 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800697 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700698
699 EXPECT_FALSE(entry.wakeupTime());
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800700 EXPECT_THAT(entry.schedule(500, 994, mStubTracker, now), Eq(ScheduleResult::Scheduled));
701 auto const wakeup = entry.wakeupTime();
702 ASSERT_TRUE(wakeup);
703 EXPECT_THAT(*wakeup, Eq(9500));
Kevin DuBois305bef12019-10-09 13:23:27 -0700704}
705
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800706TEST_F(VSyncDispatchTimerQueueEntryTest, runCallback) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700707 auto callCount = 0;
Kevin DuBois2968afc2020-01-14 09:48:50 -0800708 auto vsyncCalledTime = 0;
709 auto wakeupCalledTime = 0;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800710 VSyncDispatchTimerQueueEntry entry(
711 "test",
Kevin DuBois2968afc2020-01-14 09:48:50 -0800712 [&](auto vsyncTime, auto wakeupTime) {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800713 callCount++;
Kevin DuBois2968afc2020-01-14 09:48:50 -0800714 vsyncCalledTime = vsyncTime;
715 wakeupCalledTime = wakeupTime;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800716 },
717 mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700718
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800719 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
720 auto const wakeup = entry.wakeupTime();
721 ASSERT_TRUE(wakeup);
722 EXPECT_THAT(*wakeup, Eq(900));
Kevin DuBois305bef12019-10-09 13:23:27 -0700723
Kevin DuBois2968afc2020-01-14 09:48:50 -0800724 entry.callback(entry.executing(), *wakeup);
Kevin DuBois305bef12019-10-09 13:23:27 -0700725
726 EXPECT_THAT(callCount, Eq(1));
Kevin DuBois2968afc2020-01-14 09:48:50 -0800727 EXPECT_THAT(vsyncCalledTime, Eq(mPeriod));
728 EXPECT_THAT(wakeupCalledTime, Eq(*wakeup));
Kevin DuBois305bef12019-10-09 13:23:27 -0700729 EXPECT_FALSE(entry.wakeupTime());
730 auto lastCalledTarget = entry.lastExecutedVsyncTarget();
731 ASSERT_TRUE(lastCalledTarget);
732 EXPECT_THAT(*lastCalledTarget, Eq(mPeriod));
733}
734
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800735TEST_F(VSyncDispatchTimerQueueEntryTest, updateCallback) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700736 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(_))
737 .Times(2)
738 .WillOnce(Return(1000))
739 .WillOnce(Return(1020));
740
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800741 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800742 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700743
744 EXPECT_FALSE(entry.wakeupTime());
745 entry.update(mStubTracker, 0);
746 EXPECT_FALSE(entry.wakeupTime());
747
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800748 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
749 auto wakeup = entry.wakeupTime();
750 ASSERT_TRUE(wakeup);
Kevin DuBois305bef12019-10-09 13:23:27 -0700751 EXPECT_THAT(wakeup, Eq(900));
752
753 entry.update(mStubTracker, 0);
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800754 wakeup = entry.wakeupTime();
755 ASSERT_TRUE(wakeup);
756 EXPECT_THAT(*wakeup, Eq(920));
Kevin DuBois305bef12019-10-09 13:23:27 -0700757}
758
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800759TEST_F(VSyncDispatchTimerQueueEntryTest, skipsUpdateIfJustScheduled) {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800760 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800761 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800762 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBois305bef12019-10-09 13:23:27 -0700763 entry.update(mStubTracker, 0);
764
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800765 auto const wakeup = entry.wakeupTime();
766 ASSERT_TRUE(wakeup);
767 EXPECT_THAT(*wakeup, Eq(wakeup));
768}
769
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800770TEST_F(VSyncDispatchTimerQueueEntryTest, willSnapToNextTargettableVSync) {
771 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800772 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800773 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800774 entry.executing(); // 1000 is executing
775 // had 1000 not been executing, this could have been scheduled for time 800.
776 EXPECT_THAT(entry.schedule(200, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
777 EXPECT_THAT(*entry.wakeupTime(), Eq(1800));
778
779 EXPECT_THAT(entry.schedule(50, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
780 EXPECT_THAT(*entry.wakeupTime(), Eq(1950));
781
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800782 EXPECT_THAT(entry.schedule(200, 1001, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800783 EXPECT_THAT(*entry.wakeupTime(), Eq(1800));
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800784}
785
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800786TEST_F(VSyncDispatchTimerQueueEntryTest,
787 willRequestNextEstimateWhenSnappingToNextTargettableVSync) {
788 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800789 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800790
791 Sequence seq;
792 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(500))
793 .InSequence(seq)
794 .WillOnce(Return(1000));
795 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(500))
796 .InSequence(seq)
797 .WillOnce(Return(1000));
798 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(1000 + mVsyncMoveThreshold))
799 .InSequence(seq)
800 .WillOnce(Return(2000));
801
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800802 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800803
804 entry.executing(); // 1000 is executing
805
806 EXPECT_THAT(entry.schedule(200, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
807}
808
809TEST_F(VSyncDispatchTimerQueueEntryTest, reportsScheduledIfStillTime) {
810 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800811 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800812 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
813 EXPECT_THAT(entry.schedule(200, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
814 EXPECT_THAT(entry.schedule(50, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
815 EXPECT_THAT(entry.schedule(1200, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBois305bef12019-10-09 13:23:27 -0700816}
817
818} // namespace android::scheduler
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -0800819
820// TODO(b/129481165): remove the #pragma below and fix conversion issues
821#pragma clang diagnostic pop // ignored "-Wconversion"