• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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.h"
26 #include "ability_info.h"
27 #include "ability_runtime/js_ability.h"
28 #include "event_handler.h"
29 #include "js_runtime.h"
30 #include "mock_ability_context.h"
31 #include "mock_ability_token.h"
32 #include "recovery_param.h"
33 
34 using namespace testing::ext;
35 namespace OHOS {
36 namespace AppExecFwk {
37 class AppRecoveryUnitTest : public testing::Test {
38 public:
39     static void SetUpTestCase();
40     static void TearDownTestCase();
41     void SetUp();
42     void TearDown();
43     std::shared_ptr<AppExecFwk::Ability> ability_ = std::make_shared<Ability>();
44     std::shared_ptr<AppExecFwk::AbilityInfo> abilityInfo_ = std::make_shared<AbilityInfo>();
45     std::shared_ptr<AppExecFwk::ApplicationInfo> applicationInfo_ = std::make_shared<ApplicationInfo>();
46     std::shared_ptr<AppExecFwk::EventHandler> testHandler_ = std::make_shared<EventHandler>();
47     sptr<IRemoteObject> token_ = new MockAbilityToken();
48     std::shared_ptr<AbilityRuntime::MockAbilityContext> context_ =
49         std::make_shared<AbilityRuntime::MockAbilityContext>();
50 };
51 
SetUpTestCase()52 void AppRecoveryUnitTest::SetUpTestCase()
53 {
54 }
55 
TearDownTestCase()56 void AppRecoveryUnitTest::TearDownTestCase()
57 {}
58 
SetUp()59 void AppRecoveryUnitTest::SetUp()
60 {
61     AppRecovery::GetInstance().isEnable_ = false;
62     AppRecovery::GetInstance().restartFlag_ = 0;
63     AppRecovery::GetInstance().saveOccasion_ = 0;
64     AppRecovery::GetInstance().saveMode_ = 0;
65     AppRecovery::GetInstance().abilityRecoverys_.clear();
66     AppRecovery::GetInstance().mainHandler_ = testHandler_;
67     AppRecovery::GetInstance().applicationInfo_ = applicationInfo_;
68     AppRecovery::GetInstance().want_ = nullptr;
69 }
70 
TearDown()71 void AppRecoveryUnitTest::TearDown()
72 {
73 }
74 
75 /**
76  * @tc.name: GetRestartFlag_001
77  * @tc.desc: Test GetRestartFlag
78  * @tc.type: FUNC
79  * @tc.require: I5UL6H
80  */
81 HWTEST_F(AppRecoveryUnitTest, GetRestartFlag_001, TestSize.Level1)
82 {
83     EXPECT_EQ(AppRecovery::GetInstance().GetRestartFlag(), 0);
84     AppRecovery::GetInstance().restartFlag_ = RestartFlag::ALWAYS_RESTART;
85     EXPECT_EQ(AppRecovery::GetInstance().GetRestartFlag(), RestartFlag::ALWAYS_RESTART);
86 }
87 
88 /**
89  * @tc.name: GetSaveOccasionFlag_001
90  * @tc.desc: Test GetSaveOccasionFlag
91  * @tc.type: FUNC
92  * @tc.require: I5UL6H
93  */
94 HWTEST_F(AppRecoveryUnitTest, GetSaveOccasionFlag_001, TestSize.Level1)
95 {
96     EXPECT_EQ(AppRecovery::GetInstance().GetSaveOccasionFlag(), 0);
97     AppRecovery::GetInstance().saveOccasion_ = SaveOccasionFlag::SAVE_WHEN_ERROR;
98     EXPECT_EQ(AppRecovery::GetInstance().GetSaveOccasionFlag(), SaveOccasionFlag::SAVE_WHEN_ERROR);
99 }
100 /**
101  * @tc.name: GetSaveModeFlag_001
102  * @tc.desc: Test GetSaveModeFlag
103  * @tc.type: FUNC
104  * @tc.require: I5UL6H
105  */
106 HWTEST_F(AppRecoveryUnitTest, GetSaveModeFlag_001, TestSize.Level1)
107 {
108     EXPECT_EQ(AppRecovery::GetInstance().GetSaveModeFlag(), 0);
109     AppRecovery::GetInstance().saveMode_ = SaveModeFlag::SAVE_WITH_FILE;
110     EXPECT_EQ(AppRecovery::GetInstance().GetSaveModeFlag(), SaveModeFlag::SAVE_WITH_FILE);
111 }
112 
113 /**
114  * @tc.name: InitApplicationInfo_001
115  * @tc.desc: Test InitApplicationInfo
116  * @tc.type: FUNC
117  * @tc.require: I5UL6H
118  */
119 HWTEST_F(AppRecoveryUnitTest, InitApplicationInfo_001, TestSize.Level1)
120 {
121     EXPECT_TRUE(AppRecovery::GetInstance().InitApplicationInfo(testHandler_, applicationInfo_));
122 }
123 
124 /**
125  * @tc.name: EnableAppRecovery_001
126  * @tc.desc: EnableAppRecovery with config, check the enable flag is set as expected.
127  * @tc.type: FUNC
128  * @tc.require: I5UL6H
129  */
130 HWTEST_F(AppRecoveryUnitTest, EnableAppRecovery_001, TestSize.Level1)
131 {
132     EXPECT_FALSE(AppRecovery::GetInstance().IsEnabled());
133     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
134         SaveModeFlag::SAVE_WITH_FILE);
135     EXPECT_TRUE(AppRecovery::GetInstance().IsEnabled());
136 }
137 
138 /**
139  * @tc.name: EnableAppRecovery_002
140  * @tc.desc: EnableAppRecovery with config, check the config is set as expected.
141  * @tc.type: FUNC
142  * @tc.require: I5UL6H
143  */
144 HWTEST_F(AppRecoveryUnitTest, EnableAppRecovery_002, TestSize.Level1)
145 {
146     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
147         SaveModeFlag::SAVE_WITH_FILE);
148     EXPECT_EQ(RestartFlag::ALWAYS_RESTART, AppRecovery::GetInstance().GetRestartFlag());
149     EXPECT_EQ(SaveOccasionFlag::SAVE_WHEN_ERROR, AppRecovery::GetInstance().GetSaveOccasionFlag());
150     EXPECT_EQ(SaveModeFlag::SAVE_WITH_FILE, AppRecovery::GetInstance().GetSaveModeFlag());
151 }
152 
153 /**
154  * @tc.name: EnableAppRecovery_003
155  * @tc.desc: EnableAppRecovery with config, check the config is set as expected.
156  * @tc.type: FUNC
157  * @tc.require: I5UL6H
158  */
159 HWTEST_F(AppRecoveryUnitTest, EnableAppRecovery_003, TestSize.Level1)
160 {
161     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::NO_RESTART, SaveOccasionFlag::SAVE_ALL,
162         SaveModeFlag::SAVE_WITH_SHARED_MEMORY);
163     EXPECT_EQ(RestartFlag::NO_RESTART, AppRecovery::GetInstance().GetRestartFlag());
164     EXPECT_EQ(SaveOccasionFlag::SAVE_ALL, AppRecovery::GetInstance().GetSaveOccasionFlag());
165     EXPECT_EQ(SaveModeFlag::SAVE_WITH_SHARED_MEMORY, AppRecovery::GetInstance().GetSaveModeFlag());
166 }
167 
168 /**
169  * @tc.name:  AddAbility_001
170  * @tc.desc: AddAbility when enable flag is false.
171  * @tc.type: FUNC
172  * @tc.require: I5UL6H
173  */
174 HWTEST_F(AppRecoveryUnitTest, AddAbility_001, TestSize.Level1)
175 {
176     AppRecovery::GetInstance().isEnable_ = false;
177     bool ret = AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_);
178     EXPECT_FALSE(ret);
179 }
180 
181 /**
182  * @tc.name:  AddAbility_002
183  * @tc.desc: AddAbility when abilityRecoverys_ is not empty.
184  * @tc.type: FUNC
185  * @tc.require: I5UL6H
186  */
187 HWTEST_F(AppRecoveryUnitTest, AddAbility_002, TestSize.Level1)
188 {
189     AppRecovery::GetInstance().isEnable_ = true;
190     auto abilityRecovery = std::make_shared<AbilityRecovery>();
191     AppRecovery::GetInstance().abilityRecoverys_.push_back(abilityRecovery);
192     bool ret = AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_);
193     EXPECT_FALSE(ret);
194 }
195 
196 /**
197  * @tc.name:  AddAbility_003
198  * @tc.desc: AddAbility check the ret as expected.
199  * @tc.type: FUNC
200  * @tc.require: I5UL6H
201  */
202 HWTEST_F(AppRecoveryUnitTest, AddAbility_003, TestSize.Level1)
203 {
204     AppRecovery::GetInstance().isEnable_ = true;
205     bool ret = AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_);
206     EXPECT_TRUE(ret);
207 }
208 
209 /**
210  * @tc.name:  RemoveAbility_001
211  * @tc.desc: RemoveAbility check the ret as expected.
212  * @tc.type: FUNC
213  * @tc.require: I5UL6H
214  */
215 HWTEST_F(AppRecoveryUnitTest, RemoveAbility_001, TestSize.Level1)
216 {
217     AppRecovery::GetInstance().isEnable_ = true;
218     bool ret = AppRecovery::GetInstance().RemoveAbility(token_);
219     EXPECT_TRUE(ret);
220 }
221 
222 /**
223  * @tc.name:  RemoveAbility_002
224  * @tc.desc: RemoveAbility when enable flag is false.
225  * @tc.type: FUNC
226  * @tc.require: I5UL6H
227  */
228 HWTEST_F(AppRecoveryUnitTest, RemoveAbility_002, TestSize.Level1)
229 {
230     AppRecovery::GetInstance().isEnable_ = false;
231     bool ret = AppRecovery::GetInstance().RemoveAbility(token_);
232     EXPECT_FALSE(ret);
233 }
234 
235 /**
236  * @tc.name:  ShouldSaveAppState_001
237  * @tc.desc:  ShouldSaveAppState when state is support save.
238  * @tc.type: FUNC
239  * @tc.require: I5UL6H
240  */
241 HWTEST_F(AppRecoveryUnitTest, ShouldSaveAppState_001, TestSize.Level1)
242 {
243     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
244         SaveModeFlag::SAVE_WITH_FILE);
245     bool ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::DEVELOPER_REQUEST);
246     EXPECT_TRUE(ret);
247 }
248 
249 /**
250  * @tc.name:  ShouldSaveAppState_002
251  * @tc.desc:  ShouldSaveAppState when state is not support save.
252  * @tc.type: FUNC
253  * @tc.require: I5UL6H
254  */
255 HWTEST_F(AppRecoveryUnitTest, ShouldSaveAppState_002, TestSize.Level1)
256 {
257     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
258         SaveModeFlag::SAVE_WITH_FILE);
259     bool ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::LIFECYCLE);
260     EXPECT_FALSE(ret);
261 }
262 
263 /**
264  * @tc.name:  ShouldSaveAppState_003
265  * @tc.desc:  ShouldSaveAppState when state is not support save.
266  * @tc.type: FUNC
267  * @tc.require: I5UL6H
268  */
269 HWTEST_F(AppRecoveryUnitTest, ShouldSaveAppState_003, TestSize.Level1)
270 {
271     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_BACKGROUND,
272         SaveModeFlag::SAVE_WITH_FILE);
273     bool ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::CPP_CRASH);
274     EXPECT_FALSE(ret);
275     ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::JS_ERROR);
276     EXPECT_FALSE(ret);
277     ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::APP_FREEZE);
278     EXPECT_FALSE(ret);
279 }
280 
281 /**
282  * @tc.name:  ScheduleSaveAppState_001
283  * @tc.desc:  ScheduleSaveAppState when enable flag is false.
284  * @tc.type: FUNC
285  * @tc.require: I5UL6H
286  */
287 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_001, TestSize.Level1)
288 {
289     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::DEVELOPER_REQUEST);
290     EXPECT_FALSE(ret);
291 }
292 
293 /**
294  * @tc.name:  ScheduleSaveAppState_002
295  * @tc.desc:  ScheduleSaveAppState when state is not support save.
296  * @tc.type: FUNC
297  * @tc.require: I5UL6H
298  */
299 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_002, TestSize.Level1)
300 {
301     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
302         SaveModeFlag::SAVE_WITH_FILE);
303     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::LIFECYCLE);
304     EXPECT_FALSE(ret);
305 }
306 
307 /**
308  * @tc.name:  ScheduleSaveAppState_003
309  * @tc.desc:  ScheduleSaveAppState when APP_FREEZE.
310  * @tc.type: FUNC
311  * @tc.require: I5UL6H
312  */
313 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_003, TestSize.Level1)
314 {
315     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
316         SaveModeFlag::SAVE_WITH_FILE);
317     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
318     AppRecovery::GetInstance().mainHandler_ = handler;
319     auto constContext = std::static_pointer_cast<AbilityRuntime::AbilityContext>(context_);
320     // create js runtime for calling AllowCrossThreadExecution
321     AbilityRuntime::Runtime::Options options;
322     auto runtime = AbilityRuntime::JsRuntime::Create(options);
323     auto jsRuntime = static_cast<AbilityRuntime::JsRuntime*>(runtime.get());
324     std::shared_ptr<AppExecFwk::Ability> ability = std::make_shared<AbilityRuntime::JsAbility>(*jsRuntime);
325     ability->AttachAbilityContext(constContext);
326     AppRecovery::GetInstance().AddAbility(ability, abilityInfo_, token_);
327     // this call will block main thread, thus call it in new thread
__anone2de28650102null328     std::thread watchdog([&] {
329         bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::APP_FREEZE);
330         EXPECT_TRUE(ret);
331     });
332     watchdog.join();
333 
334 }
335 
336 /**
337  * @tc.name:  ScheduleSaveAppState_004
338  * @tc.desc:  ScheduleSaveAppState when handler is nullptr.
339  * @tc.type: FUNC
340  * @tc.require: I5UL6H
341  */
342 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_004, TestSize.Level1)
343 {
344     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
345         SaveModeFlag::SAVE_WITH_FILE);
346     AppRecovery::GetInstance().mainHandler_.reset();
347     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::DEVELOPER_REQUEST);
348     EXPECT_FALSE(ret);
349 }
350 
351 /**
352  * @tc.name:  ScheduleSaveAppState_005
353  * @tc.desc:  ScheduleSaveAppState when CPP_CRASH
354  * @tc.type: FUNC
355  * @tc.require: I5UL6H
356  */
357 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_005, TestSize.Level1)
358 {
359     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
360         SaveModeFlag::SAVE_WITH_FILE);
361     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
362     AppRecovery::GetInstance().mainHandler_ = handler;
363     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::CPP_CRASH);
364     EXPECT_TRUE(ret);
365 }
366 
367 /**
368  * @tc.name:  ScheduleSaveAppState_006
369  * @tc.desc:  ScheduleSaveAppState with ability address
370  * @tc.type: FUNC
371  * @tc.require: I5UL6H
372  */
373 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_006, TestSize.Level1)
374 {
375     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
376         SaveModeFlag::SAVE_WITH_FILE);
377     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
378     AppRecovery::GetInstance().mainHandler_ = handler;
379     uintptr_t abilityPtr = reinterpret_cast<uintptr_t>(ability_.get());
380     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::JS_ERROR, abilityPtr);
381     EXPECT_TRUE(ret);
382 }
383 
384 /**
385  * @tc.name:  ScheduleSaveAppState_007
386  * @tc.desc:  ScheduleSaveAppState with ability address 0
387  * @tc.type: FUNC
388  * @tc.require: I5UL6H
389  */
390 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_007, TestSize.Level1)
391 {
392     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
393         SaveModeFlag::SAVE_WITH_FILE);
394     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
395     AppRecovery::GetInstance().mainHandler_ = handler;
396     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::JS_ERROR, 0);
397     EXPECT_TRUE(ret);
398 }
399 
400 /**
401  * @tc.name:  ShouldRecoverApp_001
402  * @tc.desc:  ShouldRecoverApp when state is not support save,RestartFlag = NO_RESTART.
403  * @tc.type: FUNC
404  * @tc.require: I5UL6H
405  */
406 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_001, TestSize.Level1)
407 {
408     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::NO_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
409         SaveModeFlag::SAVE_WITH_FILE);
410     bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::DEVELOPER_REQUEST);
411     EXPECT_FALSE(ret);
412 }
413 
414 /**
415  * @tc.name:  ShouldRecoverApp_002
416  * @tc.desc:  ShouldRecoverApp when state is not support save.
417  * @tc.type: FUNC
418  * @tc.require: I5UL6H
419  */
420 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_002, TestSize.Level1)
421 {
422     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
423         SaveModeFlag::SAVE_WITH_FILE);
424     bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::LIFECYCLE);
425     EXPECT_FALSE(ret);
426     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
427         SaveModeFlag::SAVE_WITH_FILE);
428     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::CPP_CRASH);
429     EXPECT_FALSE(ret);
430 }
431 
432 /**
433  * @tc.name:  ShouldRecoverApp_003
434  * @tc.desc:  ShouldRecoverApp when state is support save.
435  * @tc.type: FUNC
436  * @tc.require: I5UL6H
437  */
438 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_003, TestSize.Level1)
439 {
440     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
441         SaveModeFlag::SAVE_WITH_FILE);
442     bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::DEVELOPER_REQUEST);
443     EXPECT_TRUE(ret);
444     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::APP_FREEZE);
445     EXPECT_TRUE(ret);
446     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::RESTART_WHEN_JS_CRASH, SaveOccasionFlag::SAVE_WHEN_ERROR,
447         SaveModeFlag::SAVE_WITH_FILE);
448     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::JS_ERROR);
449     EXPECT_TRUE(ret);
450     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::RESTART_WHEN_APP_FREEZE,
451         SaveOccasionFlag::SAVE_WHEN_ERROR, SaveModeFlag::SAVE_WITH_FILE);
452     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::APP_FREEZE);
453     EXPECT_TRUE(ret);
454 }
455 
456 /**
457  * @tc.name:  ScheduleRecoverApp_001
458  * @tc.desc:  ScheduleRecoverApp when enable flag is false.
459  * @tc.type: FUNC
460  * @tc.require: I5UL6H
461  */
462 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_001, TestSize.Level1)
463 {
464     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
465     EXPECT_FALSE(ret);
466 }
467 
468 /**
469  * @tc.name:  ScheduleRecoverApp_002
470  * @tc.desc:  ScheduleRecoverApp when state is not support save.
471  * @tc.type: FUNC
472  * @tc.require: I5UL6H
473  */
474 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_002, TestSize.Level1)
475 {
476     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::NO_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
477         SaveModeFlag::SAVE_WITH_FILE);
478     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
479     EXPECT_FALSE(ret);
480 }
481 
482 /**
483  * @tc.name:  ScheduleRecoverApp_003
484  * @tc.desc:  ScheduleRecoverApp when abilityRecoverys is empty.
485  * @tc.type: FUNC
486  * @tc.require: I5UL6H
487  */
488 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_003, TestSize.Level1)
489 {
490     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
491         SaveModeFlag::SAVE_WITH_FILE);
492     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
493     EXPECT_FALSE(ret);
494 }
495 
496 /**
497  * @tc.name:  ScheduleRecoverApp_004
498  * @tc.desc:  ScheduleRecoverApp should be return true,reason == StateReason::APP_FREEZE.
499  * @tc.type: FUNC
500  * @tc.require: I5UL6H
501  */
502 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_004, TestSize.Level1)
503 {
504     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
505         SaveModeFlag::SAVE_WITH_FILE);
506     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
507     auto ability = std::make_shared<Ability>();
508     sptr<IRemoteObject> token = new MockAbilityToken();
509     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
510     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::APP_FREEZE);
511     EXPECT_TRUE(ret);
512 }
513 
514 /**
515  * @tc.name:  ScheduleRecoverApp_005
516  * @tc.desc:  ScheduleRecoverApp when handler is nullptr.
517  * @tc.type: FUNC
518  * @tc.require: I5UL6H
519  */
520 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_005, TestSize.Level1)
521 {
522     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
523         SaveModeFlag::SAVE_WITH_FILE);
524     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
525     auto ability = std::make_shared<Ability>();
526     sptr<IRemoteObject> token = new MockAbilityToken();
527     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
528     AppRecovery::GetInstance().mainHandler_.reset();
529     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
530     EXPECT_FALSE(ret);
531 }
532 
533 /**
534  * @tc.name:  ScheduleRecoverApp_006
535  * @tc.desc:  ScheduleRecoverApp should be retuen true.
536  * @tc.type: FUNC
537  * @tc.require: I5UL6H
538  */
539 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_006, TestSize.Level1)
540 {
541     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
542         SaveModeFlag::SAVE_WITH_FILE);
543     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
544     auto ability = std::make_shared<Ability>();
545     sptr<IRemoteObject> token = new MockAbilityToken();
546     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
547     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
548     EXPECT_TRUE(ret);
549 }
550 
551 /**
552  * @tc.name:  TryRecoverApp_001
553  * @tc.desc:  TryRecoverApp when enable flag is false.
554  * @tc.type: FUNC
555  * @tc.require: I5UL6H
556  */
557 HWTEST_F(AppRecoveryUnitTest, TryRecoverApp_001, TestSize.Level1)
558 {
559     bool ret = AppRecovery::GetInstance().TryRecoverApp(StateReason::DEVELOPER_REQUEST);
560     EXPECT_FALSE(ret);
561 }
562 
563 /**
564  * @tc.name:  TryRecoverApp_002
565  * @tc.desc:  TryRecoverApp should be return true.
566  * @tc.type: FUNC
567  * @tc.require: I5UL6H
568  */
569 HWTEST_F(AppRecoveryUnitTest, TryRecoverApp_002, TestSize.Level1)
570 {
571     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
572         SaveModeFlag::SAVE_WITH_FILE);
573     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
574     auto ability = std::make_shared<Ability>();
575     sptr<IRemoteObject> token = new MockAbilityToken();
576     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
577     bool ret = AppRecovery::GetInstance().TryRecoverApp(StateReason::APP_FREEZE);
578     EXPECT_TRUE(ret);
579 }
580 
581 /**
582  * @tc.name:  PersistAppState_001
583  * @tc.desc:  Test PersistAppState when saveMode_ == SaveModeFlag::SAVE_WITH_FILE.
584  * @tc.type: FUNC
585  * @tc.require: I5Z7LE
586  */
587 HWTEST_F(AppRecoveryUnitTest, PersistAppState_001, TestSize.Level1)
588 {
589     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
590         SaveModeFlag::SAVE_WITH_FILE);
591     EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
592 }
593 
594 /**
595  * @tc.name:  PersistAppState_002
596  * @tc.desc:  Test PersistAppState when abilityRecoverys is empty.
597  * @tc.type: FUNC
598  * @tc.require: I5Z7LE
599  */
600 HWTEST_F(AppRecoveryUnitTest, PersistAppState_002, TestSize.Level1)
601 {
602     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
603         SaveModeFlag::SAVE_WITH_SHARED_MEMORY);
604     EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
605 }
606 
607 /**
608  * @tc.name:  PersistAppState_003
609  * @tc.desc:  Test PersistAppState when abilityRecoverys is not empty.
610  * @tc.type: FUNC
611  * @tc.require: I5Z7LE
612  */
613 HWTEST_F(AppRecoveryUnitTest, PersistAppState_003, TestSize.Level1)
614 {
615     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
616         SaveModeFlag::SAVE_WITH_SHARED_MEMORY);
617     auto constContext = std::static_pointer_cast<AbilityRuntime::AbilityContext>(context_);
618     std::shared_ptr<AppExecFwk::Ability> ability = std::make_shared<Ability>();
619     ability->AttachAbilityContext(constContext);
620     AppRecovery::GetInstance().AddAbility(ability, abilityInfo_, token_);
621     EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
622 }
623 
624 /**
625  * @tc.name:  SetRestartWant_001
626  * @tc.desc:  Test SetRestartWant when enable flag is false.
627  * @tc.type: FUNC
628  * @tc.require: I5Z7LE
629  */
630 HWTEST_F(AppRecoveryUnitTest, SetRestartWant_001, TestSize.Level1)
631 {
632     AppRecovery::GetInstance().isEnable_ = false;
633     std::shared_ptr<AAFwk::Want> want = std::make_shared<AAFwk::Want>();
634     const std::string START_ABILITY = "RestartAbility";
635     want->SetParam(START_ABILITY, std::string("com.ohos.recovery.TestRecoveryAbility"));
636     AppRecovery::GetInstance().SetRestartWant(want);
637     EXPECT_EQ(AppRecovery::GetInstance().want_, nullptr);
638 }
639 
640 /**
641  * @tc.name:  SetRestartWant_002
642  * @tc.desc:  Test SetRestartWant when enable flag is true.
643  * @tc.type: FUNC
644  * @tc.require: I5Z7LE
645  */
646 HWTEST_F(AppRecoveryUnitTest, SetRestartWant_002, TestSize.Level1)
647 {
648     AppRecovery::GetInstance().isEnable_ = true;
649     std::shared_ptr<AAFwk::Want> want = std::make_shared<AAFwk::Want>();
650     const std::string START_ABILITY = "RestartAbility";
651     want->SetParam(START_ABILITY, std::string("com.ohos.recovery.TestRecoveryAbility"));
652     AppRecovery::GetInstance().SetRestartWant(want);
653     EXPECT_EQ(AppRecovery::GetInstance().want_, want);
654 }
655 
656 /**
657  * @tc.name:  GetMissionIds_001
658  * @tc.desc:  Test get mission ids when the path is valid.
659  * @tc.type: FUNC
660  * @tc.require: I5Z7LE
661  */
662 HWTEST_F(AppRecoveryUnitTest, GetMissionIds_001, TestSize.Level1)
663 {
664     AppRecovery::GetInstance().isEnable_ = true;
665     std::vector<int32_t> missionIds;
666     std::string path = "data/app/el2/100/base/ohos.samples.recovery/files/";
667     if (OHOS::FileExists(path)) {
668         EXPECT_TRUE(AppRecovery::GetInstance().GetMissionIds(path, missionIds));
669     } else {
670         EXPECT_FALSE(AppRecovery::GetInstance().GetMissionIds(path, missionIds));
671     }
672 }
673 
674 /**
675  * @tc.name:  GetMissionIds_002
676  * @tc.desc:  Test get mission ids when the file path is invalid.
677  * @tc.type: FUNC
678  * @tc.require: I5Z7LE
679  */
680 HWTEST_F(AppRecoveryUnitTest, GetMissionIds_002, TestSize.Level1)
681 {
682     AppRecovery::GetInstance().isEnable_ = true;
683     std::vector<int32_t> missionIds;
684     std::string invalid_path = "data/apps/ohos.samples.recovery/files/";
685     EXPECT_FALSE(AppRecovery::GetInstance().GetMissionIds(invalid_path, missionIds));
686 }
687 }  // namespace AppExecFwk
688 }  // namespace OHOS
689