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