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 "common/rs_common_def.h"
21 #include "ffrt_inner.h"
22 #include "hgm_config_callback_manager.h"
23 #include "hgm_frame_rate_manager.h"
24 #include "hgm_idle_detector.h"
25 #include "hgm_test_base.h"
26 #include "ipc_callbacks/rs_frame_rate_linker_expected_fps_update_callback_stub.h"
27 #include "pipeline/rs_surface_render_node.h"
28 #include "transaction/rs_render_service_client.h"
29
30
31 using namespace testing;
32 using namespace testing::ext;
33
34 namespace OHOS {
35 namespace Rosen {
36 namespace {
37 int64_t offset0 = 0;
38 int32_t testThreadNums = 100;
39 int32_t touchCnt = 1;
40 const std::string otherSurface = "Other_SF";
41 const std::string settingStrategyName = "99";
42 const int32_t HGM_REFRESHRATE_MODE_HIGH = 2;
43 constexpr uint64_t currTime = 200000000;
44 constexpr uint64_t lastTime = 100000000;
45 constexpr pid_t appPid = 0;
46 constexpr pid_t pid = 1;
47 constexpr uint32_t touchCount = 1;
48 constexpr uint32_t delay_60Ms = 60;
49 constexpr uint32_t delay_110Ms = 110;
50 constexpr uint32_t lastTouchUpExpectFps = 90;
51 constexpr int32_t OLED_72_HZ = 72;
52 constexpr int32_t OLED_50_HZ = 50;
53 constexpr int32_t OLED_80_HZ = 80;
54 ScreenSize screenSize = { 720, 1080, 685, 1218 }; // width, height, phyWidth, phyHeight
55 constexpr int32_t internalScreenId = 5;
56 constexpr int32_t externalScreenId = 0;
57 constexpr int32_t frameRateLinkerId1 = 1;
58 constexpr int32_t frameRateLinkerId2 = 2;
59 constexpr int32_t errorVelocity = -1;
60 constexpr int32_t strategy3 = 3;
61 constexpr int32_t maxSize = 25;
62 const std::string testScene = "TestScene";
63 const std::string pkgName0 = "com.pkg.other:0:-1";
64 const std::string pkgName1 = "com.ss.hm.ugc.aweme:1001:10067";
65 const std::string pkgName2 = "com.wedobest.fivechess.harm:1002:10110";
66 const GraphicIRect rectF {
67 .x = 0,
68 .y = 0,
69 .w = 2232,
70 .h = 1008,
71 };
72 const GraphicIRect rectM {
73 .x = 0,
74 .y = 1136,
75 .w = 2232,
76 .h = 2048,
77 };
78 const GraphicIRect rectG {
79 .x = 0,
80 .y = 0,
81 .w = 2232,
82 .h = 3184,
83 };
84 const GraphicIRect rectNeg {
85 .x = -1,
86 .y = -1,
87 .w = -1,
88 .h = -1,
89 };
90 const GraphicIRect rectMax {
91 .x = INT_MAX,
92 .y = INT_MAX,
93 .w = INT_MAX,
94 .h = INT_MAX,
95 };
96 }
97
98 class MyCustomFrameRateLinkerExpectedFpsUpdateCallback : public RSFrameRateLinkerExpectedFpsUpdateCallbackStub {
99 public:
MyCustomFrameRateLinkerExpectedFpsUpdateCallback(const FrameRateLinkerExpectedFpsUpdateCallback & callback)100 explicit MyCustomFrameRateLinkerExpectedFpsUpdateCallback(
101 const FrameRateLinkerExpectedFpsUpdateCallback& callback) : cb_(callback) {}
~MyCustomFrameRateLinkerExpectedFpsUpdateCallback()102 ~MyCustomFrameRateLinkerExpectedFpsUpdateCallback() override {};
103
OnFrameRateLinkerExpectedFpsUpdate(pid_t dstPid,const std::string & xcomponentId,int32_t expectedFps)104 void OnFrameRateLinkerExpectedFpsUpdate(pid_t dstPid, const std::string& xcomponentId, int32_t expectedFps) override
105 {
106 ROSEN_LOGD("MyCustomFrameRateLinkerExpectedFpsUpdateCallback::OnFrameRateLinkerExpectedFpsUpdate called,"
107 " pid=%{public}d, fps=%{public}d", dstPid, expectedFps);
108 if (cb_ != nullptr) {
109 cb_(dstPid, xcomponentId, expectedFps);
110 }
111 }
112
113 private:
114 FrameRateLinkerExpectedFpsUpdateCallback cb_;
115 };
116
117 class HgmFrameRateMgrTest : public HgmTestBase {
118 public:
119 static void SetUpTestCase();
120 static void TearDownTestCase();
121 void SetUp();
122 void TearDown();
123 void InitHgmFrameRateManager(HgmFrameRateManager& frameRateMgr);
124 };
125
SetUpTestCase()126 void HgmFrameRateMgrTest::SetUpTestCase()
127 {
128 HgmTestBase::SetUpTestCase();
129 }
130
TearDownTestCase()131 void HgmFrameRateMgrTest::TearDownTestCase()
132 {
133 HgmTaskHandleThread::Instance().queue_ = std::make_shared<ffrt::queue>(
134 static_cast<ffrt::queue_type>(ffrt_inner_queue_type_t::ffrt_queue_eventhandler_adapter), "HgmTaskHandleThread",
135 ffrt::queue_attr().qos(ffrt::qos_user_interactive));
136 HgmTestBase::TearDownTestCase();
137 }
138
SetUp()139 void HgmFrameRateMgrTest::SetUp()
140 {
141 auto& hgmCore = HgmCore::Instance();
142 hgmCore.hgmFrameRateMgr_ = std::make_unique<HgmFrameRateManager>();
143 if (!HgmTaskHandleThread::Instance().queue_) {
144 HgmTaskHandleThread::Instance().queue_ = std::make_shared<ffrt::queue>(
145 static_cast<ffrt::queue_type>(ffrt_inner_queue_type_t::ffrt_queue_eventhandler_adapter),
146 "HgmTaskHandleThread", ffrt::queue_attr().qos(ffrt::qos_user_interactive));
147 }
148 }
149
TearDown()150 void HgmFrameRateMgrTest::TearDown() {}
151
152 class CustomHgmCallback : public IRemoteStub<RSIHgmConfigChangeCallback> {
153 public:
CustomHgmCallback()154 explicit CustomHgmCallback() {}
~CustomHgmCallback()155 ~CustomHgmCallback() override {};
156
OnHgmConfigChanged(std::shared_ptr<RSHgmConfigData> configData)157 void OnHgmConfigChanged(std::shared_ptr<RSHgmConfigData> configData) override {}
OnHgmRefreshRateModeChanged(int32_t refreshRateModeName)158 void OnHgmRefreshRateModeChanged(int32_t refreshRateModeName) override {}
OnHgmRefreshRateUpdate(int32_t refreshRateUpdate)159 void OnHgmRefreshRateUpdate(int32_t refreshRateUpdate) override {}
160 };
161
InitHgmFrameRateManager(HgmFrameRateManager & frameRateMgr)162 void HgmFrameRateMgrTest::InitHgmFrameRateManager(HgmFrameRateManager& frameRateMgr)
163 {
164 int64_t offset = 0;
165 auto& hgmCore = HgmCore::Instance();
166 auto vsyncGenerator = CreateVSyncGenerator();
167 sptr<Rosen::VSyncController> rsController = new VSyncController(vsyncGenerator, offset);
168 sptr<Rosen::VSyncController> appController = new VSyncController(vsyncGenerator, offset);
169 sptr<VSyncDistributor> appDistributor = new VSyncDistributor(appController, "connection");
170 auto& configData = hgmCore.GetPolicyConfigData();
171 configData->xmlCompatibleMode_ = true;
172 frameRateMgr.curScreenStrategyId_ = "";
173 frameRateMgr.curRefreshRateMode_ = 0;
174 frameRateMgr.Init(nullptr, nullptr, nullptr, nullptr);
175 frameRateMgr.Init(rsController, appController, vsyncGenerator, appDistributor);
176
177 auto strategyConfigs = frameRateMgr.multiAppStrategy_.GetStrategyConfigs();
178 auto screenSetting = frameRateMgr.multiAppStrategy_.GetScreenSetting();
179 frameRateMgr.HandleAppStrategyConfigEvent(DEFAULT_PID, "", {});
180 strategyConfigs[settingStrategyName] = { .min = OLED_NULL_HZ, .max = OLED_120_HZ, .down = OLED_144_HZ,
181 .dynamicMode = DynamicModeType::TOUCH_ENABLED, .pointerMode = PointerModeType::POINTER_ENABLED,
182 .isFactor = true };
183 screenSetting.strategy = settingStrategyName;
184 frameRateMgr.multiAppStrategy_.SetStrategyConfigs(strategyConfigs);
185 frameRateMgr.multiAppStrategy_.SetScreenSetting(screenSetting);
186 for (int i = 0; i < maxSize; ++i) {
187 frameRateMgr.frameRateVoteInfoVec_.emplace_back(i, VoteInfo{});
188 }
189 frameRateMgr.ReportHiSysEvent({ .extInfo = "ON" });
190 }
191
192 /**
193 * @tc.name: HandleGameNodeTest
194 * @tc.desc: Verify the result of HandleGameNodeTest function
195 * @tc.type: FUNC
196 * @tc.require:
197 */
198 HWTEST_F(HgmFrameRateMgrTest, HandleGameNodeTest, Function | SmallTest | Level0)
199 {
200 HgmFrameRateManager frameRateMgr;
201 frameRateMgr.curGameNodeName_ = "gameNode";
202 RSRenderNodeMap nodeMap;
203 RSSurfaceRenderNodeConfig config;
204
205 PART("HandleGameNodeTest") {
206 STEP("1. Test empty surfaceMap") {
207 frameRateMgr.HandleGameNode(nodeMap);
208 ASSERT_EQ(frameRateMgr.isGameNodeOnTree_.load(), false);
209 }
210 STEP("2. Test with a normal surfaceNode on tree") {
211 config.id = 1;
212 config.name = "normalNode";
213 auto normalNode = std::make_shared<RSSurfaceRenderNode>(config);
214 normalNode->SetIsOnTheTree(true);
215 nodeMap.RegisterRenderNode(normalNode);
216 frameRateMgr.HandleGameNode(nodeMap);
217 ASSERT_EQ(frameRateMgr.isGameNodeOnTree_.load(), false);
218 }
219 STEP("3. Test with a game surfaceNode not on tree") {
220 config.id = 2;
221 config.name = "gameNode";
222 config.nodeType = RSSurfaceNodeType::SELF_DRAWING_NODE;
223 auto gameNode1 = std::make_shared<RSSurfaceRenderNode>(config);
224 gameNode1->SetIsOnTheTree(false);
225 nodeMap.RegisterRenderNode(gameNode1);
226 frameRateMgr.HandleGameNode(nodeMap);
227 ASSERT_EQ(frameRateMgr.isGameNodeOnTree_.load(), false);
228 }
229 STEP("4. Test with a game surfaceNode on tree") {
230 config.id = 3;
231 auto gameNode2 = std::make_shared<RSSurfaceRenderNode>(config);
232 gameNode2->SetIsOnTheTree(true);
233 nodeMap.RegisterRenderNode(gameNode2);
234 frameRateMgr.HandleGameNode(nodeMap);
235 ASSERT_EQ(frameRateMgr.isGameNodeOnTree_.load(), true);
236 }
237 STEP("5. Test with a game surfaceNode on tree and other self node on tree") {
238 config.id = 4;
239 config.name = "other";
240 auto otherNode = std::make_shared<RSSurfaceRenderNode>(config);
241 otherNode->SetIsOnTheTree(true);
242 nodeMap.RegisterRenderNode(otherNode);
243 frameRateMgr.HandleGameNode(nodeMap);
244 ASSERT_EQ(frameRateMgr.isGameNodeOnTree_.load(), false);
245 }
246 }
247 sleep(1);
248 }
249
250 /**
251 * @tc.name: HgmUiFrameworkDirtyNodeTest
252 * @tc.desc: Verify the result of HgmUiFrameworkDirtyNodeTest function
253 * @tc.type: FUNC
254 * @tc.require:
255 */
256 HWTEST_F(HgmFrameRateMgrTest, HgmUiFrameworkDirtyNodeTest, Function | SmallTest | Level0)
257 {
258 HgmFrameRateManager frameRateMgr;
259 std::vector<std::weak_ptr<RSRenderNode>> uiFwkDirtyNodes;
260 PART("HgmUiFrameworkDirtyNodeTest") {
261 STEP("1. Test empty uiFwkDirtyNodes") {
262 ASSERT_EQ(uiFwkDirtyNodes.size(), 0);
263 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
264 frameRateMgr.voterTouchEffective_ = true;
265 {
266 std::shared_ptr<RSRenderNode> renderNode1 = std::make_shared<RSRenderNode>(0);
267 uiFwkDirtyNodes.emplace_back(renderNode1);
268 ASSERT_EQ(uiFwkDirtyNodes.size(), 1);
269 }
270 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
271 ASSERT_EQ(uiFwkDirtyNodes.size(), 0);
272 }
273 STEP("2. Test uiFwkDirtyNodes with a clean renderNode") {
274 std::shared_ptr<RSRenderNode> renderNode2 = std::make_shared<RSRenderNode>(0);
275 uiFwkDirtyNodes.emplace_back(renderNode2);
276 ASSERT_EQ(uiFwkDirtyNodes.size(), 1);
277 ASSERT_EQ(renderNode2->IsDirty(), false);
278 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
279 ASSERT_EQ(uiFwkDirtyNodes.size(), 1);
280 }
281 STEP("3. Test uiFwkDirtyNodes with a dirty renderNode") {
282 std::shared_ptr<RSRenderNode> renderNode3 = std::make_shared<RSRenderNode>(0);
283 uiFwkDirtyNodes.emplace_back(renderNode3);
284 ASSERT_EQ(uiFwkDirtyNodes.size(), 2);
285
286 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
287 ASSERT_EQ(uiFwkDirtyNodes.size(), 1);
288
289 renderNode3->SetDirty();
290 ASSERT_EQ(renderNode3->IsDirty(), true);
291 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
292 ASSERT_EQ(uiFwkDirtyNodes.size(), 1);
293 }
294 STEP("4. other branch") {
295 frameRateMgr.surfaceData_.emplace_back(std::tuple<std::string, pid_t, UIFWKType>());
296 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
297 frameRateMgr.frameVoter_.voterGamesEffective_ = true;
298 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
299 frameRateMgr.voterTouchEffective_ = false;
300 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
301 }
302 }
303 sleep(1);
304 }
305
306 /**
307 * @tc.name: ProcessPendingRefreshRate
308 * @tc.desc: Verify the result of ProcessPendingRefreshRate function
309 * @tc.type: FUNC
310 * @tc.require:
311 */
312 HWTEST_F(HgmFrameRateMgrTest, ProcessPendingRefreshRate, Function | SmallTest | Level0)
313 {
314 HgmFrameRateManager frameRateMgr;
315 std::vector<std::weak_ptr<RSRenderNode>> uiFwkDirtyNodes;
316 bool disableSafeVote = true;
317 frameRateMgr.multiAppStrategy_.SetDisableSafeVoteValue(disableSafeVote);
318
319 frameRateMgr.UpdateUIFrameworkDirtyNodes(uiFwkDirtyNodes, 0);
320 FrameRateLinkerMap appFrameRateLinkers;
321 const std::map<uint64_t, int> vRatesMap;
322 frameRateMgr.UniProcessDataForLtpo(currTime, frameRateMgr.rsFrameRateLinker_,
323 appFrameRateLinkers, vRatesMap);
324 auto& hgmCore = HgmCore::Instance();
325 hgmCore.ltpoEnabled_ = false;
326 FrameRateLinkerId id;
327 frameRateMgr.rsFrameRateLinker_ = std::make_shared<RSRenderFrameRateLinker>(id);
328
329 frameRateMgr.appFrameRateLinkers_.clear();
330 frameRateMgr.appFrameRateLinkers_.try_emplace(id, nullptr);
331 frameRateMgr.UpdateSoftVSync(true);
332 frameRateMgr.appFrameRateLinkers_.try_emplace(id, frameRateMgr.rsFrameRateLinker_);
333 frameRateMgr.UpdateSoftVSync(true);
334 frameRateMgr.currRefreshRate_.store(OLED_90_HZ);
335 frameRateMgr.UpdateSoftVSync(true);
336 int64_t vsyncid = 0;
337 uint32_t rsRate = 0;
338 bool isUiDvsyncOn = false;
339 frameRateMgr.pendingRefreshRate_ = nullptr;
340 frameRateMgr.ProcessPendingRefreshRate(currTime, vsyncid, rsRate, isUiDvsyncOn);
341 frameRateMgr.lastPendingConstraintRelativeTime_ = currTime;
342 frameRateMgr.ProcessPendingRefreshRate(currTime, vsyncid, rsRate, isUiDvsyncOn);
343 ASSERT_EQ(hgmCore.pendingConstraintRelativeTime_,
344 frameRateMgr.lastPendingConstraintRelativeTime_);
345 uint32_t pendingRefreshRate = OLED_60_HZ;
346 frameRateMgr.pendingRefreshRate_ = std::make_shared<uint32_t>(pendingRefreshRate);
347 frameRateMgr.ProcessPendingRefreshRate(currTime, vsyncid, rsRate, isUiDvsyncOn);
348 ASSERT_EQ(frameRateMgr.pendingConstraintRelativeTime_, 0);
349 ASSERT_EQ(frameRateMgr.lastPendingRefreshRate_, OLED_60_HZ);
350 frameRateMgr.pendingRefreshRate_ = nullptr;
351 frameRateMgr.ProcessPendingRefreshRate(currTime, vsyncid, rsRate, isUiDvsyncOn);
352 frameRateMgr.voterTouchEffective_ = true;
353 std::string surfaceName = "surface0";
354 size_t oldSize = frameRateMgr.surfaceData_.size();
355 frameRateMgr.UpdateSurfaceTime(surfaceName, pid, UIFWKType::FROM_UNKNOWN);
356 EXPECT_GE(frameRateMgr.surfaceData_.size(), oldSize);
357 }
358
359 /**
360 * @tc.name: HgmConfigCallbackManagerTest001
361 * @tc.desc: Verify the result of HgmConfigCallbackManagerTest001 function
362 * @tc.type: FUNC
363 * @tc.require:
364 */
365 HWTEST_F(HgmFrameRateMgrTest, HgmConfigCallbackManagerTest001, Function | SmallTest | Level0)
366 {
367 sptr<HgmConfigCallbackManager> hccMgr = HgmConfigCallbackManager::GetInstance();
368 PART("HgmConfigCallbackManagerTest") {
369 STEP("1. Callback is nullptr") {
370 sptr<CustomHgmCallback> cb1 = new CustomHgmCallback();
371 hccMgr->RegisterHgmRefreshRateModeChangeCallback(0, nullptr);
372 hccMgr->RegisterHgmRefreshRateModeChangeCallback(1, cb1);
373 }
374 STEP("2. Test SyncHgmConfigChangeCallback without callback") {
375 std::unordered_map<pid_t, sptr<RSIHgmConfigChangeCallback>> emptyCallback;
376 std::swap(hccMgr->animDynamicCfgCallbacks_, emptyCallback);
377 ASSERT_EQ(hccMgr->animDynamicCfgCallbacks_.empty(), true);
378 hccMgr->SyncHgmConfigChangeCallback();
379 }
380 }
381 }
382
383 /**
384 * @tc.name: HgmConfigCallbackManagerTest002
385 * @tc.desc: Verify the result of HgmConfigCallbackManagerTest002 function
386 * @tc.type: FUNC
387 * @tc.require:
388 */
389 HWTEST_F(HgmFrameRateMgrTest, HgmConfigCallbackManagerTest002, Function | SmallTest | Level0)
390 {
391 sptr<HgmConfigCallbackManager> hccMgr = HgmConfigCallbackManager::GetInstance();
392 PART("HgmConfigCallbackManagerTest") {
393 STEP("1. Test SyncCallback function with callback") {
394 sptr<CustomHgmCallback> cb = new CustomHgmCallback();
395 hccMgr->animDynamicCfgCallbacks_[0] = cb;
396 hccMgr->refreshRateModeCallbacks_[0] = cb;
397 hccMgr->SyncHgmConfigChangeCallback();
398 hccMgr->SyncRefreshRateModeChangeCallback(0);
399 hccMgr->RegisterHgmConfigChangeCallback(0, nullptr);
400 auto& hgmCore = HgmCore::Instance();
401 auto& configData = hgmCore.GetPolicyConfigData();
402 configData->pageNameList_.push_back("com.app10");
403 ScreenId id = 0;
404 int32_t mode = 0;
405 sptr<HgmScreen> screen = new HgmScreen(id, mode, screenSize);
406 hgmCore.screenList_.push_back(screen);
407 hccMgr->RegisterHgmConfigChangeCallback(pid, cb);
408 hccMgr->RegisterHgmRefreshRateUpdateCallback(0, nullptr);
409 hccMgr->RegisterHgmRefreshRateUpdateCallback(pid, cb);
410 hccMgr->refreshRateUpdateCallbacks_.try_emplace(0, cb);
411 hccMgr->RegisterHgmRefreshRateUpdateCallback(0, nullptr);
412 hccMgr->RegisterHgmRefreshRateUpdateCallback(pid, cb);
413 hccMgr->SyncHgmConfigChangeCallback();
414 hccMgr->SyncRefreshRateModeChangeCallback(0);
415 hccMgr->refreshRateUpdateCallbacks_ = {
416 {0, nullptr},
417 };
418 hccMgr->SyncRefreshRateUpdateCallback(OLED_60_HZ);
419 ASSERT_EQ(hccMgr->animDynamicCfgCallbacks_.empty(), false);
420 hccMgr->UnRegisterHgmConfigChangeCallback(pid);
421 hccMgr->UnRegisterHgmConfigChangeCallback(0);
422 hccMgr->animDynamicCfgCallbacks_.try_emplace(pid, cb);
423 hccMgr->SyncHgmConfigChangeCallback();
424 hccMgr->refreshRateUpdateCallbacks_.try_emplace(0, cb);
425 hccMgr->SyncRefreshRateUpdateCallback(OLED_60_HZ);
426 hccMgr->SyncHgmConfigChangeCallback();
427 hccMgr->refreshRateUpdateCallbacks_.clear();
428 hccMgr->refreshRateUpdateCallbacks_.try_emplace(0, cb);
429 hccMgr->SyncRefreshRateUpdateCallback(OLED_60_HZ);
430 std::unordered_map<pid_t, std::pair<int32_t, std::string>> foregroundPidAppMap;
431 foregroundPidAppMap.try_emplace(pid, std::pair<int32_t, std::string>{ 0, "com.app10" });
432 hccMgr->SyncHgmConfigChangeCallback(foregroundPidAppMap);
433 ASSERT_EQ(hccMgr->pendingAnimDynamicCfgCallbacks_.find(pid) ==
434 hccMgr->pendingAnimDynamicCfgCallbacks_.end(), true);
435 }
436 }
437 }
438
439 /**
440 * @tc.name: HgmConfigCallbackManagerTest003
441 * @tc.desc: Verify the result of HgmConfigCallbackManagerTest003 function
442 * @tc.type: FUNC
443 * @tc.require:
444 */
445 HWTEST_F(HgmFrameRateMgrTest, HgmConfigCallbackManagerTest003, Function | SmallTest | Level0)
446 {
447 sptr<HgmConfigCallbackManager> hccMgr = HgmConfigCallbackManager::GetInstance();
448 pid_t listenerPid = 3;
449 pid_t dstPid = 3;
450 pid_t dstPid1 = 5;
451 vector<int32_t> expectedFrameRates = { 60, 0 };
452 int32_t invalidRate = -1;
453 int32_t invalidRate1 = -60;
454 std::string idStr = "xcomponentId";
455 const sptr<RSIFrameRateLinkerExpectedFpsUpdateCallback> cb = nullptr;
456 std::unordered_map<pid_t, sptr<RSIFrameRateLinkerExpectedFpsUpdateCallback>> cbMap;
457 cbMap.try_emplace(listenerPid, cb);
458 hccMgr->xcomponentExpectedFrameRateCallbacks_.try_emplace(dstPid, cbMap);
459
460 int32_t fps_ = 30;
461 std::function<void(int32_t, const std::string&, int32_t)> callback = [&fps_](int32_t dstPid,
__anon09d8ed1d0202(int32_t dstPid, const std::string& xcomponentId, int32_t fps) 462 const std::string& xcomponentId, int32_t fps) {
463 fps_ = fps;
464 };
465 std::unordered_map<std::string, int32_t> xcomponentIdMap;
466
467 auto temp = new MyCustomFrameRateLinkerExpectedFpsUpdateCallback(callback);
468 auto cb1 = iface_cast<RSIFrameRateLinkerExpectedFpsUpdateCallback>(temp);
469 for (const auto& expectedFrameRate : expectedFrameRates) {
470 PART("HgmConfigCallbackManagerTest") {
471 STEP("1. Test RegisterXComponentExpectedFrameRateCallback function with callback") {
472 xcomponentIdMap.try_emplace(idStr, expectedFrameRate);
473 hccMgr->xcomponentExpectedFrameRateCallbacks_.clear();
474 cbMap.try_emplace(listenerPid, cb);
475 hccMgr->xcomponentExpectedFrameRateCallbacks_.try_emplace(dstPid1, cbMap);
476 hccMgr->RegisterXComponentExpectedFrameRateCallback(listenerPid, dstPid, cb);
477 hccMgr->xcomponentExpectedFrameRateCallbacks_.try_emplace(dstPid, cbMap);
478 hccMgr->RegisterXComponentExpectedFrameRateCallback(listenerPid, dstPid, cb);
479 hccMgr->xcomponentExpectedFrameRate_.clear();
480 hccMgr->xcomponentExpectedFrameRateCallbacks_.clear();
481 hccMgr->xcomponentExpectedFrameRate_.try_emplace(dstPid1, xcomponentIdMap);
482 hccMgr->RegisterXComponentExpectedFrameRateCallback(listenerPid, dstPid, cb1);
483 ASSERT_EQ(hccMgr->xcomponentExpectedFrameRateCallbacks_[dstPid][listenerPid], cb1);
484 hccMgr->xcomponentExpectedFrameRateCallbacks_.clear();
485 hccMgr->xcomponentExpectedFrameRate_.clear();
486 hccMgr->xcomponentExpectedFrameRate_.try_emplace(dstPid, xcomponentIdMap);
487 hccMgr->RegisterXComponentExpectedFrameRateCallback(listenerPid, dstPid, cb1);
488 ASSERT_EQ(hccMgr->xcomponentExpectedFrameRateCallbacks_[dstPid][listenerPid], cb1);
489 }
490 STEP("2. Test SyncXComponentExpectedFrameRateCallback function with callback") {
491 ASSERT_NE(cb1, nullptr);
492 hccMgr->xcomponentExpectedFrameRateCallbacks_.clear();
493 cbMap.clear();
494 cbMap.try_emplace(listenerPid, cb);
495 hccMgr->xcomponentExpectedFrameRateCallbacks_.try_emplace(dstPid, cbMap);
496 hccMgr->SyncXComponentExpectedFrameRateCallback(dstPid, idStr, expectedFrameRate);
497 hccMgr->xcomponentExpectedFrameRateCallbacks_.clear();
498 cbMap.clear();
499 cbMap.try_emplace(listenerPid, cb1);
500 hccMgr->xcomponentExpectedFrameRateCallbacks_.try_emplace(dstPid, cbMap);
501 hccMgr->SyncXComponentExpectedFrameRateCallback(dstPid, idStr, expectedFrameRate);
502 ASSERT_EQ(hccMgr->xcomponentExpectedFrameRate_[dstPid][idStr], expectedFrameRate);
503 hccMgr->xcomponentExpectedFrameRate_.clear();
504 hccMgr->xcomponentExpectedFrameRateCallbacks_.clear();
505 cbMap.clear();
506 cbMap.try_emplace(listenerPid, cb1);
507 hccMgr->xcomponentExpectedFrameRateCallbacks_.try_emplace(dstPid, cbMap);
508 hccMgr->SyncXComponentExpectedFrameRateCallback(dstPid, idStr, expectedFrameRate);
509 ASSERT_EQ(hccMgr->xcomponentExpectedFrameRate_[dstPid][idStr], expectedFrameRate);
510 }
511 ASSERT_EQ(fps_, expectedFrameRate);
512 hccMgr->SyncXComponentExpectedFrameRateCallback(dstPid, idStr, invalidRate);
513 hccMgr->SyncXComponentExpectedFrameRateCallback(0, idStr, invalidRate);
514 ASSERT_NE(hccMgr->xcomponentExpectedFrameRate_[dstPid][idStr], invalidRate);
515 hccMgr->SyncXComponentExpectedFrameRateCallback(dstPid, idStr, invalidRate1);
516 ASSERT_NE(hccMgr->xcomponentExpectedFrameRate_[dstPid][idStr], invalidRate1);
517
518 hccMgr->xcomponentExpectedFrameRate_.clear();
519 hccMgr->xcomponentExpectedFrameRateCallbacks_.clear();
520 cbMap.clear();
521 cbMap.try_emplace(listenerPid, cb);
522 cbMap.try_emplace(dstPid1, cb1);
523 hccMgr->xcomponentExpectedFrameRateCallbacks_.try_emplace(dstPid, cbMap);
524 hccMgr->SyncXComponentExpectedFrameRateCallback(dstPid, idStr, expectedFrameRate);
525 ASSERT_EQ(hccMgr->xcomponentExpectedFrameRate_[dstPid][idStr], expectedFrameRate);
526 hccMgr->xcomponentExpectedFrameRate_.clear();
527
528 xcomponentIdMap.clear();
529 xcomponentIdMap.try_emplace("xcomponentId1", OLED_30_HZ);
530 hccMgr->xcomponentExpectedFrameRate_.try_emplace(dstPid, xcomponentIdMap);
531 hccMgr->SyncXComponentExpectedFrameRateCallback(dstPid, idStr, expectedFrameRate);
532 }
533 }
534 hccMgr->UnRegisterHgmConfigChangeCallback(dstPid);
535 hccMgr->UnRegisterHgmConfigChangeCallback(dstPid1);
536 }
537
538 /**
539 * @tc.name: HgmConfigCallbackManagerTest004
540 * @tc.desc: Verify the result of HgmConfigCallbackManagerTest004 function
541 * @tc.type: FUNC
542 * @tc.require:
543 */
544 HWTEST_F(HgmFrameRateMgrTest, HgmConfigCallbackManagerTest004, Function | SmallTest | Level0)
545 {
546 int32_t invalidRate = 300;
547 int32_t dstPid = 1;
548 int32_t expectedFrameRate = 60;
549 std::string xcomponentId = "xcomponentId";
550 std::unordered_map<std::string, int32_t> xcomponentIdMap;
551 xcomponentIdMap.try_emplace(xcomponentId, invalidRate);
552 sptr<HgmConfigCallbackManager> hccMgr = HgmConfigCallbackManager::GetInstance();
553 hccMgr->xcomponentExpectedFrameRateCallbacks_.clear();
554 hccMgr->xcomponentExpectedFrameRate_.clear();
555 hccMgr->xcomponentExpectedFrameRate_.try_emplace(dstPid, xcomponentIdMap);
556
557 for (int32_t i = 0; i < 100; ++i) { // 100 : xcomponentIdNums
558 std::string idStr = xcomponentId + std::to_string(i);
559 hccMgr->SyncXComponentExpectedFrameRateCallback(dstPid, idStr, expectedFrameRate);
560 }
561 ASSERT_EQ(hccMgr->xcomponentExpectedFrameRate_[dstPid].size(), 50); // 50 : xcomponentIdNumsMax of one pid
562 }
563
564 /**
565 * @tc.name: MultiThread001
566 * @tc.desc: Verify the result of MultiThread001 function
567 * @tc.type: FUNC
568 * @tc.require:
569 */
570 HWTEST_F(HgmFrameRateMgrTest, MultiThread001, Function | SmallTest | Level0)
571 {
572 HgmFrameRateManager frameRateMgr;
573 auto vsyncGenerator = CreateVSyncGenerator();
574 sptr<Rosen::VSyncController> rsController = new VSyncController(vsyncGenerator, offset0);
575 sptr<Rosen::VSyncController> appController = new VSyncController(vsyncGenerator, offset0);
576 sptr<VSyncDistributor> appDistributor = new VSyncDistributor(appController, "connection");
577 frameRateMgr.Init(rsController, appController, vsyncGenerator, appDistributor);
__anon09d8ed1d0302(bool idleTimerExpired, bool forceUpdate) 578 frameRateMgr.forceUpdateCallback_ = [](bool idleTimerExpired, bool forceUpdate) { return; };
579 auto& touchManager = frameRateMgr.GetTouchManager();
580 touchManager.ChangeState(TouchState::DOWN_STATE);
581 touchManager.ChangeState(TouchState::UP_STATE);
582 usleep(100000); // 100000us
583 ASSERT_EQ(touchManager.GetState(), TouchState::UP_STATE);
584 touchManager.ChangeState(TouchState::IDLE_STATE);
585 usleep(100000); // 100000us
586 ASSERT_EQ(touchManager.GetState(), TouchState::IDLE_STATE);
587 ASSERT_NE(vsyncGenerator, nullptr);
588 ASSERT_NE(rsController, nullptr);
589 ASSERT_NE(appController, nullptr);
590 ASSERT_NE(appDistributor, nullptr);
__anon09d8ed1d0402() 591 HgmTaskHandleThread::Instance().PostTask([&]() {
592 for (int i = 0; i < testThreadNums; i++) {
593 // HandleLightFactorStatus
594 frameRateMgr.HandleLightFactorStatus(i, LightFactorStatus::NORMAL_LOW);
595 frameRateMgr.HandleLightFactorStatus(i, LightFactorStatus::NORMAL_HIGH);
596
597 // HandlePackageEvent
598 frameRateMgr.HandlePackageEvent(i, { pkgName0 });
599 ASSERT_NE(frameRateMgr.multiAppStrategy_.HandlePkgsEvent({ pkgName0 }), EXEC_SUCCESS);
600 frameRateMgr.HandlePackageEvent(i, { pkgName1 });
601 ASSERT_NE(frameRateMgr.multiAppStrategy_.HandlePkgsEvent({ pkgName1 }), EXEC_SUCCESS);
602 frameRateMgr.HandlePackageEvent(i, { pkgName2 });
603 ASSERT_NE(frameRateMgr.multiAppStrategy_.HandlePkgsEvent({ pkgName2 }), EXEC_SUCCESS);
604 frameRateMgr.HandlePackageEvent(i, { pkgName0, pkgName1 });
605 ASSERT_NE(frameRateMgr.multiAppStrategy_.HandlePkgsEvent({ pkgName0, pkgName1 }), EXEC_SUCCESS);
606
607 // HandleRefreshRateEvent
608 frameRateMgr.HandleRefreshRateEvent(i, {});
609
610 // HandleTouchEvent
611 frameRateMgr.HandleTouchEvent(i, TouchStatus::TOUCH_DOWN, touchCnt);
612 frameRateMgr.HandleTouchEvent(i, TouchStatus::TOUCH_UP, touchCnt);
613
614 // HandleRefreshRateMode
615 // param -1、0、1、2、3:refresh rate mode
616 frameRateMgr.HandleRefreshRateMode(-1);
617 frameRateMgr.HandleRefreshRateMode(0);
618 frameRateMgr.HandleRefreshRateMode(1);
619 frameRateMgr.HandleRefreshRateMode(2);
620 frameRateMgr.HandleRefreshRateMode(3);
621
622 // HandleScreenPowerStatus
623 frameRateMgr.HandleScreenPowerStatus(i, ScreenPowerStatus::POWER_STATUS_ON);
624 frameRateMgr.HandleScreenPowerStatus(i, ScreenPowerStatus::POWER_STATUS_OFF);
625 }
626 });
627 sleep(2); // wait for handler task finished
628 HgmTaskHandleThread::Instance().queue_ = nullptr;
629 }
630
631 /**
632 * @tc.name: HandleScreenRectFrameRate
633 * @tc.desc: Verify the result of HandleScreenRectFrameRate function
634 * @tc.type: FUNC
635 * @tc.require:
636 */
637 HWTEST_F(HgmFrameRateMgrTest, HandleScreenRectFrameRate, Function | SmallTest | Level0)
638 {
639 int32_t testThreadNum = 100;
640 auto& hgmCore = HgmCore::Instance();
641 EXPECT_EQ(hgmCore.AddScreen(externalScreenId, 0, screenSize), EXEC_SUCCESS);
642 auto screen = hgmCore.GetScreen(externalScreenId);
643 ASSERT_NE(screen, nullptr);
644 screen->isSelfOwnedScreenFlag_.store(true);
645
646 HgmFrameRateManager frameRateMgr;
__anon09d8ed1d0502() 647 HgmTaskHandleThread::Instance().PostTask([&]() {
648 for (int i = 0; i < testThreadNum; i++) {
649 // HandleScreenRectFrameRate
650 frameRateMgr.HandleScreenRectFrameRate(i, rectF);
651 frameRateMgr.HandleScreenRectFrameRate(i, rectM);
652 frameRateMgr.HandleScreenRectFrameRate(i, rectG);
653 frameRateMgr.HandleScreenRectFrameRate(i, rectNeg);
654 auto& configData = hgmCore.GetPolicyConfigData();
655 configData->virtualDisplayConfigs_.clear();
656 frameRateMgr.HandleScreenRectFrameRate(i, rectMax);
657 EXPECT_EQ(frameRateMgr.curScreenStrategyId_, "LTPO-DEFAULT");
658 }
659 });
660 EXPECT_EQ(hgmCore.RemoveScreen(externalScreenId), EXEC_SUCCESS);
661 sleep(2); // wait for handler task finished
662 }
663
664 /**
665 * @tc.name: UpdateGuaranteedPlanVoteTest
666 * @tc.desc: Verify the result of UpdateGuaranteedPlanVote
667 * @tc.type: FUNC
668 * @tc.require:
669 */
670 HWTEST_F(HgmFrameRateMgrTest, UpdateGuaranteedPlanVoteTest, Function | SmallTest | Level0)
671 {
672 std::unique_ptr<HgmFrameRateManager> mgr = std::make_unique<HgmFrameRateManager>();
673
674 mgr->idleDetector_.SetAppSupportedState(false);
675 mgr->UpdateGuaranteedPlanVote(currTime);
676
677 mgr->idleDetector_.SetAppSupportedState(true);
678 mgr->UpdateGuaranteedPlanVote(currTime);
679
680 mgr->HandleTouchEvent(appPid, TouchStatus::TOUCH_DOWN, touchCount);
681 mgr->HandleTouchEvent(appPid, TouchStatus::TOUCH_UP, touchCount);
682 std::this_thread::sleep_for(std::chrono::milliseconds(delay_110Ms));
683 mgr->UpdateGuaranteedPlanVote(currTime);
684
685 mgr->idleDetector_.bufferFpsMap_["AceAnimato"] = 90;
686 mgr->HandleTouchEvent(appPid, TouchStatus::TOUCH_DOWN, touchCount);
687 mgr->HandleTouchEvent(appPid, TouchStatus::TOUCH_UP, touchCount);
688 std::this_thread::sleep_for(std::chrono::milliseconds(delay_110Ms));
689 mgr->UpdateGuaranteedPlanVote(currTime);
690
691 mgr->idleDetector_.SetAceAnimatorIdleState(false);
692 mgr->HandleTouchEvent(appPid, TouchStatus::TOUCH_DOWN, touchCount);
693 mgr->HandleTouchEvent(appPid, TouchStatus::TOUCH_UP, touchCount);
694 std::this_thread::sleep_for(std::chrono::milliseconds(delay_110Ms));
695 mgr->UpdateGuaranteedPlanVote(currTime);
696 EXPECT_FALSE(mgr->idleDetector_.GetAceAnimatorIdleState());
697 mgr->lastTouchUpExpectFps_ = OLED_90_HZ;
698 EXPECT_EQ(mgr->idleDetector_.GetTouchUpExpectedFPS(), mgr->lastTouchUpExpectFps_);
699 mgr->touchManager_.ChangeState(TouchState::IDLE_STATE);
700 }
701
702 /**
703 * @tc.name: CleanPidCallbackTest
704 * @tc.desc: Verify the result of CleanPidCallbackTest
705 * @tc.type: FUNC
706 * @tc.require:
707 */
708 HWTEST_F(HgmFrameRateMgrTest, CleanPidCallbackTest, Function | SmallTest | Level0)
709 {
710 std::unique_ptr<HgmFrameRateManager> mgr = std::make_unique<HgmFrameRateManager>();
711 int32_t defaultPid = 0;
712 int32_t gamePid = 10024;
713 uint32_t undefinedCallbackType = 0xff;
714 std::string defaultScreenStrategyId = "LTPO-DEFAULT";
715 std::string invalidScreenStrategyId = "DEFAULT-INVALID";
716 auto& hgm = HgmCore::Instance();
717
718 mgr->CleanVote(defaultPid);
719 mgr->cleanPidCallback_[gamePid].insert(CleanPidCallbackType::LIGHT_FACTOR);
720 mgr->cleanPidCallback_[gamePid].insert(CleanPidCallbackType::PACKAGE_EVENT);
721 mgr->cleanPidCallback_[gamePid].insert(CleanPidCallbackType::TOUCH_EVENT);
722 mgr->cleanPidCallback_[gamePid].insert(CleanPidCallbackType::GAMES);
723 mgr->cleanPidCallback_[gamePid].insert(static_cast<CleanPidCallbackType>(undefinedCallbackType));
724 mgr->CleanVote(gamePid);
725 mgr->frameVoter_.pidRecord_.emplace(defaultPid);
726 mgr->CleanVote(gamePid);
727 mgr->frameVoter_.pidRecord_.emplace(gamePid);
728 mgr->CleanVote(gamePid);
729 EXPECT_EQ(mgr->frameVoter_.pidRecord_.find(gamePid), mgr->frameVoter_.pidRecord_.end());
730
731 if (hgm.mPolicyConfigData_ == nullptr) {
732 return;
733 }
734 auto screenSetting = mgr->multiAppStrategy_.GetScreenSetting();
735 screenSetting.sceneList.insert(make_pair(testScene, PolicyConfigData::SceneConfig{ "1", "1" }));
736 screenSetting.gameSceneList.insert(make_pair(testScene, "1"));
737 screenSetting.ancoSceneList.insert(make_pair(testScene, PolicyConfigData::SceneConfig{ "1", "1" }));
738 mgr->multiAppStrategy_.SetScreenSetting(screenSetting);
739 EventInfo eventInfo2 = { .eventName = "VOTER_SCENE", .eventStatus = true, .description = testScene };
740 mgr->HandleRefreshRateEvent(0, eventInfo2);
741 EventInfo eventInfo3 = { .eventName = "ENERGY_CONSUMPTION_ASSURANCE", .eventStatus = true,
742 .description = "DRAG_SCENE:0"};
743 mgr->HandleRefreshRateEvent(0, eventInfo3);
744 EventInfo eventInfo4 = { .eventName = "ENERGY_CONSUMPTION_ASSURANCE", .eventStatus = false,
745 .description = "DRAG_SCENE:0"};
746 mgr->HandleRefreshRateEvent(0, eventInfo4);
747 sleep(1);
748 }
749
750 /**
751 * @tc.name: HandleEventTest
752 * @tc.desc: Verify the result of HandleEventTest
753 * @tc.type: FUNC
754 * @tc.require:
755 */
756 HWTEST_F(HgmFrameRateMgrTest, HandleEventTest, Function | SmallTest | Level0)
757 {
758 std::string pkg0 = "com.pkg.other:0:-1";
759 std::string pkg1 = "com.pkg.other:1:-1";
760
761 std::unique_ptr<HgmFrameRateManager> mgr = std::make_unique<HgmFrameRateManager>();
762 auto& hgm = HgmCore::Instance();
763 mgr->DeliverRefreshRateVote({ "VOTER_GAMES", 120, 90, 0 }, true);
764
765 mgr->GetExpectedFrameRate(static_cast<RSPropertyUnit>(RSPropertyUnit::PIXEL_POSITION), 100.f, 0, 0);
766 mgr->GetExpectedFrameRate(static_cast<RSPropertyUnit>(0xff), 100.f, 0, 0);
767 if (hgm.mPolicyConfigData_ == nullptr) {
768 return;
769 }
770 EXPECT_NE(hgm.mPolicyConfigData_, nullptr);
771 mgr->GetPreferredFps("aaa", 100.f, 100.f, 100.f);
772 mgr->GetPreferredFps("aaa", 100.f, 0.f, 0.f);
773
774 std::shared_ptr<PolicyConfigData> cachedPolicyConfigData = nullptr;
775 std::swap(hgm.mPolicyConfigData_, cachedPolicyConfigData);
776 EXPECT_EQ(hgm.mPolicyConfigData_, nullptr);
777 ASSERT_EQ(nullptr, hgm.GetPolicyConfigData());
778 mgr->GetPreferredFps("aaa", 100.f, 0.f, 0.f);
779
780 EventInfo eventInfo = { .eventName = "VOTER_GAMES", .eventStatus = false,
781 .description = pkg0,
782 };
783 mgr->HandleRefreshRateEvent(0, eventInfo);
784 mgr->HandleGamesEvent(0, eventInfo);
785 eventInfo.eventStatus = true;
786 mgr->HandleGamesEvent(0, eventInfo);
787 eventInfo.description = pkg1;
788 mgr->HandleGamesEvent(0, eventInfo);
789 mgr->HandleGamesEvent(1, eventInfo);
790 mgr->HandleIdleEvent(true);
791 mgr->HandleIdleEvent(false);
792 auto screenSetting = mgr->multiAppStrategy_.GetScreenSetting();
793 screenSetting.sceneList.insert(make_pair(testScene, PolicyConfigData::SceneConfig{ "1", "1" }));
794 screenSetting.gameSceneList.insert(make_pair(testScene, "1"));
795 screenSetting.ancoSceneList.insert(make_pair(testScene, PolicyConfigData::SceneConfig{ "1", "1" }));
796 mgr->multiAppStrategy_.SetScreenSetting(screenSetting);
797 EventInfo eventInfo2 = { .eventName = "VOTER_SCENE", .eventStatus = true, .description = testScene };
798 mgr->HandleRefreshRateEvent(0, eventInfo2);
799 eventInfo2.eventStatus = false;
800 mgr->HandleRefreshRateEvent(0, eventInfo2);
801
802 std::swap(hgm.mPolicyConfigData_, cachedPolicyConfigData);
803 EXPECT_NE(hgm.mPolicyConfigData_, nullptr);
804 eventInfo2.eventName = "VOTER_VIDEO_CALL";
805 mgr->HandleRefreshRateEvent(0, eventInfo2);
806 eventInfo2.eventName = "VOTER_VIRTUALDISPLAY";
807 mgr->HandleRefreshRateEvent(0, eventInfo2);
808 eventInfo2.eventName = "VOTER_MULTISELFOWNEDSCREEN";
809 mgr->HandleRefreshRateEvent(0, eventInfo2);
810 }
811
812 /**
813 * @tc.name: ProcessRefreshRateVoteTest
814 * @tc.desc: Verify the result of ProcessRefreshRateVoteTest
815 * @tc.type: FUNC
816 * @tc.require:
817 */
818 HWTEST_F(HgmFrameRateMgrTest, ProcessRefreshRateVoteTest, Function | SmallTest | Level0)
819 {
820 HgmFrameRateManager mgr;
821 VoteInfo resultVoteInfo;
822 VoteRange voteRange = { OLED_MIN_HZ, OLED_MAX_HZ };
823 bool voterGamesEffective = false;
824 auto voterIter = std::find(mgr.frameVoter_.voters_.begin(), mgr.frameVoter_.voters_.end(), "VOTER_GAMES");
825 mgr.frameVoter_.ProcessVoteIter(voterIter, resultVoteInfo, voteRange, voterGamesEffective);
826 mgr.DeliverRefreshRateVote({ "VOTER_GAMES", OLED_120_HZ, OLED_90_HZ, OLED_NULL_HZ }, true);
827 mgr.DeliverRefreshRateVote({ "VOTER_THERMAL", OLED_120_HZ, OLED_90_HZ, OLED_NULL_HZ }, true);
828 mgr.DeliverRefreshRateVote({ "VOTER_MULTISELFOWNEDSCREEN", OLED_120_HZ, OLED_90_HZ, OLED_NULL_HZ }, true);
829 auto screenSetting = mgr.multiAppStrategy_.GetScreenSetting();
830 screenSetting.sceneList.insert(make_pair(testScene, PolicyConfigData::SceneConfig{ "1", "1" }));
831 screenSetting.gameSceneList.insert(make_pair(testScene, "1"));
832 screenSetting.ancoSceneList.insert(make_pair(testScene, PolicyConfigData::SceneConfig{ "1", "1" }));
833 mgr.multiAppStrategy_.SetScreenSetting(screenSetting);
834 EventInfo eventInfo2 = { .eventName = "VOTER_SCENE", .eventStatus = true, .description = testScene };
835 mgr.HandleRefreshRateEvent(0, eventInfo2);
836 mgr.DeliverRefreshRateVote({ "VOTER_ANCO", OLED_120_HZ, OLED_90_HZ, OLED_60_HZ }, true);
837 auto resVoteInfo = mgr.ProcessRefreshRateVote();
838 EXPECT_EQ(resVoteInfo.min, OLED_MIN_HZ);
839 mgr.frameVoter_.voters_.push_back("VOTER_ANCO");
840 auto voterIter1 = std::find(mgr.frameVoter_.voters_.begin(), mgr.frameVoter_.voters_.end(), "VOTER_ANCO");
841 EXPECT_FALSE(mgr.frameVoter_.ProcessVoteIter(voterIter1, resultVoteInfo, voteRange, voterGamesEffective));
842 mgr.frameVoter_.voters_.push_back("VOTER_VIDEO");
843 voterIter1 = std::find(mgr.frameVoter_.voters_.begin(), mgr.frameVoter_.voters_.end(), "VOTER_VIDEO");
844 EXPECT_FALSE(mgr.frameVoter_.ProcessVoteIter(voterIter1, resultVoteInfo, voteRange, voterGamesEffective));
845 }
846
847 /**
848 * @tc.name: ProcessRefreshRateVoteTest2
849 * @tc.desc: Verify the result of ProcessRefreshRateVote when idle 30 enabled
850 * @tc.type: FUNC
851 * @tc.require:
852 */
853 HWTEST_F(HgmFrameRateMgrTest, ProcessRefreshRateVoteTest2, Function | SmallTest | Level0)
854 {
855 HgmFrameRateManager frameRateMgr;
856 VoteRange voteRange = { OLED_MIN_HZ, OLED_MAX_HZ };
857 frameRateMgr.DeliverRefreshRateVote({ "VOTER_PACKAGES", OLED_60_HZ, OLED_120_HZ, 0 }, true);
858 frameRateMgr.DeliverRefreshRateVote({ "VOTER_LTPO", OLED_120_HZ, OLED_120_HZ, 0 }, true);
859 frameRateMgr.DeliverRefreshRateVote({ "VOTER_IDLE", OLED_30_HZ, OLED_30_HZ, 0 }, true);
860 auto resVoteInfo = frameRateMgr.ProcessRefreshRateVote();
861 EXPECT_EQ(resVoteInfo.min, OLED_120_HZ);
862 frameRateMgr.DeliverRefreshRateVote({ "VOTER_LTPO", OLED_120_HZ, OLED_120_HZ, 0 }, false);
863 frameRateMgr.DeliverRefreshRateVote({ "VOTER_LTPO", OLED_60_HZ, OLED_60_HZ, 0 }, true);
864 resVoteInfo = frameRateMgr.ProcessRefreshRateVote();
865 EXPECT_EQ(resVoteInfo.min, OLED_60_HZ);
866 EXPECT_EQ(resVoteInfo.max, OLED_60_HZ);
867 frameRateMgr.DeliverRefreshRateVote({ "VOTER_LTPO", OLED_60_HZ, OLED_60_HZ, 0 }, false);
868 resVoteInfo = frameRateMgr.ProcessRefreshRateVote();
869 EXPECT_EQ(resVoteInfo.min, OLED_60_HZ);
870 EXPECT_EQ(resVoteInfo.max, OLED_60_HZ);
871 frameRateMgr.DeliverRefreshRateVote({ "VOTER_PACKAGES", OLED_60_HZ, OLED_120_HZ, 0 }, false);
872 frameRateMgr.DeliverRefreshRateVote({ "VOTER_PACKAGES", OLED_30_HZ, OLED_120_HZ, 0 }, true);
873 resVoteInfo = frameRateMgr.ProcessRefreshRateVote();
874 EXPECT_EQ(resVoteInfo.max, OLED_30_HZ);
875 frameRateMgr.controller_ = std::make_shared<HgmVSyncGeneratorController>(nullptr, nullptr, nullptr);
876 resVoteInfo = frameRateMgr.ProcessRefreshRateVote();
877 sleep(1); // wait for handler task finished
878 }
879
880 /**
881 * @tc.name: SetAceAnimatorVoteTest
882 * @tc.desc: Verify the result of SetAceAnimatorVoteTest
883 * @tc.type: FUNC
884 * @tc.require:
885 */
886 HWTEST_F(HgmFrameRateMgrTest, SetAceAnimatorVoteTest, Function | SmallTest | Level0)
887 {
888 HgmFrameRateManager frameRateMgr;
889 frameRateMgr.SetAceAnimatorVote(nullptr);
890 std::shared_ptr<RSRenderFrameRateLinker> linker = std::make_shared<RSRenderFrameRateLinker>();
891 ASSERT_NE(linker, nullptr);
892 frameRateMgr.SetAceAnimatorVote(linker);
893 linker->SetAnimatorExpectedFrameRate(OLED_60_HZ);
894 frameRateMgr.SetAceAnimatorVote(linker);
895 }
896
897 /**
898 * @tc.name: HgmSimpleTimerTest
899 * @tc.desc: Verify the result of HgmSimpleTimerTest
900 * @tc.type: FUNC
901 * @tc.require:
902 */
903 HWTEST_F(HgmFrameRateMgrTest, HgmSimpleTimerTest, Function | SmallTest | Level0)
904 {
905 auto timer = HgmSimpleTimer("HgmSimpleTimer", std::chrono::milliseconds(delay_60Ms), nullptr, nullptr);
906 ASSERT_EQ(timer.name_, "HgmSimpleTimer");
907 ASSERT_EQ(timer.interval_.load(), std::chrono::milliseconds(delay_60Ms));
908 ASSERT_EQ(timer.startCallback_, nullptr);
909 ASSERT_EQ(timer.expiredCallback_, nullptr);
910 timer.Start();
911 timer.Reset();
912 timer.Stop();
913 sleep(1); // wait for timer stop
914 }
915
916 /**
917 * @tc.name: FrameRateReportTest
918 * @tc.desc: Verify the result of FrameRateReportTest
919 * @tc.type: FUNC
920 * @tc.require:
921 */
922 HWTEST_F(HgmFrameRateMgrTest, FrameRateReportTest, Function | SmallTest | Level0)
923 {
924 HgmFrameRateManager mgr;
925 mgr.FrameRateReport();
926 mgr.curRefreshRateMode_ = HGM_REFRESHRATE_MODE_HIGH;
927 mgr.FrameRateReport();
928 EXPECT_EQ(mgr.schedulePreferredFpsChange_, false);
929 mgr.schedulePreferredFps_ = OLED_60_HZ;
930 mgr.currRefreshRate_ = OLED_60_HZ;
931 mgr.FrameRateReport();
932 mgr.currRefreshRate_ = OLED_90_HZ;
933 mgr.FrameRateReport();
934 mgr.curRefreshRateMode_ = 0;
935 mgr.schedulePreferredFps_ = 0;
936 mgr.schedulePreferredFpsChange_ = true;
937 mgr.FrameRateReport();
938 EXPECT_EQ(mgr.schedulePreferredFpsChange_, false);
939 }
940
941 /**
942 * @tc.name: HandleFrameRateChangeForLTPO
943 * @tc.desc: Verify the result of HandleFrameRateChangeForLTPO
944 * @tc.type: FUNC
945 * @tc.require:
946 */
947 HWTEST_F(HgmFrameRateMgrTest, HandleFrameRateChangeForLTPO, Function | SmallTest | Level0)
948 {
949 auto& hgmCore = HgmCore::Instance();
950 auto frameRateMgr = std::make_unique<HgmFrameRateManager>();
951 hgmCore.SetPendingScreenRefreshRate(OLED_30_HZ);
952 frameRateMgr->currRefreshRate_ = OLED_120_HZ;
953 hgmCore.lowRateToHighQuickSwitch_.store(false);
954 frameRateMgr->HandleFrameRateChangeForLTPO(0, false, true);
955 hgmCore.lowRateToHighQuickSwitch_.store(true);
956 frameRateMgr->HandleFrameRateChangeForLTPO(0, false, true);
957 frameRateMgr->forceUpdateCallback_ = nullptr;
958 frameRateMgr->HandleFrameRateChangeForLTPO(0, false, true);
__anon09d8ed1d0602(bool idleTimerExpired, bool forceUpdate) 959 frameRateMgr->forceUpdateCallback_ = [](bool idleTimerExpired, bool forceUpdate) { return; };
960 frameRateMgr->HandleFrameRateChangeForLTPO(0, false, true);
961 EXPECT_EQ(frameRateMgr->GetPreferredFps("aaa", errorVelocity, 0, 0), 0);
962 hgmCore.lowRateToHighQuickSwitch_.store(true);
963 VSyncController* rsController;
964 VSyncController* appController;
965 VSyncGenerator* vsyncGenerator;
966 frameRateMgr->controller_ = std::make_shared<HgmVSyncGeneratorController>(rsController,
967 appController, vsyncGenerator);
968 frameRateMgr->HandleFrameRateChangeForLTPO(0, false, true);
969 sleep(1);
970 }
971
972 /**
973 * @tc.name: DVSyncTaskProcess
974 * @tc.desc: Verify the result of DVSyncTaskProcess
975 * @tc.type: FUNC
976 * @tc.require: issueIBX8OW
977 */
978 HWTEST_F(HgmFrameRateMgrTest, DVSyncTaskProcessor, Function | SmallTest | Level0)
979 {
980 auto& hgmCore = HgmCore::Instance();
981 auto frameRateMgr = std::make_unique<HgmFrameRateManager>();
982 hgmCore.SetPendingScreenRefreshRate(OLED_144_HZ);
983 auto lastRefreshRate = hgmCore.GetPendingScreenRefreshRate();
984 frameRateMgr->currRefreshRate_ = OLED_120_HZ;
985 VSyncController* rsController = nullptr;
986 VSyncController* appController = nullptr;
987 VSyncGenerator* vsyncGenerator = nullptr;
988 frameRateMgr->controller_ = std::make_shared<HgmVSyncGeneratorController>(rsController,
989 appController, vsyncGenerator);
990 ASSERT_NE(frameRateMgr->controller_, nullptr);
991 int64_t delayTime = 10;
992 uint64_t targetTime = 0;
993 std::vector<std::pair<FrameRateLinkerId, uint32_t>> appChangeData;
994 frameRateMgr->DVSyncTaskProcessor(delayTime, targetTime, appChangeData, OLED_30_HZ);
995 sleep(1);
996 }
997
998 /**
999 * @tc.name: GetLowBrightVec
1000 * @tc.desc: Verify the result of GetLowBrightVec
1001 * @tc.type: FUNC
1002 * @tc.require:
1003 */
1004 HWTEST_F(HgmFrameRateMgrTest, GetLowBrightVec, Function | SmallTest | Level0)
1005 {
1006 HgmFrameRateManager mgr;
1007 std::shared_ptr<PolicyConfigData> configData = std::make_shared<PolicyConfigData>();
1008
1009 std::vector<std::string> screenConfigs = {"LTPO-DEFAULT", "LTPO-internal", "LTPO-external"};
1010 PolicyConfigData::SupportedModeConfig supportedMode = {{ "LowBright", {} }};
1011 PolicyConfigData::SupportedModeConfig supportedMode1 = {{ "LowBright", { OLED_30_HZ, OLED_60_HZ, OLED_120_HZ } }};
1012 PolicyConfigData::SupportedModeConfig supportedMode2 = {{ "LowBright", { OLED_MIN_HZ } }};
1013 for (const auto& screenConfig : screenConfigs) {
1014 if (configData->screenStrategyConfigs_.find(screenConfig) == configData->screenStrategyConfigs_.end()) {
1015 continue;
1016 }
1017 configData->supportedModeConfigs_[screenConfig] = supportedMode;
1018 mgr.GetLowBrightVec(configData);
1019 ASSERT_EQ(mgr.isAmbientEffect_, false);
1020 ASSERT_TRUE(mgr.lowBrightVec_.empty());
1021
1022 configData->supportedModeConfigs_[screenConfig].clear();
1023 configData->supportedModeConfigs_[screenConfig] = supportedMode1;
1024 mgr.GetLowBrightVec(configData);
1025 ASSERT_EQ(mgr.isAmbientEffect_, true);
1026 ASSERT_TRUE(!mgr.lowBrightVec_.empty());
1027
1028 configData->supportedModeConfigs_[screenConfig].clear();
1029 configData->supportedModeConfigs_[screenConfig] = supportedMode2;
1030 mgr.GetLowBrightVec(configData);
1031 ASSERT_EQ(mgr.isAmbientEffect_, false);
1032 ASSERT_TRUE(mgr.lowBrightVec_.empty());
1033 }
1034 }
1035
1036 /**
1037 * @tc.name: GetAncoLowBrightVec
1038 * @tc.desc: Verify the result of GetAncoLowBrightVec
1039 * @tc.type: FUNC
1040 * @tc.require:
1041 */
1042 HWTEST_F(HgmFrameRateMgrTest, GetAncoLowBrightVec, Function | SmallTest | Level0)
1043 {
1044 HgmFrameRateManager mgr;
1045 std::shared_ptr<PolicyConfigData> configData = std::make_shared<PolicyConfigData>();
1046
1047 std::vector<std::string> screenConfigs = { "LTPO-DEFAULT", "LTPO-internal", "LTPO-external" };
1048 PolicyConfigData::SupportedModeConfig supportedMode = {{ "AncoLowBright", {} }};
1049 PolicyConfigData::SupportedModeConfig supportedMode1 = {{ "AncoLowBright", { OLED_90_HZ } }};
1050 for (const auto& screenConfig : screenConfigs) {
1051 if (configData->screenStrategyConfigs_.find(screenConfig) == configData->screenStrategyConfigs_.end()) {
1052 continue;
1053 }
1054 configData->supportedModeConfigs_[screenConfig] = supportedMode;
1055 mgr.GetAncoLowBrightVec(configData);
1056 ASSERT_TRUE(mgr.ancoLowBrightVec_.empty());
1057
1058 configData->supportedModeConfigs_[screenConfig].clear();
1059 configData->supportedModeConfigs_[screenConfig] = supportedMode1;
1060 mgr.GetAncoLowBrightVec(configData);
1061 ASSERT_TRUE(!mgr.ancoLowBrightVec_.empty());
1062 }
1063 }
1064
1065 /**
1066 * @tc.name: CheckAncoVoterStatus
1067 * @tc.desc: Verify the result of CheckAncoVoterStatus
1068 * @tc.type: FUNC
1069 * @tc.require:
1070 */
1071 HWTEST_F(HgmFrameRateMgrTest, CheckAncoVoterStatus, Function | SmallTest | Level0)
1072 {
1073 HgmFrameRateManager mgr;
1074 struct AncoVoterStatusTestParams {
1075 LightFactorStatus ambientStatus;
1076 bool isLtpo;
1077 bool isAmbientEffect;
1078 std::vector<uint32_t> ancoLowBrightVec;
1079 std::string voteRecordKey;
1080 std::vector<VoteInfo> voteRecordFirst;
1081 bool voteRecordSecond;
1082 };
1083
__anon09d8ed1d0702(AncoVoterStatusTestParams params, bool expected) 1084 auto testParams = [&mgr](AncoVoterStatusTestParams params, bool expected) {
1085 mgr.isAmbientStatus_ = params.ambientStatus;
1086 mgr.isLtpo_ = params.isLtpo;
1087 mgr.isAmbientEffect_ = params.isAmbientEffect;
1088 mgr.ancoLowBrightVec_ = params.ancoLowBrightVec;
1089 mgr.frameVoter_.voteRecord_[params.voteRecordKey] =
1090 std::make_pair(params.voteRecordFirst, params.voteRecordSecond);
1091 EXPECT_EQ(mgr.CheckAncoVoterStatus(), expected);
1092 mgr.frameVoter_.voteRecord_.clear();
1093 };
1094
1095 testParams({LightFactorStatus::NORMAL_LOW, true, true, {OLED_90_HZ},
1096 "VOTER_ANCO", {{ .voterName = "VOTER_ANCO" }}, true}, true);
1097 testParams({LightFactorStatus::NORMAL_HIGH, true, true, {OLED_90_HZ},
1098 "VOTER_ANCO", {{ .voterName = "VOTER_ANCO" }}, true}, false);
1099 testParams({LightFactorStatus::NORMAL_LOW, false, true, {OLED_90_HZ},
1100 "VOTER_ANCO", {{ .voterName = "VOTER_ANCO" }}, true}, false);
1101 testParams({LightFactorStatus::NORMAL_LOW, true, false, {OLED_90_HZ},
1102 "VOTER_ANCO", {{ .voterName = "VOTER_ANCO" }}, true}, false);
1103 testParams({LightFactorStatus::NORMAL_LOW, true, true, {},
1104 "VOTER_ANCO", {{ .voterName = "VOTER_ANCO" }}, true}, false);
1105 testParams({LightFactorStatus::NORMAL_LOW, true, true, {OLED_90_HZ},
1106 "VOTER_LTPO", {{ .voterName = "VOTER_LTPO" }}, true}, false);
1107 testParams({LightFactorStatus::NORMAL_LOW, true, true, {OLED_90_HZ},
1108 "VOTER_ANCO", {}, true}, false);
1109 testParams({LightFactorStatus::NORMAL_LOW, true, true, {OLED_90_HZ},
1110 "VOTER_ANCO", {{ .voterName = "VOTER_ANCO" }}, false}, false);
1111 }
1112
1113 /**
1114 * @tc.name: SetTimeoutParamsFromConfig
1115 * @tc.desc: Verify the result of SetTimeoutParamsFromConfig
1116 * @tc.type: FUNC
1117 * @tc.require:
1118 */
1119 HWTEST_F(HgmFrameRateMgrTest, SetTimeoutParamsFromConfig, Function | SmallTest | Level0)
1120 {
1121 HgmFrameRateManager mgr;
1122 std::shared_ptr<PolicyConfigData> configData = std::make_shared<PolicyConfigData>();
1123
1124 auto time1 = mgr.touchManager_.upTimeoutTimer_.interval_.load();
1125 auto time2 = mgr.touchManager_.rsIdleTimeoutTimer_.interval_.load();
1126 ASSERT_EQ(time1, std::chrono::milliseconds(3000));
1127 ASSERT_EQ(time2, std::chrono::milliseconds(600));
1128
1129 int32_t upTimeoutMs = 2000;
1130 int32_t rsIdleTimeoutMs = 300;
1131 configData->timeoutStrategyConfig_["up_timeout_ms"] = "2000";
1132 configData->timeoutStrategyConfig_["rs_idle_timeout_ms"] = "300";
1133
1134 mgr.SetTimeoutParamsFromConfig(configData);
1135 auto time3 = mgr.touchManager_.upTimeoutTimer_.interval_.load();
1136 auto time4 = mgr.touchManager_.rsIdleTimeoutTimer_.interval_.load();
1137 ASSERT_EQ(time3, std::chrono::milliseconds(upTimeoutMs));
1138 ASSERT_EQ(time4, std::chrono::milliseconds(rsIdleTimeoutMs));
1139 }
1140
1141 /**
1142 * @tc.name: GetStylusVec
1143 * @tc.desc: Verify the result of GetStylusVec
1144 * @tc.type: FUNC
1145 * @tc.require:
1146 */
1147 HWTEST_F(HgmFrameRateMgrTest, GetStylusVec, Function | SmallTest | Level0)
1148 {
1149 HgmFrameRateManager mgr;
1150 std::shared_ptr<PolicyConfigData> configData = std::make_shared<PolicyConfigData>();
1151 PolicyConfigData::SupportedModeConfig supportedMode = {{ "test", { OLED_60_HZ, OLED_120_HZ } }};
1152 PolicyConfigData::SupportedModeConfig supportedMode1 = {{ "StylusPen", { OLED_60_HZ, OLED_120_HZ } }};
1153 configData->supportedModeConfigs_["LTPO-DEFAULT"] = supportedMode;
1154 configData->supportedModeConfigs_["LTPS-DEFAULT"] = supportedMode1;
1155
1156 std::vector<std::string> screenConfigs = { "LTPO-DEFAULT", "LTPS-DEFAULT" };
1157 for (const auto& screenConfig : screenConfigs) {
1158 mgr.curScreenStrategyId_ = screenConfig;
1159
1160 auto iter = configData->supportedModeConfigs_.find(screenConfig);
1161 if (iter == configData-> supportedModeConfigs_.end()) {
1162 continue;
1163 }
1164
1165 auto& supportedModeConfig = iter->second;
1166 auto it = supportedModeConfig.find("StylusPen");
1167 if (it == supportedModeConfig.end()) {
1168 continue;
1169 }
1170
1171 supportedModeConfig["StylusPen"].clear();
1172 mgr.GetStylusVec(configData);
1173 ASSERT_TRUE(mgr.stylusVec_.empty());
1174
1175 std::vector<uint32_t> expectedVec = { OLED_60_HZ, OLED_120_HZ };
1176 supportedModeConfig["StylusPen"] = expectedVec;
1177 ASSERT_NO_FATAL_FAILURE({mgr.GetStylusVec(configData);});
1178 }
1179 }
1180
1181 /**
1182 * @tc.name: HandleScreenPowerStatus
1183 * @tc.desc: Verify the result of HandleScreenPowerStatus
1184 * @tc.type: FUNC
1185 * @tc.require:
1186 */
1187 HWTEST_F(HgmFrameRateMgrTest, HandleScreenPowerStatus, Function | SmallTest | Level0)
1188 {
1189 ScreenId extraScreenId = 1;
1190 auto& hgmCore = HgmCore::Instance();
1191 auto frameRateMgr = hgmCore.GetFrameRateMgr();
1192 auto configData = hgmCore.GetPolicyConfigData();
1193 if (configData == nullptr || frameRateMgr == nullptr) {
1194 return;
1195 }
1196 // init
1197 configData->screenStrategyConfigs_["screen0_LTPS"] = "LTPS-DEFAULT";
1198 configData->screenStrategyConfigs_["screen0_LTPO"] = "LTPO-DEFAULT";
1199 configData->screenStrategyConfigs_["screen5_LTPS"] = "LTPS-DEFAULT";
1200 configData->screenStrategyConfigs_["screen5_LTPO"] = "LTPO-DEFAULT";
1201 EXPECT_EQ(hgmCore.AddScreen(externalScreenId, 0, screenSize), EXEC_SUCCESS);
1202 EXPECT_EQ(hgmCore.AddScreen(internalScreenId, 0, screenSize), EXEC_SUCCESS);
1203
1204 // fold -> expand -> fold
1205 frameRateMgr->curScreenStrategyId_.clear();
1206 frameRateMgr->HandleScreenPowerStatus(internalScreenId, ScreenPowerStatus::POWER_STATUS_SUSPEND);
1207 frameRateMgr->HandleScreenPowerStatus(externalScreenId, ScreenPowerStatus::POWER_STATUS_ON);
1208 EXPECT_EQ(frameRateMgr->curScreenId_, externalScreenId);
1209 EXPECT_EQ(hgmCore.AddScreen(extraScreenId, 0, screenSize), EXEC_SUCCESS);
1210 EXPECT_EQ(frameRateMgr->curScreenId_, externalScreenId);
1211 EXPECT_EQ(hgmCore.RemoveScreen(extraScreenId), EXEC_SUCCESS);
1212 EXPECT_EQ(frameRateMgr->curScreenId_, externalScreenId);
1213
1214 EXPECT_EQ(hgmCore.AddScreen(extraScreenId, 0, screenSize), EXEC_SUCCESS);
1215 frameRateMgr->HandleScreenPowerStatus(externalScreenId, ScreenPowerStatus::POWER_STATUS_SUSPEND);
1216 frameRateMgr->HandleScreenPowerStatus(internalScreenId, ScreenPowerStatus::POWER_STATUS_ON);
1217 EXPECT_EQ(frameRateMgr->curScreenId_, internalScreenId);
1218 EXPECT_EQ(hgmCore.RemoveScreen(extraScreenId), EXEC_SUCCESS);
1219 EXPECT_EQ(frameRateMgr->curScreenId_, internalScreenId);
1220
1221 EXPECT_EQ(hgmCore.AddScreen(extraScreenId, 0, screenSize), EXEC_SUCCESS);
1222 EXPECT_EQ(frameRateMgr->curScreenId_, internalScreenId);
1223 EXPECT_EQ(hgmCore.RemoveScreen(extraScreenId), EXEC_SUCCESS);
1224
1225 EXPECT_EQ(hgmCore.AddScreen(extraScreenId, 0, screenSize), EXEC_SUCCESS);
1226 frameRateMgr->HandleScreenPowerStatus(internalScreenId, ScreenPowerStatus::POWER_STATUS_SUSPEND);
1227 frameRateMgr->HandleScreenPowerStatus(externalScreenId, ScreenPowerStatus::POWER_STATUS_ON);
1228 EXPECT_EQ(frameRateMgr->curScreenId_, externalScreenId);
1229 EXPECT_EQ(hgmCore.RemoveScreen(extraScreenId), EXEC_SUCCESS);
1230 EXPECT_EQ(frameRateMgr->curScreenId_, externalScreenId);
1231
1232 // expand -> multiScreen -> expand
1233 frameRateMgr->HandleScreenPowerStatus(externalScreenId, ScreenPowerStatus::POWER_STATUS_SUSPEND);
1234 frameRateMgr->HandleScreenPowerStatus(internalScreenId, ScreenPowerStatus::POWER_STATUS_ON);
1235 EXPECT_EQ(frameRateMgr->curScreenId_, internalScreenId);
1236
1237 hgmCore.SetMultiSelfOwnedScreenEnable(true);
1238 frameRateMgr->HandleScreenPowerStatus(externalScreenId, ScreenPowerStatus::POWER_STATUS_ON);
1239 EXPECT_EQ(frameRateMgr->curScreenId_, internalScreenId);
1240
1241 hgmCore.SetMultiSelfOwnedScreenEnable(false);
1242 frameRateMgr->HandleScreenPowerStatus(externalScreenId, ScreenPowerStatus::POWER_STATUS_SUSPEND);
1243 EXPECT_EQ(frameRateMgr->curScreenId_, internalScreenId);
1244 }
1245
1246 /**
1247 * @tc.name: NotifyScreenRectFrameRateChange
1248 * @tc.desc: Verify the result of NotifyScreenRectFrameRateChange
1249 * @tc.type: FUNC
1250 * @tc.require:
1251 */
1252 HWTEST_F(HgmFrameRateMgrTest, NotifyScreenRectFrameRateChange, Function | SmallTest | Level0)
1253 {
1254 auto& hgmCore = HgmCore::Instance();
1255 Rect activeRect;
1256 ScreenId id = 0;
1257 GraphicIRect dstActiveRect {
1258 .x = activeRect.x,
1259 .y = activeRect.y,
1260 .w = activeRect.w,
1261 .h = activeRect.h,
1262 };
1263 hgmCore.NotifyScreenRectFrameRateChange(id, dstActiveRect);
1264 EXPECT_NE(hgmCore.hgmFrameRateMgr_, nullptr);
1265 }
1266
1267 /**
1268 * @tc.name: HandleScreenExtStrategyChange
1269 * @tc.desc: Verify the result of HandleScreenExtStrategyChange
1270 * @tc.type: FUNC
1271 * @tc.require:
1272 */
1273 HWTEST_F(HgmFrameRateMgrTest, HandleScreenExtStrategyChange, Function | SmallTest | Level0)
1274 {
1275 auto& hgmCore = HgmCore::Instance();
1276 auto frameRateMgr = hgmCore.GetFrameRateMgr();
1277 if (frameRateMgr == nullptr || hgmCore.mPolicyConfigData_ == nullptr) {
1278 return;
1279 }
1280 frameRateMgr->HandleScreenExtStrategyChange(true, "_THERMAL");
1281 frameRateMgr->HandleScreenExtStrategyChange(false, "test");
1282 EXPECT_NE(frameRateMgr, nullptr);
1283 }
1284
1285 /**
1286 * @tc.name: HandlePackageEvent
1287 * @tc.desc: Verify the result of HandlePackageEvent
1288 * @tc.type: FUNC
1289 * @tc.require:
1290 */
1291 HWTEST_F(HgmFrameRateMgrTest, HandlePackageEvent, Function | SmallTest | Level0)
1292 {
1293 auto& hgmCore = HgmCore::Instance();
1294 auto frameRateMgr = hgmCore.GetFrameRateMgr();
1295 if (frameRateMgr == nullptr) {
1296 return;
1297 }
1298 std::string pkgName0 = "com.pkg0";
1299 std::string pkgName1 = "com.pkg1";
1300 std::string scene0 = "SCENE0";
1301 std::string scene1 = "SCENE1";
1302 std::string scene2 = "SCENE2";
1303
1304 auto sceneListConfig = frameRateMgr->GetMultiAppStrategy().GetScreenSetting();
1305 sceneListConfig.sceneList[scene0] = { "1", "1", false };
1306 sceneListConfig.sceneList[scene1] = { "1", "1", true };
1307
1308 frameRateMgr->GetMultiAppStrategy().SetScreenSetting(sceneListConfig);
1309
1310 frameRateMgr->HandleSceneEvent(DEFAULT_PID, { "VOTER_SCENE", true, OLED_NULL_HZ, OLED_MAX_HZ, scene0 });
1311 frameRateMgr->HandlePackageEvent(DEFAULT_PID, {pkgName0});
1312 // multi scene
1313 frameRateMgr->HandleSceneEvent(DEFAULT_PID, { "VOTER_SCENE", true, OLED_NULL_HZ, OLED_MAX_HZ, scene0 });
1314 frameRateMgr->HandleSceneEvent(DEFAULT_PID, { "VOTER_SCENE", true, OLED_NULL_HZ, OLED_MAX_HZ, scene1 });
1315 frameRateMgr->HandlePackageEvent(DEFAULT_PID, { pkgName1 });
1316 frameRateMgr->currRefreshRate_ = OLED_30_HZ;
1317 FrameRateRange finalRange = { OLED_60_HZ, OLED_120_HZ, OLED_60_HZ };
1318 EXPECT_EQ(frameRateMgr->CalcRefreshRate(frameRateMgr->curScreenId_.load(), finalRange),
1319 frameRateMgr->currRefreshRate_);
1320 frameRateMgr->isStylusWakeUp_ = true;
1321 frameRateMgr->stylusVec_.clear();
1322 ASSERT_EQ(frameRateMgr->CalcRefreshRate(frameRateMgr->curScreenId_.load(), finalRange),
1323 frameRateMgr->currRefreshRate_);
1324 }
1325
1326 /**
1327 * @tc.name: UpdateFrameRateWithDelay
1328 * @tc.desc: Verify the result of UpdateFrameRateWithDelay
1329 * @tc.type: FUNC
1330 * @tc.require:
1331 */
1332 HWTEST_F(HgmFrameRateMgrTest, UpdateFrameRateWithDelay, Function | SmallTest | Level0)
1333 {
1334 auto& hgmCore = HgmCore::Instance();
1335 auto frameRateMgr = hgmCore.GetFrameRateMgr();
1336 if (frameRateMgr == nullptr) {
1337 return;
1338 }
1339
1340 frameRateMgr->frameVoter_.isDragScene_ = false;
1341 ASSERT_EQ(frameRateMgr->UpdateFrameRateWithDelay(120), 120);
1342 ASSERT_EQ(frameRateMgr->UpdateFrameRateWithDelay(72), 72);
1343
1344 frameRateMgr->frameVoter_.isDragScene_ = true;
1345 ASSERT_EQ(frameRateMgr->UpdateFrameRateWithDelay(120), 120);
1346
1347 std::this_thread::sleep_for(std::chrono::seconds(1));
1348 ASSERT_EQ(frameRateMgr->UpdateFrameRateWithDelay(72), 72);
1349 }
1350
1351 /**
1352 * @tc.name: HandleDynamicModeEvent
1353 * @tc.desc: Verify the result of HandleDynamicModeEvent
1354 * @tc.type: FUNC
1355 * @tc.require:
1356 */
1357 HWTEST_F(HgmFrameRateMgrTest, HandleDynamicModeEvent, Function | SmallTest | Level0)
1358 {
1359 auto& hgmCore = HgmCore::Instance();
1360 auto frameRateMgr = hgmCore.GetFrameRateMgr();
1361 if (frameRateMgr == nullptr) {
1362 return;
1363 }
1364 frameRateMgr->HandleDynamicModeEvent(true);
1365 EXPECT_EQ(hgmCore.enableDynamicMode_, true);
1366 }
1367
1368 /**
1369 * @tc.name: ProcessPageUrlVote
1370 * @tc.desc: Verify the result of ProcessPageUrlVote
1371 * @tc.type: FUNC
1372 * @tc.require:
1373 */
1374 HWTEST_F(HgmFrameRateMgrTest, ProcessPageUrlVote, Function | SmallTest | Level0)
1375 {
1376 auto frameRateMgr = HgmCore::Instance().GetFrameRateMgr();
1377 pid_t pid = 0;
1378 std::string strategy = "";
1379 bool isAddVote = true;
1380 std::string packageName = "";
1381 std::string pageName = "";
1382 bool isEnter = true;
1383 frameRateMgr->ProcessPageUrlVote(pid, strategy, isAddVote);
1384 frameRateMgr->CleanPageUrlVote(pid);
1385 frameRateMgr->NotifyPageName(pid, packageName, pageName, isEnter);
1386 EXPECT_EQ(frameRateMgr->appPageUrlStrategy_.pageUrlConfig_,
1387 frameRateMgr->multiAppStrategy_.screenSettingCache_.pageUrlConfig);
1388 }
1389
1390 /**
1391 * @tc.name: TestCheckNeedUpdateAppOffset
1392 * @tc.desc: Verify the result of CheckNeedUpdateAppOffset
1393 * @tc.type: FUNC
1394 * @tc.require:
1395 */
1396 HWTEST_F(HgmFrameRateMgrTest, TestCheckNeedUpdateAppOffset, Function | SmallTest | Level0)
1397 {
1398 HgmFrameRateManager mgr;
1399 mgr.isNeedUpdateAppOffset_ = false;
1400 mgr.touchManager_.state_.store(TouchState::DOWN_STATE);
1401 mgr.controller_ = std::make_shared<HgmVSyncGeneratorController>(nullptr, nullptr, nullptr);
1402 mgr.CheckNeedUpdateAppOffset(OLED_60_HZ, OLED_60_HZ);
1403 mgr.DeliverRefreshRateVote({ "VOTER_THERMAL", OLED_60_HZ, OLED_60_HZ, DEFAULT_PID }, true);
1404 mgr.CheckNeedUpdateAppOffset(OLED_60_HZ, OLED_60_HZ);
1405 EXPECT_EQ(mgr.isNeedUpdateAppOffset_, true);
1406 }
1407
1408 /**
1409 * @tc.name: TestCheckForceUpdateCallback
1410 * @tc.desc: Verify the result of CheckForceUpdateCallback
1411 * @tc.type: FUNC
1412 * @tc.require:
1413 */
1414 HWTEST_F(HgmFrameRateMgrTest, TestCheckForceUpdateCallback, Function | SmallTest | Level0)
1415 {
1416 HgmFrameRateManager mgr;
1417 mgr.InitTouchManager();
1418 mgr.needForceUpdateUniRender_ = true;
1419 mgr.currRefreshRate_.store(OLED_120_HZ);
1420 mgr.CheckForceUpdateCallback(OLED_60_HZ);
1421 EXPECT_EQ(mgr.needForceUpdateUniRender_, true);
1422
__anon09d8ed1d0802(bool idleTimerExpired, bool forceUpdate) 1423 mgr.forceUpdateCallback_ = [](bool idleTimerExpired, bool forceUpdate) {};
1424 mgr.CheckForceUpdateCallback(OLED_60_HZ);
1425 mgr.CheckForceUpdateCallback(OLED_120_HZ);
1426
1427 mgr.touchManager_.ChangeState(TouchState::DOWN_STATE);
1428 EXPECT_EQ(mgr.needForceUpdateUniRender_, false);
1429 mgr.CheckForceUpdateCallback(OLED_120_HZ);
1430 mgr.touchManager_.ChangeState(TouchState::UP_STATE);
1431 mgr.touchManager_.ChangeState(TouchState::IDLE_STATE);
1432 }
1433
1434 /**
1435 * @tc.name: TestHandleTouchEvent
1436 * @tc.desc: Verify the result of HandleTouchEvent
1437 * @tc.type: FUNC
1438 * @tc.require:
1439 */
1440 HWTEST_F(HgmFrameRateMgrTest, TestHandleTouchEvent, Function | SmallTest | Level0)
1441 {
1442 HgmFrameRateManager mgr;
1443 mgr.touchManager_.eventCallbacks_.clear();
1444 mgr.frameVoter_.voterGamesEffective_ = true;
1445 mgr.touchManager_.state_.store(TouchState::DOWN_STATE);
1446 mgr.HandleTouchEvent(0, TOUCH_DOWN, 1);
1447
1448 mgr.frameVoter_.voterGamesEffective_ = true;
1449 mgr.touchManager_.state_.store(TouchState::IDLE_STATE);
1450 mgr.HandleTouchEvent(0, TOUCH_MOVE, 1);
1451
1452 mgr.frameVoter_.voterGamesEffective_ = true;
1453 mgr.touchManager_.state_.store(TouchState::IDLE_STATE);
1454 mgr.HandleTouchEvent(0, TOUCH_BUTTON_DOWN, 1);
1455
1456 mgr.frameVoter_.voterGamesEffective_ = true;
1457 mgr.touchManager_.state_.store(TouchState::IDLE_STATE);
1458 mgr.HandleTouchEvent(0, TOUCH_BUTTON_UP, 1);
1459
1460 mgr.frameVoter_.voterGamesEffective_ = true;
1461 mgr.touchManager_.state_.store(TouchState::IDLE_STATE);
1462 mgr.HandleTouchEvent(0, AXIS_BEGIN, 1);
1463
1464 mgr.frameVoter_.voterGamesEffective_ = true;
1465 mgr.touchManager_.state_.store(TouchState::IDLE_STATE);
1466 mgr.HandleTouchEvent(0, AXIS_UPDATE, 1);
1467
1468 mgr.frameVoter_.voterGamesEffective_ = true;
1469 mgr.touchManager_.state_.store(TouchState::IDLE_STATE);
1470 mgr.HandleTouchEvent(0, AXIS_END, 1);
1471
1472 mgr.frameVoter_.voterGamesEffective_ = true;
1473 mgr.touchManager_.state_.store(TouchState::IDLE_STATE);
1474 mgr.HandleTouchEvent(0, TOUCH_DOWN, 1);
1475 mgr.HandleTouchEvent(0, TOUCH_UP, 1);
1476 mgr.touchManager_.ChangeState(TouchState::IDLE_STATE);
1477 sleep(1);
1478 EXPECT_EQ(mgr.touchManager_.pkgName_, "");
1479 }
1480
1481 /**
1482 * @tc.name: TestHandlePointerTask
1483 * @tc.desc: Verify the result of HandlePointerTask
1484 * @tc.type: FUNC
1485 * @tc.require:
1486 */
1487 HWTEST_F(HgmFrameRateMgrTest, TestHandlePointerTask, Function | SmallTest | Level1)
1488 {
1489 HgmFrameRateManager mgr;
1490 pid_t pid = DEFAULT_PID + 1;
1491 int32_t pointerStatus = AXIS_BEGIN;
1492 std::string pkg0 = "com.wedobest.fivechess.harm:1002:10110";
1493 std::string pkg1 = "com.undefined.pkg:10020:-1";
1494
1495 mgr.HandlePointerTask(pid, pointerStatus, 1);
1496 EXPECT_TRUE(mgr.cleanPidCallback_[pid].count(CleanPidCallbackType::TOUCH_EVENT) > 0);
1497
1498 pid = DEFAULT_PID;
1499 mgr.HandlePointerTask(pid, pointerStatus, 1);
1500
1501 pointerStatus = AXIS_UPDATE;
1502 mgr.HandlePointerTask(pid, pointerStatus, 1);
1503
1504 pointerStatus = AXIS_END;
1505 mgr.HandlePointerTask(pid, pointerStatus, 1);
1506
1507 pointerStatus = AXIS_BEGIN;
1508 mgr.multiAppStrategy_.pkgs_ = {pkg0};
1509 mgr.HandlePointerTask(pid, pointerStatus, 1);
1510 EXPECT_EQ(mgr.pointerManager_.pkgName_, "");
1511
1512 mgr.multiAppStrategy_.pkgs_ = {pkg1};
1513 mgr.multiAppStrategy_.strategyConfigMapCache_[mgr.multiAppStrategy_.screenSettingCache_.strategy]
1514 .pointerMode = PointerModeType::POINTER_DISENABLED;
1515 mgr.HandlePointerTask(pid, pointerStatus, 1);
1516
1517 mgr.multiAppStrategy_.screenSettingCache_.strategy = "undefined";
1518 mgr.HandlePointerTask(pid, pointerStatus, 1);
1519 mgr.pointerManager_.ChangeState(PointerState::POINTER_IDLE_STATE);
1520 sleep(1);
1521 }
1522
1523 /**
1524 * @tc.name: TestHandleTouchTask
1525 * @tc.desc: Verify the result of HandleTouchTask
1526 * @tc.type: FUNC
1527 * @tc.require:
1528 */
1529 HWTEST_F(HgmFrameRateMgrTest, TestHandleTouchTask, Function | SmallTest | Level0)
1530 {
1531 HgmFrameRateManager mgr;
1532 mgr.touchManager_.eventCallbacks_.clear();
1533 mgr.HandleTouchTask(DEFAULT_PID, TOUCH_PULL_UP, 1);
1534 mgr.DeliverRefreshRateVote({ "VOTER_GAMES", OLED_60_HZ, OLED_60_HZ, DEFAULT_PID }, true);
1535 mgr.HandleTouchTask(DEFAULT_PID, TOUCH_PULL_UP, 1);
1536 mgr.multiAppStrategy_.backgroundPid_.Put(DEFAULT_PID);
1537 mgr.HandleTouchTask(DEFAULT_PID, TOUCH_PULL_UP, 1);
1538 mgr.frameVoter_.voteRecord_.erase("VOTER_GAMES");
1539 mgr.HandleTouchTask(DEFAULT_PID, TOUCH_PULL_UP, 1);
1540
1541 mgr.frameVoter_.voterGamesEffective_ = true;
1542 mgr.HandleTouchTask(DEFAULT_PID, TOUCH_PULL_UP, 1);
1543 mgr.frameVoter_.voterGamesEffective_ = false;
1544 mgr.HandleTouchTask(DEFAULT_PID, TOUCH_PULL_UP, 1);
1545
1546 EXPECT_EQ(mgr.touchManager_.pkgName_, "");
1547 }
1548
1549 /**
1550 * @tc.name: TestMarkVoteChange
1551 * @tc.desc: Verify the result of MarkVoteChange
1552 * @tc.type: FUNC
1553 * @tc.require:
1554 */
1555 HWTEST_F(HgmFrameRateMgrTest, TestMarkVoteChange, Function | SmallTest | Level0)
1556 {
1557 HgmFrameRateManager mgr;
1558 mgr.voterTouchEffective_ = true;
1559 mgr.MarkVoteChange();
1560 mgr.MarkVoteChange("NULL");
1561 mgr.voterTouchEffective_ = false;
1562 mgr.MarkVoteChange("NULL");
1563 mgr.MarkVoteChange("VOTER_POWER_MODE");
1564 mgr.frameVoter_.voteRecord_["VOTER_POWER_MODE"].second = false;
1565 mgr.MarkVoteChange("VOTER_POWER_MODE");
1566 mgr.voterTouchEffective_ = true;
1567 mgr.DeliverRefreshRateVote({ "VOTER_POWER_MODE", OLED_60_HZ, OLED_60_HZ, DEFAULT_PID }, true);
1568 mgr.MarkVoteChange("VOTER_POWER_MODE");
1569 EXPECT_EQ(mgr.frameVoter_.voteRecord_["VOTER_POWER_MODE"].second, true);
1570 }
1571
1572 /**
1573 * @tc.name: InitTimers
1574 * @tc.desc: Verify the result of InitTimers
1575 * @tc.type: FUNC
1576 * @tc.require:
1577 */
1578 HWTEST_F(HgmFrameRateMgrTest, InitTimers, Function | SmallTest | Level0)
1579 {
1580 HgmFrameRateManager mgr;
1581 mgr.SetVsyncRateDiscountLTPO({}, 0);
1582 ASSERT_TRUE(mgr.changeGeneratorRateValid_);
1583 mgr.SetChangeGeneratorRateValid(false);
1584 EXPECT_FALSE(mgr.changeGeneratorRateValid_);
1585 sleep(1);
1586 EXPECT_TRUE(mgr.changeGeneratorRateValid_);
1587 mgr.changeGeneratorRateValidTimer_.Stop();
1588
1589 EXPECT_EQ(mgr.rsFrameRateLinker_, nullptr);
1590 mgr.rsFrameRateTimer_.Start();
1591 sleep(1);
1592
1593 mgr.rsFrameRateLinker_ = std::make_shared<RSRenderFrameRateLinker>();
1594 ASSERT_NE(mgr.rsFrameRateLinker_, nullptr);
1595 mgr.rsFrameRateLinker_->SetExpectedRange(FrameRateRange{0, 1, 1}); // not null
1596 mgr.rsFrameRateTimer_.Start();
1597 sleep(1);
1598 EXPECT_EQ(mgr.rsFrameRateLinker_->GetExpectedRange(), FrameRateRange{});
1599 mgr.rsFrameRateTimer_.Stop();
1600 }
1601
1602 /**
1603 * @tc.name: TestCheckRefreshRateChange
1604 * @tc.desc: Verify the result of CheckRefreshRateChange
1605 * @tc.type: FUNC
1606 * @tc.require:
1607 */
1608 HWTEST_F(HgmFrameRateMgrTest, TestCheckRefreshRateChange, Function | SmallTest | Level2)
1609 {
1610 HgmFrameRateManager mgr;
1611 auto& hgmCore = HgmCore::Instance();
1612 mgr.CheckRefreshRateChange(false, false, 120, true);
__anon09d8ed1d0902(bool idleTimerExpired, bool forceUpdate) 1613 mgr.forceUpdateCallback_ = [](bool idleTimerExpired, bool forceUpdate) {};
1614 mgr.CheckRefreshRateChange(false, false, 120, true);
1615 mgr.CheckRefreshRateChange(false, false, 120, false);
1616 EXPECT_EQ(mgr.isNeedUpdateAppOffset_, false);
1617
1618 hgmCore.SetLtpoEnabled(true);
1619 hgmCore.SetSupportedMaxTE(360);
1620 mgr.CheckRefreshRateChange(false, true, 120, true);
1621 mgr.forceUpdateCallback_ = nullptr;
1622 mgr.CheckRefreshRateChange(false, true, 120, true);
1623 mgr.CheckRefreshRateChange(false, true, 120, false);
1624 EXPECT_EQ(mgr.isNeedUpdateAppOffset_, false);
1625 }
1626 } // namespace Rosen
1627 } // namespace OHOS
1628