blob: 3ab38e40efe41e9152c0a996663ed128d0794626 [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());
Kevin DuBois305bef12019-10-09 13:23:27 -070050
51 nsecs_t nextVSyncTime(nsecs_t timePoint) const {
52 if (timePoint % mPeriod == 0) {
53 return timePoint;
54 }
55 return (timePoint - (timePoint % mPeriod) + mPeriod);
56 }
57
58protected:
59 nsecs_t const mPeriod;
60};
61
62class ControllableClock : public TimeKeeper {
63public:
64 ControllableClock() {
65 ON_CALL(*this, alarmIn(_, _))
66 .WillByDefault(Invoke(this, &ControllableClock::alarmInDefaultBehavior));
67 ON_CALL(*this, now()).WillByDefault(Invoke(this, &ControllableClock::fakeTime));
68 }
69
70 MOCK_CONST_METHOD0(now, nsecs_t());
71 MOCK_METHOD2(alarmIn, void(std::function<void()> const&, nsecs_t time));
72 MOCK_METHOD0(alarmCancel, void());
73
74 void alarmInDefaultBehavior(std::function<void()> const& callback, nsecs_t time) {
75 mCallback = callback;
76 mNextCallbackTime = time + mCurrentTime;
77 }
78
79 nsecs_t fakeTime() const { return mCurrentTime; }
80
81 void advanceToNextCallback() {
82 mCurrentTime = mNextCallbackTime;
83 if (mCallback) {
84 mCallback();
85 }
86 }
87
88 void advanceBy(nsecs_t advancement) {
89 mCurrentTime += advancement;
90 if (mCurrentTime >= mNextCallbackTime && mCallback) {
91 mCallback();
92 }
93 };
94
95private:
96 std::function<void()> mCallback;
97 nsecs_t mNextCallbackTime = 0;
98 nsecs_t mCurrentTime = 0;
99};
100
101class CountingCallback {
102public:
103 CountingCallback(VSyncDispatch& dispatch)
104 : mDispatch(dispatch),
105 mToken(dispatch.registerCallback(std::bind(&CountingCallback::counter, this,
Kevin DuBois2968afc2020-01-14 09:48:50 -0800106 std::placeholders::_1,
107 std::placeholders::_2),
Kevin DuBois305bef12019-10-09 13:23:27 -0700108 "test")) {}
109 ~CountingCallback() { mDispatch.unregisterCallback(mToken); }
110
111 operator VSyncDispatch::CallbackToken() const { return mToken; }
112
Kevin DuBois2968afc2020-01-14 09:48:50 -0800113 void counter(nsecs_t time, nsecs_t) { mCalls.push_back(time); }
Kevin DuBois305bef12019-10-09 13:23:27 -0700114
115 VSyncDispatch& mDispatch;
116 VSyncDispatch::CallbackToken mToken;
117 std::vector<nsecs_t> mCalls;
118};
119
120class PausingCallback {
121public:
122 PausingCallback(VSyncDispatch& dispatch, std::chrono::milliseconds pauseAmount)
123 : mDispatch(dispatch),
124 mToken(dispatch.registerCallback(std::bind(&PausingCallback::pause, this,
Kevin DuBois2968afc2020-01-14 09:48:50 -0800125 std::placeholders::_1,
126 std::placeholders::_2),
Kevin DuBois305bef12019-10-09 13:23:27 -0700127 "test")),
128 mRegistered(true),
129 mPauseAmount(pauseAmount) {}
130 ~PausingCallback() { unregister(); }
131
132 operator VSyncDispatch::CallbackToken() const { return mToken; }
133
Kevin DuBois2968afc2020-01-14 09:48:50 -0800134 void pause(nsecs_t, nsecs_t) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700135 std::unique_lock<std::mutex> lk(mMutex);
136 mPause = true;
137 mCv.notify_all();
138
139 mCv.wait_for(lk, mPauseAmount, [this] { return !mPause; });
140
141 mResourcePresent = (mResource.lock() != nullptr);
142 }
143
144 bool waitForPause() {
145 std::unique_lock<std::mutex> lk(mMutex);
146 auto waiting = mCv.wait_for(lk, 10s, [this] { return mPause; });
147 return waiting;
148 }
149
150 void stashResource(std::weak_ptr<void> const& resource) { mResource = resource; }
151
152 bool resourcePresent() { return mResourcePresent; }
153
154 void unpause() {
155 std::unique_lock<std::mutex> lk(mMutex);
156 mPause = false;
157 mCv.notify_all();
158 }
159
160 void unregister() {
161 if (mRegistered) {
162 mDispatch.unregisterCallback(mToken);
163 mRegistered = false;
164 }
165 }
166
167 VSyncDispatch& mDispatch;
168 VSyncDispatch::CallbackToken mToken;
169 bool mRegistered = true;
170
171 std::mutex mMutex;
172 std::condition_variable mCv;
173 bool mPause = false;
174 std::weak_ptr<void> mResource;
175 bool mResourcePresent = false;
176 std::chrono::milliseconds const mPauseAmount;
177};
178
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800179class VSyncDispatchTimerQueueTest : public testing::Test {
Kevin DuBois305bef12019-10-09 13:23:27 -0700180protected:
181 std::unique_ptr<TimeKeeper> createTimeKeeper() {
182 class TimeKeeperWrapper : public TimeKeeper {
183 public:
184 TimeKeeperWrapper(TimeKeeper& control) : mControllableClock(control) {}
185 void alarmIn(std::function<void()> const& callback, nsecs_t time) final {
186 mControllableClock.alarmIn(callback, time);
187 }
188 void alarmCancel() final { mControllableClock.alarmCancel(); }
189 nsecs_t now() const final { return mControllableClock.now(); }
190
191 private:
192 TimeKeeper& mControllableClock;
193 };
194 return std::make_unique<TimeKeeperWrapper>(mMockClock);
195 }
196
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800197 ~VSyncDispatchTimerQueueTest() {
Kevin DuBois305bef12019-10-09 13:23:27 -0700198 // destructor of dispatch will cancelAlarm(). Ignore final cancel in common test.
199 Mock::VerifyAndClearExpectations(&mMockClock);
200 }
201
202 void advanceToNextCallback() { mMockClock.advanceToNextCallback(); }
203
204 NiceMock<ControllableClock> mMockClock;
205 static nsecs_t constexpr mDispatchGroupThreshold = 5;
206 nsecs_t const mPeriod = 1000;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800207 nsecs_t const mVsyncMoveThreshold = 300;
Kevin DuBois305bef12019-10-09 13:23:27 -0700208 NiceMock<MockVSyncTracker> mStubTracker{mPeriod};
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800209 VSyncDispatchTimerQueue mDispatch{createTimeKeeper(), mStubTracker, mDispatchGroupThreshold,
210 mVsyncMoveThreshold};
Kevin DuBois305bef12019-10-09 13:23:27 -0700211};
212
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800213TEST_F(VSyncDispatchTimerQueueTest, unregistersSetAlarmOnDestruction) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700214 EXPECT_CALL(mMockClock, alarmIn(_, 900));
215 EXPECT_CALL(mMockClock, alarmCancel());
216 {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800217 VSyncDispatchTimerQueue mDispatch{createTimeKeeper(), mStubTracker, mDispatchGroupThreshold,
218 mVsyncMoveThreshold};
Kevin DuBois305bef12019-10-09 13:23:27 -0700219 CountingCallback cb(mDispatch);
220 EXPECT_EQ(mDispatch.schedule(cb, 100, 1000), ScheduleResult::Scheduled);
221 }
222}
223
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800224TEST_F(VSyncDispatchTimerQueueTest, basicAlarmSettingFuture) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700225 auto intended = mPeriod - 230;
226 EXPECT_CALL(mMockClock, alarmIn(_, 900));
227
228 CountingCallback cb(mDispatch);
229 EXPECT_EQ(mDispatch.schedule(cb, 100, intended), ScheduleResult::Scheduled);
230 advanceToNextCallback();
231
232 ASSERT_THAT(cb.mCalls.size(), Eq(1));
233 EXPECT_THAT(cb.mCalls[0], Eq(mPeriod));
234}
235
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800236TEST_F(VSyncDispatchTimerQueueTest, basicAlarmSettingFutureWithAdjustmentToTrueVsync) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700237 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(1000)).WillOnce(Return(1150));
238 EXPECT_CALL(mMockClock, alarmIn(_, 1050));
239
240 CountingCallback cb(mDispatch);
241 mDispatch.schedule(cb, 100, mPeriod);
242 advanceToNextCallback();
243
244 ASSERT_THAT(cb.mCalls.size(), Eq(1));
245 EXPECT_THAT(cb.mCalls[0], Eq(1150));
246}
247
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800248TEST_F(VSyncDispatchTimerQueueTest, basicAlarmSettingAdjustmentPast) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700249 auto const now = 234;
250 mMockClock.advanceBy(234);
251 auto const workDuration = 10 * mPeriod;
252 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(now + workDuration))
253 .WillOnce(Return(mPeriod * 11));
254 EXPECT_CALL(mMockClock, alarmIn(_, mPeriod - now));
255
256 CountingCallback cb(mDispatch);
257 EXPECT_EQ(mDispatch.schedule(cb, workDuration, mPeriod), ScheduleResult::Scheduled);
258}
259
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800260TEST_F(VSyncDispatchTimerQueueTest, basicAlarmCancel) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700261 EXPECT_CALL(mMockClock, alarmIn(_, 900));
262 EXPECT_CALL(mMockClock, alarmCancel());
263
264 CountingCallback cb(mDispatch);
265 EXPECT_EQ(mDispatch.schedule(cb, 100, mPeriod), ScheduleResult::Scheduled);
266 EXPECT_EQ(mDispatch.cancel(cb), CancelResult::Cancelled);
267}
268
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800269TEST_F(VSyncDispatchTimerQueueTest, basicAlarmCancelTooLate) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700270 EXPECT_CALL(mMockClock, alarmIn(_, 900));
271 EXPECT_CALL(mMockClock, alarmCancel());
272
273 CountingCallback cb(mDispatch);
274 EXPECT_EQ(mDispatch.schedule(cb, 100, mPeriod), ScheduleResult::Scheduled);
275 mMockClock.advanceBy(950);
276 EXPECT_EQ(mDispatch.cancel(cb), CancelResult::TooLate);
277}
278
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800279TEST_F(VSyncDispatchTimerQueueTest, basicAlarmCancelTooLateWhenRunning) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700280 EXPECT_CALL(mMockClock, alarmIn(_, 900));
281 EXPECT_CALL(mMockClock, alarmCancel());
282
283 PausingCallback cb(mDispatch, std::chrono::duration_cast<std::chrono::milliseconds>(1s));
284 EXPECT_EQ(mDispatch.schedule(cb, 100, mPeriod), ScheduleResult::Scheduled);
285
286 std::thread pausingThread([&] { mMockClock.advanceToNextCallback(); });
287 EXPECT_TRUE(cb.waitForPause());
288 EXPECT_EQ(mDispatch.cancel(cb), CancelResult::TooLate);
289 cb.unpause();
290 pausingThread.join();
291}
292
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800293TEST_F(VSyncDispatchTimerQueueTest, unregisterSynchronizes) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700294 EXPECT_CALL(mMockClock, alarmIn(_, 900));
295 EXPECT_CALL(mMockClock, alarmCancel());
296
297 auto resource = std::make_shared<int>(110);
298
299 PausingCallback cb(mDispatch, 50ms);
300 cb.stashResource(resource);
301 EXPECT_EQ(mDispatch.schedule(cb, 100, mPeriod), ScheduleResult::Scheduled);
302
303 std::thread pausingThread([&] { mMockClock.advanceToNextCallback(); });
304 EXPECT_TRUE(cb.waitForPause());
305
306 cb.unregister();
307 resource.reset();
308
309 cb.unpause();
310 pausingThread.join();
311
312 EXPECT_TRUE(cb.resourcePresent());
313}
314
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800315TEST_F(VSyncDispatchTimerQueueTest, basicTwoAlarmSetting) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700316 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(1000))
317 .Times(4)
318 .WillOnce(Return(1055))
319 .WillOnce(Return(1063))
320 .WillOnce(Return(1063))
321 .WillOnce(Return(1075));
322
323 Sequence seq;
324 EXPECT_CALL(mMockClock, alarmIn(_, 955)).InSequence(seq);
325 EXPECT_CALL(mMockClock, alarmIn(_, 813)).InSequence(seq);
326 EXPECT_CALL(mMockClock, alarmIn(_, 162)).InSequence(seq);
327
328 CountingCallback cb0(mDispatch);
329 CountingCallback cb1(mDispatch);
330
331 mDispatch.schedule(cb0, 100, mPeriod);
332 mDispatch.schedule(cb1, 250, mPeriod);
333
334 advanceToNextCallback();
335 advanceToNextCallback();
336
337 ASSERT_THAT(cb0.mCalls.size(), Eq(1));
338 EXPECT_THAT(cb0.mCalls[0], Eq(1075));
339 ASSERT_THAT(cb1.mCalls.size(), Eq(1));
340 EXPECT_THAT(cb1.mCalls[0], Eq(1063));
341}
342
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800343TEST_F(VSyncDispatchTimerQueueTest, rearmsFaroutTimeoutWhenCancellingCloseOne) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700344 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(_))
345 .Times(4)
346 .WillOnce(Return(10000))
347 .WillOnce(Return(1000))
348 .WillOnce(Return(10000))
349 .WillOnce(Return(10000));
350
351 Sequence seq;
352 EXPECT_CALL(mMockClock, alarmIn(_, 9900)).InSequence(seq);
353 EXPECT_CALL(mMockClock, alarmIn(_, 750)).InSequence(seq);
354 EXPECT_CALL(mMockClock, alarmIn(_, 9900)).InSequence(seq);
355
356 CountingCallback cb0(mDispatch);
357 CountingCallback cb1(mDispatch);
358
359 mDispatch.schedule(cb0, 100, mPeriod * 10);
360 mDispatch.schedule(cb1, 250, mPeriod);
361 mDispatch.cancel(cb1);
362}
363
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800364TEST_F(VSyncDispatchTimerQueueTest, noUnnecessaryRearmsWhenRescheduling) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700365 Sequence seq;
366 EXPECT_CALL(mMockClock, alarmIn(_, 600)).InSequence(seq);
367 EXPECT_CALL(mMockClock, alarmIn(_, 100)).InSequence(seq);
368
369 CountingCallback cb0(mDispatch);
370 CountingCallback cb1(mDispatch);
371
372 mDispatch.schedule(cb0, 400, 1000);
373 mDispatch.schedule(cb1, 200, 1000);
374 mDispatch.schedule(cb1, 300, 1000);
375 advanceToNextCallback();
376}
377
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800378TEST_F(VSyncDispatchTimerQueueTest, necessaryRearmsWhenModifying) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700379 Sequence seq;
380 EXPECT_CALL(mMockClock, alarmIn(_, 600)).InSequence(seq);
381 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
382 EXPECT_CALL(mMockClock, alarmIn(_, 100)).InSequence(seq);
383
384 CountingCallback cb0(mDispatch);
385 CountingCallback cb1(mDispatch);
386
387 mDispatch.schedule(cb0, 400, 1000);
388 mDispatch.schedule(cb1, 200, 1000);
389 mDispatch.schedule(cb1, 500, 1000);
390 advanceToNextCallback();
391}
392
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800393TEST_F(VSyncDispatchTimerQueueTest, modifyIntoGroup) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700394 Sequence seq;
395 EXPECT_CALL(mMockClock, alarmIn(_, 600)).InSequence(seq);
396 EXPECT_CALL(mMockClock, alarmIn(_, 1000)).InSequence(seq);
397 EXPECT_CALL(mMockClock, alarmIn(_, 990)).InSequence(seq);
398 EXPECT_CALL(mMockClock, alarmIn(_, 10)).InSequence(seq);
399
400 auto offset = 400;
401 auto closeOffset = offset + mDispatchGroupThreshold - 1;
402 auto notCloseOffset = offset + 2 * mDispatchGroupThreshold;
403
404 CountingCallback cb0(mDispatch);
405 CountingCallback cb1(mDispatch);
406
407 mDispatch.schedule(cb0, 400, 1000);
408 mDispatch.schedule(cb1, 200, 1000);
409 mDispatch.schedule(cb1, closeOffset, 1000);
410
411 advanceToNextCallback();
412 ASSERT_THAT(cb0.mCalls.size(), Eq(1));
413 EXPECT_THAT(cb0.mCalls[0], Eq(mPeriod));
414 ASSERT_THAT(cb1.mCalls.size(), Eq(1));
415 EXPECT_THAT(cb1.mCalls[0], Eq(mPeriod));
416
417 mDispatch.schedule(cb0, 400, 2000);
418 mDispatch.schedule(cb1, notCloseOffset, 2000);
419 advanceToNextCallback();
420 ASSERT_THAT(cb1.mCalls.size(), Eq(2));
421 EXPECT_THAT(cb1.mCalls[1], Eq(2000));
422
423 advanceToNextCallback();
424 ASSERT_THAT(cb0.mCalls.size(), Eq(2));
425 EXPECT_THAT(cb0.mCalls[1], Eq(2000));
426}
427
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800428TEST_F(VSyncDispatchTimerQueueTest, rearmsWhenEndingAndDoesntCancel) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700429 EXPECT_CALL(mMockClock, alarmIn(_, 900));
430 EXPECT_CALL(mMockClock, alarmIn(_, 800));
431 EXPECT_CALL(mMockClock, alarmIn(_, 100));
432 EXPECT_CALL(mMockClock, alarmCancel());
433
434 CountingCallback cb0(mDispatch);
435 CountingCallback cb1(mDispatch);
436
437 mDispatch.schedule(cb0, 100, 1000);
438 mDispatch.schedule(cb1, 200, 1000);
439 advanceToNextCallback();
440 EXPECT_EQ(mDispatch.cancel(cb0), CancelResult::Cancelled);
441}
442
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800443TEST_F(VSyncDispatchTimerQueueTest, setAlarmCallsAtCorrectTimeWithChangingVsync) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700444 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(_))
445 .Times(3)
446 .WillOnce(Return(950))
447 .WillOnce(Return(1975))
448 .WillOnce(Return(2950));
449
450 CountingCallback cb(mDispatch);
451 mDispatch.schedule(cb, 100, 920);
452
453 mMockClock.advanceBy(850);
454 EXPECT_THAT(cb.mCalls.size(), Eq(1));
455
456 mDispatch.schedule(cb, 100, 1900);
457 mMockClock.advanceBy(900);
458 EXPECT_THAT(cb.mCalls.size(), Eq(1));
459 mMockClock.advanceBy(125);
460 EXPECT_THAT(cb.mCalls.size(), Eq(2));
461
462 mDispatch.schedule(cb, 100, 2900);
463 mMockClock.advanceBy(975);
464 EXPECT_THAT(cb.mCalls.size(), Eq(3));
465}
466
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800467TEST_F(VSyncDispatchTimerQueueTest, callbackReentrancy) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700468 Sequence seq;
469 EXPECT_CALL(mMockClock, alarmIn(_, 900)).InSequence(seq);
470 EXPECT_CALL(mMockClock, alarmIn(_, 1000)).InSequence(seq);
471
472 VSyncDispatch::CallbackToken tmp;
Kevin DuBois2968afc2020-01-14 09:48:50 -0800473 tmp = mDispatch.registerCallback([&](auto, auto) { mDispatch.schedule(tmp, 100, 2000); },
474 "o.o");
Kevin DuBois305bef12019-10-09 13:23:27 -0700475
476 mDispatch.schedule(tmp, 100, 1000);
477 advanceToNextCallback();
478}
479
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800480TEST_F(VSyncDispatchTimerQueueTest, callbackReentrantWithPastWakeup) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700481 VSyncDispatch::CallbackToken tmp;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800482 std::optional<nsecs_t> lastTarget;
Kevin DuBois305bef12019-10-09 13:23:27 -0700483 tmp = mDispatch.registerCallback(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800484 [&](auto timestamp, auto) {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800485 EXPECT_EQ(mDispatch.schedule(tmp, 400, timestamp - mVsyncMoveThreshold),
486 ScheduleResult::Scheduled);
487 EXPECT_EQ(mDispatch.schedule(tmp, 400, timestamp), ScheduleResult::Scheduled);
488 EXPECT_EQ(mDispatch.schedule(tmp, 400, timestamp + mVsyncMoveThreshold),
489 ScheduleResult::Scheduled);
490 lastTarget = timestamp;
Kevin DuBois305bef12019-10-09 13:23:27 -0700491 },
492 "oo");
493
494 mDispatch.schedule(tmp, 999, 1000);
495 advanceToNextCallback();
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800496 EXPECT_THAT(lastTarget, Eq(1000));
497
498 advanceToNextCallback();
499 EXPECT_THAT(lastTarget, Eq(2000));
Kevin DuBois305bef12019-10-09 13:23:27 -0700500}
501
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800502TEST_F(VSyncDispatchTimerQueueTest, modificationsAroundVsyncTime) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700503 Sequence seq;
504 EXPECT_CALL(mMockClock, alarmIn(_, 1000)).InSequence(seq);
505 EXPECT_CALL(mMockClock, alarmIn(_, 200)).InSequence(seq);
506 EXPECT_CALL(mMockClock, alarmIn(_, 1000)).InSequence(seq);
507 EXPECT_CALL(mMockClock, alarmIn(_, 150)).InSequence(seq);
508
509 CountingCallback cb(mDispatch);
510 mDispatch.schedule(cb, 0, 1000);
511
512 mMockClock.advanceBy(750);
513 mDispatch.schedule(cb, 50, 1000);
514
515 advanceToNextCallback();
516 mDispatch.schedule(cb, 50, 2000);
517
518 mMockClock.advanceBy(800);
519 mDispatch.schedule(cb, 100, 2000);
520}
521
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800522TEST_F(VSyncDispatchTimerQueueTest, lateModifications) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700523 Sequence seq;
524 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
525 EXPECT_CALL(mMockClock, alarmIn(_, 400)).InSequence(seq);
526 EXPECT_CALL(mMockClock, alarmIn(_, 350)).InSequence(seq);
527 EXPECT_CALL(mMockClock, alarmIn(_, 950)).InSequence(seq);
528
529 CountingCallback cb0(mDispatch);
530 CountingCallback cb1(mDispatch);
531
532 mDispatch.schedule(cb0, 500, 1000);
533 mDispatch.schedule(cb1, 100, 1000);
534
535 advanceToNextCallback();
536 mDispatch.schedule(cb0, 200, 2000);
537 mDispatch.schedule(cb1, 150, 1000);
538
539 advanceToNextCallback();
540 advanceToNextCallback();
541}
542
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800543TEST_F(VSyncDispatchTimerQueueTest, doesntCancelPriorValidTimerForFutureMod) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700544 Sequence seq;
545 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
546
547 CountingCallback cb0(mDispatch);
548 CountingCallback cb1(mDispatch);
549 mDispatch.schedule(cb0, 500, 1000);
550 mDispatch.schedule(cb1, 500, 20000);
551}
552
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800553TEST_F(VSyncDispatchTimerQueueTest, setsTimerAfterCancellation) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700554 Sequence seq;
555 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
556 EXPECT_CALL(mMockClock, alarmCancel()).InSequence(seq);
557 EXPECT_CALL(mMockClock, alarmIn(_, 900)).InSequence(seq);
558
559 CountingCallback cb0(mDispatch);
560 mDispatch.schedule(cb0, 500, 1000);
561 mDispatch.cancel(cb0);
562 mDispatch.schedule(cb0, 100, 1000);
563}
564
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800565TEST_F(VSyncDispatchTimerQueueTest, makingUpIdsError) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700566 VSyncDispatch::CallbackToken token(100);
567 EXPECT_THAT(mDispatch.schedule(token, 100, 1000), Eq(ScheduleResult::Error));
568 EXPECT_THAT(mDispatch.cancel(token), Eq(CancelResult::Error));
569}
570
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800571TEST_F(VSyncDispatchTimerQueueTest, canMoveCallbackBackwardsInTime) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700572 CountingCallback cb0(mDispatch);
573 EXPECT_EQ(mDispatch.schedule(cb0, 500, 1000), ScheduleResult::Scheduled);
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800574 EXPECT_EQ(mDispatch.schedule(cb0, 100, 1000), ScheduleResult::Scheduled);
575}
576
577// b/1450138150
578TEST_F(VSyncDispatchTimerQueueTest, doesNotMoveCallbackBackwardsAndSkipAScheduledTargetVSync) {
579 EXPECT_CALL(mMockClock, alarmIn(_, 500));
580 CountingCallback cb(mDispatch);
581 EXPECT_EQ(mDispatch.schedule(cb, 500, 1000), ScheduleResult::Scheduled);
582 mMockClock.advanceBy(400);
583
584 EXPECT_EQ(mDispatch.schedule(cb, 800, 1000), ScheduleResult::Scheduled);
585 advanceToNextCallback();
586 ASSERT_THAT(cb.mCalls.size(), Eq(1));
587}
588
589TEST_F(VSyncDispatchTimerQueueTest, targetOffsetMovingBackALittleCanStillSchedule) {
590 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(1000))
591 .Times(2)
592 .WillOnce(Return(1000))
593 .WillOnce(Return(1002));
594 CountingCallback cb(mDispatch);
595 EXPECT_EQ(mDispatch.schedule(cb, 500, 1000), ScheduleResult::Scheduled);
596 mMockClock.advanceBy(400);
597 EXPECT_EQ(mDispatch.schedule(cb, 400, 1000), ScheduleResult::Scheduled);
Kevin DuBois305bef12019-10-09 13:23:27 -0700598}
599
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800600TEST_F(VSyncDispatchTimerQueueTest, canScheduleNegativeOffsetAgainstDifferentPeriods) {
601 CountingCallback cb0(mDispatch);
602 EXPECT_EQ(mDispatch.schedule(cb0, 500, 1000), ScheduleResult::Scheduled);
603 advanceToNextCallback();
604 EXPECT_EQ(mDispatch.schedule(cb0, 1100, 2000), ScheduleResult::Scheduled);
605}
606
607TEST_F(VSyncDispatchTimerQueueTest, canScheduleLargeNegativeOffset) {
608 Sequence seq;
609 EXPECT_CALL(mMockClock, alarmIn(_, 500)).InSequence(seq);
610 EXPECT_CALL(mMockClock, alarmIn(_, 600)).InSequence(seq);
611 CountingCallback cb0(mDispatch);
612 EXPECT_EQ(mDispatch.schedule(cb0, 500, 1000), ScheduleResult::Scheduled);
613 advanceToNextCallback();
614 EXPECT_EQ(mDispatch.schedule(cb0, 1900, 2000), ScheduleResult::Scheduled);
615}
616
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800617TEST_F(VSyncDispatchTimerQueueTest, scheduleUpdatesDoesNotAffectSchedulingState) {
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800618 EXPECT_CALL(mMockClock, alarmIn(_, 600));
619
620 CountingCallback cb(mDispatch);
621 EXPECT_EQ(mDispatch.schedule(cb, 400, 1000), ScheduleResult::Scheduled);
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800622
623 EXPECT_EQ(mDispatch.schedule(cb, 1400, 1000), ScheduleResult::Scheduled);
624
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800625 advanceToNextCallback();
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800626}
627
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800628TEST_F(VSyncDispatchTimerQueueTest, helperMove) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700629 EXPECT_CALL(mMockClock, alarmIn(_, 500)).Times(1);
630 EXPECT_CALL(mMockClock, alarmCancel()).Times(1);
631
632 VSyncCallbackRegistration cb(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800633 mDispatch, [](auto, auto) {}, "");
Kevin DuBois305bef12019-10-09 13:23:27 -0700634 VSyncCallbackRegistration cb1(std::move(cb));
635 cb.schedule(100, 1000);
636 cb.cancel();
637
638 cb1.schedule(500, 1000);
639 cb1.cancel();
640}
641
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800642TEST_F(VSyncDispatchTimerQueueTest, helperMoveAssign) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700643 EXPECT_CALL(mMockClock, alarmIn(_, 500)).Times(1);
644 EXPECT_CALL(mMockClock, alarmCancel()).Times(1);
645
646 VSyncCallbackRegistration cb(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800647 mDispatch, [](auto, auto) {}, "");
Kevin DuBois305bef12019-10-09 13:23:27 -0700648 VSyncCallbackRegistration cb1(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800649 mDispatch, [](auto, auto) {}, "");
Kevin DuBois305bef12019-10-09 13:23:27 -0700650 cb1 = std::move(cb);
651 cb.schedule(100, 1000);
652 cb.cancel();
653
654 cb1.schedule(500, 1000);
655 cb1.cancel();
656}
657
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800658class VSyncDispatchTimerQueueEntryTest : public testing::Test {
Kevin DuBois305bef12019-10-09 13:23:27 -0700659protected:
660 nsecs_t const mPeriod = 1000;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800661 nsecs_t const mVsyncMoveThreshold = 200;
Kevin DuBois305bef12019-10-09 13:23:27 -0700662 NiceMock<MockVSyncTracker> mStubTracker{mPeriod};
663};
664
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800665TEST_F(VSyncDispatchTimerQueueEntryTest, stateAfterInitialization) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700666 std::string name("basicname");
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800667 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800668 name, [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700669 EXPECT_THAT(entry.name(), Eq(name));
670 EXPECT_FALSE(entry.lastExecutedVsyncTarget());
671 EXPECT_FALSE(entry.wakeupTime());
672}
673
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800674TEST_F(VSyncDispatchTimerQueueEntryTest, stateScheduling) {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800675 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800676 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700677
678 EXPECT_FALSE(entry.wakeupTime());
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800679 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
680 auto const wakeup = entry.wakeupTime();
681 ASSERT_TRUE(wakeup);
682 EXPECT_THAT(*wakeup, Eq(900));
Kevin DuBois305bef12019-10-09 13:23:27 -0700683
684 entry.disarm();
685 EXPECT_FALSE(entry.wakeupTime());
686}
687
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800688TEST_F(VSyncDispatchTimerQueueEntryTest, stateSchedulingReallyLongWakeupLatency) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700689 auto const duration = 500;
690 auto const now = 8750;
691
692 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(now + duration))
693 .Times(1)
694 .WillOnce(Return(10000));
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800695 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800696 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700697
698 EXPECT_FALSE(entry.wakeupTime());
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800699 EXPECT_THAT(entry.schedule(500, 994, mStubTracker, now), Eq(ScheduleResult::Scheduled));
700 auto const wakeup = entry.wakeupTime();
701 ASSERT_TRUE(wakeup);
702 EXPECT_THAT(*wakeup, Eq(9500));
Kevin DuBois305bef12019-10-09 13:23:27 -0700703}
704
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800705TEST_F(VSyncDispatchTimerQueueEntryTest, runCallback) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700706 auto callCount = 0;
Kevin DuBois2968afc2020-01-14 09:48:50 -0800707 auto vsyncCalledTime = 0;
708 auto wakeupCalledTime = 0;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800709 VSyncDispatchTimerQueueEntry entry(
710 "test",
Kevin DuBois2968afc2020-01-14 09:48:50 -0800711 [&](auto vsyncTime, auto wakeupTime) {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800712 callCount++;
Kevin DuBois2968afc2020-01-14 09:48:50 -0800713 vsyncCalledTime = vsyncTime;
714 wakeupCalledTime = wakeupTime;
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800715 },
716 mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700717
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800718 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
719 auto const wakeup = entry.wakeupTime();
720 ASSERT_TRUE(wakeup);
721 EXPECT_THAT(*wakeup, Eq(900));
Kevin DuBois305bef12019-10-09 13:23:27 -0700722
Kevin DuBois2968afc2020-01-14 09:48:50 -0800723 entry.callback(entry.executing(), *wakeup);
Kevin DuBois305bef12019-10-09 13:23:27 -0700724
725 EXPECT_THAT(callCount, Eq(1));
Kevin DuBois2968afc2020-01-14 09:48:50 -0800726 EXPECT_THAT(vsyncCalledTime, Eq(mPeriod));
727 EXPECT_THAT(wakeupCalledTime, Eq(*wakeup));
Kevin DuBois305bef12019-10-09 13:23:27 -0700728 EXPECT_FALSE(entry.wakeupTime());
729 auto lastCalledTarget = entry.lastExecutedVsyncTarget();
730 ASSERT_TRUE(lastCalledTarget);
731 EXPECT_THAT(*lastCalledTarget, Eq(mPeriod));
732}
733
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800734TEST_F(VSyncDispatchTimerQueueEntryTest, updateCallback) {
Kevin DuBois305bef12019-10-09 13:23:27 -0700735 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(_))
736 .Times(2)
737 .WillOnce(Return(1000))
738 .WillOnce(Return(1020));
739
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800740 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800741 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois305bef12019-10-09 13:23:27 -0700742
743 EXPECT_FALSE(entry.wakeupTime());
744 entry.update(mStubTracker, 0);
745 EXPECT_FALSE(entry.wakeupTime());
746
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800747 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
748 auto wakeup = entry.wakeupTime();
749 ASSERT_TRUE(wakeup);
Kevin DuBois305bef12019-10-09 13:23:27 -0700750 EXPECT_THAT(wakeup, Eq(900));
751
752 entry.update(mStubTracker, 0);
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800753 wakeup = entry.wakeupTime();
754 ASSERT_TRUE(wakeup);
755 EXPECT_THAT(*wakeup, Eq(920));
Kevin DuBois305bef12019-10-09 13:23:27 -0700756}
757
Kevin DuBoise4f27a82019-11-12 11:41:41 -0800758TEST_F(VSyncDispatchTimerQueueEntryTest, skipsUpdateIfJustScheduled) {
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800759 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800760 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800761 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBois305bef12019-10-09 13:23:27 -0700762 entry.update(mStubTracker, 0);
763
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800764 auto const wakeup = entry.wakeupTime();
765 ASSERT_TRUE(wakeup);
766 EXPECT_THAT(*wakeup, Eq(wakeup));
767}
768
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800769TEST_F(VSyncDispatchTimerQueueEntryTest, willSnapToNextTargettableVSync) {
770 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800771 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800772 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800773 entry.executing(); // 1000 is executing
774 // had 1000 not been executing, this could have been scheduled for time 800.
775 EXPECT_THAT(entry.schedule(200, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
776 EXPECT_THAT(*entry.wakeupTime(), Eq(1800));
777
778 EXPECT_THAT(entry.schedule(50, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
779 EXPECT_THAT(*entry.wakeupTime(), Eq(1950));
780
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800781 EXPECT_THAT(entry.schedule(200, 1001, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800782 EXPECT_THAT(*entry.wakeupTime(), Eq(1800));
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800783}
784
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800785TEST_F(VSyncDispatchTimerQueueEntryTest,
786 willRequestNextEstimateWhenSnappingToNextTargettableVSync) {
787 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800788 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800789
790 Sequence seq;
791 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(500))
792 .InSequence(seq)
793 .WillOnce(Return(1000));
794 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(500))
795 .InSequence(seq)
796 .WillOnce(Return(1000));
797 EXPECT_CALL(mStubTracker, nextAnticipatedVSyncTimeFrom(1000 + mVsyncMoveThreshold))
798 .InSequence(seq)
799 .WillOnce(Return(2000));
800
Kevin DuBois2311b1a2019-11-18 16:19:08 -0800801 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800802
803 entry.executing(); // 1000 is executing
804
805 EXPECT_THAT(entry.schedule(200, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
806}
807
808TEST_F(VSyncDispatchTimerQueueEntryTest, reportsScheduledIfStillTime) {
809 VSyncDispatchTimerQueueEntry entry(
Kevin DuBois2968afc2020-01-14 09:48:50 -0800810 "test", [](auto, auto) {}, mVsyncMoveThreshold);
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800811 EXPECT_THAT(entry.schedule(100, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
812 EXPECT_THAT(entry.schedule(200, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
813 EXPECT_THAT(entry.schedule(50, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
814 EXPECT_THAT(entry.schedule(1200, 500, mStubTracker, 0), Eq(ScheduleResult::Scheduled));
Kevin DuBois305bef12019-10-09 13:23:27 -0700815}
816
817} // namespace android::scheduler
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -0800818
819// TODO(b/129481165): remove the #pragma below and fix conversion issues
820#pragma clang diagnostic pop // ignored "-Wconversion"