• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 <bundlemgr/launcher_service.h>
18 #include "session/host/include/multi_instance_manager.h"
19 #include "session/host/include/scene_session.h"
20 #include "mock/mock_ibundle_mgr.h"
21 #include "common/include/task_scheduler.h"
22 
23 using namespace testing;
24 using namespace testing::ext;
25 
26 namespace OHOS {
27 namespace Rosen {
28 namespace {
29 const std::string BUNDLE_NAME = "bundleName";
30 const int32_t USER_ID{ 100 };
31 const int32_t SLEEP_TIME{ 10000 };
32 } // namespace
33 class MultiInstanceManagerTest : public testing::Test {
34 public:
35     static void SetUpTestCase();
36     static void TearDownTestCase();
37     void SetUp() override;
38     void TearDown() override;
39 
40 private:
41     sptr<SceneSession> GetSceneSession(const std::string& instanceKey = "");
42     void Init(AppExecFwk::MultiAppModeType modeType, uint32_t maxCount);
43     std::shared_ptr<TaskScheduler> GetTaskScheduler();
44 };
45 
SetUpTestCase()46 void MultiInstanceManagerTest::SetUpTestCase() {}
47 
TearDownTestCase()48 void MultiInstanceManagerTest::TearDownTestCase() {}
49 
SetUp()50 void MultiInstanceManagerTest::SetUp() {}
51 
TearDown()52 void MultiInstanceManagerTest::TearDown()
53 {
54     sptr<IBundleMgrMocker> bundleMgrMocker = sptr<IBundleMgrMocker>::MakeSptr();
55     EXPECT_CALL(*bundleMgrMocker, GetApplicationInfo(_, _, _, _)).WillOnce(Return(false));
56     MultiInstanceManager::GetInstance().Init(bundleMgrMocker, GetTaskScheduler());
57     MultiInstanceManager::GetInstance().RefreshAppInfo(BUNDLE_NAME);
58 }
59 
GetSceneSession(const std::string & instanceKey)60 sptr<SceneSession> MultiInstanceManagerTest::GetSceneSession(const std::string& instanceKey)
61 {
62     SessionInfo info;
63     info.bundleName_ = BUNDLE_NAME;
64     info.appInstanceKey_ = instanceKey;
65     info.isNewAppInstance_ = true;
66     sptr<SceneSession::SpecificSessionCallback> specificCb = sptr<SceneSession::SpecificSessionCallback>::MakeSptr();
67     sptr<SceneSession> sceneSession = sptr<SceneSession>::MakeSptr(info, specificCb);
68     return sceneSession;
69 }
70 
Init(AppExecFwk::MultiAppModeType modeType,uint32_t maxCount)71 void MultiInstanceManagerTest::Init(AppExecFwk::MultiAppModeType modeType, uint32_t maxCount)
72 {
73     sptr<IBundleMgrMocker> bundleMgrMocker = sptr<IBundleMgrMocker>::MakeSptr();
74     EXPECT_CALL(*bundleMgrMocker, GetApplicationInfosV9(_, _, _)).WillOnce([modeType, maxCount](
75         int32_t flags, int32_t userId, std::vector<AppExecFwk::ApplicationInfo>& appInfos) {
76         AppExecFwk::ApplicationInfo appInfo;
77         appInfo.bundleName = BUNDLE_NAME;
78         appInfo.multiAppMode.multiAppModeType = modeType;
79         appInfo.multiAppMode.maxCount = maxCount;
80         appInfos.push_back(appInfo);
81         return ERR_OK;
82     });
83     MultiInstanceManager::GetInstance().Init(bundleMgrMocker, GetTaskScheduler());
84     MultiInstanceManager::GetInstance().SetCurrentUserId(USER_ID);
85     usleep(SLEEP_TIME);
86 }
87 
GetTaskScheduler()88 std::shared_ptr<TaskScheduler> MultiInstanceManagerTest::GetTaskScheduler()
89 {
90     std::string threadName = "threadName";
91     std::shared_ptr<TaskScheduler> taskScheduler = std::make_shared<TaskScheduler>(threadName);
92     return taskScheduler;
93 }
94 
95 namespace {
96 /**
97  * @tc.name: IsMultiInstance
98  * @tc.desc: test function : IsMultiInstance
99  * @tc.type: FUNC
100  */
101 HWTEST_F(MultiInstanceManagerTest, IsMultiInstance, TestSize.Level1)
102 {
103     AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
104     uint32_t maxCount = 5;
105     Init(modeType, maxCount);
106     ASSERT_TRUE(MultiInstanceManager::GetInstance().IsMultiInstance(BUNDLE_NAME));
107 }
108 
109 /**
110  * @tc.name: IsMultiInstance02
111  * @tc.desc: test function : IsMultiInstance
112  * @tc.type: FUNC
113  */
114 HWTEST_F(MultiInstanceManagerTest, IsMultiInstance02, TestSize.Level1)
115 {
116     AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::UNSPECIFIED;
117     uint32_t maxCount = 5;
118     Init(modeType, maxCount);
119     ASSERT_FALSE(MultiInstanceManager::GetInstance().IsMultiInstance(BUNDLE_NAME));
120 }
121 
122 /**
123  * @tc.name: IsValidInstanceKey
124  * @tc.desc: test function : IsValidInstanceKey
125  * @tc.type: FUNC
126  */
127 HWTEST_F(MultiInstanceManagerTest, IsValidInstanceKey, TestSize.Level1)
128 {
129     AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
130     uint32_t maxCount = 5;
131     Init(modeType, maxCount);
132     std::string validInstanceKey = "app_instance_0";
133     std::string validInstanceKey2 = "app_instance_4";
134     ASSERT_TRUE(MultiInstanceManager::GetInstance().IsValidInstanceKey(BUNDLE_NAME, validInstanceKey));
135     ASSERT_TRUE(MultiInstanceManager::GetInstance().IsValidInstanceKey(BUNDLE_NAME, validInstanceKey2));
136 
137     std::string invalidInstanceKey = "app_instance0";
138     std::string invalidInstanceKey2 = "app_instance_-1";
139     std::string invalidInstanceKey3 = "app_instance_5";
140     std::string invalidInstanceKey4 = "app_instance_x";
141     ASSERT_FALSE(MultiInstanceManager::GetInstance().IsValidInstanceKey(BUNDLE_NAME, invalidInstanceKey));
142     ASSERT_FALSE(MultiInstanceManager::GetInstance().IsValidInstanceKey(BUNDLE_NAME, invalidInstanceKey2));
143     ASSERT_FALSE(MultiInstanceManager::GetInstance().IsValidInstanceKey(BUNDLE_NAME, invalidInstanceKey3));
144     ASSERT_FALSE(MultiInstanceManager::GetInstance().IsValidInstanceKey(BUNDLE_NAME, invalidInstanceKey4));
145 }
146 
147 /**
148  * @tc.name: FillInstanceKeyIfNeed
149  * @tc.desc: test function : FillInstanceKeyIfNeed
150  * @tc.type: FUNC
151  */
152 HWTEST_F(MultiInstanceManagerTest, FillInstanceKeyIfNeed, TestSize.Level1)
153 {
154     AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
155     uint32_t maxCount = 5;
156     Init(modeType, maxCount);
157     sptr<SceneSession> sceneSession = GetSceneSession();
158     MultiInstanceManager::GetInstance().FillInstanceKeyIfNeed(sceneSession);
159     MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession);
160     ASSERT_EQ(MultiInstanceManager::GetInstance().GetLastInstanceKey(BUNDLE_NAME), "app_instance_0");
161     MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession);
162 }
163 
164 /**
165  * @tc.name: FillInstanceKeyIfNeed02
166  * @tc.desc: test function : FillInstanceKeyIfNeed
167  * @tc.type: FUNC
168  */
169 HWTEST_F(MultiInstanceManagerTest, FillInstanceKeyIfNeed02, TestSize.Level1)
170 {
171     AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
172     uint32_t maxCount = 5;
173     Init(modeType, maxCount);
174     std::string instanceKey = "app_instance_4";
175     sptr<SceneSession> sceneSession = GetSceneSession(instanceKey);
176     MultiInstanceManager::GetInstance().FillInstanceKeyIfNeed(sceneSession);
177     MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession);
178     ASSERT_EQ(MultiInstanceManager::GetInstance().GetLastInstanceKey(BUNDLE_NAME), instanceKey);
179     MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession);
180 }
181 
182 /**
183  * @tc.name: FillInstanceKeyIfNeed03
184  * @tc.desc: test function : FillInstanceKeyIfNeed
185  * @tc.type: FUNC
186  */
187 HWTEST_F(MultiInstanceManagerTest, FillInstanceKeyIfNeed03, TestSize.Level1)
188 {
189     AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
190     uint32_t maxCount = 2;
191     Init(modeType, maxCount);
192     sptr<SceneSession> sceneSession = GetSceneSession();
193     MultiInstanceManager::GetInstance().FillInstanceKeyIfNeed(sceneSession);
194     MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession);
195     ASSERT_EQ(MultiInstanceManager::GetInstance().GetLastInstanceKey(BUNDLE_NAME), "app_instance_0");
196     sptr<SceneSession> sceneSession1 = GetSceneSession();
197     MultiInstanceManager::GetInstance().FillInstanceKeyIfNeed(sceneSession1);
198     MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession1);
199     ASSERT_EQ(MultiInstanceManager::GetInstance().GetLastInstanceKey(BUNDLE_NAME), "app_instance_1");
200     sptr<SceneSession> sceneSession2 = GetSceneSession();
201     MultiInstanceManager::GetInstance().FillInstanceKeyIfNeed(sceneSession2);
202     MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession2);
203     ASSERT_EQ(MultiInstanceManager::GetInstance().GetLastInstanceKey(BUNDLE_NAME), "app_instance_1");
204     MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession);
205     MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession1);
206     MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession2);
207 }
208 
209 /**
210  * @tc.name: MultiInstancePendingSessionActivation
211  * @tc.desc: test function : MultiInstancePendingSessionActivation
212  * @tc.type: FUNC
213  */
214 HWTEST_F(MultiInstanceManagerTest, MultiInstancePendingSessionActivation, TestSize.Level1)
215 {
216     AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::UNSPECIFIED;
217     uint32_t maxCount = 0;
218     Init(modeType, maxCount);
219     SessionInfo sessionInfo;
220     sessionInfo.bundleName_ = BUNDLE_NAME;
221     ASSERT_TRUE(MultiInstanceManager::GetInstance().MultiInstancePendingSessionActivation(sessionInfo));
222 }
223 
224 /**
225  * @tc.name: MultiInstancePendingSessionActivation02
226  * @tc.desc: test function : MultiInstancePendingSessionActivation
227  * @tc.type: FUNC
228  */
229 HWTEST_F(MultiInstanceManagerTest, MultiInstancePendingSessionActivation02, TestSize.Level1)
230 {
231     AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
232     uint32_t maxCount = 5;
233     Init(modeType, maxCount);
234     SessionInfo sessionInfo;
235     sessionInfo.bundleName_ = BUNDLE_NAME;
236     sessionInfo.persistentId_ = 100;
237     ASSERT_FALSE(MultiInstanceManager::GetInstance().MultiInstancePendingSessionActivation(sessionInfo));
238 }
239 
240 /**
241  * @tc.name: MultiInstancePendingSessionActivation03
242  * @tc.desc: test function : MultiInstancePendingSessionActivation
243  * @tc.type: FUNC
244  */
245 HWTEST_F(MultiInstanceManagerTest, MultiInstancePendingSessionActivation03, TestSize.Level1)
246 {
247     AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
248     uint32_t maxCount = 5;
249     Init(modeType, maxCount);
250     SessionInfo sessionInfo;
251     sessionInfo.bundleName_ = BUNDLE_NAME;
252     sessionInfo.appInstanceKey_ = "app_instance_xx";
253     ASSERT_FALSE(MultiInstanceManager::GetInstance().MultiInstancePendingSessionActivation(sessionInfo));
254 }
255 
256 /**
257  * @tc.name: GetMaxInstanceCount
258  * @tc.desc: test function : GetMaxInstanceCount
259  * @tc.type: FUNC
260  */
261 HWTEST_F(MultiInstanceManagerTest, GetMaxInstanceCount, TestSize.Level1)
262 {
263     AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
264     uint32_t maxCount = 5;
265     Init(modeType, maxCount);
266     ASSERT_EQ(MultiInstanceManager::GetInstance().GetMaxInstanceCount(BUNDLE_NAME), maxCount);
267 }
268 
269 /**
270  * @tc.name: GetInstanceCount
271  * @tc.desc: test function : GetInstanceCount
272  * @tc.type: FUNC
273  */
274 HWTEST_F(MultiInstanceManagerTest, GetInstanceCount, TestSize.Level1)
275 {
276     AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
277     uint32_t maxCount = 5;
278     Init(modeType, maxCount);
279     ASSERT_EQ(MultiInstanceManager::GetInstance().GetInstanceCount(BUNDLE_NAME), 0);
280     std::string instanceKey0 = "app_instance_0";
281     sptr<SceneSession> sceneSession = GetSceneSession(instanceKey0);
282     ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey0);
283     MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession);
284     ASSERT_EQ(MultiInstanceManager::GetInstance().GetInstanceCount(BUNDLE_NAME), 1);
285     MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession);
286     ASSERT_EQ(MultiInstanceManager::GetInstance().GetInstanceCount(BUNDLE_NAME), 0);
287 }
288 
289 /**
290  * @tc.name: GetLastInstanceKey
291  * @tc.desc: test function : GetLastInstanceKey
292  * @tc.type: FUNC
293  */
294 HWTEST_F(MultiInstanceManagerTest, GetLastInstanceKey, TestSize.Level1)
295 {
296     AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
297     uint32_t maxCount = 5;
298     Init(modeType, maxCount);
299     ASSERT_EQ(MultiInstanceManager::GetInstance().GetLastInstanceKey(BUNDLE_NAME), "");
300     std::string instanceKey0 = "app_instance_0";
301     sptr<SceneSession> sceneSession = GetSceneSession(instanceKey0);
302     ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey0);
303     MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession);
304     ASSERT_EQ(MultiInstanceManager::GetInstance().GetLastInstanceKey(BUNDLE_NAME), instanceKey0);
305     MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession);
306     ASSERT_EQ(MultiInstanceManager::GetInstance().GetLastInstanceKey(BUNDLE_NAME), "");
307 }
308 
309 /**
310  * @tc.name: CreateNewInstanceKey
311  * @tc.desc: test function : CreateNewInstanceKey
312  * @tc.type: FUNC
313  */
314 HWTEST_F(MultiInstanceManagerTest, CreateNewInstanceKey, TestSize.Level1)
315 {
316     AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
317     uint32_t maxCount = 5;
318     Init(modeType, maxCount);
319     std::string instanceKey0 = "app_instance_0";
320     ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey0);
321     sptr<SceneSession> sceneSession = GetSceneSession(instanceKey0);
322     MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession);
323     std::string instanceKey1 = "app_instance_1";
324     ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey1);
325     sptr<SceneSession> sceneSession1 = GetSceneSession(instanceKey1);
326     MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession1);
327     std::string instanceKey2 = "app_instance_2";
328     ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey2);
329     sptr<SceneSession> sceneSession2 = GetSceneSession(instanceKey2);
330     MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession2);
331     std::string instanceKey3 = "app_instance_3";
332     ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey3);
333     sptr<SceneSession> sceneSession3 = GetSceneSession(instanceKey3);
334     MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession3);
335     std::string instanceKey4 = "app_instance_4";
336     ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey4);
337     sptr<SceneSession> sceneSession4 = GetSceneSession(instanceKey4);
338     MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession4);
339     MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession);
340     MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession1);
341     MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession2);
342     MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession3);
343     MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession4);
344 }
345 
346 /**
347  * @tc.name: IsInstanceKeyExist
348  * @tc.desc: test function : IsInstanceKeyExist
349  * @tc.type: FUNC
350  */
351 HWTEST_F(MultiInstanceManagerTest, IsInstanceKeyExist, TestSize.Level1)
352 {
353     AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
354     uint32_t maxCount = 5;
355     Init(modeType, maxCount);
356     std::string instanceKey0 = "app_instance_0";
357     std::string instanceKey3 = "app_instance_3";
358     ASSERT_FALSE(MultiInstanceManager::GetInstance().IsInstanceKeyExist(BUNDLE_NAME, instanceKey0));
359     ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey0);
360     sptr<SceneSession> sceneSession = GetSceneSession(instanceKey0);
361     MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession);
362     ASSERT_TRUE(MultiInstanceManager::GetInstance().IsInstanceKeyExist(BUNDLE_NAME, instanceKey0));
363     ASSERT_FALSE(MultiInstanceManager::GetInstance().IsInstanceKeyExist(BUNDLE_NAME, instanceKey3));
364     ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME, instanceKey3), instanceKey3);
365     sptr<SceneSession> sceneSession3 = GetSceneSession(instanceKey3);
366     MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession3);
367     ASSERT_TRUE(MultiInstanceManager::GetInstance().IsInstanceKeyExist(BUNDLE_NAME, instanceKey3));
368     MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession);
369     MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession3);
370 }
371 
372 /**
373  * @tc.name: GetApplicationInfo
374  * @tc.desc: test function : GetApplicationInfo
375  * @tc.type: FUNC
376  */
377 HWTEST_F(MultiInstanceManagerTest, GetApplicationInfo, TestSize.Level1)
378 {
379     std::string bundleName = "com.ohos.sceneboard";
380     AppExecFwk::ApplicationInfo applicationInfo = MultiInstanceManager::GetInstance().GetApplicationInfo(bundleName);
381     EXPECT_EQ(applicationInfo.startMode, AppExecFwk::StartMode::MAIN_TASK);
382 }
383 } // namespace
384 } // namespace Rosen
385 } // namespace OHOS