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