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