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 "display_manager.h"
18 #include "screen_manager.h"
19 #include "screen_manager_utils.h"
20 #include "mock_display_manager_adapter.h"
21 #include "singleton_mocker.h"
22 #include "screen_manager.cpp"
23
24 using namespace testing;
25 using namespace testing::ext;
26
27 namespace OHOS {
28 namespace Rosen {
29 using Mocker = SingletonMocker<ScreenManagerAdapter, MockScreenManagerAdapter>;
30 class DmMockScreenListener : public ScreenManager::IScreenListener {
31 public:
OnConnect(ScreenId)32 void OnConnect(ScreenId) override {}
OnDisconnect(ScreenId)33 void OnDisconnect(ScreenId) override {}
OnChange(ScreenId)34 void OnChange(ScreenId) override {}
35 };
36
37 class TestScreenGroupListener : public ScreenManager::IScreenGroupListener {
38 public:
OnChange(const std::vector<ScreenId> &,ScreenGroupChangeEvent)39 void OnChange(const std::vector<ScreenId>&, ScreenGroupChangeEvent) override {};
40 };
41
42 class TestIVirtualScreenGroupListener : public ScreenManager::IVirtualScreenGroupListener {
43 public:
OnMirrorChange(const ChangeInfo & info)44 void OnMirrorChange(const ChangeInfo& info) override {};
45 };
46 class ScreenManagerTest : public testing::Test {
47 public:
48 static void SetUpTestCase();
49 static void TearDownTestCase();
50 virtual void SetUp() override;
51 virtual void TearDown() override;
52
53 const std::string defaultName_ = "virtualScreen01";
54 const float defaultDensity_ = 2.0;
55 const int32_t defaultFlags_ = 0;
56 static sptr<Display> defaultDisplay_;
57 static uint32_t defaultWidth_;
58 static uint32_t defaultHeight_;
59 };
60 sptr<Display> ScreenManagerTest::defaultDisplay_ = nullptr;
61 uint32_t ScreenManagerTest::defaultWidth_ = 480;
62 uint32_t ScreenManagerTest::defaultHeight_ = 320;
63
SetUpTestCase()64 void ScreenManagerTest::SetUpTestCase()
65 {
66 defaultDisplay_ = DisplayManager::GetInstance().GetDefaultDisplay();
67 defaultWidth_ = defaultDisplay_->GetWidth();
68 defaultHeight_ = defaultDisplay_->GetHeight();
69 }
70
TearDownTestCase()71 void ScreenManagerTest::TearDownTestCase()
72 {
73 }
74
SetUp()75 void ScreenManagerTest::SetUp()
76 {
77 }
78
TearDown()79 void ScreenManagerTest::TearDown()
80 {
81 }
82
83 namespace {
84 /**
85 * @tc.name: CreateAndDestroy01
86 * @tc.desc: CreateVirtualScreen with invalid option and return invalid screen id
87 * @tc.type: FUNC
88 */
89 HWTEST_F(ScreenManagerTest, CreateAndDestroy01, Function | SmallTest | Level1)
90 {
91 VirtualScreenOption wrongOption = {defaultName_, defaultWidth_, defaultHeight_,
92 defaultDensity_, nullptr, defaultFlags_};
93 std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
94 EXPECT_CALL(m->Mock(), CreateVirtualScreen(_, _)).Times(1).WillOnce(Return(SCREEN_ID_INVALID));
95 EXPECT_CALL(m->Mock(), DestroyVirtualScreen(_)).Times(1).WillOnce(Return(DMError::DM_ERROR_INVALID_PARAM));
96 ScreenId id = ScreenManager::GetInstance().CreateVirtualScreen(wrongOption);
97 DMError ret = ScreenManager::GetInstance().DestroyVirtualScreen(id);
98 ASSERT_EQ(SCREEN_ID_INVALID, id);
99 ASSERT_EQ(DMError::DM_ERROR_INVALID_PARAM, ret);
100 }
101
102 /**
103 * @tc.name: CreateAndDestroy02
104 * @tc.desc: CreateVirtualScreen with valid option and return valid screen id
105 * @tc.type: FUNC
106 */
107 HWTEST_F(ScreenManagerTest, CreateAndDestroy02, Function | SmallTest | Level1)
108 {
109 ScreenManagerUtils utils;
110 ASSERT_TRUE(utils.CreateSurface());
111 VirtualScreenOption defaultOption = {defaultName_, defaultWidth_, defaultHeight_,
112 defaultDensity_, utils.psurface_, defaultFlags_};
113 ScreenId validId = 0;
114 std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
115 EXPECT_CALL(m->Mock(), CreateVirtualScreen(_, _)).Times(1).WillOnce(Return(validId));
116 EXPECT_CALL(m->Mock(), DestroyVirtualScreen(_)).Times(1).WillOnce(Return(DMError::DM_OK));
117 ScreenId id = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption);
118 DMError ret = ScreenManager::GetInstance().DestroyVirtualScreen(id);
119 ASSERT_EQ(validId, id);
120 ASSERT_EQ(DMError::DM_OK, ret);
121 }
122
123 /**
124 * @tc.name: MakeExpand_001
125 * @tc.desc: Create a virtual screen as expansion of default screen, return default screen id
126 * @tc.type: FUNC
127 */
128 HWTEST_F(ScreenManagerTest, MakeExpand_001, Function | SmallTest | Level1)
129 {
130 ScreenManagerUtils utils;
131 ASSERT_TRUE(utils.CreateSurface());
132 VirtualScreenOption defaultOption = {defaultName_, defaultWidth_, defaultHeight_,
133 defaultDensity_, utils.psurface_, defaultFlags_};
134 ScreenId validId = 0; // default srceenId(0)
135 ScreenId virtualScreenId = 1; // VirtualScreen is the second screen(1)
136 std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
137 EXPECT_CALL(m->Mock(), CreateVirtualScreen(_, _)).Times(1).WillOnce(Return(virtualScreenId));
138 EXPECT_CALL(m->Mock(), DestroyVirtualScreen(_)).Times(1).WillOnce(Return(DMError::DM_OK));
139 EXPECT_CALL(m->Mock(), MakeExpand(_, _)).Times(1).WillOnce(Return(0));
140 ScreenId vScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption);
141 std::vector<ExpandOption> options = {{validId, 0, 0}, {vScreenId, defaultWidth_, 0}};
142 ScreenId expansionId = ScreenManager::GetInstance().MakeExpand(options);
143 ASSERT_EQ(expansionId, validId);
144 DMError ret = ScreenManager::GetInstance().DestroyVirtualScreen(vScreenId);
145 ASSERT_EQ(vScreenId, virtualScreenId);
146 ASSERT_EQ(DMError::DM_OK, ret);
147 }
148
149 /**
150 * @tc.name: MakeExpand_002
151 * @tc.desc: Makepand with empty ExpandOption, return SCREEN_ID_INVALID
152 * @tc.type: FUNC
153 */
154 HWTEST_F(ScreenManagerTest, MakeExpand_002, Function | SmallTest | Level1)
155 {
156 ScreenId invalidId = SCREEN_ID_INVALID;
157 std::vector<ExpandOption> options = {};
158 ScreenId expansionId = ScreenManager::GetInstance().MakeExpand(options);
159 ASSERT_EQ(expansionId, invalidId);
160 }
161
162 /**
163 * @tc.name: SetSurface01
164 * @tc.desc: SetVirtualScreenSurface with valid option and return success
165 * @tc.type: FUNC
166 */
167 HWTEST_F(ScreenManagerTest, SetSurface01, Function | SmallTest | Level1)
168 {
169 ScreenManagerUtils utils;
170 ASSERT_TRUE(utils.CreateSurface());
171 VirtualScreenOption defaultOption = {defaultName_, defaultWidth_, defaultHeight_,
172 defaultDensity_, nullptr, defaultFlags_};
173 ScreenId validId = 0;
174 std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
175 EXPECT_CALL(m->Mock(), CreateVirtualScreen(_, _)).Times(1).WillOnce(Return(validId));
176 EXPECT_CALL(m->Mock(), SetVirtualScreenSurface(_, _)).Times(1).WillOnce(Return(DMError::DM_OK));
177 EXPECT_CALL(m->Mock(), DestroyVirtualScreen(_)).Times(1).WillOnce(Return(DMError::DM_OK));
178 ScreenId id = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption);
179 DMError surfaceRes = ScreenManager::GetInstance().SetVirtualScreenSurface(id, utils.psurface_);
180 DMError destroyRes = ScreenManager::GetInstance().DestroyVirtualScreen(id);
181 ASSERT_EQ(validId, id);
182 ASSERT_EQ(DMError::DM_OK, surfaceRes);
183 ASSERT_EQ(DMError::DM_OK, destroyRes);
184 }
185
186 /**
187 * @tc.name: SetSurface02
188 * @tc.desc: SetVirtualScreenSurface with invalid option and return failed
189 * @tc.type: FUNC
190 */
191 HWTEST_F(ScreenManagerTest, SetSurface02, Function | SmallTest | Level1)
192 {
193 ScreenManagerUtils utils;
194 ASSERT_TRUE(utils.CreateSurface());
195 VirtualScreenOption defaultOption = {defaultName_, defaultWidth_, defaultHeight_,
196 defaultDensity_, nullptr, defaultFlags_};
197 std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
198 EXPECT_CALL(m->Mock(), CreateVirtualScreen(_, _)).Times(1).WillOnce(Return(SCREEN_ID_INVALID));
199 EXPECT_CALL(m->Mock(), SetVirtualScreenSurface(_, _)).Times(1).WillOnce(Return(DMError::DM_ERROR_INVALID_PARAM));
200 EXPECT_CALL(m->Mock(), DestroyVirtualScreen(_)).Times(1).WillOnce(Return(DMError::DM_ERROR_INVALID_PARAM));
201 ScreenId id = ScreenManager::GetInstance().CreateVirtualScreen(defaultOption);
202 DMError surfaceRes = ScreenManager::GetInstance().SetVirtualScreenSurface(id, utils.psurface_);
203 DMError destroyRes = ScreenManager::GetInstance().DestroyVirtualScreen(id);
204 ASSERT_EQ(SCREEN_ID_INVALID, id);
205 ASSERT_EQ(DMError::DM_ERROR_INVALID_PARAM, surfaceRes);
206 ASSERT_EQ(DMError::DM_ERROR_INVALID_PARAM, destroyRes);
207 }
208
209 /**
210 * @tc.name: OnScreenConnect01
211 * @tc.desc: OnScreenConnect
212 * @tc.type: FUNC
213 */
214 HWTEST_F(ScreenManagerTest, OnScreenConnect01, Function | SmallTest | Level1)
215 {
216 std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
217 EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(true));
218 sptr<ScreenManager::IScreenListener> listener = new DmMockScreenListener();
219 ScreenManager::GetInstance().RegisterScreenListener(listener);
220 auto screenManagerListener = ScreenManager::GetInstance().pImpl_->screenManagerListener_;
221 ASSERT_NE(screenManagerListener, nullptr);
222 screenManagerListener->OnScreenConnect(nullptr);
223 sptr<ScreenInfo> screenInfo = new ScreenInfo();
224 screenInfo->SetScreenId(SCREEN_ID_INVALID);
225 screenManagerListener->OnScreenConnect(screenInfo);
226 screenInfo->SetScreenId(0);
227 screenManagerListener->OnScreenConnect(screenInfo);
228 ASSERT_NE(screenManagerListener->pImpl_, nullptr);
229 screenManagerListener->pImpl_ = nullptr;
230 screenManagerListener->OnScreenConnect(screenInfo);
231 ScreenManager::GetInstance().pImpl_->screenManagerListener_ = nullptr;
232 }
233
234 /**
235 * @tc.name: OnScreenDisconnect01
236 * @tc.desc: OnScreenDisconnect
237 * @tc.type: FUNC
238 */
239 HWTEST_F(ScreenManagerTest, OnScreenDisconnect01, Function | SmallTest | Level1)
240 {
241 std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
242 EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(true));
243 sptr<ScreenManager::IScreenListener> listener = new DmMockScreenListener();
244 ScreenManager::GetInstance().RegisterScreenListener(listener);
245 auto screenManagerListener = ScreenManager::GetInstance().pImpl_->screenManagerListener_;
246 ASSERT_NE(screenManagerListener, nullptr);
247 screenManagerListener->OnScreenDisconnect(SCREEN_ID_INVALID);
248 ASSERT_NE(screenManagerListener->pImpl_, nullptr);
249 screenManagerListener->pImpl_ = nullptr;
250 screenManagerListener->OnScreenDisconnect(0);
251 ScreenManager::GetInstance().pImpl_->screenManagerListener_ = nullptr;
252 }
253
254 /**
255 * @tc.name: OnScreenChange01
256 * @tc.desc: OnScreenChange
257 * @tc.type: FUNC
258 */
259 HWTEST_F(ScreenManagerTest, OnScreenChange01, Function | SmallTest | Level1)
260 {
261 std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
262 EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(true));
263 sptr<ScreenManager::IScreenListener> listener = new DmMockScreenListener();
264 ScreenManager::GetInstance().RegisterScreenListener(listener);
265 auto screenManagerListener = ScreenManager::GetInstance().pImpl_->screenManagerListener_;
266 ASSERT_NE(screenManagerListener, nullptr);
267 screenManagerListener->OnScreenChange(nullptr, ScreenChangeEvent::UPDATE_ORIENTATION);
268 ASSERT_NE(screenManagerListener->pImpl_, nullptr);
269 sptr<ScreenInfo> screenInfo = new ScreenInfo();
270 screenManagerListener->pImpl_ = nullptr;
271 screenManagerListener->OnScreenChange(screenInfo, ScreenChangeEvent::UPDATE_ORIENTATION);
272 ScreenManager::GetInstance().pImpl_->screenManagerListener_ = nullptr;
273 }
274
275 /**
276 * @tc.name: OnScreenGroupChange01
277 * @tc.desc: OnScreenGroupChange
278 * @tc.type: FUNC
279 */
280 HWTEST_F(ScreenManagerTest, OnScreenGroupChange01, Function | SmallTest | Level1)
281 {
282 std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
283 EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(true));
284 sptr<ScreenManager::IScreenListener> listener = new DmMockScreenListener();
285 ScreenManager::GetInstance().RegisterScreenListener(listener);
286 auto screenManagerListener = ScreenManager::GetInstance().pImpl_->screenManagerListener_;
287 ASSERT_NE(screenManagerListener, nullptr);
288 std::string trigger;
289 std::vector<sptr<ScreenInfo>> screenInfos;
290 ScreenGroupChangeEvent groupEvent = ScreenGroupChangeEvent::CHANGE_GROUP;
291 screenManagerListener->OnScreenGroupChange(trigger, screenInfos, groupEvent);
292 ASSERT_NE(screenManagerListener->pImpl_, nullptr);
293 sptr<ScreenInfo> screenInfo = new ScreenInfo();
294 screenInfo->SetScreenId(1);
295 sptr<ScreenInfo> screenInfo2 = new ScreenInfo();
296 screenInfos.emplace_back(screenInfo);
297 screenInfos.emplace_back(screenInfo2);
298 screenManagerListener->OnScreenGroupChange(trigger, screenInfos, groupEvent);
299 screenManagerListener->pImpl_ = nullptr;
300 screenManagerListener->OnScreenGroupChange(trigger, screenInfos, groupEvent);
301 ScreenManager::GetInstance().pImpl_->screenManagerListener_ = nullptr;
302 }
303 /**
304 * @tc.name: RemoveVirtualScreenFromGroup
305 * @tc.desc: for interface coverage & check func RemoveVirtualScreenFromGroup
306 * @tc.type: FUNC
307 */
308 HWTEST_F(ScreenManagerTest, RemoveVirtualScreenFromGroup, Function | SmallTest | Level1)
309 {
310 std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
311 std::vector<ScreenId> testScreens(33, 1);
312 auto result = ScreenManager::GetInstance().RemoveVirtualScreenFromGroup(testScreens);
313 ASSERT_EQ(DMError::DM_ERROR_INVALID_PARAM, result);
314
315 testScreens.clear();
316 result = ScreenManager::GetInstance().RemoveVirtualScreenFromGroup(testScreens);
317 ASSERT_EQ(DMError::DM_ERROR_INVALID_PARAM, result);
318
319 testScreens.emplace_back(static_cast<ScreenId>(1));
320 EXPECT_CALL(m->Mock(), RemoveVirtualScreenFromGroup(_)).Times(1);
321 result = ScreenManager::GetInstance().RemoveVirtualScreenFromGroup(testScreens);
322 ASSERT_EQ(DMError::DM_OK, result);
323 }
324 /**
325 * @tc.name: SetScreenRotationLocked
326 * @tc.desc: for interface coverage & check SetScreenRotationLocked
327 * @tc.type: FUNC
328 */
329 HWTEST_F(ScreenManagerTest, SetScreenRotationLocked, Function | SmallTest | Level1)
330 {
331 std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
332
333 EXPECT_CALL(m->Mock(), SetScreenRotationLocked(_)).Times(1);
334 auto result = ScreenManager::GetInstance().SetScreenRotationLocked(true);
335 ASSERT_EQ(DMError::DM_OK, result);
336 }
337
338 /**
339 * @tc.name: IsScreenRotationLocked
340 * @tc.desc: for interface coverage & check IsScreenRotationLocked
341 * @tc.type: FUNC
342 */
343 HWTEST_F(ScreenManagerTest, IsScreenRotationLocked, Function | SmallTest | Level1)
344 {
345 std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
346
347 EXPECT_CALL(m->Mock(), IsScreenRotationLocked()).Times(1).WillOnce(Return(true));
348 auto result = ScreenManager::GetInstance().IsScreenRotationLocked();
349 ASSERT_EQ(true, result);
350 EXPECT_CALL(m->Mock(), IsScreenRotationLocked()).Times(1).WillOnce(Return(false));
351 result = ScreenManager::GetInstance().IsScreenRotationLocked();
352 ASSERT_EQ(false, result);
353 }
354
355 /**
356 * @tc.name: RegisterScreenGroupListener
357 * @tc.desc: for interface coverage and
358 * check RegisterScreenGroupListener & UnregisterScreenGroupListener
359 * @tc.type: FUNC
360 */
361 HWTEST_F(ScreenManagerTest, RegisterScreenGroupListener, Function | SmallTest | Level1)
362 {
363 std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
364 auto& screenManager = ScreenManager::GetInstance();
365 auto result = screenManager.RegisterScreenGroupListener(nullptr);
366 ASSERT_EQ(false, result);
367
368 sptr<ScreenManager::IScreenGroupListener> listener = new (std::nothrow)TestScreenGroupListener();
369 if (screenManager.pImpl_->screenManagerListener_ == nullptr) {
370 EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(true));
371 }
372 result = screenManager.RegisterScreenGroupListener(listener);
373 ASSERT_EQ(true, result);
374
375 result = screenManager.UnregisterScreenGroupListener(nullptr);
376 ASSERT_EQ(false, result);
377
378 auto sizeScreen = screenManager.pImpl_->screenListeners_.size();
379 auto sizeScreenGroup = screenManager.pImpl_->screenGroupListeners_.size();
380 auto sizeVirtualScreen = screenManager.pImpl_->virtualScreenGroupListeners_.size();
381 if (sizeScreenGroup > 1) {
382 result = screenManager.UnregisterScreenGroupListener(listener);
383 ASSERT_EQ(true, result);
384 } else if (sizeScreenGroup == 1) {
385 if (sizeScreen == 0 && sizeVirtualScreen == 0) {
386 EXPECT_CALL(m->Mock(), UnregisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(true));
387 }
388 result = screenManager.UnregisterScreenGroupListener(listener);
389 ASSERT_EQ(true, result);
390 }
391 }
392 /**
393 * @tc.name: RegisterVirtualScreenGroupListener
394 * @tc.desc: for interface coverage and
395 * check RegisterVirtualScreenGroupListener & UnregisterVirtualScreenGroupListener
396 * @tc.type: FUNC
397 */
398 HWTEST_F(ScreenManagerTest, RegisterVirtualScreenGroupListener, Function | SmallTest | Level1)
399 {
400 std::unique_ptr<Mocker> m = std::make_unique<Mocker>();
401 auto& screenManager = ScreenManager::GetInstance();
402 auto result = screenManager.RegisterVirtualScreenGroupListener(nullptr);
403 ASSERT_EQ(false, result);
404
405 sptr<ScreenManager::IVirtualScreenGroupListener> listener = new (std::nothrow)TestIVirtualScreenGroupListener();
406 if (screenManager.pImpl_->screenManagerListener_ == nullptr) {
407 EXPECT_CALL(m->Mock(), RegisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(true));
408 }
409 result = screenManager.RegisterVirtualScreenGroupListener(listener);
410 ASSERT_EQ(true, result);
411
412 result = screenManager.UnregisterVirtualScreenGroupListener(nullptr);
413 ASSERT_EQ(false, result);
414
415 auto sizeScreen = screenManager.pImpl_->screenListeners_.size();
416 auto sizeScreenGroup = screenManager.pImpl_->screenGroupListeners_.size();
417 auto sizeVirtualScreen = screenManager.pImpl_->virtualScreenGroupListeners_.size();
418
419 if (sizeVirtualScreen > 1) {
420 result = screenManager.UnregisterVirtualScreenGroupListener(listener);
421 ASSERT_EQ(true, result);
422 } else if (sizeVirtualScreen == 1) {
423 if (sizeScreen == 0 && sizeScreenGroup == 0) {
424 EXPECT_CALL(m->Mock(), UnregisterDisplayManagerAgent(_, _)).Times(1).WillOnce(Return(true));
425 }
426 result = screenManager.UnregisterVirtualScreenGroupListener(listener);
427 ASSERT_EQ(true, result);
428 }
429 }
430 }
431 } // namespace Rosen
432 } // namespace OHOS