1 /*
2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <gtest/gtest.h>
17
18 #include <memory>
19 #include <thread>
20 #include "file_ex.h"
21
22 #define private public
23 #include "app_recovery.h"
24 #undef private
25 #include "ability_info.h"
26 #include "ability_runtime/js_ui_ability.h"
27 #include "event_handler.h"
28 #include "js_runtime.h"
29 #include "mock_ability_context.h"
30 #include "mock_ability_token.h"
31 #include "recovery_param.h"
32 #include "ui_ability.h"
33 #define private public
34 #include "context/application_context.h"
35
36 using namespace testing::ext;
37 namespace OHOS {
38 namespace AppExecFwk {
39 class AppRecoveryUnitTest : public testing::Test {
40 public:
41 static void SetUpTestCase();
42 static void TearDownTestCase();
43 void SetUp();
44 void TearDown();
45 std::shared_ptr<AbilityRuntime::UIAbility> ability_ = std::make_shared<AbilityRuntime::UIAbility>();
46 std::shared_ptr<AppExecFwk::AbilityInfo> abilityInfo_ = std::make_shared<AbilityInfo>();
47 std::shared_ptr<AppExecFwk::ApplicationInfo> applicationInfo_ = std::make_shared<ApplicationInfo>();
48 std::shared_ptr<AppExecFwk::EventHandler> testHandler_ = std::make_shared<EventHandler>();
49 sptr<IRemoteObject> token_ = new MockAbilityToken();
50 std::shared_ptr<AbilityRuntime::MockAbilityContext> context_ =
51 std::make_shared<AbilityRuntime::MockAbilityContext>();
52 };
53
SetUpTestCase()54 void AppRecoveryUnitTest::SetUpTestCase()
55 {
56 }
57
TearDownTestCase()58 void AppRecoveryUnitTest::TearDownTestCase()
59 {}
60
SetUp()61 void AppRecoveryUnitTest::SetUp()
62 {
63 AppRecovery::GetInstance().isEnable_ = false;
64 AppRecovery::GetInstance().restartFlag_ = 0;
65 AppRecovery::GetInstance().saveOccasion_ = 0;
66 AppRecovery::GetInstance().saveMode_ = 0;
67 AppRecovery::GetInstance().abilityRecoverys_.clear();
68 AppRecovery::GetInstance().mainHandler_ = testHandler_;
69 AppRecovery::GetInstance().applicationInfo_ = applicationInfo_;
70 AppRecovery::GetInstance().want_ = nullptr;
71 }
72
TearDown()73 void AppRecoveryUnitTest::TearDown()
74 {
75 }
76
77 /**
78 * @tc.name: GetRestartFlag_001
79 * @tc.desc: Test GetRestartFlag
80 * @tc.type: FUNC
81 * @tc.require: I5UL6H
82 */
83 HWTEST_F(AppRecoveryUnitTest, GetRestartFlag_001, TestSize.Level1)
84 {
85 EXPECT_EQ(AppRecovery::GetInstance().GetRestartFlag(), 0);
86 AppRecovery::GetInstance().restartFlag_ = RestartFlag::ALWAYS_RESTART;
87 EXPECT_EQ(AppRecovery::GetInstance().GetRestartFlag(), RestartFlag::ALWAYS_RESTART);
88 }
89
90 /**
91 * @tc.name: GetSaveOccasionFlag_001
92 * @tc.desc: Test GetSaveOccasionFlag
93 * @tc.type: FUNC
94 * @tc.require: I5UL6H
95 */
96 HWTEST_F(AppRecoveryUnitTest, GetSaveOccasionFlag_001, TestSize.Level1)
97 {
98 EXPECT_EQ(AppRecovery::GetInstance().GetSaveOccasionFlag(), 0);
99 AppRecovery::GetInstance().saveOccasion_ = SaveOccasionFlag::SAVE_WHEN_ERROR;
100 EXPECT_EQ(AppRecovery::GetInstance().GetSaveOccasionFlag(), SaveOccasionFlag::SAVE_WHEN_ERROR);
101 }
102 /**
103 * @tc.name: GetSaveModeFlag_001
104 * @tc.desc: Test GetSaveModeFlag
105 * @tc.type: FUNC
106 * @tc.require: I5UL6H
107 */
108 HWTEST_F(AppRecoveryUnitTest, GetSaveModeFlag_001, TestSize.Level1)
109 {
110 EXPECT_EQ(AppRecovery::GetInstance().GetSaveModeFlag(), 0);
111 AppRecovery::GetInstance().saveMode_ = SaveModeFlag::SAVE_WITH_FILE;
112 EXPECT_EQ(AppRecovery::GetInstance().GetSaveModeFlag(), SaveModeFlag::SAVE_WITH_FILE);
113 }
114
115 /**
116 * @tc.name: InitApplicationInfo_001
117 * @tc.desc: Test InitApplicationInfo
118 * @tc.type: FUNC
119 * @tc.require: I5UL6H
120 */
121 HWTEST_F(AppRecoveryUnitTest, InitApplicationInfo_001, TestSize.Level1)
122 {
123 EXPECT_TRUE(AppRecovery::GetInstance().InitApplicationInfo(testHandler_, applicationInfo_));
124 }
125
126 /**
127 * @tc.name: EnableAppRecovery_001
128 * @tc.desc: EnableAppRecovery with config, check the enable flag is set as expected.
129 * @tc.type: FUNC
130 * @tc.require: I5UL6H
131 */
132 HWTEST_F(AppRecoveryUnitTest, EnableAppRecovery_001, TestSize.Level1)
133 {
134 EXPECT_FALSE(AppRecovery::GetInstance().IsEnabled());
135 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
136 SaveModeFlag::SAVE_WITH_FILE);
137 EXPECT_TRUE(AppRecovery::GetInstance().IsEnabled());
138 }
139
140 /**
141 * @tc.name: EnableAppRecovery_002
142 * @tc.desc: EnableAppRecovery with config, check the config is set as expected.
143 * @tc.type: FUNC
144 * @tc.require: I5UL6H
145 */
146 HWTEST_F(AppRecoveryUnitTest, EnableAppRecovery_002, TestSize.Level1)
147 {
148 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
149 SaveModeFlag::SAVE_WITH_FILE);
150 EXPECT_EQ(RestartFlag::ALWAYS_RESTART, AppRecovery::GetInstance().GetRestartFlag());
151 EXPECT_EQ(SaveOccasionFlag::SAVE_WHEN_ERROR, AppRecovery::GetInstance().GetSaveOccasionFlag());
152 EXPECT_EQ(SaveModeFlag::SAVE_WITH_FILE, AppRecovery::GetInstance().GetSaveModeFlag());
153 }
154
155 /**
156 * @tc.name: EnableAppRecovery_003
157 * @tc.desc: EnableAppRecovery with config, check the config is set as expected.
158 * @tc.type: FUNC
159 * @tc.require: I5UL6H
160 */
161 HWTEST_F(AppRecoveryUnitTest, EnableAppRecovery_003, TestSize.Level1)
162 {
163 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::NO_RESTART, SaveOccasionFlag::SAVE_ALL,
164 SaveModeFlag::SAVE_WITH_SHARED_MEMORY);
165 EXPECT_EQ(RestartFlag::NO_RESTART, AppRecovery::GetInstance().GetRestartFlag());
166 EXPECT_EQ(SaveOccasionFlag::SAVE_ALL, AppRecovery::GetInstance().GetSaveOccasionFlag());
167 EXPECT_EQ(SaveModeFlag::SAVE_WITH_SHARED_MEMORY, AppRecovery::GetInstance().GetSaveModeFlag());
168 }
169
170 /**
171 * @tc.name: AddAbility_001
172 * @tc.desc: AddAbility when enable flag is false.
173 * @tc.type: FUNC
174 * @tc.require: I5UL6H
175 */
176 HWTEST_F(AppRecoveryUnitTest, AddAbility_001, TestSize.Level1)
177 {
178 AppRecovery::GetInstance().isEnable_ = false;
179 bool ret = AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_);
180 EXPECT_TRUE(ret);
181 }
182
183 /**
184 * @tc.name: AddAbility_002
185 * @tc.desc: AddAbility when abilityRecoverys_ is not empty.
186 * @tc.type: FUNC
187 * @tc.require: I5UL6H
188 */
189 HWTEST_F(AppRecoveryUnitTest, AddAbility_002, TestSize.Level1)
190 {
191 AppRecovery::GetInstance().isEnable_ = true;
192 auto abilityRecovery = std::make_shared<AbilityRecovery>();
193 AppRecovery::GetInstance().abilityRecoverys_.push_back(abilityRecovery);
194 bool ret = AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_);
195 EXPECT_FALSE(ret);
196 }
197
198 /**
199 * @tc.name: AddAbility_003
200 * @tc.desc: AddAbility check the ret as expected.
201 * @tc.type: FUNC
202 * @tc.require: I5UL6H
203 */
204 HWTEST_F(AppRecoveryUnitTest, AddAbility_003, TestSize.Level1)
205 {
206 AppRecovery::GetInstance().isEnable_ = true;
207 bool ret = AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_);
208 EXPECT_TRUE(ret);
209 }
210
211 /**
212 * @tc.name: AddAbility_004
213 * @tc.desc: add testcase.
214 * @tc.type: FUNC
215 * @tc.require: I5UL6H
216 */
217 HWTEST_F(AppRecoveryUnitTest, AddAbility_004, TestSize.Level1)
218 {
219 bool ret = AppRecovery::GetInstance().AddAbility(ability_, nullptr, token_);
220 EXPECT_TRUE(!ret);
221 }
222
223 /**
224 * @tc.name: RemoveAbility_001
225 * @tc.desc: RemoveAbility check the ret as expected.
226 * @tc.type: FUNC
227 * @tc.require: I5UL6H
228 */
229 HWTEST_F(AppRecoveryUnitTest, RemoveAbility_001, TestSize.Level1)
230 {
231 AppRecovery::GetInstance().isEnable_ = true;
232 bool ret = AppRecovery::GetInstance().RemoveAbility(token_);
233 EXPECT_TRUE(ret);
234 }
235
236 /**
237 * @tc.name: RemoveAbility_002
238 * @tc.desc: RemoveAbility when enable flag is false.
239 * @tc.type: FUNC
240 * @tc.require: I5UL6H
241 */
242 HWTEST_F(AppRecoveryUnitTest, RemoveAbility_002, TestSize.Level1)
243 {
244 AppRecovery::GetInstance().isEnable_ = false;
245 bool ret = AppRecovery::GetInstance().RemoveAbility(token_);
246 EXPECT_TRUE(ret);
247 }
248
249 /**
250 * @tc.name: RemoveAbility_003
251 * @tc.desc: RemoveAbility failed when token_ is null.
252 * @tc.type: FUNC
253 * @tc.require: I5UL6H
254 */
255 HWTEST_F(AppRecoveryUnitTest, RemoveAbility_003, TestSize.Level1)
256 {
257 bool ret = AppRecovery::GetInstance().RemoveAbility(nullptr);
258 EXPECT_TRUE(!ret);
259 }
260
261 /**
262 * @tc.name: DoRecoverApp_001
263 * @tc.desc: add testcase.
264 * @tc.type: FUNC
265 * @tc.require: I5UL6H
266 */
267 HWTEST_F(AppRecoveryUnitTest, DoRecoverApp_001, TestSize.Level1)
268 {
269 AppRecovery::GetInstance().abilityRecoverys_.clear();
270 AppRecovery::GetInstance().DoRecoverApp(StateReason::DEVELOPER_REQUEST);
271 EXPECT_TRUE(AppRecovery::GetInstance().abilityRecoverys_.empty());
272 }
273
274 /**
275 * @tc.name: ShouldSaveAppState_001
276 * @tc.desc: ShouldSaveAppState when state is support save.
277 * @tc.type: FUNC
278 * @tc.require: I5UL6H
279 */
280 HWTEST_F(AppRecoveryUnitTest, ShouldSaveAppState_001, TestSize.Level1)
281 {
282 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
283 SaveModeFlag::SAVE_WITH_FILE);
284 bool ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::DEVELOPER_REQUEST);
285 EXPECT_TRUE(ret);
286 }
287
288 /**
289 * @tc.name: ShouldSaveAppState_002
290 * @tc.desc: ShouldSaveAppState when state is not support save.
291 * @tc.type: FUNC
292 * @tc.require: I5UL6H
293 */
294 HWTEST_F(AppRecoveryUnitTest, ShouldSaveAppState_002, TestSize.Level1)
295 {
296 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
297 SaveModeFlag::SAVE_WITH_FILE);
298 bool ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::LIFECYCLE);
299 EXPECT_FALSE(ret);
300 }
301
302 /**
303 * @tc.name: ShouldSaveAppState_003
304 * @tc.desc: ShouldSaveAppState when state is not support save.
305 * @tc.type: FUNC
306 * @tc.require: I5UL6H
307 */
308 HWTEST_F(AppRecoveryUnitTest, ShouldSaveAppState_003, TestSize.Level1)
309 {
310 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_BACKGROUND,
311 SaveModeFlag::SAVE_WITH_FILE);
312 bool ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::CPP_CRASH);
313 EXPECT_FALSE(ret);
314 ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::JS_ERROR);
315 EXPECT_FALSE(ret);
316 ret = AppRecovery::GetInstance().ShouldSaveAppState(StateReason::APP_FREEZE);
317 EXPECT_FALSE(ret);
318 }
319
320 /**
321 * @tc.name: ScheduleSaveAppState_001
322 * @tc.desc: ScheduleSaveAppState when enable flag is false.
323 * @tc.type: FUNC
324 * @tc.require: I5UL6H
325 */
326 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_001, TestSize.Level1)
327 {
328 bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::DEVELOPER_REQUEST);
329 EXPECT_FALSE(ret);
330 }
331
332 /**
333 * @tc.name: ScheduleSaveAppState_002
334 * @tc.desc: ScheduleSaveAppState when state is not support save.
335 * @tc.type: FUNC
336 * @tc.require: I5UL6H
337 */
338 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_002, TestSize.Level1)
339 {
340 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
341 SaveModeFlag::SAVE_WITH_FILE);
342 bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::LIFECYCLE);
343 EXPECT_FALSE(ret);
344 }
345
346 /**
347 * @tc.name: ScheduleSaveAppState_003
348 * @tc.desc: ScheduleSaveAppState when APP_FREEZE.
349 * @tc.type: FUNC
350 * @tc.require: I5UL6H
351 */
352 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_003, TestSize.Level1)
353 {
354 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
355 SaveModeFlag::SAVE_WITH_FILE);
356 auto handler = std::make_shared<EventHandler>(EventRunner::Create());
357 AppRecovery::GetInstance().mainHandler_ = handler;
358 auto constContext = std::static_pointer_cast<AbilityRuntime::AbilityContext>(context_);
359 // create js runtime for calling AllowCrossThreadExecution
360 AbilityRuntime::Runtime::Options options;
361 auto runtime = AbilityRuntime::JsRuntime::Create(options);
362 auto jsRuntime = static_cast<AbilityRuntime::JsRuntime*>(runtime.get());
363 std::shared_ptr<AbilityRuntime::UIAbility> ability = std::make_shared<AbilityRuntime::JsUIAbility>(*jsRuntime);
364 ability->AttachAbilityContext(constContext);
365 AppRecovery::GetInstance().AddAbility(ability, abilityInfo_, token_);
366 // this call will block main thread, thus call it in new thread
__anon7cdda9460102null367 std::thread watchdog([&] {
368 bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::APP_FREEZE);
369 EXPECT_TRUE(ret);
370 });
371 watchdog.join();
372 }
373
374 /**
375 * @tc.name: ScheduleSaveAppState_004
376 * @tc.desc: ScheduleSaveAppState when handler is nullptr.
377 * @tc.type: FUNC
378 * @tc.require: I5UL6H
379 */
380 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_004, TestSize.Level1)
381 {
382 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
383 SaveModeFlag::SAVE_WITH_FILE);
384 AppRecovery::GetInstance().mainHandler_.reset();
385 bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::DEVELOPER_REQUEST);
386 EXPECT_FALSE(ret);
387 }
388
389 /**
390 * @tc.name: ScheduleSaveAppState_005
391 * @tc.desc: ScheduleSaveAppState when CPP_CRASH
392 * @tc.type: FUNC
393 * @tc.require: I5UL6H
394 */
395 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_005, TestSize.Level1)
396 {
397 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
398 SaveModeFlag::SAVE_WITH_FILE);
399 auto handler = std::make_shared<EventHandler>(EventRunner::Create());
400 AppRecovery::GetInstance().mainHandler_ = handler;
401 bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::CPP_CRASH);
402 EXPECT_TRUE(ret);
403 }
404
405 /**
406 * @tc.name: ScheduleSaveAppState_006
407 * @tc.desc: ScheduleSaveAppState with ability address
408 * @tc.type: FUNC
409 * @tc.require: I5UL6H
410 */
411 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_006, TestSize.Level1)
412 {
413 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
414 SaveModeFlag::SAVE_WITH_FILE);
415 auto handler = std::make_shared<EventHandler>(EventRunner::Create());
416 AppRecovery::GetInstance().mainHandler_ = handler;
417 uintptr_t abilityPtr = reinterpret_cast<uintptr_t>(ability_.get());
418 bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::JS_ERROR, abilityPtr);
419 EXPECT_TRUE(ret);
420 }
421
422 /**
423 * @tc.name: ScheduleSaveAppState_007
424 * @tc.desc: ScheduleSaveAppState with ability address 0
425 * @tc.type: FUNC
426 * @tc.require: I5UL6H
427 */
428 HWTEST_F(AppRecoveryUnitTest, ScheduleSaveAppState_007, TestSize.Level1)
429 {
430 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
431 SaveModeFlag::SAVE_WITH_FILE);
432 auto handler = std::make_shared<EventHandler>(EventRunner::Create());
433 AppRecovery::GetInstance().mainHandler_ = handler;
434 bool ret = AppRecovery::GetInstance().ScheduleSaveAppState(StateReason::JS_ERROR, 0);
435 EXPECT_TRUE(ret);
436 }
437
438 /**
439 * @tc.name: ShouldRecoverApp_001
440 * @tc.desc: ShouldRecoverApp when state is not support save,RestartFlag = NO_RESTART.
441 * @tc.type: FUNC
442 * @tc.require: I5UL6H
443 */
444 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_001, TestSize.Level1)
445 {
446 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::NO_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
447 SaveModeFlag::SAVE_WITH_FILE);
448 bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::DEVELOPER_REQUEST);
449 EXPECT_FALSE(ret);
450 }
451
452 /**
453 * @tc.name: ShouldRecoverApp_002
454 * @tc.desc: ShouldRecoverApp when state is not support save.
455 * @tc.type: FUNC
456 * @tc.require: I5UL6H
457 */
458 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_002, TestSize.Level1)
459 {
460 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
461 SaveModeFlag::SAVE_WITH_FILE);
462 bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::LIFECYCLE);
463 EXPECT_FALSE(ret);
464 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
465 SaveModeFlag::SAVE_WITH_FILE);
466 ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::CPP_CRASH);
467 EXPECT_FALSE(ret);
468 }
469
470 /**
471 * @tc.name: ShouldRecoverApp_003
472 * @tc.desc: ShouldRecoverApp when state is support save.
473 * @tc.type: FUNC
474 * @tc.require: I5UL6H
475 */
476 HWTEST_F(AppRecoveryUnitTest, ShouldRecoverApp_003, TestSize.Level1)
477 {
478 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
479 SaveModeFlag::SAVE_WITH_FILE);
480 bool ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::DEVELOPER_REQUEST);
481 EXPECT_TRUE(ret);
482 ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::APP_FREEZE);
483 EXPECT_TRUE(ret);
484 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::RESTART_WHEN_JS_CRASH, SaveOccasionFlag::SAVE_WHEN_ERROR,
485 SaveModeFlag::SAVE_WITH_FILE);
486 ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::JS_ERROR);
487 EXPECT_TRUE(ret);
488 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::RESTART_WHEN_APP_FREEZE,
489 SaveOccasionFlag::SAVE_WHEN_ERROR, SaveModeFlag::SAVE_WITH_FILE);
490 ret = AppRecovery::GetInstance().ShouldRecoverApp(StateReason::APP_FREEZE);
491 EXPECT_TRUE(ret);
492 }
493
494 /**
495 * @tc.name: ScheduleRecoverApp_001
496 * @tc.desc: ScheduleRecoverApp when enable flag is false.
497 * @tc.type: FUNC
498 * @tc.require: I5UL6H
499 */
500 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_001, TestSize.Level1)
501 {
502 bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
503 EXPECT_FALSE(ret);
504 }
505
506 /**
507 * @tc.name: ScheduleRecoverApp_002
508 * @tc.desc: ScheduleRecoverApp when state is not support save.
509 * @tc.type: FUNC
510 * @tc.require: I5UL6H
511 */
512 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_002, TestSize.Level1)
513 {
514 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::NO_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
515 SaveModeFlag::SAVE_WITH_FILE);
516 bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
517 EXPECT_FALSE(ret);
518 }
519
520 /**
521 * @tc.name: ScheduleRecoverApp_003
522 * @tc.desc: ScheduleRecoverApp when abilityRecoverys is empty.
523 * @tc.type: FUNC
524 * @tc.require: I5UL6H
525 */
526 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_003, TestSize.Level1)
527 {
528 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
529 SaveModeFlag::SAVE_WITH_FILE);
530 bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
531 EXPECT_FALSE(ret);
532 }
533
534 /**
535 * @tc.name: ScheduleRecoverApp_004
536 * @tc.desc: ScheduleRecoverApp should be return true,reason == StateReason::APP_FREEZE.
537 * @tc.type: FUNC
538 * @tc.require: I5UL6H
539 */
540 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_004, TestSize.Level1)
541 {
542 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
543 SaveModeFlag::SAVE_WITH_FILE);
544 auto caseAbilityInfo = std::make_shared<AbilityInfo>();
545 auto ability = std::make_shared<AbilityRuntime::UIAbility>();
546 sptr<IRemoteObject> token = new MockAbilityToken();
547 EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
548 bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::APP_FREEZE);
549 EXPECT_TRUE(ret);
550 }
551
552 /**
553 * @tc.name: ScheduleRecoverApp_005
554 * @tc.desc: ScheduleRecoverApp when handler is nullptr.
555 * @tc.type: FUNC
556 * @tc.require: I5UL6H
557 */
558 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_005, TestSize.Level1)
559 {
560 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
561 SaveModeFlag::SAVE_WITH_FILE);
562 auto caseAbilityInfo = std::make_shared<AbilityInfo>();
563 auto ability = std::make_shared<AbilityRuntime::UIAbility>();
564 sptr<IRemoteObject> token = new MockAbilityToken();
565 EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
566 AppRecovery::GetInstance().mainHandler_.reset();
567 bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
568 EXPECT_FALSE(ret);
569 }
570
571 /**
572 * @tc.name: ScheduleRecoverApp_006
573 * @tc.desc: ScheduleRecoverApp should be retuen true.
574 * @tc.type: FUNC
575 * @tc.require: I5UL6H
576 */
577 HWTEST_F(AppRecoveryUnitTest, ScheduleRecoverApp_006, TestSize.Level1)
578 {
579 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
580 SaveModeFlag::SAVE_WITH_FILE);
581 auto caseAbilityInfo = std::make_shared<AbilityInfo>();
582 auto ability = std::make_shared<AbilityRuntime::UIAbility>();
583 sptr<IRemoteObject> token = new MockAbilityToken();
584 EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
585 bool ret = AppRecovery::GetInstance().ScheduleRecoverApp(StateReason::DEVELOPER_REQUEST);
586 EXPECT_TRUE(ret);
587 }
588
589 /**
590 * @tc.name: TryRecoverApp_001
591 * @tc.desc: TryRecoverApp when enable flag is false.
592 * @tc.type: FUNC
593 * @tc.require: I5UL6H
594 */
595 HWTEST_F(AppRecoveryUnitTest, TryRecoverApp_001, TestSize.Level1)
596 {
597 bool ret = AppRecovery::GetInstance().TryRecoverApp(StateReason::DEVELOPER_REQUEST);
598 EXPECT_FALSE(ret);
599 }
600
601 /**
602 * @tc.name: TryRecoverApp_002
603 * @tc.desc: TryRecoverApp should be return true.
604 * @tc.type: FUNC
605 * @tc.require: I5UL6H
606 */
607 HWTEST_F(AppRecoveryUnitTest, TryRecoverApp_002, TestSize.Level1)
608 {
609 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
610 SaveModeFlag::SAVE_WITH_FILE);
611 auto caseAbilityInfo = std::make_shared<AbilityInfo>();
612 auto ability = std::make_shared<AbilityRuntime::UIAbility>();
613 sptr<IRemoteObject> token = new MockAbilityToken();
614 EXPECT_TRUE(AppRecovery::GetInstance().AddAbility(ability_, abilityInfo_, token_));
615 bool ret = AppRecovery::GetInstance().TryRecoverApp(StateReason::APP_FREEZE);
616 EXPECT_TRUE(ret);
617 }
618
619 /**
620 * @tc.name: PersistAppState_001
621 * @tc.desc: Test PersistAppState when saveMode_ == SaveModeFlag::SAVE_WITH_FILE.
622 * @tc.type: FUNC
623 * @tc.require: I5Z7LE
624 */
625 HWTEST_F(AppRecoveryUnitTest, PersistAppState_001, TestSize.Level1)
626 {
627 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
628 SaveModeFlag::SAVE_WITH_FILE);
629 EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
630 }
631
632 /**
633 * @tc.name: PersistAppState_002
634 * @tc.desc: Test PersistAppState when abilityRecoverys is empty.
635 * @tc.type: FUNC
636 * @tc.require: I5Z7LE
637 */
638 HWTEST_F(AppRecoveryUnitTest, PersistAppState_002, TestSize.Level1)
639 {
640 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
641 SaveModeFlag::SAVE_WITH_SHARED_MEMORY);
642 EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
643 }
644
645 /**
646 * @tc.name: PersistAppState_003
647 * @tc.desc: Test PersistAppState when abilityRecoverys is not empty.
648 * @tc.type: FUNC
649 * @tc.require: I5Z7LE
650 */
651 HWTEST_F(AppRecoveryUnitTest, PersistAppState_003, TestSize.Level1)
652 {
653 AppRecovery::GetInstance().EnableAppRecovery(RestartFlag::ALWAYS_RESTART, SaveOccasionFlag::SAVE_WHEN_ERROR,
654 SaveModeFlag::SAVE_WITH_SHARED_MEMORY);
655 auto constContext = std::static_pointer_cast<AbilityRuntime::AbilityContext>(context_);
656 std::shared_ptr<AbilityRuntime::UIAbility> ability = std::make_shared<AbilityRuntime::UIAbility>();
657 ability->AttachAbilityContext(constContext);
658 AppRecovery::GetInstance().AddAbility(ability, abilityInfo_, token_);
659 EXPECT_TRUE(AppRecovery::GetInstance().PersistAppState());
660 }
661
662 /**
663 * @tc.name: SetRestartWant_001
664 * @tc.desc: Test SetRestartWant when enable flag is false.
665 * @tc.type: FUNC
666 * @tc.require: I5Z7LE
667 */
668 HWTEST_F(AppRecoveryUnitTest, SetRestartWant_001, TestSize.Level1)
669 {
670 AppRecovery::GetInstance().isEnable_ = false;
671 std::shared_ptr<AAFwk::Want> want = std::make_shared<AAFwk::Want>();
672 const std::string START_ABILITY = "RestartAbility";
673 want->SetParam(START_ABILITY, std::string("com.ohos.recovery.TestRecoveryAbility"));
674 AppRecovery::GetInstance().SetRestartWant(want);
675 EXPECT_EQ(AppRecovery::GetInstance().want_, nullptr);
676 }
677
678 /**
679 * @tc.name: SetRestartWant_002
680 * @tc.desc: Test SetRestartWant when enable flag is true.
681 * @tc.type: FUNC
682 * @tc.require: I5Z7LE
683 */
684 HWTEST_F(AppRecoveryUnitTest, SetRestartWant_002, TestSize.Level1)
685 {
686 AppRecovery::GetInstance().isEnable_ = true;
687 std::shared_ptr<AAFwk::Want> want = std::make_shared<AAFwk::Want>();
688 const std::string START_ABILITY = "RestartAbility";
689 want->SetParam(START_ABILITY, std::string("com.ohos.recovery.TestRecoveryAbility"));
690 AppRecovery::GetInstance().SetRestartWant(want);
691 EXPECT_EQ(AppRecovery::GetInstance().want_, want);
692 }
693
694 /**
695 * @tc.name: GetMissionIds_001
696 * @tc.desc: Test get mission ids when the path is valid.
697 * @tc.type: FUNC
698 * @tc.require: I5Z7LE
699 */
700 HWTEST_F(AppRecoveryUnitTest, GetMissionIds_001, TestSize.Level1)
701 {
702 AppRecovery::GetInstance().isEnable_ = true;
703 std::vector<int32_t> missionIds;
704 std::string path = "data/app/el2/100/base/ohos.samples.recovery/files/";
705 if (OHOS::FileExists(path)) {
706 EXPECT_TRUE(AppRecovery::GetInstance().GetMissionIds(path, missionIds));
707 } else {
708 EXPECT_FALSE(AppRecovery::GetInstance().GetMissionIds(path, missionIds));
709 }
710 }
711
712 /**
713 * @tc.name: GetMissionIds_002
714 * @tc.desc: Test get mission ids when the file path is invalid.
715 * @tc.type: FUNC
716 * @tc.require: I5Z7LE
717 */
718 HWTEST_F(AppRecoveryUnitTest, GetMissionIds_002, TestSize.Level1)
719 {
720 AppRecovery::GetInstance().isEnable_ = true;
721 std::vector<int32_t> missionIds;
722 std::string invalid_path = "data/apps/ohos.samples.recovery/files/";
723 EXPECT_FALSE(AppRecovery::GetInstance().GetMissionIds(invalid_path, missionIds));
724 }
725
726 /**
727 * @tc.name: DeleteInValidMissionFiles_001
728 * @tc.desc: Test delete invalid mission files.
729 * @tc.type: FUNC
730 * @tc.require: I5Z7LE
731 */
732 HWTEST_F(AppRecoveryUnitTest, DeleteInValidMissionFiles_001, TestSize.Level1)
733 {
734 AbilityRuntime::ApplicationContext::GetInstance()->contextImpl_ = std::make_shared<AbilityRuntime::ContextImpl>();
735 AppRecovery::GetInstance().DeleteInValidMissionFiles();
736 EXPECT_NE(AbilityRuntime::Context::GetApplicationContext(), nullptr);
737 }
738
739 /**
740 * @tc.name: DeleteInValidMissionFileById_001
741 * @tc.desc: add testcase.
742 */
743 HWTEST_F(AppRecoveryUnitTest, DeleteInValidMissionFileById_001, TestSize.Level1)
744 {
745 AbilityRuntime::ApplicationContext::GetInstance()->contextImpl_ = std::make_shared<AbilityRuntime::ContextImpl>();
746 AppRecovery::GetInstance().DeleteInValidMissionFileById("/data/local/tmp", 10);
747 EXPECT_NE(AbilityRuntime::Context::GetApplicationContext(), nullptr);
748 }
749
750 /**
751 * @tc.name: ClearPageStack_001
752 * @tc.desc: add testcase.
753 */
754 HWTEST_F(AppRecoveryUnitTest, ClearPageStack_001, TestSize.Level1)
755 {
756 AbilityRuntime::ApplicationContext::GetInstance()->contextImpl_ = std::make_shared<AbilityRuntime::ContextImpl>();
757 AppRecovery::GetInstance().ClearPageStack("ClearPageStack_001");
758 EXPECT_NE(AbilityRuntime::Context::GetApplicationContext(), nullptr);
759 }
760 } // namespace AppExecFwk
761 } // namespace OHOS
762