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 */
HWTEST_F(MultiInstanceManagerTest, IsMultiInstance, Function | SmallTest | Level1)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 */
HWTEST_F(MultiInstanceManagerTest, IsMultiInstance02, Function | SmallTest | Level1)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 */
HWTEST_F(MultiInstanceManagerTest, IsValidInstanceKey, Function | SmallTest | Level1)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 */
HWTEST_F(MultiInstanceManagerTest, FillInstanceKeyIfNeed, Function | SmallTest | Level1)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 */
HWTEST_F(MultiInstanceManagerTest, FillInstanceKeyIfNeed02, Function | SmallTest | Level1)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 */
HWTEST_F(MultiInstanceManagerTest, FillInstanceKeyIfNeed03, Function | SmallTest | Level1)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 */
HWTEST_F(MultiInstanceManagerTest, MultiInstancePendingSessionActivation, Function | SmallTest | Level1)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 */
HWTEST_F(MultiInstanceManagerTest, MultiInstancePendingSessionActivation02, Function | SmallTest | Level1)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 */
HWTEST_F(MultiInstanceManagerTest, MultiInstancePendingSessionActivation03, Function | SmallTest | Level1)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 */
HWTEST_F(MultiInstanceManagerTest, GetMaxInstanceCount, Function | SmallTest | Level1)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 */
HWTEST_F(MultiInstanceManagerTest, GetInstanceCount, Function | SmallTest | Level1)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 /**
297 * @tc.name: GetLastInstanceKey
298 * @tc.desc: test function : GetLastInstanceKey
299 * @tc.type: FUNC
300 */
HWTEST_F(MultiInstanceManagerTest, GetLastInstanceKey, Function | SmallTest | Level1)301 HWTEST_F(MultiInstanceManagerTest, GetLastInstanceKey, Function | SmallTest | Level1)
302 {
303 AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
304 uint32_t maxCount = 5;
305 Init(modeType, maxCount);
306 ASSERT_EQ(MultiInstanceManager::GetInstance().GetLastInstanceKey(BUNDLE_NAME), "");
307 std::string instanceKey0 = "app_instance_0";
308 sptr<SceneSession> sceneSession = GetSceneSession(instanceKey0);
309 ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey0);
310 MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession);
311 ASSERT_EQ(MultiInstanceManager::GetInstance().GetLastInstanceKey(BUNDLE_NAME), instanceKey0);
312 MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession);
313 ASSERT_EQ(MultiInstanceManager::GetInstance().GetLastInstanceKey(BUNDLE_NAME), "");
314 }
315
316 /**
317 * @tc.name: CreateNewInstanceKey
318 * @tc.desc: test function : CreateNewInstanceKey
319 * @tc.type: FUNC
320 */
HWTEST_F(MultiInstanceManagerTest, CreateNewInstanceKey, Function | SmallTest | Level1)321 HWTEST_F(MultiInstanceManagerTest, CreateNewInstanceKey, Function | SmallTest | Level1)
322 {
323 AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
324 uint32_t maxCount = 5;
325 Init(modeType, maxCount);
326 std::string instanceKey0 = "app_instance_0";
327 ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey0);
328 sptr<SceneSession> sceneSession = GetSceneSession(instanceKey0);
329 MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession);
330 std::string instanceKey1 = "app_instance_1";
331 ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey1);
332 sptr<SceneSession> sceneSession1 = GetSceneSession(instanceKey1);
333 MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession1);
334 std::string instanceKey2 = "app_instance_2";
335 ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey2);
336 sptr<SceneSession> sceneSession2 = GetSceneSession(instanceKey2);
337 MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession2);
338 std::string instanceKey3 = "app_instance_3";
339 ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey3);
340 sptr<SceneSession> sceneSession3 = GetSceneSession(instanceKey3);
341 MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession3);
342 std::string instanceKey4 = "app_instance_4";
343 ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey4);
344 sptr<SceneSession> sceneSession4 = GetSceneSession(instanceKey4);
345 MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession4);
346 MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession);
347 MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession1);
348 MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession2);
349 MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession3);
350 MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession4);
351 }
352
353 /**
354 * @tc.name: IsInstanceKeyExist
355 * @tc.desc: test function : IsInstanceKeyExist
356 * @tc.type: FUNC
357 */
HWTEST_F(MultiInstanceManagerTest, IsInstanceKeyExist, Function | SmallTest | Level1)358 HWTEST_F(MultiInstanceManagerTest, IsInstanceKeyExist, Function | SmallTest | Level1)
359 {
360 AppExecFwk::MultiAppModeType modeType = AppExecFwk::MultiAppModeType::MULTI_INSTANCE;
361 uint32_t maxCount = 5;
362 Init(modeType, maxCount);
363 std::string instanceKey0 = "app_instance_0";
364 std::string instanceKey3 = "app_instance_3";
365 ASSERT_FALSE(MultiInstanceManager::GetInstance().IsInstanceKeyExist(BUNDLE_NAME, instanceKey0));
366 ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME), instanceKey0);
367 sptr<SceneSession> sceneSession = GetSceneSession(instanceKey0);
368 MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession);
369 ASSERT_TRUE(MultiInstanceManager::GetInstance().IsInstanceKeyExist(BUNDLE_NAME, instanceKey0));
370 ASSERT_FALSE(MultiInstanceManager::GetInstance().IsInstanceKeyExist(BUNDLE_NAME, instanceKey3));
371 ASSERT_EQ(MultiInstanceManager::GetInstance().CreateNewInstanceKey(BUNDLE_NAME, instanceKey3), instanceKey3);
372 sptr<SceneSession> sceneSession3 = GetSceneSession(instanceKey3);
373 MultiInstanceManager::GetInstance().IncreaseInstanceKeyRefCount(sceneSession3);
374 ASSERT_TRUE(MultiInstanceManager::GetInstance().IsInstanceKeyExist(BUNDLE_NAME, instanceKey3));
375 MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession);
376 MultiInstanceManager::GetInstance().DecreaseInstanceKeyRefCount(sceneSession3);
377 }
378 }
379 }
380 }