• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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, Hardware
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 #include <parameter.h>
16 #include <parameters.h>
17 #include <if_system_ability_manager.h>
18 #include <iservice_registry.h>
19 #include <system_ability_definition.h>
20 
21 #include "gtest/gtest.h"
22 #include "limit_number.h"
23 #include "pipeline/rs_test_util.h"
24 #include "consumer_surface.h"
25 
26 #include "command/rs_base_node_command.h"
27 #include "dirty_region/rs_gpu_dirty_collector.h"
28 #include "drawable/rs_screen_render_node_drawable.h"
29 #include "feature/uifirst/rs_uifirst_manager.h"
30 #include "memory/rs_memory_track.h"
31 #include "pipeline/render_thread/rs_render_engine.h"
32 #include "pipeline/render_thread/rs_uni_render_engine.h"
33 #include "pipeline/main_thread/rs_main_thread.h"
34 #include "pipeline/main_thread/rs_render_service_connection.h"
35 #include "pipeline/rs_root_render_node.h"
36 #include "pipeline/rs_canvas_drawing_render_node.h"
37 #include "pipeline/rs_logical_display_render_node.h"
38 #include "pipeline/rs_screen_render_node.h"
39 #include "platform/common/rs_innovation.h"
40 #include "platform/common/rs_system_properties.h"
41 #include "drawable/rs_screen_render_node_drawable.h"
42 #include "screen_manager/rs_screen.h"
43 #include "pipeline/rs_render_node_gc.h"
44 #if defined(ACCESSIBILITY_ENABLE)
45 #include "accessibility_config.h"
46 #endif
47 #include "../test/unittest/mock_vsync_distributor.h"
48 using namespace testing;
49 using namespace testing::ext;
50 
51 namespace OHOS::Rosen {
52 constexpr int32_t DEFAULT_RATE = 1;
53 constexpr int32_t INVALID_VALUE = -1;
54 constexpr int32_t INVISBLE_WINDOW_RATE = 10;
55 constexpr int32_t SCREEN_PHYSICAL_HEIGHT = 10;
56 constexpr int32_t SCREEN_PHYSICAL_WIDTH = 10;
57 constexpr int32_t SIMI_VISIBLE_RATE = 2;
58 constexpr int32_t SYSTEM_ANIMATED_SCENES_RATE = 2;
59 constexpr ScreenId DEFAULT_DISPLAY_SCREEN_ID = 0;
60 constexpr uint32_t MULTI_WINDOW_PERF_END_NUM = 4;
61 constexpr uint32_t MULTI_WINDOW_PERF_START_NUM = 2;
62 constexpr uint64_t REFRESH_PERIOD = 16666667;
63 constexpr uint64_t SKIP_COMMAND_FREQ_LIMIT = 30;
64 constexpr uint32_t DEFAULT_SCREEN_WIDTH = 480;
65 #ifdef RS_ENABLE_UNI_RENDER
66 constexpr uint32_t DEFAULT_SCREEN_HEIGHT = 320;
67 #endif
68 constexpr uint32_t MAX_BLACK_LIST_NUM = 1024;
69 constexpr uint32_t MAX_WHITE_LIST_NUM = 1024;
70 class RSMainThreadTest : public testing::Test {
71 public:
72     static void SetUpTestCase();
73     static void TearDownTestCase();
74     void SetUp() override;
75     void TearDown() override;
76     static void* CreateParallelSyncSignal(uint32_t count);
77     static std::shared_ptr<RSScreenRenderNode> GetAndInitScreenRenderNode();
78     static void ChangeHardwareEnabledNodesBufferData(
79         std::vector<std::shared_ptr<RSSurfaceRenderNode>>& hardwareEnabledNodes);
80 
81 private:
82     static inline BufferRequestConfig requestConfig = {
83         .width = 0x100,
84         .height = 0x100,
85         .strideAlignment = 0x8,
86         .format = GRAPHIC_PIXEL_FMT_YCRCB_420_SP,
87         .usage = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA,
88         .timeout = 0,
89     };
90     static inline BufferFlushConfig flushConfig = {
91         .damage = { .w = 0x100, .h = 0x100, },
92     };
93     static void SurfaceFlushBuffers(sptr<Surface> psurf1, const int32_t bufferNums,
94         const int64_t& desiredPresentTimestamp);
95 };
96 
SurfaceFlushBuffers(sptr<Surface> psurf1,const int32_t bufferNums,const int64_t & desiredPresentTimestamp)97 void RSMainThreadTest::SurfaceFlushBuffers(sptr<Surface> psurf1, const int32_t bufferNums,
98     const int64_t& desiredPresentTimestamp)
99 {
100     for (int32_t i = 0; i <bufferNums; i++) {
101         BufferFlushConfig flushConfigTmp = { .damage = { .w = 0x100, .h = 0x100, },
102             .desiredPresentTimestamp = (bufferNums - i) * desiredPresentTimestamp - 200000,
103         };
104         sptr<SurfaceBuffer> buffer = nullptr;
105         sptr<SyncFence> requestFence = SyncFence::INVALID_FENCE;
106         ASSERT_EQ(psurf1->RequestBuffer(buffer, requestFence, requestConfig), GSERROR_OK);
107         ASSERT_EQ(psurf1->FlushBuffer(buffer, requestFence, flushConfigTmp), GSERROR_OK);
108     }
109 }
110 
SetUpTestCase()111 void RSMainThreadTest::SetUpTestCase()
112 {
113 #ifdef RS_ENABLE_UNI_RENDER
114     RSTestUtil::InitRenderNodeGC();
115     auto screenManager = CreateOrGetScreenManager();
116     ASSERT_NE(nullptr, screenManager);
117     std::string name = "virtualScreen01";
118     uint32_t width = DEFAULT_SCREEN_WIDTH;
119     uint32_t height = DEFAULT_SCREEN_HEIGHT;
120     auto csurface = IConsumerSurface::Create();
121     ASSERT_NE(csurface, nullptr);
122     auto producer = csurface->GetProducer();
123     auto psurface = Surface::CreateSurfaceAsProducer(producer);
124     ASSERT_NE(psurface, nullptr);
125     auto id = screenManager->CreateVirtualScreen(name, width, height, psurface);
126     ASSERT_NE(INVALID_SCREEN_ID, id);
127     screenManager->SetDefaultScreenId(id);
128 #endif
129 }
130 
TearDownTestCase()131 void RSMainThreadTest::TearDownTestCase()
132 {
133 #ifdef RS_ENABLE_UNI_RENDER
134     auto screenManager = CreateOrGetScreenManager();
135     ASSERT_NE(nullptr, screenManager);
136     screenManager->SetDefaultScreenId(INVALID_SCREEN_ID);
137 #endif
138 }
139 
SetUp()140 void RSMainThreadTest::SetUp() {}
TearDown()141 void RSMainThreadTest::TearDown()
142 {
143     auto mainThread = RSMainThread::Instance();
144     if (!mainThread || !mainThread->context_) {
145         return;
146     }
147     auto& renderNodeMap = mainThread->context_->GetMutableNodeMap();
148     renderNodeMap.renderNodeMap_.clear();
149     renderNodeMap.surfaceNodeMap_.clear();
150     renderNodeMap.residentSurfaceNodeMap_.clear();
151     renderNodeMap.screenNodeMap_.clear();
152     renderNodeMap.canvasDrawingNodeMap_.clear();
153     renderNodeMap.uiExtensionSurfaceNodes_.clear();
154 }
CreateParallelSyncSignal(uint32_t count)155 void* RSMainThreadTest::CreateParallelSyncSignal(uint32_t count)
156 {
157     (void)(count);
158     return nullptr;
159 }
160 
GetAndInitScreenRenderNode()161 std::shared_ptr<RSScreenRenderNode> RSMainThreadTest::GetAndInitScreenRenderNode()
162 {
163     auto context = std::make_shared<RSContext>();
164     ScreenId screenId = 0xFFFF;
165     NodeId displayId = 1;
166     auto screenNode = std::make_shared<RSScreenRenderNode>(displayId, screenId, context);
167     auto screenManager = CreateOrGetScreenManager();
168     auto hdiOutput = HdiOutput::CreateHdiOutput(screenId);
169     if (hdiOutput == nullptr) {
170         return screenNode;
171     }
172     auto rsScreen = std::make_shared<impl::RSScreen>(screenId, false, hdiOutput, nullptr);
173     if (rsScreen == nullptr) {
174         return screenNode;
175     }
176 
177     rsScreen->phyWidth_ = SCREEN_PHYSICAL_WIDTH;
178     rsScreen->phyHeight_ = SCREEN_PHYSICAL_HEIGHT;
179     screenManager->MockHdiScreenConnected(rsScreen);
180     return screenNode;
181 }
182 
ChangeHardwareEnabledNodesBufferData(std::vector<std::shared_ptr<RSSurfaceRenderNode>> & hardwareEnabledNodes)183 void RSMainThreadTest::ChangeHardwareEnabledNodesBufferData(
184     std::vector<std::shared_ptr<RSSurfaceRenderNode>>& hardwareEnabledNodes)
185 {
186     if (hardwareEnabledNodes.empty()) {
187         return;
188     }
189     for (auto& surfaceNode : hardwareEnabledNodes) {
190         if (surfaceNode == nullptr || surfaceNode->GetRSSurfaceHandler() == nullptr) {
191             continue;
192         }
193         if (surfaceNode->GetRSSurfaceHandler()->IsCurrentFrameBufferConsumed() &&
194             surfaceNode->HwcSurfaceRecorder().GetLastFrameHasVisibleRegion()) {
195             surfaceNode->GetRSSurfaceHandler()->ResetCurrentFrameBufferConsumed();
196             surfaceNode->HwcSurfaceRecorder().SetLastFrameHasVisibleRegion(false);
197         }
198     }
199 }
200 
201 class ApplicationAgentImpl : public IRemoteStub<IApplicationAgent> {
202 public:
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)203     int OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option) override
204     {
205         return 0;
206     }
OnTransaction(std::shared_ptr<RSTransactionData> transactionData)207     void OnTransaction(std::shared_ptr<RSTransactionData> transactionData) override
208     {
209     }
210 };
211 
212 /**
213  * @tc.name: ProcessCommandForDividedRender
214  * @tc.desc: Test RSMainThreadTest.ProcessCommandForDividedRender
215  * @tc.type: FUNC
216  * @tc.require: issueIB8HAQ
217  */
218 HWTEST_F(RSMainThreadTest, ProcessCommandForDividedRender002, TestSize.Level1)
219 {
220     auto mainThread = RSMainThread::Instance();
221     ASSERT_NE(mainThread, nullptr);
222     auto rsTransactionData = std::make_unique<RSTransactionData>();
223     int dataIndex = 1;
224     rsTransactionData->SetIndex(dataIndex);
225     int dataPayloadSize = 3;
226     rsTransactionData->payload_.resize(dataPayloadSize);
227     NodeId id = 0;
228     rsTransactionData->payload_[id] = std::tuple<NodeId,
229         FollowType, std::unique_ptr<RSCommand>>(id, FollowType::NONE, std::make_unique<RSBaseNodeAddChild>(0, 1, 3));
230     id = 1;
231     rsTransactionData->payload_[id] = std::tuple<NodeId,
232         FollowType, std::unique_ptr<RSCommand>>(id, FollowType::FOLLOW_TO_SELF, nullptr);
233     mainThread->ClassifyRSTransactionData(std::shared_ptr(std::move(rsTransactionData)));
234 
235     auto node = RSTestUtil::CreateSurfaceNode();
236     ASSERT_NE(node, nullptr);
237     mainThread->context_->nodeMap.RegisterRenderNode(node);
238     node->SetIsOnTheTree(true, 0, 1, 2);
239     mainThread->ConsumeAndUpdateAllNodes();
240 
241     mainThread->ProcessCommandForDividedRender();
242 }
243 
244 /**
245  * @tc.name: Start001
246  * @tc.desc: Test RSMainThreadTest.Start
247  * @tc.type: FUNC
248  * @tc.require: issueI60QXK
249  */
250 HWTEST_F(RSMainThreadTest, Start001, TestSize.Level1)
251 {
252     auto mainThread = RSMainThread::Instance();
253     ASSERT_NE(mainThread, nullptr);
254     mainThread->Start();
255 }
256 
257 /**
258  * @tc.name: Start002
259  * @tc.desc: Test RSMainThreadTest.Start
260  * @tc.type: FUNC
261  * @tc.require: issueI60QXK
262  */
263 HWTEST_F(RSMainThreadTest, Start002, TestSize.Level1)
264 {
265     auto mainThread = RSMainThread::Instance();
266     ASSERT_NE(mainThread, nullptr);
267     mainThread->runner_ = nullptr;
268     mainThread->Start();
269 }
270 
271 /**
272  * @tc.name: ProcessCommand
273  * @tc.desc: Test RSMainThreadTest.ProcessCommand
274  * @tc.type: FUNC
275  * @tc.require: issueI60QXK
276  */
277 HWTEST_F(RSMainThreadTest, ProcessCommand, TestSize.Level1)
278 {
279     auto mainThread = RSMainThread::Instance();
280     ASSERT_NE(mainThread, nullptr);
281     if (mainThread->rsVSyncDistributor_ == nullptr) {
282         auto vsyncGenerator = CreateVSyncGenerator();
283         auto vsyncController = new VSyncController(vsyncGenerator, 0);
284         mainThread->rsVSyncDistributor_ = new VSyncDistributor(vsyncController, "rs");
285         vsyncGenerator->SetRSDistributor(mainThread->rsVSyncDistributor_);
286     }
287     auto isUniRender = mainThread->isUniRender_;
288     mainThread->isUniRender_ = false;
289     mainThread->ProcessCommand();
290     mainThread->isUniRender_ = true;
291     mainThread->lastAnimateTimestamp_ = 0;
292     mainThread->timestamp_ = REFRESH_PERIOD + 1;
293     mainThread->context_->purgeType_ = RSContext::PurgeType::GENTLY;
294     mainThread->ProcessCommand();
295     mainThread->context_->purgeType_ = RSContext::PurgeType::STRONGLY;
296     mainThread->isUniRender_ = isUniRender;
297 }
298 
299 /**
300  * @tc.name: RsEventParamDump
301  * @tc.desc: Test RSMainThreadTest.RsEventParamDump
302  * @tc.type: FUNC
303  * @tc.require: issueI60QXK
304  */
305 HWTEST_F(RSMainThreadTest, RsEventParamDump, TestSize.Level1)
306 {
307     auto mainThread = RSMainThread::Instance();
308     ASSERT_NE(mainThread, nullptr);
309     std::string str = "";
310     mainThread->RsEventParamDump(str);
311     ASSERT_TRUE(str.empty());
312 }
313 
314 /**
315  * @tc.name: RemoveRSEventDetector001
316  * @tc.desc: Test RSMainThreadTest.RemoveRSEventDetector, with init
317  * @tc.type: FUNC
318  * @tc.require: issueI60QXK
319  */
320 HWTEST_F(RSMainThreadTest, RemoveRSEventDetector001, TestSize.Level1)
321 {
322     auto mainThread = RSMainThread::Instance();
323     ASSERT_NE(mainThread, nullptr);
324     mainThread->InitRSEventDetector();
325     mainThread->RemoveRSEventDetector();
326 }
327 
328 /**
329  * @tc.name: RemoveRSEventDetector002
330  * @tc.desc: Test RSMainThreadTest.RemoveRSEventDetector, without init
331  * @tc.type: FUNC
332  * @tc.require: issueI60QXK
333  */
334 HWTEST_F(RSMainThreadTest, RemoveRSEventDetector002, TestSize.Level1)
335 {
336     auto mainThread = RSMainThread::Instance();
337     ASSERT_NE(mainThread, nullptr);
338     mainThread->RemoveRSEventDetector();
339 }
340 
341 /**
342  * @tc.name: InitRSEventDetector
343  * @tc.desc: Test RSMainThreadTest.InitRSEventDetector, without init
344  * @tc.type: FUNC
345  * @tc.require: issueI60QXK
346  */
347 HWTEST_F(RSMainThreadTest, InitRSEventDetector, TestSize.Level1)
348 {
349     auto mainThread = RSMainThread::Instance();
350     ASSERT_NE(mainThread, nullptr);
351     mainThread->rsCompositionTimeoutDetector_ = nullptr;
352     mainThread->InitRSEventDetector();
353 }
354 
355 /**
356  * @tc.name: SetRSEventDetectorLoopStartTag001
357  * @tc.desc: Test RSMainThreadTest.SetRSEventDetectorLoopStartTag, with init
358  * @tc.type: FUNC
359  * @tc.require: issueI60QXK
360  */
361 HWTEST_F(RSMainThreadTest, SetRSEventDetectorLoopStartTag001, TestSize.Level1)
362 {
363     auto mainThread = RSMainThread::Instance();
364     ASSERT_NE(mainThread, nullptr);
365     mainThread->InitRSEventDetector();
366     mainThread->SetRSEventDetectorLoopStartTag();
367 }
368 
369 /**
370  * @tc.name: SetRSEventDetectorLoopStartTag002
371  * @tc.desc: Test RSMainThreadTest.SetRSEventDetectorLoopStartTag, without init
372  * @tc.type: FUNC
373  * @tc.require: issueI60QXK
374  */
375 HWTEST_F(RSMainThreadTest, SetRSEventDetectorLoopStartTag002, TestSize.Level1)
376 {
377     auto mainThread = RSMainThread::Instance();
378     ASSERT_NE(mainThread, nullptr);
379     mainThread->rsCompositionTimeoutDetector_ = nullptr;
380     mainThread->SetRSEventDetectorLoopStartTag();
381 }
382 
383 /**
384  * @tc.name: SetRSEventDetectorLoopFinishTag001
385  * @tc.desc: Test RSMainThreadTest.SetRSEventDetectorLoopFinishTag, with init
386  * @tc.type: FUNC
387  * @tc.require: issueI60QXK
388  */
389 HWTEST_F(RSMainThreadTest, SetRSEventDetectorLoopFinishTag001, TestSize.Level1)
390 {
391     auto mainThread = RSMainThread::Instance();
392     ASSERT_NE(mainThread, nullptr);
393     mainThread->InitRSEventDetector();
394     auto isUniRender = mainThread->isUniRender_;
395     mainThread->isUniRender_ = false;
396     mainThread->SetRSEventDetectorLoopFinishTag();
397     mainThread->isUniRender_ = true;
398     mainThread->SetRSEventDetectorLoopFinishTag();
399     mainThread->isUniRender_ = isUniRender;
400 }
401 
402 /**
403  * @tc.name: SetRSEventDetectorLoopFinishTag002
404  * @tc.desc: Test RSMainThreadTest.SetRSEventDetectorLoopFinishTag, without init
405  * @tc.type: FUNC
406  * @tc.require: issueI60QXK
407  */
408 HWTEST_F(RSMainThreadTest, SetRSEventDetectorLoopFinishTag002, TestSize.Level1)
409 {
410     auto mainThread = RSMainThread::Instance();
411     ASSERT_NE(mainThread, nullptr);
412     mainThread->rsCompositionTimeoutDetector_ = nullptr;
413     mainThread->SetRSEventDetectorLoopFinishTag();
414 }
415 
416 /**
417  * @tc.name: ProcessCommandForDividedRender001
418  * @tc.desc: Test RSMainThreadTest.ProcessCommandForDividedRender
419  * @tc.type: FUNC
420  * @tc.require: issueI60QXK
421  */
422 HWTEST_F(RSMainThreadTest, ProcessCommandForDividedRender001, TestSize.Level1)
423 {
424     auto mainThread = RSMainThread::Instance();
425     ASSERT_NE(mainThread, nullptr);
426     mainThread->ProcessCommandForDividedRender();
427 }
428 
429 /**
430  * @tc.name: CalcOcclusion
431  * @tc.desc: Test RSMainThreadTest.CalcOcclusion, doWindowAnimate_ is false, isUniRender_ is true
432  * @tc.type: FUNC
433  * @tc.require: issueI60QXK
434  */
435 HWTEST_F(RSMainThreadTest, CalcOcclusion, TestSize.Level1)
436 {
437     auto mainThread = RSMainThread::Instance();
438     ASSERT_NE(mainThread, nullptr);
439     mainThread->doWindowAnimate_ = false;
440     mainThread->isUniRender_ = true;
441     mainThread->CalcOcclusion();
442 }
443 
444 /**
445  * @tc.name: Animate001
446  * @tc.desc: Test RSMainThreadTest.Animate, doWindowAnimate_ is false
447  * @tc.type: FUNC
448  * @tc.require: issueI60QXK
449  */
450 HWTEST_F(RSMainThreadTest, Animate001, TestSize.Level1)
451 {
452     auto mainThread = RSMainThread::Instance();
453     ASSERT_NE(mainThread, nullptr);
454     mainThread->doWindowAnimate_ = false;
455     mainThread->Animate(0);
456 }
457 
458 /**
459  * @tc.name: Animate002
460  * @tc.desc: Test RSMainThreadTest.Animate, doWindowAnimate_ is true
461  * @tc.type: FUNC
462  * @tc.require: issueI60QXK
463  */
464 HWTEST_F(RSMainThreadTest, Animate002, TestSize.Level1)
465 {
466     auto mainThread = RSMainThread::Instance();
467     ASSERT_NE(mainThread, nullptr);
468     mainThread->doWindowAnimate_ = true;
469     mainThread->Animate(0);
470 }
471 
472 /**
473  * @tc.name: UnRegisterOcclusionChangeCallback
474  * @tc.desc: Test RSMainThreadTest.Animate
475  * @tc.type: FUNC
476  * @tc.require: issueI60QXK
477  */
478 HWTEST_F(RSMainThreadTest, UnRegisterOcclusionChangeCallback, TestSize.Level1)
479 {
480     auto mainThread = RSMainThread::Instance();
481     ASSERT_NE(mainThread, nullptr);
482     mainThread->UnRegisterOcclusionChangeCallback(0);
483 }
484 
485 /**
486  * @tc.name: RenderServiceTreeDump
487  * @tc.desc: Test RSMainThreadTest.RenderServiceTreeDump, str is an empty string
488  * @tc.type: FUNC
489  * @tc.require: issueI60QXK
490  */
491 HWTEST_F(RSMainThreadTest, RenderServiceTreeDump, TestSize.Level1)
492 {
493     auto mainThread = RSMainThread::Instance();
494     std::string str = "";
495     mainThread->RenderServiceTreeDump(str);
496     ASSERT_FALSE(str.size() == 0);
497 }
498 
499 /**
500  * @tc.name: SetFocusAppInfo
501  * @tc.desc: Test RSMainThreadTest.SetFocusAppInfo, input pid, uid is -1, str is an empty string
502  * @tc.type: FUNC
503  * @tc.require: issueI60QXK
504  */
505 HWTEST_F(RSMainThreadTest, SetFocusAppInfo, TestSize.Level1)
506 {
507     auto mainThread = RSMainThread::Instance();
508     ASSERT_NE(mainThread, nullptr);
509     std::string str = "";
510     int32_t pid = INVALID_VALUE;
511     int32_t uid = INVALID_VALUE;
512 
513     FocusAppInfo info = {
514         .pid = pid,
515         .uid = uid,
516         .bundleName = str,
517         .abilityName = str,
518         .focusNodeId = 0};
519     mainThread->SetFocusAppInfo(info);
520     ASSERT_EQ(mainThread->focusAppPid_, pid);
521 }
522 
523 /**
524  * @tc.name: SetFocusAppInfo002
525  * @tc.desc: Test SetFocusAppInfo while change focus node
526  * @tc.type: FUNC
527  * @tc.require: issueI9LOXQ
528  */
529 HWTEST_F(RSMainThreadTest, SetFocusAppInfo002, TestSize.Level2)
530 {
531     auto mainThread = RSMainThread::Instance();
532     ASSERT_NE(mainThread, nullptr);
533 
534     NodeId id = 0;
535     auto oldFocusNode = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
536     auto newFocusNode = std::make_shared<RSSurfaceRenderNode>(id + 1, mainThread->context_);
537     mainThread->focusNodeId_ = oldFocusNode->GetId();
538 
539     std::string str = "";
540     int32_t pid = INVALID_VALUE;
541     int32_t uid = INVALID_VALUE;
542     FocusAppInfo info = {
543         .pid = pid,
544         .uid = uid,
545         .bundleName = str,
546         .abilityName = str,
547         .focusNodeId = newFocusNode->GetId()};
548     mainThread->SetFocusAppInfo(info);
549     ASSERT_EQ(mainThread->GetFocusNodeId(), newFocusNode->GetId());
550 }
551 
552 /**
553  * @tc.name: AddPidNeedDropFrame
554  * @tc.desc: Test AddPidNeedDropFrame
555  * @tc.type: FUNC
556  * @tc.require: issueIB612L
557  */
558 HWTEST_F(RSMainThreadTest, AddPidNeedDropFrame, TestSize.Level2)
559 {
560     auto mainThread = RSMainThread::Instance();
561     ASSERT_NE(mainThread, nullptr);
562 
563     NodeId id = 0;
564     auto surfaceNode = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
565     mainThread->AddPidNeedDropFrame({ExtractPid(surfaceNode->GetId())});
566     ASSERT_EQ(mainThread->surfacePidNeedDropFrame_.size(), 1);
567 }
568 
569 /**
570  * @tc.name: ClearNeedDropframePidList
571  * @tc.desc: Test ClearNeedDropframePidList
572  * @tc.type: FUNC
573  * @tc.require: issueIB612L
574  */
575 HWTEST_F(RSMainThreadTest, ClearNeedDropframePidList, TestSize.Level2)
576 {
577     auto mainThread = RSMainThread::Instance();
578     ASSERT_NE(mainThread, nullptr);
579 
580     NodeId id = 0;
581     auto surfaceNode = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
582     mainThread->AddPidNeedDropFrame({ExtractPid(surfaceNode->GetId())});
583     mainThread->ClearNeedDropframePidList();
584     ASSERT_EQ(mainThread->surfacePidNeedDropFrame_.size(), 0);
585 }
586 
587 /**
588  * @tc.name: IsNeedDropFrameByPid001
589  * @tc.desc: Test IsNeedDropFrameByPid while pid satisfy
590  * @tc.type: FUNC
591  * @tc.require: issueIB7PH1
592  */
593 HWTEST_F(RSMainThreadTest, IsNeedDropFrameByPid001, TestSize.Level2)
594 {
595     auto mainThread = RSMainThread::Instance();
596     ASSERT_NE(mainThread, nullptr);
597 
598     NodeId id = 0;
599     auto surfaceNode = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
600     mainThread->AddPidNeedDropFrame({ExtractPid(surfaceNode->GetId())});
601     ASSERT_TRUE(mainThread->IsNeedDropFrameByPid(surfaceNode->GetId()));
602 
603     mainThread->ClearNeedDropframePidList();
604 }
605 
606 /**
607  * @tc.name: IsNeedDropFrameByPid002
608  * @tc.desc: Test IsNeedDropFrameByPid while pid not satisfy
609  * @tc.type: FUNC
610  * @tc.require: issueIB7PH1
611  */
612 HWTEST_F(RSMainThreadTest, IsNeedDropFrameByPid002, TestSize.Level2)
613 {
614     auto mainThread = RSMainThread::Instance();
615     ASSERT_NE(mainThread, nullptr);
616 
617     NodeId id = 0;
618     auto surfaceNode = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
619     mainThread->AddPidNeedDropFrame({});
620     ASSERT_FALSE(mainThread->IsNeedDropFrameByPid(surfaceNode->GetId()));
621 
622     mainThread->ClearNeedDropframePidList();
623 }
624 
625 /**
626  * @tc.name: ProcessSyncRSTransactionData001
627  * @tc.desc: Test ProcessSyncRSTransactionData when TransactionData do not need sync
628  * @tc.type: FUNC
629  * @tc.require: issueI6Q9A2
630  */
631 HWTEST_F(RSMainThreadTest, ProcessSyncRSTransactionData001, TestSize.Level1)
632 {
633     // when IsNeedSync() is false
634     auto mainThread = RSMainThread::Instance();
635     auto rsTransactionData = std::make_unique<RSTransactionData>();
636     pid_t pid = 0;
637     rsTransactionData->SetSyncId(1);
638     mainThread->ProcessSyncRSTransactionData(rsTransactionData, pid);
639     ASSERT_EQ(mainThread->syncTransactionData_.empty(), false);
640 
641     // when syncTransactionData_ is not empty and SyncId is larger
642     rsTransactionData = std::make_unique<RSTransactionData>();
643     rsTransactionData->MarkNeedSync();
644     rsTransactionData->SetSyncId(0);
645     mainThread->ProcessSyncRSTransactionData(rsTransactionData, pid);
646     ASSERT_EQ(mainThread->syncTransactionData_.empty(), false);
647 
648     // when syncTransactionData_ is not empty and SyncId is equal or smaller
649     rsTransactionData->SetSyncTransactionNum(1);
650     rsTransactionData->SetSyncId(1);
651     mainThread->ProcessSyncRSTransactionData(rsTransactionData, pid);
652     ASSERT_EQ(mainThread->syncTransactionData_.empty(), false);
653 }
654 
655 /**
656  * @tc.name: ProcessSyncRSTransactionData002
657  * @tc.desc: Test ProcessSyncRSTransactionData when TransactionData do not need sync
658  * @tc.type: FUNC
659  * @tc.require: issueI6Q9A2
660  */
661 HWTEST_F(RSMainThreadTest, ProcessSyncRSTransactionData002, TestSize.Level1)
662 {
663     // when IsNeedSync() is true & syncTransactionData_ is empty & isNeedCloseSync is true
664     auto mainThread = RSMainThread::Instance();
665     auto rsTransactionData = std::make_unique<RSTransactionData>();
666     pid_t pid = 0;
667     rsTransactionData->MarkNeedSync();
668     rsTransactionData->MarkNeedCloseSync();
669     rsTransactionData->SetSyncTransactionNum(1);
670     mainThread->ProcessSyncRSTransactionData(rsTransactionData, pid);
671     ASSERT_EQ(mainThread->syncTransactionData_.empty(), false);
672 }
673 
674 /**
675  * @tc.name: StartSyncTransactionFallbackTask001
676  * @tc.desc: Test StartSyncTransactionFallbackTask
677  * @tc.type: FUNC
678  * @tc.require: issueI6Q9A2
679  */
680 HWTEST_F(RSMainThreadTest, StartSyncTransactionFallbackTask001, TestSize.Level1)
681 {
682     auto rsTransactionData = std::make_unique<RSTransactionData>();
683     rsTransactionData->SetSyncId(1);
684 
685     auto mainThread = RSMainThread::Instance();
686     auto syncData = std::make_unique<RSTransactionData>();
687     syncData->SetSyncId(0);
688     mainThread->runner_ = AppExecFwk::EventRunner::Create(false);
689     mainThread->handler_ = std::make_shared<AppExecFwk::EventHandler>(mainThread->runner_);
690     mainThread->syncTransactionData_[0] = std::vector<std::unique_ptr<RSTransactionData>>();
691     mainThread->syncTransactionData_[0].push_back(std::move(syncData));
692     mainThread->StartSyncTransactionFallbackTask(rsTransactionData);
693     ASSERT_EQ(mainThread->syncTransactionData_.empty(), false);
694     mainThread->runner_ = nullptr;
695     mainThread->handler_ = nullptr;
696 
697     auto mainThread2 = RSMainThread::Instance();
698     auto syncData2 = std::make_unique<RSTransactionData>();
699     syncData2->SetSyncId(1);
700     mainThread2->runner_ = AppExecFwk::EventRunner::Create(false);
701     mainThread2->handler_ = std::make_shared<AppExecFwk::EventHandler>(mainThread2->runner_);
702     mainThread2->syncTransactionData_[0] = std::vector<std::unique_ptr<RSTransactionData>>();
703     mainThread2->syncTransactionData_[0].push_back(std::move(syncData2));
704     mainThread2->StartSyncTransactionFallbackTask(rsTransactionData);
705     ASSERT_EQ(mainThread2->syncTransactionData_.empty(), false);
706     mainThread2->runner_ = nullptr;
707     mainThread2->handler_ = nullptr;
708 }
709 
710 /**
711  * @tc.name: ProcessSyncTransactionCount
712  * @tc.desc: Test ProcessSyncTransactionCount
713  * @tc.type: FUNC
714  * @tc.require: issueI6Q9A2
715  */
716 HWTEST_F(RSMainThreadTest, ProcessSyncTransactionCount, TestSize.Level1)
717 {
718     auto mainThread = RSMainThread::Instance();
719     auto rsTransactionData = std::make_unique<RSTransactionData>();
720 
721     rsTransactionData->SetParentPid(-1);
722     mainThread->ProcessSyncTransactionCount(rsTransactionData);
723     auto parentPid = rsTransactionData->GetParentPid();
724     ASSERT_EQ(parentPid, -1);
725 
726     rsTransactionData->SetSyncTransactionNum(1);
727     mainThread->ProcessSyncTransactionCount(rsTransactionData);
728     ASSERT_EQ(rsTransactionData->GetSyncTransactionNum(), 1);
729 
730     rsTransactionData->MarkNeedCloseSync();
731     mainThread->ProcessSyncTransactionCount(rsTransactionData);
732     mainThread->StartSyncTransactionFallbackTask(rsTransactionData);
733     ASSERT_EQ(rsTransactionData->IsNeedCloseSync(), true);
734 }
735 
736 /**
737  * @tc.name: GetContext
738  * @tc.desc: Test if context has been initialized
739  * @tc.type: FUNC
740  * @tc.require: issueI6Q9A2
741  */
742 HWTEST_F(RSMainThreadTest, GetContext, TestSize.Level1)
743 {
744     auto mainThread = RSMainThread::Instance();
745     auto& context = mainThread->GetContext();
746     uint64_t time = 0;
747     ASSERT_EQ(context.GetTransactionTimestamp(), time);
748 }
749 
750 /**
751  * @tc.name: ClassifyRSTransactionData001
752  * @tc.desc: Test ClassifyRSTransactionData when nodeId is 0
753  * @tc.type: FUNC
754  * @tc.require: issueI6Q9A2
755  */
756 HWTEST_F(RSMainThreadTest, ClassifyRSTransactionData001, TestSize.Level1)
757 {
758     auto mainThread = RSMainThread::Instance();
759     mainThread->pendingEffectiveCommands_.clear();
760     auto rsTransactionData = std::make_unique<RSTransactionData>();
761     std::unique_ptr<RSCommand> command = nullptr;
762     NodeId nodeId = 0;
763     FollowType followType = FollowType::NONE;
764     rsTransactionData->AddCommand(command, nodeId, followType);
765     mainThread->ClassifyRSTransactionData(std::shared_ptr(std::move(rsTransactionData)));
766     ASSERT_EQ(mainThread->pendingEffectiveCommands_.empty(), true);
767 }
768 
769 /**
770  * @tc.name: ClassifyRSTransactionData002
771  * @tc.desc: Test ClassifyRSTransactionData when nodeId is 1
772  * @tc.type: FUNC
773  * @tc.require: issueI6R34I
774  */
775 HWTEST_F(RSMainThreadTest, ClassifyRSTransactionData002, TestSize.Level1)
776 {
777     auto mainThread = RSMainThread::Instance();
778     mainThread->pendingEffectiveCommands_.clear();
779     auto rsTransactionData = std::make_unique<RSTransactionData>();
780     std::unique_ptr<RSCommand> command = nullptr;
781     NodeId nodeId = 1;
782     FollowType followType = FollowType::NONE;
783     rsTransactionData->AddCommand(command, nodeId, followType);
784     mainThread->ClassifyRSTransactionData(std::shared_ptr(std::move(rsTransactionData)));
785     ASSERT_EQ(mainThread->pendingEffectiveCommands_.empty(), true);
786 }
787 
788 /**
789  * @tc.name: ClassifyRSTransactionData003
790  * @tc.desc: Test ClassifyRSTransactionData when followType is FOLLOW_TO_PARENT
791  * @tc.type: FUNC
792  * @tc.require: issueI6R34I
793  */
794 HWTEST_F(RSMainThreadTest, ClassifyRSTransactionData003, TestSize.Level1)
795 {
796     auto mainThread = RSMainThread::Instance();
797     mainThread->pendingEffectiveCommands_.clear();
798     auto rsTransactionData = std::make_unique<RSTransactionData>();
799     std::unique_ptr<RSCommand> command = nullptr;
800     NodeId nodeId = 1;
801     FollowType followType = FollowType::FOLLOW_TO_PARENT;
802     rsTransactionData->AddCommand(command, nodeId, followType);
803     mainThread->ClassifyRSTransactionData(std::shared_ptr(std::move(rsTransactionData)));
804     ASSERT_EQ(mainThread->cachedCommands_[nodeId].empty(), true);
805 }
806 
807 /**
808  * @tc.name: ClassifyRSTransactionData004
809  * @tc.desc: Test ClassifyRSTransactionData when followType is FOLLOW_TO_PARENT
810  * @tc.type: FUNC
811  * @tc.require: issueI6R34I
812  */
813 HWTEST_F(RSMainThreadTest, ClassifyRSTransactionData004, TestSize.Level1)
814 {
815     auto mainThread = RSMainThread::Instance();
816     // build the NodeTree
817     NodeId nodeId = 1;
818     std::weak_ptr<RSContext> context = {};
819     auto node = std::make_shared<RSBaseRenderNode>(nodeId, context);
820     auto childNode = std::make_shared<RSBaseRenderNode>(nodeId + 1, context);
821     int index = 0;
822     node->SetIsOnTheTree(true);
823     node->AddChild(node, index);
824     ASSERT_EQ(static_cast<int>(node->GetChildrenCount()), 0);
825     node->AddChild(childNode, index);
826     ASSERT_EQ(static_cast<int>(node->GetChildrenCount()), 1);
827     ASSERT_TRUE(childNode->IsOnTheTree());
828 
829     mainThread->cachedCommands_.clear();
830     auto rsTransactionData = std::make_unique<RSTransactionData>();
831     std::unique_ptr<RSCommand> command = nullptr;
832     FollowType followType = FollowType::FOLLOW_TO_SELF;
833     rsTransactionData->AddCommand(command, nodeId, followType);
834     mainThread->ClassifyRSTransactionData(std::shared_ptr(std::move(rsTransactionData)));
835     ASSERT_EQ(mainThread->cachedCommands_[nodeId].empty(), true);
836 
837     mainThread->cachedCommands_.clear();
838     rsTransactionData = std::make_unique<RSTransactionData>();
839     command = nullptr;
840     followType = FollowType::FOLLOW_TO_PARENT;
841     rsTransactionData->AddCommand(command, nodeId + 1, followType);
842     mainThread->ClassifyRSTransactionData(std::shared_ptr(std::move(rsTransactionData)));
843     ASSERT_EQ(mainThread->cachedCommands_[nodeId + 1].empty(), true);
844 }
845 
846 /**
847  * @tc.name: AddActiveNode
848  * @tc.desc: Test AddActiveNode, add invalid node id, check if fails
849  * @tc.type: FUNC
850  * @tc.require: issueI6Q9A2
851  */
852 HWTEST_F(RSMainThreadTest, AddActiveNode, TestSize.Level1)
853 {
854     auto mainThread = RSMainThread::Instance();
855     mainThread->context_->activeNodesInRoot_.clear();
856     // invalid nodeid
857     NodeId id = INVALID_NODEID;
858     auto node = std::make_shared<RSRenderNode>(id, mainThread->context_);
859     mainThread->context_->AddActiveNode(node);
860     ASSERT_EQ(static_cast<int>(mainThread->context_->activeNodesInRoot_.size()), 0);
861 }
862 
863 /**
864  * @tc.name: CheckAndUpdateInstanceContentStaticStatus01
865  * @tc.desc: Test static instance(no dirty) would be classify as only basic geo transform
866  * @tc.type: FUNC
867  * @tc.require: issueI8IXTX
868  */
869 HWTEST_F(RSMainThreadTest, CheckAndUpdateInstanceContentStaticStatus01, TestSize.Level1)
870 {
871     auto mainThread = RSMainThread::Instance();
872     mainThread->context_->activeNodesInRoot_.clear();
873     // valid nodeid
874     NodeId id = 1;
875     auto node = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
876     ASSERT_NE(node, nullptr);
877     mainThread->CheckAndUpdateInstanceContentStaticStatus(node);
878     ASSERT_EQ(node->GetSurfaceCacheContentStatic(), true);
879 }
880 
881 /**
882  * @tc.name: CheckAndUpdateInstanceContentStaticStatus02
883  * @tc.desc: Test new instance would not be classify as only basic geo transform
884  * @tc.type: FUNC
885  * @tc.require: issueI8IXTX
886  */
887 HWTEST_F(RSMainThreadTest, CheckAndUpdateInstanceContentStaticStatus02, TestSize.Level1)
888 {
889     auto mainThread = RSMainThread::Instance();
890     mainThread->context_->activeNodesInRoot_.clear();
891     // valid nodeid
892     NodeId id = 1;
893     auto node = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
894     ASSERT_NE(node, nullptr);
895     node->SetIsOnTheTree(true, id, id);
896     node->SetContentDirty();
897     mainThread->context_->AddActiveNode(node);
898     ASSERT_EQ(static_cast<int>(mainThread->context_->activeNodesInRoot_.size()), 1);
899     mainThread->CheckAndUpdateInstanceContentStaticStatus(node);
900     ASSERT_EQ(node->GetSurfaceCacheContentStatic(), false);
901 }
902 
903 /**
904  * @tc.name: IsNeedProcessBySingleFrameComposerTest001
905  * @tc.desc: Test IsNeedProcessBySingleFrameComposerTest when TransactionData is null
906  * @tc.type: FUNC
907  * @tc.require: issueI9HPBS
908  */
909 HWTEST_F(RSMainThreadTest, IsNeedProcessBySingleFrameComposerTest001, TestSize.Level1)
910 {
911     auto mainThread = RSMainThread::Instance();
912     std::unique_ptr<RSTransactionData> transactionData = nullptr;
913     ASSERT_FALSE(mainThread->IsNeedProcessBySingleFrameComposer(transactionData));
914     transactionData = std::make_unique<RSTransactionData>();
915     mainThread->isUniRender_ = true;
916     ASSERT_FALSE(mainThread->IsNeedProcessBySingleFrameComposer(transactionData));
917 }
918 
919 /**
920  * @tc.name: IsNeedProcessBySingleFrameComposerTest002
921  * @tc.desc: Test IsNeedProcessBySingleFrameComposerTest when SingleFrameComposer enabled by app process
922  * @tc.type: FUNC
923  * @tc.require: issueI9HPBS
924  */
925 HWTEST_F(RSMainThreadTest, IsNeedProcessBySingleFrameComposerTest002, TestSize.Level1)
926 {
927     auto mainThread = RSMainThread::Instance();
928     auto transactionData = std::make_unique<RSTransactionData>();
929     mainThread->isUniRender_ = true;
930     pid_t pid = 1;
931     transactionData->SetSendingPid(pid);
932     RSSingleFrameComposer::AddOrRemoveAppPidToMap(true, pid);
933     ASSERT_TRUE(mainThread->IsNeedProcessBySingleFrameComposer(transactionData));
934 }
935 
936 /**
937  * @tc.name: RecvRSTransactionData
938  * @tc.desc: Test RecvRSTransactionData, when TransactionData is null
939  * @tc.type: FUNC
940  * @tc.require: issueI6R34I
941  */
942 HWTEST_F(RSMainThreadTest, RecvRSTransactionData, TestSize.Level1)
943 {
944     auto mainThread = RSMainThread::Instance();
945     std::unique_ptr<RSTransactionData> transactionData = nullptr;
946     mainThread->RecvRSTransactionData(transactionData);
947     ASSERT_EQ(transactionData, nullptr);
948 }
949 
950 /**
951  * @tc.name: PostSyncTask
952  * @tc.desc: Test PostSyncTask when handler is null or not
953  * @tc.type: FUNC
954  * @tc.require: issueI6R34I
955  */
956 HWTEST_F(RSMainThreadTest, PostSyncTask, TestSize.Level1)
957 {
958     auto mainThread = RSMainThread::Instance();
959     ASSERT_EQ(mainThread->handler_, nullptr);
__anon6c0dd2f20102() 960     RSTaskMessage::RSTask task = []() -> void { return; };
961     mainThread->PostSyncTask(task);
962 }
963 
964 /**
965  * @tc.name: ShowWatermark
966  * @tc.desc: ShowWatermark test
967  * @tc.type: FUNC
968  * @tc.require: issueI78T3Z
969  */
970 HWTEST_F(RSMainThreadTest, ShowWatermark, TestSize.Level1)
971 {
972     auto mainThread = RSMainThread::Instance();
973     const uint32_t color[8] = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 };
974     uint32_t colorLength = sizeof(color) / sizeof(color[0]);
975     const int32_t offset = 0;
976     Media::InitializationOptions opts;
977     int32_t stride = 3;
978     std::unique_ptr<Media::PixelMap> pixelMap1 = Media::PixelMap::Create(color, colorLength, offset, stride, opts);
979     mainThread->ShowWatermark(std::move(pixelMap1), true);
980     ASSERT_EQ(mainThread->GetWatermarkFlag(), true);
981     mainThread->ShowWatermark(nullptr, false);
982     ASSERT_EQ(mainThread->GetWatermarkFlag(), false);
983 }
984 
985 /**
986  * @tc.name: ShowWatermark01
987  * @tc.desc: ShowWatermark test
988  * @tc.type: FUNC
989  * @tc.require: issueI78T3Z
990  */
991 HWTEST_F(RSMainThreadTest, ShowWatermark01, TestSize.Level1)
992 {
993 #ifdef RS_ENABLE_UNI_RENDER
994     auto mainThread = RSMainThread::Instance();
995     Media::InitializationOptions opts;
996     opts.size.width = DEFAULT_SCREEN_WIDTH * 2.5;
997     opts.size.height = DEFAULT_SCREEN_HEIGHT * 2.5;
998     std::unique_ptr<Media::PixelMap> pixelMap = Media::PixelMap::Create(opts);
999     ASSERT_NE(pixelMap, nullptr);
1000     mainThread->watermarkFlag_ = false;
1001     mainThread->ShowWatermark(std::move(pixelMap), true);
1002     ASSERT_EQ(mainThread->GetWatermarkFlag(), false);
1003 #endif
1004 }
1005 
1006 /**
1007  * @tc.name: ShowWatermark02
1008  * @tc.desc: ShowWatermark test
1009  * @tc.type: FUNC
1010  * @tc.require: issueI78T3Z
1011  */
1012 HWTEST_F(RSMainThreadTest, ShowWatermark02, TestSize.Level1)
1013 {
1014     auto mainThread = RSMainThread::Instance();
1015     Media::InitializationOptions opts;
1016     opts.size.width = 1;
1017     opts.size.height = 1;
1018     std::unique_ptr<Media::PixelMap> pixelMap = Media::PixelMap::Create(opts);
1019     ASSERT_NE(pixelMap, nullptr);
1020     mainThread->ShowWatermark(std::move(pixelMap), true);
1021     ASSERT_EQ(mainThread->GetWatermarkFlag(), true);
1022 }
1023 
1024 /**
1025  * @tc.name: ShowWatermark03
1026  * @tc.desc: ShowWatermark test
1027  * @tc.type: FUNC
1028  * @tc.require: issueI78T3Z
1029  */
1030 HWTEST_F(RSMainThreadTest, ShowWatermark03, TestSize.Level1)
1031 {
1032     auto mainThread = RSMainThread::Instance();
1033     Media::InitializationOptions opts;
1034     opts.size.width = DEFAULT_SCREEN_WIDTH;
1035     opts.size.height = DEFAULT_SCREEN_WIDTH;
1036     std::unique_ptr<Media::PixelMap> pixelMap = Media::PixelMap::Create(opts);
1037     ASSERT_NE(pixelMap, nullptr);
1038     mainThread->ShowWatermark(std::move(pixelMap), true);
1039     ASSERT_EQ(mainThread->GetWatermarkFlag(), true);
1040 }
1041 
1042 /**
1043  * @tc.name: ShowWatermark05
1044  * @tc.desc: ShowWatermark test
1045  * @tc.type: FUNC
1046  * @tc.require: issueI78T3Z
1047  */
1048 HWTEST_F(RSMainThreadTest, ShowWatermark05, TestSize.Level1)
1049 {
1050     auto mainThread = RSMainThread::Instance();
1051     Media::InitializationOptions opts;
1052     opts.size.width = DEFAULT_SCREEN_WIDTH;
1053     opts.size.height = DEFAULT_SCREEN_WIDTH;
1054     std::unique_ptr<Media::PixelMap> pixelMap = Media::PixelMap::Create(opts);
1055     ASSERT_NE(pixelMap, nullptr);
1056     mainThread->watermarkFlag_ = false;
1057     mainThread->ShowWatermark(nullptr, true);
1058     ASSERT_EQ(mainThread->GetWatermarkFlag(), true);
1059 }
1060 
1061 /**
1062  * @tc.name: MergeToEffectiveTransactionDataMap001
1063  * @tc.desc: Test RSMainThreadTest.MergeToEffectiveTransactionDataMap
1064  * @tc.type: FUNC
1065  * @tc.require: issueI8V6MD
1066  */
1067 HWTEST_F(RSMainThreadTest, MergeToEffectiveTransactionDataMap001, TestSize.Level1)
1068 {
1069     auto mainThread = RSMainThread::Instance();
1070     mainThread->Start();
1071     ASSERT_EQ(mainThread->effectiveTransactionDataIndexMap_.empty(), true);
1072     mainThread->effectiveTransactionDataIndexMap_[0].first = 0;
1073     TransactionDataMap dataMap;
1074     auto data = std::make_unique<RSTransactionData>();
1075     ASSERT_NE(data, nullptr);
1076     data->SetIndex(1);
1077     dataMap[0].emplace_back(std::move(data));
1078     data = std::make_unique<RSTransactionData>();
1079     ASSERT_NE(data, nullptr);
1080     data->SetIndex(3);
1081     dataMap[0].emplace_back(std::move(data));
1082     dataMap[0].emplace_back(nullptr);
1083     mainThread->MergeToEffectiveTransactionDataMap(dataMap);
1084     mainThread->effectiveTransactionDataIndexMap_.clear();
1085 }
1086 
1087 /**
1088  * @tc.name: ProcessCommandForUniRender
1089  * @tc.desc: ProcessCommandForUniRender test with invalid data
1090  * @tc.type: FUNC
1091  * @tc.require: issueI7A39J
1092  */
1093 HWTEST_F(RSMainThreadTest, ProcessCommandForUniRender, TestSize.Level1)
1094 {
1095     auto mainThread = RSMainThread::Instance();
1096     ASSERT_EQ(mainThread->effectiveTransactionDataIndexMap_.empty(), true);
1097 
1098     // // let lastindex same as timeout index and test timeout case at first
1099     mainThread->transactionDataLastWaitTime_[0] = 0;
1100     mainThread->timestamp_ = REFRESH_PERIOD * SKIP_COMMAND_FREQ_LIMIT + 1;
1101     mainThread->effectiveTransactionDataIndexMap_[0].first = 0;
1102     if (mainThread->rsVSyncDistributor_ == nullptr) {
1103         auto vsyncGenerator = CreateVSyncGenerator();
1104         auto vsyncController = new VSyncController(vsyncGenerator, 0);
1105         mainThread->rsVSyncDistributor_ = new VSyncDistributor(vsyncController, "rs");
1106         vsyncGenerator->SetRSDistributor(mainThread->rsVSyncDistributor_);
1107     }
1108     // default data with index 0
1109     auto data = std::make_unique<RSTransactionData>();
1110     ASSERT_NE(data, nullptr);
1111     data->SetIndex(1);
1112     mainThread->effectiveTransactionDataIndexMap_[0].second.emplace_back(std::move(data));
1113     data = std::make_unique<RSTransactionData>();
1114     ASSERT_NE(data, nullptr);
1115     data->SetIndex(3);
1116     mainThread->effectiveTransactionDataIndexMap_[0].second.emplace_back(std::move(data));
1117     data = std::make_unique<RSTransactionData>();
1118     ASSERT_NE(data, nullptr);
1119     data->SetIndex(2);
1120     mainThread->effectiveTransactionDataIndexMap_[0].second.emplace_back(std::move(data));
1121     // empty data
1122     mainThread->effectiveTransactionDataIndexMap_[0].second.emplace_back(nullptr);
1123 
1124     NodeId nodeId =1;
1125     std::weak_ptr<RSContext> context = {};
1126     auto rsCanvasDrawingRenderNode = std::make_shared<RSCanvasDrawingRenderNode>(nodeId, context);
1127     auto drawableNode = DrawableV2::RSRenderNodeDrawableAdapter::OnGenerate(rsCanvasDrawingRenderNode);
1128     drawableNode->SetNeedDraw(true);
1129     mainThread->context_->nodeMap.RegisterRenderNode(rsCanvasDrawingRenderNode);
1130     mainThread->ProcessCommandForUniRender();
1131 }
1132 
1133 /**
1134  * @tc.name: GetWatermarkImg
1135  * @tc.desc: GetWatermarkImg test
1136  * @tc.type: FUNC
1137  * @tc.require: issueI7HDVG
1138  */
1139 HWTEST_F(RSMainThreadTest, GetWatermarkImg, TestSize.Level1)
1140 {
1141     auto mainThread = RSMainThread::Instance();
1142     ASSERT_EQ(mainThread->GetWatermarkImg(), nullptr);
1143 }
1144 
1145 /**
1146  * @tc.name: IsWatermarkFlagChanged
1147  * @tc.desc: IsWatermarkFlagChanged test
1148  * @tc.type: FUNC
1149  * @tc.require: issuesIA8LNR
1150  */
1151 HWTEST_F(RSMainThreadTest, IsWatermarkFlagChanged, TestSize.Level1)
1152 {
1153     auto mainThread = RSMainThread::Instance();
1154     ASSERT_NE(mainThread, nullptr);
1155     mainThread->IsWatermarkFlagChanged();
1156 }
1157 
1158 /**
1159  * @tc.name: DoParallelComposition
1160  * @tc.desc: DoParallelComposition test
1161  * @tc.type: FUNC
1162  * @tc.require: issueI7HDVG
1163  */
1164 HWTEST_F(RSMainThreadTest, DoParallelComposition, TestSize.Level1)
1165 {
1166     NodeId nodeId = 1;
1167     std::weak_ptr<RSContext> context = {};
1168     auto node = std::make_shared<RSBaseRenderNode>(nodeId, context);
1169     auto childNode = std::make_shared<RSBaseRenderNode>(nodeId + 1, context);
1170     int index = 0;
1171     node->SetIsOnTheTree(true);
1172     node->AddChild(childNode, index);
1173     node->GenerateFullChildrenList();
1174     ASSERT_EQ(static_cast<int>(node->GetChildrenCount()), 1);
1175     ASSERT_TRUE(childNode->IsOnTheTree());
1176 
1177     auto mainThread = RSMainThread::Instance();
1178     RSInnovation::_s_createParallelSyncSignal = (void*)RSMainThreadTest::CreateParallelSyncSignal;
1179     if (RSInnovation::GetParallelCompositionEnabled(mainThread->isUniRender_)) {
1180         mainThread->DoParallelComposition(node);
1181     }
1182 }
1183 
1184 /**
1185  * @tc.name: SetFocusLeashWindowId
1186  * @tc.desc: Test RSMainThreadTest.SetFocusLeashWindowId
1187  * @tc.type: FUNC
1188  * @tc.require: issueI8V6MD
1189  */
1190 HWTEST_F(RSMainThreadTest, SetFocusLeashWindowId, TestSize.Level1)
1191 {
1192     auto mainThread = RSMainThread::Instance();
1193     mainThread->Start();
1194     NodeId id = 1;
1195     auto node1 = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
1196     ASSERT_NE(node1, nullptr);
1197     RSSurfaceRenderNodeConfig config;
1198     auto node2 = std::make_shared<RSSurfaceRenderNode>(config);
1199     ASSERT_NE(node2, nullptr);
1200     node1->SetParent(node2);
1201     node1->nodeType_ = RSSurfaceNodeType::APP_WINDOW_NODE;
1202     node2->nodeType_ = RSSurfaceNodeType::LEASH_WINDOW_NODE;
1203 
1204     mainThread->context_ = std::make_shared<RSContext>();
1205     mainThread->context_->nodeMap.renderNodeMap_[0][0] = node1;
1206     mainThread->focusNodeId_ = 0;
1207     mainThread->SetFocusLeashWindowId();
1208 }
1209 
1210 /**
1211  * @tc.name: SetFocusLeashWindowId002
1212  * @tc.desc: Test SetFocusLeashWindowId while nodeMap is empty
1213  * @tc.type: FUNC
1214  * @tc.require: issueI98VTC
1215  */
1216 HWTEST_F(RSMainThreadTest, SetFocusLeashWindowId002, TestSize.Level2)
1217 {
1218     auto mainThread = RSMainThread::Instance();
1219     ASSERT_NE(mainThread, nullptr);
1220 
1221     mainThread->SetFocusLeashWindowId();
1222     ASSERT_EQ(mainThread->GetFocusLeashWindowId(), INVALID_NODEID);
1223 }
1224 
1225 /**
1226  * @tc.name: SetFocusLeashWindowId003
1227  * @tc.desc: Test SetFocusLeashWindowId while focus node don't have parent
1228  * @tc.type: FUNC
1229  * @tc.require: issueI98VTC
1230  */
1231 HWTEST_F(RSMainThreadTest, SetFocusLeashWindowId003, TestSize.Level2)
1232 {
1233     auto mainThread = RSMainThread::Instance();
1234     auto node = RSTestUtil::CreateSurfaceNode();
1235     ASSERT_NE(mainThread, nullptr);
1236     ASSERT_NE(node, nullptr);
1237 
1238     ASSERT_NE(mainThread->context_, nullptr);
1239     NodeId nodeId = node->GetId();
1240     pid_t pid = ExtractPid(nodeId);
1241     mainThread->context_->nodeMap.renderNodeMap_[pid][nodeId] = node;
1242     std::string str = "";
1243     FocusAppInfo info = {
1244         .pid = -1,
1245         .uid = -1,
1246         .bundleName = str,
1247         .abilityName = str,
1248         .focusNodeId = node->GetId()};
1249     mainThread->SetFocusAppInfo(info);
1250     mainThread->SetFocusLeashWindowId();
1251     ASSERT_EQ(mainThread->GetFocusLeashWindowId(), INVALID_NODEID);
1252 }
1253 
1254 /**
1255  * @tc.name: SetFocusLeashWindowId004
1256  * @tc.desc: Test SetFocusLeashWindowId while focus node's type don't match
1257  * @tc.type: FUNC
1258  * @tc.require: issueI98VTC
1259  */
1260 HWTEST_F(RSMainThreadTest, SetFocusLeashWindowId004, TestSize.Level2)
1261 {
1262     auto mainThread = RSMainThread::Instance();
1263     auto childNode = RSTestUtil::CreateSurfaceNode();
1264     auto parentNode = RSTestUtil::CreateSurfaceNode();
1265     ASSERT_NE(mainThread, nullptr);
1266     ASSERT_NE(childNode, nullptr);
1267     ASSERT_NE(parentNode, nullptr);
1268 
1269     parentNode->AddChild(parentNode);
1270     childNode->SetSurfaceNodeType(RSSurfaceNodeType::LEASH_WINDOW_NODE);
1271     parentNode->SetSurfaceNodeType(RSSurfaceNodeType::LEASH_WINDOW_NODE);
1272 
1273     NodeId childNodeId = childNode->GetId();
1274     pid_t childNodePid = ExtractPid(childNodeId);
1275     mainThread->context_->nodeMap.renderNodeMap_[childNodePid][childNodeId] = childNode;
1276     NodeId parentNodeId = parentNode->GetId();
1277     pid_t parentNodePid = ExtractPid(parentNodeId);
1278     mainThread->context_->nodeMap.renderNodeMap_[parentNodePid][parentNodeId] = parentNode;
1279     std::string str = "";
1280     FocusAppInfo info = {
1281         .pid = -1,
1282         .uid = -1,
1283         .bundleName = str,
1284         .abilityName = str,
1285         .focusNodeId = childNode->GetId()};
1286     mainThread->SetFocusAppInfo(info);
1287     mainThread->SetFocusLeashWindowId();
1288     ASSERT_EQ(mainThread->GetFocusLeashWindowId(), INVALID_NODEID);
1289 }
1290 
1291 /**
1292  * @tc.name: SetFocusLeashWindowId005
1293  * @tc.desc: Test SetFocusLeashWindowId while focus node's parent's type don't match
1294  * @tc.type: FUNC
1295  * @tc.require: issueI98VTC
1296  */
1297 HWTEST_F(RSMainThreadTest, SetFocusLeashWindowId005, TestSize.Level2)
1298 {
1299     auto mainThread = RSMainThread::Instance();
1300     auto childNode = RSTestUtil::CreateSurfaceNode();
1301     auto parentNode = RSTestUtil::CreateSurfaceNode();
1302     ASSERT_NE(mainThread, nullptr);
1303     ASSERT_NE(childNode, nullptr);
1304     ASSERT_NE(parentNode, nullptr);
1305 
1306     parentNode->AddChild(parentNode);
1307     childNode->SetSurfaceNodeType(RSSurfaceNodeType::APP_WINDOW_NODE);
1308     parentNode->SetSurfaceNodeType(RSSurfaceNodeType::APP_WINDOW_NODE);
1309 
1310     NodeId childNodeId = childNode->GetId();
1311     NodeId parentNodeId = parentNode->GetId();
1312     pid_t childNodePid = ExtractPid(childNodeId);
1313     pid_t parentNodePid = ExtractPid(parentNodeId);
1314     mainThread->context_->nodeMap.renderNodeMap_[childNodePid][childNodeId] = childNode;
1315     mainThread->context_->nodeMap.renderNodeMap_[parentNodePid][parentNodeId] = parentNode;
1316     std::string str = "";
1317     FocusAppInfo info = {
1318         .pid = -1,
1319         .uid = -1,
1320         .bundleName = str,
1321         .abilityName = str,
1322         .focusNodeId = childNode->GetId()};
1323     mainThread->SetFocusAppInfo(info);
1324     mainThread->SetFocusLeashWindowId();
1325     ASSERT_EQ(mainThread->GetFocusLeashWindowId(), INVALID_NODEID);
1326 }
1327 
1328 /**
1329  * @tc.name: SetIsCachedSurfaceUpdated
1330  * @tc.desc: Test RSMainThreadTest.SetIsCachedSurfaceUpdated
1331  * @tc.type: FUNC
1332  * @tc.require: issueI8V6MD
1333  */
1334 HWTEST_F(RSMainThreadTest, SetIsCachedSurfaceUpdated, TestSize.Level1)
1335 {
1336     auto mainThread = RSMainThread::Instance();
1337     ASSERT_NE(mainThread, nullptr);
1338     mainThread->SetIsCachedSurfaceUpdated(true);
1339 }
1340 
1341 /**
1342  * @tc.name: PrintCurrentStatus
1343  * @tc.desc: Test RSMainThreadTest.PrintCurrentStatus
1344  * @tc.type: FUNC
1345  * @tc.require: issueI8V6MD
1346  */
1347 HWTEST_F(RSMainThreadTest, PrintCurrentStatus, TestSize.Level1)
1348 {
1349     auto mainThread = RSMainThread::Instance();
1350     ASSERT_NE(mainThread, nullptr);
1351     mainThread->PrintCurrentStatus();
1352 }
1353 
1354 /**
1355  * @tc.name: SetDeviceType
1356  * @tc.desc: Test RSMainThreadTest.SetDeviceType
1357  * @tc.type: FUNC
1358  * @tc.require: issueI8V6MD
1359  */
1360 HWTEST_F(RSMainThreadTest, SetDeviceType, TestSize.Level1)
1361 {
1362     auto mainThread = RSMainThread::Instance();
1363     ASSERT_NE(mainThread, nullptr);
1364     system::SetParameter("const.product.devicetype", "pc");
1365     mainThread->SetDeviceType();
1366     system::SetParameter("const.product.devicetype", "tablet");
1367     mainThread->SetDeviceType();
1368     system::SetParameter("const.product.devicetype", "others");
1369     mainThread->SetDeviceType();
1370     system::SetParameter("const.product.devicetype", "phone");
1371     mainThread->SetDeviceType();
1372 }
1373 
1374 /**
1375  * @tc.name: CacheCommands
1376  * @tc.desc: Test RSMainThreadTest.CacheCommands
1377  * @tc.type: FUNC
1378  * @tc.require: issueI8V6MD
1379  */
1380 HWTEST_F(RSMainThreadTest, CacheCommands, TestSize.Level1)
1381 {
1382     auto mainThread = RSMainThread::Instance();
1383     ASSERT_NE(mainThread, nullptr);
1384     auto data = std::make_unique<RSTransactionData>();
1385     ASSERT_NE(data, nullptr);
1386     data->SetIndex(1);
1387     mainThread->cachedSkipTransactionDataMap_[0].emplace_back(std::move(data));
1388     data = std::make_unique<RSTransactionData>();
1389     ASSERT_NE(data, nullptr);
1390     data->SetIndex(2);
1391     mainThread->cachedSkipTransactionDataMap_[0].emplace_back(std::move(data));
1392     mainThread->CacheCommands();
1393 }
1394 
1395 /**
1396  * @tc.name: CheckParallelSubThreadNodesStatus
1397  * @tc.desc: Test RSMainThreadTest.CheckParallelSubThreadNodesStatus
1398  * @tc.type: FUNC
1399  * @tc.require: issueI8V6MD
1400  */
1401 HWTEST_F(RSMainThreadTest, CheckParallelSubThreadNodesStatus, TestSize.Level1)
1402 {
1403     auto mainThread = RSMainThread::Instance();
1404     ASSERT_NE(mainThread, nullptr);
1405     mainThread->subThreadNodes_.clear();
1406     mainThread->subThreadNodes_.push_back(nullptr);
1407     mainThread->CheckParallelSubThreadNodesStatus();
1408 
1409     auto node1 = std::make_shared<RSSurfaceRenderNode>(0xFFFFFFFFFFFFFFFF);
1410     node1->cacheProcessStatus_ = CacheProcessStatus::DOING;
1411     node1->name_ = "node1";
1412     node1->nodeType_ = RSSurfaceNodeType::APP_WINDOW_NODE;
1413     node1->hasAbilityComponent_ = true;
1414     node1->abilityNodeIds_.emplace(10);
1415     node1->abilityNodeIds_.emplace(11);
1416     auto node2 = std::make_shared<RSSurfaceRenderNode>(2);
1417     node2->cacheProcessStatus_ = CacheProcessStatus::DOING;
1418     node2->name_ = "node2";
1419     node2->nodeType_ = RSSurfaceNodeType::LEASH_WINDOW_NODE;
1420     auto node3 = std::make_shared<RSSurfaceRenderNode>(0xFFFFFFFFFFFFFFF0);
1421     node3->cacheProcessStatus_ = CacheProcessStatus::DOING;
1422     node3->name_ = "node3";
1423     node3->nodeType_ = RSSurfaceNodeType::APP_WINDOW_NODE;
1424     node3->hasAbilityComponent_ = false;
1425     // create child nodes
1426     auto childNode1 = std::make_shared<RSSurfaceRenderNode>(3);
1427     childNode1->name_ = "childNode1";
1428     childNode1->nodeType_ = RSSurfaceNodeType::APP_WINDOW_NODE;
1429     auto childNode2 = std::make_shared<RSSurfaceRenderNode>(4);
1430     childNode2->name_ = "childNode2";
1431     childNode2->nodeType_ = RSSurfaceNodeType::APP_WINDOW_NODE;
1432     auto childNode3 = std::make_shared<RSSurfaceRenderNode>(5);
1433     childNode3->name_ = "childNode3";
1434 
1435     node2->AddChild(childNode1);
1436     node2->AddChild(childNode2);
1437     node2->AddChild(childNode3);
1438     node2->GenerateFullChildrenList();
1439     mainThread->subThreadNodes_.push_back(node1);
1440     mainThread->subThreadNodes_.push_back(node2);
1441     mainThread->subThreadNodes_.push_back(node3);
1442 
1443     mainThread->cacheCmdSkippedInfo_.clear();
1444     mainThread->CheckParallelSubThreadNodesStatus();
1445 }
1446 
1447 /**
1448  * @tc.name: IsNeedSkip
1449  * @tc.desc: IsNeedSkip test
1450  * @tc.type: FUNC
1451  * @tc.require: issueI7HDVG
1452  */
1453 HWTEST_F(RSMainThreadTest, IsNeedSkip, TestSize.Level1)
1454 {
1455     auto mainThread = RSMainThread::Instance();
1456     ASSERT_NE(mainThread, nullptr);
1457     mainThread->IsNeedSkip(0, 0);
1458 }
1459 
1460 /**
1461  * @tc.name: SkipCommandByNodeId001
1462  * @tc.desc: SkipCommandByNodeId test
1463  * @tc.type: FUNC
1464  * @tc.require: issueI7HDVG
1465  */
1466 HWTEST_F(RSMainThreadTest, SkipCommandByNodeId001, TestSize.Level1)
1467 {
1468     auto mainThread = RSMainThread::Instance();
1469     ASSERT_NE(mainThread, nullptr);
1470     std::vector<std::unique_ptr<RSTransactionData>> transactionVec;
1471     mainThread->SkipCommandByNodeId(transactionVec, -1);
1472 }
1473 
1474 /**
1475  * @tc.name: SkipCommandByNodeId002
1476  * @tc.desc: SkipCommandByNodeId test
1477  * @tc.type: FUNC
1478  * @tc.require: issueI7HDVG
1479  */
1480 HWTEST_F(RSMainThreadTest, SkipCommandByNodeId002, TestSize.Level1)
1481 {
1482     auto mainThread = RSMainThread::Instance();
1483     ASSERT_NE(mainThread, nullptr);
1484     // prepare transactionVec
1485     std::vector<std::unique_ptr<RSTransactionData>> transactionVec;
1486     auto data = std::make_unique<RSTransactionData>();
1487     data->SetIndex(1);
1488     transactionVec.emplace_back(std::move(data));
1489     data = std::make_unique<RSTransactionData>();
1490     data->SetIndex(2);
1491     data->payload_.resize(2);
1492     data->payload_[0] = std::tuple<NodeId, FollowType, std::unique_ptr<RSCommand>>(0, FollowType::NONE, nullptr);
1493     transactionVec.emplace_back(std::move(data));
1494     std::pair<std::vector<NodeId>, bool> info = {{0}, true};
1495     mainThread->cacheCmdSkippedInfo_.insert({0, info});
1496     mainThread->SkipCommandByNodeId(transactionVec, 0);
1497 }
1498 
1499 /**
1500  * @tc.name: SkipCommandByNodeId003
1501  * @tc.desc: SkipCommandByNodeId test cacheCmdSkippedInfo_ is empty
1502  * @tc.type: FUNC
1503  * @tc.require: issueIAS924
1504  */
1505 HWTEST_F(RSMainThreadTest, SkipCommandByNodeId003, TestSize.Level1)
1506 {
1507     auto mainThread = RSMainThread::Instance();
1508     ASSERT_NE(mainThread, nullptr);
1509     std::vector<std::unique_ptr<RSTransactionData>> transactionVec;
1510     mainThread->cacheCmdSkippedInfo_.clear();
1511     mainThread->SkipCommandByNodeId(transactionVec, 0);
1512 }
1513 
1514 /**
1515  * @tc.name: ConsumeAndUpdateAllNodes001
1516  * @tc.desc: ConsumeAndUpdateAllNodes test
1517  * @tc.type: FUNC
1518  * @tc.require: issueI7HDVG
1519  */
1520 HWTEST_F(RSMainThreadTest, ConsumeAndUpdateAllNodes001, TestSize.Level1)
1521 {
1522     auto mainThread = RSMainThread::Instance();
1523     ASSERT_NE(mainThread, nullptr);
1524     bool isUniRender = mainThread->isUniRender_;
1525     mainThread->isUniRender_ = false;
1526     mainThread->ConsumeAndUpdateAllNodes();
1527     mainThread->isUniRender_ = isUniRender;
1528 }
1529 
1530 /**
1531  * @tc.name: ConsumeAndUpdateAllNodes002
1532  * @tc.desc: ConsumeAndUpdateAllNodes test
1533  * @tc.type: FUNC
1534  * @tc.require: issueI7HDVG
1535  */
1536 HWTEST_F(RSMainThreadTest, ConsumeAndUpdateAllNodes002, TestSize.Level1)
1537 {
1538     auto mainThread = RSMainThread::Instance();
1539     ASSERT_NE(mainThread, nullptr);
1540     bool isUniRender = mainThread->isUniRender_;
1541     mainThread->isUniRender_ = false;
1542     mainThread->ConsumeAndUpdateAllNodes();
1543     mainThread->isUniRender_ = isUniRender;
1544 }
1545 
1546 /**
1547  * @tc.name: IsSurfaceConsumerNeedSkip001
1548  * @tc.desc: IsSurfaceConsumerNeedSkip test
1549  * @tc.type: FUNC
1550  * @tc.require: issueICKWDL
1551  */
1552 HWTEST_F(RSMainThreadTest, IsSurfaceConsumerNeedSkip001, TestSize.Level1)
1553 {
1554     auto mainThread = RSMainThread::Instance();
1555     ASSERT_NE(mainThread, nullptr);
1556     auto distributor = mainThread->rsVSyncDistributor_;
1557     sptr<IConsumerSurface> cSurface = nullptr;
1558     auto res = mainThread->IsSurfaceConsumerNeedSkip(cSurface);
1559     ASSERT_EQ(res, false);
1560     cSurface = IConsumerSurface::Create();
1561     auto vsyncGenerator = CreateVSyncGenerator();
1562     auto vsyncController = new VSyncController(vsyncGenerator, 0);
1563     mainThread->rsVSyncDistributor_ = new VSyncDistributor(vsyncController, "rs");
1564     res = mainThread->IsSurfaceConsumerNeedSkip(cSurface);
1565     ASSERT_EQ(res, false);
1566     mainThread->rsVSyncDistributor_ = distributor;
1567 }
1568 
1569 /**
1570  * @tc.name: CheckSubThreadNodeStatusIsDoing001
1571  * @tc.desc: CheckSubThreadNodeStatusIsDoing test
1572  * @tc.type: FUNC
1573  * @tc.require: issueI7HDVG
1574  */
1575 HWTEST_F(RSMainThreadTest, CheckSubThreadNodeStatusIsDoing001, TestSize.Level1)
1576 {
1577     auto mainThread = RSMainThread::Instance();
1578     ASSERT_NE(mainThread, nullptr);
1579     mainThread->subThreadNodes_.clear();
1580     auto rsSurfaceRenderNode1 = RSTestUtil::CreateSurfaceNode();
1581     rsSurfaceRenderNode1->SetCacheSurfaceProcessedStatus(CacheProcessStatus::WAITING);
1582     auto rsSurfaceRenderNode2 = RSTestUtil::CreateSurfaceNode();
1583     rsSurfaceRenderNode2->SetCacheSurfaceProcessedStatus(CacheProcessStatus::DOING);
1584     mainThread->subThreadNodes_.emplace_back(rsSurfaceRenderNode1);
1585     mainThread->subThreadNodes_.emplace_back(rsSurfaceRenderNode2);
1586     mainThread->CheckSubThreadNodeStatusIsDoing(rsSurfaceRenderNode2->GetId());
1587 }
1588 
1589 /**
1590  * @tc.name: CheckSubThreadNodeStatusIsDoing002
1591  * @tc.desc: CheckSubThreadNodeStatusIsDoing test
1592  * @tc.type: FUNC
1593  * @tc.require: issueI7HDVG
1594  */
1595 HWTEST_F(RSMainThreadTest, CheckSubThreadNodeStatusIsDoing002, TestSize.Level1)
1596 {
1597     auto mainThread = RSMainThread::Instance();
1598     ASSERT_NE(mainThread, nullptr);
1599     mainThread->subThreadNodes_.clear();
1600     auto rsSurfaceRenderNode1 = RSTestUtil::CreateSurfaceNode();
1601     rsSurfaceRenderNode1->SetCacheSurfaceProcessedStatus(CacheProcessStatus::DOING);
1602     auto rsSurfaceRenderNode2 = RSTestUtil::CreateSurfaceNode();
1603     rsSurfaceRenderNode1->AddChild(rsSurfaceRenderNode2);
1604     rsSurfaceRenderNode1->GenerateFullChildrenList();
1605     mainThread->subThreadNodes_.emplace_back(rsSurfaceRenderNode1);
1606     mainThread->CheckSubThreadNodeStatusIsDoing(rsSurfaceRenderNode2->GetId());
1607 }
1608 
1609 /**
1610  * @tc.name: CollectInfoForHardwareComposer001
1611  * @tc.desc: CheckSubThreadNodeStatusIsDoing test
1612  * @tc.type: FUNC
1613  * @tc.require: issueI7HDVG
1614  */
1615 HWTEST_F(RSMainThreadTest, CollectInfoForHardwareComposer001, TestSize.Level1)
1616 {
1617     auto mainThread = RSMainThread::Instance();
1618     ASSERT_NE(mainThread, nullptr);
1619     bool isUniRender = mainThread->isUniRender_;
1620     mainThread->isUniRender_ = false;
1621     mainThread->CollectInfoForHardwareComposer();
1622     mainThread->isUniRender_ = isUniRender;
1623 }
1624 
1625 /**
1626  * @tc.name: CollectInfoForHardwareComposer002
1627  * @tc.desc: CheckSubThreadNodeStatusIsDoing test
1628  * @tc.type: FUNC
1629  * @tc.require: issueI7HDVG
1630  */
1631 HWTEST_F(RSMainThreadTest, CollectInfoForHardwareComposer002, TestSize.Level1)
1632 {
1633     auto mainThread = RSMainThread::Instance();
1634     ASSERT_NE(mainThread, nullptr);
1635     bool isUniRender = mainThread->isUniRender_;
1636     mainThread->isUniRender_ = true;
1637     mainThread->CollectInfoForHardwareComposer();
1638     mainThread->isUniRender_ = isUniRender;
1639 }
1640 
1641 /**
1642  * @tc.name: IsLastFrameUIFirstEnabled001
1643  * @tc.desc: IsLastFrameUIFirstEnabled test
1644  * @tc.type: FUNC
1645  * @tc.require: issueI7HDVG
1646  */
1647 HWTEST_F(RSMainThreadTest, IsLastFrameUIFirstEnabled001, TestSize.Level1)
1648 {
1649     auto mainThread = RSMainThread::Instance();
1650     ASSERT_NE(mainThread, nullptr);
1651     mainThread->subThreadNodes_.clear();
1652     // not app window
1653     NodeId id = 1;
1654     auto node = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
1655     node->nodeType_ = RSSurfaceNodeType::LEASH_WINDOW_NODE;
1656     mainThread->subThreadNodes_.push_back(node);
1657     mainThread->IsLastFrameUIFirstEnabled(0);
1658     // app window
1659     id = 2;
1660     node = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
1661     node->nodeType_ = RSSurfaceNodeType::APP_WINDOW_NODE;
1662     mainThread->subThreadNodes_.push_back(node);
1663     mainThread->IsLastFrameUIFirstEnabled(2);
1664 }
1665 
1666 
1667 /**
1668  * @tc.name: IsLastFrameUIFirstEnabled002
1669  * @tc.desc: IsLastFrameUIFirstEnabled test
1670  * @tc.type: FUNC
1671  * @tc.require: issueI7HDVG
1672  */
1673 HWTEST_F(RSMainThreadTest, IsLastFrameUIFirstEnabled002, TestSize.Level1)
1674 {
1675     auto mainThread = RSMainThread::Instance();
1676     ASSERT_NE(mainThread, nullptr);
1677     mainThread->subThreadNodes_.clear();
1678     // parent
1679     NodeId id = 1;
1680     auto node1 = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
1681     node1->nodeType_ = RSSurfaceNodeType::LEASH_WINDOW_NODE;
1682     // child
1683     id = 2;
1684     auto node2 = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
1685     node2->nodeType_ = RSSurfaceNodeType::APP_WINDOW_NODE;
1686     node1->AddChild(node2);
1687     node1->GenerateFullChildrenList();
1688     mainThread->subThreadNodes_.push_back(node1);
1689     mainThread->IsLastFrameUIFirstEnabled(2);
1690 }
1691 
1692 /**
1693  * @tc.name: GetMultiDisplay001
1694  * @tc.desc: GetMultiDisplay test
1695  * @tc.type: FUNC
1696  * @tc.require: issueI7HDVG
1697  */
1698 HWTEST_F(RSMainThreadTest, GetMultiDisplay001, TestSize.Level1)
1699 {
1700     auto mainThread = RSMainThread::Instance();
1701     ASSERT_NE(mainThread, nullptr);
1702     ASSERT_NE(mainThread->context_, nullptr);
1703     auto rootNode = mainThread->context_->globalRootRenderNode_;
1704     ASSERT_FALSE(RSMainThread::GetMultiDisplay(rootNode));
1705 
1706     auto rsContext = std::make_shared<RSContext>();
1707     auto node1 = std::make_shared<RSScreenRenderNode>(1, 0, rsContext->weak_from_this());
1708     auto node2 = std::make_shared<RSScreenRenderNode>(2, 0, rsContext->weak_from_this());
1709     auto node3 = std::make_shared<RSRenderNode>(3, true);
1710     auto node4 = std::make_shared<RSRenderNode>(4, true);
1711     node1->AddChild(node3);
1712     node2->AddChild(node4);
1713     rootNode->AddChild(node1);
1714     rootNode->AddChild(node2);
1715     ASSERT_TRUE(RSMainThread::GetMultiDisplay(rootNode));
1716 }
1717 
1718 /**
1719  * @tc.name: CheckIfHardwareForcedDisabled
1720  * @tc.desc: CheckIfHardwareForcedDisabled test
1721  * @tc.type: FUNC
1722  * @tc.require: issueI7HDVG
1723  */
1724 HWTEST_F(RSMainThreadTest, CheckIfHardwareForcedDisabled, TestSize.Level1)
1725 {
1726 #ifdef RS_ENABLE_UNI_RENDER
1727     auto mainThread = RSMainThread::Instance();
1728     ASSERT_NE(mainThread, nullptr);
1729     mainThread->CheckIfHardwareForcedDisabled();
1730     mainThread->context_->globalRootRenderNode_ = nullptr;
1731     mainThread->CheckIfHardwareForcedDisabled();
1732     NodeId id = 0;
1733     mainThread->context_->globalRootRenderNode_ = std::make_shared<RSRenderNode>(id++, true);
1734 
1735     std::vector<std::shared_ptr<OHOS::Rosen::RSRenderNode>> vec;
1736     vec.push_back(nullptr);
1737     auto rsContext = std::make_shared<RSContext>();
1738     auto displayNode1 = std::make_shared<RSScreenRenderNode>(id++, 0, rsContext->weak_from_this());
1739     auto mirrorSourceNode = std::make_shared<RSScreenRenderNode>(id++, 0, rsContext->weak_from_this());
1740     displayNode1->mirrorSource_ = mirrorSourceNode;
1741     vec.push_back(displayNode1);
1742     auto displayNode2 = std::make_shared<RSScreenRenderNode>(id++, 0, rsContext->weak_from_this());
1743     vec.push_back(displayNode2);
1744     const std::vector<std::shared_ptr<OHOS::Rosen::RSRenderNode>> vec1 = vec;
1745     auto vec1Ptr = std::make_shared<std::vector<std::shared_ptr<OHOS::Rosen::RSRenderNode>>>(vec1);
1746     mainThread->context_->globalRootRenderNode_->fullChildrenList_ = vec1Ptr;
1747 
1748     mainThread->CheckIfHardwareForcedDisabled();
1749 #endif
1750 }
1751 
1752 /**
1753  * @tc.name: CheckIfHardwareForcedDisabled
1754  * @tc.desc: CheckIfHardwareForcedDisabled002 test child = nullptr and type != SCREEN_NODE
1755  * @tc.type: FUNC
1756  * @tc.require: issueIAS924
1757  */
1758 HWTEST_F(RSMainThreadTest, CheckIfHardwareForcedDisabled002, TestSize.Level1)
1759 {
1760 #ifdef RS_ENABLE_UNI_RENDER
1761     auto mainThread = RSMainThread::Instance();
1762     ASSERT_NE(mainThread, nullptr);
1763     ASSERT_NE(mainThread->context_, nullptr);
1764     auto rootNode = mainThread->context_->globalRootRenderNode_;
1765     auto node1 = std::make_shared<RSRenderNode>(1, true);
1766     std::shared_ptr<RSRenderNode> node2 = nullptr;
1767     auto node3 = std::make_shared<RSSurfaceRenderNode>(2, mainThread->context_);
1768     node3->nodeType_ = RSSurfaceNodeType::LEASH_WINDOW_NODE;
1769     auto node4 = std::make_shared<RSRenderNode>(3, true);
1770     node1->children_.emplace_back(node2);
1771     node1->AddChild(node3);
1772     node1->AddChild(node4);
1773     mainThread->context_->globalRootRenderNode_ = node1;
1774     mainThread->CheckIfHardwareForcedDisabled();
1775     mainThread->context_->globalRootRenderNode_ = rootNode;
1776 #endif
1777 }
1778 
1779 /**
1780  * @tc.name: WaitUntilUnmarshallingTaskFinished001
1781  * @tc.desc: WaitUntilUnmarshallingTaskFinished test, divided render, the func call will return immediately.
1782  * @tc.type: FUNC
1783  * @tc.require: issueI7HDVG
1784  */
1785 HWTEST_F(RSMainThreadTest, WaitUntilUnmarshallingTaskFinished001, TestSize.Level1)
1786 {
1787     auto mainThread = RSMainThread::Instance();
1788     ASSERT_NE(mainThread, nullptr);
1789     bool isUniRender = mainThread->isUniRender_;
1790     mainThread->isUniRender_ = false;
1791     mainThread->WaitUntilUnmarshallingTaskFinished();
1792     mainThread->isUniRender_ = isUniRender;
1793 }
1794 
1795 /**
1796  * @tc.name: NotifyUnmarshalTask001
1797  * @tc.desc: NotifyUnmarshalTask test, divided render, the func call will return immediately.
1798  * @tc.type: FUNC
1799  * @tc.require: issueI7HDVG
1800  */
1801 HWTEST_F(RSMainThreadTest, NotifyUnmarshalTask001, TestSize.Level1)
1802 {
1803     auto mainThread = RSMainThread::Instance();
1804     ASSERT_NE(mainThread, nullptr);
1805     bool isUniRender = mainThread->isUniRender_;
1806     mainThread->isUniRender_ = false;
1807     int64_t ts = 10000000;
1808     mainThread->NotifyUnmarshalTask(ts);
1809     mainThread->isUniRender_ = isUniRender;
1810 }
1811 
1812 /**
1813  * @tc.name: MergeToEffectiveTransactionDataMap
1814  * @tc.desc: MergeToEffectiveTransactionDataMap test
1815  * @tc.type: FUNC
1816  * @tc.require: issueI7HDVG
1817  */
1818 HWTEST_F(RSMainThreadTest, MergeToEffectiveTransactionDataMap, TestSize.Level1)
1819 {
1820     auto mainThread = RSMainThread::Instance();
1821     ASSERT_NE(mainThread, nullptr);
1822     TransactionDataMap tsDataMap;
1823     tsDataMap.emplace(0, std::vector<std::unique_ptr<RSTransactionData>>());
1824     auto data = std::make_unique<RSTransactionData>();
1825     data->SetIndex(1);
1826     tsDataMap[0].emplace_back(std::move(data));
1827     mainThread->MergeToEffectiveTransactionDataMap(tsDataMap);
1828     ASSERT_TRUE(tsDataMap.empty());
1829 }
1830 
1831 /**
1832  * @tc.name: UniRender001
1833  * @tc.desc: UniRender test
1834  * @tc.type: FUNC
1835  * @tc.require: issueI7HDVG
1836  */
1837 HWTEST_F(RSMainThreadTest, UniRender001, TestSize.Level1)
1838 {
1839     auto mainThread = RSMainThread::Instance();
1840     ASSERT_NE(mainThread, nullptr);
1841     auto& uniRenderThread = RSUniRenderThread::Instance();
1842     uniRenderThread.uniRenderEngine_ = std::make_shared<RSUniRenderEngine>();
1843     mainThread->renderThreadParams_ = std::make_unique<RSRenderThreadParams>();
1844     // prepare nodes
1845     std::shared_ptr<RSContext> context = std::make_shared<RSContext>();
1846     const std::shared_ptr<RSBaseRenderNode> rootNode = context->GetGlobalRootRenderNode();
1847     NodeId id = 1;
1848     auto rsContext = std::make_shared<RSContext>();
1849     auto childDisplayNode = std::make_shared<RSScreenRenderNode>(id, 0, rsContext->weak_from_this());
1850     rootNode->AddChild(childDisplayNode, 0);
1851     rootNode->InitRenderParams();
1852     childDisplayNode->InitRenderParams();
1853     mainThread->UniRender(rootNode);
1854 }
1855 
1856 /**
1857  * @tc.name: UniRender002
1858  * @tc.desc: UniRender test
1859  * @tc.type: FUNC
1860  * @tc.require: issueI7HDVG
1861  */
1862 HWTEST_F(RSMainThreadTest, UniRender002, TestSize.Level1)
1863 {
1864     auto mainThread = RSMainThread::Instance();
1865     ASSERT_NE(mainThread, nullptr);
1866     auto& uniRenderThread = RSUniRenderThread::Instance();
1867     uniRenderThread.uniRenderEngine_ = std::make_shared<RSUniRenderEngine>();
1868     mainThread->renderThreadParams_ = std::make_unique<RSRenderThreadParams>();
1869     // prepare nodes
1870     std::shared_ptr<RSContext> context = std::make_shared<RSContext>();
1871     const std::shared_ptr<RSBaseRenderNode> rootNode = context->GetGlobalRootRenderNode();
1872     NodeId id = 1;
1873     auto rsContext = std::make_shared<RSContext>();
1874     auto childDisplayNode = std::make_shared<RSScreenRenderNode>(id, 0, rsContext->weak_from_this());
1875     rootNode->AddChild(childDisplayNode, 0);
1876     // prepare status
1877     bool doDirectComposition = mainThread->doDirectComposition_;
1878     bool isDirty = mainThread->isDirty_;
1879     bool isAccessibilityConfigChanged = mainThread->isAccessibilityConfigChanged_;
1880     bool isCachedSurfaceUpdated = mainThread->isCachedSurfaceUpdated_;
1881     bool isHardwareEnabledBufferUpdated = mainThread->isHardwareEnabledBufferUpdated_;
1882     mainThread->doDirectComposition_ = true;
1883     mainThread->isDirty_ = false;
1884     mainThread->isAccessibilityConfigChanged_ = false;
1885     mainThread->isCachedSurfaceUpdated_ = false;
1886     mainThread->isHardwareEnabledBufferUpdated_ = true;
1887     rootNode->InitRenderParams();
1888     childDisplayNode->InitRenderParams();
1889     mainThread->UniRender(rootNode);
1890     // status recover
1891     mainThread->doDirectComposition_ = doDirectComposition;
1892     mainThread->isDirty_ = isDirty;
1893     mainThread->isAccessibilityConfigChanged_ = isAccessibilityConfigChanged;
1894     mainThread->isCachedSurfaceUpdated_ = isCachedSurfaceUpdated;
1895     mainThread->isHardwareEnabledBufferUpdated_ = isHardwareEnabledBufferUpdated;
1896 }
1897 
1898 /**
1899  * @tc.name: UniRender003
1900  * @tc.desc: UniRender test
1901  * @tc.type: FUNC
1902  * @tc.require:
1903  */
1904 HWTEST_F(RSMainThreadTest, UniRender003, TestSize.Level1)
1905 {
1906     auto mainThread = RSMainThread::Instance();
1907     ASSERT_NE(mainThread, nullptr);
1908     auto& uniRenderThread = RSUniRenderThread::Instance();
1909     uniRenderThread.uniRenderEngine_ = std::make_shared<RSUniRenderEngine>();
1910     mainThread->renderThreadParams_ = std::make_unique<RSRenderThreadParams>();
1911     // prepare nodes
1912     std::shared_ptr<RSContext> context = std::make_shared<RSContext>();
1913     const std::shared_ptr<RSBaseRenderNode> rootNode = context->GetGlobalRootRenderNode();
1914     NodeId screenNodeId = 2;
1915     ScreenId screenId = 3;
1916     auto screenNode = std::shared_ptr<RSScreenRenderNode>(new RSScreenRenderNode(screenNodeId,
1917         screenId, context->weak_from_this()));
1918     rootNode->AddChild(screenNode);
1919     RSDisplayNodeConfig config;
1920     NodeId displayNodeId = 1;
1921     auto childDisplayNode = std::make_shared<RSLogicalDisplayRenderNode>(displayNodeId, config);
1922     screenNode->AddChild(childDisplayNode, 0);
1923     rootNode->InitRenderParams();
1924     screenNode->InitRenderParams();
1925     childDisplayNode->InitRenderParams();
1926     if (RSSystemProperties::GetSkipDisplayIfScreenOffEnabled()) {
1927         ScreenId screenId = 1;
1928         auto screenManager = CreateOrGetScreenManager();
1929         impl::RSScreenManager& screenManagerImpl =
1930             static_cast<impl::RSScreenManager&>(*screenManager);
1931         screenManagerImpl.powerOffNeedProcessOneFrame_ = false;
1932         screenManagerImpl.screenPowerStatus_[screenId] = ScreenPowerStatus::POWER_STATUS_OFF;
1933     }
1934     mainThread->UniRender(rootNode);
1935     ASSERT_FALSE(mainThread->doDirectComposition_);
1936 }
1937 
1938 /**
1939  * @tc.name: UniRender004
1940  * @tc.desc: UniRender test
1941  * @tc.type: FUNC
1942  * @tc.require:
1943  */
1944 HWTEST_F(RSMainThreadTest, UniRender004, TestSize.Level1)
1945 {
1946 #ifdef RS_ENABLE_UNI_RENDER
1947     auto mainThread = RSMainThread::Instance();
1948     ASSERT_NE(mainThread, nullptr);
1949     mainThread->isUniRender_ = true;
1950     mainThread->renderThreadParams_ = std::make_unique<RSRenderThreadParams>();
1951 
1952     auto rsContext = std::make_shared<RSContext>();
1953     auto rootNode = rsContext->GetGlobalRootRenderNode();
1954     NodeId id = 1;
1955     auto childDisplayNode = std::make_shared<RSScreenRenderNode>(id, 0, rsContext->weak_from_this());
1956     rootNode->AddChild(childDisplayNode, 0);
1957     rootNode->InitRenderParams();
1958     childDisplayNode->InitRenderParams();
1959 
1960     NodeId nodeId = 2;
1961     RSUifirstManager::Instance().AddProcessSkippedNode(nodeId);
1962 
1963     mainThread->doDirectComposition_ = true;
1964     mainThread->isDirty_ = false;
1965     mainThread->isAccessibilityConfigChanged_ = false;
1966     mainThread->isCachedSurfaceUpdated_ = false;
1967     mainThread->isHardwareEnabledBufferUpdated_ = false;
1968     mainThread->UniRender(rootNode);
1969     ASSERT_TRUE(mainThread->doDirectComposition_);
1970 #endif
1971 }
1972 
1973 /**
1974  * @tc.name: IsFirstFrameOfOverdrawSwitch
1975  * @tc.desc: test IsFirstFrameOfOverdrawSwitch
1976  * @tc.type: FUNC
1977  * @tc.require: issueIAKQC3
1978  */
1979 HWTEST_F(RSMainThreadTest, IsFirstFrameOfOverdrawSwitch, TestSize.Level1)
1980 {
1981     auto mainThread = RSMainThread::Instance();
1982     ASSERT_NE(mainThread, nullptr);
1983     mainThread->isOverDrawEnabledOfCurFrame_ = true;
1984     ASSERT_TRUE(mainThread->IsFirstFrameOfOverdrawSwitch());
1985 }
1986 
1987 /**
1988  * @tc.name: GetFrontBufferDesiredPresentTimeStamp001
1989  * @tc.desc: test GetFrontBufferDesiredPresentTimeStamp
1990  * @tc.type: FUNC
1991  * @tc.require: issueIAKQC3
1992  */
1993 HWTEST_F(RSMainThreadTest, GetFrontBufferDesiredPresentTimeStamp001, TestSize.Level1)
1994 {
1995     auto mainThread = RSMainThread::Instance();
1996     ASSERT_NE(mainThread, nullptr);
1997     const sptr<ConsumerSurface> consumer = new ConsumerSurface("test1");
1998     consumer->Init();
1999     int64_t resultValue = 100;
2000     int64_t desiredPresentTimestamp = resultValue;
2001     mainThread->GetFrontBufferDesiredPresentTimeStamp(consumer, desiredPresentTimestamp);
2002     ASSERT_EQ(desiredPresentTimestamp, 0);
2003 }
2004 
2005 /**
2006  * @tc.name: GetFrontBufferDesiredPresentTimeStamp002
2007  * @tc.desc: test GetFrontBufferDesiredPresentTimeStamp
2008  * @tc.type: FUNC
2009  * @tc.require: issueIAKQC3
2010  */
2011 HWTEST_F(RSMainThreadTest, GetFrontBufferDesiredPresentTimeStamp002, TestSize.Level1)
2012 {
2013     auto mainThread = RSMainThread::Instance();
2014     ASSERT_NE(mainThread, nullptr);
2015     const sptr<ConsumerSurface> consumer = new ConsumerSurface("test2");
2016     consumer->Init();
2017     int64_t resultValue = 100;
2018     int64_t desiredPresentTimestamp = resultValue;
2019     uint32_t seqId = 1;
2020     consumer->consumer_->bufferQueue_->dirtyList_.clear();
2021     consumer->consumer_->bufferQueue_->dirtyList_.push_back(seqId);
2022     consumer->consumer_->bufferQueue_->bufferQueueCache_[seqId].isAutoTimestamp = true;
2023     mainThread->GetFrontBufferDesiredPresentTimeStamp(consumer, desiredPresentTimestamp);
2024     ASSERT_EQ(desiredPresentTimestamp, 0);
2025 }
2026 
2027 /**
2028  * @tc.name: GetFrontBufferDesiredPresentTimeStamp003
2029  * @tc.desc: test GetFrontBufferDesiredPresentTimeStamp
2030  * @tc.type: FUNC
2031  * @tc.require: issueIAKQC3
2032  */
2033 HWTEST_F(RSMainThreadTest, GetFrontBufferDesiredPresentTimeStamp003, TestSize.Level1)
2034 {
2035     auto mainThread = RSMainThread::Instance();
2036     ASSERT_NE(mainThread, nullptr);
2037     int64_t desiredPresentTimestamp = -1;
2038     mainThread->GetFrontBufferDesiredPresentTimeStamp(nullptr, desiredPresentTimestamp);
2039     EXPECT_EQ(desiredPresentTimestamp, 0);
2040 }
2041 
2042 /**
2043  * @tc.name: GetFrontBufferDesiredPresentTimeStamp004
2044  * @tc.desc: test GetFrontBufferDesiredPresentTimeStamp
2045  * @tc.type: FUNC
2046  * @tc.require: issueIAKQC3
2047  */
2048 HWTEST_F(RSMainThreadTest, GetFrontBufferDesiredPresentTimeStamp004, TestSize.Level1)
2049 {
2050     auto mainThread = RSMainThread::Instance();
2051     ASSERT_NE(mainThread, nullptr);
2052     const sptr<ConsumerSurface> consumer = new ConsumerSurface("test4");
2053     consumer->Init();
2054     int64_t desiredPresentTimestamp = 100000000;
2055     int64_t getDesiredPresentTimestamp = -1;
2056     uint32_t seqId = 1;
2057     consumer->consumer_->bufferQueue_->dirtyList_.clear();
2058     consumer->consumer_->bufferQueue_->dirtyList_.push_back(seqId);
2059     consumer->consumer_->bufferQueue_->bufferQueueCache_[seqId].isAutoTimestamp = false;
2060     consumer->consumer_->bufferQueue_->bufferQueueCache_[seqId].desiredPresentTimestamp = desiredPresentTimestamp;
2061     mainThread->GetFrontBufferDesiredPresentTimeStamp(consumer, getDesiredPresentTimestamp);
2062     EXPECT_EQ(getDesiredPresentTimestamp, desiredPresentTimestamp);
2063 }
2064 
2065 /**
2066  * @tc.name: GetFrontBufferDesiredPresentTimeStamp005
2067  * @tc.desc: test GetFrontBufferDesiredPresentTimeStamp
2068  * @tc.type: FUNC
2069  * @tc.require: issueIAKQC3
2070  */
2071 HWTEST_F(RSMainThreadTest, GetFrontBufferDesiredPresentTimeStamp005, TestSize.Level1)
2072 {
2073     auto mainThread = RSMainThread::Instance();
2074     ASSERT_NE(mainThread, nullptr);
2075     const sptr<ConsumerSurface> consumer = new ConsumerSurface("test5");
2076     consumer->Init();
2077     int64_t desiredPresentTimestamp = 100000000;
2078     int64_t getDesiredPresentTimestamp = -1;
2079     uint32_t seqId = 1;
2080     consumer->consumer_->bufferQueue_->dirtyList_.clear();
2081     consumer->consumer_->bufferQueue_->dirtyList_.push_back(seqId);
2082     consumer->consumer_->bufferQueue_->bufferQueueCache_[seqId].isAutoTimestamp = false;
2083     consumer->consumer_->bufferQueue_->bufferQueueCache_[seqId].desiredPresentTimestamp = desiredPresentTimestamp;
2084 
2085     uint64_t vsyncRsTimestamp = mainThread->vsyncRsTimestamp_.load(); // record
2086     mainThread->vsyncRsTimestamp_.store(desiredPresentTimestamp - 1);
2087     mainThread->GetFrontBufferDesiredPresentTimeStamp(consumer, getDesiredPresentTimestamp);
2088     EXPECT_EQ(getDesiredPresentTimestamp, desiredPresentTimestamp);
2089 
2090     mainThread->vsyncRsTimestamp_.store(desiredPresentTimestamp);
2091     mainThread->GetFrontBufferDesiredPresentTimeStamp(consumer, getDesiredPresentTimestamp);
2092     EXPECT_EQ(getDesiredPresentTimestamp, 0);
2093 
2094     mainThread->vsyncRsTimestamp_.store(desiredPresentTimestamp + 1);
2095     mainThread->GetFrontBufferDesiredPresentTimeStamp(consumer, getDesiredPresentTimestamp);
2096     EXPECT_EQ(getDesiredPresentTimestamp, 0);
2097 
2098     mainThread->vsyncRsTimestamp_.store(desiredPresentTimestamp + 1000000000); // add 1s
2099     mainThread->GetFrontBufferDesiredPresentTimeStamp(consumer, getDesiredPresentTimestamp);
2100     EXPECT_EQ(getDesiredPresentTimestamp, 0);
2101 
2102     mainThread->vsyncRsTimestamp_.store(desiredPresentTimestamp + 1000000001); // add 1+s
2103     mainThread->GetFrontBufferDesiredPresentTimeStamp(consumer, getDesiredPresentTimestamp);
2104     EXPECT_EQ(getDesiredPresentTimestamp, 0);
2105 
2106     mainThread->vsyncRsTimestamp_.store(vsyncRsTimestamp); // reset
2107 }
2108 
2109 /**
2110  * @tc.name: GetFrontBufferDesiredPresentTimeStamp006
2111  * @tc.desc: test GetFrontBufferDesiredPresentTimeStamp
2112  * @tc.type: FUNC
2113  * @tc.require: issueIAKQC3
2114  */
2115 HWTEST_F(RSMainThreadTest, GetFrontBufferDesiredPresentTimeStamp006, TestSize.Level1)
2116 {
2117     auto mainThread = RSMainThread::Instance();
2118     ASSERT_NE(mainThread, nullptr);
2119     const sptr<ConsumerSurface> consumer = new ConsumerSurface("test6");
2120     consumer->Init();
2121     int64_t getDesiredPresentTimestamp = -1;
2122     mainThread->GetFrontBufferDesiredPresentTimeStamp(consumer, getDesiredPresentTimestamp);
2123     EXPECT_EQ(getDesiredPresentTimestamp, 0);
2124 
2125     int64_t desiredPresentTimestamp = -1;
2126     uint32_t seqId = 1;
2127     consumer->consumer_->bufferQueue_->dirtyList_.clear();
2128     consumer->consumer_->bufferQueue_->dirtyList_.push_back(seqId);
2129     consumer->consumer_->bufferQueue_->bufferQueueCache_[seqId].isAutoTimestamp = false;
2130     consumer->consumer_->bufferQueue_->bufferQueueCache_[seqId].desiredPresentTimestamp = desiredPresentTimestamp;
2131     mainThread->GetFrontBufferDesiredPresentTimeStamp(consumer, getDesiredPresentTimestamp);
2132     EXPECT_EQ(getDesiredPresentTimestamp, 0);
2133 }
2134 
2135 /**
2136  * @tc.name: GetFrontBufferDesiredPresentTimeStamp007
2137  * @tc.desc: test GetFrontBufferDesiredPresentTimeStamp
2138  * @tc.type: FUNC
2139  * @tc.require: issueIAKQC3
2140  */
2141 HWTEST_F(RSMainThreadTest, GetFrontBufferDesiredPresentTimeStamp007, TestSize.Level1)
2142 {
2143     auto mainThread = RSMainThread::Instance();
2144     ASSERT_NE(mainThread, nullptr);
2145     const sptr<ConsumerSurface> consumer = new ConsumerSurface("test7");
2146     consumer->Init();
2147     uint32_t seqId = 1;
2148     int64_t desiredPresentTimestamp = 999999999; // 0.999ms
2149     consumer->consumer_->bufferQueue_->dirtyList_.clear();
2150     consumer->consumer_->bufferQueue_->dirtyList_.push_back(seqId);
2151     consumer->consumer_->bufferQueue_->bufferQueueCache_[seqId].isAutoTimestamp = false;
2152     consumer->consumer_->bufferQueue_->bufferQueueCache_[seqId].desiredPresentTimestamp = desiredPresentTimestamp;
2153 
2154     int64_t getDesiredPresentTimestamp = -1;
2155     uint64_t vsyncRsTimestamp = mainThread->vsyncRsTimestamp_.load(); // record
2156 
2157     mainThread->vsyncRsTimestamp_.store(desiredPresentTimestamp / 2);
2158     mainThread->GetFrontBufferDesiredPresentTimeStamp(consumer, getDesiredPresentTimestamp);
2159     EXPECT_EQ(getDesiredPresentTimestamp, desiredPresentTimestamp);
2160 
2161     desiredPresentTimestamp = 1100000000; // 1.1ms
2162     consumer->consumer_->bufferQueue_->bufferQueueCache_[seqId].desiredPresentTimestamp = desiredPresentTimestamp;
2163     mainThread->vsyncRsTimestamp_.store(0);
2164     mainThread->GetFrontBufferDesiredPresentTimeStamp(consumer, getDesiredPresentTimestamp);
2165     EXPECT_EQ(getDesiredPresentTimestamp, 0);
2166     mainThread->vsyncRsTimestamp_.store(vsyncRsTimestamp); // reset
2167 }
2168 
2169 /**
2170  * @tc.name: GetRealTimeOffsetOfDvsync
2171  * @tc.desc: test GetRealTimeOffsetOfDvsync
2172  * @tc.type: FUNC
2173  * @tc.require: issueIAXG6P
2174  */
2175 HWTEST_F(RSMainThreadTest, GetRealTimeOffsetOfDvsync, TestSize.Level1)
2176 {
2177     auto mainThread = RSMainThread::Instance();
2178     ASSERT_NE(mainThread, nullptr);
2179     int64_t time = 1000;
2180     uint64_t offset = mainThread->GetRealTimeOffsetOfDvsync(time);
2181     ASSERT_EQ(offset, 0);
2182 }
2183 
2184 /**
2185  * @tc.name: Render
2186  * @tc.desc: Render test
2187  * @tc.type: FUNC
2188  * @tc.require: issueI7HDVG
2189  */
2190 HWTEST_F(RSMainThreadTest, Render, TestSize.Level1)
2191 {
2192     auto mainThread = RSMainThread::Instance();
2193     ASSERT_NE(mainThread, nullptr);
2194     auto& uniRenderThread = RSUniRenderThread::Instance();
2195     uniRenderThread.uniRenderEngine_ = std::make_shared<RSUniRenderEngine>();
2196     mainThread->renderThreadParams_ = std::make_unique<RSRenderThreadParams>();
2197     const std::shared_ptr<RSBaseRenderNode> rootNode = mainThread->context_->globalRootRenderNode_;
2198     NodeId id = 1;
2199     auto rsContext = std::make_shared<RSContext>();
2200     auto childDisplayNode = std::make_shared<RSScreenRenderNode>(id, 0, rsContext->weak_from_this());
2201     rootNode->AddChild(childDisplayNode);
2202     bool isUniRender = mainThread->isUniRender_;
2203     mainThread->runner_ = AppExecFwk::EventRunner::Create(false);
2204     mainThread->handler_ = std::make_shared<AppExecFwk::EventHandler>(mainThread->runner_);
2205     // uni render
2206     mainThread->isUniRender_ = true;
2207     rootNode->InitRenderParams();
2208     childDisplayNode->InitRenderParams();
2209     mainThread->Render();
2210     mainThread->runner_ = nullptr;
2211     mainThread->handler_ = nullptr;
2212     mainThread->isUniRender_ = isUniRender;
2213 }
2214 
2215 /**
2216  * @tc.name: Render
2217  * @tc.desc: Render002 test rootNode = nullptr
2218  * @tc.type: FUNC
2219  * @tc.require: issueIAS924
2220  */
2221 HWTEST_F(RSMainThreadTest, Render002, TestSize.Level1)
2222 {
2223     auto mainThread = RSMainThread::Instance();
2224     ASSERT_NE(mainThread, nullptr);
2225     ASSERT_NE(mainThread->context_, nullptr);
2226     auto rootNode = mainThread->context_->globalRootRenderNode_;
2227     mainThread->context_->globalRootRenderNode_ = nullptr;
2228     mainThread->Render();
2229     mainThread->context_->globalRootRenderNode_ = rootNode;
2230 }
2231 
2232 /**
2233  * @tc.name: CallbackDrawContextStatusToWMS
2234  * @tc.desc: CallbackDrawContextStatusToWMS test
2235  * @tc.type: FUNC
2236  * @tc.require: issueI7HDVG
2237  */
2238 HWTEST_F(RSMainThreadTest, CallbackDrawContextStatusToWMS, TestSize.Level1)
2239 {
2240     auto mainThread = RSMainThread::Instance();
2241     ASSERT_NE(mainThread, nullptr);
2242     mainThread->curDrawStatusVec_.push_back(0);
2243     mainThread->curDrawStatusVec_.push_back(1);
2244     mainThread->lastDrawStatusMap_.insert({1, 0});
2245     mainThread->occlusionListeners_.insert({0, nullptr});
2246     mainThread->CallbackDrawContextStatusToWMS();
2247     mainThread->curDrawStatusVec_.clear();
2248     mainThread->lastDrawStatusMap_.clear();
2249     mainThread->occlusionListeners_.clear();
2250 }
2251 
2252 /**
2253  * @tc.name: CheckSurfaceNeedProcess
2254  * @tc.desc: CheckSurfaceNeedProcess test
2255  * @tc.type: FUNC
2256  * @tc.require: issueI7HDVG
2257  */
2258 HWTEST_F(RSMainThreadTest, CheckSurfaceNeedProcess, TestSize.Level1)
2259 {
2260     auto mainThread = RSMainThread::Instance();
2261     ASSERT_NE(mainThread, nullptr);
2262     OcclusionRectISet occRectISet;
2263     // not focus node
2264     NodeId id = 1;
2265     auto node = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
2266     mainThread->CheckSurfaceNeedProcess(occRectISet, node);
2267     // focus node
2268     id = mainThread->focusNodeId_;
2269     node = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
2270     mainThread->CheckSurfaceNeedProcess(occRectISet, node);
2271 }
2272 
2273 /**
2274  * @tc.name: GetRegionVisibleLevel001
2275  * @tc.desc: GetRegionVisibleLevel test
2276  * @tc.type: FUNC
2277  * @tc.require: issueI7HDVG
2278  */
2279 HWTEST_F(RSMainThreadTest, GetRegionVisibleLevel001, TestSize.Level1)
2280 {
2281     auto mainThread = RSMainThread::Instance();
2282     ASSERT_NE(mainThread, nullptr);
2283     // empty region
2284     Occlusion::Region occRegion;
2285     mainThread->GetRegionVisibleLevel(occRegion, occRegion);
2286 }
2287 
2288 /**
2289  * @tc.name: GetRegionVisibleLevel002
2290  * @tc.desc: GetRegionVisibleLevel test
2291  * @tc.type: FUNC
2292  * @tc.require: issueI7HDVG
2293  */
2294 HWTEST_F(RSMainThreadTest, GetRegionVisibleLevel002, TestSize.Level1)
2295 {
2296     auto mainThread = RSMainThread::Instance();
2297     ASSERT_NE(mainThread, nullptr);
2298     // equal region
2299     Occlusion::Region occRegion;
2300     occRegion.rects_.emplace_back(Occlusion::Rect(0, 1, 1, 0));
2301     mainThread->GetRegionVisibleLevel(occRegion, occRegion);
2302 }
2303 
2304 /**
2305  * @tc.name: GetRegionVisibleLevel003
2306  * @tc.desc: GetRegionVisibleLevel test
2307  * @tc.type: FUNC
2308  * @tc.require: issueI7HDVG
2309  */
2310 HWTEST_F(RSMainThreadTest, GetRegionVisibleLevel003, TestSize.Level1)
2311 {
2312     auto mainThread = RSMainThread::Instance();
2313     ASSERT_NE(mainThread, nullptr);
2314     Occlusion::Region occRegion1;
2315     occRegion1.rects_.emplace_back(Occlusion::Rect(0, 1, 1, 0));
2316     Occlusion::Region occRegion2;
2317     occRegion2.rects_.emplace_back(Occlusion::Rect(0, 2, 2, 0));
2318     mainThread->GetRegionVisibleLevel(occRegion1, occRegion2);
2319 }
2320 
2321 /**
2322  * @tc.name: CalcOcclusionImplementation
2323  * @tc.desc: CalcOcclusionImplementation test
2324  * @tc.type: FUNC
2325  * @tc.require: issueI7HDVG
2326  */
2327 HWTEST_F(RSMainThreadTest, CalcOcclusionImplementation, TestSize.Level1)
2328 {
2329     auto mainThread = RSMainThread::Instance();
2330     ASSERT_NE(mainThread, nullptr);
2331     NodeId displayNodeId = 0;
2332     auto displayNode = std::make_shared<RSScreenRenderNode>(displayNodeId, 0, mainThread->context_->weak_from_this());
2333 
2334     std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
2335     NodeId surfaceNodeId = 0;
2336     auto surfaceNode = std::make_shared<RSSurfaceRenderNode>(surfaceNodeId, mainThread->context_);
2337     curAllSurfaces.emplace_back(nullptr);
2338     curAllSurfaces.emplace_back(surfaceNode);
2339     VisibleData dstCurVisVec;
2340     std::map<NodeId, RSVisibleLevel> dstPidVisMap;
2341     mainThread->CalcOcclusionImplementation(displayNode, curAllSurfaces, dstCurVisVec, dstPidVisMap);
2342 }
2343 
2344 /**
2345  * @tc.name: CallbackToWMS001
2346  * @tc.desc: CallbackToWMS test visible not changed
2347  * @tc.type: FUNC
2348  * @tc.require: issueI7HDVG
2349  */
2350 HWTEST_F(RSMainThreadTest, CallbackToWMS001, TestSize.Level1)
2351 {
2352     auto mainThread = RSMainThread::Instance();
2353     ASSERT_NE(mainThread, nullptr);
2354     VisibleData curVisVec;
2355     curVisVec.push_back({0, WINDOW_LAYER_INFO_TYPE::ALL_VISIBLE});
2356     mainThread->lastVisVec_ = curVisVec;
2357     mainThread->CallbackToWMS(curVisVec);
2358     mainThread->lastVisVec_.clear();
2359 }
2360 
2361 /**
2362  * @tc.name: CallbackToWMS002
2363  * @tc.desc: CallbackToWMS test visible changed
2364  * @tc.type: FUNC
2365  * @tc.require: issueI7HDVG
2366  */
2367 HWTEST_F(RSMainThreadTest, CallbackToWMS002, TestSize.Level1)
2368 {
2369     auto mainThread = RSMainThread::Instance();
2370     ASSERT_NE(mainThread, nullptr);
2371     VisibleData curVisVec;
2372     curVisVec.push_back({0, WINDOW_LAYER_INFO_TYPE::ALL_VISIBLE});
2373     curVisVec.push_back({1, WINDOW_LAYER_INFO_TYPE::SEMI_VISIBLE});
2374     mainThread->lastVisVec_.push_back({0, WINDOW_LAYER_INFO_TYPE::ALL_VISIBLE});
2375     mainThread->lastVisVec_.push_back({1, WINDOW_LAYER_INFO_TYPE::INVISIBLE});
2376     mainThread->occlusionListeners_.insert({0, nullptr});
2377     mainThread->CallbackToWMS(curVisVec);
2378     mainThread->occlusionListeners_.clear();
2379     mainThread->lastVisVec_.clear();
2380 }
2381 
2382 /**
2383  * @tc.name: SurfaceOcclusionCallback001
2384  * @tc.desc: SurfaceOcclusionCallback with empty nodemap
2385  * @tc.type: FUNC
2386  * @tc.require: issueI7HDVG
2387  */
2388 HWTEST_F(RSMainThreadTest, SurfaceOcclusionCallback001, TestSize.Level1)
2389 {
2390     auto mainThread = RSMainThread::Instance();
2391     ASSERT_NE(mainThread, nullptr);
2392     // prepare listeners
2393     std::tuple<pid_t, sptr<RSISurfaceOcclusionChangeCallback>,
2394         std::vector<float>, uint8_t> info(0, nullptr, {}, 0);
2395     mainThread->surfaceOcclusionListeners_.insert({0, info});
2396     // run
2397     mainThread->SurfaceOcclusionCallback();
2398     mainThread->surfaceOcclusionListeners_.clear();
2399 }
2400 
2401 /**
2402  * @tc.name: SurfaceOcclusionCallback002
2403  * @tc.desc: SurfaceOcclusionCallback with corresponding nodemap
2404  * @tc.type: FUNC
2405  * @tc.require: issueI7HDVG
2406  */
2407 HWTEST_F(RSMainThreadTest, SurfaceOcclusionCallback002, TestSize.Level1)
2408 {
2409     auto mainThread = RSMainThread::Instance();
2410     ASSERT_NE(mainThread, nullptr);
2411     // prepare listeners
2412     std::tuple<pid_t, sptr<RSISurfaceOcclusionChangeCallback>,
2413         std::vector<float>, uint8_t> info(0, nullptr, {}, 0);
2414     mainThread->surfaceOcclusionListeners_.insert({1, info});
2415     mainThread->surfaceOcclusionListeners_.insert({2, info});
2416     mainThread->surfaceOcclusionListeners_.insert({3, info});
2417     //prepare nodemap
2418     RSSurfaceRenderNodeConfig config;
2419     config.id = 1;
2420     auto node1 = std::make_shared<RSSurfaceRenderNode>(config);
2421     node1->SetIsOnTheTree(true);
2422     config.id = 2;
2423     auto node2 = std::make_shared<RSSurfaceRenderNode>(config);
2424     node2->SetIsOnTheTree(true);
2425     node2->instanceRootNodeId_ = INVALID_NODEID;
2426     config.id = 3;
2427     auto node3 = std::make_shared<RSSurfaceRenderNode>(config);
2428     node3->SetIsOnTheTree(true);
2429     node3->instanceRootNodeId_ = 1;
2430     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node1);
2431     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node2);
2432     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node3);
2433     // run
2434     mainThread->SurfaceOcclusionCallback();
2435     mainThread->surfaceOcclusionListeners_.clear();
2436 }
2437 
2438 /**
2439  * @tc.name: SurfaceOcclusionCallback003
2440  * @tc.desc: SurfaceOcclusionCallback for appwindow
2441  * @tc.type: FUNC
2442  * @tc.require: issuesIBE1C8
2443  */
2444 HWTEST_F(RSMainThreadTest, SurfaceOcclusionCallback003, TestSize.Level1)
2445 {
2446     auto mainThread = RSMainThread::Instance();
2447     ASSERT_NE(mainThread, nullptr);
2448     RectI rectBottom = RectI(-1000000, -1000000, 999999, 999999);
2449 
2450     // prepare listeners
2451     std::tuple<pid_t, sptr<RSISurfaceOcclusionChangeCallback>,
2452         std::vector<float>, uint8_t> info(0, nullptr, {}, 0);
2453     mainThread->surfaceOcclusionListeners_.insert({1, info});
2454     mainThread->surfaceOcclusionListeners_.insert({2, info});
2455     mainThread->surfaceOcclusionListeners_.insert({3, info});
2456 
2457     //prepare nodemap
2458     RSSurfaceRenderNodeConfig config;
2459     config.id = 1;
2460     auto node1 = std::make_shared<RSSurfaceRenderNode>(config);
2461     ASSERT_NE(node1, nullptr);
2462     node1->SetIsOnTheTree(true);
2463     config.id = 2;
2464     auto node2 = std::make_shared<RSSurfaceRenderNode>(config);
2465     ASSERT_NE(node2, nullptr);
2466     node2->SetIsOnTheTree(true);
2467     node2->instanceRootNodeId_ = INVALID_NODEID;
2468     config.id = 3;
2469     auto node3 = std::make_shared<RSSurfaceRenderNode>(config);
2470     ASSERT_NE(node3, nullptr);
2471     node3->SetIsOnTheTree(true);
2472     node3->instanceRootNodeId_ = 1;
2473 
2474     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node1);
2475     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node2);
2476     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node3);
2477     mainThread->CheckSurfaceOcclusionNeedProcess(1);
2478     mainThread->CheckSurfaceOcclusionNeedProcess(2);
2479     mainThread->CheckSurfaceOcclusionNeedProcess(3);
2480     for (auto &listener : mainThread->savedAppWindowNode_) {
2481         auto& property = listener.second.second->GetRenderProperties();
2482         listener.second.second->SetVisibleRegion(Occlusion::Region(rectBottom));
2483         auto& geoPtr = property.GetBoundsGeometry();
2484         geoPtr->SetAbsRect();
2485     }
2486 
2487     // run
2488     mainThread->SurfaceOcclusionCallback();
2489     mainThread->surfaceOcclusionListeners_.clear();
2490     ASSERT_TRUE(mainThread->surfaceOcclusionListeners_.empty());
2491 }
2492 
2493 /**
2494  * @tc.name: SurfaceOcclusionCallback004
2495  * @tc.desc: SurfaceOcclusionCallback with vector of surfaceOcclusionListeners_
2496  * @tc.type: FUNC
2497  * @tc.require: issuesIBE1C8
2498  */
2499 HWTEST_F(RSMainThreadTest, SurfaceOcclusionCallback004, TestSize.Level1)
2500 {
2501     auto mainThread = RSMainThread::Instance();
2502     ASSERT_NE(mainThread, nullptr);
2503     RectI rectBottom = RectI(-1000000, -1000000, 999999, 999999);
2504     // prepare listeners
2505     std::tuple<pid_t, sptr<RSISurfaceOcclusionChangeCallback>,
2506         std::vector<float>, uint8_t> info(0, nullptr, {1, 2, 3}, 0);
2507     mainThread->surfaceOcclusionListeners_.insert({1, info});
2508     mainThread->surfaceOcclusionListeners_.insert({2, info});
2509     mainThread->surfaceOcclusionListeners_.insert({3, info});
2510     //prepare nodemap
2511     RSSurfaceRenderNodeConfig config;
2512     config.id = 1;
2513     auto node1 = std::make_shared<RSSurfaceRenderNode>(config);
2514     ASSERT_NE(node1, nullptr);
2515     node1->SetIsOnTheTree(true);
2516     config.id = 2;
2517     auto node2 = std::make_shared<RSSurfaceRenderNode>(config);
2518     ASSERT_NE(node2, nullptr);
2519     node2->SetIsOnTheTree(true);
2520     node2->instanceRootNodeId_ = INVALID_NODEID;
2521     config.id = 3;
2522     auto node3 = std::make_shared<RSSurfaceRenderNode>(config);
2523     ASSERT_NE(node3, nullptr);
2524     node3->SetIsOnTheTree(true);
2525     node3->instanceRootNodeId_ = 1;
2526     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node1);
2527     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node2);
2528     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node3);
2529     mainThread->CheckSurfaceOcclusionNeedProcess(1);
2530     mainThread->CheckSurfaceOcclusionNeedProcess(2);
2531     mainThread->CheckSurfaceOcclusionNeedProcess(3);
2532     for (auto &listener : mainThread->savedAppWindowNode_) {
2533         auto& property = listener.second.second->GetRenderProperties();
2534         listener.second.second->SetVisibleRegion(Occlusion::Region(rectBottom));
2535         auto& geoPtr = property.GetBoundsGeometry();
2536         geoPtr->SetAbsRect();
2537     }
2538 
2539     // run
2540     mainThread->SurfaceOcclusionCallback();
2541     mainThread->surfaceOcclusionListeners_.clear();
2542     ASSERT_TRUE(mainThread->surfaceOcclusionListeners_.empty());
2543 }
2544 
2545 /**
2546  * @tc.name: SurfaceOcclusionCallback005
2547  * @tc.desc: SurfaceOcclusionCallback with visibleAreaRatio on rectBottom
2548  * @tc.type: FUNC
2549  * @tc.require: issuesIBE1C8
2550  */
2551 HWTEST_F(RSMainThreadTest, SurfaceOcclusionCallback005, TestSize.Level1)
2552 {
2553     auto mainThread = RSMainThread::Instance();
2554     ASSERT_NE(mainThread, nullptr);
2555     RectI rectBottom = RectI(-1000000, -1000000, 599999, 599999);
2556 
2557     // prepare listeners
2558     std::tuple<pid_t, sptr<RSISurfaceOcclusionChangeCallback>,
2559         std::vector<float>, uint8_t> info(0, nullptr, {1, 2, 3}, 0);
2560     mainThread->surfaceOcclusionListeners_.insert({1, info});
2561     mainThread->surfaceOcclusionListeners_.insert({2, info});
2562     mainThread->surfaceOcclusionListeners_.insert({3, info});
2563 
2564     //prepare nodemap
2565     RSSurfaceRenderNodeConfig config;
2566     config.id = 1;
2567     auto node1 = std::make_shared<RSSurfaceRenderNode>(config);
2568     ASSERT_NE(node1, nullptr);
2569     node1->SetIsOnTheTree(true);
2570     config.id = 2;
2571     auto node2 = std::make_shared<RSSurfaceRenderNode>(config);
2572     ASSERT_NE(node2, nullptr);
2573     node2->SetIsOnTheTree(true);
2574     node2->instanceRootNodeId_ = INVALID_NODEID;
2575     config.id = 3;
2576     auto node3 = std::make_shared<RSSurfaceRenderNode>(config);
2577     ASSERT_NE(node3, nullptr);
2578     node3->SetIsOnTheTree(true);
2579     node3->instanceRootNodeId_ = 1;
2580     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node1);
2581     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node2);
2582     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node3);
2583     mainThread->CheckSurfaceOcclusionNeedProcess(1);
2584     mainThread->CheckSurfaceOcclusionNeedProcess(2);
2585     mainThread->CheckSurfaceOcclusionNeedProcess(3);
2586     for (auto &listener : mainThread->savedAppWindowNode_) {
2587         auto& property = listener.second.second->GetRenderProperties();
2588         listener.second.second->SetVisibleRegion(Occlusion::Region(rectBottom));
2589         auto& geoPtr = property.GetBoundsGeometry();
2590         geoPtr->SetAbsRect();
2591     }
2592 
2593     // run
2594     mainThread->SurfaceOcclusionCallback();
2595     mainThread->surfaceOcclusionListeners_.clear();
2596     ASSERT_TRUE(mainThread->surfaceOcclusionListeners_.empty());
2597 }
2598 
2599 /**
2600  * @tc.name: CheckSurfaceOcclusionNeedProcess
2601  * @tc.desc: CheckSurfaceOcclusionNeedProcess Test while node out of appWindow
2602  * @tc.type: FUNC
2603  * @tc.require: issuesIBE1C8
2604  */
2605 HWTEST_F(RSMainThreadTest, CheckSurfaceOcclusionNeedProcess001, TestSize.Level1)
2606 {
2607     auto mainThread = RSMainThread::Instance();
2608     ASSERT_NE(mainThread, nullptr);
2609     RSSurfaceRenderNodeConfig config;
2610 
2611     config.id = 1;
2612     auto node = std::make_shared<RSSurfaceRenderNode>(config);
2613     ASSERT_NE(node, nullptr);
2614     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node);
2615     auto appNode = mainThread->savedAppWindowNode_.find(1);
2616     appNode->second = {};
2617 
2618     bool result = mainThread->CheckSurfaceOcclusionNeedProcess(1);
2619     ASSERT_FALSE(result);
2620 }
2621 
2622 /**
2623  * @tc.name: CheckSurfaceOcclusionNeedProcess
2624  * @tc.desc: CheckSurfaceOcclusionNeedProcess Test for appId invalid
2625  * @tc.type: FUNC
2626  * @tc.require: issuesIBE1C8
2627  */
2628 HWTEST_F(RSMainThreadTest, CheckSurfaceOcclusionNeedProcess002, TestSize.Level1)
2629 {
2630     auto mainThread = RSMainThread::Instance();
2631     ASSERT_NE(mainThread, nullptr);
2632     RSSurfaceRenderNodeConfig config;
2633 
2634     config.id = 1;
2635     auto node1 = std::make_shared<RSSurfaceRenderNode>(config);
2636     ASSERT_NE(node1, nullptr);
2637     node1->instanceRootNodeId_ = INSTANCE_ID_UNDEFINED;
2638     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node1);
2639 
2640     config.id = 2;
2641     auto node2 = std::make_shared<RSSurfaceRenderNode>(config);
2642     ASSERT_NE(node2, nullptr);
2643     node2->instanceRootNodeId_ = INSTANCE_ID_UNDEFINED;
2644     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node2);
2645     mainThread->savedAppWindowNode_[2] = {node1, node2};
2646 
2647     bool result = mainThread->CheckSurfaceOcclusionNeedProcess(2);
2648     ASSERT_FALSE(result);
2649 }
2650 
2651 /**
2652  * @tc.name: CheckSurfaceOcclusionNeedProcess
2653  * @tc.desc: CheckSurfaceOcclusionNeedProcess Test while node is empty
2654  * @tc.type: FUNC
2655  * @tc.require: issuesIBE1C8
2656  */
2657 HWTEST_F(RSMainThreadTest, CheckSurfaceOcclusionNeedProcess003, TestSize.Level1)
2658 {
2659     auto mainThread = RSMainThread::Instance();
2660     ASSERT_NE(mainThread, nullptr);
2661     RSSurfaceRenderNodeConfig config;
2662 
2663     config.id = 1;
2664     auto node1 = std::make_shared<RSSurfaceRenderNode>(config);
2665     ASSERT_NE(node1, nullptr);
2666     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node1);
2667 
2668     config.id = 2;
2669     auto node2 = std::make_shared<RSSurfaceRenderNode>(config);
2670     ASSERT_NE(node2, nullptr);
2671     node2->SetIsOnTheTree(true);
2672     node2->instanceRootNodeId_ = INVALID_NODEID;
2673     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node2);
2674 
2675     mainThread->savedAppWindowNode_.clear();
2676     bool result1 = mainThread->CheckSurfaceOcclusionNeedProcess(1);
2677     ASSERT_FALSE(result1);
2678     bool result2 = mainThread->CheckSurfaceOcclusionNeedProcess(2);
2679     ASSERT_FALSE(result2);
2680 }
2681 
2682 /**
2683  * @tc.name: GetVsyncRefreshRate
2684  * @tc.desc: GetVsyncRefreshRate Test
2685  * @tc.type: FUNC
2686  * @tc.require: issueICAANX
2687  */
2688 HWTEST_F(RSMainThreadTest, GetVsyncRefreshRate001, TestSize.Level1)
2689 {
2690     auto mainThread = RSMainThread::Instance();
2691     ASSERT_NE(mainThread, nullptr);
2692     mainThread->vsyncGenerator_ = nullptr;
2693     uint32_t refreshRate = mainThread->GetVsyncRefreshRate();
2694     ASSERT_EQ(refreshRate, 0);
2695 }
2696 
2697 /**
2698  * @tc.name: CalcOcclusion002
2699  * @tc.desc: CalcOcclusion Test
2700  * @tc.type: FUNC
2701  * @tc.require: issueI7HDVG
2702  */
2703 HWTEST_F(RSMainThreadTest, CalcOcclusion002, TestSize.Level1)
2704 {
2705     auto mainThread = RSMainThread::Instance();
2706     ASSERT_NE(mainThread, nullptr);
2707     // prepare states
2708     bool doWindowAnimate = mainThread->doWindowAnimate_;
2709     mainThread->doWindowAnimate_ = false;
2710     auto globalRootRenderNode = mainThread->context_->globalRootRenderNode_;
2711     // run with nullptr
2712     mainThread->context_->globalRootRenderNode_ = nullptr;
2713     mainThread->CalcOcclusion();
2714     // run with one child node
2715     auto node1 = std::make_shared<RSRenderNode>(0, true);
2716     auto node2 = std::make_shared<RSRenderNode>(1, true);
2717     node1->AddChild(node2);
2718     node1->GenerateFullChildrenList();
2719     mainThread->context_->globalRootRenderNode_ = node1;
2720     mainThread->CalcOcclusion();
2721     // run with more than one node
2722     auto node3 = std::make_shared<RSRenderNode>(0, true);
2723     auto rsContext = std::make_shared<RSContext>();
2724     auto node4 = std::make_shared<RSScreenRenderNode>(1, 0, rsContext->weak_from_this());
2725     RSSurfaceRenderNodeConfig config2;
2726     auto node5 = std::make_shared<RSSurfaceRenderNode>(config2);
2727     node3->AddChild(node4);
2728     node3->GenerateFullChildrenList();
2729     node4->curAllSurfaces_.push_back(nullptr);
2730     node4->curAllSurfaces_.push_back(node5);
2731     mainThread->context_->globalRootRenderNode_ = node3;
2732     mainThread->CalcOcclusion();
2733     // recover
2734     mainThread->doWindowAnimate_ = doWindowAnimate;
2735     mainThread->context_->globalRootRenderNode_ = globalRootRenderNode;
2736 }
2737 
2738 /**
2739  * @tc.name: Aniamte
2740  * @tc.desc: Aniamte Test
2741  * @tc.type: FUNC
2742  * @tc.require: issueI7HDVG
2743  */
2744 HWTEST_F(RSMainThreadTest, Aniamte, TestSize.Level1)
2745 {
2746     auto mainThread = RSMainThread::Instance();
2747     ASSERT_NE(mainThread, nullptr);
2748     NodeId id = 0;
2749     auto node = std::make_shared<RSRenderNode>(id);
2750     mainThread->context_->RegisterAnimatingRenderNode(node);
2751     mainThread->Animate(mainThread->timestamp_);
2752 }
2753 
2754 /**
2755  * @tc.name: RecvRSTransactionData002
2756  * @tc.desc: RecvRSTransactionData002 Test
2757  * @tc.type: FUNC
2758  * @tc.require: issueI7HDVG
2759  */
2760 HWTEST_F(RSMainThreadTest, RecvRSTransactionData002, TestSize.Level1)
2761 {
2762     auto mainThread = RSMainThread::Instance();
2763     ASSERT_NE(mainThread, nullptr);
2764     bool isUniRender = mainThread->isUniRender_;
2765     auto transactionData1 = std::make_unique<RSTransactionData>();
2766     mainThread->isUniRender_ = true;
2767     mainThread->RecvRSTransactionData(transactionData1);
2768     auto transactionData2 = std::make_unique<RSTransactionData>();
2769     mainThread->isUniRender_ = false;
2770     mainThread->RecvRSTransactionData(transactionData2);
2771     mainThread->isUniRender_ = isUniRender;
2772 }
2773 
2774 /**
2775  * @tc.name: ConsumeAndUpdateAllNodes003
2776  * @tc.desc: ConsumeAndUpdateAllNodes003 Test
2777  * @tc.type: FUNC
2778  * @tc.require: issueI7HDVG
2779  */
2780 HWTEST_F(RSMainThreadTest, ConsumeAndUpdateAllNodes003, TestSize.Level1)
2781 {
2782     auto mainThread = RSMainThread::Instance();
2783     ASSERT_NE(mainThread, nullptr);
2784     bool isUniRender = mainThread->isUniRender_;
2785     mainThread->isUniRender_ = true;
2786     // prepare nodemap
2787     mainThread->context_->GetMutableNodeMap().renderNodeMap_.clear();
2788     mainThread->context_->GetMutableNodeMap().surfaceNodeMap_.clear();
2789     mainThread->context_->GetMutableNodeMap().surfaceNodeMap_.emplace(1, nullptr);
2790     RSSurfaceRenderNodeConfig config;
2791     config.id = 2;
2792     auto node1 = std::make_shared<RSSurfaceRenderNode>(config);
2793     node1->nodeType_ = RSSurfaceNodeType::APP_WINDOW_NODE;
2794     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node1);
2795     config.id = 3;
2796     auto node2 = std::make_shared<RSSurfaceRenderNode>(config);
2797     node2->nodeType_ = RSSurfaceNodeType::LEASH_WINDOW_NODE;
2798     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node2);
2799     config.id = 4;
2800     auto node3 = std::make_shared<RSSurfaceRenderNode>(config);
2801     node3->nodeType_ = RSSurfaceNodeType::SELF_DRAWING_NODE;
2802     node3->isHardwareEnabledNode_ = true;
2803     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node3);
2804     mainThread->ConsumeAndUpdateAllNodes();
2805     mainThread->isUniRender_ = isUniRender;
2806 }
2807 
2808 /**
2809  * @tc.name: ConsumeAndUpdateAllNodes004
2810  * @tc.desc: ConsumeAndUpdateAllNodes004 Test
2811  * @tc.type: FUNC
2812  * @tc.require: issueIANQPF
2813  */
2814 HWTEST_F(RSMainThreadTest, ConsumeAndUpdateAllNodes004, TestSize.Level1)
2815 {
2816 #ifndef ROSEN_CROSS_PLATFORM
2817     auto mainThread = RSMainThread::Instance();
2818     ASSERT_NE(mainThread, nullptr);
2819     bool isUniRender = mainThread->isUniRender_;
2820     mainThread->isUniRender_ = true;
2821     mainThread->timestamp_ = 1000;
2822     // prepare nodemap
2823     mainThread->context_->GetMutableNodeMap().renderNodeMap_.clear();
2824     mainThread->context_->GetMutableNodeMap().surfaceNodeMap_.clear();
2825     auto rsSurfaceRenderNode = RSTestUtil::CreateSurfaceNode();
2826     rsSurfaceRenderNode->isHardwareEnabledNode_ = true;
2827     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(rsSurfaceRenderNode);
2828     auto rsSurfaceHandlerPtr_ = rsSurfaceRenderNode->GetRSSurfaceHandler();
2829     ASSERT_NE(rsSurfaceHandlerPtr_, nullptr);
2830     auto surfaceConsumer = rsSurfaceRenderNode->GetRSSurfaceHandler()->GetConsumer();
2831     ASSERT_NE(surfaceConsumer, nullptr);
2832     auto producer = surfaceConsumer->GetProducer();
2833     ASSERT_NE(producer, nullptr);
2834     sptr<Surface> psurf = Surface::CreateSurfaceAsProducer(producer);
2835     ASSERT_NE(psurf, nullptr);
2836     psurf->SetQueueSize(5);
2837     sptr<SurfaceBuffer> buffer;
2838     sptr<SyncFence> requestFence = SyncFence::INVALID_FENCE;
2839     GSError ret = psurf->RequestBuffer(buffer, requestFence, requestConfig);
2840     ASSERT_EQ(ret, GSERROR_OK);
2841     sptr<SyncFence> flushFence = SyncFence::INVALID_FENCE;
2842     ret = psurf->FlushBuffer(buffer, flushFence, flushConfig);
2843     ASSERT_EQ(ret, GSERROR_OK);
2844     RSSurfaceHandler::SurfaceBufferEntry bufferEntry;
2845     bufferEntry.timestamp = 0;
2846     ret = psurf->RequestBuffer(bufferEntry.buffer, requestFence, requestConfig);
2847     ASSERT_EQ(ret, GSERROR_OK);
2848     rsSurfaceHandlerPtr_->SetBufferTransformTypeChanged(true);
2849     ASSERT_TRUE(rsSurfaceHandlerPtr_->GetBufferTransformTypeChanged());
2850     mainThread->ConsumeAndUpdateAllNodes();
2851     mainThread->isUniRender_ = isUniRender;
2852 #endif
2853 }
2854 
2855 /**
2856  * @tc.name: ConsumeAndUpdateAllNodes005
2857  * @tc.desc: ConsumeAndUpdateAllNodes005 Test
2858  * @tc.type: FUNC
2859  * @tc.require: issueIANQPF
2860  */
2861 HWTEST_F(RSMainThreadTest, ConsumeAndUpdateAllNodes005, TestSize.Level1)
2862 {
2863     auto mainThread = RSMainThread::Instance();
2864     ASSERT_NE(mainThread, nullptr);
2865     mainThread->isUniRender_ = true;
2866     mainThread->timestamp_ = 1000;
2867     // prepare nodemap
2868     mainThread->context_->GetMutableNodeMap().renderNodeMap_.clear();
2869     mainThread->context_->GetMutableNodeMap().surfaceNodeMap_.clear();
2870 
2871     int64_t desiredPresentTimestamp = 1000000000;
2872     uint64_t vsyncRsTimestamp = mainThread->vsyncRsTimestamp_.load(); // record
2873     mainThread->vsyncRsTimestamp_.store(desiredPresentTimestamp);
2874 
2875     auto rsSurfaceRenderNode1 = RSTestUtil::CreateSurfaceNode();
2876     EXPECT_EQ(mainThread->context_->GetMutableNodeMap().RegisterRenderNode(rsSurfaceRenderNode1), true);
2877     auto rsSurfaceRenderNode2 = RSTestUtil::CreateSurfaceNode();
2878     EXPECT_EQ(mainThread->context_->GetMutableNodeMap().RegisterRenderNode(rsSurfaceRenderNode2), true);
2879 
2880     auto surfaceConsumer1 = rsSurfaceRenderNode1->GetRSSurfaceHandler()->GetConsumer();
2881     ASSERT_NE(surfaceConsumer1, nullptr);
2882     sptr<IBufferConsumerListener> listener1 = new RSRenderServiceListener(rsSurfaceRenderNode1);
2883     EXPECT_EQ(surfaceConsumer1->RegisterConsumerListener(listener1), SURFACE_ERROR_OK);
2884     auto producer1 = surfaceConsumer1->GetProducer();
2885     ASSERT_NE(producer1, nullptr);
2886     sptr<Surface> psurf1 = Surface::CreateSurfaceAsProducer(producer1);
2887     ASSERT_NE(psurf1, nullptr);
2888     psurf1->SetQueueSize(5);
2889     SurfaceFlushBuffers(psurf1, 5, desiredPresentTimestamp);
2890 
2891     auto surfaceConsumer2 = rsSurfaceRenderNode2->GetRSSurfaceHandler()->GetConsumer();
2892     ASSERT_NE(surfaceConsumer2, nullptr);
2893     sptr<IBufferConsumerListener> listener2 = new RSRenderServiceListener(rsSurfaceRenderNode2);
2894     EXPECT_EQ(surfaceConsumer2->RegisterConsumerListener(listener2), SURFACE_ERROR_OK);
2895     auto producer2 = surfaceConsumer2->GetProducer();
2896     ASSERT_NE(producer2, nullptr);
2897     sptr<Surface> psurf2 = Surface::CreateSurfaceAsProducer(producer2);
2898     ASSERT_NE(psurf2, nullptr);
2899     psurf2->SetQueueSize(5);
2900     SurfaceFlushBuffers(psurf2, 5, desiredPresentTimestamp);
2901     mainThread->ConsumeAndUpdateAllNodes();
2902     mainThread->ConsumeAndUpdateAllNodes();
2903     mainThread->vsyncRsTimestamp_.store(vsyncRsTimestamp);
2904 }
2905 
2906 /**
2907  * @tc.name: CollectInfoForHardwareComposer003
2908  * @tc.desc: CollectInfoForHardwareComposer003 Test
2909  * @tc.type: FUNC
2910  * @tc.require: issueI7HDVG
2911  */
2912 HWTEST_F(RSMainThreadTest, CollectInfoForHardwareComposer003, TestSize.Level1)
2913 {
2914     auto mainThread = RSMainThread::Instance();
2915     ASSERT_NE(mainThread, nullptr);
2916     bool isUniRender = mainThread->isUniRender_;
2917     mainThread->isUniRender_ = true;
2918     // prepare nodemap
2919     mainThread->context_->GetMutableNodeMap().renderNodeMap_.clear();
2920     mainThread->context_->GetMutableNodeMap().surfaceNodeMap_.clear();
2921     mainThread->context_->GetMutableNodeMap().surfaceNodeMap_.emplace(1, nullptr);
2922     RSSurfaceRenderNodeConfig config;
2923     config.id = 2;
2924     auto node2 = std::make_shared<RSSurfaceRenderNode>(config);
2925     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node2);
2926     config.id = 3;
2927     auto node3 = std::make_shared<RSSurfaceRenderNode>(config);
2928     node3->SetIsOnTheTree(true);
2929     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node3);
2930     auto node4 = RSTestUtil::CreateSurfaceNodeWithBuffer();
2931     node4->SetIsOnTheTree(true);
2932     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node4);
2933     auto node5 = RSTestUtil::CreateSurfaceNodeWithBuffer();
2934     node5->SetIsOnTheTree(true);
2935     node5->nodeType_ = RSSurfaceNodeType::SELF_DRAWING_NODE;
2936     node5->isHardwareEnabledNode_ = true;
2937     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node5);
2938     mainThread->CollectInfoForHardwareComposer();
2939     mainThread->isUniRender_ = isUniRender;
2940 }
2941 
2942 /**
2943  * @tc.name: ClassifyRSTransactionData005
2944  * @tc.desc: ClassifyRSTransactionData005 Test
2945  * @tc.type: FUNC
2946  * @tc.require: issueI7HDVG
2947  */
2948 HWTEST_F(RSMainThreadTest, ClassifyRSTransactionData005, TestSize.Level1)
2949 {
2950     auto mainThread = RSMainThread::Instance();
2951     ASSERT_NE(mainThread, nullptr);
2952     bool isUniRender = mainThread->isUniRender_;
2953     mainThread->isUniRender_ = true;
2954     // prepare nodemap
2955     mainThread->context_->GetMutableNodeMap().renderNodeMap_.clear();
2956     mainThread->context_->GetMutableNodeMap().surfaceNodeMap_.clear();
2957     mainThread->context_->GetMutableNodeMap().surfaceNodeMap_.emplace(1, nullptr);
2958     RSSurfaceRenderNodeConfig config;
2959     config.id = 2;
2960     auto node2 = std::make_shared<RSSurfaceRenderNode>(config);
2961     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node2);
2962     // prepare transactionData
2963     auto data = std::make_unique<RSTransactionData>();
2964     int dataIndex = 1;
2965     data->SetIndex(dataIndex);
2966     int dataPayloadSize = 3;
2967     data->payload_.resize(dataPayloadSize);
2968     NodeId id = 0;
2969     data->payload_[id] = std::tuple<NodeId,
2970         FollowType, std::unique_ptr<RSCommand>>(id, FollowType::NONE, nullptr);
2971     id = 1;
2972     data->payload_[id] = std::tuple<NodeId,
2973         FollowType, std::unique_ptr<RSCommand>>(id, FollowType::FOLLOW_TO_SELF, nullptr);
2974     id = 2;
2975     data->payload_[id] = std::tuple<NodeId,
2976         FollowType, std::unique_ptr<RSCommand>>(id, FollowType::FOLLOW_TO_PARENT, nullptr);
2977     mainThread->ClassifyRSTransactionData(std::shared_ptr(std::move(data)));
2978     mainThread->isUniRender_ = isUniRender;
2979 }
2980 
2981 /**
2982  * @tc.name: ReleaseAllNodesBuffer
2983  * @tc.desc: ReleaseAllNodesBuffer Test
2984  * @tc.type: FUNC
2985  * @tc.require: issueI7HDVG
2986  */
2987 HWTEST_F(RSMainThreadTest, ReleaseAllNodesBuffer, TestSize.Level1)
2988 {
2989     auto mainThread = RSMainThread::Instance();
2990     ASSERT_NE(mainThread, nullptr);
2991     bool isUniRender = mainThread->isUniRender_;
2992     mainThread->isUniRender_ = true;
2993     // prepare nodemap
2994     mainThread->context_->GetMutableNodeMap().renderNodeMap_.clear();
2995     mainThread->context_->GetMutableNodeMap().surfaceNodeMap_.clear();
2996     mainThread->context_->GetMutableNodeMap().surfaceNodeMap_.emplace(1, nullptr);
2997     RSSurfaceRenderNodeConfig config;
2998     config.id = 2;
2999     auto node2 = std::make_shared<RSSurfaceRenderNode>(config);
3000     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node2);
3001     config.id = 3;
3002     auto node3 = std::make_shared<RSSurfaceRenderNode>(config);
3003     node3->nodeType_ = RSSurfaceNodeType::SELF_DRAWING_NODE;
3004     node3->isHardwareEnabledNode_ = true;
3005     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node3);
3006     config.id = 4;
3007     auto node4 = std::make_shared<RSSurfaceRenderNode>(config);
3008     node4->nodeType_ = RSSurfaceNodeType::SELF_DRAWING_NODE;
3009     node4->isHardwareEnabledNode_ = true;
3010     node4->isLastFrameHardwareEnabled_ = true;
3011     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node4);
3012     config.id = 5;
3013     auto node5 = std::make_shared<RSSurfaceRenderNode>(config);
3014     node5->nodeType_ = RSSurfaceNodeType::SELF_DRAWING_NODE;
3015     node5->isHardwareEnabledNode_ = true;
3016     node5->isLastFrameHardwareEnabled_ = true;
3017     node5->isCurrentFrameHardwareEnabled_ = false;
3018     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node5);
3019     mainThread->ReleaseAllNodesBuffer();
3020     mainThread->isUniRender_ = isUniRender;
3021 }
3022 
3023 /**
3024  * @tc.name: ReleaseAllNodesBuffer
3025  * @tc.desc: ReleaseAllNodesBuffer002 Test preBuffer != nullptr;
3026  * @tc.type: FUNC
3027  * @tc.require: issueIAS924
3028  */
3029 HWTEST_F(RSMainThreadTest, ReleaseAllNodesBuffer002, TestSize.Level1)
3030 {
3031     auto mainThread = RSMainThread::Instance();
3032     ASSERT_NE(mainThread, nullptr);
3033     ASSERT_NE(mainThread->context_, nullptr);
3034     bool isUniRender = mainThread->isUniRender_;
3035     mainThread->isUniRender_ = true;
3036     // prepare nodemap
3037     mainThread->context_->GetMutableNodeMap().renderNodeMap_.clear();
3038     mainThread->context_->GetMutableNodeMap().surfaceNodeMap_.clear();
3039     RSSurfaceRenderNodeConfig config;
3040     config.id = 1;
3041     auto node1 = std::make_shared<RSSurfaceRenderNode>(config);
3042     node1->nodeType_ = RSSurfaceNodeType::SELF_DRAWING_NODE;
3043     node1->isHardwareEnabledNode_ = true;
3044     node1->isLastFrameHardwareEnabled_ = true;
3045     node1->isCurrentFrameHardwareEnabled_ = false;
3046     sptr<SurfaceBuffer> preBuffer = OHOS::SurfaceBuffer::Create();
3047     sptr<SyncFence> acquireFence = SyncFence::InvalidFence();
3048     Rect damageRect = {0, 0, 0, 0};
3049     int64_t timestamp = 0;
3050     ASSERT_NE(node1->surfaceHandler_, nullptr);
3051     node1->surfaceHandler_->SetBuffer(preBuffer, acquireFence, damageRect, timestamp);
3052     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node1);
3053     mainThread->ReleaseAllNodesBuffer();
3054     mainThread->isUniRender_ = isUniRender;
3055 }
3056 
3057 /**
3058  * @tc.name: PostTask001
3059  * @tc.desc: PostTask Test
3060  * @tc.type: FUNC
3061  * @tc.require: issueI7HDVG
3062  */
3063 HWTEST_F(RSMainThreadTest, PostTask001, TestSize.Level1)
3064 {
3065     auto mainThread = RSMainThread::Instance();
3066     ASSERT_NE(mainThread, nullptr);
3067     mainThread->runner_ = AppExecFwk::EventRunner::Create(false);
3068     mainThread->handler_ = std::make_shared<AppExecFwk::EventHandler>(mainThread->runner_);
__anon6c0dd2f20202() 3069     RSTaskMessage::RSTask task = []() -> void { return; };
3070     mainThread->PostTask(task);
3071     mainThread->runner_ = nullptr;
3072     mainThread->handler_ = nullptr;
3073 }
3074 
3075 /**
3076  * @tc.name: PostTask002
3077  * @tc.desc: PostTask Test with IMMEDIATE Priority
3078  * @tc.type: FUNC
3079  * @tc.require: issueI7HDVG
3080  */
3081 HWTEST_F(RSMainThreadTest, PostTask002, TestSize.Level1)
3082 {
3083     auto mainThread = RSMainThread::Instance();
3084     ASSERT_NE(mainThread, nullptr);
3085     mainThread->runner_ = AppExecFwk::EventRunner::Create(false);
3086     mainThread->handler_ = std::make_shared<AppExecFwk::EventHandler>(mainThread->runner_);
__anon6c0dd2f20302() 3087     RSTaskMessage::RSTask task = []() -> void { return; };
3088     std::string name = "test";
3089     int64_t delayTime = 0;
3090     AppExecFwk::EventQueue::Priority priority = AppExecFwk::EventQueue::Priority::IMMEDIATE;
3091     mainThread->PostTask(task, name, delayTime, priority);
3092     mainThread->runner_ = nullptr;
3093     mainThread->handler_ = nullptr;
3094 }
3095 
3096 /**
3097  * @tc.name: RemoveTask
3098  * @tc.desc: RemoveTask Test
3099  * @tc.type: FUNC
3100  * @tc.require: issueI7HDVG
3101  */
3102 HWTEST_F(RSMainThreadTest, RemoveTask, TestSize.Level1)
3103 {
3104     auto mainThread = RSMainThread::Instance();
3105     ASSERT_NE(mainThread, nullptr);
3106     mainThread->runner_ = AppExecFwk::EventRunner::Create(false);
3107     mainThread->handler_ = std::make_shared<AppExecFwk::EventHandler>(mainThread->runner_);
3108     std::string name = "test";
3109     mainThread->RemoveTask(name);
3110     mainThread->runner_ = nullptr;
3111     mainThread->handler_ = nullptr;
3112 }
3113 
3114 /**
3115  * @tc.name: PostSyncTask002
3116  * @tc.desc: PostSyncTask Test
3117  * @tc.type: FUNC
3118  * @tc.require: issueI7HDVG
3119  */
3120 HWTEST_F(RSMainThreadTest, PostSyncTask002, TestSize.Level1)
3121 {
3122     auto mainThread = RSMainThread::Instance();
3123     ASSERT_NE(mainThread, nullptr);
3124     mainThread->runner_ = AppExecFwk::EventRunner::Create(false);
3125     mainThread->handler_ = std::make_shared<AppExecFwk::EventHandler>(mainThread->runner_);
__anon6c0dd2f20402() 3126     RSTaskMessage::RSTask task = []() -> void { return; };
3127     mainThread->PostSyncTask(task);
3128     mainThread->runner_ = nullptr;
3129     mainThread->handler_ = nullptr;
3130 }
3131 
3132 /**
3133  * @tc.name: RegisterSurfaceOcclusionChangeCallBack001
3134  * @tc.desc: RegisterSurfaceOcclusionChangeCallBack001 Test
3135  * @tc.type: FUNC
3136  * @tc.require: issueI7HDVG
3137  */
3138 HWTEST_F(RSMainThreadTest, RegisterSurfaceOcclusionChangeCallBack001, TestSize.Level1)
3139 {
3140     auto mainThread = RSMainThread::Instance();
3141     ASSERT_NE(mainThread, nullptr);
3142     NodeId id = 0;
3143     pid_t pid = 0;
3144     sptr<RSISurfaceOcclusionChangeCallback> callback = nullptr;
3145     std::vector<float> partitionPoints = {};
3146     mainThread->RegisterSurfaceOcclusionChangeCallback(id, pid, callback, partitionPoints);
3147     ASSERT_NE(mainThread->surfaceOcclusionListeners_.size(), 0);
3148     mainThread->surfaceOcclusionListeners_.clear();
3149 }
3150 
3151 /**
3152  * @tc.name: RegisterSurfaceOcclusionChangeCallBack002
3153  * @tc.desc: RegisterSurfaceOcclusionChangeCallBack002 Test
3154  * @tc.type: FUNC
3155  * @tc.require: issueI7HDVG
3156  */
3157 HWTEST_F(RSMainThreadTest, RegisterSurfaceOcclusionChangeCallBack002, TestSize.Level1)
3158 {
3159     auto mainThread = RSMainThread::Instance();
3160     ASSERT_NE(mainThread, nullptr);
3161     NodeId id = 0;
3162     pid_t pid = 0;
3163     sptr<RSISurfaceOcclusionChangeCallback> callback = nullptr;
3164     std::vector<float> partitionPoints = {1.0f};
3165     mainThread->RegisterSurfaceOcclusionChangeCallback(id, pid, callback, partitionPoints);
3166     ASSERT_NE(mainThread->surfaceOcclusionListeners_.size(), 0);
3167     mainThread->surfaceOcclusionListeners_.clear();
3168 }
3169 
3170 /**
3171  * @tc.name: RegisterSurfaceOcclusionChangeCallBack003
3172  * @tc.desc: Test RegisterSurfaceOcclusionChangeCallBack with the container size reaches its limit
3173  * @tc.type: FUNC
3174  * @tc.require: issueICPT5N
3175  */
3176 HWTEST_F(RSMainThreadTest, RegisterSurfaceOcclusionChangeCallBack003, TestSize.Level1)
3177 {
3178     auto mainThread = RSMainThread::Instance();
3179     ASSERT_NE(mainThread, nullptr);
3180     NodeId id = 0;
3181     pid_t pid = 0;
3182     sptr<RSISurfaceOcclusionChangeCallback> callback = nullptr;
3183     std::vector<float> partitionPoints;
3184     mainThread->RegisterSurfaceOcclusionChangeCallback(id, pid, callback, partitionPoints);
3185     EXPECT_EQ(mainThread->surfaceOcclusionListeners_.size(), 1);
3186     for (; id <= std::numeric_limits<uint16_t>::max(); ++id) {
3187         mainThread->RegisterSurfaceOcclusionChangeCallback(id, pid, callback, partitionPoints);
3188     }
3189     EXPECT_EQ(mainThread->surfaceOcclusionListeners_.size(), std::numeric_limits<uint16_t>::max());
3190     mainThread->surfaceOcclusionListeners_.clear();
3191     EXPECT_EQ(mainThread->surfaceOcclusionListeners_.size(), 0);
3192 }
3193 
3194 /**
3195  * @tc.name: ClearSurfaceOcclusionChangeCallBack
3196  * @tc.desc: RegisterSurfaceOcclusionChangeCallBack Test
3197  * @tc.type: FUNC
3198  * @tc.require: issueI7HDVG
3199  */
3200 HWTEST_F(RSMainThreadTest, ClearSurfaceOcclusionChangeCallback, TestSize.Level1)
3201 {
3202     auto mainThread = RSMainThread::Instance();
3203     ASSERT_NE(mainThread, nullptr);
3204     // prepare listeners
3205     pid_t pid = 1;
3206     int level = 0;
3207     NodeId id = 1;
3208     std::tuple<pid_t, sptr<RSISurfaceOcclusionChangeCallback>,
3209         std::vector<float>, uint8_t> info1(pid, nullptr, {}, level);
3210     mainThread->surfaceOcclusionListeners_.insert({id, info1});
3211     id = 2;
3212     pid = 2;
3213     std::tuple<pid_t, sptr<RSISurfaceOcclusionChangeCallback>,
3214         std::vector<float>, uint8_t> info2(pid, nullptr, {}, level);
3215     mainThread->surfaceOcclusionListeners_.insert({id, info2});
3216     mainThread->ClearSurfaceOcclusionChangeCallback(pid);
3217     mainThread->surfaceOcclusionListeners_.clear();
3218 }
3219 
3220 /**
3221  * @tc.name: SendCommands
3222  * @tc.desc: SendCommands Test
3223  * @tc.type: FUNC
3224  * @tc.require: issueI7HDVG
3225  */
3226 HWTEST_F(RSMainThreadTest, SendCommands, TestSize.Level1)
3227 {
3228     auto mainThread = RSMainThread::Instance();
3229     ASSERT_NE(mainThread, nullptr);
3230     mainThread->SendCommands();
3231 }
3232 
3233 /**
3234  * @tc.name: SendCommands001
3235  * @tc.desc: SendCommands Test
3236  * @tc.type: FUNC
3237  */
3238 HWTEST_F(RSMainThreadTest, SendCommands001, TestSize.Level1)
3239 {
3240     auto mainThread = RSMainThread::Instance();
3241     ASSERT_NE(mainThread, nullptr);
3242     NodeId id = 1;
3243     AnimationId animationId = 1;
3244     uint64_t token = 1;
3245     mainThread->context_->AddSyncFinishAnimationList(id, animationId, token);
3246     mainThread->SendCommands();
3247 }
3248 
3249 /**
3250  * @tc.name: ClearTransactionDataPidInfo001
3251  * @tc.desc: ClearTransactionDataPidInfo Test, remotePid = 0
3252  * @tc.type: FUNC
3253  * @tc.require: issueI7HDVG
3254  */
3255 HWTEST_F(RSMainThreadTest, ClearTransactionDataPidInfo001, TestSize.Level1)
3256 {
3257     auto mainThread = RSMainThread::Instance();
3258     ASSERT_NE(mainThread, nullptr);
3259     int remotePid = 0;
3260     mainThread->ClearTransactionDataPidInfo(remotePid);
3261 }
3262 
3263 /**
3264  * @tc.name: ClearTransactionDataPidInfo002
3265  * @tc.desc: ClearTransactionDataPidInfo Test, remotePid > 0
3266  * @tc.type: FUNC
3267  * @tc.require: issueI7HDVG
3268  */
3269 HWTEST_F(RSMainThreadTest, ClearTransactionDataPidInfo002, TestSize.Level1)
3270 {
3271     auto mainThread = RSMainThread::Instance();
3272     ASSERT_NE(mainThread, nullptr);
3273     int remotePid = 1;
3274     mainThread->ClearTransactionDataPidInfo(remotePid);
3275 }
3276 
3277 /**
3278  * @tc.name: AddTransactionDataPidInfo001
3279  * @tc.desc: AddTransactionDataPidInfo Test, no UniRender
3280  * @tc.type: FUNC
3281  * @tc.require: issueI7HDVG
3282  */
3283 HWTEST_F(RSMainThreadTest, AddTransactionDataPidInfo001, TestSize.Level1)
3284 {
3285     auto mainThread = RSMainThread::Instance();
3286     ASSERT_NE(mainThread, nullptr);
3287     auto isUniRender = mainThread->isUniRender_;
3288     mainThread->isUniRender_ = false;
3289     pid_t pid = 0;
3290     mainThread->AddTransactionDataPidInfo(pid);
3291     mainThread->isUniRender_ = isUniRender;
3292 }
3293 
3294 /**
3295  * @tc.name: AddTransactionDataPidInfo002
3296  * @tc.desc: AddTransactionDataPidInfo Test, UniRender
3297  * @tc.type: FUNC
3298  * @tc.require: issueI7HDVG
3299  */
3300 HWTEST_F(RSMainThreadTest, AddTransactionDataPidInfo002, TestSize.Level1)
3301 {
3302     auto mainThread = RSMainThread::Instance();
3303     ASSERT_NE(mainThread, nullptr);
3304     auto isUniRender = mainThread->isUniRender_;
3305     mainThread->isUniRender_ = true;
3306     pid_t pid = 0;
3307     mainThread->AddTransactionDataPidInfo(pid);
3308     mainThread->isUniRender_ = isUniRender;
3309 }
3310 
3311 /**
3312  * @tc.name: PerfAfterAnim001
3313  * @tc.desc: PerfAfterAnim Test, not UniRender, needRequestNextVsync
3314  * @tc.type: FUNC
3315  * @tc.require: issueI7HDVG
3316  */
3317 HWTEST_F(RSMainThreadTest, PerfAfterAnim001, TestSize.Level1)
3318 {
3319     auto mainThread = RSMainThread::Instance();
3320     ASSERT_NE(mainThread, nullptr);
3321     auto isUniRender = mainThread->isUniRender_;
3322     mainThread->isUniRender_ = false;
3323     bool needRequestNextVsync = true;
3324     mainThread->PerfAfterAnim(needRequestNextVsync);
3325     mainThread->isUniRender_ = isUniRender;
3326 }
3327 
3328 /**
3329  * @tc.name: PerfAfterAnim002
3330  * @tc.desc: PerfAfterAnim Test, UniRender, needRequestNextVsync
3331  * @tc.type: FUNC
3332  * @tc.require: issueI7HDVG
3333  */
3334 HWTEST_F(RSMainThreadTest, PerfAfterAnim002, TestSize.Level1)
3335 {
3336     auto mainThread = RSMainThread::Instance();
3337     ASSERT_NE(mainThread, nullptr);
3338     auto isUniRender = mainThread->isUniRender_;
3339     mainThread->isUniRender_ = true;
3340     bool needRequestNextVsync = true;
3341     mainThread->PerfAfterAnim(needRequestNextVsync);
3342     mainThread->isUniRender_ = isUniRender;
3343 }
3344 
3345 /**
3346  * @tc.name: PerfAfterAnim003
3347  * @tc.desc: PerfAfterAnim Test, UniRender, not needRequestNextVsync
3348  * @tc.type: FUNC
3349  * @tc.require: issueI7HDVG
3350  */
3351 HWTEST_F(RSMainThreadTest, PerfAfterAnim003, TestSize.Level1)
3352 {
3353     auto mainThread = RSMainThread::Instance();
3354     ASSERT_NE(mainThread, nullptr);
3355     auto isUniRender = mainThread->isUniRender_;
3356     mainThread->isUniRender_ = true;
3357     bool needRequestNextVsync = false;
3358     mainThread->PerfAfterAnim(needRequestNextVsync);
3359     mainThread->isUniRender_ = isUniRender;
3360 }
3361 
3362 /**
3363  * @tc.name: ForceRefreshForUni001
3364  * @tc.desc: ForceRefreshForUni Test, UniRender
3365  * @tc.type: FUNC
3366  * @tc.require: issueI7HDVG
3367  */
3368 HWTEST_F(RSMainThreadTest, ForceRefreshForUni001, TestSize.Level1)
3369 {
3370     auto mainThread = RSMainThread::Instance();
3371     ASSERT_NE(mainThread, nullptr);
3372     auto isUniRender = mainThread->isUniRender_;
3373     mainThread->isUniRender_ = true;
3374     mainThread->ForceRefreshForUni();
3375     mainThread->isUniRender_ = isUniRender;
3376 }
3377 
3378 /**
3379  * @tc.name: ForceRefreshForUni002
3380  * @tc.desc: ForceRefreshForUni Test, without UniRender
3381  * @tc.type: FUNC
3382  * @tc.require: issueI7HDVG
3383  */
3384 HWTEST_F(RSMainThreadTest, ForceRefreshForUni002, TestSize.Level1)
3385 {
3386     auto mainThread = RSMainThread::Instance();
3387     ASSERT_NE(mainThread, nullptr);
3388     auto isUniRender = mainThread->isUniRender_;
3389     mainThread->isUniRender_ = false;
3390     mainThread->ForceRefreshForUni();
3391     mainThread->isUniRender_ = isUniRender;
3392 }
3393 
3394 /**
3395  * @tc.name: ForceRefreshForUni003
3396  * @tc.desc: ForceRefreshForUni Test, with fastcompose
3397  * @tc.type: FUNC
3398  * @tc.require: issueIBGV2W
3399  */
3400 HWTEST_F(RSMainThreadTest, ForceRefreshForUni003, TestSize.Level1)
3401 {
3402     auto mainThread = RSMainThread::Instance();
3403     ASSERT_NE(mainThread, nullptr);
3404     auto isUniRender = mainThread->isUniRender_;
3405     mainThread->isUniRender_ = true;
3406     mainThread->ForceRefreshForUni(true);
3407     ASSERT_EQ(mainThread->isForceRefresh_, false);
3408     mainThread->isUniRender_ = isUniRender;
3409 }
3410 
3411 /**
3412  * @tc.name: PerfForBlurIfNeeded
3413  * @tc.desc: PerfForBlurIfNeeded Test
3414  * @tc.type: FUNC
3415  * @tc.require: issueI7HDVG
3416  */
3417 HWTEST_F(RSMainThreadTest, PerfForBlurIfNeeded, TestSize.Level1)
3418 {
3419     auto mainThread = RSMainThread::Instance();
3420     ASSERT_NE(mainThread, nullptr);
3421     mainThread->runner_ = AppExecFwk::EventRunner::Create(false);
3422     mainThread->handler_ = std::make_shared<AppExecFwk::EventHandler>(mainThread->runner_);
3423     mainThread->PerfForBlurIfNeeded();
3424     mainThread->runner_ = nullptr;
3425     mainThread->handler_ = nullptr;
3426 }
3427 
3428 /**
3429  * @tc.name: PerfMultiWindow001
3430  * @tc.desc: PerfMultiWindow Test, not unirender
3431  * @tc.type: FUNC
3432  * @tc.require: issueI7HDVG
3433  */
3434 HWTEST_F(RSMainThreadTest, PerfMultiWindow001, TestSize.Level1)
3435 {
3436     auto mainThread = RSMainThread::Instance();
3437     ASSERT_NE(mainThread, nullptr);
3438     auto isUniRender = mainThread->isUniRender_;
3439     mainThread->isUniRender_ = false;
3440     mainThread->PerfMultiWindow();
3441     mainThread->isUniRender_ = isUniRender;
3442 }
3443 
3444 /**
3445  * @tc.name: PerfMultiWindow002
3446  * @tc.desc: PerfMultiWindow Test, unirender
3447  * @tc.type: FUNC
3448  * @tc.require: issueI7HDVG
3449  */
3450 HWTEST_F(RSMainThreadTest, PerfMultiWindow002, TestSize.Level1)
3451 {
3452     auto mainThread = RSMainThread::Instance();
3453     ASSERT_NE(mainThread, nullptr);
3454     auto isUniRender = mainThread->isUniRender_;
3455     mainThread->isUniRender_ = true;
3456     auto appWindowNum = mainThread->appWindowNum_;
3457     mainThread->appWindowNum_ = MULTI_WINDOW_PERF_START_NUM - 1;
3458     mainThread->PerfMultiWindow();
3459     mainThread->appWindowNum_ = MULTI_WINDOW_PERF_START_NUM;
3460     mainThread->PerfMultiWindow();
3461     mainThread->appWindowNum_ = MULTI_WINDOW_PERF_END_NUM + 1;
3462     mainThread->PerfMultiWindow();
3463     mainThread->isUniRender_ = isUniRender;
3464     mainThread->appWindowNum_ = appWindowNum;
3465 }
3466 
3467 /**
3468  * @tc.name: RenderFrameStart
3469  * @tc.desc: RenderFrameStart Test
3470  * @tc.type: FUNC
3471  * @tc.require: issueI7HDVG
3472  */
3473 HWTEST_F(RSMainThreadTest, RenderFrameStart, TestSize.Level1)
3474 {
3475     auto mainThread = RSMainThread::Instance();
3476     ASSERT_NE(mainThread, nullptr);
3477     mainThread->RenderFrameStart(mainThread->timestamp_);
3478 }
3479 
3480 /**
3481  * @tc.name: SetSystemAnimatedScenes001
3482  * @tc.desc: SetSystemAnimatedScenes Test, case set 1
3483  * @tc.type: FUNC
3484  * @tc.require: issueI7HDVG
3485  */
3486 HWTEST_F(RSMainThreadTest, SetSystemAnimatedScenes001, TestSize.Level1)
3487 {
3488     auto mainThread = RSMainThread::Instance();
3489     ASSERT_NE(mainThread, nullptr);
3490     SystemAnimatedScenes scenesInit = mainThread->systemAnimatedScenes_;
3491     SystemAnimatedScenes scenes = SystemAnimatedScenes::ENTER_MISSION_CENTER;
3492     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3493     scenes = SystemAnimatedScenes::EXIT_MISSION_CENTER;
3494     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3495     scenes = SystemAnimatedScenes::ENTER_TFS_WINDOW;
3496     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3497     scenes = SystemAnimatedScenes::EXIT_TFU_WINDOW;
3498     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3499     scenes = SystemAnimatedScenes::ENTER_WINDOW_FULL_SCREEN;
3500     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3501     scenes = SystemAnimatedScenes::EXIT_WINDOW_FULL_SCREEN;
3502     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3503     scenes = SystemAnimatedScenes::ENTER_MAX_WINDOW;
3504     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3505     scenes = SystemAnimatedScenes::EXIT_MAX_WINDOW;
3506     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3507     mainThread->systemAnimatedScenes_ = scenesInit;
3508 }
3509 
3510 /**
3511  * @tc.name: SetSystemAnimatedScenes002
3512  * @tc.desc: SetSystemAnimatedScenes Test, case set 2
3513  * @tc.type: FUNC
3514  * @tc.require: issueI7HDVG
3515  */
3516 HWTEST_F(RSMainThreadTest, SetSystemAnimatedScenes002, TestSize.Level1)
3517 {
3518     auto mainThread = RSMainThread::Instance();
3519     ASSERT_NE(mainThread, nullptr);
3520     SystemAnimatedScenes scenesInit = mainThread->systemAnimatedScenes_;
3521     SystemAnimatedScenes scenes = SystemAnimatedScenes::ENTER_SPLIT_SCREEN;
3522     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3523     scenes = SystemAnimatedScenes::EXIT_SPLIT_SCREEN;
3524     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3525     scenes = SystemAnimatedScenes::ENTER_APP_CENTER;
3526     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3527     scenes = SystemAnimatedScenes::EXIT_APP_CENTER;
3528     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3529     scenes = SystemAnimatedScenes::APPEAR_MISSION_CENTER;
3530     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3531     scenes = SystemAnimatedScenes::ENTER_WIND_CLEAR;
3532     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3533     scenes = SystemAnimatedScenes::ENTER_WIND_RECOVER;
3534     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3535     scenes = SystemAnimatedScenes::OTHERS;
3536     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(scenes));
3537     mainThread->systemAnimatedScenes_ = scenesInit;
3538 }
3539 
3540 /**
3541  * @tc.name: SetSystemAnimatedScenes003
3542  * @tc.desc: SetSystemAnimatedScenes Test, System Animated Scenes Disabled
3543  * @tc.type: FUNC
3544  * @tc.require: issueI7HDVG
3545  */
3546 HWTEST_F(RSMainThreadTest, SetSystemAnimatedScenes003, TestSize.Level1)
3547 {
3548     auto mainThread = RSMainThread::Instance();
3549     ASSERT_NE(mainThread, nullptr);
3550     auto systemAnimatedScenesEnabled = mainThread->systemAnimatedScenesEnabled_;
3551     mainThread->systemAnimatedScenesEnabled_ = false;
3552     ASSERT_TRUE(mainThread->SetSystemAnimatedScenes(SystemAnimatedScenes::OTHERS));
3553     mainThread->systemAnimatedScenesEnabled_ = systemAnimatedScenesEnabled;
3554 }
3555 
3556 /**
3557  * @tc.name: CheckNodeHasToBePreparedByPid001
3558  * @tc.desc: CheckNodeHasToBePreparedByPid Test, Classify By Root
3559  * @tc.type: FUNC
3560  * @tc.require: issueI7HDVG
3561  */
3562 HWTEST_F(RSMainThreadTest, CheckNodeHasToBePreparedByPid001, TestSize.Level1)
3563 {
3564     auto mainThread = RSMainThread::Instance();
3565     ASSERT_NE(mainThread, nullptr);
3566     NodeId id = 1;
3567     bool isClassifyByRoot = true;
3568     mainThread->CheckNodeHasToBePreparedByPid(id, isClassifyByRoot);
3569 }
3570 
3571 /**
3572  * @tc.name: CheckNodeHasToBePreparedByPid002
3573  * @tc.desc: CheckNodeHasToBePreparedByPid Test, not Classify By Root
3574  * @tc.type: FUNC
3575  * @tc.require: issueI7HDVG
3576  */
3577 HWTEST_F(RSMainThreadTest, CheckNodeHasToBePreparedByPid002, TestSize.Level1)
3578 {
3579     auto mainThread = RSMainThread::Instance();
3580     ASSERT_NE(mainThread, nullptr);
3581     NodeId id = 1;
3582     bool isClassifyByRoot = false;
3583     mainThread->CheckNodeHasToBePreparedByPid(id, isClassifyByRoot);
3584 }
3585 
3586 /**
3587  * @tc.name: SetVSyncRateByVisibleLevel001
3588  * @tc.desc: SetVSyncRateByVisibleLevel Test, Check Vsyncrate when RSVisibleLevel is RS_SEMI_DEFAULT_VISIBLE
3589  * @tc.type: FUNC
3590  * @tc.require: issueI7HDVG
3591  */
3592 HWTEST_F(RSMainThreadTest, SetVSyncRateByVisibleLevel001, TestSize.Level1)
3593 {
3594     auto mainThread = RSMainThread::Instance();
3595     ASSERT_NE(mainThread, nullptr);
3596     if (mainThread->appVSyncDistributor_ == nullptr) {
3597         auto vsyncGenerator = CreateVSyncGenerator();
3598         auto vsyncController = new VSyncController(vsyncGenerator, 0);
3599         mainThread->appVSyncDistributor_ = new VSyncDistributor(vsyncController, "WMVSyncConnection");
3600     }
3601     auto& vsyncDistributor = mainThread->appVSyncDistributor_;
3602     ASSERT_NE(vsyncDistributor, nullptr);
3603     vsyncDistributor->connectionsMap_.clear();
3604     sptr<VSyncConnection> connection = new VSyncConnection(vsyncDistributor, "WMVSyncConnection_0");
3605     uint32_t tmpPid = 0;
3606     if (vsyncDistributor->QosGetPidByName(connection->info_.name_, tmpPid) == VSYNC_ERROR_OK) {
3607         vsyncDistributor->connectionsMap_[tmpPid].push_back(connection);
3608         std::map<NodeId, RSVisibleLevel> pidVisMap;
3609         pidVisMap[static_cast<NodeId>(tmpPid)] = RSVisibleLevel::RS_SEMI_DEFAULT_VISIBLE;
3610         std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
3611         mainThread->GetRSVsyncRateReduceManager().ClearLastVisMapForVsyncRate();
3612         mainThread->GetRSVsyncRateReduceManager().SetVSyncRateByVisibleLevel(pidVisMap, curAllSurfaces);
3613         ASSERT_NE(connection->highPriorityRate_, (int32_t)SIMI_VISIBLE_RATE);
3614     }
3615 }
3616 
3617 /**
3618  * @tc.name: SetVSyncRateByVisibleLevel002
3619  * @tc.desc: SetVSyncRateByVisibleLevel Test, Check Vsyncrate when RSVisibleLevel is RS_SYSTEM_ANIMATE_SCENE
3620  * @tc.type: FUNC
3621  * @tc.require: issueI7HDVG
3622  */
3623 HWTEST_F(RSMainThreadTest, SetVSyncRateByVisibleLevel002, TestSize.Level1)
3624 {
3625     auto mainThread = RSMainThread::Instance();
3626     ASSERT_NE(mainThread, nullptr);
3627     if (mainThread->appVSyncDistributor_ == nullptr) {
3628         auto vsyncGenerator = CreateVSyncGenerator();
3629         auto vsyncController = new VSyncController(vsyncGenerator, 0);
3630         mainThread->appVSyncDistributor_ = new VSyncDistributor(vsyncController, "WMVSyncConnection");
3631     }
3632     auto& vsyncDistributor = mainThread->appVSyncDistributor_;
3633     ASSERT_NE(vsyncDistributor, nullptr);
3634     vsyncDistributor->connectionsMap_.clear();
3635     sptr<VSyncConnection> connection = new VSyncConnection(vsyncDistributor, "WMVSyncConnection_0");
3636     uint32_t tmpPid = 0;
3637     if (vsyncDistributor->QosGetPidByName(connection->info_.name_, tmpPid) == VSYNC_ERROR_OK) {
3638         vsyncDistributor->connectionsMap_[tmpPid].push_back(connection);
3639         std::map<NodeId, RSVisibleLevel> pidVisMap;
3640         pidVisMap[static_cast<NodeId>(tmpPid)] = RSVisibleLevel::RS_SYSTEM_ANIMATE_SCENE;
3641         std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
3642         mainThread->GetRSVsyncRateReduceManager().ClearLastVisMapForVsyncRate();
3643         mainThread->GetRSVsyncRateReduceManager().SetVSyncRateByVisibleLevel(pidVisMap, curAllSurfaces);
3644         ASSERT_NE(connection->highPriorityRate_, (int32_t)SYSTEM_ANIMATED_SCENES_RATE);
3645     }
3646 }
3647 
3648 /**
3649  * @tc.name: SetVSyncRateByVisibleLevel003
3650  * @tc.desc: SetVSyncRateByVisibleLevel Test, Check Vsyncrate when RSVisibleLevel is RS_INVISIBLE
3651  * @tc.type: FUNC
3652  * @tc.require: issueI7HDVG
3653  */
3654 HWTEST_F(RSMainThreadTest, SetVSyncRateByVisibleLevel003, TestSize.Level1)
3655 {
3656     auto mainThread = RSMainThread::Instance();
3657     ASSERT_NE(mainThread, nullptr);
3658     if (mainThread->appVSyncDistributor_ == nullptr) {
3659         auto vsyncGenerator = CreateVSyncGenerator();
3660         auto vsyncController = new VSyncController(vsyncGenerator, 0);
3661         mainThread->appVSyncDistributor_ = new VSyncDistributor(vsyncController, "WMVSyncConnection");
3662     }
3663     auto& vsyncDistributor = mainThread->appVSyncDistributor_;
3664     ASSERT_NE(vsyncDistributor, nullptr);
3665     vsyncDistributor->connectionsMap_.clear();
3666     sptr<VSyncConnection> connection = new VSyncConnection(vsyncDistributor, "WMVSyncConnection_0");
3667     uint32_t tmpPid = 0;
3668     if (vsyncDistributor->QosGetPidByName(connection->info_.name_, tmpPid) == VSYNC_ERROR_OK) {
3669         vsyncDistributor->connectionsMap_[tmpPid].push_back(connection);
3670         std::map<NodeId, RSVisibleLevel> pidVisMap;
3671         pidVisMap[static_cast<NodeId>(tmpPid)] = RSVisibleLevel::RS_INVISIBLE;
3672         std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
3673         mainThread->GetRSVsyncRateReduceManager().ClearLastVisMapForVsyncRate();
3674         mainThread->GetRSVsyncRateReduceManager().SetVSyncRateByVisibleLevel(pidVisMap, curAllSurfaces);
3675         ASSERT_NE(connection->highPriorityRate_, (int32_t)INVISBLE_WINDOW_RATE);
3676     }
3677 }
3678 
3679 /**
3680  * @tc.name: SetVSyncRateByVisibleLevel004
3681  * @tc.desc: SetVSyncRateByVisibleLevel Test, Check Vsyncrate when RSVisibleLevel is RS_UNKNOW_VISIBLE_LEVEL
3682  * @tc.type: FUNC
3683  * @tc.require: issueI7HDVG
3684  */
3685 HWTEST_F(RSMainThreadTest, SetVSyncRateByVisibleLevel004, TestSize.Level1)
3686 {
3687     auto mainThread = RSMainThread::Instance();
3688     ASSERT_NE(mainThread, nullptr);
3689     if (mainThread->appVSyncDistributor_ == nullptr) {
3690         auto vsyncGenerator = CreateVSyncGenerator();
3691         auto vsyncController = new VSyncController(vsyncGenerator, 0);
3692         mainThread->appVSyncDistributor_ = new VSyncDistributor(vsyncController, "WMVSyncConnection");
3693     }
3694     auto& vsyncDistributor = mainThread->appVSyncDistributor_;
3695     ASSERT_NE(vsyncDistributor, nullptr);
3696     vsyncDistributor->connectionsMap_.clear();
3697     sptr<VSyncConnection> connection = new VSyncConnection(vsyncDistributor, "WMVSyncConnection_0");
3698     uint32_t tmpPid = 0;
3699     if (vsyncDistributor->QosGetPidByName(connection->info_.name_, tmpPid) == VSYNC_ERROR_OK) {
3700         vsyncDistributor->connectionsMap_[tmpPid].push_back(connection);
3701         std::map<NodeId, RSVisibleLevel> pidVisMap;
3702         pidVisMap[static_cast<NodeId>(tmpPid)] = RSVisibleLevel::RS_UNKNOW_VISIBLE_LEVEL;
3703         std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
3704         mainThread->GetRSVsyncRateReduceManager().ClearLastVisMapForVsyncRate();
3705         mainThread->GetRSVsyncRateReduceManager().SetVSyncRateByVisibleLevel(pidVisMap, curAllSurfaces);
3706         ASSERT_NE(connection->highPriorityRate_, (int32_t)DEFAULT_RATE);
3707     }
3708 }
3709 
3710 /**
3711  * @tc.name: SetSystemAnimatedScenes004
3712  * @tc.desc: SetVSyncRateByVisibleLevel Test, Check Vsyncrate when SystemAnimatedScenes is ENTER_MISSION_CENTER
3713  * @tc.type: FUNC
3714  * @tc.require: issueI7HDVG
3715  */
3716 HWTEST_F(RSMainThreadTest, SetSystemAnimatedScenes004, TestSize.Level1)
3717 {
3718     auto mainThread = RSMainThread::Instance();
3719     ASSERT_NE(mainThread, nullptr);
3720     mainThread->SetSystemAnimatedScenes(SystemAnimatedScenes::ENTER_MISSION_CENTER);
3721     ASSERT_NE(mainThread->systemAnimatedScenesList_.empty(), true);
3722     if (mainThread->appVSyncDistributor_ == nullptr) {
3723         auto vsyncGenerator = CreateVSyncGenerator();
3724         auto vsyncController = new VSyncController(vsyncGenerator, 0);
3725         mainThread->appVSyncDistributor_ = new VSyncDistributor(vsyncController, "WMVSyncConnection");
3726     }
3727     auto& vsyncDistributor = mainThread->appVSyncDistributor_;
3728     ASSERT_NE(vsyncDistributor, nullptr);
3729     vsyncDistributor->connectionsMap_.clear();
3730     sptr<VSyncConnection> connection = new VSyncConnection(vsyncDistributor, "WMVSyncConnection_0");
3731     uint32_t tmpPid = 0;
3732     ASSERT_EQ(vsyncDistributor->QosGetPidByName(connection->info_.name_, tmpPid), VSYNC_ERROR_OK);
3733     vsyncDistributor->connectionsMap_[tmpPid].push_back(connection);
3734     std::map<NodeId, RSVisibleLevel> pidVisMap;
3735     pidVisMap[static_cast<NodeId>(tmpPid)] = RSVisibleLevel::RS_UNKNOW_VISIBLE_LEVEL;
3736     std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
3737     mainThread->GetRSVsyncRateReduceManager().ClearLastVisMapForVsyncRate();
3738     mainThread->GetRSVsyncRateReduceManager().SetVSyncRateByVisibleLevel(pidVisMap, curAllSurfaces);
3739     ASSERT_NE(connection->highPriorityRate_, (int32_t)SYSTEM_ANIMATED_SCENES_RATE);
3740 }
3741 
3742 /**
3743  * @tc.name: SetSystemAnimatedScenes005
3744  * @tc.desc: SetVSyncRateByVisibleLevel Test, Check Vsyncrate when SystemAnimatedScenes is ENTER_TFS_WINDOW
3745  * @tc.type: FUNC
3746  * @tc.require: issueI7HDVG
3747  */
3748 HWTEST_F(RSMainThreadTest, SetSystemAnimatedScenes005, TestSize.Level1)
3749 {
3750     auto mainThread = RSMainThread::Instance();
3751     ASSERT_NE(mainThread, nullptr);
3752     mainThread->SetSystemAnimatedScenes(SystemAnimatedScenes::ENTER_TFS_WINDOW);
3753     ASSERT_NE(mainThread->systemAnimatedScenesList_.empty(), true);
3754     if (mainThread->appVSyncDistributor_ == nullptr) {
3755         auto vsyncGenerator = CreateVSyncGenerator();
3756         auto vsyncController = new VSyncController(vsyncGenerator, 0);
3757         mainThread->appVSyncDistributor_ = new VSyncDistributor(vsyncController, "WMVSyncConnection");
3758     }
3759     auto& vsyncDistributor = mainThread->appVSyncDistributor_;
3760     ASSERT_NE(vsyncDistributor, nullptr);
3761     vsyncDistributor->connectionsMap_.clear();
3762     sptr<VSyncConnection> connection = new VSyncConnection(vsyncDistributor, "WMVSyncConnection_0");
3763     uint32_t tmpPid = 0;
3764     ASSERT_EQ(vsyncDistributor->QosGetPidByName(connection->info_.name_, tmpPid), VSYNC_ERROR_OK);
3765     vsyncDistributor->connectionsMap_[tmpPid].push_back(connection);
3766     std::map<NodeId, RSVisibleLevel> pidVisMap;
3767     pidVisMap[static_cast<NodeId>(tmpPid)] = RSVisibleLevel::RS_UNKNOW_VISIBLE_LEVEL;
3768     std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
3769     mainThread->GetRSVsyncRateReduceManager().ClearLastVisMapForVsyncRate();
3770     mainThread->GetRSVsyncRateReduceManager().SetVSyncRateByVisibleLevel(pidVisMap, curAllSurfaces);
3771     ASSERT_NE(connection->highPriorityRate_, (int32_t)SYSTEM_ANIMATED_SCENES_RATE);
3772 }
3773 
3774 /**
3775  * @tc.name: SetSystemAnimatedScenes006
3776  * @tc.desc: SetVSyncRateByVisibleLevel Test, Check Vsyncrate when SystemAnimatedScenes is ENTER_WINDOW_FULL_SCREEN
3777  * @tc.type: FUNC
3778  * @tc.require: issueI7HDVG
3779  */
3780 HWTEST_F(RSMainThreadTest, SetSystemAnimatedScenes006, TestSize.Level1)
3781 {
3782     auto mainThread = RSMainThread::Instance();
3783     ASSERT_NE(mainThread, nullptr);
3784     mainThread->SetSystemAnimatedScenes(SystemAnimatedScenes::ENTER_WINDOW_FULL_SCREEN);
3785     ASSERT_NE(mainThread->systemAnimatedScenesList_.empty(), true);
3786     if (mainThread->appVSyncDistributor_ == nullptr) {
3787         auto vsyncGenerator = CreateVSyncGenerator();
3788         auto vsyncController = new VSyncController(vsyncGenerator, 0);
3789         mainThread->appVSyncDistributor_ = new VSyncDistributor(vsyncController, "WMVSyncConnection");
3790     }
3791     auto& vsyncDistributor = mainThread->appVSyncDistributor_;
3792     ASSERT_NE(vsyncDistributor, nullptr);
3793     vsyncDistributor->connectionsMap_.clear();
3794     sptr<VSyncConnection> connection = new VSyncConnection(vsyncDistributor, "WMVSyncConnection_0");
3795     uint32_t tmpPid = 0;
3796     ASSERT_EQ(vsyncDistributor->QosGetPidByName(connection->info_.name_, tmpPid), VSYNC_ERROR_OK);
3797     vsyncDistributor->connectionsMap_[tmpPid].push_back(connection);
3798     std::map<NodeId, RSVisibleLevel> pidVisMap;
3799     pidVisMap[static_cast<NodeId>(tmpPid)] = RSVisibleLevel::RS_UNKNOW_VISIBLE_LEVEL;
3800     std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
3801     mainThread->GetRSVsyncRateReduceManager().ClearLastVisMapForVsyncRate();
3802     mainThread->GetRSVsyncRateReduceManager().SetVSyncRateByVisibleLevel(pidVisMap, curAllSurfaces);
3803     ASSERT_NE(connection->highPriorityRate_, (int32_t)SYSTEM_ANIMATED_SCENES_RATE);
3804 }
3805 
3806 /**
3807  * @tc.name: SetSystemAnimatedScenes007
3808  * @tc.desc: SetVSyncRateByVisibleLevel Test, Check Vsyncrate when SystemAnimatedScenes is ENTER_MAX_WINDOW
3809  * @tc.type: FUNC
3810  * @tc.require: issueI7HDVG
3811  */
3812 HWTEST_F(RSMainThreadTest, SetSystemAnimatedScenes007, TestSize.Level1)
3813 {
3814     auto mainThread = RSMainThread::Instance();
3815     ASSERT_NE(mainThread, nullptr);
3816     mainThread->SetSystemAnimatedScenes(SystemAnimatedScenes::ENTER_MAX_WINDOW);
3817     ASSERT_NE(mainThread->systemAnimatedScenesList_.empty(), true);
3818     if (mainThread->appVSyncDistributor_ == nullptr) {
3819         auto vsyncGenerator = CreateVSyncGenerator();
3820         auto vsyncController = new VSyncController(vsyncGenerator, 0);
3821         mainThread->appVSyncDistributor_ = new VSyncDistributor(vsyncController, "WMVSyncConnection");
3822     }
3823     auto& vsyncDistributor = mainThread->appVSyncDistributor_;
3824     ASSERT_NE(vsyncDistributor, nullptr);
3825     vsyncDistributor->connectionsMap_.clear();
3826     sptr<VSyncConnection> connection = new VSyncConnection(vsyncDistributor, "WMVSyncConnection_0");
3827     uint32_t tmpPid = 0;
3828     ASSERT_EQ(vsyncDistributor->QosGetPidByName(connection->info_.name_, tmpPid), VSYNC_ERROR_OK);
3829     vsyncDistributor->connectionsMap_[tmpPid].push_back(connection);
3830     std::map<NodeId, RSVisibleLevel> pidVisMap;
3831     pidVisMap[static_cast<NodeId>(tmpPid)] = RSVisibleLevel::RS_UNKNOW_VISIBLE_LEVEL;
3832     std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
3833     mainThread->GetRSVsyncRateReduceManager().ClearLastVisMapForVsyncRate();
3834     mainThread->GetRSVsyncRateReduceManager().SetVSyncRateByVisibleLevel(pidVisMap, curAllSurfaces);
3835     ASSERT_NE(connection->highPriorityRate_, (int32_t)SYSTEM_ANIMATED_SCENES_RATE);
3836 }
3837 
3838 /**
3839  * @tc.name: SetSystemAnimatedScenes008
3840  * @tc.desc: SetVSyncRateByVisibleLevel Test, Check Vsyncrate when SystemAnimatedScenes is ENTER_SPLIT_SCREEN
3841  * @tc.type: FUNC
3842  * @tc.require: issueI7HDVG
3843  */
3844 HWTEST_F(RSMainThreadTest, SetSystemAnimatedScenes008, TestSize.Level1)
3845 {
3846     auto mainThread = RSMainThread::Instance();
3847     ASSERT_NE(mainThread, nullptr);
3848     mainThread->SetSystemAnimatedScenes(SystemAnimatedScenes::ENTER_SPLIT_SCREEN);
3849     ASSERT_NE(mainThread->systemAnimatedScenesList_.empty(), true);
3850     if (mainThread->appVSyncDistributor_ == nullptr) {
3851         auto vsyncGenerator = CreateVSyncGenerator();
3852         auto vsyncController = new VSyncController(vsyncGenerator, 0);
3853         mainThread->appVSyncDistributor_ = new VSyncDistributor(vsyncController, "WMVSyncConnection");
3854     }
3855     auto& vsyncDistributor = mainThread->appVSyncDistributor_;
3856     ASSERT_NE(vsyncDistributor, nullptr);
3857     vsyncDistributor->connectionsMap_.clear();
3858     sptr<VSyncConnection> connection = new VSyncConnection(vsyncDistributor, "WMVSyncConnection_0");
3859     uint32_t tmpPid = 0;
3860     ASSERT_EQ(vsyncDistributor->QosGetPidByName(connection->info_.name_, tmpPid), VSYNC_ERROR_OK);
3861     vsyncDistributor->connectionsMap_[tmpPid].push_back(connection);
3862     std::map<NodeId, RSVisibleLevel> pidVisMap;
3863     pidVisMap[static_cast<NodeId>(tmpPid)] = RSVisibleLevel::RS_UNKNOW_VISIBLE_LEVEL;
3864     std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
3865     mainThread->GetRSVsyncRateReduceManager().ClearLastVisMapForVsyncRate();
3866     mainThread->GetRSVsyncRateReduceManager().SetVSyncRateByVisibleLevel(pidVisMap, curAllSurfaces);
3867     ASSERT_NE(connection->highPriorityRate_, (int32_t)SYSTEM_ANIMATED_SCENES_RATE);
3868 }
3869 
3870 /**
3871  * @tc.name: SetSystemAnimatedScenes009
3872  * @tc.desc: SetVSyncRateByVisibleLevel Test, Check Vsyncrate when SystemAnimatedScenes is ENTER_APP_CENTER
3873  * @tc.type: FUNC
3874  * @tc.require: issueI7HDVG
3875  */
3876 HWTEST_F(RSMainThreadTest, SetSystemAnimatedScenes009, TestSize.Level1)
3877 {
3878     auto mainThread = RSMainThread::Instance();
3879     ASSERT_NE(mainThread, nullptr);
3880     mainThread->SetSystemAnimatedScenes(SystemAnimatedScenes::ENTER_APP_CENTER);
3881     ASSERT_NE(mainThread->systemAnimatedScenesList_.empty(), true);
3882     if (mainThread->appVSyncDistributor_ == nullptr) {
3883         auto vsyncGenerator = CreateVSyncGenerator();
3884         auto vsyncController = new VSyncController(vsyncGenerator, 0);
3885         mainThread->appVSyncDistributor_ = new VSyncDistributor(vsyncController, "WMVSyncConnection");
3886     }
3887     auto& vsyncDistributor = mainThread->appVSyncDistributor_;
3888     ASSERT_NE(vsyncDistributor, nullptr);
3889     vsyncDistributor->connectionsMap_.clear();
3890     sptr<VSyncConnection> connection = new VSyncConnection(vsyncDistributor, "WMVSyncConnection_0");
3891     uint32_t tmpPid = 0;
3892     ASSERT_EQ(vsyncDistributor->QosGetPidByName(connection->info_.name_, tmpPid), VSYNC_ERROR_OK);
3893     vsyncDistributor->connectionsMap_[tmpPid].push_back(connection);
3894     std::map<NodeId, RSVisibleLevel> pidVisMap;
3895     pidVisMap[static_cast<NodeId>(tmpPid)] = RSVisibleLevel::RS_UNKNOW_VISIBLE_LEVEL;
3896     std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
3897     mainThread->GetRSVsyncRateReduceManager().ClearLastVisMapForVsyncRate();
3898     mainThread->GetRSVsyncRateReduceManager().SetVSyncRateByVisibleLevel(pidVisMap, curAllSurfaces);
3899     ASSERT_NE(connection->highPriorityRate_, (int32_t)SYSTEM_ANIMATED_SCENES_RATE);
3900 }
3901 
3902 /**
3903  * @tc.name: SetSystemAnimatedScenes010
3904  * @tc.desc: SetSystemAnimatedScenes Test, check size is over max
3905  * @tc.type: FUNC
3906  * @tc.require: issueICON9P
3907  */
3908 HWTEST_F(RSMainThreadTest, SetSystemAnimatedScenes010, TestSize.Level1)
3909 {
3910     auto mainThread = RSMainThread::Instance();
3911     ASSERT_NE(mainThread, nullptr);
3912     SystemAnimatedScenes scenes = SystemAnimatedScenes::ENTER_TFS_WINDOW;
3913 
3914     const uint32_t MAX_SCENES_NUM = 0xFFFF;
3915     for (auto id = 0; id <= MAX_SCENES_NUM; id++) {
3916         mainThread->systemAnimatedScenesList_.emplace_back(
3917             std::make_pair(SystemAnimatedScenes::ENTER_MISSION_CENTER, static_cast<uint64_t>(id)));
3918     }
3919     ASSERT_FALSE(mainThread->SetSystemAnimatedScenes(scenes));
3920 
3921     for (auto id = 0; id <= MAX_SCENES_NUM; id++) {
3922         mainThread->threeFingerScenesList_.emplace_back(
3923             std::make_pair(SystemAnimatedScenes::ENTER_MISSION_CENTER, static_cast<uint64_t>(id)));
3924     }
3925     ASSERT_FALSE(mainThread->SetSystemAnimatedScenes(scenes));
3926 }
3927 
3928 /**
3929  * @tc.name: CreateVirtualScreen
3930  * @tc.desc: CreateVirtualScreen Test, invalid white list
3931  * @tc.type: FUNC
3932  * @tc.require: issueICON9P
3933  */
3934 HWTEST_F(RSMainThreadTest, CreateVirtualScreen, TestSize.Level1)
3935 {
3936     auto mainThread = RSMainThread::Instance();
3937     sptr<RSIConnectionToken> token = new IRemoteStub<RSIConnectionToken>();
3938     auto rsRenderServiceConnection = new RSRenderServiceConnection(
3939         0, nullptr, mainThread, CreateOrGetScreenManager(), token->AsObject(), nullptr);
3940 
3941     std::string name("name");
3942     uint32_t width = 1;
3943     uint32_t height = 1;
3944     sptr<IConsumerSurface> consumer = IConsumerSurface::Create("DisplayNode");
3945     sptr<IBufferProducer> producer = consumer->GetProducer();
3946     sptr<Surface> surface = Surface::CreateSurfaceAsProducer(producer);
3947     ScreenId mirrorId = 1;
3948     int32_t flags = 1;
3949     std::vector<NodeId> whiteList = {};
3950     EXPECT_NE(rsRenderServiceConnection->CreateVirtualScreen(name, width, height, surface, mirrorId, flags, whiteList),
3951         INVALID_SCREEN_ID);
3952 
3953     for (auto nodeId = 0; nodeId <= MAX_WHITE_LIST_NUM + 1; nodeId++) {
3954         whiteList.push_back(nodeId);
3955     }
3956     EXPECT_EQ(rsRenderServiceConnection->CreateVirtualScreen(name, width, height, surface, mirrorId, flags, whiteList),
3957         INVALID_SCREEN_ID);
3958 }
3959 
3960 /**
3961  * @tc.name: SetVirtualScreenBlackList
3962  * @tc.desc: SetVirtualScreenBlackList Test, invalid black list
3963  * @tc.type: FUNC
3964  * @tc.require: issueICON9P
3965  */
3966 HWTEST_F(RSMainThreadTest, SetVirtualScreenBlackList, TestSize.Level1)
3967 {
3968     auto mainThread = RSMainThread::Instance();
3969     sptr<RSIConnectionToken> token = new IRemoteStub<RSIConnectionToken>();
3970     auto rsRenderServiceConnection = new RSRenderServiceConnection(
3971         0, nullptr, mainThread, CreateOrGetScreenManager(), token->AsObject(), nullptr);
3972 
3973     ScreenId id = 100;
3974     std::vector<uint64_t> blackList = {};
3975     EXPECT_NE(rsRenderServiceConnection->SetVirtualScreenBlackList(id, blackList), 5);
3976 
3977     for (auto nodeId = 0; nodeId <= MAX_BLACK_LIST_NUM + 1; nodeId++) {
3978         blackList.push_back(nodeId);
3979     }
3980     EXPECT_EQ(rsRenderServiceConnection->SetVirtualScreenBlackList(id, blackList), 5);
3981 }
3982 
3983 /**
3984  * @tc.name: AddVirtualScreenBlackList
3985  * @tc.desc: AddVirtualScreenBlackList Test, invalid black list
3986  * @tc.type: FUNC
3987  * @tc.require: issueICON9P
3988  */
3989 HWTEST_F(RSMainThreadTest, AddVirtualScreenBlackList, TestSize.Level1)
3990 {
3991 #ifdef RS_ENABLE_UNI_RENDER
3992     auto mainThread = RSMainThread::Instance();
3993     sptr<RSIConnectionToken> token = new IRemoteStub<RSIConnectionToken>();
3994     auto rsRenderServiceConnection = new RSRenderServiceConnection(
3995         0, nullptr, mainThread, CreateOrGetScreenManager(), token->AsObject(), nullptr);
3996 
3997     ScreenId id = 100;
3998     std::vector<uint64_t> blackList = {};
3999     int32_t repCode;
4000     EXPECT_NE(rsRenderServiceConnection->AddVirtualScreenBlackList(id, blackList, repCode), 22);
4001 
4002     for (auto nodeId = 0; nodeId <= MAX_BLACK_LIST_NUM + 1; nodeId++) {
4003         blackList.push_back(nodeId);
4004     }
4005     EXPECT_EQ(rsRenderServiceConnection->AddVirtualScreenBlackList(id, blackList, repCode), 22);
4006 #endif
4007 }
4008 
4009 /**
4010  * @tc.name: IsDrawingGroupChanged
4011  * @tc.desc: IsDrawingGroupChanged Test, not Classify By Root
4012  * @tc.type: FUNC
4013  * @tc.require: issueI7HDVG
4014  */
4015 HWTEST_F(RSMainThreadTest, IsDrawingGroupChanged, TestSize.Level1)
4016 {
4017     auto mainThread = RSMainThread::Instance();
4018     ASSERT_NE(mainThread, nullptr);
4019     NodeId id = 1;
4020     auto node = std::make_shared<RSRenderNode>(id);
4021     mainThread->IsDrawingGroupChanged(*node);
4022 }
4023 
4024 /**
4025  * @tc.name: CheckAndUpdateInstanceContentStaticStatus003
4026  * @tc.desc: CheckAndUpdateInstanceContentStaticStatus Test, nullptr
4027  * @tc.type: FUNC
4028  * @tc.require: issueI7HDVG
4029  */
4030 HWTEST_F(RSMainThreadTest, CheckAndUpdateInstanceContentStaticStatus003, TestSize.Level1)
4031 {
4032     auto mainThread = RSMainThread::Instance();
4033     ASSERT_NE(mainThread, nullptr);
4034     mainThread->CheckAndUpdateInstanceContentStaticStatus(nullptr);
4035 }
4036 
4037 /**
4038  * @tc.name: ReleaseSurface
4039  * @tc.desc: ReleaseSurface Test
4040  * @tc.type: FUNC
4041  * @tc.require: issueI7HDVG
4042  */
4043 HWTEST_F(RSMainThreadTest, ReleaseSurface, TestSize.Level1)
4044 {
4045     auto mainThread = RSMainThread::Instance();
4046     ASSERT_NE(mainThread, nullptr);
4047     mainThread->tmpSurfaces_.push(nullptr);
4048     mainThread->ReleaseSurface();
4049 }
4050 
4051 /**
4052  * @tc.name: SetLuminanceChangingStatus
4053  * @tc.desc: SetLuminanceChangingStatus Test
4054  * @tc.type: FUNC
4055  * @tc.require: issueI9ABGS
4056  */
4057 HWTEST_F(RSMainThreadTest, SetLuminanceChangingStatus, TestSize.Level2)
4058 {
4059     auto mainThread = RSMainThread::Instance();
4060     ASSERT_NE(mainThread, nullptr);
4061     for (int i = 0; i < 10; i++) {
4062         auto id = static_cast<ScreenId>(i);
4063         mainThread->SetLuminanceChangingStatus(id, true);
4064         ASSERT_EQ(mainThread->displayLuminanceChanged_[id], true);
4065         mainThread->SetLuminanceChangingStatus(id, false);
4066         ASSERT_EQ(mainThread->displayLuminanceChanged_[id], false);
4067     }
4068 }
4069 
4070 /**
4071  * @tc.name: ExchangeLuminanceChangingStatus
4072  * @tc.desc: ExchangeLuminanceChangingStatus Test
4073  * @tc.type: FUNC
4074  * @tc.require: issueI9ABGS
4075  */
4076 HWTEST_F(RSMainThreadTest, ExchangeLuminanceChangingStatus, TestSize.Level2)
4077 {
4078     auto mainThread = RSMainThread::Instance();
4079     ASSERT_NE(mainThread, nullptr);
4080     for (int i = 0; i < 10; i++) {
4081         auto id = static_cast<ScreenId>(i);
4082         mainThread->SetLuminanceChangingStatus(id, true);
4083         ASSERT_EQ(mainThread->ExchangeLuminanceChangingStatus(id), true);
4084         ASSERT_EQ(mainThread->ExchangeLuminanceChangingStatus(id), false);
4085         mainThread->SetLuminanceChangingStatus(id, false);
4086         ASSERT_EQ(mainThread->ExchangeLuminanceChangingStatus(id), false);
4087     }
4088 }
4089 
4090 /**
4091  * @tc.name: CalcOcclusionImplementation001
4092  * @tc.desc: calculate occlusion when surfaces do not overlap
4093  * @tc.type: FUNC
4094  * @tc.require: issueI97LXT
4095  */
4096 HWTEST_F(RSMainThreadTest, CalcOcclusionImplementation001, TestSize.Level1)
4097 {
4098     auto mainThread = RSMainThread::Instance();
4099     ASSERT_NE(mainThread, nullptr);
4100     std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
4101 
4102     NodeId idBottom = 0;
4103     auto nodeBottom = std::make_shared<RSSurfaceRenderNode>(idBottom, mainThread->context_);
4104     nodeBottom->stagingRenderParams_ = std::make_unique<RSSurfaceRenderParams>(idBottom);
4105     RectI rectBottom = RectI(0, 0, 100, 100);
4106     nodeBottom->oldDirtyInSurface_ = rectBottom;
4107     nodeBottom->SetDstRect(rectBottom);
4108     nodeBottom->opaqueRegion_ = Occlusion::Region(rectBottom);
4109 
4110     NodeId idTop = 1;
4111     auto nodeTop = std::make_shared<RSSurfaceRenderNode>(idTop, mainThread->context_);
4112     nodeTop->stagingRenderParams_ = std::make_unique<RSSurfaceRenderParams>(idTop);
4113     RectI rectTop = RectI(100, 100, 100, 100);
4114     nodeTop->oldDirtyInSurface_ = rectTop;
4115     nodeTop->SetDstRect(rectTop);
4116     nodeTop->opaqueRegion_ = Occlusion::Region(rectTop);
4117 
4118     curAllSurfaces.emplace_back(nodeBottom);
4119     curAllSurfaces.emplace_back(nodeTop);
4120     VisibleData dstCurVisVec;
4121     std::map<NodeId, RSVisibleLevel> dstPidVisMap;
4122     mainThread->CalcOcclusionImplementation(nullptr, curAllSurfaces, dstCurVisVec, dstPidVisMap);
4123     ASSERT_EQ(nodeBottom->GetOcclusionVisible(), true);
4124     ASSERT_EQ(nodeTop->GetOcclusionVisible(), true);
4125     ASSERT_EQ(nodeBottom->GetVisibleRegion().Size(), 1);
4126     ASSERT_EQ(nodeTop->GetVisibleRegion().Size(), 1);
4127 }
4128 
4129 /**
4130  * @tc.name: CalcOcclusionImplementation002
4131  * @tc.desc: calculate occlusion when surfaces partially overlap
4132  * @tc.type: FUNC
4133  * @tc.require: issueI97LXT
4134  */
4135 HWTEST_F(RSMainThreadTest, CalcOcclusionImplementation002, TestSize.Level1)
4136 {
4137     auto mainThread = RSMainThread::Instance();
4138     ASSERT_NE(mainThread, nullptr);
4139     std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
4140 
4141     NodeId idBottom = 0;
4142     auto nodeBottom = std::make_shared<RSSurfaceRenderNode>(idBottom, mainThread->context_);
4143     nodeBottom->stagingRenderParams_ = std::make_unique<RSSurfaceRenderParams>(idBottom);
4144     RectI rectBottom = RectI(0, 0, 100, 100);
4145     nodeBottom->oldDirtyInSurface_ = rectBottom;
4146     nodeBottom->SetDstRect(rectBottom);
4147     nodeBottom->opaqueRegion_ = Occlusion::Region(rectBottom);
4148 
4149     NodeId idTop = 1;
4150     auto nodeTop = std::make_shared<RSSurfaceRenderNode>(idTop, mainThread->context_);
4151     nodeTop->stagingRenderParams_ = std::make_unique<RSSurfaceRenderParams>(idTop);
4152     RectI rectTop = RectI(50, 50, 100, 100);
4153     nodeTop->oldDirtyInSurface_ = rectTop;
4154     nodeTop->SetDstRect(rectTop);
4155     nodeTop->opaqueRegion_ = Occlusion::Region(rectTop);
4156 
4157     curAllSurfaces.emplace_back(nodeBottom);
4158     curAllSurfaces.emplace_back(nodeTop);
4159     VisibleData dstCurVisVec;
4160     std::map<NodeId, RSVisibleLevel> dstPidVisMap;
4161     mainThread->CalcOcclusionImplementation(nullptr, curAllSurfaces, dstCurVisVec, dstPidVisMap);
4162     ASSERT_EQ(nodeBottom->GetOcclusionVisible(), true);
4163     ASSERT_EQ(nodeTop->GetOcclusionVisible(), true);
4164     ASSERT_EQ(nodeBottom->GetVisibleRegion().Size(), 2);
4165     ASSERT_EQ(nodeTop->GetVisibleRegion().Size(), 1);
4166 }
4167 
4168 /**
4169  * @tc.name: CalcOcclusionImplementation003
4170  * @tc.desc: calculate occlusion when the bottom node is occluded completely
4171  * @tc.type: FUNC
4172  * @tc.require: issueI97LXT
4173  */
4174 HWTEST_F(RSMainThreadTest, CalcOcclusionImplementation003, TestSize.Level1)
4175 {
4176     auto mainThread = RSMainThread::Instance();
4177     ASSERT_NE(mainThread, nullptr);
4178     std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
4179 
4180     NodeId idBottom = 0;
4181     auto nodeBottom = std::make_shared<RSSurfaceRenderNode>(idBottom, mainThread->context_);
4182     nodeBottom->stagingRenderParams_ = std::make_unique<RSSurfaceRenderParams>(idBottom);
4183     RectI rectBottom = RectI(0, 0, 100, 100);
4184     nodeBottom->oldDirtyInSurface_ = rectBottom;
4185     nodeBottom->SetDstRect(rectBottom);
4186     nodeBottom->opaqueRegion_ = Occlusion::Region(rectBottom);
4187 
4188     NodeId idTop = 1;
4189     auto nodeTop = std::make_shared<RSSurfaceRenderNode>(idTop, mainThread->context_);
4190     nodeTop->stagingRenderParams_ = std::make_unique<RSSurfaceRenderParams>(idTop);
4191     RectI rectTop = RectI(0, 0, 100, 100);
4192     nodeTop->oldDirtyInSurface_ = rectTop;
4193     nodeTop->SetDstRect(rectTop);
4194     nodeTop->opaqueRegion_ = Occlusion::Region(rectTop);
4195 
4196     curAllSurfaces.emplace_back(nodeBottom);
4197     curAllSurfaces.emplace_back(nodeTop);
4198     VisibleData dstCurVisVec;
4199     std::map<NodeId, RSVisibleLevel> dstPidVisMap;
4200     mainThread->CalcOcclusionImplementation(nullptr, curAllSurfaces, dstCurVisVec, dstPidVisMap);
4201     ASSERT_EQ(nodeBottom->GetOcclusionVisible(), false);
4202     ASSERT_EQ(nodeTop->GetOcclusionVisible(), true);
4203     ASSERT_EQ(nodeBottom->GetVisibleRegion().Size(), 0);
4204     ASSERT_EQ(nodeTop->GetVisibleRegion().Size(), 1);
4205 }
4206 
4207 /**
4208  * @tc.name: CalcOcclusionImplementation004
4209  * @tc.desc: calculate occlusion when the bottom node is occluded completely, and the top node is transparent
4210  * @tc.type: FUNC
4211  * @tc.require: issueI97LXT
4212  */
4213 HWTEST_F(RSMainThreadTest, CalcOcclusionImplementation004, TestSize.Level1)
4214 {
4215     auto mainThread = RSMainThread::Instance();
4216     ASSERT_NE(mainThread, nullptr);
4217     std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
4218 
4219     NodeId idBottom = 0;
4220     auto nodeBottom = std::make_shared<RSSurfaceRenderNode>(idBottom, mainThread->context_);
4221     nodeBottom->stagingRenderParams_ = std::make_unique<RSSurfaceRenderParams>(idBottom);
4222     RectI rectBottom = RectI(0, 0, 100, 100);
4223     nodeBottom->oldDirtyInSurface_ = rectBottom;
4224     nodeBottom->SetDstRect(rectBottom);
4225     nodeBottom->opaqueRegion_ = Occlusion::Region(rectBottom);
4226 
4227     NodeId idTop = 1;
4228     auto nodeTop = std::make_shared<RSSurfaceRenderNode>(idTop, mainThread->context_);
4229     nodeTop->stagingRenderParams_ = std::make_unique<RSSurfaceRenderParams>(idTop);
4230     RectI rectTop = RectI(0, 0, 100, 100);
4231     nodeTop->oldDirtyInSurface_ = rectTop;
4232     nodeTop->SetDstRect(rectTop);
4233     // The top node is transparent
4234     nodeTop->SetGlobalAlpha(0.0f);
4235 
4236     curAllSurfaces.emplace_back(nodeBottom);
4237     curAllSurfaces.emplace_back(nodeTop);
4238     VisibleData dstCurVisVec;
4239     std::map<NodeId, RSVisibleLevel> dstPidVisMap;
4240     mainThread->CalcOcclusionImplementation(nullptr, curAllSurfaces, dstCurVisVec, dstPidVisMap);
4241     ASSERT_EQ(nodeBottom->GetOcclusionVisible(), true);
4242     ASSERT_EQ(nodeTop->GetOcclusionVisible(), true);
4243     ASSERT_EQ(nodeBottom->GetVisibleRegion().Size(), 1);
4244     ASSERT_EQ(nodeTop->GetVisibleRegion().Size(), 1);
4245 }
4246 
4247 /**
4248  * @tc.name: CalcOcclusionImplementation005
4249  * @tc.desc: calculate occlusion when the bottom node is occluded completely,
4250  * And the top node is transparent and filter cache valid
4251  * @tc.type: FUNC
4252  * @tc.require: issueI97LXT
4253  */
4254 HWTEST_F(RSMainThreadTest, CalcOcclusionImplementation005, TestSize.Level1)
4255 {
4256     auto mainThread = RSMainThread::Instance();
4257     ASSERT_NE(mainThread, nullptr);
4258     std::vector<RSBaseRenderNode::SharedPtr> curAllSurfaces;
4259 
4260     NodeId idBottom = 0;
4261     auto nodeBottom = std::make_shared<RSSurfaceRenderNode>(idBottom, mainThread->context_);
4262     nodeBottom->stagingRenderParams_ = std::make_unique<RSSurfaceRenderParams>(idBottom);
4263     RectI rectBottom = RectI(0, 0, 100, 100);
4264     nodeBottom->oldDirtyInSurface_ = rectBottom;
4265     nodeBottom->SetDstRect(rectBottom);
4266     nodeBottom->opaqueRegion_ = Occlusion::Region(rectBottom);
4267 
4268     NodeId idTop = 1;
4269     auto nodeTop = std::make_shared<RSSurfaceRenderNode>(idTop, mainThread->context_);
4270     nodeTop->stagingRenderParams_ = std::make_unique<RSSurfaceRenderParams>(idTop);
4271     RectI rectTop = RectI(0, 0, 100, 100);
4272     nodeTop->oldDirtyInSurface_ = rectTop;
4273     nodeTop->SetDstRect(rectTop);
4274     // The top node is transparent
4275     nodeTop->SetGlobalAlpha(0.0f);
4276     nodeTop->isFilterCacheValidForOcclusion_ = true;
4277 
4278     curAllSurfaces.emplace_back(nodeBottom);
4279     curAllSurfaces.emplace_back(nodeTop);
4280     VisibleData dstCurVisVec;
4281     std::map<NodeId, RSVisibleLevel> dstPidVisMap;
4282     mainThread->CalcOcclusionImplementation(nullptr, curAllSurfaces, dstCurVisVec, dstPidVisMap);
4283     ASSERT_EQ(nodeBottom->GetOcclusionVisible(), false);
4284     ASSERT_EQ(nodeTop->GetOcclusionVisible(), true);
4285     ASSERT_EQ(nodeBottom->GetVisibleRegion().Size(), 0);
4286     ASSERT_EQ(nodeTop->GetVisibleRegion().Size(), 1);
4287 }
4288 
4289 /**
4290  * @tc.name: UpdateScreenNodeScreenId001
4291  * @tc.desc: UpdateScreenNodeScreenId, when rootnode is nullptr.
4292  * @tc.type: FUNC
4293  * @tc.require: issueI97LXT
4294  */
4295 HWTEST_F(RSMainThreadTest, UpdateScreenNodeScreenId001, TestSize.Level1)
4296 {
4297     auto mainThread = RSMainThread::Instance();
4298     ASSERT_NE(mainThread, nullptr);
4299     ASSERT_NE(mainThread->context_, nullptr);
4300     mainThread->context_->globalRootRenderNode_ = nullptr;
4301     mainThread->UpdateScreenNodeScreenId();
4302     ASSERT_EQ(mainThread->screenNodeScreenId_, DEFAULT_DISPLAY_SCREEN_ID);
4303 }
4304 
4305 /**
4306  * @tc.name: UpdateScreenNodeScreenId002
4307  * @tc.desc: UpdateScreenNodeScreenId, root node has no child display node.
4308  * @tc.type: FUNC
4309  * @tc.require: issueI97LXT
4310  */
4311 HWTEST_F(RSMainThreadTest, UpdateScreenNodeScreenId002, TestSize.Level1)
4312 {
4313     auto mainThread = RSMainThread::Instance();
4314     ASSERT_NE(mainThread, nullptr);
4315     ASSERT_NE(mainThread->context_, nullptr);
4316     NodeId id = 1;
4317     mainThread->context_->globalRootRenderNode_ = std::make_shared<RSRenderNode>(id);
4318     mainThread->UpdateScreenNodeScreenId();
4319     ASSERT_EQ(mainThread->screenNodeScreenId_, DEFAULT_DISPLAY_SCREEN_ID);
4320 }
4321 
4322 /**
4323  * @tc.name: UpdateScreenNodeScreenId003
4324  * @tc.desc: UpdateScreenNodeScreenId, root node has one child display node.
4325  * @tc.type: FUNC
4326  * @tc.require: issueI97LXT
4327  */
4328 HWTEST_F(RSMainThreadTest, UpdateScreenNodeScreenId003, TestSize.Level1)
4329 {
4330     auto mainThread = RSMainThread::Instance();
4331     ASSERT_NE(mainThread, nullptr);
4332     NodeId rootId = 0;
4333     ASSERT_NE(mainThread->context_, nullptr);
4334     mainThread->context_->globalRootRenderNode_ = std::make_shared<RSRenderNode>(rootId);
4335     RSDisplayNodeConfig config;
4336     NodeId displayId = 1;
4337     auto displayNode = std::make_shared<RSLogicalDisplayRenderNode>(displayId, config);
4338     uint64_t screenId = 1;
4339     displayNode->SetScreenId(screenId);
4340     mainThread->context_->globalRootRenderNode_->AddChild(displayNode);
4341     ASSERT_FALSE(mainThread->context_->globalRootRenderNode_->children_.empty());
4342     mainThread->UpdateScreenNodeScreenId();
4343 }
4344 
4345 /**
4346  * @tc.name: UpdateScreenNodeScreenId004
4347  * @tc.desc: UpdateScreenNodeScreenId, root node has a display child node and a canvas child node
4348  * @tc.type: FUNC
4349  * @tc.require: issueI97LXT
4350  */
4351 HWTEST_F(RSMainThreadTest, UpdateScreenNodeScreenId004, TestSize.Level1)
4352 {
4353     auto mainThread = RSMainThread::Instance();
4354     ASSERT_NE(mainThread, nullptr);
4355     NodeId rootId = 0;
4356     ASSERT_NE(mainThread->context_, nullptr);
4357     auto backUpRootNode = mainThread->context_->globalRootRenderNode_;
4358     mainThread->context_->globalRootRenderNode_ = std::make_shared<RSRenderNode>(rootId);
4359 
4360     std::weak_ptr<RSContext> weakContext = {};
4361     NodeId canvasId = 1;
4362     auto rsCanvasDrawingRenderNode = std::make_shared<RSCanvasDrawingRenderNode>(canvasId, weakContext);
4363     mainThread->context_->globalRootRenderNode_->AddChild(rsCanvasDrawingRenderNode);
4364 
4365     NodeId displayId = 2;
4366     auto rsContext = std::make_shared<RSContext>();
4367     auto displayNode = std::make_shared<RSScreenRenderNode>(displayId, 0, rsContext->weak_from_this());
4368     std::shared_ptr<RSRenderNode> tempNode = nullptr;
4369 
4370     displayNode->children_.emplace_back(tempNode);
4371     mainThread->context_->globalRootRenderNode_->AddChild(displayNode);
4372     mainThread->context_->globalRootRenderNode_->GenerateFullChildrenList();
4373 
4374     ASSERT_FALSE(mainThread->context_->globalRootRenderNode_->children_.empty());
4375     mainThread->UpdateScreenNodeScreenId();
4376     mainThread->context_->globalRootRenderNode_ = backUpRootNode;
4377 }
4378 
4379 /**
4380  * @tc.name: ProcessScreenHotPlugEvents
4381  * @tc.desc: Test ProcessScreenHotPlugEvents
4382  * @tc.type: FUNC
4383  * @tc.require: issueI97LXT
4384  */
4385 HWTEST_F(RSMainThreadTest, ProcessScreenHotPlugEvents, TestSize.Level1)
4386 {
4387     auto mainThread = RSMainThread::Instance();
4388     ASSERT_NE(mainThread, nullptr);
4389     mainThread->ProcessScreenHotPlugEvents();
4390 }
4391 
4392 /**
4393  * @tc.name: CheckSystemSceneStatus001
4394  * @tc.desc: Test CheckSystemSceneStatus, APPEAR_MISSION_CENTER
4395  * @tc.type: FUNC
4396  * @tc.require: issueI97LXT
4397  */
4398 HWTEST_F(RSMainThreadTest, CheckSystemSceneStatus001, TestSize.Level1)
4399 {
4400     auto mainThread = RSMainThread::Instance();
4401     ASSERT_NE(mainThread, nullptr);
4402     mainThread->SetSystemAnimatedScenes(SystemAnimatedScenes::APPEAR_MISSION_CENTER);
4403     mainThread->CheckSystemSceneStatus();
4404 }
4405 
4406 /**
4407  * @tc.name: CheckSystemSceneStatus002
4408  * @tc.desc: Test CheckSystemSceneStatus, ENTER_TFS_WINDOW
4409  * @tc.type: FUNC
4410  * @tc.require: issueI97LXT
4411  */
4412 HWTEST_F(RSMainThreadTest, CheckSystemSceneStatus002, TestSize.Level1)
4413 {
4414     auto mainThread = RSMainThread::Instance();
4415     ASSERT_NE(mainThread, nullptr);
4416     mainThread->SetSystemAnimatedScenes(SystemAnimatedScenes::ENTER_TFS_WINDOW);
4417     mainThread->CheckSystemSceneStatus();
4418 }
4419 
4420 /**
4421  * @tc.name: DoDirectComposition
4422  * @tc.desc: Test DoDirectComposition
4423  * @tc.type: FUNC
4424  * @tc.require: issueI97LXT
4425  */
4426 HWTEST_F(RSMainThreadTest, DoDirectComposition, TestSize.Level1)
4427 {
4428     auto mainThread = RSMainThread::Instance();
4429     ASSERT_NE(mainThread, nullptr);
4430     NodeId rootId = 0;
4431     auto rootNode = std::make_shared<RSBaseRenderNode>(rootId);
4432     NodeId displayId = 1;
4433     auto rsContext = std::make_shared<RSContext>();
4434     auto displayNode = std::make_shared<RSScreenRenderNode>(displayId, 0, rsContext->weak_from_this());
4435     rootNode->AddChild(displayNode);
4436     mainThread->DoDirectComposition(rootNode, false);
4437 }
4438 
4439 /**
4440  * @tc.name: UpdateNeedDrawFocusChange001
4441  * @tc.desc: test UpdateNeedDrawFocusChange while node don't has parent
4442  * @tc.type: FUNC
4443  * @tc.require: issueI9LOXQ
4444  */
4445 HWTEST_F(RSMainThreadTest, UpdateNeedDrawFocusChange001, TestSize.Level2)
4446 {
4447     auto mainThread = RSMainThread::Instance();
4448     ASSERT_NE(mainThread, nullptr);
4449 
4450     NodeId id = 0;
4451     auto node = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
4452     ASSERT_NE(node, nullptr);
4453 
4454     ASSERT_NE(mainThread->context_, nullptr);
4455 
4456     NodeId nodeId = node->GetId();
4457     pid_t pid = ExtractPid(nodeId);
4458     mainThread->context_->nodeMap.renderNodeMap_[pid][nodeId] = node;
4459     mainThread->UpdateNeedDrawFocusChange(id);
4460     ASSERT_TRUE(node->GetNeedDrawFocusChange());
4461 }
4462 
4463 /**
4464  * @tc.name: UpdateNeedDrawFocusChange002
4465  * @tc.desc: test UpdateNeedDrawFocusChange while node's parent isn't leash window
4466  * @tc.type: FUNC
4467  * @tc.require: issueI9LOXQ
4468  */
4469 HWTEST_F(RSMainThreadTest, UpdateNeedDrawFocusChange002, TestSize.Level2)
4470 {
4471     auto mainThread = RSMainThread::Instance();
4472     ASSERT_NE(mainThread, nullptr);
4473 
4474     NodeId id = 0;
4475     auto node = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
4476     auto parentNode = std::make_shared<RSSurfaceRenderNode>(id + 1, mainThread->context_);
4477     ASSERT_NE(node, nullptr);
4478     ASSERT_NE(parentNode, nullptr);
4479     parentNode->AddChild(node);
4480     parentNode->SetSurfaceNodeType(RSSurfaceNodeType::APP_WINDOW_NODE);
4481 
4482     ASSERT_NE(mainThread->context_, nullptr);
4483     NodeId nodeId = node->GetId();
4484     pid_t pid = ExtractPid(nodeId);
4485     mainThread->context_->nodeMap.renderNodeMap_[pid][nodeId] = node;
4486     NodeId parentNodeId = parentNode->GetId();
4487     pid_t parentNodePid = ExtractPid(parentNodeId);
4488     mainThread->context_->nodeMap.renderNodeMap_[parentNodePid][parentNodeId] = parentNode;
4489     mainThread->UpdateNeedDrawFocusChange(id);
4490     ASSERT_TRUE(node->GetNeedDrawFocusChange());
4491 }
4492 
4493 /**
4494  * @tc.name: UpdateNeedDrawFocusChange003
4495  * @tc.desc: test UpdateNeedDrawFocusChange while node's parent is leash window
4496  * @tc.type: FUNC
4497  * @tc.require: issueI9LOXQ
4498  */
4499 HWTEST_F(RSMainThreadTest, UpdateNeedDrawFocusChange003, TestSize.Level2)
4500 {
4501     auto mainThread = RSMainThread::Instance();
4502     ASSERT_NE(mainThread, nullptr);
4503 
4504     NodeId id = 0;
4505     auto node = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
4506     auto parentNode = std::make_shared<RSSurfaceRenderNode>(id + 1, mainThread->context_);
4507     ASSERT_NE(node, nullptr);
4508     ASSERT_NE(parentNode, nullptr);
4509     parentNode->AddChild(node);
4510     parentNode->SetSurfaceNodeType(RSSurfaceNodeType::LEASH_WINDOW_NODE);
4511 
4512     ASSERT_NE(mainThread->context_, nullptr);
4513     NodeId nodeId = node->GetId();
4514     pid_t pid = ExtractPid(nodeId);
4515     mainThread->context_->nodeMap.renderNodeMap_[pid][nodeId] = node;
4516     NodeId parentNodeId = parentNode->GetId();
4517     pid_t parentNodePid = ExtractPid(parentNodeId);
4518     mainThread->context_->nodeMap.renderNodeMap_[parentNodePid][parentNodeId] = parentNode;
4519     mainThread->UpdateNeedDrawFocusChange(id);
4520     ASSERT_FALSE(node->GetNeedDrawFocusChange());
4521 }
4522 
4523 /**
4524  * @tc.name: UpdateFocusNodeId001
4525  * @tc.desc: test UpdateFocusNodeId while focusNodeId don't change
4526  * @tc.type: FUNC
4527  * @tc.require: issueI9LOXQ
4528  */
4529 HWTEST_F(RSMainThreadTest, UpdateFocusNodeId001, TestSize.Level2)
4530 {
4531     auto mainThread = RSMainThread::Instance();
4532     ASSERT_NE(mainThread, nullptr);
4533 
4534     NodeId id = 0;
4535     auto node = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
4536     ASSERT_NE(node, nullptr);
4537 
4538     ASSERT_NE(mainThread->context_, nullptr);
4539     NodeId nodeId = node->GetId();
4540     pid_t pid = ExtractPid(nodeId);
4541     mainThread->context_->nodeMap.renderNodeMap_[pid][nodeId] = node;
4542     mainThread->focusNodeId_ = id;
4543     mainThread->UpdateFocusNodeId(id);
4544     ASSERT_EQ(mainThread->GetFocusNodeId(), id);
4545 }
4546 
4547 /**
4548  * @tc.name: UpdateFocusNodeId002
4549  * @tc.desc: test UpdateFocusNodeId while newfocusNodeId is invalid
4550  * @tc.type: FUNC
4551  * @tc.require: issueI9LOXQ
4552  */
4553 HWTEST_F(RSMainThreadTest, UpdateFocusNodeId002, TestSize.Level2)
4554 {
4555     auto mainThread = RSMainThread::Instance();
4556     ASSERT_NE(mainThread, nullptr);
4557 
4558     NodeId id = 0;
4559     auto node = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
4560     ASSERT_NE(node, nullptr);
4561 
4562     ASSERT_NE(mainThread->context_, nullptr);
4563     NodeId nodeId = node->GetId();
4564     pid_t pid = ExtractPid(nodeId);
4565     mainThread->context_->nodeMap.renderNodeMap_[pid][nodeId] = node;
4566     mainThread->focusNodeId_ = id;
4567     mainThread->UpdateFocusNodeId(INVALID_NODEID);
4568     ASSERT_EQ(mainThread->GetFocusNodeId(), id);
4569 }
4570 
4571 /**
4572  * @tc.name: UpdateFocusNodeId003
4573  * @tc.desc: test UpdateFocusNodeId while focus node change
4574  * @tc.type: FUNC
4575  * @tc.require: issueI9LOXQ
4576  */
4577 HWTEST_F(RSMainThreadTest, UpdateFocusNodeId003, TestSize.Level2)
4578 {
4579     auto mainThread = RSMainThread::Instance();
4580     ASSERT_NE(mainThread, nullptr);
4581 
4582     NodeId id = 0;
4583     auto oldFocusNode = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
4584     auto newFocusNode = std::make_shared<RSSurfaceRenderNode>(id + 1, mainThread->context_);
4585     ASSERT_NE(oldFocusNode, nullptr);
4586     ASSERT_NE(newFocusNode, nullptr);
4587 
4588     NodeId oldFocusNodeId = oldFocusNode->GetId();
4589     pid_t oldFocusNodePid = ExtractPid(oldFocusNodeId);
4590     mainThread->context_->nodeMap.renderNodeMap_[oldFocusNodePid][oldFocusNodeId] = oldFocusNode;
4591     NodeId newFocusNodeId = newFocusNode->GetId();
4592     pid_t newFocusNodePid = ExtractPid(newFocusNodeId);
4593     mainThread->context_->nodeMap.renderNodeMap_[newFocusNodePid][newFocusNodeId] = newFocusNode;
4594 
4595     mainThread->focusNodeId_ = oldFocusNode->GetId();
4596     mainThread->UpdateFocusNodeId(newFocusNode->GetId());
4597     ASSERT_EQ(mainThread->GetFocusNodeId(), newFocusNode->GetId());
4598 }
4599 
4600 /**
4601  * @tc.name: UiCaptureTasks
4602  * @tc.desc: test UiCaptureTasks processing
4603  * @tc.type: FUNC
4604  * @tc.require: issueIA6QID
4605  */
4606 HWTEST_F(RSMainThreadTest, UiCaptureTasks, TestSize.Level2)
4607 {
4608     auto mainThread = RSMainThread::Instance();
4609     ASSERT_NE(mainThread, nullptr);
4610 
4611     auto node1 = RSTestUtil::CreateSurfaceNode();
4612     auto node2 = RSTestUtil::CreateSurfaceNode();
__anon6c0dd2f20502() 4613     auto task = []() {};
4614 
4615     mainThread->ProcessUiCaptureTasks();
4616     ASSERT_EQ(mainThread->pendingUiCaptureTasks_.empty(), true);
4617 
4618     mainThread->context_->nodeMap.RegisterRenderNode(node1);
4619     mainThread->AddUiCaptureTask(node1->GetId(), task);
4620     mainThread->AddUiCaptureTask(node2->GetId(), task);
4621     ASSERT_EQ(mainThread->pendingUiCaptureTasks_.empty(), false);
4622     ASSERT_EQ(mainThread->uiCaptureTasks_.empty(), true);
4623 
4624     mainThread->PrepareUiCaptureTasks(nullptr);
4625     ASSERT_EQ(mainThread->pendingUiCaptureTasks_.empty(), true);
4626     ASSERT_EQ(mainThread->uiCaptureTasks_.empty(), false);
4627 
4628     mainThread->ProcessUiCaptureTasks();
4629     ASSERT_EQ(mainThread->pendingUiCaptureTasks_.empty(), true);
4630     ASSERT_EQ(mainThread->uiCaptureTasks_.empty(), true);
4631 
4632     mainThread->context_->nodeMap.UnregisterRenderNode(node1->GetId());
4633 }
4634 
4635 /**
4636  * @tc.name: CheckUIExtensionCallbackDataChanged001
4637  * @tc.desc: test CheckUIExtensionCallbackDataChanged, no need to callback (2 frames of empty callback data)
4638  * @tc.type: FUNC
4639  * @tc.require: issueIABHAX
4640  */
4641 HWTEST_F(RSMainThreadTest, UIExtensionNodesTraverseAndCallback001, TestSize.Level2)
4642 {
4643     auto mainThread = RSMainThread::Instance();
4644     ASSERT_NE(mainThread, nullptr);
4645     mainThread->lastFrameUIExtensionDataEmpty_ = true;
4646     mainThread->uiExtensionCallbackData_.clear();
4647     ASSERT_FALSE(mainThread->CheckUIExtensionCallbackDataChanged());
4648 }
4649 
4650 /**
4651  * @tc.name: CheckUIExtensionCallbackDataChanged002
4652  * @tc.desc: test CheckUIExtensionCallbackDataChanged, first frame of empty callbackdata, need to callback
4653  * @tc.type: FUNC
4654  * @tc.require: issueIABHAX
4655  */
4656 HWTEST_F(RSMainThreadTest, CheckUIExtensionCallbackDataChanged002, TestSize.Level2)
4657 {
4658     auto mainThread = RSMainThread::Instance();
4659     ASSERT_NE(mainThread, nullptr);
4660     mainThread->lastFrameUIExtensionDataEmpty_ = false;
4661     mainThread->uiExtensionCallbackData_.clear();
4662     ASSERT_TRUE(mainThread->CheckUIExtensionCallbackDataChanged());
4663 }
4664 
4665 /**
4666  * @tc.name: UpdateLuminanceAndColorTempTest
4667  * @tc.desc: test UpdateLuminanceAndColorTemp
4668  * @tc.type: FUNC
4669  * @tc.require: issueIAIIEP
4670  */
4671 HWTEST_F(RSMainThreadTest, UpdateLuminanceAndColorTempTest, TestSize.Level2)
4672 {
4673     auto mainThread = RSMainThread::Instance();
4674     ASSERT_NE(mainThread, nullptr);
4675 
4676     auto backUpNode = mainThread->context_->globalRootRenderNode_;
4677     NodeId id = 1;
4678     auto node1 = std::make_shared<RSRenderNode>(id);
4679     auto rsContext = std::make_shared<RSContext>();
4680     auto displayNode1 = std::make_shared<RSScreenRenderNode>(id, 0, rsContext->weak_from_this());
4681     id++;
4682     node1->AddChild(displayNode1);
4683     auto displayNode2 = std::make_shared<RSScreenRenderNode>(id, 0, rsContext->weak_from_this());
4684     id++;
4685     node1->AddChild(displayNode2);
4686     std::weak_ptr<RSContext> weakContext = {};
4687     auto rsCanvasDrawingRenderNode = std::make_shared<RSCanvasDrawingRenderNode>(id, weakContext);
4688     node1->AddChild(rsCanvasDrawingRenderNode);
4689     node1->GenerateFullChildrenList();
4690     mainThread->context_->globalRootRenderNode_ = node1;
4691 
4692     mainThread->UpdateLuminanceAndColorTemp();
4693 
4694     mainThread->context_->globalRootRenderNode_ = backUpNode;
4695 }
4696 
4697 /**
4698  * @tc.name: CheckOnUIExtensionCallback001
4699  * @tc.desc: test CheckOnUIExtensionCallback
4700  * @tc.type: FUNC
4701  * @tc.require: issueIABHAX
4702  */
4703 HWTEST_F(RSMainThreadTest, CheckOnUIExtensionCallback001, TestSize.Level2)
4704 {
4705     auto mainThread = RSMainThread::Instance();
4706     ASSERT_NE(mainThread, nullptr);
4707     mainThread->lastFrameUIExtensionDataEmpty_ = false;
4708     mainThread->uiExtensionCallbackData_.clear();
4709     ASSERT_TRUE(mainThread->CheckUIExtensionCallbackDataChanged());
4710 
4711     auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();
4712     ASSERT_NE(samgr, nullptr);
4713     auto remoteObj = samgr->GetSystemAbility(RENDER_SERVICE);
4714     ASSERT_NE(remoteObj, nullptr);
4715     auto callback = iface_cast<RSIUIExtensionCallback>(remoteObj);
4716     uint64_t userId = 0;
4717     pid_t pid = 0;
4718     mainThread->RegisterUIExtensionCallback(pid, userId, callback);
4719     mainThread->UIExtensionNodesTraverseAndCallback();
4720     mainThread->UnRegisterUIExtensionCallback(pid);
4721 }
4722 
4723 /**
4724  * @tc.name: CheckOnUIExtensionCallback002
4725  * @tc.desc: test RegisterUIExtensionCallback when callback is nullptr
4726  * @tc.type: FUNC
4727  * @tc.require: issueIABHAX
4728  */
4729 HWTEST_F(RSMainThreadTest, CheckOnUIExtensionCallback002, TestSize.Level2)
4730 {
4731     auto mainThread = RSMainThread::Instance();
4732     ASSERT_NE(mainThread, nullptr);
4733     uint64_t userId = 0;
4734     pid_t pid = 0;
4735     sptr<RSIUIExtensionCallback> callback = nullptr;
4736     mainThread->RegisterUIExtensionCallback(pid, userId, callback);
4737     mainThread->UIExtensionNodesTraverseAndCallback();
4738     mainThread->UnRegisterUIExtensionCallback(pid);
4739 }
4740 
4741 /**
4742  * @tc.name: GetDynamicRefreshRate002
4743  * @tc.desc: test GetDynamicRefreshRate, refreshRate = 0
4744  * @tc.type: FUNC
4745  * @tc.require: issueIAIPI3
4746  */
4747 HWTEST_F(RSMainThreadTest, GetDynamicRefreshRate002, TestSize.Level2)
4748 {
4749     auto mainThread = RSMainThread::Instance();
4750     ASSERT_NE(mainThread, nullptr);
4751     ASSERT_EQ(mainThread->GetDynamicRefreshRate(), OHOS::Rosen::STANDARD_REFRESH_RATE);
4752 }
4753 
4754 /**
4755  * @tc.name: SetFrameIsRender
4756  * @tc.desc: test SetFrameIsRender001, rsVSyncDistributor_ = nullptr
4757  * @tc.type: FUNC
4758  * @tc.require: issueIAIPI3
4759  */
4760 HWTEST_F(RSMainThreadTest, SetFrameIsRender001, TestSize.Level2)
4761 {
4762     auto mainThread = RSMainThread::Instance();
4763     ASSERT_NE(mainThread, nullptr);
4764     auto rsVSyncDistributor = mainThread->rsVSyncDistributor_;
4765     mainThread->rsVSyncDistributor_ = nullptr;
4766     mainThread->SetFrameIsRender(true);
4767     mainThread->rsVSyncDistributor_ = rsVSyncDistributor;
4768 }
4769 
4770 /**
4771  * @tc.name: SetFrameIsRender
4772  * @tc.desc: test SetFrameIsRender002, rsVSyncDistributor_ != nullptr
4773  * @tc.type: FUNC
4774  * @tc.require: issueIAIPI3
4775  */
4776 HWTEST_F(RSMainThreadTest, SetFrameIsRender002, TestSize.Level2)
4777 {
4778     auto mainThread = RSMainThread::Instance();
4779     ASSERT_NE(mainThread, nullptr);
4780 
4781     auto vsyncGenerator = CreateVSyncGenerator();
4782     auto vsyncController = new VSyncController(vsyncGenerator, 0);
4783     mainThread->rsVSyncDistributor_ = new VSyncDistributor(vsyncController, "rs");
4784     mainThread->SetFrameIsRender(true);
4785 }
4786 
4787 /**
4788  * @tc.name: OnUniRenderDraw
4789  * @tc.desc: test OnUniRenderDraw001, test isUniRender_ & doDirectComposition_ = false
4790  * @tc.type: FUNC
4791  * @tc.require: issueIAIPI3
4792  */
4793 HWTEST_F(RSMainThreadTest, OnUniRenderDraw001, TestSize.Level2)
4794 {
4795     auto mainThread = RSMainThread::Instance();
4796     ASSERT_NE(mainThread, nullptr);
4797     auto isUniRender = mainThread->isUniRender_;
4798     auto doDirectComposition = mainThread->doDirectComposition_;
4799     mainThread->isUniRender_ = false;
4800     mainThread->OnUniRenderDraw();
4801     mainThread->isUniRender_ = true;
4802     mainThread->doDirectComposition_ = false;
4803     mainThread->drawFrame_.rsParallelType_ = RsParallelType::RS_PARALLEL_TYPE_SYNC;
4804     mainThread->OnUniRenderDraw();
4805     mainThread->isUniRender_ = isUniRender;
4806     mainThread->doDirectComposition_ = doDirectComposition;
4807 }
4808 
4809 /**
4810  * @tc.name: OnUniRenderDraw
4811  * @tc.desc: test OnUniRenderDraw002, doDirectComposition_ = true
4812  * @tc.type: FUNC
4813  * @tc.require: issueIAIPI3
4814  */
4815 HWTEST_F(RSMainThreadTest, OnUniRenderDraw002, TestSize.Level2)
4816 {
4817     auto mainThread = RSMainThread::Instance();
4818     ASSERT_NE(mainThread, nullptr);
4819     auto isUniRender = mainThread->isUniRender_;
4820     auto doDirectComposition = mainThread->doDirectComposition_;
4821     mainThread->isUniRender_ = true;
4822     mainThread->doDirectComposition_ = true;
4823     mainThread->OnUniRenderDraw();
4824     mainThread->isUniRender_ = isUniRender;
4825     mainThread->doDirectComposition_ = doDirectComposition;
4826 }
4827 
4828 /**
4829  * @tc.name: RSJankStatsOnVsyncStart
4830  * @tc.desc: test RSJankStatsOnVsyncStart001, isUnirender_ = false & true
4831  * @tc.type: FUNC
4832  * @tc.require: issueIAIZ2Y
4833  */
4834 HWTEST_F(RSMainThreadTest, RSJankStatsOnVsyncStart001, TestSize.Level2)
4835 {
4836     auto mainThread = RSMainThread::Instance();
4837     ASSERT_NE(mainThread, nullptr);
4838     auto isUniRender = mainThread->isUniRender_;
4839     mainThread->isUniRender_ = false;
4840     mainThread->RSJankStatsOnVsyncStart(TIMESTAMP_INITIAL, TIMESTAMP_INITIAL, TIMESTAMP_INITIAL_FLOAT);
4841     mainThread->isUniRender_ = true;
4842     mainThread->RSJankStatsOnVsyncStart(TIMESTAMP_INITIAL, TIMESTAMP_INITIAL, TIMESTAMP_INITIAL_FLOAT);
4843     mainThread->isUniRender_ = isUniRender;
4844 }
4845 
4846 /**
4847  * @tc.name: RSJankStatsOnVsyncStart
4848  * @tc.desc: test RSJankStatsOnVsyncStart002, renderThreadParams_ = false & true
4849  * @tc.type: FUNC
4850  * @tc.require: issueIAIZ2Y
4851  */
4852 HWTEST_F(RSMainThreadTest, RSJankStatsOnVsyncStart002, TestSize.Level2)
4853 {
4854     auto mainThread = RSMainThread::Instance();
4855     ASSERT_NE(mainThread, nullptr);
4856     auto isUniRender = mainThread->isUniRender_;
4857     mainThread->isUniRender_ = true;
4858     mainThread->renderThreadParams_ = std::make_unique<RSRenderThreadParams>();
4859     mainThread->RSJankStatsOnVsyncStart(TIMESTAMP_INITIAL, TIMESTAMP_INITIAL, TIMESTAMP_INITIAL_FLOAT);
4860     mainThread->renderThreadParams_ = nullptr;
4861     mainThread->RSJankStatsOnVsyncStart(TIMESTAMP_INITIAL, TIMESTAMP_INITIAL, TIMESTAMP_INITIAL_FLOAT);
4862     mainThread->isUniRender_ = isUniRender;
4863 }
4864 
4865 /**
4866  * @tc.name: RSJankStatsOnVsyncEnd
4867  * @tc.desc: test RSJankStatsOnVsyncEnd001, isUniRender_ = true & doDirectComposition_ = true
4868  * @tc.type: FUNC
4869  * @tc.require: issueIAIZ2Y
4870  */
4871 HWTEST_F(RSMainThreadTest, RSJankStatsOnVsyncEnd001, TestSize.Level2)
4872 {
4873     auto mainThread = RSMainThread::Instance();
4874     ASSERT_NE(mainThread, nullptr);
4875     auto isUniRender = mainThread->isUniRender_;
4876     auto doDirectComposition = mainThread->doDirectComposition_;
4877     mainThread->isUniRender_ = true;
4878     mainThread->doDirectComposition_ = true;
4879     mainThread->RSJankStatsOnVsyncEnd(TIMESTAMP_INITIAL, TIMESTAMP_INITIAL, TIMESTAMP_INITIAL_FLOAT);
4880     mainThread->isUniRender_ = isUniRender;
4881     mainThread->doDirectComposition_ = doDirectComposition;
4882 }
4883 
4884 /**
4885  * @tc.name: RSJankStatsOnVsyncEnd
4886  * @tc.desc: test RSJankStatsOnVsyncEnd002, isUniRender_ || doDirectComposition_ exist false
4887  * @tc.type: FUNC
4888  * @tc.require: issueIAIZ2Y
4889  */
4890 HWTEST_F(RSMainThreadTest, RSJankStatsOnVsyncEnd002, TestSize.Level2)
4891 {
4892     auto mainThread = RSMainThread::Instance();
4893     ASSERT_NE(mainThread, nullptr);
4894     auto isUniRender = mainThread->isUniRender_;
4895     auto doDirectComposition = mainThread->doDirectComposition_;
4896     mainThread->isUniRender_ = false;
4897     mainThread->doDirectComposition_ = true;
4898     mainThread->RSJankStatsOnVsyncEnd(TIMESTAMP_INITIAL, TIMESTAMP_INITIAL, TIMESTAMP_INITIAL_FLOAT);
4899     mainThread->isUniRender_ = true;
4900     mainThread->doDirectComposition_ = false;
4901     mainThread->RSJankStatsOnVsyncEnd(TIMESTAMP_INITIAL, TIMESTAMP_INITIAL, TIMESTAMP_INITIAL_FLOAT);
4902     mainThread->isUniRender_ = false;
4903     mainThread->doDirectComposition_ = false;
4904     mainThread->RSJankStatsOnVsyncEnd(TIMESTAMP_INITIAL, TIMESTAMP_INITIAL, TIMESTAMP_INITIAL_FLOAT);
4905     mainThread->isUniRender_ = isUniRender;
4906     mainThread->doDirectComposition_ = doDirectComposition;
4907 }
4908 
4909 /**
4910  * @tc.name: ProcessDataBySingleFrameComposer
4911  * @tc.desc: test ProcessDataBySingleFrameComposer001, rsTransactionData != nullptr & isUniRender_ = ture & false
4912  * @tc.type: FUNC
4913  * @tc.require: issueIAIZ2Y
4914  */
4915 HWTEST_F(RSMainThreadTest, ProcessDataBySingleFrameComposer001, TestSize.Level2)
4916 {
4917     auto mainThread = RSMainThread::Instance();
4918     ASSERT_NE(mainThread, nullptr);
4919     auto isUniRender = mainThread->isUniRender_;
4920     auto rsTransactionData = std::make_unique<RSTransactionData>();
4921     mainThread->isUniRender_ = false;
4922     mainThread->ProcessDataBySingleFrameComposer(rsTransactionData);
4923     mainThread->isUniRender_ = true;
4924     mainThread->ProcessDataBySingleFrameComposer(rsTransactionData);
4925     mainThread->isUniRender_ = isUniRender;
4926 }
4927 
4928 /**
4929  * @tc.name: ProcessDataBySingleFrameComposer
4930  * @tc.desc: test ProcessDataBySingleFrameComposer002, rsTransactionData = nullptr & isUniRender_ = ture & false
4931  * @tc.type: FUNC
4932  * @tc.require: issueIAIZ2Y
4933  */
4934 HWTEST_F(RSMainThreadTest, ProcessDataBySingleFrameComposer002, TestSize.Level2)
4935 {
4936     auto mainThread = RSMainThread::Instance();
4937     ASSERT_NE(mainThread, nullptr);
4938     auto isUniRender = mainThread->isUniRender_;
4939     std::unique_ptr<RSTransactionData> rsTransactionData = nullptr;
4940     mainThread->isUniRender_ = false;
4941     mainThread->ProcessDataBySingleFrameComposer(rsTransactionData);
4942     mainThread->isUniRender_ = true;
4943     mainThread->ProcessDataBySingleFrameComposer(rsTransactionData);
4944     mainThread->isUniRender_ = isUniRender;
4945 }
4946 
4947 /**
4948  * @tc.name: IsHardwareEnabledNodesNeedSync
4949  * @tc.desc: test IsHardwareEnabledNodesNeedSync
4950  * @tc.type: FUNC
4951  * @tc.require:
4952  */
4953 HWTEST_F(RSMainThreadTest, IsHardwareEnabledNodesNeedSync, TestSize.Level2)
4954 {
4955     NodeId id = 1;
4956     auto mainThread = RSMainThread::Instance();
4957     ASSERT_NE(mainThread, nullptr);
4958 
4959     mainThread->hardwareEnabledNodes_.emplace_back(nullptr);
4960     ASSERT_EQ(mainThread->IsHardwareEnabledNodesNeedSync(), false);
4961 
4962     mainThread->hardwareEnabledNodes_.clear();
4963     mainThread->doDirectComposition_ = false;
4964     auto node1 = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
4965     node1->stagingRenderParams_ = nullptr;
4966     mainThread->hardwareEnabledNodes_.emplace_back(node1);
4967     ASSERT_EQ(mainThread->IsHardwareEnabledNodesNeedSync(), false);
4968 
4969     mainThread->hardwareEnabledNodes_.clear();
4970     mainThread->doDirectComposition_ = false;
4971     auto node2 = std::make_shared<RSSurfaceRenderNode>(id + 1, mainThread->context_);
4972     node2->stagingRenderParams_ = std::make_unique<RSSurfaceRenderParams>(id + 2);
4973     node2->stagingRenderParams_->SetNeedSync(true);
4974     mainThread->hardwareEnabledNodes_.emplace_back(node2);
4975     ASSERT_EQ(mainThread->IsHardwareEnabledNodesNeedSync(), true);
4976 
4977     mainThread->hardwareEnabledNodes_.clear();
4978     mainThread->doDirectComposition_ = true;
4979     auto node3 = std::make_shared<RSSurfaceRenderNode>(id + 3, mainThread->context_);
4980     node3->SetHardwareForcedDisabledState(false);
4981     RectI dstRect{0, 0, 400, 600};
4982     node3->SetDstRect(dstRect);
4983     mainThread->hardwareEnabledNodes_.emplace_back(node3);
4984     ASSERT_EQ(mainThread->IsHardwareEnabledNodesNeedSync(), true);
4985 }
4986 
4987 /**
4988  * @tc.name: IsSingleDisplay
4989  * @tc.desc: test IsSingleDisplay, rootNode = nullptr
4990  * @tc.type: FUNC
4991  * @tc.require: issueIAS924
4992  */
4993 HWTEST_F(RSMainThreadTest, IsSingleDisplay, TestSize.Level2)
4994 {
4995     auto mainThread = RSMainThread::Instance();
4996     ASSERT_NE(mainThread, nullptr);
4997     ASSERT_NE(mainThread->context_, nullptr);
4998     auto rootNode = mainThread->context_->globalRootRenderNode_;
4999     ASSERT_EQ(mainThread->IsSingleDisplay(), true);
5000     mainThread->context_->globalRootRenderNode_ = nullptr;
5001     ASSERT_EQ(mainThread->IsSingleDisplay(), false);
5002     mainThread->context_->globalRootRenderNode_ = rootNode;
5003 }
5004 
5005 /**
5006  * @tc.name: HasMirrorDisplay
5007  * @tc.desc: test HasMirrorDisplay001, rootNode = nullptr
5008  * @tc.type: FUNC
5009  * @tc.require: issueIB5EAA
5010  */
5011 HWTEST_F(RSMainThreadTest, HasMirrorDisplay001, TestSize.Level2)
5012 {
5013     auto mainThread = RSMainThread::Instance();
5014     ASSERT_NE(mainThread, nullptr);
5015     ASSERT_NE(mainThread->context_, nullptr);
5016     auto rootNode = mainThread->context_->globalRootRenderNode_;
5017     ASSERT_NE(rootNode, nullptr);
5018     mainThread->context_->globalRootRenderNode_ = nullptr;
5019     ASSERT_EQ(mainThread->HasMirrorDisplay(), false);
5020     mainThread->context_->globalRootRenderNode_ = rootNode;
5021 }
5022 
5023 /**
5024  * @tc.name: HasMirrorDisplay
5025  * @tc.desc: test HasMirrorDisplay002, rootNode = nullptr
5026  * @tc.type: FUNC
5027  * @tc.require: issueIB5EAA
5028  */
5029 HWTEST_F(RSMainThreadTest, HasMirrorDisplay002, TestSize.Level2)
5030 {
5031     auto mainThread = RSMainThread::Instance();
5032     ASSERT_NE(mainThread, nullptr);
5033     ASSERT_NE(mainThread->context_, nullptr);
5034     auto rootNode = mainThread->context_->globalRootRenderNode_;
5035     NodeId id = 1;
5036     auto node1 = std::make_shared<RSRenderNode>(id);
5037     id++;
5038     auto rsContext = std::make_shared<RSContext>();
5039     auto displayNode1 = std::make_shared<RSScreenRenderNode>(id, 0, rsContext->weak_from_this());
5040     id++;
5041     node1->AddChild(displayNode1);
5042     node1->GenerateFullChildrenList();
5043     ASSERT_TRUE(node1->GetChildrenCount() <= 1);
5044     mainThread->context_->globalRootRenderNode_ = node1;
5045     ASSERT_EQ(mainThread->HasMirrorDisplay(), false);
5046     auto displayNode2 = std::make_shared<RSScreenRenderNode>(id, 0, rsContext->weak_from_this());
5047     id++;
5048     auto mirrorSourceNode = std::make_shared<RSScreenRenderNode>(id, 0, rsContext->weak_from_this());
5049     displayNode2->isMirroredScreen_ = true;
5050     displayNode2->SetMirrorSource(mirrorSourceNode);
5051     node1->AddChild(displayNode2);
5052     node1->GenerateFullChildrenList();
5053     ASSERT_TRUE(node1->GetChildrenCount() > 1);
5054     mainThread->context_->globalRootRenderNode_ = node1;
5055     ASSERT_EQ(mainThread->HasMirrorDisplay(), true);
5056     mainThread->context_->globalRootRenderNode_ = rootNode;
5057 }
5058 
5059 /**
5060  * @tc.name: HasMirrorDisplay003
5061  * @tc.desc: test HasMirrorDisplay, rootNode != nullptr, and childNode is canvas node
5062  * @tc.type: FUNC
5063  * @tc.require: issueIB5EAA
5064  */
5065 HWTEST_F(RSMainThreadTest, HasMirrorDisplay003, TestSize.Level2)
5066 {
5067     auto mainThread = RSMainThread::Instance();
5068     ASSERT_NE(mainThread, nullptr);
5069     ASSERT_NE(mainThread->context_, nullptr);
5070     auto rootNode = mainThread->context_->globalRootRenderNode_;
5071     NodeId id = 1;
5072     auto node1 = std::make_shared<RSRenderNode>(id);
5073     id++;
5074     auto rsContext = std::make_shared<RSContext>();
5075     auto displayNode1 = std::make_shared<RSScreenRenderNode>(id, 0, rsContext->weak_from_this());
5076     id++;
5077     node1->AddChild(displayNode1);
5078     node1->GenerateFullChildrenList();
5079     ASSERT_TRUE(node1->GetChildrenCount() <= 1);
5080     mainThread->context_->globalRootRenderNode_ = node1;
5081     ASSERT_EQ(mainThread->HasMirrorDisplay(), false);
5082     auto displayNode2 = std::make_shared<RSScreenRenderNode>(id, 0, rsContext->weak_from_this());
5083     id++;
5084     auto mirrorSourceNode1 = std::make_shared<RSScreenRenderNode>(id, 0, rsContext->weak_from_this());
5085     id++;
5086     displayNode2->isMirroredScreen_ = true;
5087     displayNode2->SetMirrorSource(mirrorSourceNode1);
5088     displayNode2->compositeType_ = CompositeType::UNI_RENDER_COMPOSITE;
5089     node1->AddChild(displayNode2);
5090     node1->GenerateFullChildrenList();
5091 
5092     auto displayNode3 = std::make_shared<RSScreenRenderNode>(id, 0, rsContext->weak_from_this());
5093     id++;
5094     auto mirrorSourceNode2 = std::make_shared<RSScreenRenderNode>(id, 0, rsContext->weak_from_this());
5095     id++;
5096     displayNode3->isMirroredScreen_ = true;
5097     displayNode3->SetMirrorSource(mirrorSourceNode2);
5098     displayNode2->compositeType_ = CompositeType::UNI_RENDER_MIRROR_COMPOSITE;
5099     node1->AddChild(displayNode3);
5100     node1->GenerateFullChildrenList();
5101 
5102     std::weak_ptr<RSContext> weakContext = {};
5103     auto rsCanvasDrawingRenderNode = std::make_shared<RSCanvasDrawingRenderNode>(id, weakContext);
5104     node1->AddChild(rsCanvasDrawingRenderNode);
5105     node1->GenerateFullChildrenList();
5106 
5107     mainThread->context_->globalRootRenderNode_ = node1;
5108     EXPECT_TRUE(mainThread->HasMirrorDisplay());
5109     mainThread->context_->globalRootRenderNode_ = rootNode;
5110 }
5111 
5112 /**
5113  * @tc.name: ResetAnimateNodeFlag
5114  * @tc.desc: test ResetAnimateNodeFlag, context_ = nullptr & !nullptr
5115  * @tc.type: FUNC
5116  * @tc.require: issueIAIZ2Y
5117  */
5118 HWTEST_F(RSMainThreadTest, ResetAnimateNodeFlag, TestSize.Level2)
5119 {
5120     auto mainThread = RSMainThread::Instance();
5121     ASSERT_NE(mainThread, nullptr);
5122     ASSERT_NE(mainThread->context_, nullptr);
5123     auto context = mainThread->context_;
5124     mainThread->ResetAnimateNodeFlag();
5125     mainThread->context_ = nullptr;
5126     mainThread->ResetAnimateNodeFlag();
5127     mainThread->context_ = context;
5128 }
5129 
5130 /**
5131  * @tc.name: SendClientDumpNodeTreeCommandsTest001
5132  * @tc.desc: test SendClientDumpNodeTreeCommands
5133  * @tc.type: FUNC
5134  * @tc.require: issueIAKME2
5135  */
5136 HWTEST_F(RSMainThreadTest, SendClientDumpNodeTreeCommandsTest001, TestSize.Level2)
5137 {
5138     auto mainThread = RSMainThread::Instance();
5139     ASSERT_NE(mainThread, nullptr);
5140     ASSERT_NE(mainThread->context_, nullptr);
5141     mainThread->nodeTreeDumpTasks_.clear();
5142 
5143     NodeId testId = 1;
5144     auto rootNode = mainThread->context_->globalRootRenderNode_;
5145     auto displayNode = std::make_shared<RSScreenRenderNode>(testId++, 0, std::make_shared<RSContext>());
5146     rootNode->AddChild(displayNode);
5147     auto node1 = std::make_shared<RSRenderNode>(testId++);
5148     displayNode->AddChild(node1);
5149     rootNode->GenerateFullChildrenList();
5150     displayNode->GenerateFullChildrenList();
5151 
5152     auto node2 = std::make_shared<RSSurfaceRenderNode>(testId++, mainThread->context_);
5153     node1->AddChild(node2);
5154     auto node3 = std::make_shared<RSRootRenderNode>(testId++, mainThread->context_);
5155     node2->AddChild(node3);
5156     node1->GenerateFullChildrenList();
5157     node2->GenerateFullChildrenList();
5158     node3->SetIsOnTheTree(true);
5159     mainThread->context_->GetMutableNodeMap().FilterNodeByPid(0);
5160     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node3);
5161 
5162     uint32_t taskId = 0;
5163     sptr<ApplicationAgentImpl> agent = new ApplicationAgentImpl();
5164     mainThread->RegisterApplicationAgent(0, agent);
5165     mainThread->SendClientDumpNodeTreeCommands(taskId);
5166     ASSERT_TRUE(!mainThread->nodeTreeDumpTasks_.empty());
5167     ASSERT_TRUE(mainThread->nodeTreeDumpTasks_[taskId].count > 0);
5168 
5169     mainThread->SendClientDumpNodeTreeCommands(taskId);
5170     rootNode->RemoveChild(displayNode);
5171 }
5172 
5173 /**
5174  * @tc.name: SendClientDumpNodeTreeCommandsTest002
5175  * @tc.desc: test SendClientDumpNodeTreeCommands, UIContextTokenList is not empty
5176  * @tc.type: FUNC
5177  * @tc.require: issueICPQSU
5178  */
5179 HWTEST_F(RSMainThreadTest, SendClientDumpNodeTreeCommandsTest002, TestSize.Level2)
5180 {
5181     auto mainThread = RSMainThread::Instance();
5182     ASSERT_NE(mainThread, nullptr);
5183     ASSERT_NE(mainThread->context_, nullptr);
5184     mainThread->nodeTreeDumpTasks_.clear();
5185 
5186     uint64_t token = 1000;
5187     NodeId testId = 1;
5188     auto rootNode = mainThread->context_->globalRootRenderNode_;
5189     auto displayNode = std::make_shared<RSScreenRenderNode>(testId++, 0, std::make_shared<RSContext>());
5190     displayNode->SetUIContextToken(token);
5191     rootNode->AddChild(displayNode);
5192     auto node1 = std::make_shared<RSRenderNode>(testId++);
5193     node1->SetUIContextToken(token);
5194     displayNode->AddChild(node1);
5195     rootNode->GenerateFullChildrenList();
5196     displayNode->GenerateFullChildrenList();
5197 
5198     auto node2 = std::make_shared<RSSurfaceRenderNode>(testId++, mainThread->context_);
5199     node2->SetUIContextToken(token);
5200     node1->AddChild(node2);
5201     auto node3 = std::make_shared<RSRootRenderNode>(testId++, mainThread->context_);
5202     node3->SetUIContextToken(token);
5203     node2->AddChild(node3);
5204     node1->GenerateFullChildrenList();
5205     node2->GenerateFullChildrenList();
5206     node3->SetIsOnTheTree(true);
5207     mainThread->context_->GetMutableNodeMap().FilterNodeByPid(0);
5208     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node3);
5209 
5210     uint32_t taskId = 0;
5211     sptr<ApplicationAgentImpl> agent = new ApplicationAgentImpl();
5212     mainThread->RegisterApplicationAgent(0, agent);
5213     mainThread->SendClientDumpNodeTreeCommands(taskId);
5214     ASSERT_TRUE(!mainThread->nodeTreeDumpTasks_.empty());
5215     ASSERT_TRUE(mainThread->nodeTreeDumpTasks_[taskId].count > 0);
5216 
5217     mainThread->SendClientDumpNodeTreeCommands(taskId);
5218     rootNode->RemoveChild(displayNode);
5219 }
5220 
5221 /**
5222  * @tc.name: CollectClientNodeTreeResult
5223  * @tc.desc: test CollectClientNodeTreeResult
5224  * @tc.type: FUNC
5225  * @tc.require: issueIAKME2
5226  */
5227 HWTEST_F(RSMainThreadTest, CollectClientNodeTreeResult, TestSize.Level2)
5228 {
5229     auto mainThread = RSMainThread::Instance();
5230     ASSERT_NE(mainThread, nullptr);
5231     mainThread->nodeTreeDumpTasks_.clear();
5232 
5233     uint32_t taskId = 0;
5234     auto& task = mainThread->nodeTreeDumpTasks_[taskId];
5235     task.data[0] = "testData";
5236     task.count++;
5237 
5238     std::string out;
5239     mainThread->CollectClientNodeTreeResult(taskId, out, 1);
5240     ASSERT_TRUE(!out.empty());
5241     ASSERT_TRUE(mainThread->nodeTreeDumpTasks_.empty());
5242 }
5243 
5244 /**
5245  * @tc.name: OnDrawingCacheDfxSwitchCallback
5246  * @tc.desc: test OnDrawingCacheDfxSwitchCallback
5247  * @tc.type: FUNC
5248  * @tc.require: issueIALU2Y
5249  */
5250 HWTEST_F(RSMainThreadTest, OnDrawingCacheDfxSwitchCallback, TestSize.Level2)
5251 {
5252     auto mainThread = RSMainThread::Instance();
5253     ASSERT_NE(mainThread, nullptr);
5254     RSMainThread::OnDrawingCacheDfxSwitchCallback("persist", "1", nullptr);
5255     RSMainThread::OnDrawingCacheDfxSwitchCallback("rosen.drawingCache.enabledDfx", "1", nullptr);
5256 }
5257 
5258 /**
5259  * @tc.name: OnCommitDumpClientNodeTree
5260  * @tc.desc: test OnCommitDumpClientNodeTree
5261  * @tc.type: FUNC
5262  * @tc.require: issueIAKME2
5263  */
5264 HWTEST_F(RSMainThreadTest, OnCommitDumpClientNodeTree, TestSize.Level2)
5265 {
5266     auto mainThread = RSMainThread::Instance();
5267     ASSERT_NE(mainThread, nullptr);
5268     mainThread->nodeTreeDumpTasks_.clear();
5269 
5270     uint32_t taskId = 0;
5271     mainThread->OnCommitDumpClientNodeTree(0, 0, taskId, "testData");
5272     ASSERT_TRUE(mainThread->nodeTreeDumpTasks_.empty());
5273 
5274     auto& task = mainThread->nodeTreeDumpTasks_[taskId];
5275     task.count++;
5276 
5277     mainThread->OnCommitDumpClientNodeTree(0, 0, taskId, "testData");
5278     mainThread->OnCommitDumpClientNodeTree(0, 0, taskId, "testData");
5279     ASSERT_TRUE(!mainThread->nodeTreeDumpTasks_.empty());
5280     ASSERT_TRUE(!mainThread->nodeTreeDumpTasks_[taskId].data.empty());
5281 }
5282 
5283 /**
5284  * @tc.name: TraverseCanvasDrawingNodesNotOnTree
5285  * @tc.desc: test TraverseCanvasDrawingNodesNotOnTree
5286  * @tc.type: FUNC
5287  * @tc.require: issueIB56EL
5288  */
5289 HWTEST_F(RSMainThreadTest, TraverseCanvasDrawingNodesNotOnTree, TestSize.Level2)
5290 {
5291     auto mainThread = RSMainThread::Instance();
5292     ASSERT_NE(mainThread, nullptr);
5293     mainThread->TraverseCanvasDrawingNodesNotOnTree();
5294 }
5295 
5296 /**
5297  * @tc.name: RenderServiceAllNodeDump01
5298  * @tc.desc: RenderServiceAllNodeDump Test
5299  * @tc.type: FUNC
5300  * @tc.require: issueIB57QP
5301  */
5302 HWTEST_F(RSMainThreadTest, RenderServiceAllNodeDump01, TestSize.Level1)
5303 {
5304     auto mainThread = RSMainThread::Instance();
5305     ASSERT_NE(mainThread, nullptr);
5306     NodeId id = 1;
5307     MemoryInfo info = {sizeof(*this), ExtractPid(id), id, MEMORY_TYPE::MEM_RENDER_NODE};
5308     MemoryTrack::Instance().AddNodeRecord(id, info);
5309     DfxString log;
5310     mainThread->RenderServiceAllNodeDump(log);
5311 }
5312 
5313 /**
5314  * @tc.name: ConnectChipsetVsyncSer
5315  * @tc.desc: test ConnectChipsetVsyncSer
5316  * @tc.type: FUNC
5317  * @tc.require:issuesIB6292
5318  */
5319 #if defined(RS_ENABLE_CHIPSET_VSYNC)
5320 HWTEST_F(RSMainThreadTest, ConnectChipsetVsyncSer, TestSize.Level2)
5321 {
5322     auto mainThread = RSMainThread::Instance();
5323     ASSERT_NE(mainThread, nullptr);
5324     mainThread->initVsyncServiceFlag_ = false;
5325     mainThread->ConnectChipsetVsyncSer();
5326 }
5327 #endif
5328 
5329 /**
5330  * @tc.name: SetVsyncInfo
5331  * @tc.desc: test SetVsyncInfo
5332  * @tc.type: FUNC
5333  * @tc.require:issuesIB6292
5334  */
5335 #if defined(RS_ENABLE_CHIPSET_VSYNC)
5336 HWTEST_F(RSMainThreadTest, SetVsyncInfo, TestSize.Level2)
5337 {
5338     auto mainThread = RSMainThread::Instance();
5339     ASSERT_NE(mainThread, nullptr);
5340     ASSERT_NE(mainThread->context_, nullptr);
5341     auto receiver = mainThread->receiver_;
5342     if (mainThread->rsVSyncDistributor_ == nullptr) {
5343         auto vsyncGenerator = CreateVSyncGenerator();
5344         auto vsyncController = new VSyncController(vsyncGenerator, 0);
5345         mainThread->rsVSyncDistributor_ = new VSyncDistributor(vsyncController, "rs");
5346     }
5347     sptr<VSyncConnection> conn = new VSyncConnection(mainThread->rsVSyncDistributor_, "rs");
5348     mainThread->receiver_ = std::make_shared<VSyncReceiver>(conn);
5349     mainThread->SetVsyncInfo(0);
5350     mainThread->receiver_ = receiver;
5351 }
5352 #endif
5353 
5354 /**
5355  * @tc.name: IsOcclusionNodesNeedSync001
5356  * @tc.desc: test IsOcclusionNodesNeedSync001
5357  * @tc.type: FUNC
5358  * @tc.require:
5359  */
5360 HWTEST_F(RSMainThreadTest, IsOcclusionNodesNeedSync001, TestSize.Level2)
5361 {
5362     auto mainThread = RSMainThread::Instance();
5363     ASSERT_NE(mainThread, nullptr);
5364     mainThread->nodeTreeDumpTasks_.clear();
5365     NodeId nodeId = 1;
5366     std::shared_ptr<RSSurfaceRenderNode> node = std::make_shared<RSSurfaceRenderNode>(nodeId);
5367     ASSERT_NE(node, nullptr);
5368     node->isFullChildrenListValid_ = false;
5369     RSRenderNodeMap& nodeMap = mainThread->GetContext().GetMutableNodeMap();
5370     nodeMap.RegisterRenderNode(node);
5371     ASSERT_TRUE(mainThread->IsOcclusionNodesNeedSync(nodeId, true));
5372 }
5373 
5374 /**
5375  * @tc.name: IsOcclusionNodesNeedSync002
5376  * @tc.desc: test IsOcclusionNodesNeedSync002
5377  * @tc.type: FUNC
5378  * @tc.require:
5379  */
5380 HWTEST_F(RSMainThreadTest, IsOcclusionNodesNeedSync002, TestSize.Level2)
5381 {
5382     auto mainThread = RSMainThread::Instance();
5383     ASSERT_NE(mainThread, nullptr);
5384     mainThread->nodeTreeDumpTasks_.clear();
5385     NodeId nodeId = 1;
5386     std::shared_ptr<RSSurfaceRenderNode> node = std::make_shared<RSSurfaceRenderNode>(nodeId);
5387     ASSERT_NE(node, nullptr);
5388     node->nodeType_ = RSSurfaceNodeType::SELF_DRAWING_WINDOW_NODE;
5389     RSRenderNodeMap& nodeMap = mainThread->GetContext().GetMutableNodeMap();
5390     nodeMap.RegisterRenderNode(node);
5391     ASSERT_TRUE(mainThread->IsOcclusionNodesNeedSync(nodeId, true));
5392 }
5393 
5394 /**
5395  * @tc.name: IsOcclusionNodesNeedSync003
5396  * @tc.desc: test IsOcclusionNodesNeedSync003
5397  * @tc.type: FUNC
5398  * @tc.require:
5399  */
5400 HWTEST_F(RSMainThreadTest, IsOcclusionNodesNeedSync003, TestSize.Level2)
5401 {
5402     auto mainThread = RSMainThread::Instance();
5403     ASSERT_NE(mainThread, nullptr);
5404     mainThread->nodeTreeDumpTasks_.clear();
5405     NodeId nodeId = 1;
5406     ASSERT_FALSE(mainThread->IsOcclusionNodesNeedSync(nodeId, true));
5407 }
5408 
5409 /**
5410  * @tc.name: IsOcclusionNodesNeedSync004
5411  * @tc.desc: test IsOcclusionNodesNeedSync004
5412  * @tc.type: FUNC
5413  * @tc.require:
5414  */
5415 HWTEST_F(RSMainThreadTest, IsOcclusionNodesNeedSync004, TestSize.Level2)
5416 {
5417     auto mainThread = RSMainThread::Instance();
5418     ASSERT_NE(mainThread, nullptr);
5419     mainThread->nodeTreeDumpTasks_.clear();
5420     NodeId nodeId = 1;
5421     std::shared_ptr<RSSurfaceRenderNode> node = std::make_shared<RSSurfaceRenderNode>(nodeId);
5422     ASSERT_NE(node, nullptr);
5423     node->nodeType_ = RSSurfaceNodeType::LEASH_WINDOW_NODE;
5424     node->SetIsOnTheTree(true);
5425     RSRenderNodeMap& nodeMap = mainThread->GetContext().GetMutableNodeMap();
5426     nodeMap.RegisterRenderNode(node);
5427     ASSERT_FALSE(mainThread->IsOcclusionNodesNeedSync(nodeId, false));
5428 }
5429 
5430 /**
5431  * @tc.name: ProcessHgmFrameRate
5432  * @tc.desc: test ProcessHgmFrameRate
5433  * @tc.type: FUNC
5434  * @tc.require:
5435  */
5436 HWTEST_F(RSMainThreadTest, ProcessHgmFrameRate, TestSize.Level2)
5437 {
5438     auto mainThread = RSMainThread::Instance();
5439     ASSERT_NE(mainThread, nullptr);
5440 
5441     uint64_t timestamp = 0;
5442     FrameRateLinkerId id = 0;
5443     mainThread->hgmContext_.rsFrameRateLinker_ = std::make_shared<RSRenderFrameRateLinker>(id);
5444     mainThread->ProcessHgmFrameRate(timestamp);
5445 
5446     auto vsyncGenerator = CreateVSyncGenerator();
5447     auto vsyncController = new VSyncController(vsyncGenerator, 0);
5448     mainThread->appVSyncDistributor_ = new VSyncDistributor(vsyncController, "WMVSyncConnection");
5449     mainThread->ProcessHgmFrameRate(timestamp);
5450 
5451     mainThread->rsVSyncDistributor_ = nullptr;
5452     mainThread->ProcessHgmFrameRate(timestamp);
5453     sleep(1);
5454 }
5455 
5456 /**
5457  * @tc.name: SetCurtainScreenUsingStatus
5458  * @tc.desc: test SetCurtainScreenUsingStatus
5459  * @tc.type: FUNC
5460  * @tc.require: issueIB5RAM
5461  */
5462 HWTEST_F(RSMainThreadTest, SetCurtainScreenUsingStatus001, TestSize.Level2)
5463 {
5464     auto mainThread = RSMainThread::Instance();
5465     ASSERT_NE(mainThread, nullptr);
5466     auto isCurtainScreenOn = mainThread->isCurtainScreenOn_;
5467 
5468     mainThread->isCurtainScreenOn_ = true;
5469     mainThread->SetCurtainScreenUsingStatus(true);
5470 
5471     mainThread->isCurtainScreenOn_ = false;
5472     mainThread->SetCurtainScreenUsingStatus(true);
5473     ASSERT_EQ(mainThread->isCurtainScreenOn_, true);
5474 
5475     mainThread->SetCurtainScreenUsingStatus(isCurtainScreenOn);
5476 }
5477 
5478 /**
5479  * @tc.name: DumpMem001
5480  * @tc.desc: test DumpMem
5481  * @tc.type: FUNC
5482  * @tc.require:
5483  */
5484 HWTEST_F(RSMainThreadTest, DumpMem001, TestSize.Level2)
5485 {
5486     auto mainThread = RSMainThread::Instance();
5487     ASSERT_NE(mainThread, nullptr);
5488     mainThread->isUniRender_ = true;
5489     std::unordered_set<std::u16string> argSets;
5490     std::string dumpString;
5491     std::string type = "";
5492     pid_t pid = 0;
5493     mainThread->DumpMem(argSets, dumpString, type, pid);
5494     ASSERT_TRUE(dumpString.find("dumpMem") != std::string::npos);
5495 }
5496 
5497 /**
5498  * @tc.name: DumpMem002
5499  * @tc.desc: test DumpMem
5500  * @tc.type: FUNC
5501  * @tc.require:
5502  */
5503 HWTEST_F(RSMainThreadTest, DumpMem002, TestSize.Level2)
5504 {
5505     auto mainThread = RSMainThread::Instance();
5506     ASSERT_NE(mainThread, nullptr);
5507     mainThread->isUniRender_ = true;
5508     std::unordered_set<std::u16string> argSets;
5509     std::string dumpString;
5510     std::string type = "gpu";
5511     pid_t pid = 0;
5512     mainThread->DumpMem(argSets, dumpString, type, pid);
5513     ASSERT_TRUE(dumpString.find("dumpMem") != std::string::npos);
5514 }
5515 
5516 /**
5517  * @tc.name: CountMem
5518  * @tc.desc: test CountMem
5519  * @tc.type: FUNC
5520  * @tc.require: issueIB5RAM
5521  */
5522 HWTEST_F(RSMainThreadTest, CountMem, TestSize.Level2)
5523 {
5524     auto mainThread = RSMainThread::Instance();
5525     ASSERT_NE(mainThread, nullptr);
5526     ASSERT_NE(mainThread->context_, nullptr);
5527     auto context = mainThread->context_;
5528     mainThread->context_ = nullptr;
5529     std::vector<MemoryGraphic> memoryGraphic;
5530 
5531     mainThread->CountMem(memoryGraphic);
5532     mainThread->context_ = context;
5533 }
5534 
5535 /**
5536  * @tc.name: UpdateSubSurfaceCnt001
5537  * @tc.desc: test UpdateSubSurfaceCnt when info empty
5538  * @tc.type: FUNC
5539  * @tc.require: issueIBBUDG
5540  */
5541 HWTEST_F(RSMainThreadTest, UpdateSubSurfaceCnt001, TestSize.Level2)
5542 {
5543     auto mainThread = RSMainThread::Instance();
5544     ASSERT_NE(mainThread, nullptr);
5545     mainThread->UpdateSubSurfaceCnt();
5546 }
5547 
5548 /**
5549  * @tc.name: UpdateSubSurfaceCnt002
5550  * @tc.desc: test UpdateSubSurfaceCnt when addChild
5551  * @tc.type: FUNC
5552  * @tc.require: issueIBBUDG
5553  */
5554 HWTEST_F(RSMainThreadTest, UpdateSubSurfaceCnt002, TestSize.Level2)
5555 {
5556     auto mainThread = RSMainThread::Instance();
5557     ASSERT_NE(mainThread, nullptr);
5558     auto context = mainThread->context_;
5559     ASSERT_NE(context, nullptr);
5560     const int cnt = 0;
5561     const int id = 100;
5562     auto rootNode = std::make_shared<RSRenderNode>(id, context);
5563 
5564     auto leashNode = std::make_shared<RSSurfaceRenderNode>(id + 1, context);
5565     leashNode->nodeType_ = RSSurfaceNodeType::LEASH_WINDOW_NODE;
5566     rootNode->AddChild(leashNode);
5567 
5568     auto appNode = std::make_shared<RSSurfaceRenderNode>(id + 2, context);
5569     appNode->nodeType_ = RSSurfaceNodeType::APP_WINDOW_NODE;
5570     leashNode->AddChild(appNode);
5571 
5572     context->nodeMap.RegisterRenderNode(rootNode);
5573     context->nodeMap.RegisterRenderNode(leashNode);
5574     context->nodeMap.RegisterRenderNode(appNode);
5575 
5576     mainThread->UpdateSubSurfaceCnt();
5577     // cnt + 2: rootNode contain 2 subSurfaceNodes(leash and app)
5578     ASSERT_EQ(rootNode->subSurfaceCnt_, cnt + 2);
5579 }
5580 
5581 /**
5582  * @tc.name: UpdateSubSurfaceCnt003
5583  * @tc.desc: test UpdateSubSurfaceCnt when removeChild
5584  * @tc.type: FUNC
5585  * @tc.require: issueIBBUDG
5586  */
5587 HWTEST_F(RSMainThreadTest, UpdateSubSurfaceCnt003, TestSize.Level2)
5588 {
5589     auto mainThread = RSMainThread::Instance();
5590     ASSERT_NE(mainThread, nullptr);
5591     auto context = mainThread->context_;
5592     ASSERT_NE(context, nullptr);
5593     const int cnt = 0;
5594     const int id = 100;
5595     auto rootNode = std::make_shared<RSRenderNode>(id, context);
5596 
5597     auto leashNode = std::make_shared<RSSurfaceRenderNode>(id + 1, context);
5598     leashNode->nodeType_ = RSSurfaceNodeType::LEASH_WINDOW_NODE;
5599     rootNode->AddChild(leashNode);
5600 
5601     auto appNode = std::make_shared<RSSurfaceRenderNode>(id + 2, context);
5602     appNode->nodeType_ = RSSurfaceNodeType::APP_WINDOW_NODE;
5603     leashNode->AddChild(appNode);
5604 
5605     leashNode->RemoveChild(appNode);
5606     rootNode->RemoveChild(leashNode);
5607 
5608     context->nodeMap.RegisterRenderNode(rootNode);
5609     context->nodeMap.RegisterRenderNode(leashNode);
5610     context->nodeMap.RegisterRenderNode(appNode);
5611 
5612     mainThread->UpdateSubSurfaceCnt();
5613     ASSERT_EQ(rootNode->subSurfaceCnt_, cnt);
5614 }
5615 
5616 /**
5617  * @tc.name: ClearMemoryCache
5618  * @tc.desc: test ClearMemoryCache
5619  * @tc.type: FUNC
5620  * @tc.require: issueIB8HAQ
5621  */
5622 HWTEST_F(RSMainThreadTest, ClearMemoryCache, TestSize.Level2)
5623 {
5624     auto mainThread = RSMainThread::Instance();
5625     ASSERT_NE(mainThread, nullptr);
5626 
5627     mainThread->ClearMemoryCache(PROCESS_EXIT, true, -1);
5628 }
5629 
5630 /**
5631  * @tc.name: DoDirectComposition
5632  * @tc.desc: Test DoDirectComposition
5633  * @tc.type: FUNC
5634  * @tc.require: issueIB8HAQ
5635  */
5636 HWTEST_F(RSMainThreadTest, DoDirectComposition001, TestSize.Level1)
5637 {
5638     auto mainThread = RSMainThread::Instance();
5639     ASSERT_NE(mainThread, nullptr);
5640     NodeId rootId = 0;
5641     auto rootNode = std::make_shared<RSBaseRenderNode>(rootId);
5642     NodeId displayId = 1;
5643     auto rsContext = std::make_shared<RSContext>();
5644     auto displayNode = std::make_shared<RSScreenRenderNode>(displayId, 0, rsContext->weak_from_this());
5645     rootNode->AddChild(displayNode);
5646     rootNode->GenerateFullChildrenList();
5647 
5648     bool doDirectComposition = mainThread->DoDirectComposition(rootNode, false);
5649     ASSERT_FALSE(doDirectComposition);
5650 }
5651 
5652 /**
5653  * @tc.name: DoDirectComposition
5654  * @tc.desc: Test DoDirectComposition
5655  * @tc.type: FUNC
5656  * @tc.require: issueIB8HAQ
5657  */
5658 HWTEST_F(RSMainThreadTest, DoDirectComposition002, TestSize.Level1)
5659 {
5660     auto mainThread = RSMainThread::Instance();
5661     ASSERT_NE(mainThread, nullptr);
5662     NodeId rootId = 0;
5663     auto rootNode = std::make_shared<RSBaseRenderNode>(rootId);
5664     NodeId displayId = 1;
5665     auto rsContext = std::make_shared<RSContext>();
5666     auto displayNode = std::make_shared<RSScreenRenderNode>(displayId, 0, rsContext->weak_from_this());
5667     rootNode->AddChild(displayNode);
5668     rootNode->GenerateFullChildrenList();
5669     auto childNode = RSRenderNode::ReinterpretCast<RSScreenRenderNode>(rootNode->GetChildren()->front());
5670     childNode->SetCompositeType(CompositeType::UNI_RENDER_COMPOSITE);
5671 
5672     bool doDirectComposition = mainThread->DoDirectComposition(rootNode, false);
5673     ASSERT_FALSE(doDirectComposition);
5674 }
5675 
5676 /**
5677  * @tc.name: MultiDisplayChangeTest
5678  * @tc.desc: test MultiDisplayChangeTest
5679  * @tc.type: FUNC
5680  * @tc.require: issueIBF9OU
5681  */
5682 HWTEST_F(RSMainThreadTest, MultiDisplayChangeTest, TestSize.Level2)
5683 {
5684     auto mainThread = RSMainThread::Instance();
5685     ASSERT_NE(mainThread, nullptr);
5686     mainThread->isMultiDisplayPre_ = false;
5687     auto getMultiDisplayStatus = mainThread->GetMultiDisplayStatus();
5688     EXPECT_FALSE(getMultiDisplayStatus);
5689     mainThread->isMultiDisplayChange_ = false;
5690     EXPECT_FALSE(mainThread->GetMultiDisplayChange());
5691     mainThread->MultiDisplayChange(getMultiDisplayStatus);
5692 }
5693 
5694 /**
5695  * @tc.name: RegisterScreenNodeListenerTest
5696  * @tc.desc: test RegisterScreenNodeListenerTest
5697  * @tc.type: FUNC
5698  * @tc.require: issueIBF9OU
5699  */
5700 HWTEST_F(RSMainThreadTest, RegisterScreenNodeListenerTest, TestSize.Level2)
5701 {
5702     auto mainThread = RSMainThread::Instance();
5703     ASSERT_NE(mainThread, nullptr);
5704 
5705     mainThread->RegisterScreenNodeListener();
5706     auto screenManagerPtr = impl::RSScreenManager::GetInstance();
5707     auto* screenManager = static_cast<impl::RSScreenManager*>(screenManagerPtr.GetRefPtr());
5708     EXPECT_NE(screenManager->screenNodeListener_, nullptr);
5709 
5710     screenManager->screens_.insert(std::make_pair(100, nullptr));
5711     mainThread->RegisterScreenNodeListener();
5712 
5713     screenManager->NotifyScreenNodeChange(0, true);
5714     screenManager->NotifyScreenNodeChange(0, false);
5715 }
5716 
5717 /**
5718  * @tc.name: OnScreenConnectTest
5719  * @tc.desc: test OnScreenDisConnect
5720  * @tc.type: FUNC
5721  * @tc.require: issueIBF9OU
5722  */
5723 HWTEST_F(RSMainThreadTest, OnScreenConnectTest, TestSize.Level2)
5724 {
5725     auto mainThread1 = RSMainThread::Instance();
5726     ASSERT_NE(mainThread1, nullptr);
5727 
5728     bool backUpState = mainThread1->isRunning_;
5729     mainThread1->isRunning_ = false;
5730     RSDisplayNodeConfig config;
5731     NodeId displayNodeId1 = 1;
5732     auto displayNode1 = std::make_shared<RSLogicalDisplayRenderNode>(displayNodeId1, config);
5733     uint64_t screenId = 1;
5734     displayNode1->SetScreenId(screenId);
5735     displayNode1->waitToSetOnTree_ = true;
5736     mainThread1->context_->nodeMap.logicalDisplayNodeMap_.insert({displayNodeId1, displayNode1});
5737 
5738     NodeId displayNodeId2 = 2;
5739     auto displayNode2 = std::make_shared<RSLogicalDisplayRenderNode>(displayNodeId2, config);
5740     mainThread1->context_->nodeMap.logicalDisplayNodeMap_.insert({displayNodeId2, displayNode2});
5741 
5742     auto screenManagerPtr = impl::RSScreenManager::GetInstance();
5743     auto* screenManager = static_cast<impl::RSScreenManager*>(screenManagerPtr.GetRefPtr());
5744     screenManager->screenNodeListener_->OnScreenConnect(1);
5745     mainThread1->isRunning_ = backUpState;
5746 }
5747 
5748 /**
5749  * @tc.name: OnScreenDisconnectTest
5750  * @tc.desc: test OnScreenDisconnectTest
5751  * @tc.type: FUNC
5752  * @tc.require: issueIBF9OU
5753  */
5754 HWTEST_F(RSMainThreadTest, OnScreenDisconnectTest, TestSize.Level2)
5755 {
5756     auto mainThread = RSMainThread::Instance();
5757     ASSERT_NE(mainThread, nullptr);
5758 
5759     auto screenManagerPtr = impl::RSScreenManager::GetInstance();
5760     auto* screenManager = static_cast<impl::RSScreenManager*>(screenManagerPtr.GetRefPtr());
5761     screenManager->screenNodeListener_->OnScreenDisconnect(0);
5762 }
5763 /**
5764  * @tc.name: IsFastComposeVsyncTimeSync001
5765  * @tc.desc: test IsFastComposeVsyncTimeSync input value error condition
5766  * @tc.type: FUNC
5767  * @tc.require: issueICGGHY
5768  */
5769 HWTEST_F(RSMainThreadTest, IsFastComposeVsyncTimeSync001, TestSize.Level1)
5770 {
5771 #ifdef RS_ENABLE_UNI_RENDER
5772     auto mainThread = RSMainThread::Instance();
5773     ASSERT_NE(mainThread, nullptr);
5774     uint64_t unsignedVsyncPeriod = 0;
5775     bool nextVsyncRequested = false;
5776     uint64_t unsignedNowTime = 1000;
5777     uint64_t lastVsyncTime = 500;
5778     int64_t vsyncTimeStamp = -100;
5779     uint64_t timestamp = mainThread->timestamp_;
5780     bool result = mainThread->IsFastComposeVsyncTimeSync(unsignedVsyncPeriod, nextVsyncRequested,
5781         unsignedNowTime, lastVsyncTime, vsyncTimeStamp);
5782     ASSERT_EQ(result, false);
5783     unsignedVsyncPeriod = 16666666;
5784     result = mainThread->IsFastComposeVsyncTimeSync(unsignedVsyncPeriod, nextVsyncRequested,
5785         unsignedNowTime, lastVsyncTime, vsyncTimeStamp);
5786     ASSERT_EQ(result, false);
5787     vsyncTimeStamp = 16666666;
5788     mainThread->timestamp_ = 1000;
5789     result = mainThread->IsFastComposeVsyncTimeSync(unsignedVsyncPeriod, nextVsyncRequested,
5790         unsignedNowTime, lastVsyncTime, vsyncTimeStamp);
5791     ASSERT_EQ(result, false);
5792     mainThread->timestamp_ = 15666666;
5793     result = mainThread->IsFastComposeVsyncTimeSync(unsignedVsyncPeriod, nextVsyncRequested,
5794         unsignedNowTime, lastVsyncTime, vsyncTimeStamp);
5795     mainThread->timestamp_ = 17666666;
5796     result = mainThread->IsFastComposeVsyncTimeSync(unsignedVsyncPeriod, nextVsyncRequested,
5797         unsignedNowTime, lastVsyncTime, vsyncTimeStamp);
5798     ASSERT_EQ(result, true);
5799     nextVsyncRequested = true;
5800     result = mainThread->IsFastComposeVsyncTimeSync(unsignedVsyncPeriod, nextVsyncRequested,
5801         unsignedNowTime, lastVsyncTime, vsyncTimeStamp);
5802     ASSERT_EQ(result, true);
5803     mainThread->timestamp_ = timestamp;
5804 #endif
5805 }
5806 
5807 /**
5808  * @tc.name: IsFastComposeVsyncTimeSync002
5809  * @tc.desc: test IsFastComposeVsyncTimeSync at time near vsync time or not condition
5810  * @tc.type: FUNC
5811  * @tc.require: issueICGGHY
5812  */
5813 HWTEST_F(RSMainThreadTest, IsFastComposeVsyncTimeSync002, TestSize.Level1)
5814 {
5815 #ifdef RS_ENABLE_UNI_RENDER
5816     auto mainThread = RSMainThread::Instance();
5817     ASSERT_NE(mainThread, nullptr);
5818     uint64_t unsignedVsyncPeriod = 0;
5819     bool nextVsyncRequested = false;
5820     uint64_t unsignedNowTime = 1000;
5821     uint64_t lastVsyncTime = 500;
5822     int64_t vsyncTimeStamp = 16666666;
5823     uint64_t timestamp = mainThread->timestamp_;
5824     mainThread->timestamp_ = 16666666;
5825     bool result = mainThread->IsFastComposeVsyncTimeSync(unsignedVsyncPeriod, nextVsyncRequested,
5826         unsignedNowTime, lastVsyncTime, vsyncTimeStamp);
5827     ASSERT_EQ(result, true);
5828     unsignedNowTime = 1000;
5829     result = mainThread->IsFastComposeVsyncTimeSync(unsignedVsyncPeriod, nextVsyncRequested,
5830         unsignedNowTime, lastVsyncTime, vsyncTimeStamp);
5831     ASSERT_EQ(result, true);
5832     nextVsyncRequested = true;
5833     result = mainThread->IsFastComposeVsyncTimeSync(unsignedVsyncPeriod, nextVsyncRequested,
5834         unsignedNowTime, lastVsyncTime, vsyncTimeStamp);
5835     ASSERT_EQ(result, true);
5836     mainThread->timestamp_ = timestamp;
5837 #endif
5838 }
5839 
5840 /**
5841  * @tc.name: CheckFastCompose
5842  * @tc.desc: test CheckFastCompose
5843  * @tc.type: FUNC
5844  * @tc.require: issueIBGV2W
5845  */
5846 HWTEST_F(RSMainThreadTest, CheckFastCompose001, TestSize.Level1)
5847 {
5848     auto mainThread = RSMainThread::Instance();
5849     ASSERT_NE(mainThread, nullptr);
5850     auto receiver = mainThread->receiver_;
5851     if (mainThread->rsVSyncDistributor_ == nullptr) {
5852         auto vsyncGenerator = CreateVSyncGenerator();
5853         auto vsyncController = new VSyncController(vsyncGenerator, 0);
5854         mainThread->rsVSyncDistributor_ = new VSyncDistributor(vsyncController, "rs");
5855     }
5856     sptr<VSyncConnection> conn = new VSyncConnection(mainThread->rsVSyncDistributor_, "rs");
5857     mainThread->receiver_ = nullptr;
5858     mainThread->CheckFastCompose(0);
5859     mainThread->receiver_ = std::make_shared<VSyncReceiver>(conn);
5860     mainThread->lastFastComposeTimeStamp_ = 0;
5861     mainThread->CheckFastCompose(mainThread->timestamp_ - 1);
5862     mainThread->lastFastComposeTimeStamp_ = mainThread->timestamp_;
5863     mainThread->CheckFastCompose(mainThread->timestamp_ - 1);
5864     ASSERT_NE(mainThread->requestNextVsyncNum_.load(), 0);
5865     mainThread->receiver_ = receiver;
5866 }
5867 
5868 /**
5869  * @tc.name: CheckFastCompose
5870  * @tc.desc: test CheckFastCompose
5871  * @tc.type: FUNC
5872  * @tc.require: issueICGGHY
5873  */
5874 HWTEST_F(RSMainThreadTest, CheckFastCompose002, TestSize.Level1)
5875 {
5876     auto mainThread = RSMainThread::Instance();
5877     ASSERT_NE(mainThread, nullptr);
5878     uint64_t timestamp = mainThread->timestamp_;
5879     mainThread->timestamp_ = mainThread->timestamp_ - 16666666;
5880     mainThread->CheckFastCompose(mainThread->timestamp_ - 1);
5881     ASSERT_NE(mainThread->requestNextVsyncNum_.load(), 0);
5882     mainThread->timestamp_ = timestamp;
5883 }
5884 
5885 /**
5886  * @tc.name: InitVulkanErrorCallback001Test
5887  * @tc.desc: test InitVulkanErrorCallback001Test
5888  * @tc.type: FUNC
5889  * @tc.require: issueIBOLWU
5890  */
5891 HWTEST_F(RSMainThreadTest, InitVulkanErrorCallback001, TestSize.Level1)
5892 {
5893     auto mainThread = RSMainThread::Instance();
5894     ASSERT_NE(mainThread, nullptr);
5895     Drawing::GPUContext gpuContext;
5896     mainThread->InitVulkanErrorCallback(&gpuContext);
5897 }
5898 
5899 /**
5900  * @tc.name: RenderServiceAllSurafceDump01
5901  * @tc.desc: RenderServiceAllSurafceDump Test
5902  * @tc.type: FUNC
5903  * @tc.require: issueIB57QP
5904  */
5905 HWTEST_F(RSMainThreadTest, RenderServiceAllSurafceDump01, TestSize.Level1)
5906 {
5907     auto mainThread = RSMainThread::Instance();
5908     ASSERT_NE(mainThread, nullptr);
5909     //prepare nodemap
5910     RSSurfaceRenderNodeConfig config;
5911     config.id = 1;
5912     auto node1 = std::make_shared<RSSurfaceRenderNode>(config);
5913     node1->SetIsOnTheTree(true);
5914     config.id = 2;
5915     auto node2 = std::make_shared<RSSurfaceRenderNode>(config);
5916     node2->SetIsOnTheTree(true);
5917     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node1);
5918     mainThread->context_->GetMutableNodeMap().RegisterRenderNode(node2);
5919 
5920     DfxString log;
5921     mainThread->RenderServiceAllSurafceDump(log);
5922 }
5923 
5924 /**
5925  * @tc.name: ExistBufferIsVisibleAndUpdateTest
5926  * @tc.desc: RenderServiceAllSurafceDump Test
5927  * @tc.type: FUNC
5928  * @tc.require: issueIC0AQO
5929  */
5930 HWTEST_F(RSMainThreadTest, ExistBufferIsVisibleAndUpdateTest, TestSize.Level1)
5931 {
5932     auto mainThread = RSMainThread::Instance();
5933     ASSERT_NE(mainThread, nullptr);
5934     EXPECT_FALSE(mainThread->ExistBufferIsVisibleAndUpdate());
5935     std::vector<std::shared_ptr<RSSurfaceRenderNode>> hardwareEnabledNodes;
5936     NodeId id = 0;
5937     auto surfaceNode = std::make_shared<RSSurfaceRenderNode>(id, mainThread->context_);
5938     sptr<SurfaceBuffer> preBuffer = SurfaceBuffer::Create();
5939     sptr<SyncFence> acquireFence = SyncFence::InvalidFence();
5940     Rect damageRect = {0, 0, 0, 0};
5941     int64_t timestamp = 0;
5942     ASSERT_NE(surfaceNode->surfaceHandler_, nullptr);
5943     surfaceNode->surfaceHandler_->SetBuffer(preBuffer, acquireFence, damageRect, timestamp);
5944     surfaceNode->surfaceHandler_->isCurrentFrameBufferConsumed_ = true;
5945     surfaceNode->HwcSurfaceRecorder().SetLastFrameHasVisibleRegion(true);
5946     hardwareEnabledNodes.push_back(surfaceNode);
5947     mainThread->hardwareEnabledNodes_ = hardwareEnabledNodes;
5948     EXPECT_TRUE(mainThread->ExistBufferIsVisibleAndUpdate());
5949 }
5950 
5951 /**
5952  * @tc.name: GetForceCommitReasonTest
5953  * @tc.desc: GetForceCommitReasonTest
5954  * @tc.type: FUNC
5955  * @tc.require: issueIC0AQO
5956  */
5957 HWTEST_F(RSMainThreadTest, GetForceCommitReasonTest, TestSize.Level1)
5958 {
5959     auto mainThread = RSMainThread::Instance();
5960     ASSERT_NE(mainThread, nullptr);
5961     mainThread->isHardwareEnabledBufferUpdated_ = false;
5962     mainThread->forceUpdateUniRenderFlag_ = false;
5963     EXPECT_EQ(mainThread->GetForceCommitReason(), 0);
5964     uint32_t forceCommitReason = 0;
5965     forceCommitReason |= ForceCommitReason::FORCED_BY_HWC_UPDATE;
5966     mainThread->isHardwareEnabledBufferUpdated_ = true;
5967     EXPECT_EQ(mainThread->GetForceCommitReason(), forceCommitReason);
5968     mainThread->forceUpdateUniRenderFlag_ = true;
5969     forceCommitReason |= ForceCommitReason::FORCED_BY_UNI_RENDER_FLAG;
5970     EXPECT_EQ(mainThread->GetForceCommitReason(), forceCommitReason);
5971 }
5972 
5973 /**
5974  * @tc.name: HandleTunnelLayerId001
5975  * @tc.desc: HandleTunnelLayerId001
5976  * @tc.type: FUNC
5977  * @tc.require:
5978  */
5979 HWTEST_F(RSMainThreadTest, HandleTunnelLayerId001, TestSize.Level1)
5980 {
5981     auto mainThread = RSMainThread::Instance();
5982     ASSERT_NE(mainThread, nullptr);
5983 
5984     auto surfaceNode = std::make_shared<RSSurfaceRenderNode>(0, mainThread->context_);
5985     auto surfaceHandler = surfaceNode->surfaceHandler_;
5986 
5987     mainThread->HandleTunnelLayerId(surfaceHandler, surfaceNode);
5988     EXPECT_EQ(surfaceNode->GetTunnelLayerId(), 0);
5989 }
5990 
5991 /**
5992  * @tc.name: HandleTunnelLayerId002
5993  * @tc.desc: HandleTunnelLayerId002
5994  * @tc.type: FUNC
5995  * @tc.require:
5996  */
5997 HWTEST_F(RSMainThreadTest, HandleTunnelLayerId002, TestSize.Level1)
5998 {
5999     auto mainThread = RSMainThread::Instance();
6000     ASSERT_NE(mainThread, nullptr);
6001 
6002     auto surfaceNode = std::make_shared<RSSurfaceRenderNode>(0, mainThread->context_);
6003     auto surfaceHandler = surfaceNode->surfaceHandler_;
6004     ASSERT_NE(surfaceHandler, nullptr);
6005     surfaceHandler->consumer_ = nullptr;
6006 
6007     EXPECT_EQ(surfaceHandler->sourceType_, 0);
6008 
6009     mainThread->HandleTunnelLayerId(surfaceHandler, surfaceNode);
6010     EXPECT_EQ(surfaceNode->GetTunnelLayerId(), 0);
6011 }
6012 
6013 /**
6014  * @tc.name: HandleTunnelLayerId003
6015  * @tc.desc: HandleTunnelLayerId003
6016  * @tc.type: FUNC
6017  * @tc.require:
6018  */
6019 HWTEST_F(RSMainThreadTest, HandleTunnelLayerId003, TestSize.Level1)
6020 {
6021 #ifdef RS_ENABLE_UNI_RENDER
6022     auto mainThread = RSMainThread::Instance();
6023     ASSERT_NE(mainThread, nullptr);
6024 
6025     auto surfaceNode = std::make_shared<RSSurfaceRenderNode>(0, mainThread->context_);
6026     auto surfaceHandler = surfaceNode->surfaceHandler_;
6027     ASSERT_NE(surfaceHandler, nullptr);
6028     auto consumer = surfaceHandler->GetConsumer();
6029     ASSERT_NE(consumer, nullptr);
6030 
6031     EXPECT_EQ(surfaceHandler->sourceType_, 0);
6032 
6033     mainThread->HandleTunnelLayerId(surfaceHandler, surfaceNode);
6034     EXPECT_EQ(surfaceNode->GetTunnelLayerId(), 0);
6035 #endif
6036 }
6037 
6038 /**
6039  * @tc.name: HandleTunnelLayerId004
6040  * @tc.desc: HandleTunnelLayerId004
6041  * @tc.type: FUNC
6042  * @tc.require:
6043  */
6044 HWTEST_F(RSMainThreadTest, HandleTunnelLayerId004, TestSize.Level1)
6045 {
6046 #ifdef RS_ENABLE_UNI_RENDER
6047     auto mainThread = RSMainThread::Instance();
6048     ASSERT_NE(mainThread, nullptr);
6049 
6050     auto surfaceNode = std::make_shared<RSSurfaceRenderNode>(0, mainThread->context_);
6051     auto surfaceHandler = surfaceNode->surfaceHandler_;
6052     ASSERT_NE(surfaceHandler, nullptr);
6053     auto consumer = surfaceHandler->GetConsumer();
6054     ASSERT_NE(consumer, nullptr);
6055 
6056     EXPECT_EQ(surfaceHandler->sourceType_, 0);
6057 
6058     surfaceHandler->sourceType_ = 5;
6059     EXPECT_EQ(surfaceHandler->GetSourceType(), 5);
6060     mainThread->HandleTunnelLayerId(surfaceHandler, surfaceNode);
6061 #endif
6062 }
6063 
6064 /**
6065  * @tc.name: DoDirectComposition003
6066  * @tc.desc: Test DoDirectComposition
6067  * @tc.type: FUNC
6068  * @tc.require: icc3sm
6069  */
6070 HWTEST_F(RSMainThreadTest, DoDirectComposition003, TestSize.Level1)
6071 {
6072 #ifdef RS_ENABLE_UNI_RENDER
6073     auto mainThread = RSMainThread::Instance();
6074     ASSERT_NE(mainThread, nullptr);
6075     NodeId rootId = 0;
6076     auto rootNode = std::make_shared<RSBaseRenderNode>(rootId);
6077     ASSERT_NE(rootNode, nullptr);
6078     auto displayNode = GetAndInitScreenRenderNode();
6079     ASSERT_NE(displayNode, nullptr);
6080     auto otherNode = std::make_shared<RSRenderNode>(2);
6081     displayNode->renderDrawable_ = std::make_shared<DrawableV2::RSRenderNodeDrawable>(otherNode);
6082 
6083     auto drawable = DrawableV2::RSScreenRenderNodeDrawable::OnGenerate(otherNode);
6084     auto displayDrawable = static_cast<DrawableV2::RSScreenRenderNodeDrawable*>(drawable);
6085     ASSERT_NE(displayDrawable, nullptr);
6086     ASSERT_NE(displayDrawable->surfaceHandler_, nullptr);
6087     displayDrawable->surfaceHandler_->buffer_.buffer = SurfaceBuffer::Create();
6088     auto handle = new BufferHandle();
6089     handle->usage = BUFFER_USAGE_CPU_READ;
6090     displayDrawable->surfaceHandler_->buffer_.buffer->SetBufferHandle(handle);
6091     displayNode->renderDrawable_.reset(displayDrawable);
6092 
6093     rootNode->AddChild(displayNode);
6094     rootNode->GenerateFullChildrenList();
6095     auto childNode = RSRenderNode::ReinterpretCast<RSScreenRenderNode>(rootNode->GetChildren()->front());
6096     childNode->SetCompositeType(CompositeType::UNI_RENDER_COMPOSITE);
6097     auto type = system::GetParameter("persist.sys.graphic.anco.disableHebc", "-1");
6098     system::SetParameter("persist.sys.graphic.anco.disableHebc", "1");
6099     RSSurfaceRenderNode::SetAncoForceDoDirect(true);
6100     ASSERT_FALSE(mainThread->DoDirectComposition(rootNode, false));
6101 
6102     std::vector<std::shared_ptr<RSSurfaceRenderNode>> hardwareEnabledNodes = mainThread->hardwareEnabledNodes_;
6103     ChangeHardwareEnabledNodesBufferData(hardwareEnabledNodes);
6104 
6105     NodeId displayId2 = 2;
6106     auto context = std::make_shared<RSContext>();
6107     auto displayNode2 = std::make_shared<RSScreenRenderNode>(displayId2, 0, context);
6108     rootNode->AddChild(displayNode2);
6109     rootNode->GenerateFullChildrenList();
6110 
6111     ASSERT_FALSE(mainThread->DoDirectComposition(rootNode, false));
6112     system::SetParameter("persist.sys.graphic.anco.disableHebc", type);
6113     delete handle;
6114 #endif
6115 }
6116 
6117 /**
6118  * @tc.name: InitHgmTaskHandleThreadTest
6119  * @tc.desc: InitHgmTaskHandleThreadTest
6120  * @tc.type: FUNC
6121  * @tc.require: issueIBZ6NM
6122  */
6123 HWTEST_F(RSMainThreadTest, InitHgmTaskHandleThreadTest, TestSize.Level1)
6124 {
6125     auto mainThread = RSMainThread::Instance();
6126     std::shared_ptr<AppExecFwk::EventRunner> runner = mainThread->runner_;
6127     std::shared_ptr<AppExecFwk::EventHandler> handler = mainThread->handler_;
6128     mainThread->runner_ = AppExecFwk::EventRunner::Create("RSMainThread");
6129     mainThread->handler_ = std::make_shared<AppExecFwk::EventHandler>(mainThread->runner_);
6130     mainThread->hgmContext_.InitHgmTaskHandleThread(mainThread->rsVSyncController_, mainThread->appVSyncController_,
6131         mainThread->vsyncGenerator_, mainThread->appVSyncDistributor_);
6132     ASSERT_EQ(mainThread->forceUpdateUniRenderFlag_, true);
6133     mainThread->hgmContext_.ProcessHgmFrameRate(0, mainThread->rsVSyncDistributor_, mainThread->vsyncId_);
6134 
6135     ASSERT_EQ(mainThread->hgmContext_.FrameRateGetFunc(static_cast<RSPropertyUnit>(0xff), 0.f, 0, 0), 0);
6136     auto frameRateMgr = HgmCore::Instance().GetFrameRateMgr();
6137     ASSERT_NE(frameRateMgr, nullptr);
6138     HgmCore::Instance().hgmFrameRateMgr_ = nullptr;
6139     ASSERT_EQ(HgmCore::Instance().GetFrameRateMgr(), nullptr);
6140     ASSERT_EQ(mainThread->hgmContext_.FrameRateGetFunc(RSPropertyUnit::PIXEL_POSITION, 0.f, 0, 0), 0);
6141     HgmCore::Instance().hgmFrameRateMgr_ = frameRateMgr;
6142     ASSERT_NE(HgmCore::Instance().GetFrameRateMgr(), nullptr);
6143 
6144     if (frameRateMgr != nullptr && frameRateMgr->forceUpdateCallback_) {
6145         mainThread->hgmContext_.currVsyncId_ = mainThread->hgmContext_.currVsyncId_ + 100;
6146         EXPECT_NE(mainThread->hgmContext_.lastForceUpdateVsyncId_, mainThread->hgmContext_.currVsyncId_);
6147         frameRateMgr->forceUpdateCallback_(false, true);
6148         usleep(100000);
6149         EXPECT_EQ(mainThread->hgmContext_.lastForceUpdateVsyncId_, mainThread->hgmContext_.currVsyncId_);
6150         frameRateMgr->forceUpdateCallback_(false, true);
6151         usleep(100000);
6152         EXPECT_EQ(mainThread->hgmContext_.lastForceUpdateVsyncId_, mainThread->hgmContext_.currVsyncId_);
6153     }
6154     usleep(200000);
6155     mainThread->runner_ = runner;
6156     mainThread->handler_ = handler;
6157     runner = nullptr;
6158     handler = nullptr;
6159     usleep(200000);
6160 }
6161 
6162 /**
6163  * @tc.name: DoDirectComposition004
6164  * @tc.desc: Test DoDirectComposition For HwcNodes
6165  * @tc.type: FUNC
6166  * @tc.require:
6167  */
6168 HWTEST_F(RSMainThreadTest, DoDirectComposition004_BufferSync, TestSize.Level1)
6169 {
6170 #ifdef RS_ENABLE_UNI_RENDER
6171     // INIT SCREEN
6172     auto screenManager = CreateOrGetScreenManager();
6173     ASSERT_NE(screenManager, nullptr);
6174     auto rsScreen = std::make_shared<impl::RSScreen>(5, false, HdiOutput::CreateHdiOutput(5), nullptr);
6175     ASSERT_NE(rsScreen, nullptr);
6176     screenManager->MockHdiScreenConnected(rsScreen);
6177 
6178     // INIT DISPLAY
6179     auto mainThread = RSMainThread::Instance();
6180     ASSERT_NE(mainThread, nullptr);
6181     NodeId rootId = 0;
6182     auto rootNode = std::make_shared<RSBaseRenderNode>(rootId);
6183     NodeId displayId = 1;
6184     RSDisplayNodeConfig config;
6185     config.screenId = 5; // screeId is 5 for test
6186 
6187     // INIT CHILDLIST
6188     auto rsContext = std::make_shared<RSContext>();
6189     auto displayNode = std::make_shared<RSScreenRenderNode>(displayId, config.screenId, rsContext->weak_from_this());
6190 
6191     auto displayNode2 = std::make_shared<RSScreenRenderNode>(displayId, 2, rsContext->weak_from_this());
6192 
6193     rootNode->AddChild(displayNode);
6194     rootNode->AddChild(displayNode2);
6195     rootNode->GenerateFullChildrenList();
6196     auto childNode = RSRenderNode::ReinterpretCast<RSScreenRenderNode>(rootNode->GetChildren()->front());
6197     childNode->SetCompositeType(CompositeType::UNI_RENDER_COMPOSITE);
6198 
6199     // INIT NodeList
6200     auto surfaceNode = std::make_shared<RSSurfaceRenderNode>(config.screenId, mainThread->context_);
6201     surfaceNode->InitRenderParams();
6202     ASSERT_NE(surfaceNode, nullptr);
6203     ASSERT_NE(surfaceNode->surfaceHandler_, nullptr);
6204     surfaceNode->SetHardwareForcedDisabledState(false);
6205     surfaceNode->HwcSurfaceRecorder().SetLastFrameHasVisibleRegion(true);
6206     mainThread->hardwareEnabledNodes_.clear();
6207     mainThread->hardwareEnabledNodes_.emplace_back(surfaceNode);
6208 
6209     // true true
6210     mainThread->isUniRender_ = true;
6211     displayNode->HwcDisplayRecorder().hasVisibleHwcNodes_ = true;
6212     surfaceNode->surfaceHandler_->SetCurrentFrameBufferConsumed();
6213     ASSERT_TRUE(mainThread->DoDirectComposition(rootNode, false));
6214 
6215     // true false
6216     displayNode->HwcDisplayRecorder().hasVisibleHwcNodes_ = true;
6217     surfaceNode->surfaceHandler_->ResetCurrentFrameBufferConsumed();
6218     ASSERT_TRUE(mainThread->DoDirectComposition(rootNode, false));
6219 
6220     std::shared_ptr<RSBaseRenderEngine> renderEngine = std::make_shared<RSRenderEngine>();
6221     renderEngine->Init();
6222     mainThread->renderEngine_ = renderEngine;
6223     // false true
6224     displayNode->HwcDisplayRecorder().hasVisibleHwcNodes_ = true;
6225     mainThread->isUniRender_ = false;
6226     surfaceNode->surfaceHandler_->SetCurrentFrameBufferConsumed();
6227     ASSERT_TRUE(mainThread->DoDirectComposition(rootNode, false));
6228 
6229     // false false
6230     displayNode->HwcDisplayRecorder().hasVisibleHwcNodes_ = true;
6231     mainThread->isUniRender_ = false;
6232     surfaceNode->surfaceHandler_->ResetCurrentFrameBufferConsumed();
6233     ASSERT_TRUE(mainThread->DoDirectComposition(rootNode, false));
6234 
6235     // RESET
6236     mainThread->renderEngine_ = nullptr;
6237 #endif
6238 }
6239 
6240 /**
6241  * @tc.name: SetTaskEndWithTime001
6242  * @tc.desc: Test SetTaskEndWithTime
6243  * @tc.type: FUNC
6244  * @tc.require:
6245  */
6246 HWTEST_F(RSMainThreadTest, SetTaskEndWithTime001, TestSize.Level1)
6247 {
6248     auto mainThread = RSMainThread::Instance();
6249     ASSERT_NE(mainThread, nullptr);
6250     auto rsVSyncDistributor = mainThread->rsVSyncDistributor_;
6251     mainThread->SetTaskEndWithTime(0);
6252 }
6253 
6254 /**
6255  * @tc.name: CheckAdaptiveCompose001
6256  * @tc.desc: Test CheckAdaptiveCompose
6257  * @tc.type: FUNC
6258  * @tc.require:
6259  */
6260 HWTEST_F(RSMainThreadTest, CheckAdaptiveCompose001, TestSize.Level1)
6261 {
6262     auto mainThread = RSMainThread::Instance();
6263     ASSERT_NE(mainThread, nullptr);
6264     auto context = mainThread->context_;
6265     mainThread->context_ = nullptr;
6266     ASSERT_FALSE(mainThread->CheckAdaptiveCompose());
6267     //reset
6268     mainThread->context_ = context;
6269 }
6270 
6271 /**
6272  * @tc.name: CheckAdaptiveCompose002
6273  * @tc.desc: Test CheckAdaptiveCompose
6274  * @tc.type: FUNC
6275  * @tc.require:
6276  */
6277 HWTEST_F(RSMainThreadTest, CheckAdaptiveCompose002, TestSize.Level1)
6278 {
6279     auto mainThread = RSMainThread::Instance();
6280     ASSERT_NE(mainThread, nullptr);
6281     auto &hgmCore = HgmCore::Instance();
6282     auto frameRateMgr = hgmCore.GetFrameRateMgr();
6283     if (frameRateMgr != nullptr) {
6284         std::atomic<int32_t> status = frameRateMgr->isAdaptive_.load();
6285         frameRateMgr->isAdaptive_.store(SupportASStatus::NOT_SUPPORT);
6286         ASSERT_FALSE(mainThread->CheckAdaptiveCompose());
6287         frameRateMgr->isAdaptive_.store(SupportASStatus::SUPPORT_AS);
6288         ASSERT_FALSE(mainThread->CheckAdaptiveCompose());
6289         //reset
6290         frameRateMgr->isAdaptive_.store(status.load());
6291     }
6292 }
6293 
6294 /**
6295  * @tc.name: NeedConsumeMultiCommand001
6296  * @tc.desc: NeedConsumeMultiCommand001
6297  * @tc.type: FUNC
6298  * @tc.require:
6299  */
6300 HWTEST_F(RSMainThreadTest, NeedConsumeMultiCommand001, TestSize.Level1)
6301 {
6302     auto mainThread = RSMainThread::Instance();
6303     int32_t dvsyncPid = 100;
6304     auto ret = mainThread->NeedConsumeMultiCommand(dvsyncPid);
6305     ASSERT_EQ(ret, false);
6306 }
6307 
6308 /**
6309  * @tc.name: NeedConsumeDVSyncCommand001
6310  * @tc.desc: NeedConsumeDVSyncCommand001
6311  * @tc.type: FUNC
6312  * @tc.require:
6313  */
6314 HWTEST_F(RSMainThreadTest, NeedConsumeDVSyncCommand001, TestSize.Level1)
6315 {
6316     auto mainThread = RSMainThread::Instance();
6317     if (mainThread->rsVSyncDistributor_ == nullptr) {
6318         auto vsyncGenerator = CreateVSyncGenerator();
6319         auto vsyncController = new VSyncController(vsyncGenerator, 0);
6320         mainThread->rsVSyncDistributor_ = new VSyncDistributor(vsyncController, "rs", {});
6321     }
6322 
6323     std::vector<std::unique_ptr<RSTransactionData>> trans;
6324     uint32_t endIndex = 0;
6325     auto ret = mainThread->NeedConsumeDVSyncCommand(endIndex, trans);
6326     ASSERT_EQ(ret, false);
6327 
6328     std::unique_ptr<RSTransactionData> rsTransactionData1 = std::make_unique<RSTransactionData>();
6329     std::unique_ptr<RSTransactionData> rsTransactionData2 = std::make_unique<RSTransactionData>();
6330     rsTransactionData1->timestamp_ = 100;
6331     rsTransactionData2->timestamp_ = 90;
6332 
6333     trans.push_back(std::move(rsTransactionData1));
6334     trans.push_back(std::move(rsTransactionData2));
6335     ret = mainThread->NeedConsumeDVSyncCommand(endIndex, trans);
6336     ASSERT_EQ(ret, true);
6337     mainThread->rsVSyncDistributor_ = nullptr;
6338 }
6339 
6340 /**
6341  * @tc.name: CheckAndUpdateTransactionIndex001
6342  * @tc.desc: CheckAndUpdateTransactionIndex001
6343  * @tc.type: FUNC
6344  * @tc.require:
6345  */
6346 HWTEST_F(RSMainThreadTest, CheckAndUpdateTransactionIndex001, TestSize.Level1)
6347 {
6348     auto mainThread = RSMainThread::Instance();
6349     auto vsyncGenerator = CreateVSyncGenerator();
6350     auto vsyncController = new VSyncController(vsyncGenerator, 0);
6351     sptr<MockVSyncDistributor> mockVSyncDistributor = new MockVSyncDistributor(vsyncController, "rs", {});
6352     mainThread->rsVSyncDistributor_ = mockVSyncDistributor;
6353     mockVSyncDistributor->needUpdateVsyncTime_ = true;
6354     mockVSyncDistributor->delayTime_ = 0;
6355     mockVSyncDistributor->lastTimeStamp_ = 0;
6356     mainThread->timestamp_ = 100;
6357     mockVSyncDistributor->mockPid_ = 1;
6358 
6359     std::vector<std::unique_ptr<RSTransactionData>> trans;
6360     int32_t pid = 0;
6361     auto ret = mainThread->NeedConsumeMultiCommand(pid);
6362     ASSERT_EQ(ret, true);
6363     std::shared_ptr<TransactionDataMap> dataMap = std::make_shared<TransactionDataMap>();
6364     std::unique_ptr<RSTransactionData> rsTransactionData1 = std::make_unique<RSTransactionData>();
6365     std::unique_ptr<RSTransactionData> rsTransactionData2 = std::make_unique<RSTransactionData>();
6366     rsTransactionData1->timestamp_ = 100;
6367     rsTransactionData2->timestamp_ = 90;
6368     (*dataMap)[1].push_back(std::move(rsTransactionData1));
6369     (*dataMap)[1].push_back(std::move(rsTransactionData2));
6370     std::string transactionFlags;
6371     mainThread->CheckAndUpdateTransactionIndex(dataMap, transactionFlags);
6372     rsTransactionData1 = std::make_unique<RSTransactionData>();
6373     rsTransactionData2 = std::make_unique<RSTransactionData>();
6374     rsTransactionData1->timestamp_ = 100;
6375     rsTransactionData2->timestamp_ = 90;
6376     mockVSyncDistributor->mockPid_ = 1;
6377     (*dataMap)[2].push_back(std::move(rsTransactionData1));
6378     (*dataMap)[2].push_back(std::move(rsTransactionData2));
6379     mainThread->CheckAndUpdateTransactionIndex(dataMap, transactionFlags);
6380     mainThread->DVSyncUpdate(1, 2);
6381     mockVSyncDistributor->lastTimeStamp_ = 1000;
6382     ret = mainThread->NeedConsumeMultiCommand(pid);
6383     ASSERT_EQ(ret, false);
6384     mainThread->rsVSyncDistributor_ = nullptr;
6385 }
6386 
6387 /**
6388  * @tc.name: DoDirectComposition
6389  * @tc.desc: DoDirectComposition when screen frozen
6390  * @tc.type: FUNC
6391  * @tc.require: issueICQ74B
6392  */
6393 HWTEST_F(RSMainThreadTest, DoDirectComposition_Freeze, TestSize.Level1)
6394 {
6395     auto mainThread = RSMainThread::Instance();
6396     ASSERT_NE(mainThread, nullptr);
6397     NodeId rootId = 0;
6398     NodeId screenNodeId = 1;
6399     auto rootNode = std::make_shared<RSBaseRenderNode>(rootId);
6400     ASSERT_NE(rootNode, nullptr);
6401     auto rsContext = std::make_shared<RSContext>();
6402     ASSERT_NE(rsContext, nullptr);
6403     auto screenNode = std::make_shared<RSScreenRenderNode>(screenNodeId, 0, rsContext->weak_from_this());
6404     ASSERT_NE(screenNode, nullptr);
6405     auto childNode = std::make_shared<RSRenderNode>(screenNodeId + 1, true);
6406     screenNode->AddChild(childNode);
6407     screenNode->InitRenderParams();
6408     screenNode->SetCompositeType(CompositeType::UNI_RENDER_COMPOSITE);
6409     screenNode->SetForceFreeze(false);
6410     rootNode->AddChild(screenNode);
6411     rootNode->GenerateFullChildrenList();
6412     auto ret = mainThread->DoDirectComposition(rootNode, false);
6413     ASSERT_FALSE(ret);
6414 
6415     ASSERT_NE(screenNode->stagingRenderParams_, nullptr);
6416     screenNode->SetForceFreeze(true);
6417     ret = mainThread->DoDirectComposition(rootNode, false);
6418     ASSERT_TRUE(ret);
6419 }
6420 
6421 /**
6422  * @tc.name: NotifyPackageEvent001
6423  * @tc.desc: NotifyPackageEvent001
6424  * @tc.type: FUNC
6425  * @tc.require: issueICPQ8S
6426  */
6427 HWTEST_F(RSMainThreadTest, NotifyPackageEvent001, TestSize.Level1)
6428 {
6429     auto mainThread = RSMainThread::Instance();
6430     ASSERT_NE(mainThread, nullptr);
6431     std::vector<std::string> packageList = {};
6432     mainThread->NotifyPackageEvent(packageList);
6433 }
6434 
6435 /**
6436  * @tc.name: SetForceRsDVsync001
6437  * @tc.desc: SetForceRsDVsync001
6438  * @tc.type: FUNC
6439  * @tc.require: issueICPQPM
6440  */
6441 HWTEST_F(RSMainThreadTest, SetForceRsDVsync001, TestSize.Level1)
6442 {
6443     auto mainThread = RSMainThread::Instance();
6444     ASSERT_NE(mainThread, nullptr);
6445     std::string sceneId = "APP_SWIPER_FLING";
6446     if (mainThread->rsVSyncDistributor_ == nullptr) {
6447         auto vsyncGenerator = CreateVSyncGenerator();
6448         auto vsyncController = new VSyncController(vsyncGenerator, 0);
6449         mainThread->rsVSyncDistributor_ = new VSyncDistributor(vsyncController, "rs");
6450     }
6451     mainThread->SetForceRsDVsync(sceneId);
6452 }
6453 
6454 /**
6455  * @tc.name: surfaceNodeWatermarksLimit001
6456  * @tc.desc: Test surfaceNodeWatermarksLimit001
6457  * @tc.type: FUNC
6458  * @tc.require:ICS7WS
6459  */
6460 HWTEST_F(RSMainThreadTest, surfaceNodeWatermarksLimit001, TestSize.Level1)
6461 {
6462     auto mainThread = RSMainThread::Instance();
6463     ASSERT_NE(mainThread, nullptr);
6464     constexpr uint32_t REGISTER_SURFACE_WATER_MASK_LIMIT = 100;
6465     pid_t pid = 100;
6466     // Test normal add waterMask
6467     mainThread->SetWatermark(pid, "watermask", nullptr);
6468     EXPECT_EQ(mainThread->registerSurfaceWaterMaskCount_[pid], 1);
6469     // Test add same waterMask Name
6470     mainThread->SetWatermark(pid, "watermask", nullptr);
6471     EXPECT_EQ(mainThread->registerSurfaceWaterMaskCount_[pid], 1);
6472     // Test Limit condition
6473     mainThread->registerSurfaceWaterMaskCount_[pid] = REGISTER_SURFACE_WATER_MASK_LIMIT;
6474     mainThread->SetWatermark(pid, "watermask1", nullptr);
6475     EXPECT_EQ(mainThread->registerSurfaceWaterMaskCount_[pid], REGISTER_SURFACE_WATER_MASK_LIMIT);
6476     // Test Clear WaterMask
6477     mainThread->ClearWatermark(pid);
6478     EXPECT_EQ(mainThread->registerSurfaceWaterMaskCount_[pid], 0);
6479     // Try again
6480     mainThread->ClearWatermark(pid);
6481     EXPECT_EQ(mainThread->registerSurfaceWaterMaskCount_[pid], 0);
6482 }
6483 
6484 /**
6485  * @tc.name: CreateNodeAndSurfaceTest001
6486  * @tc.desc: Test CreateNodeAndSurfaceTest when surfacenode is self drawing node
6487  * @tc.type: FUNC
6488  * @tc.require: issueICSVLG
6489  */
6490 HWTEST_F(RSMainThreadTest, CreateNodeAndSurfaceTest001, TestSize.Level1)
6491 {
6492     auto mainThread = RSMainThread::Instance();
6493     sptr<RSRenderServiceConnection> connection = new RSRenderServiceConnection(
6494         0, nullptr, mainThread, nullptr, nullptr, nullptr);
6495     RSSurfaceRenderNodeConfig config;
6496     config.id = 1;
6497     config.nodeType = RSSurfaceNodeType::SELF_DRAWING_NODE;
6498     std::vector<int32_t> pidList;
6499     pidList.emplace_back(ExtractPid(config.id));
6500     RSGpuDirtyCollector::GetInstance().SetSelfDrawingGpuDirtyPidList(pidList);
6501     sptr<Surface> surface = nullptr;
6502     auto ret = connection->CreateNodeAndSurface(config, surface, false);
6503     ASSERT_EQ(ret, ERR_OK);
6504 
6505     auto param = system::GetParameter("rosen.graphic.selfdrawingdirtyregion.enabled", "");
6506     system::SetParameter("rosen.graphic.selfdrawingdirtyregion.enabled", "1");
6507     ret = connection->CreateNodeAndSurface(config, surface, false);
6508     ASSERT_EQ(ret, ERR_OK);
6509     system::SetParameter("rosen.graphic.selfdrawingdirtyregion.enabled", param);
6510 }
6511 } // namespace OHOS::Rosen
6512