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