1 /*
2  * Copyright (c) 2021-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 <memory>
18 
19 #include "ability_connect_manager.h"
20 
21 #include "ability_config.h"
22 #include "ability_manager_errors.h"
23 #include "ability_scheduler.h"
24 #include "ability_util.h"
25 #include "bundlemgr/mock_bundle_manager.h"
26 #include "hilog_tag_wrapper.h"
27 #include "mock_ability_connect_callback.h"
28 #include "mock_sa_call.h"
29 #include "sa_mgr_client.h"
30 #include "system_ability_definition.h"
31 #include "ability_cache_manager.h"
32 #include "want.h"
33 
34 using namespace testing::ext;
35 using namespace OHOS::AppExecFwk;
36 
37 namespace OHOS {
38 namespace AAFwk {
39 class AbilityCacheManagerTest : public testing::Test {
40 public:
41 
42     static void SetUpTestCase();
43     static void TearDownTestCase();
44     void SetUp() override;
45     void TearDown() override;
46 };
47 
SetUpTestCase(void)48 void AbilityCacheManagerTest::SetUpTestCase(void)
49 {}
50 
TearDownTestCase(void)51 void AbilityCacheManagerTest::TearDownTestCase(void)
52 {}
53 
SetUp()54 void AbilityCacheManagerTest::SetUp()
55 {}
56 
TearDown()57 void AbilityCacheManagerTest::TearDown()
58 {}
59 
60 /**
61  * @tc.name: AbilityCacheManagerPutAndGetTest_001
62  * @tc.desc: Put a single ability record into cache and get it back with default ability name in want
63  * @tc.type: FUNC
64  * @tc.require:
65  */
66 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerPutAndGetTest_001, TestSize.Level0)
67 {
68     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(10, 5);
69     OHOS::AppExecFwk::AbilityInfo abilityInfo;
70     abilityInfo.moduleName = "TestModuleName";
71     abilityInfo.bundleName = "TestBundleName";
72     OHOS::AppExecFwk::ApplicationInfo applicationInfo;
73     applicationInfo.accessTokenId = 1;
74     Want want;
75     ElementName element("", "", "ability", "");
76     want.SetElement(element);
77     auto abilityRecord_ = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
78     abilityRecord_->Init();
79     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord_);
80     EXPECT_EQ(rec, nullptr);
81     int recId = abilityRecord_->GetRecordId();
82     AbilityRequest abilityRequest;
83     abilityRequest.abilityInfo = abilityInfo;
84     abilityRequest.appInfo = applicationInfo;
85     ElementName elementGet("", "", "AnotherAbility", "");
86     abilityRequest.want.SetElement(elementGet);
87     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
88     EXPECT_EQ(rec, nullptr); // incorrect ability name
89     abilityRequest.want.SetElement(element);
90     abilityRequest.abilityInfo.moduleName = "wrongModuleName";
91     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
92     EXPECT_EQ(rec, nullptr); // incorrect module name
93     abilityRequest.abilityInfo.moduleName = "TestModuleName";
94     abilityRequest.appInfo.accessTokenId = 0;
95     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
96     EXPECT_EQ(rec, nullptr); // incorrect access token Id
97     abilityRequest.appInfo.accessTokenId = 1;
98     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
99     EXPECT_EQ(rec->GetApplicationInfo().accessTokenId, applicationInfo.accessTokenId);
100     EXPECT_EQ(rec->GetAbilityInfo().moduleName, abilityInfo.moduleName);
101     EXPECT_EQ(rec->GetAbilityInfo().bundleName, abilityInfo.bundleName);
102     EXPECT_EQ(rec->GetWant().GetElement().GetAbilityName(), "ability");
103     EXPECT_EQ(rec->GetRecordId(), recId);
104     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
105     EXPECT_EQ(rec, nullptr);
106 }
107 
108 /**
109  * @tc.name: AbilityCacheManagerRemoveTest_001
110  * @tc.desc: Put a single ability record into cache and remove with wrong accessTokenId
111  * @tc.type: FUNC
112  * @tc.require:
113  */
114 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerRemoveTest_001, TestSize.Level0)
115 {
116     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(10, 5);
117     OHOS::AppExecFwk::AbilityInfo abilityInfo;
118     abilityInfo.moduleName = "TestModuleName";
119     abilityInfo.bundleName = "TestBundleName";
120     OHOS::AppExecFwk::ApplicationInfo applicationInfo;
121     applicationInfo.accessTokenId = 1;
122     Want want;
123     ElementName element("", "", "ability", "");
124     want.SetElement(element);
125     auto abilityRecord_ = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
126     abilityRecord_->Init();
127     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord_);
128     int recId = abilityRecord_->GetRecordId();
129     EXPECT_EQ(rec, nullptr);
130     applicationInfo.accessTokenId = 0;
131     auto removeRec = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
132     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(removeRec);
133     applicationInfo.accessTokenId = 1;
134     AbilityRequest abilityRequest;
135     abilityRequest.abilityInfo = abilityInfo;
136     abilityRequest.appInfo = applicationInfo;
137     abilityRequest.want.SetElement(element);
138     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
139     EXPECT_EQ(rec->GetApplicationInfo().accessTokenId, applicationInfo.accessTokenId);
140     EXPECT_EQ(rec->GetAbilityInfo().moduleName, abilityInfo.moduleName);
141     EXPECT_EQ(rec->GetAbilityInfo().bundleName, abilityInfo.bundleName);
142     EXPECT_EQ(rec->GetWant().GetElement().GetAbilityName(), "ability");
143     EXPECT_EQ(rec->GetRecordId(), recId);
144     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
145     EXPECT_EQ(rec, nullptr);
146 }
147 
148 /**
149  * @tc.name: AbilityCacheManagerRemoveTest_002
150  * @tc.desc: Put a single ability record into cache and remove with wrong access module name
151  * @tc.type: FUNC
152  * @tc.require:
153  */
154 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerRemoveTest_002, TestSize.Level0)
155 {
156     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(10, 5);
157     OHOS::AppExecFwk::AbilityInfo abilityInfo;
158     abilityInfo.moduleName = "TestModuleName";
159     abilityInfo.bundleName = "TestBundleName";
160     OHOS::AppExecFwk::ApplicationInfo applicationInfo;
161     applicationInfo.accessTokenId = 1;
162     Want want;
163     ElementName element("", "", "ability", "");
164     want.SetElement(element);
165     auto abilityRecord_ = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
166     abilityRecord_->Init();
167     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord_);
168     int recId = abilityRecord_->GetRecordId();
169     EXPECT_EQ(rec, nullptr);
170     abilityInfo.moduleName = "WrongModuleName";
171     auto removeRec = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
172     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(removeRec);
173     abilityInfo.moduleName = "TestModuleName";
174     AbilityRequest abilityRequest;
175     abilityRequest.abilityInfo = abilityInfo;
176     abilityRequest.appInfo = applicationInfo;
177     abilityRequest.want.SetElement(element);
178     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
179     EXPECT_EQ(rec->GetApplicationInfo().accessTokenId, applicationInfo.accessTokenId);
180     EXPECT_EQ(rec->GetAbilityInfo().moduleName, abilityInfo.moduleName);
181     EXPECT_EQ(rec->GetAbilityInfo().bundleName, abilityInfo.bundleName);
182     EXPECT_EQ(rec->GetWant().GetElement().GetAbilityName(), "ability");
183     EXPECT_EQ(rec->GetRecordId(), recId);
184     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
185     EXPECT_EQ(rec, nullptr);
186 }
187 
188 /**
189  * @tc.name: AbilityCacheManagerRemoveTest_003
190  * @tc.desc: Put a single ability record into cache and remove with wrong ability name
191  * @tc.type: FUNC
192  * @tc.require:
193  */
194 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerRemoveTest_003, TestSize.Level0)
195 {
196     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(10, 5);
197     OHOS::AppExecFwk::AbilityInfo abilityInfo;
198     abilityInfo.moduleName = "TestModuleName";
199     abilityInfo.bundleName = "TestBundleName";
200     OHOS::AppExecFwk::ApplicationInfo applicationInfo;
201     applicationInfo.accessTokenId = 1;
202     Want want;
203     ElementName element("", "", "ability", "");
204     want.SetElement(element);
205     auto abilityRecord_ = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
206     abilityRecord_->Init();
207     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord_);
208     int recId = abilityRecord_->GetRecordId();
209     EXPECT_EQ(rec, nullptr);
210     ElementName wrongeElement("", "", "wrongAbility", "");
211     want.SetElement(wrongeElement);
212     auto removeRec = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
213     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(removeRec);
214     AbilityRequest abilityRequest;
215     abilityRequest.abilityInfo = abilityInfo;
216     abilityRequest.appInfo = applicationInfo;
217     abilityRequest.want.SetElement(element);
218     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
219     EXPECT_EQ(rec->GetApplicationInfo().accessTokenId, applicationInfo.accessTokenId);
220     EXPECT_EQ(rec->GetAbilityInfo().moduleName, abilityInfo.moduleName);
221     EXPECT_EQ(rec->GetAbilityInfo().bundleName, abilityInfo.bundleName);
222     EXPECT_EQ(rec->GetWant().GetElement().GetAbilityName(), "ability");
223     EXPECT_EQ(rec->GetRecordId(), recId);
224     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
225     EXPECT_EQ(rec, nullptr);
226 }
227 
228 /**
229  * @tc.name: AbilityCacheManagerPutTest_001
230  * @tc.desc: Put multi ability records so that dev cache is full
231  *           and eliminate the first ability record in dev cache and use
232  * @tc.type: FUNC
233  * @tc.require:
234  */
235 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerPutTest_001, TestSize.Level0)
236 {
237     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(2, 1);
238     OHOS::AppExecFwk::AbilityInfo abilityInfo1;
239     abilityInfo1.moduleName = "TestModuleName1";
240     abilityInfo1.bundleName = "TestBundleName1";
241     OHOS::AppExecFwk::ApplicationInfo applicationInfo1;
242     applicationInfo1.accessTokenId = 1;
243     Want want;
244     auto abilityRecord1 = std::make_shared<AbilityRecord>(want, abilityInfo1, applicationInfo1);
245     abilityRecord1->Init();
246     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord1);
247     EXPECT_EQ(rec, nullptr);
248     int recId1 = abilityRecord1->GetRecordId();
249     OHOS::AppExecFwk::AbilityInfo abilityInfo2;
250     abilityInfo2.moduleName = "TestModuleName2";
251     abilityInfo2.bundleName = "TestBundleName2";
252     OHOS::AppExecFwk::ApplicationInfo applicationInfo2;
253     applicationInfo2.accessTokenId = 2;
254     auto abilityRecord2 = std::make_shared<AbilityRecord>(want, abilityInfo2, applicationInfo2);
255     abilityRecord2->Init();
256     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord2);
257     EXPECT_EQ(rec, nullptr);
258 
259     OHOS::AppExecFwk::AbilityInfo abilityInfo3;
260     abilityInfo3.moduleName = "TestModuleName3";
261     abilityInfo3.bundleName = "TestBundleName3";
262     OHOS::AppExecFwk::ApplicationInfo applicationInfo3;
263     applicationInfo3.accessTokenId = 3;
264     auto abilityRecord3 = std::make_shared<AbilityRecord>(want, abilityInfo3, applicationInfo3);
265     abilityRecord3->Init();
266     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord3);
267 
268     EXPECT_EQ(rec->GetApplicationInfo().accessTokenId, applicationInfo1.accessTokenId);
269     EXPECT_EQ(rec->GetAbilityInfo().moduleName, abilityInfo1.moduleName);
270     EXPECT_EQ(rec->GetAbilityInfo().bundleName, abilityInfo1.bundleName);
271     EXPECT_EQ(rec->GetRecordId(), recId1);
272     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(abilityRecord2);
273     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(abilityRecord3);
274 }
275 
276 /**
277  * @tc.name: AbilityCacheManagerPutTest_002
278  * @tc.desc: Put multi ability records so that proc cache is full and eliminate the first ability record in proc cache
279  * @tc.type: FUNC
280  * @tc.require:
281  */
282 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerPutTest_002, TestSize.Level0)
283 {
284     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(3, 1);
285     OHOS::AppExecFwk::AbilityInfo abilityInfo1;
286     abilityInfo1.moduleName = "TestModuleName1";
287     abilityInfo1.bundleName = "TestBundleName1";
288     OHOS::AppExecFwk::ApplicationInfo applicationInfo1;
289     applicationInfo1.accessTokenId = 1;
290     Want want;
291     auto abilityRecord1 = std::make_shared<AbilityRecord>(want, abilityInfo1, applicationInfo1);
292     abilityRecord1->Init();
293     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord1);
294     EXPECT_EQ(rec, nullptr);
295 
296     OHOS::AppExecFwk::AbilityInfo abilityInfo2;
297     abilityInfo2.moduleName = "TestModuleName2";
298     abilityInfo2.bundleName = "TestBundleName2";
299     OHOS::AppExecFwk::ApplicationInfo applicationInfo2;
300     applicationInfo2.accessTokenId = 2;
301     auto abilityRecord2 = std::make_shared<AbilityRecord>(want, abilityInfo2, applicationInfo2);
302     abilityRecord2->Init();
303     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord2);
304     EXPECT_EQ(rec, nullptr);
305     int recId2 = abilityRecord2->GetRecordId();
306     OHOS::AppExecFwk::AbilityInfo abilityInfo3;
307     abilityInfo3.moduleName = "TestModuleName3";
308     abilityInfo3.bundleName = "TestBundleName3";
309     OHOS::AppExecFwk::ApplicationInfo applicationInfo3;
310     applicationInfo3.accessTokenId = 2;
311     auto abilityRecord3 = std::make_shared<AbilityRecord>(want, abilityInfo3, applicationInfo3);
312     abilityRecord3->Init();
313     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord3);
314 
315     EXPECT_EQ(rec->GetApplicationInfo().accessTokenId, applicationInfo2.accessTokenId);
316     EXPECT_EQ(rec->GetAbilityInfo().moduleName, abilityInfo2.moduleName);
317     EXPECT_EQ(rec->GetAbilityInfo().bundleName, abilityInfo2.bundleName);
318     EXPECT_EQ(rec->GetRecordId(), recId2);
319     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(abilityRecord1);
320     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(abilityRecord3);
321 }
322 
323 /**
324  * @tc.name: AbilityCacheManagerPutTest_003
325  * @tc.desc: Put multi ability records so that proc cache are full at the same time
326  *           and eliminate the first ability record in proc cache
327  * @tc.type: FUNC
328  * @tc.require:
329  */
330 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerPutTest_003, TestSize.Level0)
331 {
332     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(3, 1);
333     OHOS::AppExecFwk::AbilityInfo abilityInfo1;
334     abilityInfo1.moduleName = "TestModuleName1";
335     abilityInfo1.bundleName = "TestBundleName1";
336     OHOS::AppExecFwk::ApplicationInfo applicationInfo1;
337     applicationInfo1.accessTokenId = 1;
338     Want want;
339     auto abilityRecord1 = std::make_shared<AbilityRecord>(want, abilityInfo1, applicationInfo1);
340     abilityRecord1->Init();
341     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord1);
342     EXPECT_EQ(rec, nullptr);
343 
344     OHOS::AppExecFwk::AbilityInfo abilityInfo2;
345     abilityInfo2.moduleName = "TestModuleName2";
346     abilityInfo2.bundleName = "TestBundleName2";
347     OHOS::AppExecFwk::ApplicationInfo applicationInfo2;
348     applicationInfo2.accessTokenId = 2;
349 
350     auto abilityRecord2 = std::make_shared<AbilityRecord>(want, abilityInfo2, applicationInfo2);
351     abilityRecord2->Init();
352     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord2);
353     EXPECT_EQ(rec, nullptr);
354 
355     OHOS::AppExecFwk::AbilityInfo abilityInfo3;
356     abilityInfo3.moduleName = "TestModuleName3";
357     abilityInfo3.bundleName = "TestBundleName3";
358     OHOS::AppExecFwk::ApplicationInfo applicationInfo3;
359     applicationInfo3.accessTokenId = 3;
360     auto abilityRecord3 = std::make_shared<AbilityRecord>(want, abilityInfo3, applicationInfo3);
361     abilityRecord3->Init();
362     int recId3 = abilityRecord3->GetRecordId();
363     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord3);
364     EXPECT_EQ(rec, nullptr);
365 
366     OHOS::AppExecFwk::AbilityInfo abilityInfo4;
367     abilityInfo4.moduleName = "TestModuleName4";
368     abilityInfo4.bundleName = "TestBundleName4";
369     OHOS::AppExecFwk::ApplicationInfo applicationInfo4;
370     applicationInfo4.accessTokenId = 3;
371 
372     auto abilityRecord4 = std::make_shared<AbilityRecord>(want, abilityInfo4, applicationInfo4);
373     abilityRecord4->Init();
374     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord4);
375     EXPECT_EQ(rec->GetApplicationInfo().accessTokenId, applicationInfo3.accessTokenId);
376     EXPECT_EQ(rec->GetAbilityInfo().moduleName, abilityInfo3.moduleName);
377     EXPECT_EQ(rec->GetAbilityInfo().bundleName, abilityInfo3.bundleName);
378     EXPECT_EQ(rec->GetRecordId(), recId3);
379 
380     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(abilityRecord1);
381     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(abilityRecord2);
382     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(abilityRecord4);
383 }
384 
385 /**
386  * @tc.name: AbilityCacheManagerPutTest_004
387  * @tc.desc: Put multi ability records so that dev cache is full and eliminate the first ability record in dev cache
388  * @tc.type: FUNC
389  * @tc.require:
390  */
391 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerPutTest_004, TestSize.Level0)
392 {
393     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(2, 1);
394     OHOS::AppExecFwk::AbilityInfo abilityInfo1;
395     abilityInfo1.moduleName = "TestModuleName1";
396     abilityInfo1.bundleName = "TestBundleName1";
397     OHOS::AppExecFwk::ApplicationInfo applicationInfo1;
398     applicationInfo1.accessTokenId = 1;
399     Want want;
400     auto abilityRecord1 = std::make_shared<AbilityRecord>(want, abilityInfo1, applicationInfo1);
401     abilityRecord1->Init();
402     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord1);
403     EXPECT_EQ(rec, nullptr);
404     int recId1 = abilityRecord1->GetRecordId();
405     OHOS::AppExecFwk::AbilityInfo abilityInfo2;
406     abilityInfo2.moduleName = "TestModuleName2";
407     abilityInfo2.bundleName = "TestBundleName2";
408     OHOS::AppExecFwk::ApplicationInfo applicationInfo2;
409     applicationInfo2.accessTokenId = 2;
410     auto abilityRecord2 = std::make_shared<AbilityRecord>(want, abilityInfo2, applicationInfo2);
411     abilityRecord2->Init();
412     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord2);
413     EXPECT_EQ(rec, nullptr);
414 
415     OHOS::AppExecFwk::AbilityInfo abilityInfo3;
416     abilityInfo3.moduleName = "TestModuleName3";
417     abilityInfo3.bundleName = "TestBundleName3";
418     OHOS::AppExecFwk::ApplicationInfo applicationInfo3;
419     applicationInfo3.accessTokenId = 3;
420     auto abilityRecord3 = std::make_shared<AbilityRecord>(want, abilityInfo3, applicationInfo3);
421     abilityRecord3->Init();
422     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord3);
423 
424     EXPECT_EQ(rec->GetApplicationInfo().accessTokenId, applicationInfo1.accessTokenId);
425     EXPECT_EQ(rec->GetAbilityInfo().moduleName, abilityInfo1.moduleName);
426     EXPECT_EQ(rec->GetAbilityInfo().bundleName, abilityInfo1.bundleName);
427     EXPECT_EQ(rec->GetRecordId(), recId1);
428 
429     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(abilityRecord2);
430     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(abilityRecord3);
431 }
432 
433 /**
434  * @tc.name: AbilityCacheManagerPutAndRemoveTest_001
435  * @tc.desc: Put a single ability record into cache and remove it then get a nullptr with request
436  * @tc.type: FUNC
437  * @tc.require:
438  */
439 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerPutAndRemoveTest_001, TestSize.Level0)
440 {
441     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(10, 5);
442     OHOS::AppExecFwk::AbilityInfo abilityInfo;
443     abilityInfo.moduleName = "TestModuleName";
444     abilityInfo.bundleName = "TestBundleName";
445     OHOS::AppExecFwk::ApplicationInfo applicationInfo;
446     applicationInfo.accessTokenId = 0;
447     Want want;
448     auto abilityRecord_ = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
449     abilityRecord_->Init();
450     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord_);
451     EXPECT_EQ(rec, nullptr);
452     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(abilityRecord_);
453     AbilityRequest abilityRequest;
454     abilityRequest.abilityInfo = abilityInfo;
455     abilityRequest.appInfo = applicationInfo;
456     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
457     EXPECT_EQ(rec, nullptr);
458     OHOS::AppExecFwk::AbilityInfo abilityInfo1;
459     abilityInfo.moduleName = "TestModuleName1";
460     abilityInfo.bundleName = "TestBundleName1";
461     OHOS::AppExecFwk::ApplicationInfo applicationInfo1;
462     applicationInfo.accessTokenId = 1;
463     auto abilityRecord1 = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
464     abilityRecord1->Init();
465     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(abilityRecord1);
466 }
467 
468 /**
469  * @tc.name: AbilityCacheManagerFindByToken_001
470  * @tc.desc: Put a single ability record into cache and find it, find will not remove cache
471  * @tc.type: FUNC
472  * @tc.require:
473  */
474 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerFindByToken_001, TestSize.Level0)
475 {
476     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(10, 5);
477     OHOS::AppExecFwk::AbilityInfo abilityInfo;
478     abilityInfo.moduleName = "TestModuleName";
479     abilityInfo.bundleName = "TestBundleName";
480     OHOS::AppExecFwk::ApplicationInfo applicationInfo;
481     applicationInfo.accessTokenId = 0;
482     Want want;
483     auto abilityRecord_ = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
484     abilityRecord_->Init();
485     int recId = abilityRecord_->GetRecordId();
486     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord_);
487     EXPECT_EQ(rec, nullptr);
488     auto recordFind = OHOS::AAFwk::AbilityCacheManager::GetInstance().FindRecordByToken(abilityRecord_->GetToken());
489     EXPECT_EQ(recordFind->GetApplicationInfo().accessTokenId, applicationInfo.accessTokenId);
490     EXPECT_EQ(recordFind->GetAbilityInfo().moduleName, abilityInfo.moduleName);
491     EXPECT_EQ(recordFind->GetAbilityInfo().bundleName, abilityInfo.bundleName);
492     EXPECT_EQ(recordFind->GetRecordId(), recId);
493     AbilityRequest abilityRequest;
494     abilityRequest.abilityInfo = abilityInfo;
495     abilityRequest.appInfo = applicationInfo;
496     auto recGet = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
497     EXPECT_EQ(recGet->GetApplicationInfo().accessTokenId, applicationInfo.accessTokenId);
498     EXPECT_EQ(recGet->GetAbilityInfo().moduleName, abilityInfo.moduleName);
499     EXPECT_EQ(recGet->GetAbilityInfo().bundleName, abilityInfo.bundleName);
500     EXPECT_EQ(recGet->GetRecordId(), recId);
501 }
502 
503 /**
504  * @tc.name: AbilityCacheManagerGetAbilityList_001
505  * @tc.desc: Put a single ability record into cache and get ability list
506  * @tc.type: FUNC
507  * @tc.require:
508  */
509 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerGetAbilityList_001, TestSize.Level0)
510 {
511     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(10, 5);
512     OHOS::AppExecFwk::AbilityInfo abilityInfo;
513     abilityInfo.moduleName = "TestModuleName";
514     abilityInfo.bundleName = "TestBundleName";
515     OHOS::AppExecFwk::ApplicationInfo applicationInfo;
516     applicationInfo.accessTokenId = 0;
517     Want want;
518     auto abilityRecord_ = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
519     abilityRecord_->Init();
520     int recId = abilityRecord_->GetRecordId();
521     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord_);
522     EXPECT_EQ(rec, nullptr);
523     auto abilityList = OHOS::AAFwk::AbilityCacheManager::GetInstance().GetAbilityList();
524     EXPECT_EQ(abilityList.size(), 1);
525     auto recordFind = *(abilityList.begin());
526     EXPECT_EQ(recordFind->GetApplicationInfo().accessTokenId, applicationInfo.accessTokenId);
527     EXPECT_EQ(recordFind->GetAbilityInfo().moduleName, abilityInfo.moduleName);
528     EXPECT_EQ(recordFind->GetAbilityInfo().bundleName, abilityInfo.bundleName);
529     EXPECT_EQ(recordFind->GetRecordId(), recId);
530     OHOS::AAFwk::AbilityCacheManager::GetInstance().Remove(abilityRecord_);
531 }
532 
533 /**
534  * @tc.name: AbilityCacheManagerFindBySessionId_001
535  * @tc.desc: Put a single ability record into cache and find it, find will not remove cache
536  * @tc.type: FUNC
537  * @tc.require:
538  */
539 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerFindBySessionId_001, TestSize.Level0)
540 {
541     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(10, 5);
542     OHOS::AppExecFwk::AbilityInfo abilityInfo;
543     std::string sessionId = "TestSessionId";
544     abilityInfo.moduleName = "TestModuleName";
545     abilityInfo.bundleName = "TestBundleName";
546     OHOS::AppExecFwk::ApplicationInfo applicationInfo;
547     applicationInfo.accessTokenId = 0;
548     Want want;
549     want.SetParam(Want::PARAM_ASSERT_FAULT_SESSION_ID, sessionId);
550     auto abilityRecord_ = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
551     abilityRecord_->Init();
552     int recId = abilityRecord_->GetRecordId();
553     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord_);
554     EXPECT_EQ(rec, nullptr);
555     auto recordFind = OHOS::AAFwk::AbilityCacheManager::GetInstance().FindRecordBySessionId(sessionId);
556     EXPECT_EQ(recordFind->GetApplicationInfo().accessTokenId, applicationInfo.accessTokenId);
557     EXPECT_EQ(recordFind->GetAbilityInfo().moduleName, abilityInfo.moduleName);
558     EXPECT_EQ(recordFind->GetAbilityInfo().bundleName, abilityInfo.bundleName);
559     EXPECT_EQ(recordFind->GetRecordId(), recId);
560     AbilityRequest abilityRequest;
561     abilityRequest.abilityInfo = abilityInfo;
562     abilityRequest.appInfo = applicationInfo;
563     auto recGet = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
564     EXPECT_EQ(recGet->GetApplicationInfo().accessTokenId, applicationInfo.accessTokenId);
565     EXPECT_EQ(recGet->GetAbilityInfo().moduleName, abilityInfo.moduleName);
566     EXPECT_EQ(recGet->GetAbilityInfo().bundleName, abilityInfo.bundleName);
567     EXPECT_EQ(recGet->GetRecordId(), recId);
568 }
569 
570 /**
571  * @tc.name: AbilityCacheManagerFindByServiceKey_001
572  * @tc.desc: Put a single ability record into cache and find it, find will not remove cache
573  * @tc.type: FUNC
574  * @tc.require:
575  */
576 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerFindByServiceKey_001, TestSize.Level0)
577 {
578     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(10, 5);
579     OHOS::AppExecFwk::AbilityInfo abilityInfo;
580     abilityInfo.moduleName = "TestModuleName";
581     abilityInfo.bundleName = "TestBundleName";
582     OHOS::AppExecFwk::ApplicationInfo applicationInfo;
583     applicationInfo.accessTokenId = 0;
584     Want want;
585     auto abilityRecord_ = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
586     abilityRecord_->Init();
587     int recId = abilityRecord_->GetRecordId();
588     std::string serviceKey = abilityRecord_->GetURI();
589     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord_);
590     EXPECT_EQ(rec, nullptr);
591     auto recordFind = OHOS::AAFwk::AbilityCacheManager::GetInstance().FindRecordByServiceKey(serviceKey);
592     EXPECT_EQ(recordFind->GetApplicationInfo().accessTokenId, applicationInfo.accessTokenId);
593     EXPECT_EQ(recordFind->GetAbilityInfo().moduleName, abilityInfo.moduleName);
594     EXPECT_EQ(recordFind->GetAbilityInfo().bundleName, abilityInfo.bundleName);
595     EXPECT_EQ(recordFind->GetRecordId(), recId);
596     AbilityRequest abilityRequest;
597     abilityRequest.abilityInfo = abilityInfo;
598     abilityRequest.appInfo = applicationInfo;
599     auto recGet = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
600     EXPECT_EQ(recGet->GetApplicationInfo().accessTokenId, applicationInfo.accessTokenId);
601     EXPECT_EQ(recGet->GetAbilityInfo().moduleName, abilityInfo.moduleName);
602     EXPECT_EQ(recGet->GetAbilityInfo().bundleName, abilityInfo.bundleName);
603     EXPECT_EQ(recGet->GetRecordId(), recId);
604 }
605 
606 /**
607  * @tc.name: AbilityCacheManagerSignRestartAppFlag_001
608  * @tc.desc: Put a single ability record into cache and sign restart app flag
609  * @tc.type: FUNC
610  * @tc.require:
611  */
612 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerSignRestartAppFlag_001, TestSize.Level0)
613 {
614     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(10, 5);
615     OHOS::AppExecFwk::AbilityInfo abilityInfo;
616     abilityInfo.moduleName = "TestModuleName";
617     abilityInfo.bundleName = "TestBundleName";
618     OHOS::AppExecFwk::ApplicationInfo applicationInfo;
619     applicationInfo.accessTokenId = 0;
620     applicationInfo.bundleName = abilityInfo.bundleName;
621     Want want;
622     auto abilityRecord_ = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
623     abilityRecord_->Init();
624     int recId = abilityRecord_->GetRecordId();
625     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord_);
626     EXPECT_EQ(rec, nullptr);
627     OHOS::AAFwk::AbilityCacheManager::GetInstance().SignRestartAppFlag(applicationInfo.uid);
628     AbilityRequest abilityRequest;
629     abilityRequest.abilityInfo = abilityInfo;
630     abilityRequest.appInfo = applicationInfo;
631     auto recordFind = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
632     EXPECT_EQ(recordFind->GetRestartAppFlag(), false);
633 }
634 
635 /**
636  * @tc.name: AbilityCacheManagerDeleteInvalidRecord_001
637  * @tc.desc: Put a single ability record into cache and delete it by bundleName
638  * @tc.type: FUNC
639  * @tc.require:
640  */
641 HWTEST_F(AbilityCacheManagerTest, AbilityCacheManagerDeleteInvalidRecord_001, TestSize.Level0)
642 {
643     OHOS::AAFwk::AbilityCacheManager::GetInstance().Init(10, 5);
644     OHOS::AppExecFwk::AbilityInfo abilityInfo;
645     abilityInfo.moduleName = "TestModuleName";
646     abilityInfo.bundleName = "TestBundleName";
647     OHOS::AppExecFwk::ApplicationInfo applicationInfo;
648     applicationInfo.accessTokenId = 0;
649     Want want;
650     auto abilityRecord_ = std::make_shared<AbilityRecord>(want, abilityInfo, applicationInfo);
651     abilityRecord_->Init();
652     int recId = abilityRecord_->GetRecordId();
653     std::shared_ptr<AbilityRecord> rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Put(abilityRecord_);
654     EXPECT_EQ(rec, nullptr);
655     AbilityRequest abilityRequest;
656     abilityRequest.abilityInfo = abilityInfo;
657     abilityRequest.appInfo = applicationInfo;
658     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
659     EXPECT_EQ(rec->GetApplicationInfo().accessTokenId, applicationInfo.accessTokenId);
660     EXPECT_EQ(rec->GetAbilityInfo().moduleName, abilityInfo.moduleName);
661     EXPECT_EQ(rec->GetAbilityInfo().bundleName, abilityInfo.bundleName);
662     EXPECT_EQ(rec->GetRecordId(), recId);
663     OHOS::AAFwk::AbilityCacheManager::GetInstance().DeleteInvalidServiceRecord(abilityInfo.bundleName);
664     rec = OHOS::AAFwk::AbilityCacheManager::GetInstance().Get(abilityRequest);
665     EXPECT_EQ(rec, nullptr);
666 }
667 }  // namespace AAFwk
668 }  // namespace OHOS
669