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