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