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