1 /*
2 * Copyright (C) 2022 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 #include <android/gui/ISurfaceComposer.h>
18 #include <gtest/gtest.h>
19 #include <gui/DisplayEventReceiver.h>
20 #include <gui/SurfaceComposerClient.h>
21 #include <sys/epoll.h>
22 #include <algorithm>
23
24 namespace android {
25 namespace {
26 using FrameRateOverride = DisplayEventReceiver::Event::FrameRateOverride;
27 using gui::ISurfaceComposer;
28
29 class SetFrameRateOverrideTest : public ::testing::Test {
30 protected:
SetUp()31 void SetUp() override {
32 const ISurfaceComposer::VsyncSource vsyncSource =
33 ISurfaceComposer::VsyncSource::eVsyncSourceApp;
34 const EventRegistrationFlags eventRegistration = {
35 ISurfaceComposer::EventRegistration::frameRateOverride};
36
37 mDisplayEventReceiver =
38 std::make_unique<DisplayEventReceiver>(vsyncSource, eventRegistration);
39 EXPECT_EQ(NO_ERROR, mDisplayEventReceiver->initCheck());
40
41 mEpollFd = epoll_create1(EPOLL_CLOEXEC);
42 EXPECT_GT(mEpollFd, 1);
43
44 epoll_event event;
45 event.events = EPOLLIN;
46 EXPECT_EQ(0, epoll_ctl(mEpollFd, EPOLL_CTL_ADD, mDisplayEventReceiver->getFd(), &event));
47 }
48
TearDown()49 void TearDown() override { close(mEpollFd); }
50
setFrameRateAndListenEvents(uid_t uid,float frameRate)51 void setFrameRateAndListenEvents(uid_t uid, float frameRate) {
52 status_t ret = SurfaceComposerClient::setOverrideFrameRate(uid, frameRate);
53 ASSERT_EQ(NO_ERROR, ret);
54
55 DisplayEventReceiver::Event event;
56 bool isOverrideFlushReceived = false;
57 mFrameRateOverrides.clear();
58
59 epoll_event epollEvent;
60 while (epoll_wait(mEpollFd, &epollEvent, 1, 1000) > 0) {
61 while (mDisplayEventReceiver->getEvents(&event, 1) > 0) {
62 if (event.header.type == DisplayEventReceiver::DISPLAY_EVENT_FRAME_RATE_OVERRIDE) {
63 mFrameRateOverrides.emplace_back(event.frameRateOverride);
64 }
65 if (event.header.type ==
66 DisplayEventReceiver::DISPLAY_EVENT_FRAME_RATE_OVERRIDE_FLUSH) {
67 isOverrideFlushReceived = true;
68 }
69 }
70
71 if (isOverrideFlushReceived) break;
72 }
73 }
74
75 std::unique_ptr<DisplayEventReceiver> mDisplayEventReceiver;
76 std::vector<FrameRateOverride> mFrameRateOverrides;
77
78 int mEpollFd;
79 };
80
TEST_F(SetFrameRateOverrideTest,SetFrameRateOverrideCall)81 TEST_F(SetFrameRateOverrideTest, SetFrameRateOverrideCall) {
82 uid_t uid = getuid();
83 float frameRate = 30.0f;
84 setFrameRateAndListenEvents(uid, frameRate);
85 // check if the frame rate override we set exists
86 ASSERT_TRUE(std::find_if(mFrameRateOverrides.begin(), mFrameRateOverrides.end(),
87 [uid = uid, frameRate = frameRate](auto i) {
88 return uid == i.uid && frameRate == i.frameRateHz;
89 }) != mFrameRateOverrides.end());
90
91 // test removing frame rate override
92 frameRate = 0.0f;
93 setFrameRateAndListenEvents(uid, frameRate);
94 ASSERT_TRUE(std::find_if(mFrameRateOverrides.begin(), mFrameRateOverrides.end(),
95 [uid = uid, frameRate = frameRate](auto i) {
96 return uid == i.uid && frameRate == i.frameRateHz;
97 }) == mFrameRateOverrides.end());
98 }
99 } // namespace
100 } // namespace android
101