• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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 
18 #include <memory>
19 #include <thread>
20 #include "file_ex.h"
21 
22 #define private public
23 #include "app_recovery.h"
24 #undef private
25 #include "ability_info.h"
26 #include "ability_runtime/js_ui_ability.h"
27 #include "event_handler.h"
28 #include "js_runtime.h"
29 #include "mock_ability_context.h"
30 #include "mock_ability_token.h"
31 #include "recovery_param.h"
32 #include "ui_ability.h"
33 #define private public
34 #include "context/application_context.h"
35 
36 using FreezeFunction = std::function<void()>;
37 using namespace testing::ext;
38 namespace OHOS {
39 namespace AppExecFwk {
40 class AppRecoveryUnitTest : public testing::Test {
41 public:
42     static void SetUpTestCase();
43     static void TearDownTestCase();
44     void SetUp();
45     void TearDown();
46     std::shared_ptr<AbilityRuntime::UIAbility> ability_ = std::make_shared<AbilityRuntime::UIAbility>();
47     std::shared_ptr<AppExecFwk::AbilityInfo> abilityInfo_ = std::make_shared<AbilityInfo>();
48     std::shared_ptr<AppExecFwk::ApplicationInfo> applicationInfo_ = std::make_shared<ApplicationInfo>();
49     std::shared_ptr<AppExecFwk::EventHandler> testHandler_ = std::make_shared<EventHandler>();
50     sptr<IRemoteObject> token_ = new MockAbilityToken();
51     std::shared_ptr<AbilityRuntime::MockAbilityContext> context_ =
52         std::make_shared<AbilityRuntime::MockAbilityContext>();
53 };
54 
SetUpTestCase()55 void AppRecoveryUnitTest::SetUpTestCase()
56 {
57 }
58 
TearDownTestCase()59 void AppRecoveryUnitTest::TearDownTestCase()
60 {}
61 
SetUp()62 void AppRecoveryUnitTest::SetUp()
63 {
64     AppRecovery::GetInstance().isEnable_ = false;
65     AppRecovery::GetInstance().restartFlag_ = 0;
66     AppRecovery::GetInstance().saveOccasion_ = 0;
67     AppRecovery::GetInstance().saveMode_ = 0;
68     AppRecovery::GetInstance().abilityRecoverys_.clear();
69     AppRecovery::GetInstance().mainHandler_ = testHandler_;
70     AppRecovery::GetInstance().applicationInfo_ = applicationInfo_;
71     AppRecovery::GetInstance().want_ = nullptr;
72 }
73 
TearDown()74 void AppRecoveryUnitTest::TearDown()
75 {
76 }
77 
78 /**
79  * @tc.name: GetRestartFlag_001
80  * @tc.desc: Test GetRestartFlag
81  * @tc.type: FUNC
82  * @tc.require: I5UL6H
83  */
84 HWTEST_F(AppRecoveryUnitTest, GetRestartFlag_001, TestSize.Level1)
85 {
86     EXPECT_EQ(AppRecovery::GetInstance().GetRestartFlag(), 0);
87     AppRecovery::GetInstance().restartFlag_ = RestartFlag::ALWAYS_RESTART;
88     EXPECT_EQ(AppRecovery::GetInstance().GetRestartFlag(), RestartFlag::ALWAYS_RESTART);
89 }
90 
91 /**
92  * @tc.name: GetSaveOccasionFlag_001
93  * @tc.desc: Test GetSaveOccasionFlag
94  * @tc.type: FUNC
95  * @tc.require: I5UL6H
96  */
97 HWTEST_F(AppRecoveryUnitTest, GetSaveOccasionFlag_001, TestSize.Level1)
98 {
99     EXPECT_EQ(AppRecovery::GetInstance().GetSaveOccasionFlag(), 0);
100     AppRecovery::GetInstance().saveOccasion_ = SaveOccasionFlag::SAVE_WHEN_ERROR;
101     EXPECT_EQ(AppRecovery::GetInstance().GetSaveOccasionFlag(), SaveOccasionFlag::SAVE_WHEN_ERROR);
102 }
103 /**
104  * @tc.name: GetSaveModeFlag_001
105  * @tc.desc: Test GetSaveModeFlag
106  * @tc.type: FUNC
107  * @tc.require: I5UL6H
108  */
109 HWTEST_F(AppRecoveryUnitTest, GetSaveModeFlag_001, TestSize.Level1)
110 {
111     EXPECT_EQ(AppRecovery::GetInstance().GetSaveModeFlag(), 0);
112     AppRecovery::GetInstance().saveMode_ = SaveModeFlag::SAVE_WITH_FILE;
113     EXPECT_EQ(AppRecovery::GetInstance().GetSaveModeFlag(), SaveModeFlag::SAVE_WITH_FILE);
114 }
115 
116 /**
117  * @tc.name: InitApplicationInfo_001
118  * @tc.desc: Test InitApplicationInfo
119  * @tc.type: FUNC
120  * @tc.require: I5UL6H
121  */
122 HWTEST_F(AppRecoveryUnitTest, InitApplicationInfo_001, TestSize.Level1)
123 {
124     EXPECT_TRUE(AppRecovery::GetInstance().InitApplicationInfo(testHandler_, applicationInfo_));
125 }
126 
127 /**
128  * @tc.name: EnableAppRecovery_001
129  * @tc.desc: EnableAppRecovery with config, check the enable flag is set as expected.
130  * @tc.type: FUNC
131  * @tc.require: I5UL6H
132  */
133 HWTEST_F(AppRecoveryUnitTest, EnableAppRecovery_001, TestSize.Level0)
134 {
135     EXPECT_FALSE(AppRecovery::GetInstance().IsEnabled());
136     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
137         SaveModeFlag::SAVE_WITH_FILE);
138     EXPECT_TRUE(AppRecovery::GetInstance().IsEnabled());
139 }
140 
141 /**
142  * @tc.name: EnableAppRecovery_002
143  * @tc.desc: EnableAppRecovery with config, check the config is set as expected.
144  * @tc.type: FUNC
145  * @tc.require: I5UL6H
146  */
147 HWTEST_F(AppRecoveryUnitTest, EnableAppRecovery_002, TestSize.Level0)
148 {
149     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
150         SaveModeFlag::SAVE_WITH_FILE);
151     EXPECT_EQ(RestartFlag::ALWAYS_RESTART, AppRecovery::GetInstance().GetRestartFlag());
152     EXPECT_EQ(SaveOccasionFlag::SAVE_WHEN_ERROR, AppRecovery::GetInstance().GetSaveOccasionFlag());
153     EXPECT_EQ(SaveModeFlag::SAVE_WITH_FILE, AppRecovery::GetInstance().GetSaveModeFlag());
154 }
155 
156 /**
157  * @tc.name: EnableAppRecovery_003
158  * @tc.desc: EnableAppRecovery with config, check the config is set as expected.
159  * @tc.type: FUNC
160  * @tc.require: I5UL6H
161  */
162 HWTEST_F(AppRecoveryUnitTest, EnableAppRecovery_003, TestSize.Level0)
163 {
164     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::NO_RESTART, SaveOccasionFlag::SAVE_ALL,
165         SaveModeFlag::SAVE_WITH_SHARED_MEMORY);
166     EXPECT_EQ(RestartFlag::NO_RESTART, AppRecovery::GetInstance().GetRestartFlag());
167     EXPECT_EQ(SaveOccasionFlag::SAVE_ALL, AppRecovery::GetInstance().GetSaveOccasionFlag());
168     EXPECT_EQ(SaveModeFlag::SAVE_WITH_SHARED_MEMORY, AppRecovery::GetInstance().GetSaveModeFlag());
169 }
170 
171 /**
172  * @tc.name:  AddAbility_001
173  * @tc.desc: AddAbility when enable flag is false.
174  * @tc.type: FUNC
175  * @tc.require: I5UL6H
176  */
177 HWTEST_F(AppRecoveryUnitTest, AddAbility_001, TestSize.Level1)
178 {
179     AppRecovery::GetInstance().isEnable_ = false;
180     bool ret = AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_);
181     EXPECT_TRUE(ret);
182 }
183 
184 /**
185  * @tc.name:  AddAbility_002
186  * @tc.desc: AddAbility when abilityRecoverys_ is not empty.
187  * @tc.type: FUNC
188  * @tc.require: I5UL6H
189  */
190 HWTEST_F(AppRecoveryUnitTest, AddAbility_002, TestSize.Level1)
191 {
192     AppRecovery::GetInstance().isEnable_ = true;
193     auto abilityRecovery = std::make_shared<AbilityRecovery>();
194     AppRecovery::GetInstance().abilityRecoverys_.push_back(abilityRecovery);
195     bool ret = AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_);
196     EXPECT_FALSE(ret);
197 }
198 
199 /**
200  * @tc.name:  AddAbility_003
201  * @tc.desc: AddAbility check the ret as expected.
202  * @tc.type: FUNC
203  * @tc.require: I5UL6H
204  */
205 HWTEST_F(AppRecoveryUnitTest, AddAbility_003, TestSize.Level1)
206 {
207     AppRecovery::GetInstance().isEnable_ = true;
208     bool ret = AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_);
209     EXPECT_TRUE(ret);
210 }
211 
212 /**
213  * @tc.name:  AddAbility_004
214  * @tc.desc: add testcase.
215  * @tc.type: FUNC
216  * @tc.require: I5UL6H
217  */
218 HWTEST_F(AppRecoveryUnitTest, AddAbility_004, TestSize.Level1)
219 {
220     bool ret = AppRecovery::GetInstance().AddAbility(ability_, nullptr, token_);
221     EXPECT_TRUE(!ret);
222 }
223 
224 /**
225  * @tc.name:  RemoveAbility_001
226  * @tc.desc: RemoveAbility check the ret as expected.
227  * @tc.type: FUNC
228  * @tc.require: I5UL6H
229  */
230 HWTEST_F(AppRecoveryUnitTest, RemoveAbility_001, TestSize.Level1)
231 {
232     AppRecovery::GetInstance().isEnable_ = true;
233     bool ret = AppRecovery::GetInstance().RemoveAbility(token_);
234     EXPECT_TRUE(ret);
235 }
236 
237 /**
238  * @tc.name:  RemoveAbility_002
239  * @tc.desc: RemoveAbility when enable flag is false.
240  * @tc.type: FUNC
241  * @tc.require: I5UL6H
242  */
243 HWTEST_F(AppRecoveryUnitTest, RemoveAbility_002, TestSize.Level1)
244 {
245     AppRecovery::GetInstance().isEnable_ = false;
246     bool ret = AppRecovery::GetInstance().RemoveAbility(token_);
247     EXPECT_TRUE(ret);
248 }
249 
250 /**
251  * @tc.name:  RemoveAbility_003
252  * @tc.desc: RemoveAbility failed when token_ is null.
253  * @tc.type: FUNC
254  * @tc.require: I5UL6H
255  */
256 HWTEST_F(AppRecoveryUnitTest, RemoveAbility_003, TestSize.Level1)
257 {
258     bool ret = AppRecovery::GetInstance().RemoveAbility(nullptr);
259     EXPECT_TRUE(!ret);
260 }
261 
262 /**
263  * @tc.name: DoRecoverApp_001
264  * @tc.desc: add testcase.
265  * @tc.type: FUNC
266  * @tc.require: I5UL6H
267  */
268 HWTEST_F(AppRecoveryUnitTest, DoRecoverApp_001, TestSize.Level1)
269 {
270     AppRecovery::GetInstance().abilityRecoverys_.clear();
271     AppRecovery::GetInstance().DoRecoverApp(StateReason::DEVELOPER_REQUEST);
272     EXPECT_TRUE(AppRecovery::GetInstance().abilityRecoverys_.empty());
273 }
274 
275 /**
276  * @tc.name:  ShouldSaveAppState_001
277  * @tc.desc:  ShouldSaveAppState when state is support save.
278  * @tc.type: FUNC
279  * @tc.require: I5UL6H
280  */
281 HWTEST_F(AppRecoveryUnitTest, ShouldSaveAppState_001, TestSize.Level0)
282 {
283     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
284         SaveModeFlag::SAVE_WITH_FILE);
285     bool ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::DEVELOPER_REQUEST);
286     EXPECT_TRUE(ret);
287 }
288 
289 /**
290  * @tc.name:  ShouldSaveAppState_002
291  * @tc.desc:  ShouldSaveAppState when state is not support save.
292  * @tc.type: FUNC
293  * @tc.require: I5UL6H
294  */
295 HWTEST_F(AppRecoveryUnitTest, ShouldSaveAppState_002, TestSize.Level0)
296 {
297     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
298         SaveModeFlag::SAVE_WITH_FILE);
299     bool ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::LIFECYCLE);
300     EXPECT_FALSE(ret);
301 }
302 
303 /**
304  * @tc.name:  ShouldSaveAppState_003
305  * @tc.desc:  ShouldSaveAppState when state is not support save.
306  * @tc.type: FUNC
307  * @tc.require: I5UL6H
308  */
309 HWTEST_F(AppRecoveryUnitTest, ShouldSaveAppState_003, TestSize.Level0)
310 {
311     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_BACKGROUND,
312         SaveModeFlag::SAVE_WITH_FILE);
313     bool ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::CPP_CRASH);
314     EXPECT_FALSE(ret);
315     ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::JS_ERROR);
316     EXPECT_FALSE(ret);
317     ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::APP_FREEZE);
318     EXPECT_FALSE(ret);
319 }
320 
321 /**
322  * @tc.name:  ScheduleSaveAppState_001
323  * @tc.desc:  ScheduleSaveAppState when enable flag is false.
324  * @tc.type: FUNC
325  * @tc.require: I5UL6H
326  */
327 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_001, TestSize.Level1)
328 {
329     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::DEVELOPER_REQUEST);
330     EXPECT_FALSE(ret);
331 }
332 
333 /**
334  * @tc.name:  ScheduleSaveAppState_002
335  * @tc.desc:  ScheduleSaveAppState when state is not support save.
336  * @tc.type: FUNC
337  * @tc.require: I5UL6H
338  */
339 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_002, TestSize.Level0)
340 {
341     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
342         SaveModeFlag::SAVE_WITH_FILE);
343     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::LIFECYCLE);
344     EXPECT_FALSE(ret);
345 }
346 
347 /**
348  * @tc.name:  ScheduleSaveAppState_003
349  * @tc.desc:  ScheduleSaveAppState when APP_FREEZE.
350  * @tc.type: FUNC
351  * @tc.require: I5UL6H
352  */
353 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_003, TestSize.Level0)
354 {
355     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
356         SaveModeFlag::SAVE_WITH_FILE);
357     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
358     AppRecovery::GetInstance().mainHandler_ = handler;
359     auto constContext = std::static_pointer_cast<AbilityRuntime::AbilityContext>(context_);
360     // create js runtime for calling AllowCrossThreadExecution
361     AbilityRuntime::Runtime::Options options;
362     auto runtime = AbilityRuntime::JsRuntime::Create(options);
363     auto jsRuntime = static_cast<AbilityRuntime::JsRuntime*>(runtime.get());
364     std::shared_ptr<AbilityRuntime::UIAbility> ability = std::make_shared<AbilityRuntime::JsUIAbility>(*jsRuntime);
365     ability->AttachAbilityContext(constContext);
366     AppRecovery::GetInstance().AddAbility(ability, abilityInfo_, token_);
367     // this call will block main thread, thus call it in new thread
__anon0877e0280102null368     std::thread watchdog([&] {
369         bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::APP_FREEZE);
370         EXPECT_FALSE(ret);
371         printf("ret = %d\n", ret);
372     });
373     watchdog.join();
374 }
375 
376 /**
377  * @tc.name:  ScheduleSaveAppState_004
378  * @tc.desc:  ScheduleSaveAppState when handler is nullptr.
379  * @tc.type: FUNC
380  * @tc.require: I5UL6H
381  */
382 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_004, TestSize.Level0)
383 {
384     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
385         SaveModeFlag::SAVE_WITH_FILE);
386     AppRecovery::GetInstance().mainHandler_.reset();
387     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::DEVELOPER_REQUEST);
388     EXPECT_FALSE(ret);
389 }
390 
391 /**
392  * @tc.name:  ScheduleSaveAppState_005
393  * @tc.desc:  ScheduleSaveAppState when CPP_CRASH
394  * @tc.type: FUNC
395  * @tc.require: I5UL6H
396  */
397 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_005, TestSize.Level0)
398 {
399     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
400         SaveModeFlag::SAVE_WITH_FILE);
401     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
402     AppRecovery::GetInstance().mainHandler_ = handler;
403     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::CPP_CRASH);
404     EXPECT_TRUE(ret);
405 }
406 
407 /**
408  * @tc.name:  ScheduleSaveAppState_006
409  * @tc.desc:  ScheduleSaveAppState with ability address
410  * @tc.type: FUNC
411  * @tc.require: I5UL6H
412  */
413 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_006, TestSize.Level0)
414 {
415     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
416         SaveModeFlag::SAVE_WITH_FILE);
417     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
418     AppRecovery::GetInstance().mainHandler_ = handler;
419     uintptr_t abilityPtr = reinterpret_cast<uintptr_t>(ability_.get());
420     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::JS_ERROR, abilityPtr);
421     EXPECT_TRUE(ret);
422 }
423 
424 /**
425  * @tc.name:  ScheduleSaveAppState_007
426  * @tc.desc:  ScheduleSaveAppState with ability address 0
427  * @tc.type: FUNC
428  * @tc.require: I5UL6H
429  */
430 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_007, TestSize.Level0)
431 {
432     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
433         SaveModeFlag::SAVE_WITH_FILE);
434     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
435     AppRecovery::GetInstance().mainHandler_ = handler;
436     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::JS_ERROR, 0);
437     EXPECT_TRUE(ret);
438 }
439 
440 /**
441  * @tc.name:  ShouldRecoverApp_001
442  * @tc.desc:  ShouldRecoverApp when state is not support save,RestartFlag = NO_RESTART.
443  * @tc.type: FUNC
444  * @tc.require: I5UL6H
445  */
446 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_001, TestSize.Level0)
447 {
448     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::NO_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
449         SaveModeFlag::SAVE_WITH_FILE);
450     bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::DEVELOPER_REQUEST);
451     EXPECT_FALSE(ret);
452 }
453 
454 /**
455  * @tc.name:  ShouldRecoverApp_002
456  * @tc.desc:  ShouldRecoverApp when state is not support save.
457  * @tc.type: FUNC
458  * @tc.require: I5UL6H
459  */
460 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_002, TestSize.Level0)
461 {
462     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
463         SaveModeFlag::SAVE_WITH_FILE);
464     bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::LIFECYCLE);
465     EXPECT_FALSE(ret);
466     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
467         SaveModeFlag::SAVE_WITH_FILE);
468     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::CPP_CRASH);
469     EXPECT_FALSE(ret);
470 }
471 
472 /**
473  * @tc.name:  ShouldRecoverApp_003
474  * @tc.desc:  ShouldRecoverApp when state is support save.
475  * @tc.type: FUNC
476  * @tc.require: I5UL6H
477  */
478 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_003, TestSize.Level0)
479 {
480     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
481         SaveModeFlag::SAVE_WITH_FILE);
482     bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::DEVELOPER_REQUEST);
483     EXPECT_TRUE(ret);
484     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::APP_FREEZE);
485     EXPECT_TRUE(ret);
486     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::RESTART_WHEN_JS_CRASH, SaveOccasionFlag::SAVE_WHEN_ERROR,
487         SaveModeFlag::SAVE_WITH_FILE);
488     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::JS_ERROR);
489     EXPECT_TRUE(ret);
490     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::RESTART_WHEN_APP_FREEZE,
491         SaveOccasionFlag::SAVE_WHEN_ERROR, SaveModeFlag::SAVE_WITH_FILE);
492     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::APP_FREEZE);
493     EXPECT_TRUE(ret);
494 }
495 
496 /**
497  * @tc.name:  ScheduleRecoverApp_001
498  * @tc.desc:  ScheduleRecoverApp when enable flag is false.
499  * @tc.type: FUNC
500  * @tc.require: I5UL6H
501  */
502 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_001, TestSize.Level1)
503 {
504     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
505     EXPECT_FALSE(ret);
506 }
507 
508 /**
509  * @tc.name:  ScheduleRecoverApp_002
510  * @tc.desc:  ScheduleRecoverApp when state is not support save.
511  * @tc.type: FUNC
512  * @tc.require: I5UL6H
513  */
514 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_002, TestSize.Level1)
515 {
516     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::NO_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
517         SaveModeFlag::SAVE_WITH_FILE);
518     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
519     EXPECT_FALSE(ret);
520 }
521 
522 /**
523  * @tc.name:  ScheduleRecoverApp_003
524  * @tc.desc:  ScheduleRecoverApp when abilityRecoverys is empty.
525  * @tc.type: FUNC
526  * @tc.require: I5UL6H
527  */
528 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_003, TestSize.Level0)
529 {
530     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
531         SaveModeFlag::SAVE_WITH_FILE);
532     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
533     EXPECT_FALSE(ret);
534 }
535 
536 /**
537  * @tc.name:  ScheduleRecoverApp_004
538  * @tc.desc:  ScheduleRecoverApp should be return true,reason == StateReason::APP_FREEZE.
539  * @tc.type: FUNC
540  * @tc.require: I5UL6H
541  */
542 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_004, TestSize.Level0)
543 {
544     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
545         SaveModeFlag::SAVE_WITH_FILE);
546     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
547     auto ability = std::make_shared<AbilityRuntime::UIAbility>();
548     sptr<IRemoteObject> token = new MockAbilityToken();
549     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
550     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::APP_FREEZE);
551     EXPECT_TRUE(ret);
552 }
553 
554 /**
555  * @tc.name:  ScheduleRecoverApp_005
556  * @tc.desc:  ScheduleRecoverApp when handler is nullptr.
557  * @tc.type: FUNC
558  * @tc.require: I5UL6H
559  */
560 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_005, TestSize.Level0)
561 {
562     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
563         SaveModeFlag::SAVE_WITH_FILE);
564     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
565     auto ability = std::make_shared<AbilityRuntime::UIAbility>();
566     sptr<IRemoteObject> token = new MockAbilityToken();
567     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
568     AppRecovery::GetInstance().mainHandler_.reset();
569     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
570     EXPECT_FALSE(ret);
571 }
572 
573 /**
574  * @tc.name:  ScheduleRecoverApp_006
575  * @tc.desc:  ScheduleRecoverApp should be retuen true.
576  * @tc.type: FUNC
577  * @tc.require: I5UL6H
578  */
579 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_006, TestSize.Level0)
580 {
581     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
582         SaveModeFlag::SAVE_WITH_FILE);
583     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
584     auto ability = std::make_shared<AbilityRuntime::UIAbility>();
585     sptr<IRemoteObject> token = new MockAbilityToken();
586     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
587     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
588     EXPECT_TRUE(ret);
589 }
590 
591 /**
592  * @tc.name:  TryRecoverApp_001
593  * @tc.desc:  TryRecoverApp when enable flag is false.
594  * @tc.type: FUNC
595  * @tc.require: I5UL6H
596  */
597 HWTEST_F(AppRecoveryUnitTest, TryRecoverApp_001, TestSize.Level1)
598 {
599     bool ret = AppRecovery::GetInstance().TryRecoverApp(StateReason::DEVELOPER_REQUEST);
600     EXPECT_FALSE(ret);
601 }
602 
603 /**
604  * @tc.name:  TryRecoverApp_002
605  * @tc.desc:  TryRecoverApp should be return true.
606  * @tc.type: FUNC
607  * @tc.require: I5UL6H
608  */
609 HWTEST_F(AppRecoveryUnitTest, TryRecoverApp_002, TestSize.Level0)
610 {
611     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
612         SaveModeFlag::SAVE_WITH_FILE);
613     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
614     auto ability = std::make_shared<AbilityRuntime::UIAbility>();
615     sptr<IRemoteObject> token = new MockAbilityToken();
616     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
617     bool ret = AppRecovery::GetInstance().TryRecoverApp(StateReason::APP_FREEZE);
618     EXPECT_TRUE(ret);
619 }
620 
621 /**
622  * @tc.name:  PersistAppState_001
623  * @tc.desc:  Test PersistAppState when saveMode_ == SaveModeFlag::SAVE_WITH_FILE.
624  * @tc.type: FUNC
625  * @tc.require: I5Z7LE
626  */
627 HWTEST_F(AppRecoveryUnitTest, PersistAppState_001, TestSize.Level0)
628 {
629     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
630         SaveModeFlag::SAVE_WITH_FILE);
631     EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
632 }
633 
634 /**
635  * @tc.name:  PersistAppState_002
636  * @tc.desc:  Test PersistAppState when abilityRecoverys is empty.
637  * @tc.type: FUNC
638  * @tc.require: I5Z7LE
639  */
640 HWTEST_F(AppRecoveryUnitTest, PersistAppState_002, TestSize.Level0)
641 {
642     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
643         SaveModeFlag::SAVE_WITH_SHARED_MEMORY);
644     EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
645 }
646 
647 /**
648  * @tc.name:  PersistAppState_003
649  * @tc.desc:  Test PersistAppState when abilityRecoverys is not empty.
650  * @tc.type: FUNC
651  * @tc.require: I5Z7LE
652  */
653 HWTEST_F(AppRecoveryUnitTest, PersistAppState_003, TestSize.Level0)
654 {
655     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
656         SaveModeFlag::SAVE_WITH_SHARED_MEMORY);
657     auto constContext = std::static_pointer_cast<AbilityRuntime::AbilityContext>(context_);
658     std::shared_ptr<AbilityRuntime::UIAbility> ability = std::make_shared<AbilityRuntime::UIAbility>();
659     ability->AttachAbilityContext(constContext);
660     AppRecovery::GetInstance().AddAbility(ability, abilityInfo_, token_);
661     EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
662 }
663 
664 /**
665  * @tc.name:  SetRestartWant_001
666  * @tc.desc:  Test SetRestartWant when enable flag is false.
667  * @tc.type: FUNC
668  * @tc.require: I5Z7LE
669  */
670 HWTEST_F(AppRecoveryUnitTest, SetRestartWant_001, TestSize.Level1)
671 {
672     AppRecovery::GetInstance().isEnable_ = false;
673     std::shared_ptr<AAFwk::Want> want = std::make_shared<AAFwk::Want>();
674     const std::string START_ABILITY = "RestartAbility";
675     want->SetParam(START_ABILITY, std::string("com.ohos.recovery.TestRecoveryAbility"));
676     AppRecovery::GetInstance().SetRestartWant(want);
677     EXPECT_EQ(AppRecovery::GetInstance().want_, nullptr);
678 }
679 
680 /**
681  * @tc.name:  SetRestartWant_002
682  * @tc.desc:  Test SetRestartWant when enable flag is true.
683  * @tc.type: FUNC
684  * @tc.require: I5Z7LE
685  */
686 HWTEST_F(AppRecoveryUnitTest, SetRestartWant_002, TestSize.Level1)
687 {
688     AppRecovery::GetInstance().isEnable_ = true;
689     std::shared_ptr<AAFwk::Want> want = std::make_shared<AAFwk::Want>();
690     const std::string START_ABILITY = "RestartAbility";
691     want->SetParam(START_ABILITY, std::string("com.ohos.recovery.TestRecoveryAbility"));
692     AppRecovery::GetInstance().SetRestartWant(want);
693     EXPECT_EQ(AppRecovery::GetInstance().want_, want);
694 }
695 
696 /**
697  * @tc.name:  GetMissionIds_001
698  * @tc.desc:  Test get mission ids when the path is valid.
699  * @tc.type: FUNC
700  * @tc.require: I5Z7LE
701  */
702 HWTEST_F(AppRecoveryUnitTest, GetMissionIds_001, TestSize.Level1)
703 {
704     AppRecovery::GetInstance().isEnable_ = true;
705     std::vector<int32_t> missionIds;
706     std::string path = "data/app/el2/100/base/ohos.samples.recovery/files/";
707     if (OHOS::FileExists(path)) {
708         EXPECT_TRUE(AppRecovery::GetInstance().GetMissionIds(path, missionIds));
709     } else {
710         EXPECT_FALSE(AppRecovery::GetInstance().GetMissionIds(path, missionIds));
711     }
712 }
713 
714 /**
715  * @tc.name:  GetMissionIds_002
716  * @tc.desc:  Test get mission ids when the file path is invalid.
717  * @tc.type: FUNC
718  * @tc.require: I5Z7LE
719  */
720 HWTEST_F(AppRecoveryUnitTest, GetMissionIds_002, TestSize.Level1)
721 {
722     AppRecovery::GetInstance().isEnable_ = true;
723     std::vector<int32_t> missionIds;
724     std::string invalid_path = "data/apps/ohos.samples.recovery/files/";
725     EXPECT_FALSE(AppRecovery::GetInstance().GetMissionIds(invalid_path, missionIds));
726 }
727 
728 /**
729  * @tc.name:  DeleteInValidMissionFiles_001
730  * @tc.desc:  Test delete invalid mission files.
731  * @tc.type: FUNC
732  * @tc.require: I5Z7LE
733  */
734 HWTEST_F(AppRecoveryUnitTest, DeleteInValidMissionFiles_001, TestSize.Level1)
735 {
736     AbilityRuntime::ApplicationContext::GetInstance()->contextImpl_ = std::make_shared<AbilityRuntime::ContextImpl>();
737     AppRecovery::GetInstance().DeleteInValidMissionFiles();
738     EXPECT_NE(AbilityRuntime::Context::GetApplicationContext(), nullptr);
739 }
740 
741 /**
742  * @tc.name:  DeleteInValidMissionFileById_001
743  * @tc.desc:  add testcase.
744  */
745 HWTEST_F(AppRecoveryUnitTest, DeleteInValidMissionFileById_001, TestSize.Level1)
746 {
747     AbilityRuntime::ApplicationContext::GetInstance()->contextImpl_ = std::make_shared<AbilityRuntime::ContextImpl>();
748     AppRecovery::GetInstance().DeleteInValidMissionFileById("/data/local/tmp", 10);
749     EXPECT_NE(AbilityRuntime::Context::GetApplicationContext(), nullptr);
750 }
751 
752 /**
753  * @tc.name:  ClearPageStack_001
754  * @tc.desc:  add testcase.
755  */
756 HWTEST_F(AppRecoveryUnitTest, ClearPageStack_001, TestSize.Level1)
757 {
758     AbilityRuntime::ApplicationContext::GetInstance()->contextImpl_ = std::make_shared<AbilityRuntime::ContextImpl>();
759     AppRecovery::GetInstance().ClearPageStack("ClearPageStack_001");
760     EXPECT_NE(AbilityRuntime::Context::GetApplicationContext(), nullptr);
761 }
762 
763 /**
764  * @tc.name:  AddAbility_005
765  * @tc.desc:  AddAbility testcase.
766  */
767 HWTEST_F(AppRecoveryUnitTest, AddAbility_005, TestSize.Level1)
768 {
769     bool ret = AppRecovery::GetInstance().AddAbility(nullptr, abilityInfo_, nullptr);
770     EXPECT_FALSE(ret);
771 
772     ret = AppRecovery::GetInstance().AddAbility(ability_, nullptr, nullptr);
773     EXPECT_FALSE(ret);
774 
775     ret = AppRecovery::GetInstance().AddAbility(nullptr, nullptr, nullptr);
776     EXPECT_FALSE(ret);
777 
778     AppRecovery::GetInstance().isEnable_ = true;
779     auto abilityRecovery = std::make_shared<AppExecFwk::AbilityRecovery>();
780     AppRecovery::GetInstance().abilityRecoverys_.push_back(abilityRecovery);
781     EXPECT_FALSE(AppRecovery::GetInstance().abilityRecoverys_.empty());
782     abilityInfo_->recoverable = false;
783     ret = AppRecovery::GetInstance().AddAbility(nullptr, nullptr, nullptr);
784     EXPECT_FALSE(ret);
785 
786     AppRecovery::GetInstance().abilityRecoverys_.clear();
787     ret = AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, nullptr);
788     EXPECT_TRUE(ret);
789 
790     AppRecovery::GetInstance().abilityRecoverys_.clear();
791     abilityInfo_->recoverable = true;
792     ret = AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, nullptr);
793     EXPECT_TRUE(ret);
794 
795     AppRecovery::GetInstance().abilityRecoverys_.clear();
796     AppRecovery::GetInstance().isEnable_ = false;
797     abilityInfo_->recoverable = false;
798     ret = AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, nullptr);
799     EXPECT_EQ(ret, true);
800 }
801 
802 /**
803  * @tc.name:  RemoveAbility_004
804  * @tc.desc:  RemoveAbility_004 testcase.
805  */
806 HWTEST_F(AppRecoveryUnitTest, RemoveAbility_004, TestSize.Level1)
807 {
808     bool ret = AppRecovery::GetInstance().RemoveAbility(nullptr);
809     EXPECT_EQ(ret, false);
810 
811     AppRecovery::GetInstance().abilityRecoverys_.clear();
812     ret = AppRecovery::GetInstance().RemoveAbility(token_);
813     EXPECT_EQ(ret, true);
814 
815     auto abilityRecovery = std::make_shared<AppExecFwk::AbilityRecovery>();
816     abilityRecovery->token_ = token_;
817     AppRecovery::GetInstance().abilityRecoverys_.push_back(abilityRecovery);
818     EXPECT_FALSE(AppRecovery::GetInstance().abilityRecoverys_.empty());
819     EXPECT_EQ(abilityRecovery->GetToken(), token_);
820     ret = AppRecovery::GetInstance().RemoveAbility(token_);
821     EXPECT_TRUE(AppRecovery::GetInstance().abilityRecoverys_.empty());
822     EXPECT_EQ(ret, true);
823 }
824 
825 /**
826  * @tc.name:  SetFreezeCallback_001
827  * @tc.desc:  SetFreezeCallback_001 testcase.
828  */
829 HWTEST_F(AppRecoveryUnitTest, SetFreezeCallback_001, TestSize.Level1)
830 {
__anon0877e0280202() 831     auto callBack1 = []() {};
832     FreezeFunction freezeCallback1 = callBack1;
833     AppRecovery::GetInstance().freezeCallback = freezeCallback1;
__anon0877e0280302() 834     auto callBack2 = []() {};
835     FreezeFunction freezeCallback2 = callBack2;
836     AppRecovery::GetInstance().SetFreezeCallback(freezeCallback2);
837     EXPECT_NE(&AppRecovery::GetInstance().freezeCallback, &freezeCallback2);
838 
839     AppRecovery::GetInstance().freezeCallback = nullptr;
840     AppRecovery::GetInstance().SetFreezeCallback(freezeCallback2);
841     EXPECT_NE(&AppRecovery::GetInstance().freezeCallback, nullptr);
842 }
843 
844 /**
845  * @tc.name:  IsNeedSaveAppState_001
846  * @tc.desc:  IsNeedSaveAppState_001 testcase.
847  */
848 HWTEST_F(AppRecoveryUnitTest, IsNeedSaveAppState_001, TestSize.Level1)
849 {
850     StateReason reason1 { LIFECYCLE };
851     AppRecovery::GetInstance().isEnable_ = false;
852     bool ret = AppRecovery::GetInstance().IsNeedSaveAppState(reason1);
853     EXPECT_EQ(ret, false);
854 
855     AppRecovery::GetInstance().isEnable_ = true;
856     ret = AppRecovery::GetInstance().IsNeedSaveAppState(reason1);
857     EXPECT_EQ(ret, false);
858 
859     StateReason reason2 { DEVELOPER_REQUEST };
860     ret = AppRecovery::GetInstance().IsNeedSaveAppState(reason2);
861     EXPECT_EQ(ret, true);
862 }
863 
864 /**
865  * @tc.name:  ScheduleRecoverApp_007
866  * @tc.desc:  ScheduleRecoverApp_007 testcase.
867  */
868 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_007, TestSize.Level1)
869 {
870     StateReason reason1 { DEVELOPER_REQUEST };
871     AppRecovery::GetInstance().isEnable_ = false;
872     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(reason1);
873     EXPECT_EQ(ret, false);
874 
875     AppRecovery::GetInstance().isEnable_ = true;
876     AppRecovery::GetInstance().restartFlag_ = RestartFlag::NO_RESTART;
877     ret = AppRecovery::GetInstance().ScheduleRecoverApp(reason1);
878     EXPECT_EQ(ret, false);
879 
880     AppRecovery::GetInstance().restartFlag_ = RestartFlag::ALWAYS_RESTART;
881     ret = AppRecovery::GetInstance().ScheduleRecoverApp(reason1);
882     EXPECT_EQ(ret, false);
883 
884     auto abilityRecovery = std::make_shared<AppExecFwk::AbilityRecovery>();
885     AppRecovery::GetInstance().abilityRecoverys_.push_back(abilityRecovery);
886     ret = AppRecovery::GetInstance().ScheduleRecoverApp(reason1);
887     EXPECT_EQ(ret, true);
888 
889     AppRecovery::GetInstance().mainHandler_.reset();
890     ret = AppRecovery::GetInstance().ScheduleRecoverApp(reason1);
891     EXPECT_EQ(ret, false);
892 
893     StateReason reason2 { APP_FREEZE };
894     ret = AppRecovery::GetInstance().ScheduleRecoverApp(reason2);
895     EXPECT_EQ(ret, true);
896 }
897 
898 /**
899  * @tc.name:  DoRecoverApp_002
900  * @tc.desc:  DoRecoverApp_002 testcase.
901  */
902 HWTEST_F(AppRecoveryUnitTest, DoRecoverApp_002, TestSize.Level1)
903 {
904     StateReason reason { DEVELOPER_REQUEST };
905     AppRecovery::GetInstance().abilityRecoverys_.clear();
906     AppRecovery::GetInstance().DoRecoverApp(reason);
907 
908     AppRecovery::GetInstance().want_ = std::make_shared<AAFwk::Want>();
909 
910     auto abilityRecovery1 = std::make_shared<AppExecFwk::AbilityRecovery>();
911     auto ability = std::make_shared<AbilityRuntime::UIAbility>();
912     ability->abilityLifecycleExecutor_ =
913         std::make_shared<AppExecFwk::AbilityLifecycleExecutor>();
914     ability->abilityLifecycleExecutor_->state_ =
915         AbilityLifecycleExecutor::LifecycleState::FOREGROUND_NEW;
916     abilityRecovery1->ability_ = ability;
917 
918     AppRecovery::GetInstance().abilityRecoverys_.push_back(abilityRecovery1);
919     AppRecovery::GetInstance().DoRecoverApp(reason);
920 
921     std::shared_ptr<AppExecFwk::AbilityRecovery> abilityRecovery2 = abilityRecovery1;
922     AppRecovery::GetInstance().abilityRecoverys_.push_back(abilityRecovery2);
923     AppRecovery::GetInstance().DoRecoverApp(reason);
924     EXPECT_EQ(AppRecovery::GetInstance().abilityRecoverys_.size(), 2);
925 }
926 
927 /**
928  * @tc.name:  DoSaveAppState_001
929  * @tc.desc:  DoSaveAppState_001 testcase.
930  */
931 HWTEST_F(AppRecoveryUnitTest, DoSaveAppState_001, TestSize.Level1)
932 {
933     StateReason reason { DEVELOPER_REQUEST };
934     int value = 0;
935     int *ptr = &value;
936     uintptr_t ability = reinterpret_cast<uintptr_t>(ptr);
937     AppRecovery::GetInstance().DoSaveAppState(reason, ability);
938 
939     auto abilityRecory = std::make_shared<AppExecFwk::AbilityRecovery>();
940     abilityRecory->jsAbilityPtr_ = ability;
941     AppRecovery::GetInstance().abilityRecoverys_.push_back(abilityRecory);
942     AppRecovery::GetInstance().DoSaveAppState(reason, ability);
943     EXPECT_FALSE(AppRecovery::GetInstance().abilityRecoverys_.empty());
944 }
945 
946 /**
947  * @tc.name:  PersistAppState_004
948  * @tc.desc:  Test PersistAppState when abilityRecoverys is not empty.
949  * @tc.type: FUNC
950  * @tc.require: I5Z7LE
951  */
952 HWTEST_F(AppRecoveryUnitTest, PersistAppState_004, TestSize.Level1)
953 {
954     auto abilityRecovery = std::make_shared<AppExecFwk::AbilityRecovery>();
955     AppRecovery::GetInstance().abilityRecoverys_.push_back(abilityRecovery);
956     bool ret = AppRecovery::GetInstance().PersistAppState();
957     EXPECT_EQ(ret, false);
958 
959     AppRecovery::GetInstance().saveMode_ = SaveModeFlag::SAVE_WITH_FILE;
960     ret = AppRecovery::GetInstance().PersistAppState();
961     EXPECT_EQ(ret, true);
962 }
963 }  // namespace AppExecFwk
964 }  // namespace OHOS
965