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