blob: a97256203d521555ace9da5d39daba9e985d2bec [file] [log] [blame]
Kevin DuBoisb2501ba2019-11-12 14:20:29 -08001/*
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
17#undef LOG_TAG
18#define LOG_TAG "LibSurfaceFlingerUnittests"
19#define LOG_NDEBUG 0
20
Kevin DuBois2fd3cea2019-11-14 08:52:45 -080021#include "Scheduler/TimeKeeper.h"
Kevin DuBoisb2501ba2019-11-12 14:20:29 -080022#include "Scheduler/VSyncDispatch.h"
23#include "Scheduler/VSyncReactor.h"
24#include "Scheduler/VSyncTracker.h"
25
26#include <gmock/gmock.h>
27#include <gtest/gtest.h>
28#include <ui/Fence.h>
29#include <ui/FenceTime.h>
30#include <array>
31
32using namespace testing;
33using namespace std::literals;
34namespace android::scheduler {
35
36class MockVSyncTracker : public VSyncTracker {
37public:
Kevin DuBois02d5ed92020-01-27 11:05:46 -080038 MockVSyncTracker() { ON_CALL(*this, addVsyncTimestamp(_)).WillByDefault(Return(true)); }
39 MOCK_METHOD1(addVsyncTimestamp, bool(nsecs_t));
Kevin DuBoisb2501ba2019-11-12 14:20:29 -080040 MOCK_CONST_METHOD1(nextAnticipatedVSyncTimeFrom, nsecs_t(nsecs_t));
Kevin DuBois2fd3cea2019-11-14 08:52:45 -080041 MOCK_CONST_METHOD0(currentPeriod, nsecs_t());
Kevin DuBoisee2ad9f2019-11-21 11:10:57 -080042 MOCK_METHOD1(setPeriod, void(nsecs_t));
Kevin DuBoisc3e9e8e2020-01-07 09:06:52 -080043 MOCK_METHOD0(resetModel, void());
Ady Abraham5e7371c2020-03-24 14:47:24 -070044 MOCK_CONST_METHOD1(dump, void(std::string&));
Kevin DuBoisb2501ba2019-11-12 14:20:29 -080045};
46
47class VSyncTrackerWrapper : public VSyncTracker {
48public:
49 VSyncTrackerWrapper(std::shared_ptr<VSyncTracker> const& tracker) : mTracker(tracker) {}
50
Kevin DuBois02d5ed92020-01-27 11:05:46 -080051 bool addVsyncTimestamp(nsecs_t timestamp) final {
52 return mTracker->addVsyncTimestamp(timestamp);
53 }
Kevin DuBoisb2501ba2019-11-12 14:20:29 -080054 nsecs_t nextAnticipatedVSyncTimeFrom(nsecs_t timePoint) const final {
55 return mTracker->nextAnticipatedVSyncTimeFrom(timePoint);
56 }
Kevin DuBois2fd3cea2019-11-14 08:52:45 -080057 nsecs_t currentPeriod() const final { return mTracker->currentPeriod(); }
Kevin DuBoisc3e9e8e2020-01-07 09:06:52 -080058 void setPeriod(nsecs_t period) final { mTracker->setPeriod(period); }
59 void resetModel() final { mTracker->resetModel(); }
Ady Abraham5e7371c2020-03-24 14:47:24 -070060 void dump(std::string& result) const final { mTracker->dump(result); }
Kevin DuBoisb2501ba2019-11-12 14:20:29 -080061
62private:
63 std::shared_ptr<VSyncTracker> const mTracker;
64};
65
Kevin DuBois2fd3cea2019-11-14 08:52:45 -080066class MockClock : public Clock {
67public:
68 MOCK_CONST_METHOD0(now, nsecs_t());
69};
70
71class ClockWrapper : public Clock {
72public:
73 ClockWrapper(std::shared_ptr<Clock> const& clock) : mClock(clock) {}
74
75 nsecs_t now() const { return mClock->now(); }
76
77private:
78 std::shared_ptr<Clock> const mClock;
79};
80
Kevin DuBoisb2501ba2019-11-12 14:20:29 -080081class MockVSyncDispatch : public VSyncDispatch {
82public:
Kevin DuBois2968afc2020-01-14 09:48:50 -080083 MOCK_METHOD2(registerCallback,
84 CallbackToken(std::function<void(nsecs_t, nsecs_t)> const&, std::string));
Kevin DuBoisb2501ba2019-11-12 14:20:29 -080085 MOCK_METHOD1(unregisterCallback, void(CallbackToken));
86 MOCK_METHOD3(schedule, ScheduleResult(CallbackToken, nsecs_t, nsecs_t));
87 MOCK_METHOD1(cancel, CancelResult(CallbackToken token));
Ady Abraham5e7371c2020-03-24 14:47:24 -070088 MOCK_CONST_METHOD1(dump, void(std::string&));
Kevin DuBoisb2501ba2019-11-12 14:20:29 -080089};
90
91class VSyncDispatchWrapper : public VSyncDispatch {
92public:
93 VSyncDispatchWrapper(std::shared_ptr<VSyncDispatch> const& dispatch) : mDispatch(dispatch) {}
Kevin DuBois2968afc2020-01-14 09:48:50 -080094 CallbackToken registerCallback(std::function<void(nsecs_t, nsecs_t)> const& callbackFn,
Kevin DuBoisb2501ba2019-11-12 14:20:29 -080095 std::string callbackName) final {
96 return mDispatch->registerCallback(callbackFn, callbackName);
97 }
98
99 void unregisterCallback(CallbackToken token) final { mDispatch->unregisterCallback(token); }
100
101 ScheduleResult schedule(CallbackToken token, nsecs_t workDuration,
102 nsecs_t earliestVsync) final {
103 return mDispatch->schedule(token, workDuration, earliestVsync);
104 }
105
106 CancelResult cancel(CallbackToken token) final { return mDispatch->cancel(token); }
107
Ady Abraham5e7371c2020-03-24 14:47:24 -0700108 void dump(std::string& result) const final { return mDispatch->dump(result); }
109
Kevin DuBoisb2501ba2019-11-12 14:20:29 -0800110private:
111 std::shared_ptr<VSyncDispatch> const mDispatch;
112};
113
114std::shared_ptr<FenceTime> generateInvalidFence() {
115 sp<Fence> fence = new Fence();
116 return std::make_shared<FenceTime>(fence);
117}
118
119std::shared_ptr<FenceTime> generatePendingFence() {
120 sp<Fence> fence = new Fence(dup(fileno(tmpfile())));
121 return std::make_shared<FenceTime>(fence);
122}
123
124void signalFenceWithTime(std::shared_ptr<FenceTime> const& fence, nsecs_t time) {
125 FenceTime::Snapshot snap(time);
126 fence->applyTrustedSnapshot(snap);
127}
128
129std::shared_ptr<FenceTime> generateSignalledFenceWithTime(nsecs_t time) {
130 sp<Fence> fence = new Fence(dup(fileno(tmpfile())));
131 std::shared_ptr<FenceTime> ft = std::make_shared<FenceTime>(fence);
132 signalFenceWithTime(ft, time);
133 return ft;
134}
135
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800136class StubCallback : public DispSync::Callback {
137public:
Ady Abraham5facfb12020-04-22 15:18:31 -0700138 void onDispSyncEvent(nsecs_t when, nsecs_t /*expectedVSyncTimestamp*/) final {
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800139 std::lock_guard<std::mutex> lk(mMutex);
140 mLastCallTime = when;
141 }
142 std::optional<nsecs_t> lastCallTime() const {
143 std::lock_guard<std::mutex> lk(mMutex);
144 return mLastCallTime;
145 }
146
147private:
148 std::mutex mutable mMutex;
149 std::optional<nsecs_t> mLastCallTime GUARDED_BY(mMutex);
150};
151
Kevin DuBoisb2501ba2019-11-12 14:20:29 -0800152class VSyncReactorTest : public testing::Test {
153protected:
154 VSyncReactorTest()
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800155 : mMockDispatch(std::make_shared<NiceMock<MockVSyncDispatch>>()),
Kevin DuBoisa9fdab72019-11-14 09:44:14 -0800156 mMockTracker(std::make_shared<NiceMock<MockVSyncTracker>>()),
Kevin DuBois2fd3cea2019-11-14 08:52:45 -0800157 mMockClock(std::make_shared<NiceMock<MockClock>>()),
158 mReactor(std::make_unique<ClockWrapper>(mMockClock),
159 std::make_unique<VSyncDispatchWrapper>(mMockDispatch),
Dan Stoza027d3652020-05-26 17:26:34 -0700160 std::make_unique<VSyncTrackerWrapper>(mMockTracker), kPendingLimit,
161 false /* supportKernelIdleTimer */) {
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800162 ON_CALL(*mMockClock, now()).WillByDefault(Return(mFakeNow));
163 ON_CALL(*mMockTracker, currentPeriod()).WillByDefault(Return(period));
164 }
Kevin DuBoisb2501ba2019-11-12 14:20:29 -0800165
166 std::shared_ptr<MockVSyncDispatch> mMockDispatch;
167 std::shared_ptr<MockVSyncTracker> mMockTracker;
Kevin DuBois2fd3cea2019-11-14 08:52:45 -0800168 std::shared_ptr<MockClock> mMockClock;
Kevin DuBoisb2501ba2019-11-12 14:20:29 -0800169 static constexpr size_t kPendingLimit = 3;
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800170 static constexpr nsecs_t mDummyTime = 47;
171 static constexpr nsecs_t mPhase = 3000;
172 static constexpr nsecs_t mAnotherPhase = 5200;
173 static constexpr nsecs_t period = 10000;
Kevin DuBois2968afc2020-01-14 09:48:50 -0800174 static constexpr nsecs_t mFakeVSyncTime = 2093;
175 static constexpr nsecs_t mFakeWakeupTime = 1892;
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800176 static constexpr nsecs_t mFakeNow = 2214;
177 static constexpr const char mName[] = "callbacky";
178 VSyncDispatch::CallbackToken const mFakeToken{2398};
179
180 nsecs_t lastCallbackTime = 0;
181 StubCallback outerCb;
Kevin DuBois2968afc2020-01-14 09:48:50 -0800182 std::function<void(nsecs_t, nsecs_t)> innerCb;
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800183
Kevin DuBoisb2501ba2019-11-12 14:20:29 -0800184 VSyncReactor mReactor;
185};
186
187TEST_F(VSyncReactorTest, addingNullFenceCheck) {
188 EXPECT_FALSE(mReactor.addPresentFence(nullptr));
189}
190
191TEST_F(VSyncReactorTest, addingInvalidFenceSignalsNeedsMoreInfo) {
192 EXPECT_TRUE(mReactor.addPresentFence(generateInvalidFence()));
193}
194
195TEST_F(VSyncReactorTest, addingSignalledFenceAddsToTracker) {
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800196 EXPECT_CALL(*mMockTracker, addVsyncTimestamp(mDummyTime));
197 EXPECT_FALSE(mReactor.addPresentFence(generateSignalledFenceWithTime(mDummyTime)));
Kevin DuBoisb2501ba2019-11-12 14:20:29 -0800198}
199
200TEST_F(VSyncReactorTest, addingPendingFenceAddsSignalled) {
201 nsecs_t anotherDummyTime = 2919019201;
202
203 EXPECT_CALL(*mMockTracker, addVsyncTimestamp(_)).Times(0);
204 auto pendingFence = generatePendingFence();
205 EXPECT_FALSE(mReactor.addPresentFence(pendingFence));
206 Mock::VerifyAndClearExpectations(mMockTracker.get());
207
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800208 signalFenceWithTime(pendingFence, mDummyTime);
Kevin DuBoisb2501ba2019-11-12 14:20:29 -0800209
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800210 EXPECT_CALL(*mMockTracker, addVsyncTimestamp(mDummyTime));
Kevin DuBoisb2501ba2019-11-12 14:20:29 -0800211 EXPECT_CALL(*mMockTracker, addVsyncTimestamp(anotherDummyTime));
212 EXPECT_FALSE(mReactor.addPresentFence(generateSignalledFenceWithTime(anotherDummyTime)));
213}
214
215TEST_F(VSyncReactorTest, limitsPendingFences) {
216 std::array<std::shared_ptr<FenceTime>, kPendingLimit * 2> fences;
217 std::array<nsecs_t, fences.size()> fakeTimes;
218 std::generate(fences.begin(), fences.end(), [] { return generatePendingFence(); });
219 std::generate(fakeTimes.begin(), fakeTimes.end(), [i = 10]() mutable {
220 i++;
221 return i * i;
222 });
223
224 for (auto const& fence : fences) {
225 mReactor.addPresentFence(fence);
226 }
227
228 for (auto i = fences.size() - kPendingLimit; i < fences.size(); i++) {
229 EXPECT_CALL(*mMockTracker, addVsyncTimestamp(fakeTimes[i]));
230 }
231
232 for (auto i = 0u; i < fences.size(); i++) {
233 signalFenceWithTime(fences[i], fakeTimes[i]);
234 }
235 mReactor.addPresentFence(generatePendingFence());
236}
237
238TEST_F(VSyncReactorTest, ignoresPresentFencesWhenToldTo) {
239 static constexpr size_t aFewTimes = 8;
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800240 EXPECT_CALL(*mMockTracker, addVsyncTimestamp(mDummyTime)).Times(1);
Kevin DuBoisb2501ba2019-11-12 14:20:29 -0800241
242 mReactor.setIgnorePresentFences(true);
243 for (auto i = 0; i < aFewTimes; i++) {
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800244 mReactor.addPresentFence(generateSignalledFenceWithTime(mDummyTime));
Kevin DuBoisb2501ba2019-11-12 14:20:29 -0800245 }
246
247 mReactor.setIgnorePresentFences(false);
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800248 EXPECT_FALSE(mReactor.addPresentFence(generateSignalledFenceWithTime(mDummyTime)));
Kevin DuBoisb2501ba2019-11-12 14:20:29 -0800249}
250
Kevin DuBois02d5ed92020-01-27 11:05:46 -0800251TEST_F(VSyncReactorTest, ignoresProperlyAfterAPeriodConfirmation) {
252 bool periodFlushed = true;
253 EXPECT_CALL(*mMockTracker, addVsyncTimestamp(_)).Times(2);
254 mReactor.setIgnorePresentFences(true);
255
256 nsecs_t const newPeriod = 5000;
257 mReactor.setPeriod(newPeriod);
258
Ady Abraham5dee2f12020-02-05 17:49:47 -0800259 EXPECT_TRUE(mReactor.addResyncSample(0, std::nullopt, &periodFlushed));
Kevin DuBois02d5ed92020-01-27 11:05:46 -0800260 EXPECT_FALSE(periodFlushed);
Ady Abraham5dee2f12020-02-05 17:49:47 -0800261 EXPECT_FALSE(mReactor.addResyncSample(newPeriod, std::nullopt, &periodFlushed));
Kevin DuBois02d5ed92020-01-27 11:05:46 -0800262 EXPECT_TRUE(periodFlushed);
263
264 EXPECT_TRUE(mReactor.addPresentFence(generateSignalledFenceWithTime(0)));
265}
266
Kevin DuBois2fd3cea2019-11-14 08:52:45 -0800267TEST_F(VSyncReactorTest, queriesTrackerForNextRefreshNow) {
268 nsecs_t const fakeTimestamp = 4839;
269 EXPECT_CALL(*mMockTracker, currentPeriod()).Times(0);
270 EXPECT_CALL(*mMockTracker, nextAnticipatedVSyncTimeFrom(_))
271 .Times(1)
272 .WillOnce(Return(fakeTimestamp));
273
Ady Abraham0ed31c92020-04-16 11:48:45 -0700274 EXPECT_THAT(mReactor.computeNextRefresh(0, mMockClock->now()), Eq(fakeTimestamp));
Kevin DuBois2fd3cea2019-11-14 08:52:45 -0800275}
276
277TEST_F(VSyncReactorTest, queriesTrackerForExpectedPresentTime) {
278 nsecs_t const fakeTimestamp = 4839;
279 EXPECT_CALL(*mMockTracker, currentPeriod()).Times(0);
280 EXPECT_CALL(*mMockTracker, nextAnticipatedVSyncTimeFrom(_))
281 .Times(1)
282 .WillOnce(Return(fakeTimestamp));
283
Ady Abraham0ed31c92020-04-16 11:48:45 -0700284 EXPECT_THAT(mReactor.expectedPresentTime(mMockClock->now()), Eq(fakeTimestamp));
Kevin DuBois2fd3cea2019-11-14 08:52:45 -0800285}
286
287TEST_F(VSyncReactorTest, queriesTrackerForNextRefreshFuture) {
288 nsecs_t const fakeTimestamp = 4839;
289 nsecs_t const fakePeriod = 1010;
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800290 nsecs_t const mFakeNow = 2214;
Kevin DuBois2fd3cea2019-11-14 08:52:45 -0800291 int const numPeriodsOut = 3;
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800292 EXPECT_CALL(*mMockClock, now()).WillOnce(Return(mFakeNow));
Kevin DuBois2fd3cea2019-11-14 08:52:45 -0800293 EXPECT_CALL(*mMockTracker, currentPeriod()).WillOnce(Return(fakePeriod));
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800294 EXPECT_CALL(*mMockTracker, nextAnticipatedVSyncTimeFrom(mFakeNow + numPeriodsOut * fakePeriod))
Kevin DuBois2fd3cea2019-11-14 08:52:45 -0800295 .WillOnce(Return(fakeTimestamp));
Ady Abraham0ed31c92020-04-16 11:48:45 -0700296 EXPECT_THAT(mReactor.computeNextRefresh(numPeriodsOut, mMockClock->now()), Eq(fakeTimestamp));
Kevin DuBois2fd3cea2019-11-14 08:52:45 -0800297}
298
Kevin DuBoisee2ad9f2019-11-21 11:10:57 -0800299TEST_F(VSyncReactorTest, getPeriod) {
300 nsecs_t const fakePeriod = 1010;
301 EXPECT_CALL(*mMockTracker, currentPeriod()).WillOnce(Return(fakePeriod));
302 EXPECT_THAT(mReactor.getPeriod(), Eq(fakePeriod));
303}
304
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800305TEST_F(VSyncReactorTest, setPeriodCalledOnceConfirmedChange) {
306 nsecs_t const newPeriod = 5000;
307 EXPECT_CALL(*mMockTracker, setPeriod(_)).Times(0);
308 mReactor.setPeriod(newPeriod);
309
310 bool periodFlushed = true;
Ady Abraham5dee2f12020-02-05 17:49:47 -0800311 EXPECT_TRUE(mReactor.addResyncSample(10000, std::nullopt, &periodFlushed));
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800312 EXPECT_FALSE(periodFlushed);
313
Ady Abraham5dee2f12020-02-05 17:49:47 -0800314 EXPECT_TRUE(mReactor.addResyncSample(20000, std::nullopt, &periodFlushed));
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800315 EXPECT_FALSE(periodFlushed);
316
317 Mock::VerifyAndClearExpectations(mMockTracker.get());
318 EXPECT_CALL(*mMockTracker, setPeriod(newPeriod)).Times(1);
319
Ady Abraham5dee2f12020-02-05 17:49:47 -0800320 EXPECT_FALSE(mReactor.addResyncSample(25000, std::nullopt, &periodFlushed));
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800321 EXPECT_TRUE(periodFlushed);
322}
323
Kevin DuBoisc4cdd372020-01-09 14:12:02 -0800324TEST_F(VSyncReactorTest, changingPeriodBackAbortsConfirmationProcess) {
325 nsecs_t sampleTime = 0;
326 nsecs_t const newPeriod = 5000;
327 mReactor.setPeriod(newPeriod);
328 bool periodFlushed = true;
Ady Abraham5dee2f12020-02-05 17:49:47 -0800329 EXPECT_TRUE(mReactor.addResyncSample(sampleTime += period, std::nullopt, &periodFlushed));
Kevin DuBoisc4cdd372020-01-09 14:12:02 -0800330 EXPECT_FALSE(periodFlushed);
331
Ady Abraham5dee2f12020-02-05 17:49:47 -0800332 EXPECT_TRUE(mReactor.addResyncSample(sampleTime += period, std::nullopt, &periodFlushed));
Kevin DuBoisc4cdd372020-01-09 14:12:02 -0800333 EXPECT_FALSE(periodFlushed);
334
335 mReactor.setPeriod(period);
Ady Abraham5dee2f12020-02-05 17:49:47 -0800336 EXPECT_FALSE(mReactor.addResyncSample(sampleTime += period, std::nullopt, &periodFlushed));
Kevin DuBoisc4cdd372020-01-09 14:12:02 -0800337 EXPECT_FALSE(periodFlushed);
338}
339
340TEST_F(VSyncReactorTest, changingToAThirdPeriodWillWaitForLastPeriod) {
341 nsecs_t sampleTime = 0;
342 nsecs_t const secondPeriod = 5000;
343 nsecs_t const thirdPeriod = 2000;
344
345 mReactor.setPeriod(secondPeriod);
346 bool periodFlushed = true;
Ady Abraham5dee2f12020-02-05 17:49:47 -0800347 EXPECT_TRUE(mReactor.addResyncSample(sampleTime += period, std::nullopt, &periodFlushed));
Kevin DuBoisc4cdd372020-01-09 14:12:02 -0800348 EXPECT_FALSE(periodFlushed);
Ady Abraham5dee2f12020-02-05 17:49:47 -0800349 EXPECT_TRUE(mReactor.addResyncSample(sampleTime += period, std::nullopt, &periodFlushed));
Kevin DuBoisc4cdd372020-01-09 14:12:02 -0800350 EXPECT_FALSE(periodFlushed);
351 mReactor.setPeriod(thirdPeriod);
Ady Abraham5dee2f12020-02-05 17:49:47 -0800352 EXPECT_TRUE(mReactor.addResyncSample(sampleTime += secondPeriod, std::nullopt, &periodFlushed));
Kevin DuBoisc4cdd372020-01-09 14:12:02 -0800353 EXPECT_FALSE(periodFlushed);
Ady Abraham5dee2f12020-02-05 17:49:47 -0800354 EXPECT_FALSE(mReactor.addResyncSample(sampleTime += thirdPeriod, std::nullopt, &periodFlushed));
Kevin DuBoisc4cdd372020-01-09 14:12:02 -0800355 EXPECT_TRUE(periodFlushed);
356}
357
Kevin DuBois02d5ed92020-01-27 11:05:46 -0800358TEST_F(VSyncReactorTest, reportedBadTimestampFromPredictorWillReactivateHwVSync) {
359 EXPECT_CALL(*mMockTracker, addVsyncTimestamp(_))
360 .WillOnce(Return(false))
361 .WillOnce(Return(true))
362 .WillOnce(Return(true));
363 EXPECT_TRUE(mReactor.addPresentFence(generateSignalledFenceWithTime(0)));
364 EXPECT_TRUE(mReactor.addPresentFence(generateSignalledFenceWithTime(0)));
365
366 nsecs_t skewyPeriod = period >> 1;
367 bool periodFlushed = false;
368 nsecs_t sampleTime = 0;
Ady Abraham5dee2f12020-02-05 17:49:47 -0800369 EXPECT_TRUE(mReactor.addResyncSample(sampleTime += skewyPeriod, std::nullopt, &periodFlushed));
Kevin DuBois02d5ed92020-01-27 11:05:46 -0800370 EXPECT_FALSE(periodFlushed);
Ady Abraham5dee2f12020-02-05 17:49:47 -0800371 EXPECT_FALSE(mReactor.addResyncSample(sampleTime += period, std::nullopt, &periodFlushed));
Kevin DuBois02d5ed92020-01-27 11:05:46 -0800372 EXPECT_FALSE(periodFlushed);
373}
374
375TEST_F(VSyncReactorTest, reportedBadTimestampFromPredictorWillReactivateHwVSyncPendingFence) {
376 EXPECT_CALL(*mMockTracker, addVsyncTimestamp(_))
377 .Times(2)
378 .WillOnce(Return(false))
379 .WillOnce(Return(true));
380
381 auto fence = generatePendingFence();
382 EXPECT_FALSE(mReactor.addPresentFence(fence));
383 signalFenceWithTime(fence, period >> 1);
384 EXPECT_TRUE(mReactor.addPresentFence(generateSignalledFenceWithTime(0)));
385}
386
Kevin DuBoisc4cdd372020-01-09 14:12:02 -0800387TEST_F(VSyncReactorTest, presentFenceAdditionDoesNotInterruptConfirmationProcess) {
388 nsecs_t const newPeriod = 5000;
389 mReactor.setPeriod(newPeriod);
390 EXPECT_TRUE(mReactor.addPresentFence(generateSignalledFenceWithTime(0)));
391}
392
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800393TEST_F(VSyncReactorTest, setPeriodCalledFirstTwoEventsNewPeriod) {
394 nsecs_t const newPeriod = 5000;
395 EXPECT_CALL(*mMockTracker, setPeriod(_)).Times(0);
396 mReactor.setPeriod(newPeriod);
397
398 bool periodFlushed = true;
Ady Abraham5dee2f12020-02-05 17:49:47 -0800399 EXPECT_TRUE(mReactor.addResyncSample(5000, std::nullopt, &periodFlushed));
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800400 EXPECT_FALSE(periodFlushed);
401 Mock::VerifyAndClearExpectations(mMockTracker.get());
402
403 EXPECT_CALL(*mMockTracker, setPeriod(newPeriod)).Times(1);
Ady Abraham5dee2f12020-02-05 17:49:47 -0800404 EXPECT_FALSE(mReactor.addResyncSample(10000, std::nullopt, &periodFlushed));
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800405 EXPECT_TRUE(periodFlushed);
Kevin DuBoisee2ad9f2019-11-21 11:10:57 -0800406}
407
Kevin DuBoisa9fdab72019-11-14 09:44:14 -0800408TEST_F(VSyncReactorTest, addResyncSampleTypical) {
409 nsecs_t const fakeTimestamp = 3032;
410 bool periodFlushed = false;
411
412 EXPECT_CALL(*mMockTracker, addVsyncTimestamp(fakeTimestamp));
Ady Abraham5dee2f12020-02-05 17:49:47 -0800413 EXPECT_FALSE(mReactor.addResyncSample(fakeTimestamp, std::nullopt, &periodFlushed));
Kevin DuBoisa9fdab72019-11-14 09:44:14 -0800414 EXPECT_FALSE(periodFlushed);
415}
416
417TEST_F(VSyncReactorTest, addResyncSamplePeriodChanges) {
418 bool periodFlushed = false;
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800419 nsecs_t const newPeriod = 4000;
420
Kevin DuBoisa9fdab72019-11-14 09:44:14 -0800421 mReactor.setPeriod(newPeriod);
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800422
423 auto time = 0;
424 auto constexpr numTimestampSubmissions = 10;
425 for (auto i = 0; i < numTimestampSubmissions; i++) {
426 time += period;
Ady Abraham5dee2f12020-02-05 17:49:47 -0800427 EXPECT_TRUE(mReactor.addResyncSample(time, std::nullopt, &periodFlushed));
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800428 EXPECT_FALSE(periodFlushed);
429 }
430
431 time += newPeriod;
Ady Abraham5dee2f12020-02-05 17:49:47 -0800432 EXPECT_FALSE(mReactor.addResyncSample(time, std::nullopt, &periodFlushed));
Kevin DuBoisa9fdab72019-11-14 09:44:14 -0800433 EXPECT_TRUE(periodFlushed);
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800434
435 for (auto i = 0; i < numTimestampSubmissions; i++) {
436 time += newPeriod;
Ady Abraham5dee2f12020-02-05 17:49:47 -0800437 EXPECT_FALSE(mReactor.addResyncSample(time, std::nullopt, &periodFlushed));
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800438 EXPECT_FALSE(periodFlushed);
439 }
440}
441
442TEST_F(VSyncReactorTest, addPresentFenceWhileAwaitingPeriodConfirmationRequestsHwVsync) {
443 auto time = 0;
444 bool periodFlushed = false;
445 nsecs_t const newPeriod = 4000;
446 mReactor.setPeriod(newPeriod);
447
448 time += period;
Ady Abraham5dee2f12020-02-05 17:49:47 -0800449 mReactor.addResyncSample(time, std::nullopt, &periodFlushed);
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800450 EXPECT_TRUE(mReactor.addPresentFence(generateSignalledFenceWithTime(0)));
451
452 time += newPeriod;
Ady Abraham5dee2f12020-02-05 17:49:47 -0800453 mReactor.addResyncSample(time, std::nullopt, &periodFlushed);
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800454
455 EXPECT_FALSE(mReactor.addPresentFence(generateSignalledFenceWithTime(0)));
Kevin DuBoisa9fdab72019-11-14 09:44:14 -0800456}
457
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800458static nsecs_t computeWorkload(nsecs_t period, nsecs_t phase) {
459 return period - phase;
460}
461
462TEST_F(VSyncReactorTest, addEventListener) {
463 Sequence seq;
464 EXPECT_CALL(*mMockDispatch, registerCallback(_, std::string(mName)))
465 .InSequence(seq)
466 .WillOnce(Return(mFakeToken));
467 EXPECT_CALL(*mMockDispatch, schedule(mFakeToken, computeWorkload(period, mPhase), mFakeNow))
468 .InSequence(seq);
469 EXPECT_CALL(*mMockDispatch, cancel(mFakeToken)).Times(2).InSequence(seq);
470 EXPECT_CALL(*mMockDispatch, unregisterCallback(mFakeToken)).InSequence(seq);
471
472 mReactor.addEventListener(mName, mPhase, &outerCb, lastCallbackTime);
473 mReactor.removeEventListener(&outerCb, &lastCallbackTime);
474}
475
476TEST_F(VSyncReactorTest, addEventListenerTwiceChangesPhase) {
477 Sequence seq;
478 EXPECT_CALL(*mMockDispatch, registerCallback(_, std::string(mName)))
479 .InSequence(seq)
480 .WillOnce(Return(mFakeToken));
481 EXPECT_CALL(*mMockDispatch, schedule(mFakeToken, computeWorkload(period, mPhase), mFakeNow))
482 .InSequence(seq);
483 EXPECT_CALL(*mMockDispatch,
484 schedule(mFakeToken, computeWorkload(period, mAnotherPhase), _)) // mFakeNow))
485 .InSequence(seq);
486 EXPECT_CALL(*mMockDispatch, cancel(mFakeToken)).InSequence(seq);
487 EXPECT_CALL(*mMockDispatch, unregisterCallback(mFakeToken)).InSequence(seq);
488
489 mReactor.addEventListener(mName, mPhase, &outerCb, lastCallbackTime);
490 mReactor.addEventListener(mName, mAnotherPhase, &outerCb, lastCallbackTime);
491}
492
493TEST_F(VSyncReactorTest, eventListenerGetsACallbackAndReschedules) {
494 Sequence seq;
495 EXPECT_CALL(*mMockDispatch, registerCallback(_, std::string(mName)))
496 .InSequence(seq)
497 .WillOnce(DoAll(SaveArg<0>(&innerCb), Return(mFakeToken)));
498 EXPECT_CALL(*mMockDispatch, schedule(mFakeToken, computeWorkload(period, mPhase), mFakeNow))
499 .InSequence(seq);
Kevin DuBois2968afc2020-01-14 09:48:50 -0800500 EXPECT_CALL(*mMockDispatch,
501 schedule(mFakeToken, computeWorkload(period, mPhase), mFakeVSyncTime))
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800502 .Times(2)
503 .InSequence(seq);
504 EXPECT_CALL(*mMockDispatch, cancel(mFakeToken)).InSequence(seq);
505 EXPECT_CALL(*mMockDispatch, unregisterCallback(mFakeToken)).InSequence(seq);
506
507 mReactor.addEventListener(mName, mPhase, &outerCb, lastCallbackTime);
508 ASSERT_TRUE(innerCb);
Kevin DuBois2968afc2020-01-14 09:48:50 -0800509 innerCb(mFakeVSyncTime, mFakeWakeupTime);
510 innerCb(mFakeVSyncTime, mFakeWakeupTime);
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800511}
512
Kevin DuBois2968afc2020-01-14 09:48:50 -0800513TEST_F(VSyncReactorTest, callbackTimestampDistributedIsWakeupTime) {
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800514 Sequence seq;
515 EXPECT_CALL(*mMockDispatch, registerCallback(_, _))
516 .InSequence(seq)
517 .WillOnce(DoAll(SaveArg<0>(&innerCb), Return(mFakeToken)));
518 EXPECT_CALL(*mMockDispatch, schedule(mFakeToken, computeWorkload(period, mPhase), mFakeNow))
519 .InSequence(seq);
Kevin DuBois2968afc2020-01-14 09:48:50 -0800520 EXPECT_CALL(*mMockDispatch,
521 schedule(mFakeToken, computeWorkload(period, mPhase), mFakeVSyncTime))
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800522 .InSequence(seq);
523
524 mReactor.addEventListener(mName, mPhase, &outerCb, lastCallbackTime);
525 ASSERT_TRUE(innerCb);
Kevin DuBois2968afc2020-01-14 09:48:50 -0800526 innerCb(mFakeVSyncTime, mFakeWakeupTime);
527 EXPECT_THAT(outerCb.lastCallTime(), Optional(mFakeWakeupTime));
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800528}
529
530TEST_F(VSyncReactorTest, eventListenersRemovedOnDestruction) {
531 Sequence seq;
532 EXPECT_CALL(*mMockDispatch, registerCallback(_, std::string(mName)))
533 .InSequence(seq)
534 .WillOnce(Return(mFakeToken));
535 EXPECT_CALL(*mMockDispatch, schedule(mFakeToken, computeWorkload(period, mPhase), mFakeNow))
536 .InSequence(seq);
537 EXPECT_CALL(*mMockDispatch, cancel(mFakeToken)).InSequence(seq);
538 EXPECT_CALL(*mMockDispatch, unregisterCallback(mFakeToken)).InSequence(seq);
539
540 mReactor.addEventListener(mName, mPhase, &outerCb, lastCallbackTime);
541}
542
Kevin DuBoisbf7632e2020-02-13 10:11:53 -0800543// b/149221293
544TEST_F(VSyncReactorTest, selfRemovingEventListenerStopsCallbacks) {
545 class SelfRemovingCallback : public DispSync::Callback {
546 public:
547 SelfRemovingCallback(VSyncReactor& vsr) : mVsr(vsr) {}
Ady Abraham5facfb12020-04-22 15:18:31 -0700548 void onDispSyncEvent(nsecs_t when, nsecs_t /*expectedVSyncTimestamp*/) final {
549 mVsr.removeEventListener(this, &when);
550 }
Kevin DuBoisbf7632e2020-02-13 10:11:53 -0800551
552 private:
553 VSyncReactor& mVsr;
554 } selfRemover(mReactor);
555
556 Sequence seq;
557 EXPECT_CALL(*mMockDispatch, registerCallback(_, std::string(mName)))
558 .InSequence(seq)
559 .WillOnce(DoAll(SaveArg<0>(&innerCb), Return(mFakeToken)));
560 EXPECT_CALL(*mMockDispatch, schedule(mFakeToken, computeWorkload(period, mPhase), mFakeNow))
561 .InSequence(seq);
562 EXPECT_CALL(*mMockDispatch, cancel(mFakeToken)).Times(2).InSequence(seq);
563 EXPECT_CALL(*mMockDispatch, unregisterCallback(mFakeToken)).InSequence(seq);
564
565 mReactor.addEventListener(mName, mPhase, &selfRemover, lastCallbackTime);
566 innerCb(0, 0);
567}
568
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800569TEST_F(VSyncReactorTest, addEventListenerChangePeriod) {
570 Sequence seq;
571 EXPECT_CALL(*mMockDispatch, registerCallback(_, std::string(mName)))
572 .InSequence(seq)
573 .WillOnce(Return(mFakeToken));
574 EXPECT_CALL(*mMockDispatch, schedule(mFakeToken, computeWorkload(period, mPhase), mFakeNow))
575 .InSequence(seq);
576 EXPECT_CALL(*mMockDispatch,
577 schedule(mFakeToken, computeWorkload(period, mAnotherPhase), mFakeNow))
578 .InSequence(seq);
579 EXPECT_CALL(*mMockDispatch, cancel(mFakeToken)).InSequence(seq);
580 EXPECT_CALL(*mMockDispatch, unregisterCallback(mFakeToken)).InSequence(seq);
581
582 mReactor.addEventListener(mName, mPhase, &outerCb, lastCallbackTime);
583 mReactor.addEventListener(mName, mAnotherPhase, &outerCb, lastCallbackTime);
584}
585
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800586TEST_F(VSyncReactorTest, changingPeriodChangesOffsetsOnNextCb) {
587 static constexpr nsecs_t anotherPeriod = 23333;
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800588 Sequence seq;
589 EXPECT_CALL(*mMockDispatch, registerCallback(_, std::string(mName)))
590 .InSequence(seq)
591 .WillOnce(Return(mFakeToken));
592 EXPECT_CALL(*mMockDispatch, schedule(mFakeToken, computeWorkload(period, mPhase), mFakeNow))
593 .InSequence(seq);
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800594 EXPECT_CALL(*mMockTracker, setPeriod(anotherPeriod));
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800595 EXPECT_CALL(*mMockDispatch,
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800596 schedule(mFakeToken, computeWorkload(anotherPeriod, mPhase), mFakeNow))
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800597 .InSequence(seq);
598
599 mReactor.addEventListener(mName, mPhase, &outerCb, lastCallbackTime);
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800600
601 bool periodFlushed = false;
602 mReactor.setPeriod(anotherPeriod);
Ady Abraham5dee2f12020-02-05 17:49:47 -0800603 EXPECT_TRUE(mReactor.addResyncSample(anotherPeriod, std::nullopt, &periodFlushed));
604 EXPECT_FALSE(mReactor.addResyncSample(anotherPeriod * 2, std::nullopt, &periodFlushed));
Kevin DuBoisf77025c2019-12-18 16:13:24 -0800605
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800606 mReactor.addEventListener(mName, mPhase, &outerCb, lastCallbackTime);
607}
608
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800609TEST_F(VSyncReactorTest, offsetsAppliedOnNextOpportunity) {
610 Sequence seq;
611 EXPECT_CALL(*mMockDispatch, registerCallback(_, std::string(mName)))
612 .InSequence(seq)
613 .WillOnce(DoAll(SaveArg<0>(&innerCb), Return(mFakeToken)));
614 EXPECT_CALL(*mMockDispatch, schedule(mFakeToken, computeWorkload(period, mPhase), _))
615 .InSequence(seq)
616 .WillOnce(Return(ScheduleResult::Scheduled));
617
618 EXPECT_CALL(*mMockDispatch, schedule(mFakeToken, computeWorkload(period, mAnotherPhase), _))
619 .InSequence(seq)
620 .WillOnce(Return(ScheduleResult::Scheduled));
621
622 EXPECT_CALL(*mMockDispatch, schedule(mFakeToken, computeWorkload(period, mAnotherPhase), _))
623 .InSequence(seq)
624 .WillOnce(Return(ScheduleResult::Scheduled));
625
626 mReactor.addEventListener(mName, mPhase, &outerCb, lastCallbackTime);
627 mReactor.changePhaseOffset(&outerCb, mAnotherPhase);
628 ASSERT_TRUE(innerCb);
Kevin DuBois2968afc2020-01-14 09:48:50 -0800629 innerCb(mFakeVSyncTime, mFakeWakeupTime);
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800630}
631
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800632TEST_F(VSyncReactorTest, negativeOffsetsApplied) {
633 nsecs_t const negativePhase = -4000;
634 Sequence seq;
635 EXPECT_CALL(*mMockDispatch, registerCallback(_, std::string(mName)))
636 .InSequence(seq)
637 .WillOnce(Return(mFakeToken));
638 EXPECT_CALL(*mMockDispatch,
639 schedule(mFakeToken, computeWorkload(period, negativePhase), mFakeNow))
640 .InSequence(seq);
641 mReactor.addEventListener(mName, negativePhase, &outerCb, lastCallbackTime);
642}
643
Kevin DuBoisc3e9e8e2020-01-07 09:06:52 -0800644TEST_F(VSyncReactorTest, beginResyncResetsModel) {
645 EXPECT_CALL(*mMockTracker, resetModel());
646 mReactor.beginResync();
647}
648
Ady Abraham5dee2f12020-02-05 17:49:47 -0800649TEST_F(VSyncReactorTest, periodChangeWithGivenVsyncPeriod) {
650 bool periodFlushed = true;
651 EXPECT_CALL(*mMockTracker, addVsyncTimestamp(_)).Times(3);
652 mReactor.setIgnorePresentFences(true);
653
654 nsecs_t const newPeriod = 5000;
655 mReactor.setPeriod(newPeriod);
656
657 EXPECT_TRUE(mReactor.addResyncSample(0, 0, &periodFlushed));
658 EXPECT_FALSE(periodFlushed);
659 EXPECT_TRUE(mReactor.addResyncSample(newPeriod, 0, &periodFlushed));
660 EXPECT_FALSE(periodFlushed);
661 EXPECT_FALSE(mReactor.addResyncSample(newPeriod, newPeriod, &periodFlushed));
662 EXPECT_TRUE(periodFlushed);
663
664 EXPECT_TRUE(mReactor.addPresentFence(generateSignalledFenceWithTime(0)));
665}
666
Dan Stoza027d3652020-05-26 17:26:34 -0700667TEST_F(VSyncReactorTest, periodIsMeasuredIfIgnoringComposer) {
668 // Create a reactor which supports the kernel idle timer
669 auto idleReactor = VSyncReactor(std::make_unique<ClockWrapper>(mMockClock),
670 std::make_unique<VSyncDispatchWrapper>(mMockDispatch),
671 std::make_unique<VSyncTrackerWrapper>(mMockTracker),
672 kPendingLimit, true /* supportKernelIdleTimer */);
673
674 bool periodFlushed = true;
Dan Stoza09bf7632020-06-10 14:28:50 -0700675 EXPECT_CALL(*mMockTracker, addVsyncTimestamp(_)).Times(5);
Dan Stoza027d3652020-05-26 17:26:34 -0700676 idleReactor.setIgnorePresentFences(true);
677
Dan Stoza09bf7632020-06-10 14:28:50 -0700678 // First, set the same period, which should only be confirmed when we receive two
679 // matching callbacks
680 idleReactor.setPeriod(10000);
Dan Stoza027d3652020-05-26 17:26:34 -0700681 EXPECT_TRUE(idleReactor.addResyncSample(0, 0, &periodFlushed));
682 EXPECT_FALSE(periodFlushed);
Dan Stoza09bf7632020-06-10 14:28:50 -0700683 // Correct period but incorrect timestamp delta
684 EXPECT_TRUE(idleReactor.addResyncSample(0, 10000, &periodFlushed));
685 EXPECT_FALSE(periodFlushed);
686 // Correct period and correct timestamp delta
687 EXPECT_FALSE(idleReactor.addResyncSample(10000, 10000, &periodFlushed));
688 EXPECT_TRUE(periodFlushed);
689
690 // Then, set a new period, which should be confirmed as soon as we receive a callback
691 // reporting the new period
692 nsecs_t const newPeriod = 5000;
693 idleReactor.setPeriod(newPeriod);
694 // Incorrect timestamp delta and period
695 EXPECT_TRUE(idleReactor.addResyncSample(20000, 10000, &periodFlushed));
696 EXPECT_FALSE(periodFlushed);
697 // Incorrect timestamp delta but correct period
698 EXPECT_FALSE(idleReactor.addResyncSample(20000, 5000, &periodFlushed));
Dan Stoza027d3652020-05-26 17:26:34 -0700699 EXPECT_TRUE(periodFlushed);
700
701 EXPECT_TRUE(idleReactor.addPresentFence(generateSignalledFenceWithTime(0)));
702}
703
Kevin DuBoisf91e9232019-11-21 10:51:23 -0800704using VSyncReactorDeathTest = VSyncReactorTest;
705TEST_F(VSyncReactorDeathTest, invalidRemoval) {
706 mReactor.addEventListener(mName, mPhase, &outerCb, lastCallbackTime);
707 mReactor.removeEventListener(&outerCb, &lastCallbackTime);
708 EXPECT_DEATH(mReactor.removeEventListener(&outerCb, &lastCallbackTime), ".*");
709}
710
711TEST_F(VSyncReactorDeathTest, invalidChange) {
712 EXPECT_DEATH(mReactor.changePhaseOffset(&outerCb, mPhase), ".*");
713
714 // the current DispSync-interface usage pattern has evolved around an implementation quirk,
715 // which is a callback is assumed to always exist, and it is valid api usage to change the
716 // offset of an object that is in the removed state.
717 mReactor.addEventListener(mName, mPhase, &outerCb, lastCallbackTime);
718 mReactor.removeEventListener(&outerCb, &lastCallbackTime);
719 mReactor.changePhaseOffset(&outerCb, mPhase);
720}
721
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800722TEST_F(VSyncReactorDeathTest, cannotScheduleOnRegistration) {
723 ON_CALL(*mMockDispatch, schedule(_, _, _))
724 .WillByDefault(Return(ScheduleResult::CannotSchedule));
725 EXPECT_DEATH(mReactor.addEventListener(mName, mPhase, &outerCb, lastCallbackTime), ".*");
726}
727
728TEST_F(VSyncReactorDeathTest, cannotScheduleOnCallback) {
729 EXPECT_CALL(*mMockDispatch, registerCallback(_, std::string(mName)))
730 .WillOnce(DoAll(SaveArg<0>(&innerCb), Return(mFakeToken)));
731 EXPECT_CALL(*mMockDispatch, schedule(_, _, _)).WillOnce(Return(ScheduleResult::Scheduled));
732
733 mReactor.addEventListener(mName, mPhase, &outerCb, lastCallbackTime);
734 ASSERT_TRUE(innerCb);
735 Mock::VerifyAndClearExpectations(mMockDispatch.get());
736
737 ON_CALL(*mMockDispatch, schedule(_, _, _))
738 .WillByDefault(Return(ScheduleResult::CannotSchedule));
Kevin DuBois2968afc2020-01-14 09:48:50 -0800739 EXPECT_DEATH(innerCb(mFakeVSyncTime, mFakeWakeupTime), ".*");
Kevin DuBoisc94ca832019-11-26 12:56:24 -0800740}
741
Kevin DuBoisb2501ba2019-11-12 14:20:29 -0800742} // namespace android::scheduler