• 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 #include <gtest/gtest.h>
17 #include <parameters.h>
18 
19 #include "common_test_utils.h"
20 #include "display_test_utils.h"
21 #include "future.h"
22 #include "screen.h"
23 #include "surface_draw.h"
24 #include "virtual_screen_group_change_listener_future.h"
25 #include "window.h"
26 #include "window_option.h"
27 #include "window_manager_hilog.h"
28 
29 using namespace testing;
30 using namespace testing::ext;
31 
32 namespace OHOS {
33 namespace Rosen {
34 namespace {
35     constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_DISPLAY, "ScreenManagerTest"};
36     constexpr uint32_t COLOR_RED = 0xffff0000;
37 }
38 class ScreenGroupChangeListener;
39 class ScreenManagerTest : public testing::Test {
40 public:
41     static void SetUpTestCase();
42     static void TearDownTestCase();
43     virtual void SetUp() override;
44     virtual void TearDown() override;
45     sptr<Window> CreateWindowByDisplayId(DisplayId displayId);
46     bool DrawWindowColor(const sptr<Window>& window, uint32_t color);
47     void CheckScreenStateInGroup(bool, sptr<ScreenGroup>, ScreenId, sptr<Screen>, ScreenId);
48     void CheckScreenGroupState(ScreenCombination, ScreenGroupChangeEvent event, ScreenId,
49         sptr<ScreenGroup>, sptr<ScreenGroupChangeListener>);
50     void CheckScreenGroupStateForMirror(ScreenGroupChangeEvent event, std::vector<ScreenId> mirrorIds,
51         sptr<VirtualScreenGroupChangeListenerFuture> virtualScreenGroupChangeListener);
52     static sptr<Display> defaultDisplay_;
53     static DisplayId defaultDisplayId_;
54     static ScreenId defaultScreenId_;
55     static std::string defaultName_;
56     static uint32_t defaultWidth_;
57     static uint32_t defaultHeight_;
58     static float defaultDensity_;
59     static int32_t defaultFlags_;
60     static VirtualScreenOption defaultOption_;
61     static uint32_t waitCount_;
62     const uint32_t sleepUs_ = 10 * 1000;
63     const uint32_t maxWaitCount_ = 2000;
64     const uint32_t execTimes_ = 10;
65     const uint32_t acquireFrames_ = 1;
66     static constexpr uint32_t TEST_SLEEP_S = 1; // test sleep time
67     static constexpr uint32_t TEST_SLEEP_S_LONG = 10; // test sleep for 10 seconds
68     static constexpr long TIME_OUT = 1000;
69 };
70 
71 class ScreenChangeListener : public ScreenManager::IScreenListener {
72 public:
OnConnect(ScreenId screenId)73     virtual void OnConnect(ScreenId screenId) override
74     {
75         WLOGFI("OnConnect, screenId:%{public}" PRIu64"", screenId);
76         connectFuture_.SetValue(screenId);
77     }
OnDisconnect(ScreenId screenId)78     virtual void OnDisconnect(ScreenId screenId) override
79     {
80         WLOGFI("OnDisconnect, screenId:%{public}" PRIu64"", screenId);
81         disconnectFuture_.SetValue(screenId);
82     }
OnChange(ScreenId screenId)83     virtual void OnChange(ScreenId screenId) override
84     {
85         WLOGFI("OnChange, screenId:%{public}" PRIu64"", screenId);
86         changeFuture_.SetValue(screenId);
87     }
88     RunnableFuture<ScreenId> connectFuture_;
89     RunnableFuture<ScreenId> disconnectFuture_;
90     RunnableFuture<ScreenId> changeFuture_;
91 };
92 
93 class ScreenGroupChangeListener : public ScreenManager::IScreenGroupListener {
94 public:
OnChange(const std::vector<ScreenId> & screenIds,ScreenGroupChangeEvent event)95     virtual void OnChange(const std::vector<ScreenId>& screenIds, ScreenGroupChangeEvent event) override
96     {
97         for (auto screenId : screenIds) {
98             changeFuture_.SetValue(std::make_pair(screenId, event));
99             usleep(10 * 1000); // wait 10000 us
100         }
101     }
102     RunnableFuture<std::pair<ScreenId, ScreenGroupChangeEvent>> changeFuture_;
103 };
104 
105 sptr<Display> ScreenManagerTest::defaultDisplay_ = nullptr;
106 DisplayId ScreenManagerTest::defaultDisplayId_ = DISPLAY_ID_INVALID;
107 ScreenId ScreenManagerTest::defaultScreenId_ = INVALID_SCREEN_ID;
108 std::string ScreenManagerTest::defaultName_ = "virtualScreen01";
109 uint32_t ScreenManagerTest::defaultWidth_ = 480;
110 uint32_t ScreenManagerTest::defaultHeight_ = 320;
111 float ScreenManagerTest::defaultDensity_ = 2.0;
112 int32_t ScreenManagerTest::defaultFlags_ = 0;
113 VirtualScreenOption ScreenManagerTest::defaultOption_ = {
114     defaultName_, defaultWidth_, defaultHeight_, defaultDensity_, nullptr, defaultFlags_
115 };
116 uint32_t ScreenManagerTest::waitCount_ = 0;
117 
SetUpTestCase()118 void ScreenManagerTest::SetUpTestCase()
119 {
120     defaultDisplay_ = DisplayManager::GetInstance().GetDefaultDisplay();
121     defaultDisplayId_ = defaultDisplay_->GetId();
122     defaultScreenId_ = defaultDisplay_->GetScreenId();
123     defaultWidth_ = defaultDisplay_->GetWidth();
124     defaultHeight_ = defaultDisplay_->GetHeight();
125     defaultOption_.width_ = defaultWidth_;
126     defaultOption_.height_ = defaultHeight_;
127 
128     CommonTestUtils::InjectTokenInfoByHapName(0, "com.ohos.systemui", 0);
129 }
130 
TearDownTestCase()131 void ScreenManagerTest::TearDownTestCase()
132 {
133 }
134 
SetUp()135 void ScreenManagerTest::SetUp()
136 {
137 }
138 
TearDown()139 void ScreenManagerTest::TearDown()
140 {
141 }
142 
143 
DrawWindowColor(const sptr<Window> & window,uint32_t color)144 bool ScreenManagerTest::DrawWindowColor(const sptr<Window>& window, uint32_t color)
145 {
146     auto surfaceNode = window->GetSurfaceNode();
147     if (surfaceNode == nullptr) {
148         WLOGFE("Failed to GetSurfaceNode!");
149         return false;
150     }
151     Rect rect = window->GetRequestRect();
152     uint32_t windowWidth = rect.width_;
153     uint32_t windowHeight = rect.height_;
154     WLOGFI("windowWidth: %{public}u, windowHeight: %{public}u", windowWidth, windowHeight);
155     SurfaceDraw::DrawColor(surfaceNode, windowWidth, windowHeight, color);
156     return true;
157 }
158 
CreateWindowByDisplayId(DisplayId displayId)159 sptr<Window> ScreenManagerTest::CreateWindowByDisplayId(DisplayId displayId)
160 {
161     sptr<WindowOption> option = new WindowOption();
162     if (option == nullptr) {
163         return nullptr;
164     }
165     Rect displayRect = {0, 0, 640, 480};
166     option->SetDisplayId(displayId);
167     option->SetWindowRect(displayRect);
168     option->SetWindowType(WindowType::WINDOW_TYPE_APP_MAIN_WINDOW);
169     option->SetWindowMode(WindowMode::WINDOW_MODE_FLOATING);
170     option->SetWindowName("VirtualWindow01");
171     sptr<Window> window = Window::Create(option->GetWindowName(), option);
172     return window;
173 }
174 
175 #define CHECK_TEST_INIT_SCREEN_STATE \
176     std::vector<sptr<Screen>> allScreens = ScreenManager::GetInstance().GetAllScreens(); \
177     ASSERT_LT(0, allScreens.size()); \
178     ScreenId groupId = SCREEN_ID_INVALID; \
179     for (auto screen : allScreens) { \
180         if (screen->IsGroup()) { \
181         groupId = screen->GetId(); \
182         ASSERT_EQ(SCREEN_ID_INVALID, screen->GetParentId()); \
183         } \
184     } \
185     ASSERT_NE(SCREEN_ID_INVALID, groupId); \
186     auto group = ScreenManager::GetInstance().GetScreenGroup(groupId); \
187     ASSERT_NE(nullptr, group); \
188     ASSERT_EQ(groupId, group->GetId()); \
189     sptr<ScreenChangeListener> screenListener = new ScreenChangeListener(); \
190     sptr<ScreenGroupChangeListener> screenGroupChangeListener = new ScreenGroupChangeListener(); \
191     sptr<VirtualScreenGroupChangeListenerFuture> virtualScreenGroupChangeListener \
192         = new VirtualScreenGroupChangeListenerFuture(); \
193     ScreenManager::GetInstance().RegisterScreenListener(screenListener); \
194     ScreenManager::GetInstance().RegisterScreenGroupListener(screenGroupChangeListener); \
195     ScreenManager::GetInstance().RegisterVirtualScreenGroupListener(virtualScreenGroupChangeListener); \
196 
197 #define CHECK_SCREEN_STATE_AFTER_CREATE_VIRTUAL_SCREEN \
198     auto virtualScreen = ScreenManager::GetInstance().GetScreenById(virtualScreenId); \
199     ASSERT_NE(nullptr, virtualScreen); \
200     ASSERT_EQ(virtualScreenId, virtualScreen->GetId()); \
201     ScreenId screenId = screenListener->connectFuture_.GetResult(TIME_OUT); \
202     screenListener->connectFuture_.Reset(SCREEN_ID_INVALID); \
203     ASSERT_EQ(virtualScreenId, screenId); \
204 
CheckScreenStateInGroup(bool isInGroup,sptr<ScreenGroup> group,ScreenId groupId,sptr<Screen> virtualScreen,ScreenId virtualScreenId)205 void ScreenManagerTest::CheckScreenStateInGroup(
206     bool isInGroup, sptr<ScreenGroup> group, ScreenId groupId, sptr<Screen> virtualScreen, ScreenId virtualScreenId)
207 {
208     auto childIds = group->GetChildIds();
209     ASSERT_LT(0, childIds.size());
210     auto iter = std::find(childIds.begin(), childIds.end(), virtualScreenId);
211     if (isInGroup) {
212         ASSERT_EQ(groupId, virtualScreen->GetParentId());
213     } else {
214         ASSERT_EQ(SCREEN_ID_INVALID, virtualScreen->GetParentId());
215     }
216     if (isInGroup) {
217         ASSERT_NE(childIds.end(), iter);
218     } else {
219         ASSERT_EQ(childIds.end(), iter);
220     }
221 }
222 
CheckScreenGroupState(ScreenCombination combination,ScreenGroupChangeEvent event,ScreenId virtualScreenId,sptr<ScreenGroup> group,sptr<ScreenGroupChangeListener> screenGroupChangeListener)223 void ScreenManagerTest::CheckScreenGroupState(ScreenCombination combination, ScreenGroupChangeEvent event,
224     ScreenId virtualScreenId, sptr<ScreenGroup> group, sptr<ScreenGroupChangeListener> screenGroupChangeListener)
225 {
226     auto pair = screenGroupChangeListener->changeFuture_.GetResult(TIME_OUT);
227     screenGroupChangeListener->changeFuture_.Reset(
228         std::make_pair(SCREEN_ID_INVALID, ScreenGroupChangeEvent::REMOVE_FROM_GROUP));
229     ASSERT_EQ(virtualScreenId, pair.first);
230     ASSERT_EQ(event, pair.second);
231     ASSERT_EQ(combination, group->GetCombination());
232 }
233 
CheckScreenGroupStateForMirror(ScreenGroupChangeEvent event,std::vector<ScreenId> mirrorIds,sptr<VirtualScreenGroupChangeListenerFuture> virtualScreenGroupChangeListener)234 void ScreenManagerTest::CheckScreenGroupStateForMirror(ScreenGroupChangeEvent event, std::vector<ScreenId> mirrorIds,
235     sptr<VirtualScreenGroupChangeListenerFuture> virtualScreenGroupChangeListener)
236 {
237     auto info = virtualScreenGroupChangeListener->mirrorChangeFuture_.GetResult(TIME_OUT);
238     virtualScreenGroupChangeListener->mirrorChangeFuture_.Reset({ScreenGroupChangeEvent::CHANGE_GROUP, "", {}});
239     ASSERT_EQ(info.event, event);
240     ASSERT_EQ(info.ids, mirrorIds);
241     ASSERT_GE(info.trigger.size(), 0UL);
242 }
243 
244 #define CHECK_SCREEN_STATE_AFTER_DESTROY_VIRTUAL_SCREEN \
245     { \
246         auto screenId = screenListener->disconnectFuture_.GetResult(TIME_OUT); \
247         screenListener->disconnectFuture_.Reset(SCREEN_ID_INVALID); \
248         ASSERT_EQ(virtualScreenId, screenId); \
249     }
250 
251 namespace {
252 /**
253  * @tc.name: ScreenManager01
254  * @tc.desc: Create a virtual screen and destroy it
255  * @tc.type: FUNC
256  */
257 HWTEST_F(ScreenManagerTest, ScreenManager01, Function | MediumTest | Level2)
258 {
259     DisplayTestUtils utils;
260     ASSERT_TRUE(utils.CreateSurface());
261     defaultOption_.surface_ = utils.psurface_;
262     defaultOption_.isForShot_ = false;
263     ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
264     ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId);
265     ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId));
266 }
267 
268 /**
269  * @tc.name: ScreenManager02
270  * @tc.desc: Create a virtual screen as mirror of default screen, and destroy virtual screen
271  * @tc.type: FUNC
272  */
273 HWTEST_F(ScreenManagerTest, ScreenManager02, Function | MediumTest | Level2)
274 {
275     DisplayTestUtils utils;
276     ASSERT_TRUE(utils.CreateSurface());
277     defaultOption_.surface_ = utils.psurface_;
278     defaultOption_.isForShot_ = false;
279     ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
280     std::vector<ScreenId> mirrorIds;
281     mirrorIds.push_back(virtualScreenId);
282     ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorIds);
283     ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId);
284     ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId));
285 }
286 
287 /**
288  * @tc.name: ScreenManager03
289  * @tc.desc: Create a virtual screen and destroy it for 10 times
290  * @tc.type: FUNC
291  */
292 HWTEST_F(ScreenManagerTest, ScreenManager03, Function | MediumTest | Level2)
293 {
294     DisplayTestUtils utils;
295     defaultOption_.isForShot_ = false;
296     for (uint32_t i = 0; i < execTimes_; i++) {
297         ASSERT_TRUE(utils.CreateSurface());
298         defaultOption_.surface_ = utils.psurface_;
299         ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
300         ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId);
301         ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId));
302         usleep(sleepUs_);
303     }
304 }
305 
306 /**
307  * @tc.name: ScreenManager04
308  * @tc.desc: Create a virtual screen as mirror of default screen, and destroy virtual screen for 10 times
309  * @tc.type: FUNC
310  */
311 HWTEST_F(ScreenManagerTest, ScreenManager04, Function | MediumTest | Level2)
312 {
313     DisplayTestUtils utils;
314     defaultOption_.isForShot_ = false;
315     for (uint32_t i = 0; i < execTimes_; i++) {
316         ASSERT_TRUE(utils.CreateSurface());
317         defaultOption_.surface_ = utils.psurface_;
318         ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
319         std::vector<ScreenId> mirrorIds;
320         mirrorIds.push_back(virtualScreenId);
321         ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorIds);
322         ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId);
323         ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId));
324         usleep(sleepUs_);
325     }
326 }
327 
328 /**
329  * @tc.name: ScreenManager05
330  * @tc.desc: Compare the length and width for recording screen
331  * @tc.type: FUNC
332  */
333 HWTEST_F(ScreenManagerTest, ScreenManager05, Function | MediumTest | Level2)
334 {
335     DisplayTestUtils utils;
336     utils.SetDefaultWH(defaultDisplay_);
337     ASSERT_TRUE(utils.CreateSurface());
338     defaultOption_.surface_ = utils.psurface_;
339     defaultOption_.isForShot_ = true;
340     ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
341 
342     ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId);
343     uint32_t lastCount = -1u;
344     std::vector<ScreenId> mirrorIds;
345     mirrorIds.push_back(virtualScreenId);
346     ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorIds);
347 
348     while (utils.successCount_ < acquireFrames_ && waitCount_ <=  maxWaitCount_) {
349         if (lastCount != utils.successCount_) {
350             lastCount = utils.successCount_;
351         }
352         ASSERT_EQ(0, utils.failCount_);
353         waitCount_++;
354         usleep(sleepUs_);
355     }
356     ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId));
357     ASSERT_GT(utils.successCount_, 0);
358     ASSERT_GT(maxWaitCount_, waitCount_);
359     waitCount_ = 0;
360 }
361 
362 /**
363  * @tc.name: ScreenManager06
364  * @tc.desc: Compare the length and width for recording screen, set VirtualScreen Surface before make mirror.
365  * @tc.type: FUNC
366  */
367 HWTEST_F(ScreenManagerTest, ScreenManager06, Function | MediumTest | Level2)
368 {
369     DisplayTestUtils utils;
370     utils.SetDefaultWH(defaultDisplay_);
371     defaultOption_.surface_ = nullptr;
372     defaultOption_.isForShot_ = true;
373     ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
374     ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId);
375 
376     ASSERT_TRUE(utils.CreateSurface());
377     ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().SetVirtualScreenSurface(virtualScreenId, utils.psurface_));
378 
379     uint32_t lastCount = -1u;
380     std::vector<ScreenId> mirrorIds;
381     mirrorIds.push_back(virtualScreenId);
382     ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorIds);
383 
384     while (utils.successCount_ < acquireFrames_ && waitCount_ <=  maxWaitCount_) {
385         if (lastCount != utils.successCount_) {
386             lastCount = utils.successCount_;
387         }
388         ASSERT_EQ(0, utils.failCount_);
389         waitCount_++;
390         usleep(sleepUs_);
391     }
392     DMError res = ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId);
393     ASSERT_EQ(DMError::DM_OK, res);
394     ASSERT_GT(utils.successCount_, 0);
395     ASSERT_GT(maxWaitCount_, waitCount_);
396     waitCount_ = 0;
397 }
398 
399 /**
400  * @tc.name: ScreenManager07
401  * @tc.desc: Get and set screenMode
402  * @tc.type: FUNC
403  */
404 HWTEST_F(ScreenManagerTest, ScreenManager07, Function | MediumTest | Level2)
405 {
406     sptr<Screen> screen = ScreenManager::GetInstance().GetScreenById(defaultScreenId_);
407     auto modes = screen->GetSupportedModes();
408     auto defaultModeId = screen->GetModeId();
409     ASSERT_GT(modes.size(), 0);
410     for (uint32_t modeIdx = 0; modeIdx < modes.size(); modeIdx++) {
411         ASSERT_EQ(true, screen->SetScreenActiveMode(modeIdx));
412         sleep(TEST_SLEEP_S);
413         ASSERT_EQ(modeIdx, screen->GetModeId());
414     }
415     ASSERT_EQ(true, screen->SetScreenActiveMode(defaultModeId));
416     sleep(TEST_SLEEP_S);
417 }
418 
419 /**
420  * @tc.name: ScreenManager08
421  * @tc.desc: Create a virtual screen as expansion of default screen, and destroy virtual screen
422  * @tc.type: FUNC
423  */
424 HWTEST_F(ScreenManagerTest, ScreenManager08, Function | MediumTest | Level2)
425 {
426     DisplayTestUtils utils;
427     ASSERT_TRUE(utils.CreateSurface());
428     defaultOption_.surface_ = utils.psurface_;
429     defaultOption_.isForShot_ = false;
430     CHECK_TEST_INIT_SCREEN_STATE
431     ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
432     CHECK_SCREEN_STATE_AFTER_CREATE_VIRTUAL_SCREEN
433     CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
434     std::vector<sptr<Screen>> screens = ScreenManager::GetInstance().GetAllScreens();
435     sptr<Screen> defaultScreen = screens.front();
436     std::vector<ExpandOption> options = {{defaultScreen->GetId(), 0, 0}, {virtualScreenId, defaultWidth_, 0}};
437     ScreenId expansionGroup = ScreenManager::GetInstance().MakeExpand(options);
438     ASSERT_NE(SCREEN_ID_INVALID, expansionGroup);
439     CheckScreenGroupState(ScreenCombination::SCREEN_EXPAND, ScreenGroupChangeEvent::ADD_TO_GROUP,
440         virtualScreenId, group, screenGroupChangeListener);
441     CheckScreenStateInGroup(true, group, groupId, virtualScreen, virtualScreenId);
442     ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId));
443     CHECK_SCREEN_STATE_AFTER_DESTROY_VIRTUAL_SCREEN
444     CheckScreenGroupState(ScreenCombination::SCREEN_EXPAND, ScreenGroupChangeEvent::REMOVE_FROM_GROUP,
445         virtualScreenId, group, screenGroupChangeListener);
446     CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
447     ScreenManager::GetInstance().UnregisterScreenListener(screenListener);
448     ScreenManager::GetInstance().UnregisterScreenGroupListener(screenGroupChangeListener);
449     ScreenManager::GetInstance().UnregisterVirtualScreenGroupListener(virtualScreenGroupChangeListener);
450 }
451 
452 /**
453  * @tc.name: ScreenManager09
454  * @tc.desc: Create a virtual screen as expansion of default screen, create windowNode on virtual screen,
455  *           and destroy virtual screen
456  * @tc.type: FUNC
457  */
458 HWTEST_F(ScreenManagerTest, ScreenManager09, Function | MediumTest | Level2)
459 {
460     system::SetParameter("rosen.uni.partialrender.enabled", "0");
461     DisplayTestUtils utils;
462     ASSERT_TRUE(utils.CreateSurface());
463     defaultOption_.surface_ = utils.psurface_;
464     defaultOption_.isForShot_ = false;
465     CHECK_TEST_INIT_SCREEN_STATE
466     ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
467     CHECK_SCREEN_STATE_AFTER_CREATE_VIRTUAL_SCREEN
468     CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
469     sleep(TEST_SLEEP_S);
470     std::vector<ExpandOption> options = {{defaultScreenId_, 0, 0}, {virtualScreenId, defaultWidth_, 0}};
471     ScreenId expansionId = ScreenManager::GetInstance().MakeExpand(options);
472     CheckScreenGroupState(ScreenCombination::SCREEN_EXPAND, ScreenGroupChangeEvent::ADD_TO_GROUP,
473         virtualScreenId, group, screenGroupChangeListener);
474     CheckScreenStateInGroup(true, group, groupId, virtualScreen, virtualScreenId);
475     sleep(TEST_SLEEP_S);
476     ASSERT_NE(SCREEN_ID_INVALID, expansionId);
477     DisplayId virtualDisplayId = DisplayManager::GetInstance().GetDisplayByScreen(virtualScreenId)->GetId();
478     ASSERT_NE(DISPLAY_ID_INVALID, virtualDisplayId);
479     sptr<Window> window = CreateWindowByDisplayId(virtualDisplayId);
480     ASSERT_NE(nullptr, window);
481     ASSERT_EQ(true, DrawWindowColor(window, COLOR_RED));
482     sleep(TEST_SLEEP_S);
483     ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId));
484     CHECK_SCREEN_STATE_AFTER_DESTROY_VIRTUAL_SCREEN
485     CheckScreenGroupState(ScreenCombination::SCREEN_EXPAND, ScreenGroupChangeEvent::REMOVE_FROM_GROUP,
486         virtualScreenId, group, screenGroupChangeListener);
487     CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
488     ScreenManager::GetInstance().UnregisterScreenListener(screenListener);
489     ScreenManager::GetInstance().UnregisterScreenGroupListener(screenGroupChangeListener);
490     ScreenManager::GetInstance().UnregisterVirtualScreenGroupListener(virtualScreenGroupChangeListener);
491     sleep(TEST_SLEEP_S);
492     window->Show();
493     sleep(TEST_SLEEP_S_LONG);
494     window->Destroy();
495     sleep(TEST_SLEEP_S); // Wait for the window object to be destructed
496     system::SetParameter("rosen.uni.partialrender.enabled", "4");
497 }
498 
499 /**
500  * @tc.name: ScreenManager10
501  * @tc.desc: Create a virtual screen and destroy it for 10 times, it's not for shot.
502  * @tc.type: FUNC
503  */
504 HWTEST_F(ScreenManagerTest, ScreenManager10, Function | MediumTest | Level2)
505 {
506     DisplayTestUtils utils;
507     ASSERT_TRUE(utils.CreateSurface());
508     defaultOption_.surface_ = utils.psurface_;
509     defaultOption_.isForShot_ = false;
510     for (uint32_t i = 0; i < execTimes_; i++) {
511         CHECK_TEST_INIT_SCREEN_STATE
512         ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
513         CHECK_SCREEN_STATE_AFTER_CREATE_VIRTUAL_SCREEN
514         CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
515         ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId));
516         CHECK_SCREEN_STATE_AFTER_DESTROY_VIRTUAL_SCREEN
517         CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
518         ScreenManager::GetInstance().UnregisterScreenListener(screenListener);
519         usleep(sleepUs_);
520     }
521 }
522 
523 /**
524  * @tc.name: ScreenManager11
525  * @tc.desc: Create a virtual screen , mirror and destroy it for 10 times, it's not for shot.
526  * @tc.type: FUNC
527  * @tc.require: issueI5M2SK
528  */
529 HWTEST_F(ScreenManagerTest, ScreenManager11, Function | MediumTest | Level2)
530 {
531     DisplayTestUtils utils;
532     ASSERT_TRUE(utils.CreateSurface());
533     defaultOption_.surface_ = utils.psurface_;
534     defaultOption_.isForShot_ = false;
535     for (uint32_t i = 0; i < 10; i++) {
536         usleep(sleepUs_);
537         CHECK_TEST_INIT_SCREEN_STATE
538         ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
539         CHECK_SCREEN_STATE_AFTER_CREATE_VIRTUAL_SCREEN
540         CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
541 
542         std::vector<ScreenId> mirrorIds;
543         mirrorIds.push_back(virtualScreenId);
544         auto mirrorGroup = ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorIds);
545         ASSERT_EQ(mirrorGroup, groupId);
546         CheckScreenGroupState(ScreenCombination::SCREEN_MIRROR, ScreenGroupChangeEvent::ADD_TO_GROUP,
547             virtualScreenId, group, screenGroupChangeListener);
548         CheckScreenGroupStateForMirror(ScreenGroupChangeEvent::ADD_TO_GROUP, mirrorIds,
549             virtualScreenGroupChangeListener);
550         CheckScreenStateInGroup(true, group, groupId, virtualScreen, virtualScreenId);
551 
552         auto screen = ScreenManager::GetInstance().GetScreenById(virtualScreenId);
553         ASSERT_EQ(virtualScreenId, screen->GetId());
554         ASSERT_NE(SCREEN_ID_INVALID, screen->GetParentId());
555         ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId));
556         CHECK_SCREEN_STATE_AFTER_DESTROY_VIRTUAL_SCREEN
557         CheckScreenGroupState(ScreenCombination::SCREEN_MIRROR, ScreenGroupChangeEvent::REMOVE_FROM_GROUP,
558             virtualScreenId, group, screenGroupChangeListener);
559         CheckScreenGroupStateForMirror(ScreenGroupChangeEvent::REMOVE_FROM_GROUP, mirrorIds,
560             virtualScreenGroupChangeListener);
561         CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
562         ScreenManager::GetInstance().UnregisterScreenListener(screenListener);
563         ScreenManager::GetInstance().UnregisterScreenGroupListener(screenGroupChangeListener);
564         ScreenManager::GetInstance().UnregisterVirtualScreenGroupListener(virtualScreenGroupChangeListener);
565     }
566     usleep(sleepUs_);
567 }
568 
569 /**
570  * @tc.name: ScreenManager12
571  * @tc.desc: Create a virtual screen as expansion of default screen cancel Make mirror, and destroy virtual screen
572  * @tc.type: FUNC
573  * @tc.require: issueI5M2SK
574  */
575 HWTEST_F(ScreenManagerTest, ScreenManager12, Function | MediumTest | Level2)
576 {
577     DisplayTestUtils utils;
578     ASSERT_TRUE(utils.CreateSurface());
579     defaultOption_.surface_ = utils.psurface_;
580     defaultOption_.isForShot_ = false;
581     CHECK_TEST_INIT_SCREEN_STATE
582     ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
583     CHECK_SCREEN_STATE_AFTER_CREATE_VIRTUAL_SCREEN
584     CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
585 
586     std::vector<ScreenId> mirrorIds;
587     mirrorIds.push_back(virtualScreenId);
588     auto mirrorGroup = ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorIds);
589     ASSERT_EQ(mirrorGroup, groupId);
590     CheckScreenGroupState(ScreenCombination::SCREEN_MIRROR, ScreenGroupChangeEvent::ADD_TO_GROUP,
591         virtualScreenId, group, screenGroupChangeListener);
592     CheckScreenGroupStateForMirror(ScreenGroupChangeEvent::ADD_TO_GROUP, mirrorIds,
593         virtualScreenGroupChangeListener);
594     CheckScreenStateInGroup(true, group, groupId, virtualScreen, virtualScreenId);
595 
596     ScreenManager::GetInstance().RemoveVirtualScreenFromGroup(mirrorIds);
597     CheckScreenGroupState(ScreenCombination::SCREEN_MIRROR, ScreenGroupChangeEvent::REMOVE_FROM_GROUP,
598         virtualScreenId, group, screenGroupChangeListener);
599     CheckScreenGroupStateForMirror(ScreenGroupChangeEvent::REMOVE_FROM_GROUP, mirrorIds,
600         virtualScreenGroupChangeListener);
601     CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
602 
603     ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId));
604     CHECK_SCREEN_STATE_AFTER_DESTROY_VIRTUAL_SCREEN
605     CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
606     ScreenManager::GetInstance().UnregisterScreenListener(screenListener);
607     ScreenManager::GetInstance().UnregisterScreenGroupListener(screenGroupChangeListener);
608     ScreenManager::GetInstance().UnregisterVirtualScreenGroupListener(virtualScreenGroupChangeListener);
609     usleep(sleepUs_);
610 }
611 
612 /**
613  * @tc.name: ScreenManager13
614  * @tc.desc: Create a virtual screen as expansion of default screen cancel MakeExpand, and destroy virtual screen
615  * @tc.type: FUNC
616  */
617 HWTEST_F(ScreenManagerTest, ScreenManager13, Function | MediumTest | Level2)
618 {
619     DisplayTestUtils utils;
620     ASSERT_TRUE(utils.CreateSurface());
621     defaultOption_.surface_ = utils.psurface_;
622     defaultOption_.isForShot_ = false;
623     CHECK_TEST_INIT_SCREEN_STATE
624     ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
625     CHECK_SCREEN_STATE_AFTER_CREATE_VIRTUAL_SCREEN
626     CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
627 
628     std::vector<sptr<Screen>> screens = ScreenManager::GetInstance().GetAllScreens();
629     sptr<Screen> DefaultScreen = screens.front();
630     std::vector<ExpandOption> options = {{DefaultScreen->GetId(), 0, 0}, {virtualScreenId, defaultWidth_, 0}};
631     ScreenId expansionGroup = ScreenManager::GetInstance().MakeExpand(options);
632     ASSERT_NE(SCREEN_ID_INVALID, expansionGroup);
633     CheckScreenGroupState(ScreenCombination::SCREEN_EXPAND, ScreenGroupChangeEvent::ADD_TO_GROUP,
634         virtualScreenId, group, screenGroupChangeListener);
635     CheckScreenStateInGroup(true, group, groupId, virtualScreen, virtualScreenId);
636 
637     std::vector<ScreenId> cancelScreens;
638     cancelScreens.emplace_back(virtualScreenId);
639     ScreenManager::GetInstance().RemoveVirtualScreenFromGroup(cancelScreens);
640     CheckScreenGroupState(ScreenCombination::SCREEN_EXPAND, ScreenGroupChangeEvent::REMOVE_FROM_GROUP,
641         virtualScreenId, group, screenGroupChangeListener);
642     CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
643 
644     ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId));
645     CHECK_SCREEN_STATE_AFTER_DESTROY_VIRTUAL_SCREEN
646     CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
647     ScreenManager::GetInstance().UnregisterScreenListener(screenListener);
648     ScreenManager::GetInstance().UnregisterScreenGroupListener(screenGroupChangeListener);
649     ScreenManager::GetInstance().UnregisterVirtualScreenGroupListener(virtualScreenGroupChangeListener);
650     usleep(sleepUs_);
651 }
652 
653 /**
654  * @tc.name: ScreenManager14
655  * @tc.desc: Create a virtual screen, make expand to make mirror, and destroy virtual screen
656  * @tc.type: FUNC
657  */
658 HWTEST_F(ScreenManagerTest, ScreenManager14, Function | MediumTest | Level2)
659 {
660     DisplayTestUtils utils;
661     ASSERT_TRUE(utils.CreateSurface());
662     defaultOption_.surface_ = utils.psurface_;
663     defaultOption_.isForShot_ = false;
664     CHECK_TEST_INIT_SCREEN_STATE
665     ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
666     CHECK_SCREEN_STATE_AFTER_CREATE_VIRTUAL_SCREEN
667     CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
668 
669     std::vector<sptr<Screen>> screens = ScreenManager::GetInstance().GetAllScreens();
670     sptr<Screen> DefaultScreen = screens.front();
671     std::vector<ExpandOption> options = {{DefaultScreen->GetId(), 0, 0}, {virtualScreenId, defaultWidth_, 0}};
672     ScreenId expansionGroup = ScreenManager::GetInstance().MakeExpand(options);
673     ASSERT_EQ(expansionGroup, groupId);
674     CheckScreenGroupState(ScreenCombination::SCREEN_EXPAND, ScreenGroupChangeEvent::ADD_TO_GROUP,
675         virtualScreenId, group, screenGroupChangeListener);
676     CheckScreenStateInGroup(true, group, groupId, virtualScreen, virtualScreenId);
677 
678     std::vector<ScreenId> mirrorScreens;
679     mirrorScreens.emplace_back(virtualScreenId);
680     auto mirrorGroup = ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorScreens);
681     ASSERT_EQ(mirrorGroup, groupId);
682     CheckScreenGroupState(ScreenCombination::SCREEN_MIRROR, ScreenGroupChangeEvent::CHANGE_GROUP,
683         virtualScreenId, group, screenGroupChangeListener);
684     CheckScreenStateInGroup(true, group, groupId, virtualScreen, virtualScreenId);
685 
686     ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId));
687     CHECK_SCREEN_STATE_AFTER_DESTROY_VIRTUAL_SCREEN
688     CheckScreenGroupState(ScreenCombination::SCREEN_MIRROR, ScreenGroupChangeEvent::REMOVE_FROM_GROUP,
689         virtualScreenId, group, screenGroupChangeListener);
690     CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
691 
692     ScreenManager::GetInstance().UnregisterScreenListener(screenListener);
693     ScreenManager::GetInstance().UnregisterScreenGroupListener(screenGroupChangeListener);
694     ScreenManager::GetInstance().UnregisterVirtualScreenGroupListener(virtualScreenGroupChangeListener);
695     usleep(sleepUs_);
696 }
697 
698 /**
699  * @tc.name: ScreenManager15
700  * @tc.desc: Create a virtual screen, make mirror to make expand, and destroy virtual screen
701  * @tc.type: FUNC
702  * @tc.require: issueI5M2SK
703  */
704 HWTEST_F(ScreenManagerTest, ScreenManager15, Function | MediumTest | Level2)
705 {
706     DisplayTestUtils utils;
707     ASSERT_TRUE(utils.CreateSurface());
708     defaultOption_.surface_ = utils.psurface_;
709     defaultOption_.isForShot_ = false;
710 
711     CHECK_TEST_INIT_SCREEN_STATE
712     ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
713     CHECK_SCREEN_STATE_AFTER_CREATE_VIRTUAL_SCREEN
714     CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
715 
716     std::vector<ScreenId> mirrorScreens;
717     mirrorScreens.emplace_back(virtualScreenId);
718     auto mirrorGroup = ScreenManager::GetInstance().MakeMirror(defaultScreenId_, mirrorScreens);
719     ASSERT_EQ(mirrorGroup, groupId);
720     CheckScreenGroupState(ScreenCombination::SCREEN_MIRROR, ScreenGroupChangeEvent::ADD_TO_GROUP,
721         virtualScreenId, group, screenGroupChangeListener);
722     CheckScreenGroupStateForMirror(ScreenGroupChangeEvent::ADD_TO_GROUP, mirrorScreens,
723         virtualScreenGroupChangeListener);
724     CheckScreenStateInGroup(true, group, groupId, virtualScreen, virtualScreenId);
725 
726     std::vector<sptr<Screen>> screens = ScreenManager::GetInstance().GetAllScreens();
727     sptr<Screen> defaultScreen = screens.front();
728     std::vector<ExpandOption> options = {{defaultScreen->GetId(), 0, 0}, {virtualScreenId, defaultWidth_, 0}};
729     ScreenId expansionGroup = ScreenManager::GetInstance().MakeExpand(options);
730     ASSERT_EQ(expansionGroup, groupId);
731     CheckScreenGroupState(ScreenCombination::SCREEN_EXPAND, ScreenGroupChangeEvent::CHANGE_GROUP,
732         virtualScreenId, group, screenGroupChangeListener);
733     CheckScreenStateInGroup(true, group, groupId, virtualScreen, virtualScreenId);
734 
735     ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId));
736     CHECK_SCREEN_STATE_AFTER_DESTROY_VIRTUAL_SCREEN
737     CheckScreenGroupState(ScreenCombination::SCREEN_EXPAND, ScreenGroupChangeEvent::REMOVE_FROM_GROUP,
738         virtualScreenId, group, screenGroupChangeListener);
739     CheckScreenStateInGroup(false, group, groupId, virtualScreen, virtualScreenId);
740 
741     ScreenManager::GetInstance().UnregisterScreenListener(screenListener);
742     ScreenManager::GetInstance().UnregisterScreenGroupListener(screenGroupChangeListener);
743     ScreenManager::GetInstance().UnregisterVirtualScreenGroupListener(virtualScreenGroupChangeListener);
744     usleep(sleepUs_);
745 }
746 
747 /**
748  * @tc.name: ScreenManager16
749  * @tc.desc: Screen orientation.
750  * @tc.type: FUNC
751  * @tc.require: issueI5NDLK
752  */
753 HWTEST_F(ScreenManagerTest, ScreenManager16, Function | MediumTest | Level2)
754 {
755     auto screens = ScreenManager::GetInstance().GetAllScreens();
756     auto display = DisplayManager::GetInstance().GetDefaultDisplay();
757     uint32_t orientation = static_cast<uint32_t>(Orientation::VERTICAL);
758     uint32_t end = static_cast<uint32_t>(Orientation::REVERSE_HORIZONTAL);
759     sptr<ScreenChangeListener> screenListener = new ScreenChangeListener();
760     ScreenManager::GetInstance().RegisterScreenListener(screenListener);
761     for (; orientation <= end; ++orientation) {
762         usleep(sleepUs_);
763         screens[0]->SetOrientation(static_cast<Orientation>(orientation));
764         ScreenId screenId = screenListener->changeFuture_.GetResult(TIME_OUT);
765         ASSERT_EQ(screenId, screens[0]->GetId());
766         usleep(1E6);
767         ASSERT_EQ(static_cast<uint32_t>(screens[0]->GetOrientation()), orientation);
768         ASSERT_EQ(static_cast<uint32_t>(display->GetOrientation()), orientation);
769     }
770     screens[0]->SetOrientation(Orientation::UNSPECIFIED);
771     ASSERT_EQ(static_cast<uint32_t>(screens[0]->GetOrientation()), static_cast<uint32_t>(Orientation::UNSPECIFIED));
772     ASSERT_EQ(static_cast<uint32_t>(display->GetOrientation()), static_cast<uint32_t>(Orientation::UNSPECIFIED));
773     ScreenManager::GetInstance().UnregisterScreenListener(screenListener);
774     usleep(sleepUs_);
775 }
776 
777 /**
778  * @tc.name: ScreenManager17
779  * @tc.desc: Create VirtualScreen for 10 times but do not destroy it
780  * @tc.type: FUNC
781  */
782 HWTEST_F(ScreenManagerTest, ScreenManager17, Function | MediumTest | Level2)
783 {
784     DisplayTestUtils utils;
785     defaultOption_.isForShot_ = false;
786     for (uint32_t i = 0; i < execTimes_; i++) {
787         usleep(sleepUs_);
788         ASSERT_TRUE(utils.CreateSurface());
789         defaultOption_.surface_ = utils.psurface_;
790         ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption_);
791         ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId);
792     }
793     usleep(sleepUs_);
794 }
795 
796 /**
797  * @tc.name: ScreenManager18
798  * @tc.desc: Set screen rotation lock, and check whether screen rotation lock is Locked.
799  * @tc.type: FUNC
800  */
801 HWTEST_F(ScreenManagerTest, ScreenManager18, Function | SmallTest | Level1)
802 {
803     bool originalLockStatus = ScreenManager::GetInstance().IsScreenRotationLocked();
804     ScreenManager::GetInstance().SetScreenRotationLocked(!originalLockStatus);
805     bool modifiedLockedStatus = ScreenManager::GetInstance().IsScreenRotationLocked();
806     ScreenManager::GetInstance().SetScreenRotationLocked(originalLockStatus);
807     ASSERT_EQ(!originalLockStatus, modifiedLockedStatus);
808     usleep(sleepUs_);
809 }
810 }
811 } // namespace Rosen
812 } // namespace OHOS
813