• 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 
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