blob: 8e07c796567bcb7112c957d1a0f830969c10fdb2 [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
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -080017// TODO(b/129481165): remove the #pragma below and fix conversion issues
18#pragma clang diagnostic push
19#pragma clang diagnostic ignored "-Wconversion"
20
Ana Krulec4593b692019-01-11 22:07:25 -080021#undef LOG_TAG
22#define LOG_TAG "SchedulerUnittests"
23
24#include <gmock/gmock.h>
25#include <log/log.h>
26#include <thread>
27
28#include "Scheduler/RefreshRateStats.h"
Alec Mourifb571ea2019-01-24 18:42:10 -080029#include "mock/MockTimeStats.h"
Ana Krulec4593b692019-01-11 22:07:25 -080030
31using namespace std::chrono_literals;
Alec Mourifb571ea2019-01-24 18:42:10 -080032using testing::_;
Alec Mouria2957ea2019-03-16 21:05:23 -070033using testing::AtLeast;
Ana Krulec4593b692019-01-11 22:07:25 -080034
35namespace android {
36namespace scheduler {
37
38class RefreshRateStatsTest : public testing::Test {
39protected:
Ady Abraham2139f732019-11-13 18:56:40 -080040 static inline const auto CONFIG_ID_0 = HwcConfigIndexType(0);
41 static inline const auto CONFIG_ID_1 = HwcConfigIndexType(1);
42 static inline const auto CONFIG_GROUP_0 = HwcConfigGroupType(0);
Ana Krulec4593b692019-01-11 22:07:25 -080043 static constexpr int64_t VSYNC_90 = 11111111;
44 static constexpr int64_t VSYNC_60 = 16666667;
45
46 RefreshRateStatsTest();
47 ~RefreshRateStatsTest();
48
Steven Thomas2bbaabe2019-08-28 16:08:35 -070049 void init(const std::vector<RefreshRateConfigs::InputConfig>& configs) {
50 mRefreshRateConfigs = std::make_unique<RefreshRateConfigs>(
Ady Abraham2139f732019-11-13 18:56:40 -080051 /*refreshRateSwitching=*/true, configs, /*currentConfig=*/CONFIG_ID_0);
Steven Thomas2bbaabe2019-08-28 16:08:35 -070052 mRefreshRateStats =
53 std::make_unique<RefreshRateStats>(*mRefreshRateConfigs, mTimeStats,
Ady Abraham2139f732019-11-13 18:56:40 -080054 /*currentConfigId=*/CONFIG_ID_0,
Steven Thomas2bbaabe2019-08-28 16:08:35 -070055 /*currentPowerMode=*/HWC_POWER_MODE_OFF);
56 }
57
Dominik Laskowski64536512019-03-28 09:53:04 -070058 mock::TimeStats mTimeStats;
Steven Thomas2bbaabe2019-08-28 16:08:35 -070059 std::unique_ptr<RefreshRateConfigs> mRefreshRateConfigs;
60 std::unique_ptr<RefreshRateStats> mRefreshRateStats;
Ana Krulec4593b692019-01-11 22:07:25 -080061};
62
63RefreshRateStatsTest::RefreshRateStatsTest() {
64 const ::testing::TestInfo* const test_info =
65 ::testing::UnitTest::GetInstance()->current_test_info();
66 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
67}
68
69RefreshRateStatsTest::~RefreshRateStatsTest() {
70 const ::testing::TestInfo* const test_info =
71 ::testing::UnitTest::GetInstance()->current_test_info();
72 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
73}
74
Ana Krulec4593b692019-01-11 22:07:25 -080075namespace {
76/* ------------------------------------------------------------------------
77 * Test cases
78 */
Ana Krulec4593b692019-01-11 22:07:25 -080079TEST_F(RefreshRateStatsTest, oneConfigTest) {
Ady Abraham2139f732019-11-13 18:56:40 -080080 init({{{CONFIG_ID_0, CONFIG_GROUP_0, VSYNC_90}}});
Ana Krulec4593b692019-01-11 22:07:25 -080081
Dominik Laskowski64536512019-03-28 09:53:04 -070082 EXPECT_CALL(mTimeStats, recordRefreshRate(0, _)).Times(AtLeast(1));
83 EXPECT_CALL(mTimeStats, recordRefreshRate(90, _)).Times(AtLeast(1));
Alec Mourifb571ea2019-01-24 18:42:10 -080084
Steven Thomas2bbaabe2019-08-28 16:08:35 -070085 std::unordered_map<std::string, int64_t> times = mRefreshRateStats->getTotalTimes();
86 ASSERT_EQ(1, times.size());
Alec Mouria2957ea2019-03-16 21:05:23 -070087 EXPECT_NE(0u, times.count("ScreenOff"));
Ana Krulec4593b692019-01-11 22:07:25 -080088 // Setting up tests on mobile harness can be flaky with time passing, so testing for
89 // exact time changes can result in flaxy numbers. To avoid that remember old
90 // numbers to make sure the correct values are increasing in the next test.
91 int screenOff = times["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -080092
93 // Screen is off by default.
94 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -070095 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -070096 EXPECT_LT(screenOff, times["ScreenOff"]);
Steven Thomas2bbaabe2019-08-28 16:08:35 -070097 EXPECT_EQ(0u, times.count("90fps"));
Ana Krulec4593b692019-01-11 22:07:25 -080098
Ady Abraham2139f732019-11-13 18:56:40 -080099 mRefreshRateStats->setConfigMode(CONFIG_ID_0);
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700100 mRefreshRateStats->setPowerMode(HWC_POWER_MODE_NORMAL);
101 screenOff = mRefreshRateStats->getTotalTimes()["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -0800102 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700103 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700104 EXPECT_EQ(screenOff, times["ScreenOff"]);
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700105 ASSERT_EQ(1u, times.count("90fps"));
106 EXPECT_LT(0, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800107
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700108 mRefreshRateStats->setPowerMode(HWC_POWER_MODE_DOZE);
109 int ninety = mRefreshRateStats->getTotalTimes()["90fps"];
Ana Krulec4593b692019-01-11 22:07:25 -0800110 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700111 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700112 EXPECT_LT(screenOff, times["ScreenOff"]);
113 EXPECT_EQ(ninety, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800114
Ady Abraham2139f732019-11-13 18:56:40 -0800115 mRefreshRateStats->setConfigMode(CONFIG_ID_0);
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700116 screenOff = mRefreshRateStats->getTotalTimes()["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -0800117 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700118 times = mRefreshRateStats->getTotalTimes();
Ana Krulec4593b692019-01-11 22:07:25 -0800119 // Because the power mode is not HWC_POWER_MODE_NORMAL, switching the config
120 // does not update refresh rates that come from the config.
Alec Mouria2957ea2019-03-16 21:05:23 -0700121 EXPECT_LT(screenOff, times["ScreenOff"]);
122 EXPECT_EQ(ninety, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800123}
124
125TEST_F(RefreshRateStatsTest, twoConfigsTest) {
Ady Abraham2139f732019-11-13 18:56:40 -0800126 init({{{CONFIG_ID_0, CONFIG_GROUP_0, VSYNC_90}, {CONFIG_ID_1, CONFIG_GROUP_0, VSYNC_60}}});
Ana Krulec4593b692019-01-11 22:07:25 -0800127
Dominik Laskowski64536512019-03-28 09:53:04 -0700128 EXPECT_CALL(mTimeStats, recordRefreshRate(0, _)).Times(AtLeast(1));
129 EXPECT_CALL(mTimeStats, recordRefreshRate(60, _)).Times(AtLeast(1));
130 EXPECT_CALL(mTimeStats, recordRefreshRate(90, _)).Times(AtLeast(1));
Alec Mourifb571ea2019-01-24 18:42:10 -0800131
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700132 std::unordered_map<std::string, int64_t> times = mRefreshRateStats->getTotalTimes();
133 ASSERT_EQ(1, times.size());
Alec Mouria2957ea2019-03-16 21:05:23 -0700134 EXPECT_NE(0u, times.count("ScreenOff"));
Ana Krulec4593b692019-01-11 22:07:25 -0800135 // Setting up tests on mobile harness can be flaky with time passing, so testing for
136 // exact time changes can result in flaxy numbers. To avoid that remember old
137 // numbers to make sure the correct values are increasing in the next test.
138 int screenOff = times["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -0800139
140 // Screen is off by default.
141 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700142 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700143 EXPECT_LT(screenOff, times["ScreenOff"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800144
Ady Abraham2139f732019-11-13 18:56:40 -0800145 mRefreshRateStats->setConfigMode(CONFIG_ID_0);
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700146 mRefreshRateStats->setPowerMode(HWC_POWER_MODE_NORMAL);
147 screenOff = mRefreshRateStats->getTotalTimes()["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -0800148 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700149 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700150 EXPECT_EQ(screenOff, times["ScreenOff"]);
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700151 ASSERT_EQ(1u, times.count("90fps"));
152 EXPECT_LT(0, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800153
154 // When power mode is normal, time for configs updates.
Ady Abraham2139f732019-11-13 18:56:40 -0800155 mRefreshRateStats->setConfigMode(CONFIG_ID_1);
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700156 int ninety = mRefreshRateStats->getTotalTimes()["90fps"];
Ana Krulec4593b692019-01-11 22:07:25 -0800157 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700158 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700159 EXPECT_EQ(screenOff, times["ScreenOff"]);
160 EXPECT_EQ(ninety, times["90fps"]);
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700161 ASSERT_EQ(1u, times.count("60fps"));
162 EXPECT_LT(0, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800163
Ady Abraham2139f732019-11-13 18:56:40 -0800164 mRefreshRateStats->setConfigMode(CONFIG_ID_0);
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700165 int sixty = mRefreshRateStats->getTotalTimes()["60fps"];
Ana Krulec4593b692019-01-11 22:07:25 -0800166 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700167 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700168 EXPECT_EQ(screenOff, times["ScreenOff"]);
169 EXPECT_LT(ninety, times["90fps"]);
170 EXPECT_EQ(sixty, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800171
Ady Abraham2139f732019-11-13 18:56:40 -0800172 mRefreshRateStats->setConfigMode(CONFIG_ID_1);
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700173 ninety = mRefreshRateStats->getTotalTimes()["90fps"];
Ana Krulec4593b692019-01-11 22:07:25 -0800174 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700175 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700176 EXPECT_EQ(screenOff, times["ScreenOff"]);
177 EXPECT_EQ(ninety, times["90fps"]);
178 EXPECT_LT(sixty, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800179
180 // Because the power mode is not HWC_POWER_MODE_NORMAL, switching the config
181 // does not update refresh rates that come from the config.
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700182 mRefreshRateStats->setPowerMode(HWC_POWER_MODE_DOZE);
Ady Abraham2139f732019-11-13 18:56:40 -0800183 mRefreshRateStats->setConfigMode(CONFIG_ID_0);
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700184 sixty = mRefreshRateStats->getTotalTimes()["60fps"];
Ana Krulec4593b692019-01-11 22:07:25 -0800185 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700186 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700187 EXPECT_LT(screenOff, times["ScreenOff"]);
188 EXPECT_EQ(ninety, times["90fps"]);
189 EXPECT_EQ(sixty, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800190
Ady Abraham2139f732019-11-13 18:56:40 -0800191 mRefreshRateStats->setConfigMode(CONFIG_ID_1);
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700192 screenOff = mRefreshRateStats->getTotalTimes()["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -0800193 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700194 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700195 EXPECT_LT(screenOff, times["ScreenOff"]);
196 EXPECT_EQ(ninety, times["90fps"]);
197 EXPECT_EQ(sixty, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800198}
199} // namespace
200} // namespace scheduler
201} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -0800202
203// TODO(b/129481165): remove the #pragma below and fix conversion issues
204#pragma clang diagnostic pop // ignored "-Wconversion"