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