• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "system_ability_definition.h"
24 #include "lifecycle_test_base.h"
25 #include "mock_bundle_manager.h"
26 #include "sa_mgr_client.h"
27 #undef private
28 #undef protected
29 
30 using namespace testing::ext;
31 using namespace OHOS::AppExecFwk;
32 
33 namespace OHOS {
34 namespace AAFwk {
35 namespace {
36 const std::string NAME_BUNDLE_MGR_SERVICE = "BundleMgrService";
37 }
38 
WaitUntilTaskFinished()39 static void WaitUntilTaskFinished()
40 {
41     const uint32_t maxRetryCount = 1000;
42     const uint32_t sleepTime = 1000;
43     uint32_t count = 0;
44     auto handler = OHOS::DelayedSingleton<AbilityManagerService>::GetInstance()->GetEventHandler();
45     if (handler == nullptr) {
46         GTEST_LOG_(ERROR) << "handler is nullptr";
47         return;
48     }
49     std::atomic<bool> taskCalled(false);
50     auto f = [&taskCalled]() { taskCalled.store(true); };
51     if (handler->PostTask(f)) {
52         while (!taskCalled.load()) {
53             ++count;
54             if (count >= maxRetryCount) {
55                 break;
56             }
57             usleep(sleepTime);
58         }
59     }
60 }
61 
62 class LifecycleTest : public testing::Test, public LifecycleTestBase {
63 public:
64     static void SetUpTestCase(void);
65 
66     static void TearDownTestCase(void);
67 
68     void SetUp() override;
69 
70     void TearDown() override;
71 
72     bool StartNextAbility() override;
73 
74     int AttachAbility(const OHOS::sptr<OHOS::AAFwk::AbilityScheduler> &scheduler,
75         const OHOS::sptr<OHOS::IRemoteObject> &token) override;
76 
77     void OnStartabilityAms();
78 public:
79     int startLancherFlag_ = false;
80 
81     std::shared_ptr<AbilityManagerService> abilityMs_ = OHOS::DelayedSingleton<AbilityManagerService>::GetInstance();
82     std::shared_ptr<OHOS::AAFwk::AbilityRecord> launcherAbilityRecord_ {nullptr};  // launcher ability
83     OHOS::sptr<OHOS::IRemoteObject> launcherToken_ {nullptr};                      // token of launcher ability
84     std::shared_ptr<OHOS::AAFwk::AbilityRecord> nextAbilityRecord_ {nullptr};      // ability being launched
85     OHOS::sptr<OHOS::IRemoteObject> nextToken_ {nullptr};                          // token of ability being launched
86     OHOS::sptr<OHOS::AAFwk::AbilityScheduler> launcherScheduler_ {nullptr};        // launcher ability thread interface
87     OHOS::sptr<OHOS::AAFwk::AbilityScheduler> nextScheduler_ {nullptr};            // next ability thread interface
88     std::unique_ptr<LifeTestCommand> command_ {nullptr};                           // test command_ interact with ams_
89 };
90 
OnStartabilityAms()91 void LifecycleTest::OnStartabilityAms()
92 {
93     if (abilityMs_) {
94         if (abilityMs_->state_ == ServiceRunningState::STATE_RUNNING) {
95             return;
96         }
97 
98         abilityMs_->state_ = ServiceRunningState::STATE_RUNNING;
99         abilityMs_->eventLoop_ = AppExecFwk::EventRunner::Create(AbilityConfig::NAME_ABILITY_MGR_SERVICE);
100         EXPECT_TRUE(abilityMs_->eventLoop_);
101         abilityMs_->handler_ = std::make_shared<AbilityEventHandler>(abilityMs_->eventLoop_, abilityMs_);
102         abilityMs_->connectManager_ = std::make_shared<AbilityConnectManager>(0);
103         abilityMs_->connectManagers_.emplace(0, abilityMs_->connectManager_);
104         EXPECT_TRUE(abilityMs_->handler_);
105         EXPECT_TRUE(abilityMs_->connectManager_);
106         abilityMs_->connectManager_->SetEventHandler(abilityMs_->handler_);
107         abilityMs_->dataAbilityManager_ = std::make_shared<DataAbilityManager>();
108         abilityMs_->dataAbilityManagers_.emplace(0, abilityMs_->dataAbilityManager_);
109         EXPECT_TRUE(abilityMs_->dataAbilityManager_);
110         abilityMs_->amsConfigResolver_ = std::make_shared<AmsConfigurationParameter>();
111         EXPECT_TRUE(abilityMs_->amsConfigResolver_);
112         abilityMs_->amsConfigResolver_->Parse();
113         abilityMs_->currentMissionListManager_ = std::make_shared<MissionListManager>(0);
114         abilityMs_->currentMissionListManager_->Init();
115         abilityMs_->pendingWantManager_ = std::make_shared<PendingWantManager>();
116         EXPECT_TRUE(abilityMs_->pendingWantManager_);
117         abilityMs_->eventLoop_->Run();
118         return;
119     }
120 
121     GTEST_LOG_(INFO) << "OnStart fail";
122 }
123 
SetUpTestCase(void)124 void LifecycleTest::SetUpTestCase(void)
125 {
126     OHOS::DelayedSingleton<SaMgrClient>::GetInstance()->RegisterSystemAbility(
127         OHOS::BUNDLE_MGR_SERVICE_SYS_ABILITY_ID, new BundleMgrService());
128 }
129 
TearDownTestCase(void)130 void LifecycleTest::TearDownTestCase(void)
131 {
132     OHOS::DelayedSingleton<SaMgrClient>::DestroyInstance();
133 }
134 
SetUp(void)135 void LifecycleTest::SetUp(void)
136 {
137     OnStartabilityAms();
138     WaitUntilTaskFinished();
139     command_ = std::make_unique<LifeTestCommand>();
140 }
141 
TearDown(void)142 void LifecycleTest::TearDown(void)
143 {
144     abilityMs_->OnStop();
145     launcherAbilityRecord_.reset();
146     launcherToken_ = nullptr;
147     nextAbilityRecord_.reset();
148     nextToken_ = nullptr;
149     launcherScheduler_ = nullptr;
150     nextScheduler_ = nullptr;
151     command_.reset();
152     startLancherFlag_ = false;
153 }
154 
StartNextAbility()155 bool LifecycleTest::StartNextAbility()
156 {
157     return true;
158 }
159 
AttachAbility(const OHOS::sptr<OHOS::AAFwk::AbilityScheduler> & scheduler,const OHOS::sptr<OHOS::IRemoteObject> & token)160 int LifecycleTest::AttachAbility(
161     const OHOS::sptr<OHOS::AAFwk::AbilityScheduler> &scheduler, const OHOS::sptr<OHOS::IRemoteObject> &token)
162 {
163     return abilityMs_->AttachAbilityThread(scheduler, token);
164 }
165 
166 /*
167  * Feature: Lifecycle schedule
168  * Function: Lifecycle schedule
169  * SubFunction: NA
170  * FunctionPoints: AttachAbilityThread
171  * EnvConditions:NA
172  * CaseDescription: verify AttachAbilityThread parameters.
173  * AttachAbilityThread fail if IAbilityScheduler or token is nullptr.
174  */
175 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_StartLauncherAbilityLifeCycle_001, TestSize.Level1)
176 {
177     if (startLancherFlag_) {
178         EXPECT_TRUE(abilityMs_);
179         EXPECT_TRUE(launcherAbilityRecord_);
180         EXPECT_NE(abilityMs_->AttachAbilityThread(nullptr, launcherToken_), 0);
181         EXPECT_NE(abilityMs_->AttachAbilityThread(launcherScheduler_, nullptr), 0);
182         EXPECT_EQ(launcherAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::ACTIVE);
183     }
184 }
185 
186 /*
187  * Feature: Lifecycle schedule
188  * Function: Lifecycle schedule
189  * SubFunction: NA
190  * FunctionPoints: AttachAbilityThread
191  * EnvConditions:NA
192  * CaseDescription: verify launcher AbilityRecord state_ when AttachAbilityThread success.
193  * 1. AbilityState transferred from INITIAL to ACTIVATING.
194  * 2. AbilityRecord is attached.
195  */
196 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_StartLauncherAbilityLifeCycle_002, TestSize.Level1)
197 {
198     if (startLancherFlag_) {
199         EXPECT_TRUE(abilityMs_);
200         EXPECT_TRUE(launcherAbilityRecord_);
201         EXPECT_EQ(launcherAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::ACTIVE);
202         EXPECT_TRUE(launcherScheduler_);
203         EXPECT_TRUE(launcherToken_);
204         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
205         EXPECT_EQ(launcherAbilityRecord_->IsReady(), true);
206     }
207 }
208 
209 /*
210  * Feature: Lifecycle schedule
211  * Function: Lifecycle schedule
212  * SubFunction: NA
213  * FunctionPoints: AttachAbilityThread
214  * EnvConditions:NA
215  * CaseDescription: verify AbilityRecord transition timeout handler.
216  */
217 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_StartLauncherAbilityLifeCycle_003, TestSize.Level1)
218 {
219     if (startLancherFlag_) {
220         command_->callback_ = false;
221         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
222         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
223         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
224         pthread_t tid = 0;
225         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
226         int ret =
227             LifecycleTest::SemTimedWaitMillis(AbilityManagerService::LOAD_TIMEOUT + DELAY_TEST_TIME, command_->sem_);
228         EXPECT_NE(ret, 0);
229         // check timeout handler
230         EXPECT_EQ(launcherAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::ACTIVE);
231         pthread_join(tid, nullptr);
232     }
233 }
234 
235 /*
236  * Feature: Lifecycle schedule
237  * Function: Lifecycle schedule
238  * SubFunction: NA
239  * FunctionPoints: AttachAbilityThread
240  * EnvConditions:NA
241  * CaseDescription: verify AbilityTransitionDone parameters.
242  * AbilityTransitionDone fail if launcher schedules incorrect Life state_.
243  */
244 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_StartLauncherAbilityLifeCycle_004, TestSize.Level1)
245 {
246     if (startLancherFlag_) {
247         // AttachAbilityThread done and success
248         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
249 
250         command_->callback_ = true;
251         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
252         command_->abnormalState_ = OHOS::AAFwk::AbilityState::INACTIVE;
253         pthread_t tid = 0;
254         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
255         int ret =
256             LifecycleTest::SemTimedWaitMillis(AbilityManagerService::LOAD_TIMEOUT + DELAY_TEST_TIME, command_->sem_);
257         if (ret != 0) {
258             // check timeout handler
259             GTEST_LOG_(INFO) << "timeout. It shouldn't happen.";
260             pthread_join(tid, nullptr);
261             return;
262         }
263         pthread_join(tid, nullptr);
264     }
265 }
266 
267 /*
268  * Feature: Lifecycle schedule
269  * Function: Lifecycle schedule
270  * SubFunction: NA
271  * FunctionPoints: AttachAbilityThread
272  * EnvConditions:NA
273  * CaseDescription: AttachAbilityThread done, verify AbilityRecord state_ when AbilityStartThread success.
274  * 1. Life transition from UNDEFINED to ACTIVATING to ACTIVE.
275  * 2. AbilityRecord is attached.
276  */
277 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_StartLauncherAbilityLifeCycle_005, TestSize.Level1)
278 {
279     if (startLancherFlag_) {
280         // AttachAbilityThread done and success
281         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
282         command_->callback_ = true;
283         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
284         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
285         pthread_t tid = 0;
286 
287         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
288         int ret =
289             LifecycleTest::SemTimedWaitMillis(AbilityManagerService::LOAD_TIMEOUT + DELAY_TEST_TIME, command_->sem_);
290         if (ret != 0) {
291             // check timeout handler. It won't happen normally.
292             GTEST_LOG_(INFO) << "timeout. It shouldn't happen.";
293             pthread_join(tid, nullptr);
294             return;
295         }
296         PacMap saveData;
297         abilityMs_->AbilityTransitionDone(launcherToken_, command_->state_, saveData);
298         if (launcherAbilityRecord_->GetAbilityState() != OHOS::AAFwk::AbilityState::ACTIVE) {
299             WaitUntilTaskFinished();
300             EXPECT_EQ(launcherAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::ACTIVE);
301         }
302         EXPECT_EQ(launcherAbilityRecord_->IsReady(), true);
303         pthread_join(tid, nullptr);
304     }
305 }
306 
307 /*
308  * Feature: Lifecycle schedule
309  * Function: Lifecycle schedule
310  * SubFunction: NA
311  * FunctionPoints: AttachAbilityThread
312  * EnvConditions:NA
313  * CaseDescription:  hnadeler is timeout
314  */
315 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_StartLauncherAbilityLifeCycle_006, TestSize.Level1)
316 {
317     if (startLancherFlag_) {
318         command_->callback_ = false;
319         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
320         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
321         pthread_t tid = 0;
322         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
323         int ret = LifecycleTest::SemTimedWaitMillis(AbilityManagerService::ACTIVE_TIMEOUT, command_->sem_);
324         EXPECT_NE(ret, 0);
325         // check AttachAbilityThread timeout handler
326         EXPECT_EQ(launcherAbilityRecord_->IsReady(), false);
327         pthread_join(tid, nullptr);
328     }
329 }
330 
331 /*
332  * Feature: Lifecycle schedule
333  * Function: Lifecycle schedule
334  * SubFunction: NA
335  * FunctionPoints: AbilityTransitionDone
336  * EnvConditions:NA
337  * CaseDescription: launcher OnInactive timeout, verify launcher AbilityTransitionDone timeout handler.
338  */
339 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_startAbilityLifeCycle_001, TestSize.Level1)
340 {
341     if (startLancherFlag_) {
342         command_->callback_ = false;
343         command_->expectState_ = OHOS::AAFwk::AbilityState::INACTIVE;
344         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
345         // launcher is in inactivating process.
346         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
347         EXPECT_TRUE(StartNextAbility());
348         launcherAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INACTIVATING);
349         pthread_t tid = 0;
350         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
351         int ret = LifecycleTest::SemTimedWaitMillis(AbilityManagerService::INACTIVE_TIMEOUT, command_->sem_);
352         EXPECT_NE(ret, 0);
353         // check AbilityTransitionDone timeout handler
354         EXPECT_NE(nextAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::INACTIVATING);
355         pthread_join(tid, nullptr);
356     }
357 }
358 
359 /*
360  * Feature: Lifecycle schedule
361  * Function: Lifecycle schedule
362  * SubFunction: NA
363  * FunctionPoints: AbilityTransitionDone
364  * EnvConditions:NA
365  * CaseDescription: verify AbilityTransitionDone parameters.
366  * AbilityTransitionDone fail if life state_ is incompatible with
367  * OnInactive process. Or launcher schedules incorrect life state_.
368  */
369 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_startAbilityLifeCycle_002, TestSize.Level1)
370 {
371     if (startLancherFlag_) {
372         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
373         EXPECT_TRUE(StartNextAbility());
374         // launcher is in inactivating process.
375         PacMap saveData;
376         EXPECT_NE(abilityMs_->AbilityTransitionDone(launcherToken_, OHOS::AAFwk::AbilityState::ACTIVE, saveData), 0);
377         WaitUntilTaskFinished();
378         EXPECT_EQ(launcherAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::INACTIVATING);
379         EXPECT_EQ(nextAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::INITIAL);
380     }
381 }
382 
383 /*
384  * Feature: Lifecycle schedule
385  * Function: Lifecycle schedule
386  * SubFunction: NA
387  * FunctionPoints: AttachAbilityThread
388  * EnvConditions:NA
389  * CaseDescription: launcher OnInactive done, verify new ability AttachAbilityThread timeout handler.
390  */
391 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_startAbilityLifeCycle_003, TestSize.Level1)
392 {
393     if (startLancherFlag_) {
394         command_->callback_ = false;
395         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
396         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
397         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
398         WaitUntilTaskFinished();
399         EXPECT_TRUE(StartNextAbility());
400         launcherAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INACTIVATING);
401         PacMap saveData;
402         EXPECT_EQ(abilityMs_->AbilityTransitionDone(launcherToken_, OHOS::AAFwk::AbilityState::INACTIVE, saveData), 0);
403         // launcher oninactive done.
404         pthread_t tid = 0;
405         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
406         int ret = LifecycleTest::SemTimedWaitMillis(
407             AbilityManagerService::INACTIVE_TIMEOUT + DELAY_TEST_TIME, command_->sem_);
408         EXPECT_NE(ret, 0);
409         // check timeout handler
410         EXPECT_EQ(nextAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::ACTIVATING);
411         pthread_join(tid, nullptr);
412 
413         WaitUntilTaskFinished();
414     }
415 }
416 
417 /*
418  * Feature: Lifecycle schedule
419  * Function: Lifecycle schedule
420  * SubFunction: NA
421  * FunctionPoints: AbilityTransitionDone
422  * EnvConditions:NA
423  * CaseDescription: launcher OnInactive done, verify AbilityTransitionDone parameter.
424  * AbilityTransitionDone fail if new ability
425  * IAbilityScheduler is nullptr.
426  */
427 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_startAbilityLifeCycle_004, TestSize.Level1)
428 {
429     if (startLancherFlag_) {
430         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
431         EXPECT_TRUE(StartNextAbility());
432         launcherAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INACTIVATING);
433         PacMap saveData;
434         EXPECT_EQ(abilityMs_->AbilityTransitionDone(launcherToken_, OHOS::AAFwk::AbilityState::INACTIVE, saveData), 0);
435         // launcher oninactive done.
436         nextAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INITIAL);
437         EXPECT_EQ(AttachAbility(nextScheduler_, nextToken_), 0);
438         EXPECT_NE(abilityMs_->AbilityTransitionDone(nullptr, OHOS::AAFwk::AbilityState::ACTIVE, saveData), 0);
439     }
440 }
441 
442 /*
443  * Feature: Lifecycle schedule
444  * Function: Lifecycle schedule
445  * SubFunction: NA
446  * FunctionPoints: AbilityTransitionDone
447  * EnvConditions:NA
448  * CaseDescription: launcher OnInactive done. verify AbilityTransitionDone parameter.
449  * AbilityTransitionDone fail if new ability
450  * schedules incorrect state_.
451  */
452 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_startAbilityLifeCycle_005, TestSize.Level1)
453 {
454     if (startLancherFlag_) {
455         command_->callback_ = true;
456         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
457         command_->abnormalState_ = OHOS::AAFwk::AbilityState::INACTIVE;
458         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
459         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
460         EXPECT_TRUE(StartNextAbility());
461         launcherAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INACTIVATING);
462         PacMap saveData;
463         EXPECT_EQ(abilityMs_->AbilityTransitionDone(launcherToken_, OHOS::AAFwk::AbilityState::INACTIVE, saveData), 0);
464         WaitUntilTaskFinished();
465         // launcher oninactive done.
466         nextAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INITIAL);
467         EXPECT_EQ(AttachAbility(nextScheduler_, nextToken_), 0);
468         pthread_t tid = 0;
469         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
470         int ret =
471             LifecycleTest::SemTimedWaitMillis(AbilityManagerService::LOAD_TIMEOUT + DELAY_TEST_TIME, 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 
481 /*
482  * Feature: Lifecycle schedule
483  * Function: Lifecycle schedule
484  * SubFunction: NA
485  * FunctionPoints: AbilityTransitionDone
486  * EnvConditions:NA
487  * CaseDescription: launcher OnInactive done. verify new ability AbilityTransitionDone timeout handler.
488  */
489 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_startAbilityLifeCycle_006, TestSize.Level1)
490 {
491     if (startLancherFlag_) {
492         command_->callback_ = false;
493         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
494         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
495         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
496         EXPECT_TRUE(StartNextAbility());
497         launcherAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INACTIVATING);
498         // launcher oninactive done.
499         EXPECT_EQ(AttachAbility(nextScheduler_, nextToken_), 0);
500         pthread_t tid = 0;
501         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
502         int ret =
503             LifecycleTest::SemTimedWaitMillis(AbilityManagerService::ACTIVE_TIMEOUT + DELAY_TEST_TIME, command_->sem_);
504         EXPECT_NE(ret, 0);
505         pthread_join(tid, nullptr);
506         return;
507     }
508 }
509 
510 /*
511  * Feature: Lifecycle schedule
512  * Function: Lifecycle schedule
513  * SubFunction: NA
514  * FunctionPoints: AttachAbilityThread AbilityTransitionDone
515  * EnvConditions:NA
516  * CaseDescription: launcher OnInactive done and starts new ability success. verify new AbilityRecord.
517  * 1. Launcher oninactive done and is INACTIVE.
518  * 2. new ability is ACTIVE.
519  */
520 HWTEST_F(LifecycleTest, AAFWK_AbilityMS_startAbilityLifeCycle_007, TestSize.Level1)
521 {
522     if (startLancherFlag_) {
523         command_->callback_ = true;
524         command_->expectState_ = OHOS::AAFwk::AbilityState::ACTIVE;
525         command_->state_ = OHOS::AAFwk::AbilityState::INITIAL;
526         EXPECT_EQ(AttachAbility(launcherScheduler_, launcherToken_), 0);
527         EXPECT_TRUE(StartNextAbility());
528         launcherAbilityRecord_->SetAbilityState(OHOS::AAFwk::AbilityState::INACTIVATING);
529         PacMap saveData;
530         EXPECT_EQ(abilityMs_->AbilityTransitionDone(
531             launcherToken_, OHOS::AAFwk::AbilityState::INACTIVE, saveData), OHOS::ERR_OK);
532         // launcher oninactive done.
533         WaitUntilTaskFinished();
534         EXPECT_EQ(launcherAbilityRecord_->GetAbilityState(), OHOS::AAFwk::AbilityState::INACTIVE);
535         EXPECT_EQ(AttachAbility(nextScheduler_, nextToken_), 0);
536         pthread_t tid = 0;
537         pthread_create(&tid, nullptr, LifecycleTest::AbilityStartThread, command_.get());
538         int ret = LifecycleTest::SemTimedWaitMillis(AbilityManagerService::ACTIVE_TIMEOUT * 2, command_->sem_);
539         if (ret != 0) {
540             // check timeout handler
541             pthread_join(tid, nullptr);
542             return;
543         }
544         pthread_join(tid, nullptr);
545     }
546 }
547 }  // namespace AAFwk
548 }  // namespace OHOS
549