• 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 
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<AbilityRuntime::UIAbility> ability_ = std::make_shared<AbilityRuntime::UIAbility>();
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<AbilityRuntime::UIAbility> ability = std::make_shared<AbilityRuntime::JsUIAbility>(*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
__anon08effb870102null328     std::thread watchdog([&] {
329         bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::APP_FREEZE);
330         EXPECT_TRUE(ret);
331     });
332     watchdog.join();
333 }
334 
335 /**
336  * @tc.name:  ScheduleSaveAppState_004
337  * @tc.desc:  ScheduleSaveAppState when handler is nullptr.
338  * @tc.type: FUNC
339  * @tc.require: I5UL6H
340  */
341 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_004, TestSize.Level1)
342 {
343     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
344         SaveModeFlag::SAVE_WITH_FILE);
345     AppRecovery::GetInstance().mainHandler_.reset();
346     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::DEVELOPER_REQUEST);
347     EXPECT_FALSE(ret);
348 }
349 
350 /**
351  * @tc.name:  ScheduleSaveAppState_005
352  * @tc.desc:  ScheduleSaveAppState when CPP_CRASH
353  * @tc.type: FUNC
354  * @tc.require: I5UL6H
355  */
356 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_005, TestSize.Level1)
357 {
358     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
359         SaveModeFlag::SAVE_WITH_FILE);
360     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
361     AppRecovery::GetInstance().mainHandler_ = handler;
362     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::CPP_CRASH);
363     EXPECT_TRUE(ret);
364 }
365 
366 /**
367  * @tc.name:  ScheduleSaveAppState_006
368  * @tc.desc:  ScheduleSaveAppState with ability address
369  * @tc.type: FUNC
370  * @tc.require: I5UL6H
371  */
372 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_006, TestSize.Level1)
373 {
374     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
375         SaveModeFlag::SAVE_WITH_FILE);
376     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
377     AppRecovery::GetInstance().mainHandler_ = handler;
378     uintptr_t abilityPtr = reinterpret_cast<uintptr_t>(ability_.get());
379     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::JS_ERROR, abilityPtr);
380     EXPECT_TRUE(ret);
381 }
382 
383 /**
384  * @tc.name:  ScheduleSaveAppState_007
385  * @tc.desc:  ScheduleSaveAppState with ability address 0
386  * @tc.type: FUNC
387  * @tc.require: I5UL6H
388  */
389 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_007, TestSize.Level1)
390 {
391     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
392         SaveModeFlag::SAVE_WITH_FILE);
393     auto handler = std::make_shared<EventHandler>(EventRunner::Create());
394     AppRecovery::GetInstance().mainHandler_ = handler;
395     bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::JS_ERROR, 0);
396     EXPECT_TRUE(ret);
397 }
398 
399 /**
400  * @tc.name:  ShouldRecoverApp_001
401  * @tc.desc:  ShouldRecoverApp when state is not support save,RestartFlag = NO_RESTART.
402  * @tc.type: FUNC
403  * @tc.require: I5UL6H
404  */
405 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_001, TestSize.Level1)
406 {
407     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::NO_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
408         SaveModeFlag::SAVE_WITH_FILE);
409     bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::DEVELOPER_REQUEST);
410     EXPECT_FALSE(ret);
411 }
412 
413 /**
414  * @tc.name:  ShouldRecoverApp_002
415  * @tc.desc:  ShouldRecoverApp when state is not support save.
416  * @tc.type: FUNC
417  * @tc.require: I5UL6H
418  */
419 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_002, TestSize.Level1)
420 {
421     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
422         SaveModeFlag::SAVE_WITH_FILE);
423     bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::LIFECYCLE);
424     EXPECT_FALSE(ret);
425     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
426         SaveModeFlag::SAVE_WITH_FILE);
427     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::CPP_CRASH);
428     EXPECT_FALSE(ret);
429 }
430 
431 /**
432  * @tc.name:  ShouldRecoverApp_003
433  * @tc.desc:  ShouldRecoverApp when state is support save.
434  * @tc.type: FUNC
435  * @tc.require: I5UL6H
436  */
437 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_003, TestSize.Level1)
438 {
439     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
440         SaveModeFlag::SAVE_WITH_FILE);
441     bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::DEVELOPER_REQUEST);
442     EXPECT_TRUE(ret);
443     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::APP_FREEZE);
444     EXPECT_TRUE(ret);
445     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::RESTART_WHEN_JS_CRASH, SaveOccasionFlag::SAVE_WHEN_ERROR,
446         SaveModeFlag::SAVE_WITH_FILE);
447     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::JS_ERROR);
448     EXPECT_TRUE(ret);
449     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::RESTART_WHEN_APP_FREEZE,
450         SaveOccasionFlag::SAVE_WHEN_ERROR, SaveModeFlag::SAVE_WITH_FILE);
451     ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::APP_FREEZE);
452     EXPECT_TRUE(ret);
453 }
454 
455 /**
456  * @tc.name:  ScheduleRecoverApp_001
457  * @tc.desc:  ScheduleRecoverApp when enable flag is false.
458  * @tc.type: FUNC
459  * @tc.require: I5UL6H
460  */
461 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_001, TestSize.Level1)
462 {
463     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
464     EXPECT_FALSE(ret);
465 }
466 
467 /**
468  * @tc.name:  ScheduleRecoverApp_002
469  * @tc.desc:  ScheduleRecoverApp when state is not support save.
470  * @tc.type: FUNC
471  * @tc.require: I5UL6H
472  */
473 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_002, TestSize.Level1)
474 {
475     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::NO_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
476         SaveModeFlag::SAVE_WITH_FILE);
477     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
478     EXPECT_FALSE(ret);
479 }
480 
481 /**
482  * @tc.name:  ScheduleRecoverApp_003
483  * @tc.desc:  ScheduleRecoverApp when abilityRecoverys is empty.
484  * @tc.type: FUNC
485  * @tc.require: I5UL6H
486  */
487 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_003, TestSize.Level1)
488 {
489     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
490         SaveModeFlag::SAVE_WITH_FILE);
491     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
492     EXPECT_FALSE(ret);
493 }
494 
495 /**
496  * @tc.name:  ScheduleRecoverApp_004
497  * @tc.desc:  ScheduleRecoverApp should be return true,reason == StateReason::APP_FREEZE.
498  * @tc.type: FUNC
499  * @tc.require: I5UL6H
500  */
501 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_004, TestSize.Level1)
502 {
503     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
504         SaveModeFlag::SAVE_WITH_FILE);
505     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
506     auto ability = std::make_shared<AbilityRuntime::UIAbility>();
507     sptr<IRemoteObject> token = new MockAbilityToken();
508     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
509     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::APP_FREEZE);
510     EXPECT_TRUE(ret);
511 }
512 
513 /**
514  * @tc.name:  ScheduleRecoverApp_005
515  * @tc.desc:  ScheduleRecoverApp when handler is nullptr.
516  * @tc.type: FUNC
517  * @tc.require: I5UL6H
518  */
519 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_005, TestSize.Level1)
520 {
521     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
522         SaveModeFlag::SAVE_WITH_FILE);
523     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
524     auto ability = std::make_shared<AbilityRuntime::UIAbility>();
525     sptr<IRemoteObject> token = new MockAbilityToken();
526     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
527     AppRecovery::GetInstance().mainHandler_.reset();
528     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
529     EXPECT_FALSE(ret);
530 }
531 
532 /**
533  * @tc.name:  ScheduleRecoverApp_006
534  * @tc.desc:  ScheduleRecoverApp should be retuen true.
535  * @tc.type: FUNC
536  * @tc.require: I5UL6H
537  */
538 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_006, TestSize.Level1)
539 {
540     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
541         SaveModeFlag::SAVE_WITH_FILE);
542     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
543     auto ability = std::make_shared<AbilityRuntime::UIAbility>();
544     sptr<IRemoteObject> token = new MockAbilityToken();
545     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
546     bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
547     EXPECT_TRUE(ret);
548 }
549 
550 /**
551  * @tc.name:  TryRecoverApp_001
552  * @tc.desc:  TryRecoverApp when enable flag is false.
553  * @tc.type: FUNC
554  * @tc.require: I5UL6H
555  */
556 HWTEST_F(AppRecoveryUnitTest, TryRecoverApp_001, TestSize.Level1)
557 {
558     bool ret = AppRecovery::GetInstance().TryRecoverApp(StateReason::DEVELOPER_REQUEST);
559     EXPECT_FALSE(ret);
560 }
561 
562 /**
563  * @tc.name:  TryRecoverApp_002
564  * @tc.desc:  TryRecoverApp should be return true.
565  * @tc.type: FUNC
566  * @tc.require: I5UL6H
567  */
568 HWTEST_F(AppRecoveryUnitTest, TryRecoverApp_002, TestSize.Level1)
569 {
570     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
571         SaveModeFlag::SAVE_WITH_FILE);
572     auto caseAbilityInfo = std::make_shared<AbilityInfo>();
573     auto ability = std::make_shared<AbilityRuntime::UIAbility>();
574     sptr<IRemoteObject> token = new MockAbilityToken();
575     EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
576     bool ret = AppRecovery::GetInstance().TryRecoverApp(StateReason::APP_FREEZE);
577     EXPECT_TRUE(ret);
578 }
579 
580 /**
581  * @tc.name:  PersistAppState_001
582  * @tc.desc:  Test PersistAppState when saveMode_ == SaveModeFlag::SAVE_WITH_FILE.
583  * @tc.type: FUNC
584  * @tc.require: I5Z7LE
585  */
586 HWTEST_F(AppRecoveryUnitTest, PersistAppState_001, TestSize.Level1)
587 {
588     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
589         SaveModeFlag::SAVE_WITH_FILE);
590     EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
591 }
592 
593 /**
594  * @tc.name:  PersistAppState_002
595  * @tc.desc:  Test PersistAppState when abilityRecoverys is empty.
596  * @tc.type: FUNC
597  * @tc.require: I5Z7LE
598  */
599 HWTEST_F(AppRecoveryUnitTest, PersistAppState_002, TestSize.Level1)
600 {
601     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
602         SaveModeFlag::SAVE_WITH_SHARED_MEMORY);
603     EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
604 }
605 
606 /**
607  * @tc.name:  PersistAppState_003
608  * @tc.desc:  Test PersistAppState when abilityRecoverys is not empty.
609  * @tc.type: FUNC
610  * @tc.require: I5Z7LE
611  */
612 HWTEST_F(AppRecoveryUnitTest, PersistAppState_003, TestSize.Level1)
613 {
614     AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
615         SaveModeFlag::SAVE_WITH_SHARED_MEMORY);
616     auto constContext = std::static_pointer_cast<AbilityRuntime::AbilityContext>(context_);
617     std::shared_ptr<AbilityRuntime::UIAbility> ability = std::make_shared<AbilityRuntime::UIAbility>();
618     ability->AttachAbilityContext(constContext);
619     AppRecovery::GetInstance().AddAbility(ability, abilityInfo_, token_);
620     EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
621 }
622 
623 /**
624  * @tc.name:  SetRestartWant_001
625  * @tc.desc:  Test SetRestartWant when enable flag is false.
626  * @tc.type: FUNC
627  * @tc.require: I5Z7LE
628  */
629 HWTEST_F(AppRecoveryUnitTest, SetRestartWant_001, TestSize.Level1)
630 {
631     AppRecovery::GetInstance().isEnable_ = false;
632     std::shared_ptr<AAFwk::Want> want = std::make_shared<AAFwk::Want>();
633     const std::string START_ABILITY = "RestartAbility";
634     want->SetParam(START_ABILITY, std::string("com.ohos.recovery.TestRecoveryAbility"));
635     AppRecovery::GetInstance().SetRestartWant(want);
636     EXPECT_EQ(AppRecovery::GetInstance().want_, nullptr);
637 }
638 
639 /**
640  * @tc.name:  SetRestartWant_002
641  * @tc.desc:  Test SetRestartWant when enable flag is true.
642  * @tc.type: FUNC
643  * @tc.require: I5Z7LE
644  */
645 HWTEST_F(AppRecoveryUnitTest, SetRestartWant_002, TestSize.Level1)
646 {
647     AppRecovery::GetInstance().isEnable_ = true;
648     std::shared_ptr<AAFwk::Want> want = std::make_shared<AAFwk::Want>();
649     const std::string START_ABILITY = "RestartAbility";
650     want->SetParam(START_ABILITY, std::string("com.ohos.recovery.TestRecoveryAbility"));
651     AppRecovery::GetInstance().SetRestartWant(want);
652     EXPECT_EQ(AppRecovery::GetInstance().want_, want);
653 }
654 
655 /**
656  * @tc.name:  GetMissionIds_001
657  * @tc.desc:  Test get mission ids when the path is valid.
658  * @tc.type: FUNC
659  * @tc.require: I5Z7LE
660  */
661 HWTEST_F(AppRecoveryUnitTest, GetMissionIds_001, TestSize.Level1)
662 {
663     AppRecovery::GetInstance().isEnable_ = true;
664     std::vector<int32_t> missionIds;
665     std::string path = "data/app/el2/100/base/ohos.samples.recovery/files/";
666     if (OHOS::FileExists(path)) {
667         EXPECT_TRUE(AppRecovery::GetInstance().GetMissionIds(path, missionIds));
668     } else {
669         EXPECT_FALSE(AppRecovery::GetInstance().GetMissionIds(path, missionIds));
670     }
671 }
672 
673 /**
674  * @tc.name:  GetMissionIds_002
675  * @tc.desc:  Test get mission ids when the file path is invalid.
676  * @tc.type: FUNC
677  * @tc.require: I5Z7LE
678  */
679 HWTEST_F(AppRecoveryUnitTest, GetMissionIds_002, TestSize.Level1)
680 {
681     AppRecovery::GetInstance().isEnable_ = true;
682     std::vector<int32_t> missionIds;
683     std::string invalid_path = "data/apps/ohos.samples.recovery/files/";
684     EXPECT_FALSE(AppRecovery::GetInstance().GetMissionIds(invalid_path, missionIds));
685 }
686 }  // namespace AppExecFwk
687 }  // namespace OHOS
688