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
16 #include "main_ability.h"
17 #include "app_log_wrapper.h"
18 #include "test_utils.h"
19 #include <algorithm>
20 #include <condition_variable>
21 #include <chrono>
22 #include <functional>
23
24 namespace OHOS {
25 namespace AppExecFwk {
26 using namespace OHOS::EventFwk;
27 using namespace OHOS::STtools;
28 namespace {
29 int terminated_task_num = 0;
30 std::condition_variable cv;
31 std::mutex cv_mutex;
32 constexpr int testTaskCount = 3;
33 std::string innerSyncBarrierId = "innerSyncBarrierId";
34 std::string innerAsyncBarrierId = "innerAsyncBarrierId";
35 std::string innerGroupWaitId = "innerGroupWaitId";
36 std::string innerGroupNotifyId = "innerGroupNotifyId";
37 std::string outerSyncBarrierId = "outerSyncBarrierId";
38 std::string outerAsyncBarrierId = "outerAsyncBarrierId";
39 std::string outerGroupWaitId = "outerGroupWaitId";
40 std::string outerGroupNotifyId = "outerGroupNotifyId";
41 std::string delimiter = "_";
42 std::string innerDelimiter = "-";
43 std::string task_execution_sequence = delimiter;
44 std::vector<std::shared_ptr<AppExecFwk::TaskDispatcher>> allDispatchers;
45 std::mutex dispatcher_mutex;
46 constexpr int numZero = 0;
47 constexpr int numOne = 1;
48 constexpr int numTwo = 2;
49 constexpr int numThree = 3;
50 }
51
Wait(const int task_num)52 bool Wait(const int task_num)
53 {
54 APP_LOGI("-- -- -- -- -- --MainAbility::Wait");
55 std::unique_lock<std::mutex> ulock(cv_mutex);
56 using namespace std::chrono_literals;
57 bool result = cv.wait_for(ulock, 5000ms, [task_num] { return terminated_task_num == task_num; });
58 if (result) {
59 allDispatchers.clear();
60 }
61 APP_LOGI("-- -- -- -- -- --MainAbility::Wait result:%{public}d", result);
62 return result;
63 }
64
TestTask(const std::string & task_id)65 void TestTask(const std::string &task_id)
66 {
67 {
68 std::lock_guard<std::mutex> lock(cv_mutex);
69 terminated_task_num++;
70 task_execution_sequence += task_id + delimiter;
71 }
72 APP_LOGI("-- -- -- -- -- --MainAbility::TestTask: %{public}d %{public}s", terminated_task_num, task_id.c_str());
73 TestUtils::PublishEvent(g_EVENT_RESP_FIRST_B, terminated_task_num, task_execution_sequence);
74 cv.notify_one();
75 }
76
Reset()77 void Reset()
78 {
79 APP_LOGI("-- -- -- -- -- --MainAbility::Reset");
80 terminated_task_num = 0;
81 task_execution_sequence = delimiter;
82 allDispatchers.clear();
83 }
84
IsAscend(const std::vector<size_t> & vec)85 bool IsAscend(const std::vector<size_t> &vec)
86 {
87 APP_LOGI("-- -- -- -- -- --MainAbility::IsAscend begin");
88 auto pos = std::adjacent_find(std::begin(vec), std::end(vec), std::greater<size_t>());
89 return pos == std::end(vec);
90 APP_LOGI("-- -- -- -- -- --MainAbility::IsAscend end");
91 }
92
OuterTaskExecuted(TestSetting setting)93 bool OuterTaskExecuted(TestSetting setting)
94 {
95 APP_LOGI("-- -- -- -- -- --MainAbility::OuterTaskExecuted begin");
96 std::string expectedTaskId;
97 bool executed = true;
98 for (int i = 0; i < testTaskCount; i++) {
99 expectedTaskId = delimiter + std::to_string(i) + delimiter;
100 executed = executed && (task_execution_sequence.find(expectedTaskId) != string::npos);
101 if (!executed) {
102 return executed;
103 }
104 }
105 if (setting.sync_barrier) {
106 expectedTaskId = delimiter + outerSyncBarrierId + delimiter;
107 executed = executed && (task_execution_sequence.find(expectedTaskId) != string::npos);
108 }
109 if (setting.async_barrier) {
110 expectedTaskId = delimiter + outerAsyncBarrierId + delimiter;
111 executed = executed && (task_execution_sequence.find(expectedTaskId) != string::npos);
112 }
113 if (setting.group_notify) {
114 expectedTaskId = delimiter + outerGroupNotifyId + delimiter;
115 executed = executed && (task_execution_sequence.find(expectedTaskId) != string::npos);
116 }
117 APP_LOGI("-- -- -- -- -- --MainAbility::OuterTaskExecuted end");
118 return executed;
119 }
120
InnerTaskExecuted(TestSetting setting)121 bool InnerTaskExecuted(TestSetting setting)
122 {
123 APP_LOGI("-- -- -- -- -- --MainAbility::InnerTaskExecuted begin");
124 std::string expectedTaskId;
125 bool executed = true;
126 for (int i = 0; i < testTaskCount; i++) {
127 for (int j = 0; j < testTaskCount; j++) {
128 expectedTaskId = delimiter + std::to_string(i) + innerDelimiter + std::to_string(j) + delimiter;
129 executed = executed && (task_execution_sequence.find(expectedTaskId) != string::npos);
130 if (!executed) {
131 return executed;
132 }
133 }
134 }
135 if (setting.sync_barrier) {
136 expectedTaskId = delimiter + innerSyncBarrierId + delimiter;
137 executed = executed && (task_execution_sequence.find(expectedTaskId) != string::npos);
138 }
139 if (setting.async_barrier) {
140 expectedTaskId = delimiter + innerAsyncBarrierId + delimiter;
141 executed = executed && (task_execution_sequence.find(expectedTaskId) != string::npos);
142 }
143 if (setting.group_notify) {
144 expectedTaskId = delimiter + innerGroupNotifyId + delimiter;
145 executed = executed && (task_execution_sequence.find(expectedTaskId) != string::npos);
146 }
147 APP_LOGI("-- -- -- -- -- --MainAbility::InnerTaskExecuted end");
148 return executed;
149 }
150
setTaskIndex(std::string taskId,std::vector<size_t> & taskIndex)151 void setTaskIndex(std::string taskId, std::vector<size_t> &taskIndex)
152 {
153 APP_LOGI("-- -- -- -- -- --MainAbility::setTaskIndex begin");
154 std::size_t indx = task_execution_sequence.find(taskId);
155 if (indx != string::npos) {
156 taskIndex.push_back(indx);
157 }
158 APP_LOGI("-- -- -- -- -- --MainAbility::setTaskIndex end");
159 }
160
GetTaskIndex(std::vector<size_t> & outerTaskIndex,std::vector<std::vector<size_t>> & innerTaskIndex,const int outerCnt=testTaskCount,const int innerCnt=testTaskCount)161 void GetTaskIndex(std::vector<size_t> &outerTaskIndex, std::vector<std::vector<size_t>> &innerTaskIndex,
162 const int outerCnt = testTaskCount, const int innerCnt = testTaskCount)
163 {
164 APP_LOGI("-- -- -- -- -- --MainAbility::GetTaskIndex begin");
165 std::string outerTaskId;
166 std::string innerTaskId;
167 outerTaskIndex.resize(outerCnt);
168 APP_LOGI("-- -- -- -- -- --MainAbility::GetTaskIndex outersize : %{public}zu", outerTaskIndex.size());
169 innerTaskIndex.resize(outerCnt);
170 APP_LOGI("-- -- -- -- -- --MainAbility::GetTaskIndex innersize : %{public}zu", innerTaskIndex.size());
171 for (auto &inner : innerTaskIndex) {
172 inner.resize(innerCnt);
173 APP_LOGI("-- -- -- -- -- --MainAbility::GetTaskIndex inner :%{public}zu", inner.size());
174 }
175 APP_LOGI("-- -- -- -- -- --MainAbility::GetTaskIndex mid1");
176 for (int i = 0; i < outerCnt; i++) {
177 outerTaskId = delimiter + std::to_string(i) + delimiter;
178 APP_LOGI("-- -- -- -- -- --MainAbility::GetTaskIndex mid2");
179 outerTaskIndex[i] = task_execution_sequence.find(outerTaskId);
180 APP_LOGI("-- -- -- -- -- --MainAbility::GetTaskIndex mid3");
181 for (int j = 0; j < innerCnt; j++) {
182 innerTaskId = delimiter + std::to_string(i) + innerDelimiter + std::to_string(j) + delimiter;
183 APP_LOGI("-- -- -- -- -- --MainAbility::GetTaskIndex mid4");
184 innerTaskIndex[i][j] = task_execution_sequence.find(innerTaskId);
185 APP_LOGI("-- -- -- -- -- --MainAbility::GetTaskIndex mid5");
186 }
187 std::string taskId = innerSyncBarrierId + std::to_string(i);
188 setTaskIndex(taskId, innerTaskIndex[i]);
189 taskId = innerAsyncBarrierId + std::to_string(i);
190 setTaskIndex(taskId, innerTaskIndex[i]);
191 taskId = innerGroupNotifyId + std::to_string(i);
192 setTaskIndex(taskId, innerTaskIndex[i]);
193 }
194 setTaskIndex(outerSyncBarrierId, outerTaskIndex);
195 setTaskIndex(outerAsyncBarrierId, outerTaskIndex);
196 setTaskIndex(outerGroupNotifyId, outerTaskIndex);
197 APP_LOGI("-- -- -- -- -- --MainAbility:: end");
198 }
199
Init(const std::shared_ptr<AbilityInfo> & abilityInfo,const std::shared_ptr<OHOSApplication> & application,std::shared_ptr<AbilityHandler> & handler,const sptr<IRemoteObject> & token)200 void MainAbility::Init(const std::shared_ptr<AbilityInfo> &abilityInfo,
201 const std::shared_ptr<OHOSApplication> &application, std::shared_ptr<AbilityHandler> &handler,
202 const sptr<IRemoteObject> &token)
203 {
204 APP_LOGI("MainAbility::Init");
205 Ability::Init(abilityInfo, application, handler, token);
206 }
207
~MainAbility()208 MainAbility::~MainAbility()
209 {
210 CommonEventManager::UnSubscribeCommonEvent(subscriber_);
211 }
212
OnStart(const Want & want)213 void MainAbility::OnStart(const Want &want)
214 {
215 APP_LOGI("MainAbility::onStart");
216 SubscribeEvent();
217 Ability::OnStart(want);
218 TestUtils::PublishEvent(g_EVENT_RESP_FIRST_B, Ability::GetState(), "onStart");
219 }
220
OnStop()221 void MainAbility::OnStop()
222 {
223 APP_LOGI("MainAbility::OnStop");
224 Ability::OnStop();
225 CommonEventManager::UnSubscribeCommonEvent(subscriber_);
226 TestUtils::PublishEvent(g_EVENT_RESP_FIRST_B, Ability::GetState(), "OnStop");
227 }
228
OnActive()229 void MainAbility::OnActive()
230 {
231 APP_LOGI("MainAbility::OnActive");
232 Ability::OnActive();
233 TestUtils::PublishEvent(g_EVENT_RESP_FIRST_B, 0, "OnActive");
234 }
235
OnInactive()236 void MainAbility::OnInactive()
237 {
238 APP_LOGI("MainAbility::OnInactive");
239 Ability::OnInactive();
240 TestUtils::PublishEvent(g_EVENT_RESP_FIRST_B, Ability::GetState(), "OnInactive");
241 }
242
OnBackground()243 void MainAbility::OnBackground()
244 {
245 APP_LOGI("MainAbility::OnBackground");
246 Ability::OnBackground();
247 TestUtils::PublishEvent(g_EVENT_RESP_FIRST_B, Ability::GetState(), "OnBackground");
248 }
249
OnForeground(const Want & want)250 void MainAbility::OnForeground(const Want &want)
251 {
252 APP_LOGI("MainAbility::OnForeground");
253 Ability::OnForeground(want);
254 TestUtils::PublishEvent(g_EVENT_RESP_FIRST_B, Ability::GetState(), "OnForeground");
255 }
256
SubscribeEvent()257 void MainAbility::SubscribeEvent()
258 {
259 std::vector<std::string> eventList = {
260 g_EVENT_REQU_FIRST_B,
261 };
262 MatchingSkills matchingSkills;
263 for (const auto &e : eventList) {
264 matchingSkills.AddEvent(e);
265 }
266 CommonEventSubscribeInfo subscribeInfo(matchingSkills);
267 subscribeInfo.SetPriority(1);
268 subscriber_ = std::make_shared<FirstEventSubscriber>(subscribeInfo);
269 subscriber_->mainAbility = this;
270 CommonEventManager::SubscribeCommonEvent(subscriber_);
271 }
272
OnReceiveEvent(const CommonEventData & data)273 void FirstEventSubscriber::OnReceiveEvent(const CommonEventData &data)
274 {
275 APP_LOGI("FirstEventSubscriber::OnReceiveEvent:event=%{public}s", data.GetWant().GetAction().c_str());
276 APP_LOGI("FirstEventSubscriber::OnReceiveEvent:data=%{public}s", data.GetData().c_str());
277 APP_LOGI("FirstEventSubscriber::OnReceiveEvent:code=%{public}d", data.GetCode());
278 auto eventName = data.GetWant().GetAction();
279 if (std::strcmp(eventName.c_str(), g_EVENT_REQU_FIRST_B.c_str()) == 0) {
280 auto target = data.GetData();
281 auto caseInfo = TestUtils::split(target, "_");
282 APP_LOGI("FirstEventSubscriber::OnReceiveEvent:caseInfo.size()=%{public}zu", caseInfo.size());
283 if (caseInfo.size() < numThree) {
284 return;
285 }
286 if (mapTestFunc_.find(caseInfo[numZero]) != mapTestFunc_.end()) {
287 mapTestFunc_[caseInfo[numZero]](std::stoi(caseInfo[numOne]), std::stoi(caseInfo[numTwo]), data.GetCode());
288 } else {
289 APP_LOGI("OnReceiveEvent: CommonEventData error(%{public}s)", target.c_str());
290 }
291 }
292 }
293
TestDispatcher(int apiIndex,int caseIndex,int code)294 void MainAbility::TestDispatcher(int apiIndex, int caseIndex, int code)
295 {
296 if (mapCase_.find(apiIndex) != mapCase_.end()) {
297 if (caseIndex < (int)mapCase_[apiIndex].size()) {
298 mapCase_[apiIndex][caseIndex](code);
299 }
300 }
301 }
302
SetInnerTask(TaskList innerDispatcher,TestSetting innerSetting,std::string outerTaskId,int innerTaskSeq)303 void SetInnerTask(TaskList innerDispatcher, TestSetting innerSetting, std::string outerTaskId, int innerTaskSeq) {
304 std::string innerTaskId = outerTaskId + innerDelimiter + std::to_string(innerTaskSeq);
305 auto innerTask = std::make_shared<Runnable>([=]() { TestTask(innerTaskId); });
306 innerDispatcher.addOperation(innerSetting.op);
307 if (innerSetting.op == TestOperation::APPLY && innerSetting.apply > 0) {
308 innerDispatcher.addApply(innerSetting.apply);
309 }
310 if (innerSetting.op == TestOperation::DELAY && innerSetting.delay > 0) {
311 innerDispatcher.addDelay(innerSetting.delay);
312 }
313 innerDispatcher.addFunc(innerTask);
314 }
315
SetInnerTaskOther(TaskList innerDispatcher,TestSetting innerSetting,int outerTaskSeq)316 void SetInnerTaskOther(TaskList innerDispatcher, TestSetting innerSetting, int outerTaskSeq) {
317 if (innerSetting.sync_barrier) {
318 std::string taskId = innerSyncBarrierId + std::to_string(outerTaskSeq);
319 auto task = std::make_shared<Runnable>([=]() { TestTask(taskId); });
320 innerDispatcher.addOperation(TestOperation::SYNC_BARRIER).addFunc(task);
321 }
322 if (innerSetting.async_barrier) {
323 std::string taskId = innerAsyncBarrierId + std::to_string(outerTaskSeq);
324 auto task = std::make_shared<Runnable>([=]() { TestTask(taskId); });
325 innerDispatcher.addOperation(TestOperation::ASYNC_BARRIER).addFunc(task);
326 }
327 if (innerSetting.group_wait) {
328 innerDispatcher.addOperation(TestOperation::GROUP_WAIT).addWaitTime(innerSetting.group_timeout);
329 }
330 if (innerSetting.group_notify) {
331 std::string taskId = innerGroupNotifyId + std::to_string(outerTaskSeq);
332 auto task = std::make_shared<Runnable>([=]() { TestTask(taskId); });
333 innerDispatcher.addOperation(TestOperation::GROUP_NOTIFY).addFunc(task);
334 }
335 }
336
SetOuterTaskOther(TaskList outerDispatcher,TestSetting outerSetting)337 void SetOuterTaskOther(TaskList outerDispatcher, TestSetting outerSetting) {
338 if (outerSetting.sync_barrier) {
339 auto task = std::make_shared<Runnable>([=]() { TestTask(outerSyncBarrierId); });
340 outerDispatcher.addOperation(TestOperation::SYNC_BARRIER).addFunc(task);
341 }
342 if (outerSetting.async_barrier) {
343 auto task = std::make_shared<Runnable>([=]() { TestTask(outerAsyncBarrierId); });
344 outerDispatcher.addOperation(TestOperation::ASYNC_BARRIER).addFunc(task);
345 }
346 if (outerSetting.group_wait) {
347 outerDispatcher.addOperation(TestOperation::GROUP_WAIT).addWaitTime(outerSetting.group_timeout);
348 }
349 if (outerSetting.group_notify) {
350 auto task = std::make_shared<Runnable>([=]() { TestTask(outerGroupNotifyId); });
351 outerDispatcher.addOperation(TestOperation::GROUP_NOTIFY).addFunc(task);
352 }
353 }
354
CountTask(TestSetting outerSetting,TestSetting innerSetting)355 int CountTask(TestSetting outerSetting, TestSetting innerSetting) {
356 int taskCount = 0;
357 taskCount = (innerSetting.op == TestOperation::APPLY) ? (innerSetting.apply * testTaskCount) : testTaskCount;
358 if (innerSetting.sync_barrier) {
359 taskCount++;
360 }
361 if (innerSetting.async_barrier) {
362 taskCount++;
363 }
364 if (innerSetting.group_notify) {
365 taskCount++;
366 }
367 taskCount = (outerSetting.op == TestOperation::APPLY)
368 ? (outerSetting.apply * testTaskCount + outerSetting.apply * testTaskCount * taskCount)
369 : (testTaskCount + testTaskCount * taskCount);
370 if (outerSetting.sync_barrier) {
371 taskCount++;
372 }
373 if (outerSetting.async_barrier) {
374 taskCount++;
375 }
376 if (outerSetting.group_notify) {
377 taskCount++;
378 }
379 return taskCount;
380 }
381
Dispatch(TestSetting outerSetting,TestSetting innerSetting)382 int MainAbility::Dispatch(TestSetting outerSetting, TestSetting innerSetting)
383 {
384 std::string outerName = "outerDispatcher";
385 std::string innerName = "innerDispatcher";
386 std::string outerTaskId;
387 auto context = GetContext();
388 TaskList outerDispatcher {outerSetting.dispatcher, context, outerName};
389 if (outerSetting.create_group) {
390 outerDispatcher.addOperation(TestOperation::CREATE_GROUP);
391 }
392 for (int i = 0; i < testTaskCount; i++) {
393 outerTaskId = std::to_string(i);
394 auto outerTask = std::make_shared<Runnable>([=]() {
395 auto context = this->GetContext();
396 TaskList innerDispatcher {innerSetting.dispatcher, context, innerName + std::to_string(i)};
397 if (innerSetting.create_group) {
398 innerDispatcher.addOperation(TestOperation::CREATE_GROUP);
399 }
400 for (int j = 0; j < testTaskCount; j++) {
401 SetInnerTask(innerDispatcher, innerSetting, outerTaskId, j);
402 }
403 SetInnerTaskOther(innerDispatcher, innerSetting, i);
404 innerDispatcher.executedTask();
405 {
406 std::lock_guard<std::mutex> lock(dispatcher_mutex);
407 allDispatchers.push_back(innerDispatcher.getDispatcher());
408 }
409 TestTask(outerTaskId);
410 });
411 outerDispatcher.addOperation(outerSetting.op);
412 if (outerSetting.op == TestOperation::APPLY && outerSetting.apply > 0) {
413 outerDispatcher.addApply(outerSetting.apply);
414 }
415 if (outerSetting.op == TestOperation::DELAY && outerSetting.delay > 0) {
416 outerDispatcher.addDelay(outerSetting.delay);
417 }
418 outerDispatcher.addFunc(outerTask);
419 }
420 SetOuterTaskOther(outerDispatcher, outerSetting);
421 outerDispatcher.executedTask();
422 {
423 std::lock_guard<std::mutex> lock(dispatcher_mutex);
424 allDispatchers.push_back(outerDispatcher.getDispatcher());
425 }
426 int taskCount = CountTask(outerSetting, innerSetting);
427 return taskCount;
428 }
429
addTaskFromList(TaskList & dispatcher,const std::vector<TestOperation> & operationList,int & taskId,const int apply=0,const long delay=0)430 static void addTaskFromList(TaskList &dispatcher, const std::vector<TestOperation> &operationList, int &taskId,
431 const int apply = 0, const long delay = 0)
432 {
433 for (auto op : operationList) {
434 if (op == TestOperation::CREATE_GROUP) {
435 dispatcher.addOperation(op);
436 continue;
437 }
438 if (op == TestOperation::APPLY) {
439 dispatcher.addApply(apply);
440 }
441 if (op == TestOperation::DELAY) {
442 dispatcher.addDelay(delay);
443 }
444 dispatcher.addOperation(op).addFunc(std::make_shared<Runnable>([=]() { TestTask(std::to_string(taskId)); }));
445 taskId++;
446 }
447 }
448
MultiAppCase1(int code)449 void MainAbility::MultiAppCase1(int code)
450 {
451 APP_LOGI("-- -- -- -- -- --MainAbility::%{public}s", __FUNCTION__);
452 Reset();
453 auto context = GetContext();
454 TaskList globalDispatcher = TaskList {TestDispatcher::GLOBAL, context, "global"};
455 std::vector<TestOperation> operationList = {
456 TestOperation::ASYNC,
457 TestOperation::ASYNC,
458 TestOperation::ASYNC,
459 TestOperation::ASYNC,
460 TestOperation::ASYNC,
461 TestOperation::ASYNC,
462 TestOperation::ASYNC,
463 TestOperation::ASYNC,
464 TestOperation::ASYNC,
465 TestOperation::ASYNC,
466 };
467 int taskId = 0;
468 addTaskFromList(globalDispatcher, operationList, taskId);
469 globalDispatcher.executedTask();
470 Wait(taskId);
471 bool result = task_execution_sequence.size() > 1;
472 std::vector<size_t> outerTaskIndex;
473 std::vector<std::vector<size_t>> innerTaskIndex;
474 GetTaskIndex(outerTaskIndex, innerTaskIndex, taskId, 0);
475 for (auto index : outerTaskIndex) {
476 result = result && (index != std::string::npos);
477 }
478 TestUtils::PublishEvent(g_EVENT_RESP_FIRST_B, code, std::to_string(result));
479 }
480
MultiAppCase2(int code)481 void MainAbility::MultiAppCase2(int code)
482 {
483 APP_LOGI("-- -- -- -- -- --MainAbility::%{public}s", __FUNCTION__);
484 Reset();
485 auto context = GetContext();
486 TaskList globalDispatcher = TaskList {TestDispatcher::PARALLEL, context, "parallel"};
487 std::vector<TestOperation> operationList = {
488 TestOperation::ASYNC,
489 TestOperation::ASYNC,
490 TestOperation::ASYNC,
491 TestOperation::ASYNC,
492 TestOperation::ASYNC,
493 TestOperation::ASYNC,
494 TestOperation::ASYNC,
495 TestOperation::ASYNC,
496 TestOperation::ASYNC,
497 TestOperation::ASYNC,
498 };
499 int taskId = 0;
500 addTaskFromList(globalDispatcher, operationList, taskId);
501 globalDispatcher.executedTask();
502 Wait(taskId);
503 bool result = task_execution_sequence.size() > 1;
504 std::vector<size_t> outerTaskIndex;
505 std::vector<std::vector<size_t>> innerTaskIndex;
506 GetTaskIndex(outerTaskIndex, innerTaskIndex, taskId, 0);
507 for (auto index : outerTaskIndex) {
508 result = result && (index != std::string::npos);
509 }
510 TestUtils::PublishEvent(g_EVENT_RESP_FIRST_B, code, std::to_string(result));
511 }
512
MultiAppCase3(int code)513 void MainAbility::MultiAppCase3(int code)
514 {
515 APP_LOGI("-- -- -- -- -- --MainAbility::%{public}s", __FUNCTION__);
516 Reset();
517 auto context = GetContext();
518 TaskList globalDispatcher = TaskList {TestDispatcher::SERIAL, context, "serial"};
519 std::vector<TestOperation> operationList = {
520 TestOperation::ASYNC,
521 TestOperation::ASYNC,
522 TestOperation::ASYNC,
523 TestOperation::ASYNC,
524 TestOperation::ASYNC,
525 TestOperation::ASYNC,
526 TestOperation::ASYNC,
527 TestOperation::ASYNC,
528 TestOperation::ASYNC,
529 TestOperation::ASYNC,
530 };
531 int taskId = 0;
532 addTaskFromList(globalDispatcher, operationList, taskId);
533 globalDispatcher.executedTask();
534 Wait(taskId);
535 bool result = task_execution_sequence.size() > 1;
536 std::vector<size_t> outerTaskIndex;
537 std::vector<std::vector<size_t>> innerTaskIndex;
538 GetTaskIndex(outerTaskIndex, innerTaskIndex, taskId, 0);
539 for (auto index : outerTaskIndex) {
540 result = result && (index != std::string::npos);
541 }
542 TestUtils::PublishEvent(g_EVENT_RESP_FIRST_B, code, std::to_string(result));
543 }
544
MultiAppCase4(int code)545 void MainAbility::MultiAppCase4(int code)
546 {
547 APP_LOGI("-- -- -- -- -- --MainAbility::%{public}s", __FUNCTION__);
548 Reset();
549 auto context = GetContext();
550 TaskList globalDispatcher = TaskList {TestDispatcher::MAIN, context, "main"};
551 std::vector<TestOperation> operationList = {
552 TestOperation::ASYNC,
553 TestOperation::ASYNC,
554 TestOperation::ASYNC,
555 TestOperation::ASYNC,
556 TestOperation::ASYNC,
557 TestOperation::ASYNC,
558 TestOperation::ASYNC,
559 TestOperation::ASYNC,
560 TestOperation::ASYNC,
561 TestOperation::ASYNC,
562 };
563 int taskId = 0;
564 addTaskFromList(globalDispatcher, operationList, taskId);
565 globalDispatcher.executedTask();
566 Wait(taskId);
567 bool result = task_execution_sequence.size() > 1;
568 std::vector<size_t> outerTaskIndex;
569 std::vector<std::vector<size_t>> innerTaskIndex;
570 GetTaskIndex(outerTaskIndex, innerTaskIndex, taskId, 0);
571 for (auto index : outerTaskIndex) {
572 result = result && (index != std::string::npos);
573 }
574 TestUtils::PublishEvent(g_EVENT_RESP_FIRST_B, code, std::to_string(result));
575 }
576 REGISTER_AA(MainAbility)
577 } // namespace AppExecFwk
578 } // namespace OHOS
579