• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 // gtest
17 #include <ability_context.h>
18 #include <gtest/gtest.h>
19 #include "modifier_render_thread/rs_modifiers_draw_thread.h"
20 #include "window.h"
21 #include "window_option.h"
22 #include "window_scene.h"
23 #include "wm_common.h"
24 
25 using namespace testing;
26 using namespace testing::ext;
27 
28 namespace OHOS {
29 namespace Rosen {
30 class WindowSubWindowTest : public testing::Test {
31 public:
32     static void SetUpTestCase();
33     static void TearDownTestCase();
34     virtual void SetUp() override;
35     virtual void TearDown() override;
36 };
37 
SetUpTestCase()38 void WindowSubWindowTest::SetUpTestCase() {}
39 
TearDownTestCase()40 void WindowSubWindowTest::TearDownTestCase()
41 {
42 #ifdef RS_ENABLE_VK
43     RSModifiersDrawThread::Destroy();
44 #endif
45 }
46 
SetUp()47 void WindowSubWindowTest::SetUp() {}
48 
TearDown()49 void WindowSubWindowTest::TearDown() {}
50 
CreateWindowScene()51 static sptr<WindowScene> CreateWindowScene()
52 {
53     sptr<IWindowLifeCycle> listener = nullptr;
54     std::shared_ptr<AbilityRuntime::AbilityContext> abilityContext = nullptr;
55 
56     sptr<WindowScene> scene = new WindowScene();
57     scene->Init(0, abilityContext, listener);
58     return scene;
59 }
60 
CreateSubWindow(sptr<WindowScene> scene,WindowType type,struct Rect rect,uint32_t flags,std::string name="")61 static sptr<Window> CreateSubWindow(sptr<WindowScene> scene, WindowType type,
62     struct Rect rect, uint32_t flags, std::string name = "")
63 {
64     sptr<WindowOption> subOp = new WindowOption();
65     subOp->SetWindowType(type);
66     subOp->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
67     subOp->SetWindowRect(rect);
68     subOp->SetWindowFlags(flags);
69 
70     static int cnt = 0;
71     std::string subWinName = (name == "") ? "SubWindow" + std::to_string(cnt++) : name;
72 
73     return scene->CreateWindow(subWinName, subOp);
74 }
75 
76 /**
77  * @tc.name: SubWindow01
78  * @tc.desc: FullScreen Main Window + Floating SubWindow
79  * @tc.type: FUNC
80  */
81 HWTEST_F(WindowSubWindowTest, SubWindow01, TestSize.Level1)
82 {
83     sptr<WindowScene> scene = CreateWindowScene();
84 
85     struct Rect rect = { 0, 0, 100, 200 };
86     uint32_t flags = 0;
87     sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, flags);
88     if (subWindow == nullptr) {
89         return;
90     }
91     ASSERT_NE(nullptr, subWindow);
92 
93     ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
94     ASSERT_EQ(WMError::WM_OK, subWindow->Show());
95 
96     ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
97     ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
98     sleep(1);
99 
100     subWindow->Destroy();
101     scene->GoDestroy();
102 }
103 
104 /**
105  * @tc.name: SubWindow02
106  * @tc.desc: FullScreen Main Window + Floating SubWindow & Parent Limit work
107  * @tc.type: FUNC
108  */
109 HWTEST_F(WindowSubWindowTest, SubWindow02, TestSize.Level1)
110 {
111     sptr<WindowScene> scene = CreateWindowScene();
112 
113     struct Rect rect = { 0, 0, 100, 200 };
114     uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
115     sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, flags);
116     if (subWindow == nullptr) {
117         return;
118     }
119     ASSERT_NE(nullptr, subWindow);
120 
121     ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
122     ASSERT_EQ(WMError::WM_OK, subWindow->Show());
123 
124     ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
125     ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
126     sleep(1);
127 
128     subWindow->Destroy();
129     scene->GoDestroy();
130 }
131 
132 /**
133  * @tc.name: SubWindow03
134  * @tc.desc: FullScreen Main Window + Floating MediaWindow
135  * @tc.type: FUNC
136  */
137 HWTEST_F(WindowSubWindowTest, SubWindow03, TestSize.Level1)
138 {
139     sptr<WindowScene> scene = CreateWindowScene();
140 
141     struct Rect rect = { 0, 2000, 100, 200 };
142     uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
143     sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_MEDIA, rect, flags);
144     if (subWindow == nullptr) {
145         return;
146     }
147     ASSERT_NE(nullptr, subWindow);
148 
149     ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
150     ASSERT_EQ(WMError::WM_OK, subWindow->Show());
151 
152     ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
153     ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
154     sleep(1);
155 
156     subWindow->Destroy();
157     scene->GoDestroy();
158 }
159 
160 /**
161  * @tc.name: SubWindow04
162  * @tc.desc: FullScreen Main Window + Floating MediaWindow
163  * @tc.type: FUNC
164  */
165 HWTEST_F(WindowSubWindowTest, SubWindow04, TestSize.Level1)
166 {
167     sptr<WindowScene> scene = CreateWindowScene();
168 
169     struct Rect rect = { 0, 2000, 3000, 2000 };
170     uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
171     sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_MEDIA, rect, flags);
172     if (subWindow == nullptr) {
173         return;
174     }
175     ASSERT_NE(nullptr, subWindow);
176 
177     ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
178     ASSERT_EQ(WMError::WM_OK, subWindow->Show());
179 
180     ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
181     ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
182     sleep(1);
183 
184     subWindow->Destroy();
185     scene->GoDestroy();
186 }
187 
188 /**
189  * @tc.name: SubWindow05
190  * @tc.desc: FullScreen Main Window + Floating MediaWindow + Floating SubWindow
191  * @tc.type: FUNC
192  */
193 HWTEST_F(WindowSubWindowTest, SubWindow05, TestSize.Level1)
194 {
195     sptr<WindowScene> scene = CreateWindowScene();
196 
197     struct Rect rect = { 0, 0, 100, 200 };
198     uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
199     sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_MEDIA, rect, flags);
200     if (subWindow == nullptr) {
201         return;
202     }
203     ASSERT_NE(nullptr, subWindow);
204 
205     sptr<Window> subWindow2 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, flags);
206     ASSERT_NE(nullptr, subWindow2);
207 
208     ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
209     ASSERT_EQ(WMError::WM_OK, subWindow->Show());
210     ASSERT_EQ(WMError::WM_OK, subWindow2->Show());
211 
212     ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
213     ASSERT_EQ(WMError::WM_OK, subWindow2->Hide());
214     ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
215     sleep(1);
216 
217     subWindow->Destroy();
218     subWindow2->Destroy();
219     scene->GoDestroy();
220 }
221 
222 /**
223  * @tc.name: SubWindow06
224  * @tc.desc: FullScreen Main Window + 2 SubWindows
225  * @tc.type: FUNC
226  */
227 HWTEST_F(WindowSubWindowTest, SubWindow06, TestSize.Level1)
228 {
229     sptr<WindowScene> scene = CreateWindowScene();
230 
231     struct Rect rect = { 0, 0, 100, 200 };
232     sptr<Window> subWindow0 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0);
233     if (subWindow0 == nullptr) {
234         return;
235     }
236     ASSERT_NE(nullptr, subWindow0);
237 
238     sptr<Window> subWindow1 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0);
239     ASSERT_NE(nullptr, subWindow1);
240 
241     ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
242     ASSERT_EQ(WMError::WM_OK, subWindow0->Show());
243     ASSERT_EQ(WMError::WM_OK, subWindow1->Show());
244 
245     ASSERT_EQ(WMError::WM_OK, subWindow0->Hide());
246     ASSERT_EQ(WMError::WM_OK, subWindow1->Hide());
247     ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
248     sleep(1);
249 
250     subWindow0->Destroy();
251     subWindow1->Destroy();
252     scene->GoDestroy();
253 }
254 
255 /**
256  * @tc.name: SubWindow07
257  * @tc.desc: FullScreen Main Window + Floating SubWindow & MainWindow First GoBackground
258  * @tc.type: FUNC
259  */
260 HWTEST_F(WindowSubWindowTest, SubWindow07, TestSize.Level1)
261 {
262     sptr<WindowScene> scene = CreateWindowScene();
263 
264     struct Rect rect = { 0, 0, 100, 200 };
265     uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
266     sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, flags);
267     if (subWindow == nullptr) {
268         return;
269     }
270     ASSERT_NE(nullptr, subWindow);
271 
272     ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
273     ASSERT_EQ(WMError::WM_OK, subWindow->Show());
274 
275     ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
276     ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
277     sleep(1);
278 
279     subWindow->Destroy();
280     scene->GoDestroy();
281 }
282 
283 /**
284  * @tc.name: SubWindow08
285  * @tc.desc: FullScreen Main Window + Floating SubWindow & only show SubWindow
286  * @tc.type: FUNC
287  */
288 HWTEST_F(WindowSubWindowTest, SubWindow08, TestSize.Level1)
289 {
290     sptr<WindowScene> scene = CreateWindowScene();
291 
292     struct Rect rect = { 0, 0, 100, 200 };
293     uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
294     sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, flags);
295     if (subWindow == nullptr) {
296         return;
297     }
298     ASSERT_NE(nullptr, subWindow);
299 
300     ASSERT_EQ(WMError::WM_ERROR_INVALID_PARAM, subWindow->Show());
301 }
302 
303 /**
304  * @tc.name: SubWindow09
305  * @tc.desc: FullScreen Main Window + Floating SubWindow & first destroy SubWindow, then destroy MainWindow
306  * @tc.type: FUNC
307  */
308 HWTEST_F(WindowSubWindowTest, SubWindow09, TestSize.Level1)
309 {
310     sptr<WindowScene> scene = CreateWindowScene();
311 
312     struct Rect rect = { 0, 0, 100, 200 };
313     uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
314     sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, flags);
315     if (subWindow == nullptr) {
316         return;
317     }
318     ASSERT_NE(nullptr, subWindow);
319 
320     ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
321     ASSERT_EQ(WMError::WM_OK, subWindow->Show());
322 
323     ASSERT_EQ(WMError::WM_OK, subWindow->Hide());
324     ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
325     sleep(1);
326 
327     ASSERT_EQ(WMError::WM_OK, subWindow->Destroy());
328 
329     subWindow->Destroy();
330     scene->GoDestroy();
331 }
332 
333 /**
334  * @tc.name: SubWindow10
335  * @tc.desc: FullScreen Main Window + Floating SubWindow & first destroy MainWindow, then destroy SubWindow
336  * @tc.type: FUNC
337  */
338 HWTEST_F(WindowSubWindowTest, SubWindow10, TestSize.Level1)
339 {
340     sptr<WindowScene> scene = CreateWindowScene();
341 
342     struct Rect rect = { 0, 0, 100, 200 };
343     uint32_t flags = static_cast<uint32_t>(WindowFlag::WINDOW_FLAG_PARENT_LIMIT);
344     sptr<Window> subWindow = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, flags);
345     if (subWindow == nullptr) {
346         return;
347     }
348     ASSERT_NE(nullptr, subWindow);
349 
350     ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
351     ASSERT_EQ(WMError::WM_OK, subWindow->Show());
352     sleep(1);
353 
354     sptr<Window> mainWindow = scene->GetMainWindow();
355     ASSERT_EQ(WMError::WM_OK, mainWindow->Destroy());
356     ASSERT_EQ(WMError::WM_OK, subWindow->Destroy());
357 
358     scene->GoDestroy();
359 }
360 
361 /**
362  * @tc.name: SubWindow11
363  * @tc.desc: FullScreen Main Window + 5 subWindows
364  * @tc.type: FUNC
365  */
366 HWTEST_F(WindowSubWindowTest, SubWindow11, TestSize.Level1)
367 {
368     sptr<WindowScene> scene = CreateWindowScene();
369 
370     struct Rect rect = { 0, 0, 100, 200 };
371     sptr<Window> subWindow0 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0);
372     if (subWindow0 == nullptr) {
373         return;
374     }
375     ASSERT_NE(nullptr, subWindow0);
376 
377     sptr<Window> subWindow1 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0);
378     if (subWindow1 == nullptr) {
379         return;
380     }
381     ASSERT_NE(nullptr, subWindow1);
382 
383     sptr<Window> subWindow2 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0);
384     if (subWindow2 == nullptr) {
385         return;
386     }
387     ASSERT_NE(nullptr, subWindow2);
388 
389     sptr<Window> subWindow3 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0);
390     if (subWindow3 == nullptr) {
391         return;
392     }
393     ASSERT_NE(nullptr, subWindow3);
394 
395     sptr<Window> subWindow4 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0);
396     if (subWindow4 == nullptr) {
397         return;
398     }
399     ASSERT_NE(nullptr, subWindow4);
400     if (scene->GoForeground() == WMError::WM_OK) {
401         ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
402     }
403 
404     ASSERT_EQ(WMError::WM_OK, subWindow0->Show());
405     ASSERT_EQ(WMError::WM_OK, subWindow1->Show());
406     ASSERT_EQ(WMError::WM_OK, subWindow2->Show());
407     ASSERT_EQ(WMError::WM_OK, subWindow3->Show());
408     ASSERT_EQ(WMError::WM_OK, subWindow4->Show());
409 
410     ASSERT_EQ(WMError::WM_OK, subWindow0->Hide());
411     ASSERT_EQ(WMError::WM_OK, subWindow1->Hide());
412     ASSERT_EQ(WMError::WM_OK, subWindow2->Hide());
413     ASSERT_EQ(WMError::WM_OK, subWindow3->Hide());
414     ASSERT_EQ(WMError::WM_OK, subWindow4->Hide());
415     ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
416     sleep(1);
417 
418     subWindow0->Destroy();
419     subWindow1->Destroy();
420     subWindow2->Destroy();
421     subWindow3->Destroy();
422     subWindow4->Destroy();
423     scene->GoDestroy();
424 }
425 
426 /**
427  * @tc.name: SubWindow12
428  * @tc.desc: FullScreen Main Window + 2 SubWindows with the same name
429  * @tc.type: FUNC
430  */
431 HWTEST_F(WindowSubWindowTest, SubWindow12, TestSize.Level1)
432 {
433     sptr<WindowScene> scene = CreateWindowScene();
434 
435     struct Rect rect = { 0, 0, 100, 200 };
436     sptr<Window> subWindow0 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0, "sub0");
437     sptr<Window> subWindow1 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0, "sub0");
438     if (subWindow0 == nullptr) {
439         return;
440     }
441     if (subWindow1 == nullptr) {
442         return;
443     }
444     ASSERT_NE(nullptr, subWindow0);
445     ASSERT_EQ(nullptr, subWindow1);
446 
447     ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
448     ASSERT_EQ(WMError::WM_OK, subWindow0->Show());
449 
450     ASSERT_EQ(WMError::WM_OK, subWindow0->Hide());
451     ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
452     sleep(1);
453 
454     subWindow0->Destroy();
455     scene->GoDestroy();
456 }
457 
458 /**
459  * @tc.name: SubWindow13
460  * @tc.desc: FullScreen Main Window + 2 subwindows with the same name but one create after another destroyed
461  * @tc.type: FUNC
462  */
463 HWTEST_F(WindowSubWindowTest, SubWindow13, TestSize.Level1)
464 {
465     sptr<WindowScene> scene = CreateWindowScene();
466     if (scene->GoForeground() == WMError::WM_OK) {
467         ASSERT_EQ(WMError::WM_OK, scene->GoForeground());
468     }
469 
470     struct Rect rect = { 0, 0, 100, 200 };
471     sptr<Window> subWindow0 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0, "sub1");
472     if (subWindow0 == nullptr) {
473         return;
474     }
475     ASSERT_NE(nullptr, subWindow0);
476     ASSERT_EQ(WMError::WM_OK, subWindow0->Show());
477     ASSERT_EQ(WMError::WM_OK, subWindow0->Destroy());
478 
479     sptr<Window> subWindow1 = CreateSubWindow(scene, WindowType::WINDOW_TYPE_APP_SUB_WINDOW, rect, 0, "sub1");
480     if (subWindow1 == nullptr) {
481         return;
482     }
483     ASSERT_NE(nullptr, subWindow1);
484     ASSERT_EQ(WMError::WM_OK, subWindow1->Show());
485     ASSERT_EQ(WMError::WM_OK, subWindow1->Destroy());
486 
487     ASSERT_EQ(WMError::WM_OK, scene->GoBackground());
488     sleep(1);
489     scene->GoDestroy();
490 }
491 } // namespace Rosen
492 } // namespace OHOS
493