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