• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <gtest/gtest.h>
17 #include <map>
18 #include "display_manager.h"
19 #include "iremote_object_mocker.h"
20 #include "mock_rs_iwindow_animation_controller.h"
21 #include "remote_animation.h"
22 #include "starting_window.h"
23 #include "window_controller.h"
24 
25 using namespace testing;
26 using namespace testing::ext;
27 
28 namespace OHOS {
29 namespace Rosen {
30 class WindowControllerTest : public testing::Test {
31 public:
32     static void SetUpTestCase();
33     static void TearDownTestCase();
34     void SetUp() override;
35     void TearDown() override;
36 
37     static sptr<WindowController> windowController_;
38     static sptr<WindowRoot> windowRoot_;
39     static sptr<InputWindowMonitor> inputWindowMonitor_;
40     static sptr<WindowNode> node_;
41     static sptr<WindowTransitionInfo> transitionInfo_;
42 };
43 
44 sptr<WindowController> WindowControllerTest::windowController_ = nullptr;
45 sptr<WindowRoot> WindowControllerTest::windowRoot_ = nullptr;
46 sptr<InputWindowMonitor> WindowControllerTest::inputWindowMonitor_ = nullptr;
47 sptr<WindowNode> WindowControllerTest::node_ = nullptr;
48 sptr<WindowTransitionInfo> WindowControllerTest::transitionInfo_ = nullptr;
49 
RootCallback(Event event,const sptr<IRemoteObject> & remoteObject)50 void RootCallback(Event event, const sptr<IRemoteObject>& remoteObject)
51 {
52     return;
53 }
54 
SetUpTestCase()55 void WindowControllerTest::SetUpTestCase()
56 {
57     windowRoot_ = new WindowRoot(RootCallback);
58     windowRoot_->displayIdMap_[0].push_back(0);
59     inputWindowMonitor_ = new InputWindowMonitor(windowRoot_);
60     windowController_ = new WindowController(windowRoot_, inputWindowMonitor_);
61     transitionInfo_ = new WindowTransitionInfo();
62     transitionInfo_->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
63     node_ = StartingWindow::CreateWindowNode(transitionInfo_, 101); // 101 is windowId
64     node_->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
65 }
66 
TearDownTestCase()67 void WindowControllerTest::TearDownTestCase()
68 {
69 }
70 
SetUp()71 void WindowControllerTest::SetUp()
72 {
73 }
74 
TearDown()75 void WindowControllerTest::TearDown()
76 {
77 }
78 
79 namespace {
80 /**
81  * @tc.name: StartingWindow
82  * @tc.desc: Window controller starting window
83  * @tc.type: FUNC
84  */
85 HWTEST_F(WindowControllerTest, StartingWindow, Function | SmallTest | Level3)
86 {
87     windowRoot_->windowNodeMap_.clear();
88     windowController_->StartingWindow(nullptr, nullptr, 0, false);
89     ASSERT_EQ(0, windowRoot_->windowNodeMap_.size());
90 
91     transitionInfo_->SetWindowMode(WindowMode::WINDOW_MODE_UNDEFINED);
92     windowController_->StartingWindow(transitionInfo_, nullptr, 0, false);
93     ASSERT_EQ(0, windowRoot_->windowNodeMap_.size());
94 
95     sptr<IRemoteObject> abilityTokenMocker = new IRemoteObjectMocker();
96     transitionInfo_->SetAbilityToken(abilityTokenMocker);
97     windowController_->StartingWindow(transitionInfo_, nullptr, 0, false);
98     windowController_->StartingWindow(transitionInfo_, nullptr, 0, true);
99     ASSERT_EQ(1, windowRoot_->windowNodeMap_.size());
100 
101     windowRoot_->windowNodeMap_.clear();
102     sptr<IRemoteObject> iRemoteObjectMocker = new IRemoteObjectMocker();
103     RemoteAnimation::windowAnimationController_ = iface_cast<RSIWindowAnimationController>(iRemoteObjectMocker);
104     windowController_->StartingWindow(transitionInfo_, nullptr, 0, true);
105     ASSERT_EQ(1, windowRoot_->windowNodeMap_.size());
106 
107     windowRoot_->windowNodeMap_.clear();
108     windowRoot_->windowNodeMap_.insert(std::make_pair(node_->GetWindowId(), node_));
109     node_->abilityToken_ = abilityTokenMocker;
110     node_->stateMachine_.currState_ = WindowNodeState::SHOW_ANIMATION_PLAYING;
111     windowController_->StartingWindow(transitionInfo_, nullptr, 0, false);
112     ASSERT_EQ(1, windowRoot_->windowNodeMap_.size());
113 
114     node_->stateMachine_.currState_ = WindowNodeState::STARTING_CREATED;
115     windowController_->StartingWindow(transitionInfo_, nullptr, 0, false);
116     transitionInfo_->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
117     windowController_->StartingWindow(transitionInfo_, nullptr, 0, false);
118     transitionInfo_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
119     node_->property_->modeSupportInfo_ = WindowModeSupport::WINDOW_MODE_SUPPORT_ALL;
120     windowController_->StartingWindow(transitionInfo_, nullptr, 0, false);
121     ASSERT_EQ(1, windowRoot_->windowNodeMap_.size());
122 
123     // Cancel starting window
124     windowController_->CancelStartingWindow(nullptr);
125     windowController_->CancelStartingWindow(abilityTokenMocker);
126 
127     node_->startingWindowShown_ = true;
128     windowController_->CancelStartingWindow(abilityTokenMocker);
129     ASSERT_EQ(0, windowRoot_->windowNodeMap_.size());
130 
131     windowRoot_->windowNodeMap_.clear();
132     RemoteAnimation::windowAnimationController_ = nullptr;
133 }
134 /**
135  * @tc.name: NotifyWindowTransition
136  * @tc.desc: Window controller notify window transtition
137  * @tc.type: FUNC
138  */
139 HWTEST_F(WindowControllerTest, NotifyWindowTransition, Function | SmallTest | Level3)
140 {
141     sptr<WindowTransitionInfo> srcInfo = nullptr;
142     sptr<WindowTransitionInfo> dstInfo = nullptr;
143     ASSERT_EQ(WMError::WM_ERROR_NO_REMOTE_ANIMATION, windowController_->NotifyWindowTransition(srcInfo, dstInfo));
144 
145     srcInfo = new WindowTransitionInfo();
146     sptr<IRemoteObject> srcAbilityTokenMocker = new IRemoteObjectMocker();
147     srcInfo->SetAbilityToken(srcAbilityTokenMocker);
148     sptr<WindowNode> srcNode = StartingWindow::CreateWindowNode(srcInfo, 102); // 102 is windowId
149     srcNode->property_->modeSupportInfo_ = WindowModeSupport::WINDOW_MODE_SUPPORT_ALL;
150 
151     dstInfo = new WindowTransitionInfo();
152     sptr<IRemoteObject> dstAbilityTokenMocker = new IRemoteObjectMocker();
153     dstInfo->SetAbilityToken(dstAbilityTokenMocker);
154     sptr<WindowNode> dstNode = StartingWindow::CreateWindowNode(dstInfo, 103); // 103 is windowId
155     dstNode->property_->modeSupportInfo_ = WindowModeSupport::WINDOW_MODE_SUPPORT_ALL;
156 
157     windowRoot_->windowNodeMap_.clear();
158     windowRoot_->windowNodeMap_.insert(std::make_pair(srcNode->GetWindowId(), srcNode));
159     windowRoot_->windowNodeMap_.insert(std::make_pair(dstNode->GetWindowId(), dstNode));
160 
161     sptr<DisplayInfo> displayInfo = new DisplayInfo();
162     sptr<WindowNodeContainer> container = new WindowNodeContainer(displayInfo, 0);
163     windowRoot_->windowNodeContainerMap_.insert(std::make_pair(0, container));
164 
165     sptr<MockRSIWindowAnimationController> mock = new MockRSIWindowAnimationController();
166     RemoteAnimation::windowAnimationController_ = mock;
167     RemoteAnimation::windowRoot_ = windowRoot_;
168     RemoteAnimation::animationFirst_ = true;
169 
170     srcInfo->SetTransitionReason(TransitionReason::MINIMIZE);
171     srcNode->stateMachine_.currState_ = WindowNodeState::HIDDEN;
172     ASSERT_EQ(WMError::WM_ERROR_NO_REMOTE_ANIMATION, windowController_->NotifyWindowTransition(srcInfo, dstInfo));
173 
174     srcInfo->SetTransitionReason(TransitionReason::MINIMIZE);
175     srcNode->stateMachine_.currState_ = WindowNodeState::STARTING_CREATED;
176     EXPECT_CALL(*mock, OnMinimizeWindow(_, _)).Times(1);
177     ASSERT_EQ(WMError::WM_OK, windowController_->NotifyWindowTransition(srcInfo, dstInfo));
178 
179     srcInfo->SetTransitionReason(TransitionReason::CLOSE);
180     srcNode->stateMachine_.currState_ = WindowNodeState::STARTING_CREATED;
181     EXPECT_CALL(*mock, OnCloseWindow(_, _)).Times(1);
182     ASSERT_EQ(WMError::WM_OK, windowController_->NotifyWindowTransition(srcInfo, dstInfo));
183 
184     srcInfo->SetTransitionReason(TransitionReason::BACK_TRANSITION);
185     srcNode->stateMachine_.currState_ = WindowNodeState::STARTING_CREATED;
186     EXPECT_CALL(*mock, OnAppBackTransition(_, _, _)).Times(1);
187     ASSERT_EQ(WMError::WM_OK, windowController_->NotifyWindowTransition(srcInfo, dstInfo));
188 
189     srcInfo->SetTransitionReason(TransitionReason::ABILITY_TRANSITION);
190     dstNode->stateMachine_.currState_ = WindowNodeState::STARTING_CREATED;
191     dstNode->property_->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
192     dstNode->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
193     EXPECT_CALL(*mock, OnStartApp(_, _, _)).Times(1);
194     ASSERT_EQ(WMError::WM_OK, windowController_->NotifyWindowTransition(srcInfo, dstInfo));
195 
196     dstNode->stateMachine_.currState_ = WindowNodeState::STARTING_CREATED;
197     dstNode->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
198     EXPECT_CALL(*mock, OnStartApp(_, _, _)).Times(1);
199     ASSERT_EQ(WMError::WM_OK, windowController_->NotifyWindowTransition(srcInfo, dstInfo));
200 
201     windowRoot_->windowNodeContainerMap_.clear();
202     RemoteAnimation::windowAnimationController_ = nullptr;
203 }
204 /**
205  * @tc.name: FocusWindow
206  * @tc.desc: Window controller focus window
207  * @tc.type: FUNC
208  */
209 HWTEST_F(WindowControllerTest, FocusWindow, Function | SmallTest | Level3)
210 {
211     sptr<IRemoteObject> abilityToken = nullptr;
212     windowController_->GetFocusWindowInfo(abilityToken);
213 
214     sptr<DisplayInfo> displayInfo = new DisplayInfo();
215     sptr<WindowNodeContainer> container = new WindowNodeContainer(displayInfo, 0);
216     windowRoot_->windowNodeContainerMap_.insert(std::make_pair(0, container));
217 
218     sptr<WindowNode> windowNode;
219     ASSERT_EQ(WMError::WM_ERROR_INVALID_WINDOW, windowController_->GetFocusWindowNode(0, windowNode));
220 
221     windowRoot_->windowNodeMap_.clear();
222     windowRoot_->windowNodeMap_.insert(std::make_pair(node_->GetWindowId(), node_));
223     container->focusedWindow_ = node_->GetWindowId();
224     node_->currentVisibility_ = false;
225     ASSERT_EQ(WMError::WM_ERROR_INVALID_WINDOW, windowController_->GetFocusWindowNode(0, windowNode));
226 
227     node_->currentVisibility_ = true;
228     ASSERT_EQ(WMError::WM_OK, windowController_->GetFocusWindowNode(0, windowNode));
229     windowRoot_->windowNodeContainerMap_.clear();
230 }
231 /**
232  * @tc.name: CreateWindow
233  * @tc.desc: Window controller create window
234  * @tc.type: FUNC
235  */
236 HWTEST_F(WindowControllerTest, CreateWindow, Function | SmallTest | Level3)
237 {
238     windowRoot_->windowNodeMap_.clear();
239     sptr<IWindow> window;
240     sptr<WindowProperty> property = new WindowProperty();
241     std::shared_ptr<RSSurfaceNode> surfaceNode = nullptr;
242 
243     sptr<WindowProperty> property2 = new WindowProperty();
244     property2->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
245     sptr<WindowNode> windowNode = new WindowNode(property2);
246     windowRoot_->windowNodeMap_.insert(std::make_pair(1,windowNode));
247     sptr<WindowProperty> property3 = new WindowProperty();
248     property3->SetWindowType(WindowType::BELOW_APP_SYSTEM_WINDOW_BASE);
249     sptr<WindowNode> windowNode2 = new WindowNode(property3);
250     windowRoot_->windowNodeMap_.insert(std::make_pair(2,windowNode2));
251 
252     uint32_t windowId;
253     property->SetParentId(INVALID_WINDOW_ID);
254     ASSERT_EQ(WMError::WM_ERROR_NULLPTR,
255         windowController_->CreateWindow(window, property, surfaceNode, windowId, nullptr, 0, 0));
256     struct RSSurfaceNodeConfig surfaceNodeConfig;
257     surfaceNodeConfig.SurfaceNodeName = "SurfaceNode";
258     surfaceNode = RSSurfaceNode::Create(surfaceNodeConfig, RSSurfaceNodeType::DEFAULT);
259     ASSERT_EQ(WMError::WM_OK, windowController_->CreateWindow(window, property, surfaceNode, windowId, nullptr, 0, 0));
260 
261     property->SetParentId(1);
262     property->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
263     ASSERT_EQ(WMError::WM_ERROR_INVALID_PARENT,
264         windowController_->CreateWindow(window, property, surfaceNode, windowId, nullptr, 0, 0));
265 
266     property->SetWindowType(WindowType::WINDOW_TYPE_APP_SUB_WINDOW);
267     ASSERT_EQ(WMError::WM_OK, windowController_->CreateWindow(window, property, surfaceNode, windowId, nullptr, 0, 0));
268 
269     property->SetParentId(2);
270     property->SetWindowType(WindowType::WINDOW_TYPE_SYSTEM_SUB_WINDOW);
271     ASSERT_EQ(WMError::WM_OK, windowController_->CreateWindow(window, property, surfaceNode, windowId, nullptr, 0, 0));
272     windowRoot_->windowNodeMap_.clear();
273 
274     sptr<IRemoteObject> abilityTokenMocker = new IRemoteObjectMocker();
275     node_->abilityToken_ = abilityTokenMocker;
276 
277     property->SetParentId(INVALID_WINDOW_ID);
278     property->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
279     ASSERT_EQ(WMError::WM_OK,
280         windowController_->CreateWindow(window, property, surfaceNode, windowId, abilityTokenMocker, 0, 0));
281 
282     property->SetWindowType(WindowType::WINDOW_TYPE_APP_SUB_WINDOW);
283     ASSERT_EQ(WMError::WM_ERROR_INVALID_PARENT,
284         windowController_->CreateWindow(window, property, surfaceNode, windowId, abilityTokenMocker, 0, 0));
285 
286     property->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
287     node_->startingWindowShown_ = false;
288     ASSERT_EQ(WMError::WM_OK,
289         windowController_->CreateWindow(window, property, surfaceNode, windowId, abilityTokenMocker, 0, 0));
290     windowRoot_->windowNodeMap_.clear();
291 }
292 /**
293  * @tc.name: NotifyAfterAddWindow
294  * @tc.desc: Window controller notify after add window
295  * @tc.type: FUNC
296  */
297 HWTEST_F(WindowControllerTest, NotifyAfterAddWindow, Function | SmallTest | Level3)
298 {
299     ASSERT_NE(nullptr, windowController_);
300     sptr<WindowNode> node0 = new WindowNode();
301     windowController_->NotifyAfterAddWindow(node0);
302     ASSERT_EQ(0, node0->children_.size());
303 
304     sptr<WindowNode> node1 = new WindowNode();
305     node1->currentVisibility_ = false;
306     sptr<WindowNode> node2= new WindowNode();
307     node2->currentVisibility_ = true;
308 
309     node0->children_.push_back(node1);
310     node0->children_.push_back(node2);
311     windowController_->NotifyAfterAddWindow(node0);
312     ASSERT_EQ(2, node0->children_.size());
313     ASSERT_EQ(nullptr, node0->children_[0]->abilityToken_);
314 }
315 /**
316  * @tc.name: AddWindowNode
317  * @tc.desc: Window controller add window node
318  * @tc.type: FUNC
319  */
320 HWTEST_F(WindowControllerTest, AddWindowNode, Function | SmallTest | Level3)
321 {
322     sptr<WindowProperty> property = new WindowProperty();
323     property->SetWindowId(0);
324     ASSERT_EQ(WMError::WM_ERROR_NULLPTR, windowController_->AddWindowNode(property));
325 
326     windowRoot_->windowNodeMap_.clear();
327     windowRoot_->windowNodeMap_.insert(std::make_pair(node_->GetWindowId(), node_));
328     property->SetWindowId(node_->GetWindowId());
329     node_->currentVisibility_ = true;
330     node_->startingWindowShown_ = false;
331     ASSERT_EQ(WMError::WM_ERROR_INVALID_OPERATION, windowController_->AddWindowNode(property));
332     windowRoot_->windowNodeMap_.clear();
333 }
334 /**
335  * @tc.name: InputCallingWindow
336  * @tc.desc: Window controller input calling window
337  * @tc.type: FUNC
338  */
339 HWTEST_F(WindowControllerTest, InputCallingWindow, Function | SmallTest | Level3)
340 {
341     windowController_->callingWindowId_ = 0;
342     windowRoot_->windowNodeMap_.clear();
343     sptr<WindowNode> node = new WindowNode();
344     node->property_->callingWindow_ = 0;
345     node->property_->displayId_ = DISPLAY_ID_INVALID;
346     windowController_->ResizeSoftInputCallingWindowIfNeed(node);
347     ASSERT_EQ(0, windowController_->callingWindowId_);
348 
349     sptr<DisplayInfo> displayInfo = new DisplayInfo();
350     sptr<WindowNodeContainer> container = new WindowNodeContainer(displayInfo, 0);
351     windowRoot_->windowNodeContainerMap_.insert(std::make_pair(0, container));
352     node->property_->displayId_ = 0;
353     windowController_->ResizeSoftInputCallingWindowIfNeed(node);
354     ASSERT_EQ(0, windowController_->callingWindowId_);
355 
356     windowRoot_->windowNodeMap_.insert(std::make_pair(node_->GetWindowId(), node_));
357     container->focusedWindow_ = node_->GetWindowId();
358     node_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
359     node_->currentVisibility_ = false;
360     windowController_->ResizeSoftInputCallingWindowIfNeed(node);
361     ASSERT_EQ(0, windowController_->callingWindowId_);
362 
363     node_->currentVisibility_ = true;
364     node_->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
365     windowController_->ResizeSoftInputCallingWindowIfNeed(node);
366 
367     node_->currentVisibility_ = true;
368     node_->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
369     windowController_->ResizeSoftInputCallingWindowIfNeed(node);
370     ASSERT_EQ(0, windowController_->callingWindowId_);
371 
372     windowController_->callingWindowId_ = node_->GetWindowId();
373     windowController_->callingWindowRestoringRect_ = {0, 0, 0, 0};
374     windowController_->RestoreCallingWindowSizeIfNeed();
375     ASSERT_EQ(0, windowController_->callingWindowId_);
376 
377     windowController_->callingWindowRestoringRect_ = {0, 0, 1, 1};
378     windowController_->callingWindowId_ = 0;
379     windowController_->RestoreCallingWindowSizeIfNeed();
380 
381     windowController_->callingWindowId_ = node_->GetWindowId();
382     windowController_->RestoreCallingWindowSizeIfNeed();
383     ASSERT_EQ(0, windowController_->callingWindowId_);
384 
385     windowController_->callingWindowId_ = node_->GetWindowId();
386     node_->SetWindowMode(WindowMode::WINDOW_MODE_FULLSCREEN);
387     windowController_->RestoreCallingWindowSizeIfNeed();
388     ASSERT_EQ(0, windowController_->callingWindowId_);
389 
390     windowRoot_->windowNodeMap_.clear();
391     windowRoot_->windowNodeContainerMap_.clear();
392 }
393 /**
394  * @tc.name: SetDefaultDisplayInfo
395  * @tc.desc: Window controller set default display info
396  * @tc.type: FUNC
397  */
398 HWTEST_F(WindowControllerTest, SetDefaultDisplayInfo, Function | SmallTest | Level3)
399 {
400     const int32_t displayWidth = 100;
401     const int32_t displayHeight = 200;
402     windowController_->defaultDisplayRect_ = { 0, 0, 0, 0 };
403 
404     sptr<DisplayInfo> displayInfo = nullptr;
405     windowController_->SetDefaultDisplayInfo(0, displayInfo);
406     ASSERT_EQ(0, windowController_->defaultDisplayRect_.width_);
407     ASSERT_EQ(0, windowController_->defaultDisplayRect_.height_);
408 
409     displayInfo = new DisplayInfo();
410     displayInfo->id_ = 1;
411     displayInfo->width_ = displayWidth;
412     displayInfo->height_ = displayHeight;
413 
414     windowController_->SetDefaultDisplayInfo(0, displayInfo);
415     ASSERT_EQ(0, windowController_->defaultDisplayRect_.width_);
416     ASSERT_EQ(0, windowController_->defaultDisplayRect_.height_);
417 
418     displayInfo->id_ = 0;
419     windowController_->SetDefaultDisplayInfo(0, displayInfo);
420     ASSERT_EQ(displayWidth, windowController_->defaultDisplayRect_.width_);
421     ASSERT_EQ(displayHeight, windowController_->defaultDisplayRect_.height_);
422 }
423 /**
424  * @tc.name: ProcessDisplayCompression
425  * @tc.desc: Window controller process display compression
426  * @tc.type: FUNC
427  */
428 HWTEST_F(WindowControllerTest, ProcessDisplayCompression, Function | SmallTest | Level3)
429 {
430     ASSERT_NE(nullptr, windowController_);
431     DisplayId defaultDisplayId = 0;
432     sptr<DisplayInfo> displayInfo = new DisplayInfo();
433     displayInfo->id_ = 1;
434     windowController_->ProcessDisplayCompression(defaultDisplayId, displayInfo);
435     ASSERT_EQ(nullptr, windowController_->maskingSurfaceNode_);
436 
437     displayInfo->id_ = defaultDisplayId;
438     displayInfo->waterfallDisplayCompressionStatus_ = false;
439     windowController_->ProcessDisplayCompression(defaultDisplayId, displayInfo);
440     ASSERT_EQ(nullptr, windowController_->maskingSurfaceNode_);
441 
442     displayInfo->waterfallDisplayCompressionStatus_ = true;
443     windowController_->ProcessDisplayCompression(defaultDisplayId, displayInfo);
444     ASSERT_NE(nullptr, windowController_->maskingSurfaceNode_);
445 }
446 /**
447  * @tc.name: StopBootAnimationIfNeed
448  * @tc.desc: Window controller stop boot animation if need
449  * @tc.type: FUNC
450  */
451 HWTEST_F(WindowControllerTest, StopBootAnimationIfNeed, Function | SmallTest | Level3)
452 {
453     ASSERT_NE(nullptr, windowController_);
454 
455     sptr<WindowNode> node = nullptr;
456     windowController_->isBootAnimationStopped_ = true;
457     windowController_->StopBootAnimationIfNeed(node);
458     ASSERT_EQ(true, windowController_->isBootAnimationStopped_);
459 
460     windowController_->isBootAnimationStopped_ = false;
461     windowController_->StopBootAnimationIfNeed(node);
462     ASSERT_EQ(false, windowController_->isBootAnimationStopped_);
463 
464     node = new WindowNode();
465     node->SetDisplayId(DISPLAY_ID_INVALID + 1);
466     windowController_->StopBootAnimationIfNeed(node);
467     ASSERT_EQ(false, windowController_->isBootAnimationStopped_);
468 
469     node->SetDisplayId(DISPLAY_ID_INVALID);
470     windowController_->StopBootAnimationIfNeed(node);
471     ASSERT_EQ(false, windowController_->isBootAnimationStopped_);
472 }
473 /**
474  * @tc.name: GetEmbedNodeId
475  * @tc.desc: Window controller get embed node id
476  * @tc.type: FUNC
477  */
478 HWTEST_F(WindowControllerTest, GetEmbedNodeId, Function | SmallTest | Level3)
479 {
480     std::vector<sptr<WindowNode>> windowNodes;
481     sptr<WindowNode> node0 = nullptr;
482     sptr<WindowNode> node1 = new WindowNode();
483     node1->property_->windowId_ = 1;
484     sptr<WindowNode> node2 = new WindowNode();
485     node2->property_->windowId_ = 2;
486     sptr<WindowNode> node3 = new WindowNode();
487     node3->property_->windowId_ = 3;
488 
489     node1->property_->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
490     ASSERT_EQ(0, windowController_->GetEmbedNodeId(windowNodes, node1));
491 
492     node1->property_->SetWindowType(WindowType::WINDOW_TYPE_APP_COMPONENT);
493     ASSERT_EQ(0, windowController_->GetEmbedNodeId(windowNodes, node1));
494 
495     windowNodes.push_back(node0);
496     windowNodes.push_back(node2);
497     windowNodes.push_back(node1);
498     windowNodes.push_back(node2);
499     windowNodes.push_back(node3);
500 
501     node1->SetWindowRect({50, 50, 50, 50});
502     node3->SetWindowRect({0, 0, 200, 200});
503     ASSERT_EQ(node3->GetWindowId(), windowController_->GetEmbedNodeId(windowNodes, node1));
504 }
505 /**
506  * @tc.name: BindDialogTarget
507  * @tc.desc: Window controller bind dialog target
508  * @tc.type: FUNC
509  */
510 HWTEST_F(WindowControllerTest, BindDialogTarget, Function | SmallTest | Level3)
511 {
512     windowRoot_->windowNodeMap_.clear();
513 
514     uint32_t id = 0;
515     sptr<IRemoteObject> abilityTokenMocker = new IRemoteObjectMocker();
516     ASSERT_EQ(WMError::WM_ERROR_NULLPTR, windowController_->BindDialogTarget(id, abilityTokenMocker));
517 
518     windowRoot_->windowNodeMap_.insert(std::make_pair(node_->GetWindowId(), node_));
519     id = node_->GetWindowId();
520     ASSERT_EQ(WMError::WM_OK, windowController_->BindDialogTarget(id, abilityTokenMocker));
521     windowRoot_->windowNodeMap_.clear();
522 }
523 
524 /**
525  * @tc.name: RaiseToAppTop
526  * @tc.desc: check app subwindow raise to top
527  * @tc.type: FUNC
528  */
529 HWTEST_F(WindowControllerTest, RaiseToAppTop, Function | SmallTest | Level3)
530 {
531     windowRoot_->windowNodeMap_.clear();
532 
533     sptr<WindowNode> windowNode = new (std::nothrow)WindowNode();
534     windowNode->property_->windowId_ = 100;
535     windowNode->SetDisplayId(DISPLAY_ID_INVALID);
536 
537     uint32_t windowId = windowNode->GetWindowId();
538     ASSERT_EQ(WmErrorCode::WM_ERROR_STATE_ABNORMALLY, windowController_->RaiseToAppTop(windowId));
539 
540     windowRoot_->windowNodeMap_.insert(std::make_pair(windowNode->GetWindowId(), windowNode));
541     ASSERT_EQ(WmErrorCode::WM_ERROR_INVALID_PARENT, windowController_->RaiseToAppTop(windowId));
542 
543     sptr<WindowNode> parentWindow = new (std::nothrow)WindowNode();
544     parentWindow->property_->windowId_ = 90;
545     parentWindow->SetDisplayId(DISPLAY_ID_INVALID);
546     windowRoot_->windowNodeMap_.insert(std::make_pair(parentWindow->GetWindowId(), parentWindow));
547 
548     windowNode->parent_ = parentWindow;
549     ASSERT_EQ(WmErrorCode::WM_ERROR_STAGE_ABNORMALLY, windowController_->RaiseToAppTop(windowId));
550 
551     windowRoot_->windowNodeMap_.clear();
552 }
553 }
554 }
555 }
556