Add method to get current vsync from sf directly.
Bug: 205721584
Test: atest libsurfaceflinger_unittest
Test: atest DisplayEventReceiverTest
Change-Id: I38d4bd20bc2f2ad7ff964c3d613c28919478c0fc
diff --git a/services/surfaceflinger/tests/unittests/DispSyncSourceTest.cpp b/services/surfaceflinger/tests/unittests/DispSyncSourceTest.cpp
index 5a0ea35..0b6b475 100644
--- a/services/surfaceflinger/tests/unittests/DispSyncSourceTest.cpp
+++ b/services/surfaceflinger/tests/unittests/DispSyncSourceTest.cpp
@@ -28,6 +28,7 @@
#include "AsyncCallRecorder.h"
#include "Scheduler/DispSyncSource.h"
#include "Scheduler/VSyncDispatch.h"
+#include "mock/MockVSyncTracker.h"
namespace android {
namespace {
@@ -125,12 +126,13 @@
DispSyncSourceTest();
~DispSyncSourceTest() override;
- void createDispSync();
+ void SetUp() override;
void createDispSyncSource();
void onVSyncEvent(nsecs_t when, VSyncSource::VSyncData) override;
std::unique_ptr<MockVSyncDispatch> mVSyncDispatch;
+ std::unique_ptr<mock::VSyncTracker> mVSyncTracker;
std::unique_ptr<scheduler::DispSyncSource> mDispSyncSource;
AsyncCallRecorder<void (*)(nsecs_t, VSyncSource::VSyncData)> mVSyncEventCallRecorder;
@@ -154,20 +156,21 @@
ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
}
+void DispSyncSourceTest::SetUp() {
+ mVSyncDispatch = std::make_unique<MockVSyncDispatch>();
+ mVSyncTracker = std::make_unique<mock::VSyncTracker>();
+}
+
void DispSyncSourceTest::onVSyncEvent(nsecs_t when, VSyncSource::VSyncData vsyncData) {
ALOGD("onVSyncEvent: %" PRId64, when);
mVSyncEventCallRecorder.recordCall(when, vsyncData);
}
-void DispSyncSourceTest::createDispSync() {
- mVSyncDispatch = std::make_unique<MockVSyncDispatch>();
-}
-
void DispSyncSourceTest::createDispSyncSource() {
- mDispSyncSource =
- std::make_unique<scheduler::DispSyncSource>(*mVSyncDispatch, mWorkDuration,
- mReadyDuration, true, mName.c_str());
+ mDispSyncSource = std::make_unique<scheduler::DispSyncSource>(*mVSyncDispatch, *mVSyncTracker,
+ mWorkDuration, mReadyDuration,
+ true, mName.c_str());
mDispSyncSource->setCallback(this);
}
@@ -176,13 +179,10 @@
*/
TEST_F(DispSyncSourceTest, createDispSync) {
- createDispSync();
EXPECT_TRUE(mVSyncDispatch);
}
TEST_F(DispSyncSourceTest, createDispSyncSource) {
- createDispSync();
-
InSequence seq;
EXPECT_CALL(*mVSyncDispatch, registerCallback(_, mName)).WillOnce(Return(mFakeToken));
EXPECT_CALL(*mVSyncDispatch, cancel(mFakeToken))
@@ -194,8 +194,6 @@
}
TEST_F(DispSyncSourceTest, noCallbackAfterInit) {
- createDispSync();
-
InSequence seq;
EXPECT_CALL(*mVSyncDispatch, registerCallback(_, mName)).Times(1);
EXPECT_CALL(*mVSyncDispatch, cancel(_)).Times(1);
@@ -210,8 +208,6 @@
}
TEST_F(DispSyncSourceTest, waitForCallbacks) {
- createDispSync();
-
InSequence seq;
EXPECT_CALL(*mVSyncDispatch, registerCallback(_, mName)).Times(1);
EXPECT_CALL(*mVSyncDispatch,
@@ -239,8 +235,6 @@
}
TEST_F(DispSyncSourceTest, waitForCallbacksWithDurationChange) {
- createDispSync();
-
InSequence seq;
EXPECT_CALL(*mVSyncDispatch, registerCallback(_, mName)).Times(1);
EXPECT_CALL(*mVSyncDispatch,
@@ -296,5 +290,27 @@
EXPECT_CALL(*mVSyncDispatch, unregisterCallback(_)).Times(1);
}
+TEST_F(DispSyncSourceTest, getLatestVsyncData) {
+ const nsecs_t now = systemTime();
+ const nsecs_t vsyncInternalDuration = mWorkDuration.count() + mReadyDuration.count();
+ EXPECT_CALL(*mVSyncTracker, nextAnticipatedVSyncTimeFrom(_))
+ .WillOnce(Return(now + vsyncInternalDuration + 1));
+ {
+ InSequence seq;
+ EXPECT_CALL(*mVSyncDispatch, registerCallback(_, mName)).Times(1);
+ EXPECT_CALL(*mVSyncDispatch, cancel(_)).Times(1);
+ EXPECT_CALL(*mVSyncDispatch, unregisterCallback(_)).Times(1);
+ }
+
+ createDispSyncSource();
+ EXPECT_TRUE(mDispSyncSource);
+
+ const auto vsyncData = mDispSyncSource->getLatestVSyncData();
+ ASSERT_GT(vsyncData.deadlineTimestamp, now);
+ ASSERT_GT(vsyncData.expectedVSyncTimestamp, vsyncData.deadlineTimestamp);
+ EXPECT_EQ(vsyncData.deadlineTimestamp,
+ vsyncData.expectedVSyncTimestamp - vsyncInternalDuration);
+}
+
} // namespace
} // namespace android