blob: cec0b32a6be075cbc0f58a76275a2f836a8a66b9 [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;
Alec Mourifb571ea2019-01-24 18:42:10 -080028using testing::_;
Alec Mouria2957ea2019-03-16 21:05:23 -070029using testing::AtLeast;
Ana Krulec4593b692019-01-11 22:07:25 -080030
31namespace android {
32namespace scheduler {
33
34class RefreshRateStatsTest : public testing::Test {
35protected:
36 static constexpr int CONFIG_ID_90 = 0;
37 static constexpr int CONFIG_ID_60 = 1;
38 static constexpr int64_t VSYNC_90 = 11111111;
39 static constexpr int64_t VSYNC_60 = 16666667;
40
41 RefreshRateStatsTest();
42 ~RefreshRateStatsTest();
43
Steven Thomas2bbaabe2019-08-28 16:08:35 -070044 void init(const std::vector<RefreshRateConfigs::InputConfig>& configs) {
45 mRefreshRateConfigs = std::make_unique<RefreshRateConfigs>(
46 /*refreshRateSwitching=*/true, configs, /*currentConfig=*/0);
47 mRefreshRateStats =
48 std::make_unique<RefreshRateStats>(*mRefreshRateConfigs, mTimeStats,
49 /*currentConfig=*/0,
50 /*currentPowerMode=*/HWC_POWER_MODE_OFF);
51 }
52
Dominik Laskowski64536512019-03-28 09:53:04 -070053 mock::TimeStats mTimeStats;
Steven Thomas2bbaabe2019-08-28 16:08:35 -070054 std::unique_ptr<RefreshRateConfigs> mRefreshRateConfigs;
55 std::unique_ptr<RefreshRateStats> mRefreshRateStats;
Ana Krulec4593b692019-01-11 22:07:25 -080056};
57
58RefreshRateStatsTest::RefreshRateStatsTest() {
59 const ::testing::TestInfo* const test_info =
60 ::testing::UnitTest::GetInstance()->current_test_info();
61 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
62}
63
64RefreshRateStatsTest::~RefreshRateStatsTest() {
65 const ::testing::TestInfo* const test_info =
66 ::testing::UnitTest::GetInstance()->current_test_info();
67 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
68}
69
Ana Krulec4593b692019-01-11 22:07:25 -080070namespace {
71/* ------------------------------------------------------------------------
72 * Test cases
73 */
Ana Krulec4593b692019-01-11 22:07:25 -080074TEST_F(RefreshRateStatsTest, oneConfigTest) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -070075 init({{CONFIG_ID_90, VSYNC_90}});
Ana Krulec4593b692019-01-11 22:07:25 -080076
Dominik Laskowski64536512019-03-28 09:53:04 -070077 EXPECT_CALL(mTimeStats, recordRefreshRate(0, _)).Times(AtLeast(1));
78 EXPECT_CALL(mTimeStats, recordRefreshRate(90, _)).Times(AtLeast(1));
Alec Mourifb571ea2019-01-24 18:42:10 -080079
Steven Thomas2bbaabe2019-08-28 16:08:35 -070080 std::unordered_map<std::string, int64_t> times = mRefreshRateStats->getTotalTimes();
81 ASSERT_EQ(1, times.size());
Alec Mouria2957ea2019-03-16 21:05:23 -070082 EXPECT_NE(0u, times.count("ScreenOff"));
Ana Krulec4593b692019-01-11 22:07:25 -080083 // Setting up tests on mobile harness can be flaky with time passing, so testing for
84 // exact time changes can result in flaxy numbers. To avoid that remember old
85 // numbers to make sure the correct values are increasing in the next test.
86 int screenOff = times["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -080087
88 // Screen is off by default.
89 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -070090 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -070091 EXPECT_LT(screenOff, times["ScreenOff"]);
Steven Thomas2bbaabe2019-08-28 16:08:35 -070092 EXPECT_EQ(0u, times.count("90fps"));
Ana Krulec4593b692019-01-11 22:07:25 -080093
Steven Thomas2bbaabe2019-08-28 16:08:35 -070094 mRefreshRateStats->setConfigMode(CONFIG_ID_90);
95 mRefreshRateStats->setPowerMode(HWC_POWER_MODE_NORMAL);
96 screenOff = mRefreshRateStats->getTotalTimes()["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -080097 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -070098 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -070099 EXPECT_EQ(screenOff, times["ScreenOff"]);
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700100 ASSERT_EQ(1u, times.count("90fps"));
101 EXPECT_LT(0, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800102
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700103 mRefreshRateStats->setPowerMode(HWC_POWER_MODE_DOZE);
104 int ninety = mRefreshRateStats->getTotalTimes()["90fps"];
Ana Krulec4593b692019-01-11 22:07:25 -0800105 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700106 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700107 EXPECT_LT(screenOff, times["ScreenOff"]);
108 EXPECT_EQ(ninety, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800109
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700110 mRefreshRateStats->setConfigMode(CONFIG_ID_90);
111 screenOff = mRefreshRateStats->getTotalTimes()["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -0800112 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700113 times = mRefreshRateStats->getTotalTimes();
Ana Krulec4593b692019-01-11 22:07:25 -0800114 // Because the power mode is not HWC_POWER_MODE_NORMAL, switching the config
115 // does not update refresh rates that come from the config.
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}
119
120TEST_F(RefreshRateStatsTest, twoConfigsTest) {
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700121 init({{CONFIG_ID_90, VSYNC_90}, {CONFIG_ID_60, VSYNC_60}});
Ana Krulec4593b692019-01-11 22:07:25 -0800122
Dominik Laskowski64536512019-03-28 09:53:04 -0700123 EXPECT_CALL(mTimeStats, recordRefreshRate(0, _)).Times(AtLeast(1));
124 EXPECT_CALL(mTimeStats, recordRefreshRate(60, _)).Times(AtLeast(1));
125 EXPECT_CALL(mTimeStats, recordRefreshRate(90, _)).Times(AtLeast(1));
Alec Mourifb571ea2019-01-24 18:42:10 -0800126
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700127 std::unordered_map<std::string, int64_t> times = mRefreshRateStats->getTotalTimes();
128 ASSERT_EQ(1, times.size());
Alec Mouria2957ea2019-03-16 21:05:23 -0700129 EXPECT_NE(0u, times.count("ScreenOff"));
Ana Krulec4593b692019-01-11 22:07:25 -0800130 // Setting up tests on mobile harness can be flaky with time passing, so testing for
131 // exact time changes can result in flaxy numbers. To avoid that remember old
132 // numbers to make sure the correct values are increasing in the next test.
133 int screenOff = times["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -0800134
135 // Screen is off by default.
136 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700137 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700138 EXPECT_LT(screenOff, times["ScreenOff"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800139
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700140 mRefreshRateStats->setConfigMode(CONFIG_ID_90);
141 mRefreshRateStats->setPowerMode(HWC_POWER_MODE_NORMAL);
142 screenOff = mRefreshRateStats->getTotalTimes()["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -0800143 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700144 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700145 EXPECT_EQ(screenOff, times["ScreenOff"]);
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700146 ASSERT_EQ(1u, times.count("90fps"));
147 EXPECT_LT(0, times["90fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800148
149 // When power mode is normal, time for configs updates.
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700150 mRefreshRateStats->setConfigMode(CONFIG_ID_60);
151 int ninety = mRefreshRateStats->getTotalTimes()["90fps"];
Ana Krulec4593b692019-01-11 22:07:25 -0800152 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700153 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700154 EXPECT_EQ(screenOff, times["ScreenOff"]);
155 EXPECT_EQ(ninety, times["90fps"]);
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700156 ASSERT_EQ(1u, times.count("60fps"));
157 EXPECT_LT(0, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800158
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700159 mRefreshRateStats->setConfigMode(CONFIG_ID_90);
160 int sixty = mRefreshRateStats->getTotalTimes()["60fps"];
Ana Krulec4593b692019-01-11 22:07:25 -0800161 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700162 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700163 EXPECT_EQ(screenOff, times["ScreenOff"]);
164 EXPECT_LT(ninety, times["90fps"]);
165 EXPECT_EQ(sixty, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800166
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700167 mRefreshRateStats->setConfigMode(CONFIG_ID_60);
168 ninety = mRefreshRateStats->getTotalTimes()["90fps"];
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();
Alec Mouria2957ea2019-03-16 21:05:23 -0700171 EXPECT_EQ(screenOff, times["ScreenOff"]);
172 EXPECT_EQ(ninety, times["90fps"]);
173 EXPECT_LT(sixty, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800174
175 // Because the power mode is not HWC_POWER_MODE_NORMAL, switching the config
176 // does not update refresh rates that come from the config.
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700177 mRefreshRateStats->setPowerMode(HWC_POWER_MODE_DOZE);
178 mRefreshRateStats->setConfigMode(CONFIG_ID_90);
179 sixty = mRefreshRateStats->getTotalTimes()["60fps"];
Ana Krulec4593b692019-01-11 22:07:25 -0800180 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700181 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700182 EXPECT_LT(screenOff, times["ScreenOff"]);
183 EXPECT_EQ(ninety, times["90fps"]);
184 EXPECT_EQ(sixty, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800185
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700186 mRefreshRateStats->setConfigMode(CONFIG_ID_60);
187 screenOff = mRefreshRateStats->getTotalTimes()["ScreenOff"];
Ana Krulec4593b692019-01-11 22:07:25 -0800188 std::this_thread::sleep_for(std::chrono::milliseconds(2));
Steven Thomas2bbaabe2019-08-28 16:08:35 -0700189 times = mRefreshRateStats->getTotalTimes();
Alec Mouria2957ea2019-03-16 21:05:23 -0700190 EXPECT_LT(screenOff, times["ScreenOff"]);
191 EXPECT_EQ(ninety, times["90fps"]);
192 EXPECT_EQ(sixty, times["60fps"]);
Ana Krulec4593b692019-01-11 22:07:25 -0800193}
194} // namespace
195} // namespace scheduler
196} // namespace android