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