blob: e43ef952d60735b56bcf1e1baebec1d73c830d22 [file] [log] [blame]
Andy Yu8c38b252022-01-15 01:13:19 -08001/*
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
Huihong Luo1b0c49f2022-03-15 19:18:21 -070017#include <android/gui/ISurfaceComposer.h>
Andy Yu8c38b252022-01-15 01:13:19 -080018#include <gtest/gtest.h>
19#include <gui/DisplayEventReceiver.h>
Andy Yu8c38b252022-01-15 01:13:19 -080020#include <gui/SurfaceComposerClient.h>
21#include <sys/epoll.h>
22#include <algorithm>
23
24namespace android {
25namespace {
26using FrameRateOverride = DisplayEventReceiver::Event::FrameRateOverride;
Huihong Luo1b0c49f2022-03-15 19:18:21 -070027using gui::ISurfaceComposer;
Andy Yu8c38b252022-01-15 01:13:19 -080028
29class SetFrameRateOverrideTest : public ::testing::Test {
30protected:
31 void SetUp() override {
Huihong Luo1b0c49f2022-03-15 19:18:21 -070032 const ISurfaceComposer::VsyncSource vsyncSource =
33 ISurfaceComposer::VsyncSource::eVsyncSourceApp;
34 const EventRegistrationFlags eventRegistration = {
Andy Yu8c38b252022-01-15 01:13:19 -080035 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
49 void TearDown() override { close(mEpollFd); }
50
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
81TEST_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