• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <gtest/gtest.h>
17 
18 #include <memory>
19 #include <thread>
20 #include "file_ex.h"
21 
22 #define private public
23 #include "app_recovery.h"
24 #undef private
25 #include "ability_info.h"
26 #include "ability_runtime/js_ui_ability.h"
27 #include "event_handler.h"
28 #include "js_runtime.h"
29 #include "mock_ability_context.h"
30 #include "mock_ability_token.h"
31 #include "recovery_param.h"
32 #include "ui_ability.h"
33 #define private public
34 #include "context/application_context.h"
35 
36 using 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:  AddAbility_004
213  * @tc.desc: add testcase.
214  * @tc.type: FUNC
215  * @tc.require: I5UL6H
216  */
217 HWTEST_F(AppRecoveryUnitTest, AddAbility_004, TestSize.Level1)
218 {
219     bool ret = AppRecovery::GetInstance().AddAbility(ability_, nullptr, token_);
220     EXPECT_TRUE(!ret);
221 }
222 
223 /**
224  * @tc.name:  RemoveAbility_001
225  * @tc.desc: RemoveAbility check the ret as expected.
226  * @tc.type: FUNC
227  * @tc.require: I5UL6H
228  */
229 HWTEST_F(AppRecoveryUnitTest, RemoveAbility_001, TestSize.Level1)
230 {
231     AppRecovery::GetInstance().isEnable_ = true;
232     bool ret = AppRecovery::GetInstance().RemoveAbility(token_);
233     EXPECT_TRUE(ret);
234 }
235 
236 /**
237  * @tc.name:  RemoveAbility_002
238  * @tc.desc: RemoveAbility when enable flag is false.
239  * @tc.type: FUNC
240  * @tc.require: I5UL6H
241  */
242 HWTEST_F(AppRecoveryUnitTest, RemoveAbility_002, TestSize.Level1)
243 {
244     AppRecovery::GetInstance().isEnable_ = false;
245     bool ret = AppRecovery::GetInstance().RemoveAbility(token_);
246     EXPECT_TRUE(ret);
247 }
248 
249 /**
250  * @tc.name:  RemoveAbility_003
251  * @tc.desc: RemoveAbility failed when token_ is null.
252  * @tc.type: FUNC
253  * @tc.require: I5UL6H
254  */
255 HWTEST_F(AppRecoveryUnitTest, RemoveAbility_003, TestSize.Level1)
256 {
257     bool ret = AppRecovery::GetInstance().RemoveAbility(nullptr);
258     EXPECT_TRUE(!ret);
259 }
260 
261 /**
262  * @tc.name: DoRecoverApp_001
263  * @tc.desc: add testcase.
264  * @tc.type: FUNC
265  * @tc.require: I5UL6H
266  */
267 HWTEST_F(AppRecoveryUnitTest, DoRecoverApp_001, TestSize.Level1)
268 {
269     AppRecovery::GetInstance().abilityRecoverys_.clear();
270     AppRecovery::GetInstance().DoRecoverApp(StateReason::DEVELOPER_REQUEST);
271     EXPECT_TRUE(AppRecovery::GetInstance().abilityRecoverys_.empty());
272 }
273 
274 /**
275  * @tc.name:  ShouldSaveAppState_001
276  * @tc.desc:  ShouldSaveAppState when state is support save.
277  * @tc.type: FUNC
278  * @tc.require: I5UL6H
279  */
280 HWTEST_F(AppRecoveryUnitTest, ShouldSaveAppState_001, TestSize.Level1)
281 {
282     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
283         SaveModeFlag::SAVE_WITH_FILE);
284     bool ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::DEVELOPER_REQUEST);
285     EXPECT_TRUE(ret);
286 }
287 
288 /**
289  * @tc.name:  ShouldSaveAppState_002
290  * @tc.desc:  ShouldSaveAppState when state is not support save.
291  * @tc.type: FUNC
292  * @tc.require: I5UL6H
293  */
294 HWTEST_F(AppRecoveryUnitTest, ShouldSaveAppState_002, TestSize.Level1)
295 {
296     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
297         SaveModeFlag::SAVE_WITH_FILE);
298     bool ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::LIFECYCLE);
299     EXPECT_FALSE(ret);
300 }
301 
302 /**
303  * @tc.name:  ShouldSaveAppState_003
304  * @tc.desc:  ShouldSaveAppState when state is not support save.
305  * @tc.type: FUNC
306  * @tc.require: I5UL6H
307  */
308 HWTEST_F(AppRecoveryUnitTest, ShouldSaveAppState_003, TestSize.Level1)
309 {
310     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_BACKGROUND,
311         SaveModeFlag::SAVE_WITH_FILE);
312     bool ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::CPP_CRASH);
313     EXPECT_FALSE(ret);
314     ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::JS_ERROR);
315     EXPECT_FALSE(ret);
316     ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::APP_FREEZE);
317     EXPECT_FALSE(ret);
318 }
319 
320 /**
321  * @tc.name:  ScheduleSaveAppState_001
322  * @tc.desc:  ScheduleSaveAppState when enable flag is false.
323  * @tc.type: FUNC
324  * @tc.require: I5UL6H
325  */
326 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_001, TestSize.Level1)
327 {
328     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::DEVELOPER_REQUEST);
329     EXPECT_FALSE(ret);
330 }
331 
332 /**
333  * @tc.name:  ScheduleSaveAppState_002
334  * @tc.desc:  ScheduleSaveAppState when state is not support save.
335  * @tc.type: FUNC
336  * @tc.require: I5UL6H
337  */
338 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_002, TestSize.Level1)
339 {
340     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
341         SaveModeFlag::SAVE_WITH_FILE);
342     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::LIFECYCLE);
343     EXPECT_FALSE(ret);
344 }
345 
346 /**
347  * @tc.name:  ScheduleSaveAppState_003
348  * @tc.desc:  ScheduleSaveAppState when APP_FREEZE.
349  * @tc.type: FUNC
350  * @tc.require: I5UL6H
351  */
352 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_003, TestSize.Level1)
353 {
354     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
355         SaveModeFlag::SAVE_WITH_FILE);
356     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
357     AppRecovery::GetInstance().mainHandler_ = handler;
358     auto constContext = std::static_pointer_cast<AbilityRuntime::AbilityContext>(context_);
359     // create js runtime for calling AllowCrossThreadExecution
360     AbilityRuntime::Runtime::Options options;
361     auto runtime = AbilityRuntime::JsRuntime::Create(options);
362     auto jsRuntime = static_cast<AbilityRuntime::JsRuntime*>(runtime.get());
363     std::shared_ptr<AbilityRuntime::UIAbility> ability = std::make_shared<AbilityRuntime::JsUIAbility>(*jsRuntime);
364     ability->AttachAbilityContext(constContext);
365     AppRecovery::GetInstance().AddAbility(ability, abilityInfo_, token_);
366     // this call will block main thread, thus call it in new thread
__anon7cdda9460102null367     std::thread watchdog([&] {
368         bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::APP_FREEZE);
369         EXPECT_TRUE(ret);
370     });
371     watchdog.join();
372 }
373 
374 /**
375  * @tc.name:  ScheduleSaveAppState_004
376  * @tc.desc:  ScheduleSaveAppState when handler is nullptr.
377  * @tc.type: FUNC
378  * @tc.require: I5UL6H
379  */
380 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_004, TestSize.Level1)
381 {
382     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
383         SaveModeFlag::SAVE_WITH_FILE);
384     AppRecovery::GetInstance().mainHandler_.reset();
385     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::DEVELOPER_REQUEST);
386     EXPECT_FALSE(ret);
387 }
388 
389 /**
390  * @tc.name:  ScheduleSaveAppState_005
391  * @tc.desc:  ScheduleSaveAppState when CPP_CRASH
392  * @tc.type: FUNC
393  * @tc.require: I5UL6H
394  */
395 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_005, TestSize.Level1)
396 {
397     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
398         SaveModeFlag::SAVE_WITH_FILE);
399     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
400     AppRecovery::GetInstance().mainHandler_ = handler;
401     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::CPP_CRASH);
402     EXPECT_TRUE(ret);
403 }
404 
405 /**
406  * @tc.name:  ScheduleSaveAppState_006
407  * @tc.desc:  ScheduleSaveAppState with ability address
408  * @tc.type: FUNC
409  * @tc.require: I5UL6H
410  */
411 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_006, TestSize.Level1)
412 {
413     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
414         SaveModeFlag::SAVE_WITH_FILE);
415     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
416     AppRecovery::GetInstance().mainHandler_ = handler;
417     uintptr_t abilityPtr = reinterpret_cast<uintptr_t>(ability_.get());
418     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::JS_ERROR, abilityPtr);
419     EXPECT_TRUE(ret);
420 }
421 
422 /**
423  * @tc.name:  ScheduleSaveAppState_007
424  * @tc.desc:  ScheduleSaveAppState with ability address 0
425  * @tc.type: FUNC
426  * @tc.require: I5UL6H
427  */
428 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_007, TestSize.Level1)
429 {
430     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
431         SaveModeFlag::SAVE_WITH_FILE);
432     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
433     AppRecovery::GetInstance().mainHandler_ = handler;
434     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::JS_ERROR, 0);
435     EXPECT_TRUE(ret);
436 }
437 
438 /**
439  * @tc.name:  ShouldRecoverApp_001
440  * @tc.desc:  ShouldRecoverApp when state is not support save,RestartFlag = NO_RESTART.
441  * @tc.type: FUNC
442  * @tc.require: I5UL6H
443  */
444 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_001, TestSize.Level1)
445 {
446     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::NO_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
447         SaveModeFlag::SAVE_WITH_FILE);
448     bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::DEVELOPER_REQUEST);
449     EXPECT_FALSE(ret);
450 }
451 
452 /**
453  * @tc.name:  ShouldRecoverApp_002
454  * @tc.desc:  ShouldRecoverApp when state is not support save.
455  * @tc.type: FUNC
456  * @tc.require: I5UL6H
457  */
458 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_002, TestSize.Level1)
459 {
460     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
461         SaveModeFlag::SAVE_WITH_FILE);
462     bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::LIFECYCLE);
463     EXPECT_FALSE(ret);
464     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
465         SaveModeFlag::SAVE_WITH_FILE);
466     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::CPP_CRASH);
467     EXPECT_FALSE(ret);
468 }
469 
470 /**
471  * @tc.name:  ShouldRecoverApp_003
472  * @tc.desc:  ShouldRecoverApp when state is support save.
473  * @tc.type: FUNC
474  * @tc.require: I5UL6H
475  */
476 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_003, TestSize.Level1)
477 {
478     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
479         SaveModeFlag::SAVE_WITH_FILE);
480     bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::DEVELOPER_REQUEST);
481     EXPECT_TRUE(ret);
482     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::APP_FREEZE);
483     EXPECT_TRUE(ret);
484     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::RESTART_WHEN_JS_CRASH, SaveOccasionFlag::SAVE_WHEN_ERROR,
485         SaveModeFlag::SAVE_WITH_FILE);
486     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::JS_ERROR);
487     EXPECT_TRUE(ret);
488     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::RESTART_WHEN_APP_FREEZE,
489         SaveOccasionFlag::SAVE_WHEN_ERROR, SaveModeFlag::SAVE_WITH_FILE);
490     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::APP_FREEZE);
491     EXPECT_TRUE(ret);
492 }
493 
494 /**
495  * @tc.name:  ScheduleRecoverApp_001
496  * @tc.desc:  ScheduleRecoverApp when enable flag is false.
497  * @tc.type: FUNC
498  * @tc.require: I5UL6H
499  */
500 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_001, TestSize.Level1)
501 {
502     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
503     EXPECT_FALSE(ret);
504 }
505 
506 /**
507  * @tc.name:  ScheduleRecoverApp_002
508  * @tc.desc:  ScheduleRecoverApp when state is not support save.
509  * @tc.type: FUNC
510  * @tc.require: I5UL6H
511  */
512 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_002, TestSize.Level1)
513 {
514     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::NO_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
515         SaveModeFlag::SAVE_WITH_FILE);
516     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
517     EXPECT_FALSE(ret);
518 }
519 
520 /**
521  * @tc.name:  ScheduleRecoverApp_003
522  * @tc.desc:  ScheduleRecoverApp when abilityRecoverys is empty.
523  * @tc.type: FUNC
524  * @tc.require: I5UL6H
525  */
526 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_003, TestSize.Level1)
527 {
528     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
529         SaveModeFlag::SAVE_WITH_FILE);
530     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
531     EXPECT_FALSE(ret);
532 }
533 
534 /**
535  * @tc.name:  ScheduleRecoverApp_004
536  * @tc.desc:  ScheduleRecoverApp should be return true,reason == StateReason::APP_FREEZE.
537  * @tc.type: FUNC
538  * @tc.require: I5UL6H
539  */
540 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_004, 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::APP_FREEZE);
549     EXPECT_TRUE(ret);
550 }
551 
552 /**
553  * @tc.name:  ScheduleRecoverApp_005
554  * @tc.desc:  ScheduleRecoverApp when handler is nullptr.
555  * @tc.type: FUNC
556  * @tc.require: I5UL6H
557  */
558 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_005, TestSize.Level1)
559 {
560     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
561         SaveModeFlag::SAVE_WITH_FILE);
562     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
563     auto ability = std::make_shared<AbilityRuntime::UIAbility>();
564     sptr<IRemoteObject> token = new MockAbilityToken();
565     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
566     AppRecovery::GetInstance().mainHandler_.reset();
567     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
568     EXPECT_FALSE(ret);
569 }
570 
571 /**
572  * @tc.name:  ScheduleRecoverApp_006
573  * @tc.desc:  ScheduleRecoverApp should be retuen true.
574  * @tc.type: FUNC
575  * @tc.require: I5UL6H
576  */
577 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_006, TestSize.Level1)
578 {
579     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
580         SaveModeFlag::SAVE_WITH_FILE);
581     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
582     auto ability = std::make_shared<AbilityRuntime::UIAbility>();
583     sptr<IRemoteObject> token = new MockAbilityToken();
584     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
585     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
586     EXPECT_TRUE(ret);
587 }
588 
589 /**
590  * @tc.name:  TryRecoverApp_001
591  * @tc.desc:  TryRecoverApp when enable flag is false.
592  * @tc.type: FUNC
593  * @tc.require: I5UL6H
594  */
595 HWTEST_F(AppRecoveryUnitTest, TryRecoverApp_001, TestSize.Level1)
596 {
597     bool ret = AppRecovery::GetInstance().TryRecoverApp(StateReason::DEVELOPER_REQUEST);
598     EXPECT_FALSE(ret);
599 }
600 
601 /**
602  * @tc.name:  TryRecoverApp_002
603  * @tc.desc:  TryRecoverApp should be return true.
604  * @tc.type: FUNC
605  * @tc.require: I5UL6H
606  */
607 HWTEST_F(AppRecoveryUnitTest, TryRecoverApp_002, TestSize.Level1)
608 {
609     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
610         SaveModeFlag::SAVE_WITH_FILE);
611     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
612     auto ability = std::make_shared<AbilityRuntime::UIAbility>();
613     sptr<IRemoteObject> token = new MockAbilityToken();
614     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
615     bool ret = AppRecovery::GetInstance().TryRecoverApp(StateReason::APP_FREEZE);
616     EXPECT_TRUE(ret);
617 }
618 
619 /**
620  * @tc.name:  PersistAppState_001
621  * @tc.desc:  Test PersistAppState when saveMode_ == SaveModeFlag::SAVE_WITH_FILE.
622  * @tc.type: FUNC
623  * @tc.require: I5Z7LE
624  */
625 HWTEST_F(AppRecoveryUnitTest, PersistAppState_001, TestSize.Level1)
626 {
627     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
628         SaveModeFlag::SAVE_WITH_FILE);
629     EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
630 }
631 
632 /**
633  * @tc.name:  PersistAppState_002
634  * @tc.desc:  Test PersistAppState when abilityRecoverys is empty.
635  * @tc.type: FUNC
636  * @tc.require: I5Z7LE
637  */
638 HWTEST_F(AppRecoveryUnitTest, PersistAppState_002, TestSize.Level1)
639 {
640     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
641         SaveModeFlag::SAVE_WITH_SHARED_MEMORY);
642     EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
643 }
644 
645 /**
646  * @tc.name:  PersistAppState_003
647  * @tc.desc:  Test PersistAppState when abilityRecoverys is not empty.
648  * @tc.type: FUNC
649  * @tc.require: I5Z7LE
650  */
651 HWTEST_F(AppRecoveryUnitTest, PersistAppState_003, TestSize.Level1)
652 {
653     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
654         SaveModeFlag::SAVE_WITH_SHARED_MEMORY);
655     auto constContext = std::static_pointer_cast<AbilityRuntime::AbilityContext>(context_);
656     std::shared_ptr<AbilityRuntime::UIAbility> ability = std::make_shared<AbilityRuntime::UIAbility>();
657     ability->AttachAbilityContext(constContext);
658     AppRecovery::GetInstance().AddAbility(ability, abilityInfo_, token_);
659     EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
660 }
661 
662 /**
663  * @tc.name:  SetRestartWant_001
664  * @tc.desc:  Test SetRestartWant when enable flag is false.
665  * @tc.type: FUNC
666  * @tc.require: I5Z7LE
667  */
668 HWTEST_F(AppRecoveryUnitTest, SetRestartWant_001, TestSize.Level1)
669 {
670     AppRecovery::GetInstance().isEnable_ = false;
671     std::shared_ptr<AAFwk::Want> want = std::make_shared<AAFwk::Want>();
672     const std::string START_ABILITY = "RestartAbility";
673     want->SetParam(START_ABILITY, std::string("com.ohos.recovery.TestRecoveryAbility"));
674     AppRecovery::GetInstance().SetRestartWant(want);
675     EXPECT_EQ(AppRecovery::GetInstance().want_, nullptr);
676 }
677 
678 /**
679  * @tc.name:  SetRestartWant_002
680  * @tc.desc:  Test SetRestartWant when enable flag is true.
681  * @tc.type: FUNC
682  * @tc.require: I5Z7LE
683  */
684 HWTEST_F(AppRecoveryUnitTest, SetRestartWant_002, TestSize.Level1)
685 {
686     AppRecovery::GetInstance().isEnable_ = true;
687     std::shared_ptr<AAFwk::Want> want = std::make_shared<AAFwk::Want>();
688     const std::string START_ABILITY = "RestartAbility";
689     want->SetParam(START_ABILITY, std::string("com.ohos.recovery.TestRecoveryAbility"));
690     AppRecovery::GetInstance().SetRestartWant(want);
691     EXPECT_EQ(AppRecovery::GetInstance().want_, want);
692 }
693 
694 /**
695  * @tc.name:  GetMissionIds_001
696  * @tc.desc:  Test get mission ids when the path is valid.
697  * @tc.type: FUNC
698  * @tc.require: I5Z7LE
699  */
700 HWTEST_F(AppRecoveryUnitTest, GetMissionIds_001, TestSize.Level1)
701 {
702     AppRecovery::GetInstance().isEnable_ = true;
703     std::vector<int32_t> missionIds;
704     std::string path = "data/app/el2/100/base/ohos.samples.recovery/files/";
705     if (OHOS::FileExists(path)) {
706         EXPECT_TRUE(AppRecovery::GetInstance().GetMissionIds(path, missionIds));
707     } else {
708         EXPECT_FALSE(AppRecovery::GetInstance().GetMissionIds(path, missionIds));
709     }
710 }
711 
712 /**
713  * @tc.name:  GetMissionIds_002
714  * @tc.desc:  Test get mission ids when the file path is invalid.
715  * @tc.type: FUNC
716  * @tc.require: I5Z7LE
717  */
718 HWTEST_F(AppRecoveryUnitTest, GetMissionIds_002, TestSize.Level1)
719 {
720     AppRecovery::GetInstance().isEnable_ = true;
721     std::vector<int32_t> missionIds;
722     std::string invalid_path = "data/apps/ohos.samples.recovery/files/";
723     EXPECT_FALSE(AppRecovery::GetInstance().GetMissionIds(invalid_path, missionIds));
724 }
725 
726 /**
727  * @tc.name:  DeleteInValidMissionFiles_001
728  * @tc.desc:  Test delete invalid mission files.
729  * @tc.type: FUNC
730  * @tc.require: I5Z7LE
731  */
732 HWTEST_F(AppRecoveryUnitTest, DeleteInValidMissionFiles_001, TestSize.Level1)
733 {
734     AbilityRuntime::ApplicationContext::GetInstance()->contextImpl_ = std::make_shared<AbilityRuntime::ContextImpl>();
735     AppRecovery::GetInstance().DeleteInValidMissionFiles();
736     EXPECT_NE(AbilityRuntime::Context::GetApplicationContext(), nullptr);
737 }
738 
739 /**
740  * @tc.name:  DeleteInValidMissionFileById_001
741  * @tc.desc:  add testcase.
742  */
743 HWTEST_F(AppRecoveryUnitTest, DeleteInValidMissionFileById_001, TestSize.Level1)
744 {
745     AbilityRuntime::ApplicationContext::GetInstance()->contextImpl_ = std::make_shared<AbilityRuntime::ContextImpl>();
746     AppRecovery::GetInstance().DeleteInValidMissionFileById("/data/local/tmp", 10);
747     EXPECT_NE(AbilityRuntime::Context::GetApplicationContext(), nullptr);
748 }
749 
750 /**
751  * @tc.name:  ClearPageStack_001
752  * @tc.desc:  add testcase.
753  */
754 HWTEST_F(AppRecoveryUnitTest, ClearPageStack_001, TestSize.Level1)
755 {
756     AbilityRuntime::ApplicationContext::GetInstance()->contextImpl_ = std::make_shared<AbilityRuntime::ContextImpl>();
757     AppRecovery::GetInstance().ClearPageStack("ClearPageStack_001");
758     EXPECT_NE(AbilityRuntime::Context::GetApplicationContext(), nullptr);
759 }
760 }  // namespace AppExecFwk
761 }  // namespace OHOS
762