• 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 <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