• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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