1 /*
2 * Copyright (c) 2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <gtest/gtest.h>
17 #include <test_header.h>
18 #include <climits>
19
20 #include "hgm_core.h"
21 #include "hgm_frame_rate_manager.h"
22 #include "hgm_config_callback_manager.h"
23 #include "hgm_idle_detector.h"
24 #include "pipeline/rs_surface_render_node.h"
25 #include "common/rs_common_def.h"
26
27 using namespace testing;
28 using namespace testing::ext;
29
30 namespace OHOS {
31 namespace Rosen {
32 namespace {
33 const std::string otherSurface = "Other_SF";
34 const std::string settingStrategyName = "99";
35 const int32_t HGM_REFRESHRATE_MODE_HIGH = 2;
36 constexpr uint64_t currTime = 200000000;
37 constexpr uint64_t lastTime = 100000000;
38 constexpr pid_t appPid = 0;
39 constexpr pid_t pid = 1;
40 constexpr uint32_t touchCount = 1;
41 constexpr uint32_t delay_60Ms = 60;
42 constexpr uint32_t delay_110Ms = 110;
43 constexpr int32_t OLED_72_HZ = 72;
44 constexpr int32_t OLED_50_HZ = 50;
45 constexpr int32_t OLED_80_HZ = 80;
46 ScreenSize screenSize = {720, 1080, 685, 1218}; // width, height, phyWidth, phyHeight
47 constexpr int32_t internalScreenId = 5;
48 constexpr int32_t externalScreenId = 0;
49 constexpr int32_t frameRateLinkerId1 = 1;
50 constexpr int32_t frameRateLinkerId2 = 2;
51 constexpr int32_t errorVelocity = -1;
52 constexpr int32_t strategy3 = 3;
53 const std::string testScene = "TestScene";
54 const GraphicIRect rectF {
55 .x = 0,
56 .y = 0,
57 .w = 2232,
58 .h = 1008,
59 };
60 const GraphicIRect rectM {
61 .x = 0,
62 .y = 1136,
63 .w = 2232,
64 .h = 2048,
65 };
66 const GraphicIRect rectG {
67 .x = 0,
68 .y = 0,
69 .w = 2232,
70 .h = 3184,
71 };
72 const GraphicIRect rectNeg {
73 .x = -1,
74 .y = -1,
75 .w = -1,
76 .h = -1,
77 };
78 const GraphicIRect rectMax {
79 .x = INT_MAX,
80 .y = INT_MAX,
81 .w = INT_MAX,
82 .h = INT_MAX,
83 };
84 }
85 class HgmFrameRateMgrTest : public testing::Test {
86 public:
87 static void SetUpTestCase();
88 static void TearDownTestCase();
89 void SetUp();
90 void TearDown();
91 void InitHgmFrameRateManager(HgmFrameRateManager &frameRateMgr);
92 };
93
SetUpTestCase()94 void HgmFrameRateMgrTest::SetUpTestCase() {}
TearDownTestCase()95 void HgmFrameRateMgrTest::TearDownTestCase() {}
SetUp()96 void HgmFrameRateMgrTest::SetUp() {}
TearDown()97 void HgmFrameRateMgrTest::TearDown() {}
98
99 class CustomHgmCallback : public IRemoteStub<RSIHgmConfigChangeCallback> {
100 public:
CustomHgmCallback()101 explicit CustomHgmCallback() {}
~CustomHgmCallback()102 ~CustomHgmCallback() override {};
103
OnHgmConfigChanged(std::shared_ptr<RSHgmConfigData> configData)104 void OnHgmConfigChanged(std::shared_ptr<RSHgmConfigData> configData) override {}
OnHgmRefreshRateModeChanged(int32_t refreshRateModeName)105 void OnHgmRefreshRateModeChanged(int32_t refreshRateModeName) override {}
OnHgmRefreshRateUpdate(int32_t refreshRateUpdate)106 void OnHgmRefreshRateUpdate(int32_t refreshRateUpdate) override {}
107 };
108
109 /**
110 * @tc.name: MergeRangeByPriority
111 * @tc.desc: Verify the result of MergeRangeByPriority function
112 * @tc.type: FUNC
113 * @tc.require:
114 */
115 HWTEST_F(HgmFrameRateMgrTest, MergeRangeByPriority, Function | SmallTest | Level1)
116 {
117 VoteRange voteRange0 = { OLED_40_HZ, OLED_120_HZ };
118 VoteRange voteRange1 = { OLED_30_HZ, OLED_40_HZ };
119 VoteRange voteRange2 = { OLED_60_HZ, OLED_90_HZ };
120 VoteRange voteRange3 = { OLED_120_HZ, OLED_144_HZ };
121 VoteRange voteRange4 = { OLED_30_HZ, OLED_144_HZ };
122 VoteRange voteRangeRes;
123
124 voteRangeRes = voteRange0;
125 HgmFrameRateManager::MergeRangeByPriority(voteRangeRes, voteRange1);
126 ASSERT_EQ(voteRangeRes.first, OledRefreshRate::OLED_40_HZ);
127 ASSERT_EQ(voteRangeRes.second, OledRefreshRate::OLED_40_HZ);
128
129 voteRangeRes = voteRange0;
130 HgmFrameRateManager::MergeRangeByPriority(voteRangeRes, voteRange2);
131 ASSERT_EQ(voteRangeRes.first, OledRefreshRate::OLED_60_HZ);
132 ASSERT_EQ(voteRangeRes.second, OledRefreshRate::OLED_90_HZ);
133
134 voteRangeRes = voteRange0;
135 HgmFrameRateManager::MergeRangeByPriority(voteRangeRes, voteRange3);
136 ASSERT_EQ(voteRangeRes.first, OledRefreshRate::OLED_120_HZ);
137 ASSERT_EQ(voteRangeRes.second, OledRefreshRate::OLED_120_HZ);
138
139 voteRangeRes = voteRange0;
140 HgmFrameRateManager::MergeRangeByPriority(voteRangeRes, voteRange4);
141 ASSERT_EQ(voteRangeRes.first, OledRefreshRate::OLED_40_HZ);
142 ASSERT_EQ(voteRangeRes.second, OledRefreshRate::OLED_120_HZ);
143 }
144
InitHgmFrameRateManager(HgmFrameRateManager & frameRateMgr)145 void HgmFrameRateMgrTest::InitHgmFrameRateManager(HgmFrameRateManager &frameRateMgr)
146 {
147 int64_t offset = 0;
148 auto vsyncGenerator = CreateVSyncGenerator();
149 sptr<Rosen::VSyncController> rsController = new VSyncController(vsyncGenerator, offset);
150 sptr<Rosen::VSyncController> appController = new VSyncController(vsyncGenerator, offset);
151 frameRateMgr.Init(nullptr, nullptr, nullptr);
152 frameRateMgr.Init(rsController, appController, vsyncGenerator);
153
154 auto strategyConfigs = frameRateMgr.multiAppStrategy_.GetStrategyConfigs();
155 auto screenSetting = frameRateMgr.multiAppStrategy_.GetScreenSetting();
156 frameRateMgr.HandleAppStrategyConfigEvent(DEFAULT_PID, "", {});
157 strategyConfigs[settingStrategyName] = { .min = OLED_NULL_HZ, .max = OLED_120_HZ, .down = OLED_144_HZ,
158 .dynamicMode = DynamicModeType::TOUCH_ENABLED, .pointerMode = PointerModeType::POINTER_ENABLED,
159 .isFactor = true };
160 screenSetting.strategy = settingStrategyName;
161 frameRateMgr.multiAppStrategy_.SetStrategyConfigs(strategyConfigs);
162 frameRateMgr.multiAppStrategy_.SetScreenSetting(screenSetting);
163 frameRateMgr.ReportHiSysEvent({ .extInfo = "ON" });
164 }
165
166 /**
167 * @tc.name: HandleGameNodeTest
168 * @tc.desc: Verify the result of HandleGameNodeTest function
169 * @tc.type: FUNC
170 * @tc.require:
171 */
172 HWTEST_F(HgmFrameRateMgrTest, HandleGameNodeTest, Function | SmallTest | Level1)
173 {
174 HgmFrameRateManager frameRateMgr;
175 frameRateMgr.curGameNodeName_ = "gameNode";
176 RSRenderNodeMap nodeMap;
177 RSSurfaceRenderNodeConfig config;
178
179 PART("HandleGameNodeTest") {
180 STEP("1. Test empty surfaceMap") {
181 frameRateMgr.HandleGameNode(nodeMap);
182 ASSERT_EQ(frameRateMgr.isGameNodeOnTree_.load(), false);
183 }
184 STEP("2. Test with a normal surfaceNode on tree") {
185 config.id = 1;
186 config.name = "normalNode";
187 auto normalNode = std::make_shared<RSSurfaceRenderNode>(config);
188 normalNode->SetIsOnTheTree(true);
189 nodeMap.RegisterRenderNode(normalNode);
190 frameRateMgr.HandleGameNode(nodeMap);
191 ASSERT_EQ(frameRateMgr.isGameNodeOnTree_.load(), false);
192 }
193 STEP("3. Test with a game surfaceNode not on tree") {
194 config.id = 2;
195 config.name = "gameNode";
196 auto gameNode1 = std::make_shared<RSSurfaceRenderNode>(config);
197 gameNode1->SetIsOnTheTree(false);
198 nodeMap.RegisterRenderNode(gameNode1);
199 frameRateMgr.HandleGameNode(nodeMap);
200 ASSERT_EQ(frameRateMgr.isGameNodeOnTree_.load(), false);
201 }
202 STEP("4. Test with a game surfaceNode on tree") {
203 config.id = 3;
204 config.name = "gameNode";
205 auto gameNode2 = std::make_shared<RSSurfaceRenderNode>(config);
206 gameNode2->SetIsOnTheTree(true);
207 nodeMap.RegisterRenderNode(gameNode2);
208 frameRateMgr.HandleGameNode(nodeMap);
209 ASSERT_EQ(frameRateMgr.isGameNodeOnTree_.load(), true);
210 }
211 }
212 sleep(1);
213 }
214
215 /**
216 * @tc.name: HgmUiFrameworkDirtyNodeTest
217 * @tc.desc: Verify the result of HgmUiFrameworkDirtyNodeTest function
218 * @tc.type: FUNC
219 * @tc.require:
220 */
221 HWTEST_F(HgmFrameRateMgrTest, HgmUiFrameworkDirtyNodeTest, Function | SmallTest | Level1)
222 {
223 HgmFrameRateManager frameRateMgr;
224 std::vector<std::weak_ptr<RSRenderNode>> uiFwkDirtyNodes;
225 PART("HgmUiFrameworkDirtyNodeTest") {
226 STEP("1. Test empty uiFwkDirtyNodes") {
227 ASSERT_EQ(uiFwkDirtyNodes.size(), 0);
228 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
229 frameRateMgr.voterTouchEffective_ = true;
230 {
231 std::shared_ptr<RSRenderNode> renderNode1 = std::make_shared<RSRenderNode>(0);
232 uiFwkDirtyNodes.emplace_back(renderNode1);
233 ASSERT_EQ(uiFwkDirtyNodes.size(), 1);
234 }
235 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
236 ASSERT_EQ(uiFwkDirtyNodes.size(), 0);
237 }
238 STEP("2. Test uiFwkDirtyNodes with a clean renderNode") {
239 std::shared_ptr<RSRenderNode> renderNode2 = std::make_shared<RSRenderNode>(0);
240 uiFwkDirtyNodes.emplace_back(renderNode2);
241 ASSERT_EQ(uiFwkDirtyNodes.size(), 1);
242 ASSERT_EQ(renderNode2->IsDirty(), false);
243 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
244 ASSERT_EQ(uiFwkDirtyNodes.size(), 1);
245 }
246 STEP("3. Test uiFwkDirtyNodes with a dirty renderNode") {
247 std::shared_ptr<RSRenderNode> renderNode3 = std::make_shared<RSRenderNode>(0);
248 uiFwkDirtyNodes.emplace_back(renderNode3);
249 ASSERT_EQ(uiFwkDirtyNodes.size(), 2);
250
251 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
252 ASSERT_EQ(uiFwkDirtyNodes.size(), 1);
253
254 renderNode3->SetDirty();
255 ASSERT_EQ(renderNode3->IsDirty(), true);
256 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
257 ASSERT_EQ(uiFwkDirtyNodes.size(), 1);
258 }
259 STEP("4. other branch") {
260 frameRateMgr.surfaceData_.emplace_back(std::tuple<std::string, pid_t, UIFWKType>());
261 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
262 frameRateMgr.voterGamesEffective_ = true;
263 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
264 frameRateMgr.voterTouchEffective_ = false;
265 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
266 }
267 }
268 sleep(1);
269 }
270
271 /**
272 * @tc.name: ProcessPendingRefreshRate
273 * @tc.desc: Verify the result of ProcessPendingRefreshRate function
274 * @tc.type: FUNC
275 * @tc.require:
276 */
277 HWTEST_F(HgmFrameRateMgrTest, ProcessPendingRefreshRate, Function | SmallTest | Level1)
278 {
279 HgmFrameRateManager frameRateMgr;
280 std::vector<std::weak_ptr<RSRenderNode>> uiFwkDirtyNodes;
281 bool disableSafeVote = true;
282 frameRateMgr.multiAppStrategy_.SetDisableSafeVoteValue(disableSafeVote);
283
284 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
285 FrameRateLinkerMap appFrameRateLinkers;
286 const std::map<uint64_t, int> vRatesMap;
287 frameRateMgr.UniProcessDataForLtpo(currTime, frameRateMgr.rsFrameRateLinker_,
288 appFrameRateLinkers, vRatesMap);
289 auto& hgmCore = HgmCore::Instance();
290 hgmCore.ltpoEnabled_ = false;
291 FrameRateLinkerId id;
292 frameRateMgr.rsFrameRateLinker_ = std::make_shared<RSRenderFrameRateLinker>(id);
293 frameRateMgr.UpdateSoftVSync(true);
294 int64_t vsyncid = 0;
295 uint32_t rsRate = 0;
296 bool isUiDvsyncOn = false;
297 frameRateMgr.pendingRefreshRate_ = nullptr;
298 frameRateMgr.ProcessPendingRefreshRate(currTime, vsyncid, rsRate, isUiDvsyncOn);
299 frameRateMgr.lastPendingConstraintRelativeTime_ = currTime;
300 frameRateMgr.ProcessPendingRefreshRate(currTime, vsyncid, rsRate, isUiDvsyncOn);
301 ASSERT_EQ(HgmCore::Instance().pendingConstraintRelativeTime_,
302 frameRateMgr.lastPendingConstraintRelativeTime_);
303 frameRateMgr.HandleThermalFrameRate(true);
304 }
305
306 /**
307 * @tc.name: HgmConfigCallbackManagerTest
308 * @tc.desc: Verify the result of HgmConfigCallbackManagerTest function
309 * @tc.type: FUNC
310 * @tc.require:
311 */
312 HWTEST_F(HgmFrameRateMgrTest, HgmConfigCallbackManagerTest, Function | SmallTest | Level1)
313 {
314 sptr<HgmConfigCallbackManager> hccMgr = HgmConfigCallbackManager::GetInstance();
315 PART("HgmConfigCallbackManagerTest") {
316 STEP("1. Callback is nullptr") {
317 sptr<CustomHgmCallback> cb1 = new CustomHgmCallback();
318 hccMgr->RegisterHgmRefreshRateModeChangeCallback(0, nullptr);
319 hccMgr->RegisterHgmRefreshRateModeChangeCallback(1, cb1);
320 }
321 STEP("2. Test SyncHgmConfigChangeCallback without callback") {
322 std::unordered_map<pid_t, sptr<RSIHgmConfigChangeCallback>> emptyCallback;
323 std::swap(hccMgr->animDynamicCfgCallbacks_, emptyCallback);
324 ASSERT_EQ(hccMgr->animDynamicCfgCallbacks_.empty(), true);
325 hccMgr->SyncHgmConfigChangeCallback();
326 }
327 STEP("3. Test SyncCallback function with callback") {
328 sptr<CustomHgmCallback> cb = new CustomHgmCallback();
329 hccMgr->animDynamicCfgCallbacks_[0] = cb;
330 hccMgr->refreshRateModeCallbacks_[0] = cb;
331 hccMgr->SyncHgmConfigChangeCallback();
332 hccMgr->SyncRefreshRateModeChangeCallback(0);
333 hccMgr->RegisterHgmConfigChangeCallback(0, nullptr);
334 hccMgr->RegisterHgmConfigChangeCallback(pid, cb);
335 hccMgr->RegisterHgmRefreshRateUpdateCallback(0, nullptr);
336 hccMgr->RegisterHgmRefreshRateUpdateCallback(pid, cb);
337 hccMgr->refreshRateUpdateCallbacks_.try_emplace(0, cb);
338 hccMgr->RegisterHgmRefreshRateUpdateCallback(0, nullptr);
339 hccMgr->RegisterHgmRefreshRateUpdateCallback(pid, cb);
340 hccMgr->SyncHgmConfigChangeCallback();
341 hccMgr->SyncRefreshRateModeChangeCallback(0);
342 hccMgr->refreshRateUpdateCallbacks_ = {
343 {0, nullptr},
344 };
345 hccMgr->SyncRefreshRateUpdateCallback(OLED_60_HZ);
346 ASSERT_EQ(hccMgr->animDynamicCfgCallbacks_.empty(), false);
347 hccMgr->UnRegisterHgmConfigChangeCallback(pid);
348 hccMgr->animDynamicCfgCallbacks_.try_emplace(0, cb);
349 hccMgr->SyncHgmConfigChangeCallback();
350 hccMgr->refreshRateUpdateCallbacks_.try_emplace(0, cb);
351 hccMgr->SyncRefreshRateUpdateCallback(OLED_60_HZ);
352 }
353 }
354 }
355
356 /**
357 * @tc.name: HgmSetPointerActiveFPS
358 * @tc.desc: Verify the result of HgmSetPointerActiveFPS function
359 * @tc.type: FUNC
360 * @tc.require:
361 */
362 HWTEST_F(HgmFrameRateMgrTest, HgmSetPointerActiveFPS, Function | SmallTest | Level1)
363 {
364 HgmFrameRateManager frameRateMgr;
365 constexpr uint32_t delay_1100Ms = 1100;
366 constexpr uint32_t delay_1300Ms = 1300;
367 InitHgmFrameRateManager(frameRateMgr);
368 frameRateMgr.HandleTouchEvent(appPid, TouchStatus::TOUCH_BUTTON_DOWN, touchCount);
369 std::this_thread::sleep_for(std::chrono::milliseconds(delay_110Ms));
370 ASSERT_EQ(frameRateMgr.pointerManager_.GetState(), PointerState::POINTER_ACTIVE_STATE);
371
372 frameRateMgr.HandleTouchEvent(appPid, TouchStatus::TOUCH_MOVE, touchCount);
373 std::this_thread::sleep_for(std::chrono::milliseconds(delay_110Ms));
374 ASSERT_EQ(frameRateMgr.pointerManager_.GetState(), PointerState::POINTER_ACTIVE_STATE);
375
376 frameRateMgr.HandleTouchEvent(appPid, TouchStatus::TOUCH_BUTTON_UP, touchCount);
377 std::this_thread::sleep_for(std::chrono::milliseconds(delay_110Ms));
378 ASSERT_EQ(frameRateMgr.pointerManager_.GetState(), PointerState::POINTER_ACTIVE_STATE);
379
380 frameRateMgr.HandleTouchEvent(appPid, TouchStatus::TOUCH_MOVE, touchCount);
381 std::this_thread::sleep_for(std::chrono::milliseconds(delay_1100Ms));
382 ASSERT_EQ(frameRateMgr.pointerManager_.GetState(), PointerState::POINTER_ACTIVE_STATE);
383
384 std::this_thread::sleep_for(std::chrono::milliseconds(delay_1300Ms));
385 ASSERT_EQ(frameRateMgr.pointerManager_.GetState(), PointerState::POINTER_IDLE_STATE);
386
387 frameRateMgr.pointerManager_.ChangeState(PointerState::POINTER_IDLE_STATE);
388 sleep(1); // wait for handler task finished
389 }
390
391 /**
392 * @tc.name: MultiThread001
393 * @tc.desc: Verify the result of MultiThread001 function
394 * @tc.type: FUNC
395 * @tc.require:
396 */
397 HWTEST_F(HgmFrameRateMgrTest, MultiThread001, Function | SmallTest | Level1)
398 {
399 int64_t offset = 0;
400 int32_t testThreadNum = 100;
401 int32_t touchCnt = 1;
402 std::string pkg0 = "com.pkg.other:0:-1";
403 std::string pkg1 = "com.ss.hm.ugc.aweme:1001:10067";
404 std::string pkg2 = "com.wedobest.fivechess.harm:1002:10110";
405
406 HgmFrameRateManager frameRateMgr;
407 auto vsyncGenerator = CreateVSyncGenerator();
408 sptr<Rosen::VSyncController> rsController = new VSyncController(vsyncGenerator, offset);
409 ASSERT_NE(rsController, nullptr);
410 sptr<Rosen::VSyncController> appController = new VSyncController(vsyncGenerator, offset);
411 ASSERT_NE(appController, nullptr);
412 frameRateMgr.Init(rsController, appController, vsyncGenerator);
__anon1896067b0202(bool idleTimerExpired, bool forceUpdate) 413 frameRateMgr.forceUpdateCallback_ = [](bool idleTimerExpired, bool forceUpdate) { return; };
414
415 ASSERT_NE(vsyncGenerator, nullptr);
416 ASSERT_NE(rsController, nullptr);
417 ASSERT_NE(appController, nullptr);
__anon1896067b0302() 418 HgmTaskHandleThread::Instance().PostTask([&]() {
419 for (int i = 0; i < testThreadNum; i++) {
420 // HandleLightFactorStatus
421 frameRateMgr.HandleLightFactorStatus(i, LightFactorStatus::NORMAL_LOW);
422 frameRateMgr.HandleLightFactorStatus(i, LightFactorStatus::NORMAL_HIGH);
423
424 // HandlePackageEvent
425 frameRateMgr.HandlePackageEvent(i, {pkg0});
426 ASSERT_NE(frameRateMgr.multiAppStrategy_.HandlePkgsEvent({pkg0}), EXEC_SUCCESS);
427 frameRateMgr.HandlePackageEvent(i, {pkg1});
428 ASSERT_NE(frameRateMgr.multiAppStrategy_.HandlePkgsEvent({pkg1}), EXEC_SUCCESS);
429 frameRateMgr.HandlePackageEvent(i, {pkg2});
430 ASSERT_NE(frameRateMgr.multiAppStrategy_.HandlePkgsEvent({pkg2}), EXEC_SUCCESS);
431 frameRateMgr.HandlePackageEvent(i, {pkg0, pkg1});
432 ASSERT_NE(frameRateMgr.multiAppStrategy_.HandlePkgsEvent({pkg0, pkg1}), EXEC_SUCCESS);
433
434 // HandleRefreshRateEvent
435 frameRateMgr.HandleRefreshRateEvent(i, {});
436
437 // HandleTouchEvent
438 frameRateMgr.HandleTouchEvent(i, TouchStatus::TOUCH_DOWN, touchCnt);
439 frameRateMgr.HandleTouchEvent(i, TouchStatus::TOUCH_UP, touchCnt);
440
441 // HandleRefreshRateMode
442 // param -1、0、1、2、3:refresh rate mode
443 frameRateMgr.HandleRefreshRateMode(-1);
444 frameRateMgr.HandleRefreshRateMode(0);
445 frameRateMgr.HandleRefreshRateMode(1);
446 frameRateMgr.HandleRefreshRateMode(2);
447 frameRateMgr.HandleRefreshRateMode(3);
448
449 // HandleScreenPowerStatus
450 frameRateMgr.HandleScreenPowerStatus(i, ScreenPowerStatus::POWER_STATUS_ON);
451 frameRateMgr.HandleScreenPowerStatus(i, ScreenPowerStatus::POWER_STATUS_OFF);
452
453 // HandleScreenRectFrameRate
454 frameRateMgr.HandleScreenRectFrameRate(i, rectF);
455 frameRateMgr.HandleScreenRectFrameRate(i, rectM);
456 frameRateMgr.HandleScreenRectFrameRate(i, rectG);
457 frameRateMgr.HandleScreenRectFrameRate(i, rectNeg);
458 frameRateMgr.HandleScreenRectFrameRate(i, rectMax);
459 }
460 });
461 sleep(2); // wait for handler task finished
462 }
463
464 /**
465 * @tc.name: UpdateGuaranteedPlanVoteTest
466 * @tc.desc: Verify the result of UpdateGuaranteedPlanVote
467 * @tc.type: FUNC
468 * @tc.require:
469 */
470 HWTEST_F(HgmFrameRateMgrTest, UpdateGuaranteedPlanVoteTest, Function | SmallTest | Level1)
471 {
472 std::unique_ptr<HgmFrameRateManager> mgr = std::make_unique<HgmFrameRateManager>();
473
474 mgr->idleDetector_.SetAppSupportedState(false);
475 mgr->UpdateGuaranteedPlanVote(currTime);
476
477 mgr->idleDetector_.SetAppSupportedState(true);
478 mgr->UpdateGuaranteedPlanVote(currTime);
479
480 mgr->HandleTouchEvent(appPid, TouchStatus::TOUCH_DOWN, touchCount);
481 mgr->HandleTouchEvent(appPid, TouchStatus::TOUCH_UP, touchCount);
482 std::this_thread::sleep_for(std::chrono::milliseconds(delay_110Ms));
483 mgr->UpdateGuaranteedPlanVote(currTime);
484
485 mgr->idleDetector_.bufferFpsMap_["AceAnimato"] = 90;
486 mgr->HandleTouchEvent(appPid, TouchStatus::TOUCH_DOWN, touchCount);
487 mgr->HandleTouchEvent(appPid, TouchStatus::TOUCH_UP, touchCount);
488 std::this_thread::sleep_for(std::chrono::milliseconds(delay_110Ms));
489 mgr->UpdateGuaranteedPlanVote(currTime);
490
491 mgr->idleDetector_.SetAceAnimatorIdleState(false);
492 mgr->HandleTouchEvent(appPid, TouchStatus::TOUCH_DOWN, touchCount);
493 mgr->HandleTouchEvent(appPid, TouchStatus::TOUCH_UP, touchCount);
494 std::this_thread::sleep_for(std::chrono::milliseconds(delay_110Ms));
495 mgr->UpdateGuaranteedPlanVote(currTime);
496 EXPECT_FALSE(mgr->idleDetector_.GetAceAnimatorIdleState());
497 }
498
499 /**
500 * @tc.name: CleanPidCallbackTest
501 * @tc.desc: Verify the result of CleanPidCallbackTest
502 * @tc.type: FUNC
503 * @tc.require:
504 */
505 HWTEST_F(HgmFrameRateMgrTest, CleanPidCallbackTest, Function | SmallTest | Level2)
506 {
507 std::unique_ptr<HgmFrameRateManager> mgr = std::make_unique<HgmFrameRateManager>();
508 int32_t defaultPid = 0;
509 int32_t gamePid = 10024;
510 uint32_t undefinedCallbackType = 0xff;
511 std::string defaultScreenStrategyId = "LTPO-DEFAULT";
512 std::string invalidScreenStrategyId = "DEFAULT-INVALID";
513 auto &hgm = HgmCore::Instance();
514
515 mgr->CleanVote(defaultPid);
516 mgr->cleanPidCallback_[gamePid].insert(CleanPidCallbackType::LIGHT_FACTOR);
517 mgr->cleanPidCallback_[gamePid].insert(CleanPidCallbackType::PACKAGE_EVENT);
518 mgr->cleanPidCallback_[gamePid].insert(CleanPidCallbackType::TOUCH_EVENT);
519 mgr->cleanPidCallback_[gamePid].insert(CleanPidCallbackType::GAMES);
520 mgr->cleanPidCallback_[gamePid].insert(static_cast<CleanPidCallbackType>(undefinedCallbackType));
521 mgr->CleanVote(gamePid);
522 mgr->pidRecord_.emplace(defaultPid);
523 mgr->CleanVote(gamePid);
524
525 ASSERT_EQ(mgr->sceneStack_.empty(), true);
526 mgr->sceneStack_.push_back(std::make_pair("sceneName", 0));
527 ASSERT_EQ(mgr->sceneStack_.empty(), false);
528
529 std::string savedScreenStrategyId = mgr->curScreenStrategyId_;
530 ASSERT_EQ(savedScreenStrategyId, defaultScreenStrategyId);
531 mgr->curScreenStrategyId_ = invalidScreenStrategyId;
532 mgr->UpdateVoteRule();
533 if (hgm.mPolicyConfigData_ == nullptr) {
534 return;
535 }
536 EXPECT_NE(hgm.mPolicyConfigData_, nullptr);
537 std::shared_ptr<PolicyConfigData> cachedPolicyConfigData = nullptr;
538 std::swap(hgm.mPolicyConfigData_, cachedPolicyConfigData);
539 EXPECT_EQ(hgm.mPolicyConfigData_, nullptr);
540 mgr->UpdateVoteRule();
541 mgr->curScreenStrategyId_ = savedScreenStrategyId;
542 std::swap(hgm.mPolicyConfigData_, cachedPolicyConfigData);
543 EXPECT_NE(hgm.mPolicyConfigData_, nullptr);
544 auto frameRateMgr = hgm.GetFrameRateMgr();
545 auto screenSetting = frameRateMgr->multiAppStrategy_.GetScreenSetting();
546 screenSetting.sceneList.insert(make_pair(testScene, PolicyConfigData::SceneConfig{"1", "1"}));
547 screenSetting.gameSceneList.insert(make_pair(testScene, "1"));
548 screenSetting.ancoSceneList.insert(make_pair(testScene, PolicyConfigData::SceneConfig{"1", "1"}));
549 frameRateMgr->multiAppStrategy_.SetScreenSetting(screenSetting);
550 EventInfo eventInfo2 = { .eventName = "VOTER_SCENE", .eventStatus = true, .description = testScene };
551 frameRateMgr->HandleRefreshRateEvent(0, eventInfo2);
552 frameRateMgr->UpdateVoteRule();
553 sleep(1);
554 }
555
556 /**
557 * @tc.name: HandleEventTest
558 * @tc.desc: Verify the result of HandleEventTest
559 * @tc.type: FUNC
560 * @tc.require:
561 */
562 HWTEST_F(HgmFrameRateMgrTest, HandleEventTest, Function | SmallTest | Level2)
563 {
564 std::string pkg0 = "com.pkg.other:0:-1";
565 std::string pkg1 = "com.pkg.other:1:-1";
566
567 std::unique_ptr<HgmFrameRateManager> mgr = std::make_unique<HgmFrameRateManager>();
568 auto &hgm = HgmCore::Instance();
569 mgr->DeliverRefreshRateVote({"VOTER_GAMES", 120, 90, 0}, true);
570
571 mgr->GetExpectedFrameRate(static_cast<RSPropertyUnit>(0xff), 100.f, 0, 0);
572 if (hgm.mPolicyConfigData_ == nullptr) {
573 return;
574 }
575 EXPECT_NE(hgm.mPolicyConfigData_, nullptr);
576 std::shared_ptr<PolicyConfigData> cachedPolicyConfigData = nullptr;
577 std::swap(hgm.mPolicyConfigData_, cachedPolicyConfigData);
578 EXPECT_EQ(hgm.mPolicyConfigData_, nullptr);
579 ASSERT_EQ(nullptr, hgm.GetPolicyConfigData());
580 mgr->GetPreferredFps("translate", 100.f, 0.f, 0.f);
581
582 EventInfo eventInfo = { .eventName = "VOTER_GAMES", .eventStatus = false,
583 .description = pkg0,
584 };
585 mgr->HandleRefreshRateEvent(0, eventInfo);
586 mgr->HandleGamesEvent(0, eventInfo);
587 eventInfo.eventStatus = true;
588 mgr->HandleGamesEvent(0, eventInfo);
589 eventInfo.description = pkg1;
590 mgr->HandleGamesEvent(0, eventInfo);
591 mgr->HandleGamesEvent(1, eventInfo);
592 mgr->HandleIdleEvent(true);
593 mgr->HandleIdleEvent(false);
594 auto screenSetting = mgr->multiAppStrategy_.GetScreenSetting();
595 screenSetting.sceneList.insert(make_pair(testScene, PolicyConfigData::SceneConfig{"1", "1"}));
596 screenSetting.gameSceneList.insert(make_pair(testScene, "1"));
597 screenSetting.ancoSceneList.insert(make_pair(testScene, PolicyConfigData::SceneConfig{"1", "1"}));
598 mgr->multiAppStrategy_.SetScreenSetting(screenSetting);
599 EventInfo eventInfo2 = { .eventName = "VOTER_SCENE", .eventStatus = true, .description = testScene };
600 mgr->HandleRefreshRateEvent(0, eventInfo2);
601 eventInfo2.eventStatus = false;
602 mgr->HandleRefreshRateEvent(0, eventInfo2);
603
604 std::swap(hgm.mPolicyConfigData_, cachedPolicyConfigData);
605 EXPECT_NE(hgm.mPolicyConfigData_, nullptr);
606 eventInfo2.eventName = "VOTER_VIDEO_CALL";
607 mgr->HandleRefreshRateEvent(0, eventInfo2);
608 eventInfo2.eventName = "VOTER_VIRTUALDISPLAY";
609 mgr->HandleRefreshRateEvent(0, eventInfo2);
610 eventInfo2.eventName = "VOTER_MULTISELFOWNEDSCREEN";
611 mgr->HandleRefreshRateEvent(0, eventInfo2);
612 }
613
614
615 /**
616 * @tc.name: GetDrawingFrameRateTest
617 * @tc.desc: Verify the result of GetDrawingFrameRateTest
618 * @tc.type: FUNC
619 * @tc.require:
620 */
621 HWTEST_F(HgmFrameRateMgrTest, GetDrawingFrameRateTest, Function | SmallTest | Level2)
622 {
623 std::unique_ptr<HgmFrameRateManager> mgr = std::make_unique<HgmFrameRateManager>();
624 uint32_t refreshRate_60 = 60;
625 uint32_t refreshRate_120 = 120;
626 FrameRateRange dynamic_120(0, 120, 120);
627 EXPECT_EQ(dynamic_120.IsDynamic(), true);
628 FrameRateRange static_120(120, 120, 120);
629 EXPECT_EQ(static_120.IsDynamic(), false);
630 auto &hgmCore = HgmCore::Instance();
631 HgmFrameRateManager frameRateMgr;
632 hgmCore.adaptiveSync_ = ADAPTIVE_SYNC_ENABLED;
633 frameRateMgr.isAdaptive_.store(true);
634 frameRateMgr.ProcessAdaptiveSync("VOTER_GAMES");
635 frameRateMgr.ProcessAdaptiveSync("VOTER_SCENE");
636 frameRateMgr.isAdaptive_.store(false);
637 frameRateMgr.ProcessAdaptiveSync("VOTER_GAMES");
638 EXPECT_EQ(mgr->GetDrawingFrameRate(refreshRate_60, dynamic_120), 60);
639 EXPECT_EQ(mgr->GetDrawingFrameRate(refreshRate_60, static_120), 60);
640 EXPECT_EQ(mgr->GetDrawingFrameRate(refreshRate_120, dynamic_120), 120);
641 EXPECT_EQ(mgr->GetDrawingFrameRate(refreshRate_120, static_120), 120);
642 }
643
644
645 /**
646 * @tc.name: ProcessRefreshRateVoteTest
647 * @tc.desc: Verify the result of ProcessRefreshRateVoteTest
648 * @tc.type: FUNC
649 * @tc.require:
650 */
651 HWTEST_F(HgmFrameRateMgrTest, ProcessRefreshRateVoteTest, Function | SmallTest | Level2)
652 {
653 HgmFrameRateManager frameRateMgr;
654 VoteInfo resultVoteInfo;
655 VoteRange voteRange = { OLED_MIN_HZ, OLED_MAX_HZ };
656 bool voterGamesEffective = false;
657 auto voterIter = std::find(frameRateMgr.voters_.begin(), frameRateMgr.voters_.end(), "VOTER_GAMES");
658 frameRateMgr.ProcessRefreshRateVote(voterIter, resultVoteInfo, voteRange, voterGamesEffective);
659 frameRateMgr.DeliverRefreshRateVote({"VOTER_GAMES", OLED_120_HZ, OLED_90_HZ, OLED_NULL_HZ}, true);
660 frameRateMgr.DeliverRefreshRateVote({"VOTER_THERMAL", OLED_120_HZ, OLED_90_HZ, OLED_NULL_HZ}, true);
661 frameRateMgr.DeliverRefreshRateVote({"VOTER_MULTISELFOWNEDSCREEN", OLED_120_HZ, OLED_90_HZ, OLED_NULL_HZ}, true);
662 auto screenSetting = frameRateMgr.multiAppStrategy_.GetScreenSetting();
663 screenSetting.sceneList.insert(make_pair(testScene, PolicyConfigData::SceneConfig{"1", "1"}));
664 screenSetting.gameSceneList.insert(make_pair(testScene, "1"));
665 screenSetting.ancoSceneList.insert(make_pair(testScene, PolicyConfigData::SceneConfig{"1", "1"}));
666 frameRateMgr.multiAppStrategy_.SetScreenSetting(screenSetting);
667 EventInfo eventInfo2 = { .eventName = "VOTER_SCENE", .eventStatus = true, .description = testScene };
668 frameRateMgr.HandleRefreshRateEvent(0, eventInfo2);
669 frameRateMgr.DeliverRefreshRateVote({"VOTER_ANCO", OLED_120_HZ, OLED_90_HZ, OLED_60_HZ}, true);
670 auto resVoteInfo = frameRateMgr.ProcessRefreshRateVote();
671 EXPECT_EQ(resVoteInfo.min, OLED_MIN_HZ);
672 frameRateMgr.ancoScenes_.emplace("VOTER_ANCO");
673 resVoteInfo = frameRateMgr.ProcessRefreshRateVote();
674 EXPECT_EQ(resVoteInfo.min, OLED_MIN_HZ);
675 }
676
677 /**
678 * @tc.name: ProcessRefreshRateVoteTest2
679 * @tc.desc: Verify the result of ProcessRefreshRateVote when idle 30 enabled
680 * @tc.type: FUNC
681 * @tc.require:
682 */
683 HWTEST_F(HgmFrameRateMgrTest, ProcessRefreshRateVoteTest2, Function | SmallTest | Level2)
684 {
685 HgmFrameRateManager frameRateMgr;
686 VoteInfo resultVoteInfo;
687 VoteRange voteRange = { OLED_MIN_HZ, OLED_MAX_HZ };
688 frameRateMgr.DeliverRefreshRateVote({"VOTER_PACKAGES", OLED_60_HZ, OLED_120_HZ, 0}, true);
689 frameRateMgr.DeliverRefreshRateVote({"VOTER_LTPO", OLED_120_HZ, OLED_120_HZ, 0}, true);
690 frameRateMgr.DeliverRefreshRateVote({"VOTER_IDLE", OLED_30_HZ, OLED_30_HZ, 0}, true);
691 auto resVoteInfo = frameRateMgr.ProcessRefreshRateVote();
692 EXPECT_EQ(resVoteInfo.min, OLED_120_HZ);
693 frameRateMgr.DeliverRefreshRateVote({"VOTER_LTPO", OLED_120_HZ, OLED_120_HZ, 0}, false);
694 frameRateMgr.DeliverRefreshRateVote({"VOTER_LTPO", OLED_60_HZ, OLED_60_HZ, 0}, true);
695 resVoteInfo = frameRateMgr.ProcessRefreshRateVote();
696 EXPECT_EQ(resVoteInfo.min, OLED_60_HZ);
697 EXPECT_EQ(resVoteInfo.max, OLED_60_HZ);
698 frameRateMgr.DeliverRefreshRateVote({"VOTER_LTPO", OLED_60_HZ, OLED_60_HZ, 0}, false);
699 resVoteInfo = frameRateMgr.ProcessRefreshRateVote();
700 EXPECT_EQ(resVoteInfo.min, OLED_60_HZ);
701 EXPECT_EQ(resVoteInfo.max, OLED_60_HZ);
702 frameRateMgr.DeliverRefreshRateVote({"VOTER_PACKAGES", OLED_60_HZ, OLED_120_HZ, 0}, false);
703 frameRateMgr.DeliverRefreshRateVote({"VOTER_PACKAGES", OLED_30_HZ, OLED_120_HZ, 0}, true);
704 resVoteInfo = frameRateMgr.ProcessRefreshRateVote();
705 EXPECT_EQ(resVoteInfo.max, OLED_30_HZ);
706 sleep(1); // wait for handler task finished
707 }
708
709 /**
710 * @tc.name: SetAceAnimatorVoteTest
711 * @tc.desc: Verify the result of SetAceAnimatorVoteTest
712 * @tc.type: FUNC
713 * @tc.require:
714 */
715 HWTEST_F(HgmFrameRateMgrTest, SetAceAnimatorVoteTest, Function | SmallTest | Level2)
716 {
717 HgmFrameRateManager frameRateMgr;
718 frameRateMgr.SetAceAnimatorVote(nullptr);
719 std::shared_ptr<RSRenderFrameRateLinker> linker = std::make_shared<RSRenderFrameRateLinker>();
720 ASSERT_NE(linker, nullptr);
721 frameRateMgr.SetAceAnimatorVote(linker);
722 linker->SetAnimatorExpectedFrameRate(OLED_60_HZ);
723 frameRateMgr.SetAceAnimatorVote(linker);
724 }
725
726 /**
727 * @tc.name: HgmSimpleTimerTest
728 * @tc.desc: Verify the result of HgmSimpleTimerTest
729 * @tc.type: FUNC
730 * @tc.require:
731 */
732 HWTEST_F(HgmFrameRateMgrTest, HgmSimpleTimerTest, Function | SmallTest | Level2)
733 {
734 auto timer = HgmSimpleTimer("HgmSimpleTimer", std::chrono::milliseconds(delay_60Ms), nullptr, nullptr);
735 ASSERT_NE(timer.handler_, nullptr);
736 ASSERT_EQ(timer.name_, "HgmSimpleTimer");
737 ASSERT_EQ(timer.interval_, std::chrono::milliseconds(delay_60Ms));
738 ASSERT_EQ(timer.startCallback_, nullptr);
739 ASSERT_EQ(timer.expiredCallback_, nullptr);
740 timer.Start();
741 timer.Reset();
742 timer.Stop();
743 sleep(1); // wait for timer stop
744 }
745
746 /**
747 * @tc.name: FrameRateReportTest
748 * @tc.desc: Verify the result of FrameRateReportTest
749 * @tc.type: FUNC
750 * @tc.require:
751 */
752 HWTEST_F(HgmFrameRateMgrTest, FrameRateReportTest, Function | SmallTest | Level2)
753 {
754 HgmFrameRateManager mgr;
755 mgr.FrameRateReport();
756 mgr.curRefreshRateMode_ = HGM_REFRESHRATE_MODE_HIGH;
757 mgr.FrameRateReport();
758 EXPECT_EQ(mgr.schedulePreferredFpsChange_, false);
759 mgr.schedulePreferredFps_ = OLED_60_HZ;
760 mgr.currRefreshRate_ = OLED_60_HZ;
761 mgr.FrameRateReport();
762 mgr.curRefreshRateMode_ = 0;
763 mgr.schedulePreferredFps_ = 0;
764 mgr.schedulePreferredFpsChange_ = true;
765 mgr.FrameRateReport();
766 EXPECT_EQ(mgr.schedulePreferredFpsChange_, false);
767 }
768
769 /**
770 * @tc.name: CollectFrameRateChange
771 * @tc.desc: Verify the result of CollectFrameRateChange
772 * @tc.type: FUNC
773 * @tc.require:
774 */
775 HWTEST_F(HgmFrameRateMgrTest, CollectFrameRateChange, Function | SmallTest | Level2)
776 {
777 HgmFrameRateManager mgr;
778 InitHgmFrameRateManager(mgr);
779 FrameRateRange finalRange = {OLED_60_HZ, OLED_120_HZ, OLED_60_HZ};
780 FrameRateRange appExpectedRange = {OLED_60_HZ, OLED_120_HZ, OLED_72_HZ};
781 std::shared_ptr<RSRenderFrameRateLinker> rsFrameRateLinker = std::make_shared<RSRenderFrameRateLinker>();
782 std::shared_ptr<RSRenderFrameRateLinker> appFrameRateLinker = std::make_shared<RSRenderFrameRateLinker>();
783 appFrameRateLinker->SetExpectedRange(appExpectedRange);
784
785 FrameRateLinkerMap appFrameRateLinkers = {
786 {frameRateLinkerId1, nullptr},
787 {frameRateLinkerId2, appFrameRateLinker}
788 };
789 EXPECT_EQ(mgr.CollectFrameRateChange(finalRange, rsFrameRateLinker, appFrameRateLinkers), false);
790 mgr.controller_ = nullptr;
791 EXPECT_EQ(mgr.CollectFrameRateChange(finalRange, rsFrameRateLinker, appFrameRateLinkers), false);
792 }
793
794 /**
795 * @tc.name: CollectVRateChange
796 * @tc.desc: Verify the result of CollectVRateChange
797 * @tc.type: FUNC
798 * @tc.require:
799 */
800 HWTEST_F(HgmFrameRateMgrTest, CollectVRateChange, Function | SmallTest | Level2)
801 {
802 HgmFrameRateManager mgr;
803 InitHgmFrameRateManager(mgr);
804 FrameRateRange finalRange = {OLED_60_HZ, OLED_120_HZ, OLED_60_HZ};
805 mgr.vRatesMap_ = {
806 {0, 0},
807 {1, 1},
808 {2, 2}
809 };
810 uint64_t linkerId = 2;
811 mgr.CollectVRateChange(linkerId, finalRange);
812 EXPECT_EQ(finalRange.min_, OLED_60_HZ);
813 EXPECT_EQ(finalRange.max_, OLED_120_HZ);
814 EXPECT_EQ(finalRange.preferred_, OLED_60_HZ);
815
816 linkerId = 0;
817 mgr.CollectVRateChange(linkerId, finalRange);
818 EXPECT_EQ(finalRange.min_, OLED_60_HZ);
819 EXPECT_EQ(finalRange.max_, OLED_120_HZ);
820 EXPECT_EQ(finalRange.preferred_, OLED_60_HZ);
821
822 linkerId = 1;
823 mgr.CollectVRateChange(linkerId, finalRange);
824 EXPECT_EQ(finalRange.min_, OLED_60_HZ);
825 EXPECT_EQ(finalRange.max_, OLED_120_HZ);
826 EXPECT_EQ(finalRange.preferred_, OLED_60_HZ);
827
828 linkerId = 2;
829 mgr.CollectVRateChange(linkerId, finalRange);
830 EXPECT_EQ(finalRange.min_, OLED_60_HZ);
831 EXPECT_EQ(finalRange.max_, OLED_120_HZ);
832 EXPECT_EQ(finalRange.preferred_, OLED_60_HZ);
833
834 finalRange.preferred_ = 0;
835 mgr.controllerRate_ = 0;
836 mgr.CollectVRateChange(linkerId, finalRange);
837 EXPECT_EQ(finalRange.min_, OLED_NULL_HZ);
838 EXPECT_EQ(finalRange.max_, OLED_144_HZ);
839 EXPECT_EQ(finalRange.preferred_, 1);
840
841 finalRange.preferred_ = 0;
842 mgr.controllerRate_ = 100;
843 mgr.CollectVRateChange(linkerId, finalRange);
844 EXPECT_EQ(finalRange.min_, OLED_NULL_HZ);
845 EXPECT_EQ(finalRange.max_, OLED_144_HZ);
846 EXPECT_EQ(finalRange.preferred_, 50);
847 }
848
849 /**
850 * @tc.name: HandleFrameRateChangeForLTPO
851 * @tc.desc: Verify the result of HandleFrameRateChangeForLTPO
852 * @tc.type: FUNC
853 * @tc.require:
854 */
855 HWTEST_F(HgmFrameRateMgrTest, HandleFrameRateChangeForLTPO, Function | SmallTest | Level2)
856 {
857 auto &hgmCore = HgmCore::Instance();
858 auto frameRateMgr = hgmCore.GetFrameRateMgr();
859 hgmCore.SetPendingScreenRefreshRate(OLED_30_HZ);
860 frameRateMgr->currRefreshRate_ = OLED_120_HZ;
861 hgmCore.lowRateToHighQuickSwitch_.store(false);
862 frameRateMgr->HandleFrameRateChangeForLTPO(0, false);
863 hgmCore.lowRateToHighQuickSwitch_.store(true);
864 frameRateMgr->HandleFrameRateChangeForLTPO(0, false);
865 frameRateMgr->forceUpdateCallback_ = nullptr;
866 frameRateMgr->HandleFrameRateChangeForLTPO(0, false);
__anon1896067b0402(bool idleTimerExpired, bool forceUpdate) 867 frameRateMgr->forceUpdateCallback_ = [](bool idleTimerExpired, bool forceUpdate) { return; };
868 frameRateMgr->HandleFrameRateChangeForLTPO(0, false);
869 EXPECT_EQ(frameRateMgr->GetPreferredFps("translate", errorVelocity, 0, 0), 0);
870 hgmCore.lowRateToHighQuickSwitch_.store(true);
871 VSyncController* rsController;
872 VSyncController* appController;
873 VSyncGenerator* vsyncGenerator;
874 frameRateMgr->controller_ = std::make_shared<HgmVSyncGeneratorController>(rsController,
875 appController, vsyncGenerator);
876 frameRateMgr->HandleFrameRateChangeForLTPO(0, false);
877 }
878
879 /**
880 * @tc.name: GetLowBrightVec
881 * @tc.desc: Verify the result of GetLowBrightVec
882 * @tc.type: FUNC
883 * @tc.require:
884 */
885 HWTEST_F(HgmFrameRateMgrTest, GetLowBrightVec, Function | SmallTest | Level2)
886 {
887 HgmFrameRateManager mgr;
888 std::shared_ptr<PolicyConfigData> configData = std::make_shared<PolicyConfigData>();
889
890 std::vector<std::string> screenConfigs = {"LTPO-DEFAULT", "LTPO-internal", "LTPO-external"};
891 for (const auto& screenConfig : screenConfigs) {
892 auto iter = configData->supportedModeConfigs_.find(screenConfig);
893 if (iter == configData-> supportedModeConfigs_.end()) {
894 continue;
895 }
896
897 auto& supportedModeConfig = iter->second;
898 auto vec = supportedModeConfig.find("LowBright");
899
900 if (vec == supportedModeConfig.end()) {
901 continue;
902 }
903
904 supportedModeConfig["LowBright"].clear();
905 mgr.GetLowBrightVec(configData);
906 ASSERT_EQ(mgr.isAmbientEffect_, false);
907 ASSERT_TRUE(mgr.lowBrightVec_.empty());
908
909 std::vector<uint32_t> expectedLowBrightVec = {30, 60, 90};
910 supportedModeConfig["LowBright"] = expectedLowBrightVec;
911 mgr.GetLowBrightVec(configData);
912 ASSERT_EQ(mgr.isAmbientEffect_, true);
913 ASSERT_EQ(mgr.lowBrightVec_, expectedLowBrightVec);
914 }
915 }
916
917 /**
918 * @tc.name: GetStylusVec
919 * @tc.desc: Verify the result of GetStylusVec
920 * @tc.type: FUNC
921 * @tc.require:
922 */
923 HWTEST_F(HgmFrameRateMgrTest, GetStylusVec, Function | SmallTest | Level2)
924 {
925 HgmFrameRateManager mgr;
926 std::shared_ptr<PolicyConfigData> configData = std::make_shared<PolicyConfigData>();
927
928 std::vector<std::string> screenConfigs = {"LTPO-DEFAULT", "LTPS-DEFAULT"};
929 for (const auto& screenConfig : screenConfigs) {
930 auto iter = configData->supportedModeConfigs_.find(screenConfig);
931 if (iter == configData-> supportedModeConfigs_.end()) {
932 continue;
933 }
934
935 auto& supportedModeConfig = iter->second;
936 auto it = supportedModeConfig.find("StylusPen");
937 if (it == supportedModeConfig.end()) {
938 continue;
939 }
940
941 supportedModeConfig["StylusPen"].clear();
942 mgr.GetStylusVec(configData);
943 ASSERT_TRUE(mgr.stylusVec_.empty());
944
945 std::vector<uint32_t> expectedVec = {OLED_60_HZ, OLED_120_HZ};
946 supportedModeConfig["StylusPen"] = expectedVec;
947 mgr.GetStylusVec(configData);
948 ASSERT_EQ(mgr.stylusVec_, expectedVec);
949 }
950 }
951
952 /**
953 * @tc.name: GetDrawingFrameRate
954 * @tc.desc: Verify the result of GetDrawingFrameRate
955 * @tc.type: FUNC
956 * @tc.require:
957 */
958 HWTEST_F(HgmFrameRateMgrTest, GetDrawingFrameRate, Function | SmallTest | Level2)
959 {
960 std::vector<std::pair<std::pair<uint32_t, FrameRateRange>, uint32_t>> inputAndOutput = {
961 {{0, {0, 120, 60}}, 0},
962 {{60, {0, 120, 0}}, 0},
963 {{60, {0, 90, 120}}, 60},
964 {{60, {0, 120, 120}}, 60},
965 {{90, {0, 120, 30}}, 30},
966 {{80, {0, 120, 30}}, 40},
967 {{70, {0, 120, 30}}, 35},
968 {{60, {0, 120, 30}}, 30},
969 {{50, {0, 120, 30}}, 50}
970 };
971
972 for (const auto& [input, output] : inputAndOutput) {
973 EXPECT_EQ(HgmFrameRateManager::GetDrawingFrameRate(input.first, input.second), output);
974 }
975 }
976
977 /**
978 * @tc.name: HandleScreenPowerStatus
979 * @tc.desc: Verify the result of HandleScreenPowerStatus
980 * @tc.type: FUNC
981 * @tc.require:
982 */
983 HWTEST_F(HgmFrameRateMgrTest, HandleScreenPowerStatus, Function | SmallTest | Level1)
984 {
985 ScreenId extraScreenId = 1;
986 auto &hgmCore = HgmCore::Instance();
987 auto frameRateMgr = hgmCore.GetFrameRateMgr();
988 auto configData = hgmCore.GetPolicyConfigData();
989 if (configData == nullptr || frameRateMgr == nullptr) {
990 return;
991 }
992 // init
993 configData->screenStrategyConfigs_["screen0_LTPS"] = "LTPS-DEFAULT";
994 configData->screenStrategyConfigs_["screen0_LTPO"] = "LTPO-DEFAULT";
995 configData->screenStrategyConfigs_["screen5_LTPS"] = "LTPS-DEFAULT";
996 configData->screenStrategyConfigs_["screen5_LTPO"] = "LTPO-DEFAULT";
997 EXPECT_EQ(hgmCore.AddScreen(externalScreenId, 0, screenSize), EXEC_SUCCESS);
998 EXPECT_EQ(hgmCore.AddScreen(internalScreenId, 0, screenSize), EXEC_SUCCESS);
999
1000 // fold -> expand -> fold
1001 frameRateMgr->HandleScreenPowerStatus(internalScreenId, ScreenPowerStatus::POWER_STATUS_SUSPEND);
1002 frameRateMgr->HandleScreenPowerStatus(externalScreenId, ScreenPowerStatus::POWER_STATUS_ON);
1003 EXPECT_EQ(frameRateMgr->curScreenId_, externalScreenId);
1004 EXPECT_EQ(hgmCore.AddScreen(extraScreenId, 0, screenSize), EXEC_SUCCESS);
1005 EXPECT_EQ(frameRateMgr->curScreenId_, externalScreenId);
1006 EXPECT_EQ(hgmCore.RemoveScreen(extraScreenId), EXEC_SUCCESS);
1007 EXPECT_EQ(frameRateMgr->curScreenId_, externalScreenId);
1008
1009 EXPECT_EQ(hgmCore.AddScreen(extraScreenId, 0, screenSize), EXEC_SUCCESS);
1010 frameRateMgr->HandleScreenPowerStatus(externalScreenId, ScreenPowerStatus::POWER_STATUS_SUSPEND);
1011 frameRateMgr->HandleScreenPowerStatus(internalScreenId, ScreenPowerStatus::POWER_STATUS_ON);
1012 EXPECT_EQ(frameRateMgr->curScreenId_, internalScreenId);
1013 EXPECT_EQ(hgmCore.RemoveScreen(extraScreenId), EXEC_SUCCESS);
1014 EXPECT_EQ(frameRateMgr->curScreenId_, internalScreenId);
1015
1016 EXPECT_EQ(hgmCore.AddScreen(extraScreenId, 0, screenSize), EXEC_SUCCESS);
1017 EXPECT_EQ(frameRateMgr->curScreenId_, internalScreenId);
1018 EXPECT_EQ(hgmCore.RemoveScreen(extraScreenId), EXEC_SUCCESS);
1019
1020 EXPECT_EQ(hgmCore.AddScreen(extraScreenId, 0, screenSize), EXEC_SUCCESS);
1021 frameRateMgr->HandleScreenPowerStatus(internalScreenId, ScreenPowerStatus::POWER_STATUS_SUSPEND);
1022 frameRateMgr->HandleScreenPowerStatus(externalScreenId, ScreenPowerStatus::POWER_STATUS_ON);
1023 EXPECT_EQ(frameRateMgr->curScreenId_, externalScreenId);
1024 EXPECT_EQ(hgmCore.RemoveScreen(extraScreenId), EXEC_SUCCESS);
1025 EXPECT_EQ(frameRateMgr->curScreenId_, externalScreenId);
1026
1027 // expand -> multiScreen -> expand
1028 frameRateMgr->HandleScreenPowerStatus(externalScreenId, ScreenPowerStatus::POWER_STATUS_SUSPEND);
1029 frameRateMgr->HandleScreenPowerStatus(internalScreenId, ScreenPowerStatus::POWER_STATUS_ON);
1030 EXPECT_EQ(frameRateMgr->curScreenId_, internalScreenId);
1031
1032 hgmCore.SetMultiSelfOwnedScreenEnable(true);
1033 frameRateMgr->HandleScreenPowerStatus(externalScreenId, ScreenPowerStatus::POWER_STATUS_ON);
1034 EXPECT_EQ(frameRateMgr->curScreenId_, internalScreenId);
1035
1036 hgmCore.SetMultiSelfOwnedScreenEnable(false);
1037 frameRateMgr->HandleScreenPowerStatus(externalScreenId, ScreenPowerStatus::POWER_STATUS_SUSPEND);
1038 EXPECT_EQ(frameRateMgr->curScreenId_, internalScreenId);
1039 }
1040
1041 /**
1042 * @tc.name: HandleThermalFrameRate
1043 * @tc.desc: Verify the result of HandleThermalFrameRate
1044 * @tc.type: FUNC
1045 * @tc.require:
1046 */
1047 HWTEST_F(HgmFrameRateMgrTest, HandleThermalFrameRate, Function | SmallTest | Level1)
1048 {
1049 auto &hgmCore = HgmCore::Instance();
1050 auto frameRateMgr = hgmCore.GetFrameRateMgr();
1051 if (frameRateMgr == nullptr || hgmCore.mPolicyConfigData_ == nullptr) {
1052 return;
1053 }
1054 frameRateMgr->HandleThermalFrameRate(true);
1055 EXPECT_EQ(frameRateMgr->isEnableThermalStrategy_, true);
1056
1057 frameRateMgr->HandleThermalFrameRate(false);
1058 EXPECT_EQ(frameRateMgr->isEnableThermalStrategy_, false);
1059 }
1060
1061 /**
1062 * @tc.name: HandlePackageEvent
1063 * @tc.desc: Verify the result of HandlePackageEvent
1064 * @tc.type: FUNC
1065 * @tc.require:
1066 */
1067 HWTEST_F(HgmFrameRateMgrTest, HandlePackageEvent, Function | SmallTest | Level1)
1068 {
1069 auto &hgmCore = HgmCore::Instance();
1070 auto frameRateMgr = hgmCore.GetFrameRateMgr();
1071 if (frameRateMgr == nullptr) {
1072 return;
1073 }
1074 std::string pkgName0 = "com.pkg0";
1075 std::string pkgName1 = "com.pkg1";
1076 std::string scene0 = "SCENE0";
1077 std::string scene1 = "SCENE1";
1078 std::string scene2 = "SCENE2";
1079
1080 auto sceneListConfig = frameRateMgr->GetMultiAppStrategy().GetScreenSetting();
1081 sceneListConfig.sceneList[scene0] = {"1", "1", false};
1082 sceneListConfig.sceneList[scene1] = {"1", "1", true};
1083 sceneListConfig.gameSceneList[scene0] = {"1", "1"};
1084
1085 frameRateMgr->GetMultiAppStrategy().SetScreenSetting(sceneListConfig);
1086
1087 auto checkFunc = [frameRateMgr, scene0, scene1] (bool scene0Existed, bool scene1Existed, bool gameScene0Existed,
__anon1896067b0502(bool scene0Existed, bool scene1Existed, bool gameScene0Existed, bool gameScene1Existed) 1088 bool gameScene1Existed) {
1089 auto sceneStack = frameRateMgr->sceneStack_;
1090 EXPECT_EQ(std::find(sceneStack.begin(), sceneStack.end(),
1091 std::pair<std::string, pid_t>({scene0, DEFAULT_PID})) != sceneStack.end(), scene0Existed);
1092 EXPECT_EQ(std::find(sceneStack.begin(), sceneStack.end(),
1093 std::pair<std::string, pid_t>({scene1, DEFAULT_PID})) != sceneStack.end(), scene1Existed);
1094
1095 auto gameScenes = frameRateMgr->gameScenes_;
1096 EXPECT_EQ(gameScenes.find(scene0) != gameScenes.end(), gameScene0Existed);
1097 EXPECT_EQ(gameScenes.find(scene1) != gameScenes.end(), gameScene1Existed);
1098 };
1099
1100 frameRateMgr->HandleSceneEvent(DEFAULT_PID, {"VOTER_SCENE", true, OLED_NULL_HZ, OLED_MAX_HZ, scene0});
1101 checkFunc(true, false, true, false);
1102
1103 frameRateMgr->HandlePackageEvent(DEFAULT_PID, {pkgName0});
1104 checkFunc(false, false, false, false);
1105
1106 // multi scene
1107 frameRateMgr->HandleSceneEvent(DEFAULT_PID, {"VOTER_SCENE", true, OLED_NULL_HZ, OLED_MAX_HZ, scene0});
1108 frameRateMgr->HandleSceneEvent(DEFAULT_PID, {"VOTER_SCENE", true, OLED_NULL_HZ, OLED_MAX_HZ, scene1});
1109 checkFunc(true, true, true, false);
1110
1111 frameRateMgr->HandlePackageEvent(DEFAULT_PID, {pkgName1});
1112 checkFunc(false, true, false, false);
1113 }
1114
1115 /**
1116 * @tc.name: ChangePriority
1117 * @tc.desc: Verify the result of ChangePriority
1118 * @tc.type: FUNC
1119 * @tc.require:
1120 */
1121 HWTEST_F(HgmFrameRateMgrTest, ChangePriority, Function | SmallTest | Level1)
1122 {
1123 constexpr uint32_t DEFAULT_PRIORITY = 0;
1124 constexpr uint32_t VOTER_SCENE_PRIORITY_BEFORE_PACKAGES = 1;
1125 constexpr uint32_t VOTER_LTPO_PRIORITY_BEFORE_PACKAGES = 2;
1126 auto &hgmCore = HgmCore::Instance();
1127 auto frameRateMgr = hgmCore.GetFrameRateMgr();
1128 if (frameRateMgr == nullptr) {
1129 return;
1130 }
1131
1132 frameRateMgr->ChangePriority(DEFAULT_PRIORITY);
1133 auto packagesPos = find(frameRateMgr->voters_.begin(), frameRateMgr->voters_.end(), "VOTER_PACKAGES");
1134 auto ltpoPos = find(frameRateMgr->voters_.begin(), frameRateMgr->voters_.end(), "VOTER_LTPO");
1135 auto scenePos = find(frameRateMgr->voters_.begin(), frameRateMgr->voters_.end(), "VOTER_SCENE");
1136 ASSERT_LT(packagesPos, ltpoPos);
1137 ASSERT_LT(ltpoPos, scenePos);
1138 frameRateMgr->ChangePriority(VOTER_SCENE_PRIORITY_BEFORE_PACKAGES);
1139 auto packagesPos1 = find(frameRateMgr->voters_.begin(), frameRateMgr->voters_.end(), "VOTER_PACKAGES");
1140 auto ltpoPos1 = find(frameRateMgr->voters_.begin(), frameRateMgr->voters_.end(), "VOTER_LTPO");
1141 auto scenePos1 = find(frameRateMgr->voters_.begin(), frameRateMgr->voters_.end(), "VOTER_SCENE");
1142 ASSERT_LT(scenePos1, packagesPos1);
1143 ASSERT_LT(packagesPos1, ltpoPos1);
1144 frameRateMgr->ChangePriority(VOTER_LTPO_PRIORITY_BEFORE_PACKAGES);
1145 auto packagesPos2 = find(frameRateMgr->voters_.begin(), frameRateMgr->voters_.end(), "VOTER_PACKAGES");
1146 auto ltpoPos2 = find(frameRateMgr->voters_.begin(), frameRateMgr->voters_.end(), "VOTER_LTPO");
1147 auto scenePos2 = find(frameRateMgr->voters_.begin(), frameRateMgr->voters_.end(), "VOTER_SCENE");
1148 ASSERT_LT(scenePos2, ltpoPos2);
1149 ASSERT_LT(ltpoPos2, packagesPos2);
1150 }
1151
1152 /**
1153 * @tc.name: HandleDynamicModeEvent
1154 * @tc.desc: Verify the result of HandleDynamicModeEvent
1155 * @tc.type: FUNC
1156 * @tc.require:
1157 */
1158 HWTEST_F(HgmFrameRateMgrTest, HandleDynamicModeEvent, Function | SmallTest | Level1)
1159 {
1160 auto &hgmCore = HgmCore::Instance();
1161 auto frameRateMgr = hgmCore.GetFrameRateMgr();
1162 if (frameRateMgr == nullptr) {
1163 return;
1164 }
1165 frameRateMgr->HandleDynamicModeEvent(true);
1166 EXPECT_EQ(hgmCore.enableDynamicMode_, true);
1167 }
1168 } // namespace Rosen
1169 } // namespace OHOS
1170