blob: 411ec61770558029764cc90cc56d85bffb0e03bd [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"
25#include "mock/DisplayHardware/MockDisplay.h"
Alec Mourifb571ea2019-01-24 18:42:10 -080026#include "mock/MockTimeStats.h"
Ana Krulec4593b692019-01-11 22:07:25 -080027
28using namespace std::chrono_literals;
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
32namespace android {
33namespace scheduler {
34
35class RefreshRateStatsTest : public testing::Test {
36protected:
37 static constexpr int CONFIG_ID_90 = 0;
38 static constexpr int CONFIG_ID_60 = 1;
39 static constexpr int64_t VSYNC_90 = 11111111;
40 static constexpr int64_t VSYNC_60 = 16666667;
41
42 RefreshRateStatsTest();
43 ~RefreshRateStatsTest();
44
Dominik Laskowski22488f62019-03-28 09:53:04 -070045 mock::TimeStats mTimeStats;
46 RefreshRateConfigs mRefreshRateConfigs;
47 RefreshRateStats mRefreshRateStats{mRefreshRateConfigs, mTimeStats};
Ana Krulec4593b692019-01-11 22:07:25 -080048};
49
50RefreshRateStatsTest::RefreshRateStatsTest() {
51 const ::testing::TestInfo* const test_info =
52 ::testing::UnitTest::GetInstance()->current_test_info();
53 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
54}
55
56RefreshRateStatsTest::~RefreshRateStatsTest() {
57 const ::testing::TestInfo* const test_info =
58 ::testing::UnitTest::GetInstance()->current_test_info();
59 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
60}
61
Ana Krulec4593b692019-01-11 22:07:25 -080062namespace {
63/* ------------------------------------------------------------------------
64 * Test cases
65 */
66TEST_F(RefreshRateStatsTest, canCreateAndDestroyTest) {
67 std::vector<std::shared_ptr<const HWC2::Display::Config>> configs;
Dominik Laskowski22488f62019-03-28 09:53:04 -070068 mRefreshRateConfigs.populate(configs);
Ana Krulec4593b692019-01-11 22:07:25 -080069
70 // There is one default config, so the refresh rates should have one item.
Dominik Laskowski22488f62019-03-28 09:53:04 -070071 EXPECT_EQ(1, mRefreshRateStats.getTotalTimes().size());
Ana Krulec4593b692019-01-11 22:07:25 -080072}
73
74TEST_F(RefreshRateStatsTest, oneConfigTest) {
75 auto display = new Hwc2::mock::Display();
76
77 auto config = HWC2::Display::Config::Builder(*display, CONFIG_ID_90);
78 config.setVsyncPeriod(VSYNC_90);
79 std::vector<std::shared_ptr<const HWC2::Display::Config>> configs;
80 configs.push_back(config.build());
81
Dominik Laskowski22488f62019-03-28 09:53:04 -070082 mRefreshRateConfigs.populate(configs);
Ana Krulec4593b692019-01-11 22:07:25 -080083
Dominik Laskowski22488f62019-03-28 09:53:04 -070084 EXPECT_CALL(mTimeStats, recordRefreshRate(0, _)).Times(AtLeast(1));
85 EXPECT_CALL(mTimeStats, recordRefreshRate(90, _)).Times(AtLeast(1));
Alec Mourifb571ea2019-01-24 18:42:10 -080086
Dominik Laskowski22488f62019-03-28 09:53:04 -070087 std::unordered_map<std::string, int64_t> times = mRefreshRateStats.getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -070088 EXPECT_EQ(2, times.size());
89 EXPECT_NE(0u, times.count("ScreenOff"));
90 EXPECT_EQ(1u, times.count("90fps"));
91 EXPECT_EQ(0, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -080092 // Setting up tests on mobile harness can be flaky with time passing, so testing for
93 // exact time changes can result in flaxy numbers. To avoid that remember old
94 // numbers to make sure the correct values are increasing in the next test.
95 int screenOff = times["ScreenOff"];
96 int ninety = times["90fps"];
97
98 // Screen is off by default.
99 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Dominik Laskowski22488f62019-03-28 09:53:04 -0700100 times = mRefreshRateStats.getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700101 EXPECT_LT(screenOff, times["ScreenOff"]);
102 EXPECT_EQ(0, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800103
Dominik Laskowski22488f62019-03-28 09:53:04 -0700104 mRefreshRateStats.setConfigMode(CONFIG_ID_90);
105 mRefreshRateStats.setPowerMode(HWC_POWER_MODE_NORMAL);
106 screenOff = mRefreshRateStats.getTotalTimes()["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -0800107 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Dominik Laskowski22488f62019-03-28 09:53:04 -0700108 times = mRefreshRateStats.getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700109 EXPECT_EQ(screenOff, times["ScreenOff"]);
110 EXPECT_LT(ninety, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800111
Dominik Laskowski22488f62019-03-28 09:53:04 -0700112 mRefreshRateStats.setPowerMode(HWC_POWER_MODE_DOZE);
113 ninety = mRefreshRateStats.getTotalTimes()["90fps"];
Ana Krulec4593b692019-01-11 22:07:25 -0800114 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Dominik Laskowski22488f62019-03-28 09:53:04 -0700115 times = mRefreshRateStats.getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700116 EXPECT_LT(screenOff, times["ScreenOff"]);
117 EXPECT_EQ(ninety, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800118
Dominik Laskowski22488f62019-03-28 09:53:04 -0700119 mRefreshRateStats.setConfigMode(CONFIG_ID_90);
120 screenOff = mRefreshRateStats.getTotalTimes()["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -0800121 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Dominik Laskowski22488f62019-03-28 09:53:04 -0700122 times = mRefreshRateStats.getTotalTimes();
Ana Krulec4593b692019-01-11 22:07:25 -0800123 // Because the power mode is not HWC_POWER_MODE_NORMAL, switching the config
124 // does not update refresh rates that come from the config.
Alec Mouria2957ea2019-03-16 21:05:23 -0700125 EXPECT_LT(screenOff, times["ScreenOff"]);
126 EXPECT_EQ(ninety, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800127}
128
129TEST_F(RefreshRateStatsTest, twoConfigsTest) {
130 auto display = new Hwc2::mock::Display();
131
132 auto config90 = HWC2::Display::Config::Builder(*display, CONFIG_ID_90);
133 config90.setVsyncPeriod(VSYNC_90);
134 std::vector<std::shared_ptr<const HWC2::Display::Config>> configs;
135 configs.push_back(config90.build());
136
137 auto config60 = HWC2::Display::Config::Builder(*display, CONFIG_ID_60);
138 config60.setVsyncPeriod(VSYNC_60);
139 configs.push_back(config60.build());
140
Dominik Laskowski22488f62019-03-28 09:53:04 -0700141 mRefreshRateConfigs.populate(configs);
Ana Krulec4593b692019-01-11 22:07:25 -0800142
Dominik Laskowski22488f62019-03-28 09:53:04 -0700143 EXPECT_CALL(mTimeStats, recordRefreshRate(0, _)).Times(AtLeast(1));
144 EXPECT_CALL(mTimeStats, recordRefreshRate(60, _)).Times(AtLeast(1));
145 EXPECT_CALL(mTimeStats, recordRefreshRate(90, _)).Times(AtLeast(1));
Alec Mourifb571ea2019-01-24 18:42:10 -0800146
Dominik Laskowski22488f62019-03-28 09:53:04 -0700147 std::unordered_map<std::string, int64_t> times = mRefreshRateStats.getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700148 EXPECT_EQ(3, times.size());
149 EXPECT_NE(0u, times.count("ScreenOff"));
150 EXPECT_EQ(1u, times.count("60fps"));
151 EXPECT_EQ(0, times["60fps"]);
152 EXPECT_EQ(1u, times.count("90fps"));
153 EXPECT_EQ(0, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800154 // Setting up tests on mobile harness can be flaky with time passing, so testing for
155 // exact time changes can result in flaxy numbers. To avoid that remember old
156 // numbers to make sure the correct values are increasing in the next test.
157 int screenOff = times["ScreenOff"];
158 int sixty = times["60fps"];
159 int ninety = times["90fps"];
160
161 // Screen is off by default.
162 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Dominik Laskowski22488f62019-03-28 09:53:04 -0700163 times = mRefreshRateStats.getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700164 EXPECT_LT(screenOff, times["ScreenOff"]);
165 EXPECT_EQ(sixty, times["60fps"]);
166 EXPECT_EQ(ninety, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800167
Dominik Laskowski22488f62019-03-28 09:53:04 -0700168 mRefreshRateStats.setConfigMode(CONFIG_ID_90);
169 mRefreshRateStats.setPowerMode(HWC_POWER_MODE_NORMAL);
170 screenOff = mRefreshRateStats.getTotalTimes()["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -0800171 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Dominik Laskowski22488f62019-03-28 09:53:04 -0700172 times = mRefreshRateStats.getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700173 EXPECT_EQ(screenOff, times["ScreenOff"]);
174 EXPECT_EQ(sixty, times["60fps"]);
175 EXPECT_LT(ninety, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800176
177 // When power mode is normal, time for configs updates.
Dominik Laskowski22488f62019-03-28 09:53:04 -0700178 mRefreshRateStats.setConfigMode(CONFIG_ID_60);
179 ninety = mRefreshRateStats.getTotalTimes()["90fps"];
Ana Krulec4593b692019-01-11 22:07:25 -0800180 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Dominik Laskowski22488f62019-03-28 09:53:04 -0700181 times = mRefreshRateStats.getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700182 EXPECT_EQ(screenOff, times["ScreenOff"]);
183 EXPECT_EQ(ninety, times["90fps"]);
184 EXPECT_LT(sixty, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800185
Dominik Laskowski22488f62019-03-28 09:53:04 -0700186 mRefreshRateStats.setConfigMode(CONFIG_ID_90);
187 sixty = mRefreshRateStats.getTotalTimes()["60fps"];
Ana Krulec4593b692019-01-11 22:07:25 -0800188 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Dominik Laskowski22488f62019-03-28 09:53:04 -0700189 times = mRefreshRateStats.getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700190 EXPECT_EQ(screenOff, times["ScreenOff"]);
191 EXPECT_LT(ninety, times["90fps"]);
192 EXPECT_EQ(sixty, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800193
Dominik Laskowski22488f62019-03-28 09:53:04 -0700194 mRefreshRateStats.setConfigMode(CONFIG_ID_60);
195 ninety = mRefreshRateStats.getTotalTimes()["90fps"];
Ana Krulec4593b692019-01-11 22:07:25 -0800196 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Dominik Laskowski22488f62019-03-28 09:53:04 -0700197 times = mRefreshRateStats.getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700198 EXPECT_EQ(screenOff, times["ScreenOff"]);
199 EXPECT_EQ(ninety, times["90fps"]);
200 EXPECT_LT(sixty, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800201
202 // Because the power mode is not HWC_POWER_MODE_NORMAL, switching the config
203 // does not update refresh rates that come from the config.
Dominik Laskowski22488f62019-03-28 09:53:04 -0700204 mRefreshRateStats.setPowerMode(HWC_POWER_MODE_DOZE);
205 mRefreshRateStats.setConfigMode(CONFIG_ID_90);
206 sixty = mRefreshRateStats.getTotalTimes()["60fps"];
Ana Krulec4593b692019-01-11 22:07:25 -0800207 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Dominik Laskowski22488f62019-03-28 09:53:04 -0700208 times = mRefreshRateStats.getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700209 EXPECT_LT(screenOff, times["ScreenOff"]);
210 EXPECT_EQ(ninety, times["90fps"]);
211 EXPECT_EQ(sixty, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800212
Dominik Laskowski22488f62019-03-28 09:53:04 -0700213 mRefreshRateStats.setConfigMode(CONFIG_ID_60);
214 screenOff = mRefreshRateStats.getTotalTimes()["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -0800215 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Dominik Laskowski22488f62019-03-28 09:53:04 -0700216 times = mRefreshRateStats.getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700217 EXPECT_LT(screenOff, times["ScreenOff"]);
218 EXPECT_EQ(ninety, times["90fps"]);
219 EXPECT_EQ(sixty, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800220}
221} // namespace
222} // namespace scheduler
223} // namespace android