blob: fba77e997ce905691d57e9d400d579a41969a9c4 [file] [log] [blame]
Ana Krulec4593b692019-01-11 22:07:25 -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 "SchedulerUnittests"
19
20#include <gmock/gmock.h>
21#include <log/log.h>
22#include <thread>
23
24#include "Scheduler/RefreshRateStats.h"
Alec Mourifb571ea2019-01-24 18:42:10 -080025#include "mock/MockTimeStats.h"
Ana Krulec4593b692019-01-11 22:07:25 -080026
27using namespace std::chrono_literals;
Peiyong Lin65248e02020-04-18 21:15:07 -070028using android::hardware::graphics::composer::hal::PowerMode;
Alec Mourifb571ea2019-01-24 18:42:10 -080029using testing::_;
Alec Mouria2957ea2019-03-16 21:05:23 -070030using testing::AtLeast;
Ana Krulec4593b692019-01-11 22:07:25 -080031
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070032namespace android::scheduler {
Ana Krulec4593b692019-01-11 22:07:25 -080033
34class RefreshRateStatsTest : public testing::Test {
35protected:
Ana Krulec4593b692019-01-11 22:07:25 -080036 RefreshRateStatsTest();
37 ~RefreshRateStatsTest();
38
Dominik Laskowskib0054a22022-03-03 09:03:06 -080039 void resetStats(Fps fps) {
Leon Scroggins IIIde8d9a12024-01-23 12:05:49 -050040 mRefreshRateStats = std::make_unique<RefreshRateStats>(mTimeStats, fps);
Steven Thomas2bbaabe2019-08-28 16:08:35 -070041 }
42
Dominik Laskowski64536512019-03-28 09:53:04 -070043 mock::TimeStats mTimeStats;
Steven Thomas2bbaabe2019-08-28 16:08:35 -070044 std::unique_ptr<RefreshRateStats> mRefreshRateStats;
Ana Krulec4593b692019-01-11 22:07:25 -080045};
46
47RefreshRateStatsTest::RefreshRateStatsTest() {
48 const ::testing::TestInfo* const test_info =
49 ::testing::UnitTest::GetInstance()->current_test_info();
50 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
51}
52
53RefreshRateStatsTest::~RefreshRateStatsTest() {
54 const ::testing::TestInfo* const test_info =
55 ::testing::UnitTest::GetInstance()->current_test_info();
56 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
57}
58
Ana Krulec4593b692019-01-11 22:07:25 -080059namespace {
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070060
Dominik Laskowskib0054a22022-03-03 09:03:06 -080061TEST_F(RefreshRateStatsTest, oneMode) {
62 resetStats(90_Hz);
Ana Krulec4593b692019-01-11 22:07:25 -080063
Dominik Laskowski64536512019-03-28 09:53:04 -070064 EXPECT_CALL(mTimeStats, recordRefreshRate(0, _)).Times(AtLeast(1));
65 EXPECT_CALL(mTimeStats, recordRefreshRate(90, _)).Times(AtLeast(1));
Alec Mourifb571ea2019-01-24 18:42:10 -080066
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070067 auto times = mRefreshRateStats->getTotalTimes();
68 ASSERT_TRUE(times.contains("ScreenOff"));
69 EXPECT_EQ(1u, times.size());
Ana Krulec4593b692019-01-11 22:07:25 -080070
71 // Screen is off by default.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070072 std::chrono::milliseconds screenOff = times.get("ScreenOff")->get();
Ana Krulec4593b692019-01-11 22:07:25 -080073 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -070074 times = mRefreshRateStats->getTotalTimes();
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070075
76 EXPECT_LT(screenOff, times.get("ScreenOff")->get());
77 EXPECT_FALSE(times.contains("90.00 Hz"));
Ana Krulec4593b692019-01-11 22:07:25 -080078
Dominik Laskowskib0054a22022-03-03 09:03:06 -080079 mRefreshRateStats->setRefreshRate(90_Hz);
Peiyong Lin65248e02020-04-18 21:15:07 -070080 mRefreshRateStats->setPowerMode(PowerMode::ON);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070081 screenOff = mRefreshRateStats->getTotalTimes().get("ScreenOff")->get();
Ana Krulec4593b692019-01-11 22:07:25 -080082 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -070083 times = mRefreshRateStats->getTotalTimes();
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070084
85 EXPECT_EQ(screenOff, times.get("ScreenOff")->get());
86 ASSERT_TRUE(times.contains("90.00 Hz"));
87 EXPECT_LT(0ms, times.get("90.00 Hz")->get());
Ana Krulec4593b692019-01-11 22:07:25 -080088
Peiyong Lin65248e02020-04-18 21:15:07 -070089 mRefreshRateStats->setPowerMode(PowerMode::DOZE);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070090 const auto ninety = mRefreshRateStats->getTotalTimes().get("90.00 Hz")->get();
Ana Krulec4593b692019-01-11 22:07:25 -080091 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -070092 times = mRefreshRateStats->getTotalTimes();
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070093
94 EXPECT_LT(screenOff, times.get("ScreenOff")->get());
95 EXPECT_EQ(ninety, times.get("90.00 Hz")->get());
Ana Krulec4593b692019-01-11 22:07:25 -080096
Dominik Laskowskib0054a22022-03-03 09:03:06 -080097 mRefreshRateStats->setRefreshRate(90_Hz);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -070098 screenOff = mRefreshRateStats->getTotalTimes().get("ScreenOff")->get();
Ana Krulec4593b692019-01-11 22:07:25 -080099 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700100 times = mRefreshRateStats->getTotalTimes();
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700101
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800102 // Stats are not updated while the screen is off.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700103 EXPECT_LT(screenOff, times.get("ScreenOff")->get());
104 EXPECT_EQ(ninety, times.get("90.00 Hz")->get());
Ana Krulec4593b692019-01-11 22:07:25 -0800105}
106
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800107TEST_F(RefreshRateStatsTest, twoModes) {
108 resetStats(90_Hz);
Ana Krulec4593b692019-01-11 22:07:25 -0800109
Dominik Laskowski64536512019-03-28 09:53:04 -0700110 EXPECT_CALL(mTimeStats, recordRefreshRate(0, _)).Times(AtLeast(1));
111 EXPECT_CALL(mTimeStats, recordRefreshRate(60, _)).Times(AtLeast(1));
112 EXPECT_CALL(mTimeStats, recordRefreshRate(90, _)).Times(AtLeast(1));
Alec Mourifb571ea2019-01-24 18:42:10 -0800113
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700114 auto times = mRefreshRateStats->getTotalTimes();
115 ASSERT_TRUE(times.contains("ScreenOff"));
116 EXPECT_EQ(1u, times.size());
Ana Krulec4593b692019-01-11 22:07:25 -0800117
118 // Screen is off by default.
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700119 std::chrono::milliseconds screenOff = times.get("ScreenOff")->get();
Ana Krulec4593b692019-01-11 22:07:25 -0800120 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700121 times = mRefreshRateStats->getTotalTimes();
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700122
123 EXPECT_LT(screenOff, times.get("ScreenOff")->get());
124 EXPECT_FALSE(times.contains("60.00 Hz"));
125 EXPECT_FALSE(times.contains("90.00 Hz"));
Ana Krulec4593b692019-01-11 22:07:25 -0800126
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800127 mRefreshRateStats->setRefreshRate(90_Hz);
Peiyong Lin65248e02020-04-18 21:15:07 -0700128 mRefreshRateStats->setPowerMode(PowerMode::ON);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700129 screenOff = mRefreshRateStats->getTotalTimes().get("ScreenOff")->get();
Ana Krulec4593b692019-01-11 22:07:25 -0800130 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700131 times = mRefreshRateStats->getTotalTimes();
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700132
133 EXPECT_EQ(screenOff, times.get("ScreenOff")->get());
134 ASSERT_TRUE(times.contains("90.00 Hz"));
135 EXPECT_LT(0ms, times.get("90.00 Hz")->get());
Ana Krulec4593b692019-01-11 22:07:25 -0800136
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800137 mRefreshRateStats->setRefreshRate(60_Hz);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700138 auto ninety = mRefreshRateStats->getTotalTimes().get("90.00 Hz")->get();
Ana Krulec4593b692019-01-11 22:07:25 -0800139 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700140 times = mRefreshRateStats->getTotalTimes();
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700141
142 EXPECT_EQ(screenOff, times.get("ScreenOff")->get());
143 EXPECT_EQ(ninety, times.get("90.00 Hz")->get());
144 ASSERT_TRUE(times.contains("60.00 Hz"));
145 EXPECT_LT(0ms, times.get("60.00 Hz")->get());
Ana Krulec4593b692019-01-11 22:07:25 -0800146
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800147 mRefreshRateStats->setRefreshRate(90_Hz);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700148 auto sixty = mRefreshRateStats->getTotalTimes().get("60.00 Hz")->get();
Ana Krulec4593b692019-01-11 22:07:25 -0800149 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700150 times = mRefreshRateStats->getTotalTimes();
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700151
152 EXPECT_EQ(screenOff, times.get("ScreenOff")->get());
153 EXPECT_LT(ninety, times.get("90.00 Hz")->get());
154 EXPECT_EQ(sixty, times.get("60.00 Hz")->get());
Ana Krulec4593b692019-01-11 22:07:25 -0800155
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800156 mRefreshRateStats->setRefreshRate(60_Hz);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700157 ninety = mRefreshRateStats->getTotalTimes().get("90.00 Hz")->get();
Ana Krulec4593b692019-01-11 22:07:25 -0800158 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700159 times = mRefreshRateStats->getTotalTimes();
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700160
161 EXPECT_EQ(screenOff, times.get("ScreenOff")->get());
162 EXPECT_EQ(ninety, times.get("90.00 Hz")->get());
163 EXPECT_LT(sixty, times.get("60.00 Hz")->get());
Ana Krulec4593b692019-01-11 22:07:25 -0800164
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800165 // Stats are not updated while the screen is off.
Peiyong Lin65248e02020-04-18 21:15:07 -0700166 mRefreshRateStats->setPowerMode(PowerMode::DOZE);
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800167 mRefreshRateStats->setRefreshRate(90_Hz);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700168 sixty = mRefreshRateStats->getTotalTimes().get("60.00 Hz")->get();
Ana Krulec4593b692019-01-11 22:07:25 -0800169 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700170 times = mRefreshRateStats->getTotalTimes();
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700171
172 EXPECT_LT(screenOff, times.get("ScreenOff")->get());
173 EXPECT_EQ(ninety, times.get("90.00 Hz")->get());
174 EXPECT_EQ(sixty, times.get("60.00 Hz")->get());
Ana Krulec4593b692019-01-11 22:07:25 -0800175
Dominik Laskowskib0054a22022-03-03 09:03:06 -0800176 mRefreshRateStats->setRefreshRate(60_Hz);
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700177 screenOff = mRefreshRateStats->getTotalTimes().get("ScreenOff")->get();
Ana Krulec4593b692019-01-11 22:07:25 -0800178 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700179 times = mRefreshRateStats->getTotalTimes();
Marin Shalamanovbed7fd32020-12-21 20:02:20 +0100180
Dominik Laskowski6eab42d2021-09-13 14:34:13 -0700181 EXPECT_LT(screenOff, times.get("ScreenOff")->get());
182 EXPECT_EQ(ninety, times.get("90.00 Hz")->get());
183 EXPECT_EQ(sixty, times.get("60.00 Hz")->get());
184}
185
186} // namespace
187} // namespace android::scheduler