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