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