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 }