1 /*
2  * Copyright (c) 2021 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 #include <gtest/gtest.h>
16 #include "gmock/gmock.h"
17 
18 #include <thread>
19 #include <chrono>
20 
21 #define private public
22 #define protected public
23 #include "lifecycle_test_base.h"
24 #undef private
25 #undef protected
26 
27 using namespace testing;
28 using namespace testing::ext;
29 using namespace OHOS::AppExecFwk;
30 
31 namespace OHOS {
32 namespace AAFwk {
33 #ifdef SUPPORT_ASAN
34 constexpr uint32_t LOAD_TIMEOUT = 150000;            // ms
35 constexpr uint32_t ACTIVE_TIMEOUT = 75000;          // ms
36 constexpr uint32_t INACTIVE_TIMEOUT = 7500;         // ms
37 #else
38 constexpr uint32_t LOAD_TIMEOUT = 10000;            // ms
39 constexpr uint32_t ACTIVE_TIMEOUT = 5000;          // ms
40 constexpr uint32_t INACTIVE_TIMEOUT = 500;         // ms
41 #endif
42 class LifecycleTest : public testing::Test, public LifecycleTestBase {
43 public:
44     static void SetUpTestCase();
45 
46     static void TearDownTestCase();
47 
48     void SetUp();
49 
50     void TearDown();
51 
52     bool StartNextAbility() override;
53 
54     int AttachAbility(const OHOS::sptr<OHOS::AAFwk::AbilityScheduler>& scheduler,
55         const OHOS::sptr<OHOS::IRemoteObject>& token) override;
56 
57     void OnStartabilityAms();
58 public:
59     int startLancherFlag_ = false;
60 
61     std::shared_ptr<OHOS::AAFwk::AbilityRecord> launcherAbilityRecord_{ nullptr };  // launcher ability
62     OHOS::sptr<OHOS::IRemoteObject> launcherToken_{ nullptr };                      // token of launcher ability
63     std::shared_ptr<OHOS::AAFwk::AbilityRecord> nextAbilityRecord_{ nullptr };      // ability being launched
64     OHOS::sptr<OHOS::IRemoteObject> nextToken_{ nullptr };                          // token of ability being launched
65     OHOS::sptr<OHOS::AAFwk::AbilityScheduler> launcherScheduler_{ nullptr };        // launcher ability thread interface
66     OHOS::sptr<OHOS::AAFwk::AbilityScheduler> nextScheduler_{ nullptr };            // next ability thread interface
67     std::unique_ptr<LifeTestCommand> command_{ nullptr };                           // test command_ interact with ams_
68 };
69 
SetUpTestCase()70 void LifecycleTest::SetUpTestCase() {}
71 
TearDownTestCase()72 void LifecycleTest::TearDownTestCase()
73 {
74     OHOS::DelayedSingleton<SaMgrClient>::DestroyInstance();
75 }
76 
SetUp()77 void LifecycleTest::SetUp() {}
78 
TearDown()79 void LifecycleTest::TearDown() {}
80 
StartNextAbility()81 bool LifecycleTest::StartNextAbility()
82 {
83     return true;
84 }
85 
AttachAbility(const OHOS::sptr<OHOS::AAFwk::AbilityScheduler> & scheduler,const OHOS::sptr<OHOS::IRemoteObject> & token)86 int LifecycleTest::AttachAbility(
87     const OHOS::sptr<OHOS::AAFwk::AbilityScheduler>& scheduler, const OHOS::sptr<OHOS::IRemoteObject>& token)
88 {
89     auto abilityMs_ = std::make_shared<AbilityManagerService>();
90     return abilityMs_->AttachAbilityThread(scheduler, token);
91 }
92 
93 /*
94  * Feature: Lifecycle schedule
95  * Function: Lifecycle schedule
96  * SubFunction: NA
97  * FunctionPoints: AttachAbilityThread
98  * EnvConditions:NA
99  * CaseDescription: verify AttachAbilityThread parameters.
100  * AttachAbilityThread fail if IAbilityScheduler or token is nullptr.
101  */
102 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_StartLauncherAbilityLifeCycle_001, TestSize.Level1)
103 {
104     auto abilityMs_ = std::make_shared<AbilityManagerService>();
105     if (startLancherFlag_) {
106         EXPECT_TRUE(abilityMs_);
107         EXPECT_TRUE(launcherAbilityRecord_);
108         EXPECT_NE(abilityMs_->AttachAbilityThread(nullptr, launcherToken_), 0);
109         EXPECT_NE(abilityMs_->AttachAbilityThread(launcherScheduler_, nullptr), 0);
110         EXPECT_EQ(launcherAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::ACTIVE);
111     }
112 }
113 
114 /*
115  * Feature: Lifecycle schedule
116  * Function: Lifecycle schedule
117  * SubFunction: NA
118  * FunctionPoints: AttachAbilityThread
119  * EnvConditions:NA
120  * CaseDescription: verify launcher AbilityRecord state_ when AttachAbilityThread success.
121  * 1. AbilityState transferred from INITIAL to ACTIVATING.
122  * 2. AbilityRecord is attached.
123  */
124 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_StartLauncherAbilityLifeCycle_002, TestSize.Level1)
125 {
126     auto abilityMs_ = std::make_shared<AbilityManagerService>();
127     if (startLancherFlag_) {
128         EXPECT_TRUE(abilityMs_);
129         EXPECT_TRUE(launcherAbilityRecord_);
130         EXPECT_EQ(launcherAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::ACTIVE);
131         EXPECT_TRUE(launcherScheduler_);
132         EXPECT_TRUE(launcherToken_);
133         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
134         EXPECT_EQ(launcherAbilityRecord_->IsReady(), true);
135     }
136 }
137 
138 /*
139  * Feature: Lifecycle schedule
140  * Function: Lifecycle schedule
141  * SubFunction: NA
142  * FunctionPoints: AttachAbilityThread
143  * EnvConditions:NA
144  * CaseDescription: verify AbilityRecord transition timeout handler.
145  */
146 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_StartLauncherAbilityLifeCycle_003, TestSize.Level1)
147 {
148     auto abilityMs_ = std::make_shared<AbilityManagerService>();
149     if (startLancherFlag_) {
150         command_->callback_ = false;
151         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
152         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
153         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
154         pthread_t tid = 0;
155         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
156         int ret =
157             LifecycleTest::SemTimedWaitMillis(LOAD_TIMEOUT + DELAY_TEST_TIME, command_->sem_);
158         EXPECT_NE(ret, 0);
159         // check timeout handler
160         EXPECT_EQ(launcherAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::ACTIVE);
161         pthread_join(tid, nullptr);
162     }
163 }
164 
165 /*
166  * Feature: Lifecycle schedule
167  * Function: Lifecycle schedule
168  * SubFunction: NA
169  * FunctionPoints: AttachAbilityThread
170  * EnvConditions:NA
171  * CaseDescription: verify AbilityTransitionDone parameters.
172  * AbilityTransitionDone fail if launcher schedules incorrect Life state_.
173  */
174 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_StartLauncherAbilityLifeCycle_004, TestSize.Level1)
175 {
176     auto abilityMs_ = std::make_shared<AbilityManagerService>();
177     if (startLancherFlag_) {
178         // AttachAbilityThread done and success
179         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
180 
181         command_->callback_ = true;
182         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
183         command_->abnormalState_ = OHOS::AAFwk::AbilityState::INACTIVE;
184         pthread_t tid = 0;
185         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
186         int ret =
187             LifecycleTest::SemTimedWaitMillis(LOAD_TIMEOUT + DELAY_TEST_TIME, command_->sem_);
188         if (ret != 0) {
189             // check timeout handler
190             GTEST_LOG_(INFO) << "timeout. It shouldn't happen.";
191             pthread_join(tid, nullptr);
192             return;
193         }
194         pthread_join(tid, nullptr);
195     }
196 }
197 
198 /*
199  * Feature: Lifecycle schedule
200  * Function: Lifecycle schedule
201  * SubFunction: NA
202  * FunctionPoints: AttachAbilityThread
203  * EnvConditions:NA
204  * CaseDescription: AttachAbilityThread done, verify AbilityRecord state_ when AbilityStartThread success.
205  * 1. Life transition from UNDEFINED to ACTIVATING to ACTIVE.
206  * 2. AbilityRecord is attached.
207  */
208 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_StartLauncherAbilityLifeCycle_005, TestSize.Level1)
209 {
210     auto abilityMs_ = std::make_shared<AbilityManagerService>();
211     if (startLancherFlag_) {
212         // AttachAbilityThread done and success
213         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
214         command_->callback_ = true;
215         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
216         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
217         pthread_t tid = 0;
218 
219         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
220         int ret =
221             LifecycleTest::SemTimedWaitMillis(LOAD_TIMEOUT + DELAY_TEST_TIME, command_->sem_);
222         if (ret != 0) {
223             // check timeout handler. It won't happen normally.
224             GTEST_LOG_(INFO) << "timeout. It shouldn't happen.";
225             pthread_join(tid, nullptr);
226             return;
227         }
228         PacMap saveData;
229         abilityMs_->AbilityTransitionDone(launcherToken_, command_->state_, saveData);
230         if (launcherAbilityRecord_->GetAbilityState() != OHOS::AAFwk::AbilityState::ACTIVE) {
231             EXPECT_EQ(launcherAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::ACTIVE);
232         }
233         EXPECT_EQ(launcherAbilityRecord_->IsReady(), true);
234         pthread_join(tid, nullptr);
235     }
236 }
237 
238 /*
239  * Feature: Lifecycle schedule
240  * Function: Lifecycle schedule
241  * SubFunction: NA
242  * FunctionPoints: AttachAbilityThread
243  * EnvConditions:NA
244  * CaseDescription:  hnadeler is timeout
245  */
246 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_StartLauncherAbilityLifeCycle_006, TestSize.Level1)
247 {
248     auto abilityMs_ = std::make_shared<AbilityManagerService>();
249     if (startLancherFlag_) {
250         command_->callback_ = false;
251         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
252         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
253         pthread_t tid = 0;
254         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
255         int ret = LifecycleTest::SemTimedWaitMillis(ACTIVE_TIMEOUT, command_->sem_);
256         EXPECT_NE(ret, 0);
257         // check AttachAbilityThread timeout handler
258         EXPECT_EQ(launcherAbilityRecord_->IsReady(), false);
259         pthread_join(tid, nullptr);
260     }
261 }
262 
263 /*
264  * Feature: Lifecycle schedule
265  * Function: Lifecycle schedule
266  * SubFunction: NA
267  * FunctionPoints: AbilityTransitionDone
268  * EnvConditions:NA
269  * CaseDescription: launcher OnInactive timeout, verify launcher AbilityTransitionDone timeout handler.
270  */
271 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_startAbilityLifeCycle_001, TestSize.Level1)
272 {
273     auto abilityMs_ = std::make_shared<AbilityManagerService>();
274     if (startLancherFlag_) {
275         command_->callback_ = false;
276         command_->expectState_ = OHOS::AAFwk::AbilityState::INACTIVE;
277         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
278         // launcher is in inactivating process.
279         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
280         EXPECT_TRUE(StartNextAbility());
281         launcherAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INACTIVATING);
282         pthread_t tid = 0;
283         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
284         int ret = LifecycleTest::SemTimedWaitMillis(INACTIVE_TIMEOUT, command_->sem_);
285         EXPECT_NE(ret, 0);
286         // check AbilityTransitionDone timeout handler
287         EXPECT_NE(nextAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::INACTIVATING);
288         pthread_join(tid, nullptr);
289     }
290 }
291 
292 /*
293  * Feature: Lifecycle schedule
294  * Function: Lifecycle schedule
295  * SubFunction: NA
296  * FunctionPoints: AbilityTransitionDone
297  * EnvConditions:NA
298  * CaseDescription: verify AbilityTransitionDone parameters.
299  * AbilityTransitionDone fail if life state_ is incompatible with
300  * OnInactive process. Or launcher schedules incorrect life state_.
301  */
302 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_startAbilityLifeCycle_002, TestSize.Level1)
303 {
304     auto abilityMs_ = std::make_shared<AbilityManagerService>();
305     if (startLancherFlag_) {
306         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
307         EXPECT_TRUE(StartNextAbility());
308         // launcher is in inactivating process.
309         PacMap saveData;
310         EXPECT_NE(abilityMs_->AbilityTransitionDone(launcherToken_, OHOS::AAFwk::AbilityState::ACTIVE, saveData), 0);
311         EXPECT_EQ(launcherAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::INACTIVATING);
312         EXPECT_EQ(nextAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::INITIAL);
313     }
314 }
315 
316 /*
317  * Feature: Lifecycle schedule
318  * Function: Lifecycle schedule
319  * SubFunction: NA
320  * FunctionPoints: AttachAbilityThread
321  * EnvConditions:NA
322  * CaseDescription: launcher OnInactive done, verify new ability AttachAbilityThread timeout handler.
323  */
324 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_startAbilityLifeCycle_003, TestSize.Level1)
325 {
326     auto abilityMs_ = std::make_shared<AbilityManagerService>();
327     if (startLancherFlag_) {
328         command_->callback_ = false;
329         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
330         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
331         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
332         EXPECT_TRUE(StartNextAbility());
333         launcherAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INACTIVATING);
334         PacMap saveData;
335         EXPECT_EQ(abilityMs_->AbilityTransitionDone(launcherToken_, OHOS::AAFwk::AbilityState::INACTIVE, saveData), 0);
336         // launcher oninactive done.
337         pthread_t tid = 0;
338         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
339         int ret = LifecycleTest::SemTimedWaitMillis(
340             INACTIVE_TIMEOUT + DELAY_TEST_TIME, command_->sem_);
341         EXPECT_NE(ret, 0);
342         // check timeout handler
343         EXPECT_EQ(nextAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::ACTIVATING);
344         pthread_join(tid, nullptr);
345     }
346 }
347 
348 /*
349  * Feature: Lifecycle schedule
350  * Function: Lifecycle schedule
351  * SubFunction: NA
352  * FunctionPoints: AbilityTransitionDone
353  * EnvConditions:NA
354  * CaseDescription: launcher OnInactive done, verify AbilityTransitionDone parameter.
355  * AbilityTransitionDone fail if new ability
356  * IAbilityScheduler is nullptr.
357  */
358 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_startAbilityLifeCycle_004, TestSize.Level1)
359 {
360     auto abilityMs_ = std::make_shared<AbilityManagerService>();
361     if (startLancherFlag_) {
362         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
363         EXPECT_TRUE(StartNextAbility());
364         launcherAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INACTIVATING);
365         PacMap saveData;
366         EXPECT_EQ(abilityMs_->AbilityTransitionDone(launcherToken_, OHOS::AAFwk::AbilityState::INACTIVE, saveData), 0);
367         // launcher oninactive done.
368         nextAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INITIAL);
369         EXPECT_EQ(AttachAbility(nextScheduler_, nextToken_), 0);
370         EXPECT_NE(abilityMs_->AbilityTransitionDone(nullptr, OHOS::AAFwk::AbilityState::ACTIVE, saveData), 0);
371     }
372 }
373 
374 /*
375  * Feature: Lifecycle schedule
376  * Function: Lifecycle schedule
377  * SubFunction: NA
378  * FunctionPoints: AbilityTransitionDone
379  * EnvConditions:NA
380  * CaseDescription: launcher OnInactive done. verify AbilityTransitionDone parameter.
381  * AbilityTransitionDone fail if new ability
382  * schedules incorrect state_.
383  */
384 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_startAbilityLifeCycle_005, TestSize.Level1)
385 {
386     auto abilityMs_ = std::make_shared<AbilityManagerService>();
387     if (startLancherFlag_) {
388         command_->callback_ = true;
389         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
390         command_->abnormalState_ = OHOS::AAFwk::AbilityState::INACTIVE;
391         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
392         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
393         EXPECT_TRUE(StartNextAbility());
394         launcherAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INACTIVATING);
395         PacMap saveData;
396         EXPECT_EQ(abilityMs_->AbilityTransitionDone(launcherToken_, OHOS::AAFwk::AbilityState::INACTIVE, saveData), 0);
397         // launcher oninactive done.
398         nextAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INITIAL);
399         EXPECT_EQ(AttachAbility(nextScheduler_, nextToken_), 0);
400         pthread_t tid = 0;
401         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
402         int ret =
403             LifecycleTest::SemTimedWaitMillis(LOAD_TIMEOUT + DELAY_TEST_TIME, command_->sem_);
404         if (ret != 0) {
405             // check timeout handler
406             pthread_join(tid, nullptr);
407             return;
408         }
409         pthread_join(tid, nullptr);
410     }
411 }
412 
413 /*
414  * Feature: Lifecycle schedule
415  * Function: Lifecycle schedule
416  * SubFunction: NA
417  * FunctionPoints: AbilityTransitionDone
418  * EnvConditions:NA
419  * CaseDescription: launcher OnInactive done. verify new ability AbilityTransitionDone timeout handler.
420  */
421 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_startAbilityLifeCycle_006, TestSize.Level1)
422 {
423     auto abilityMs_ = std::make_shared<AbilityManagerService>();
424     if (startLancherFlag_) {
425         command_->callback_ = false;
426         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
427         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
428         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
429         EXPECT_TRUE(StartNextAbility());
430         launcherAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INACTIVATING);
431         // launcher oninactive done.
432         EXPECT_EQ(AttachAbility(nextScheduler_, nextToken_), 0);
433         pthread_t tid = 0;
434         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
435         int ret =
436             LifecycleTest::SemTimedWaitMillis(ACTIVE_TIMEOUT + DELAY_TEST_TIME, command_->sem_);
437         EXPECT_NE(ret, 0);
438         pthread_join(tid, nullptr);
439         return;
440     }
441 }
442 
443 /*
444  * Feature: Lifecycle schedule
445  * Function: Lifecycle schedule
446  * SubFunction: NA
447  * FunctionPoints: AttachAbilityThread AbilityTransitionDone
448  * EnvConditions:NA
449  * CaseDescription: launcher OnInactive done and starts new ability success. verify new AbilityRecord.
450  * 1. Launcher oninactive done and is INACTIVE.
451  * 2. new ability is ACTIVE.
452  */
453 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_startAbilityLifeCycle_007, TestSize.Level1)
454 {
455     auto abilityMs_ = std::make_shared<AbilityManagerService>();
456     if (startLancherFlag_) {
457         command_->callback_ = true;
458         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
459         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
460         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
461         EXPECT_TRUE(StartNextAbility());
462         launcherAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INACTIVATING);
463         PacMap saveData;
464         EXPECT_EQ(abilityMs_->AbilityTransitionDone(
465             launcherToken_, OHOS::AAFwk::AbilityState::INACTIVE, saveData), OHOS::ERR_OK);
466         // launcher oninactive done.
467         EXPECT_EQ(launcherAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::INACTIVE);
468         EXPECT_EQ(AttachAbility(nextScheduler_, nextToken_), 0);
469         pthread_t tid = 0;
470         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
471         int ret = LifecycleTest::SemTimedWaitMillis(ACTIVE_TIMEOUT * 2, command_->sem_);
472         if (ret != 0) {
473             // check timeout handler
474             pthread_join(tid, nullptr);
475             return;
476         }
477         pthread_join(tid, nullptr);
478     }
479 }
480 }  // namespace AAFwk
481 }  // namespace OHOS
482