• 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 "napi/native_api.h"
16 #include "hilog/log.h"
17 #include "ffrt/task.h"
18 #include "ffrt/type_def.h"
19 #include "ffrt/condition_variable.h"
20 #include "ffrt/mutex.h"
21 #include "ffrt/shared_mutex.h"
22 #include "ffrt/queue.h"
23 #include "ffrt/sleep.h"
24 #include "ffrt/loop.h"
25 #include "ffrt/timer.h"
26 #include <mutex>
27 #include <thread>
28 #include <string>
29 #include <unistd.h>
30 #include <pthread.h>
31 #include <sys/eventfd.h>
32 #define FAIL (-1)
33 #define SUCCESS 0
34 #define PARAM_100 100
35 
36 using namespace std;
37 using namespace std::chrono;
38 
39 const int ERR_CODE_1 = 1;
40 const int ERR_CODE_2 = 2;
41 const int ERR_CODE_3 = 3;
42 const int ERR_CODE_4 = 4;
43 const int ERR_CODE_5 = 5;
44 const int ERR_CODE_6 = 6;
45 const int ERR_CODE_7 = 7;
46 const int ERR_CODE_8 = 8;
47 const int ERR_CODE_9 = 9;
48 const uint64_t UNIT_STACK_SIZE = 2 * 1024 * 1024;
49 const uint64_t UNIT_TASK_DELAY = 200000;
50 const uint32_t TASK_SUBMIT_REF = 2;
51 const uint32_t TASK_RELEASE_REF = 3;
52 const uint32_t TASK_DELAY_TIME = 1000;
53 const int MULTIPLE_RADIO = 10;
54 const uint64_t PLUS_SLEEP_TIME = 200000;
55 const uint64_t FUNC_SIGNAL_SLEEP = 30000;
56 const uint64_t SLEEP_TIME = 2000;
57 const uint64_t UNIT_TASK_DELAY_500 = 500000;
58 const double COST_TIME = 0.5;
59 const uint64_t COST_TIME_200 = 200;
60 const uint64_t COST_TIME_300 = 300;
61 const uint64_t COST_TIME_500 = 500;
62 const uint64_t COST_TIME_600 = 600;
63 
OnePlusForTest(void * arg)64 void OnePlusForTest(void* arg)
65 {
66     (*static_cast<int*>(arg)) += 1;
67 }
68 
MultipleForTest(void * arg)69 void MultipleForTest(void* arg)
70 {
71     (*static_cast<int*>(arg)) *= MULTIPLE_RADIO;
72 }
73 
SubForTest(void * arg)74 void SubForTest(void* arg)
75 {
76     (*static_cast<int*>(arg)) -= 1;
77 }
78 
OnePlusSleepForTest(void * arg)79 void OnePlusSleepForTest(void* arg)
80 {
81     ffrt_usleep(PLUS_SLEEP_TIME);
82     (*static_cast<int*>(arg)) += 1;
83 }
84 
85 typedef struct {
86     ffrt_cond_t* cond;
87     int* a;
88     int* b;
89     ffrt_mutex_t* lock_;
90     int* dur;
91     int* ret;
92 } CvMutex;
93 
FuncWait1(void * arg)94 void FuncWait1(void* arg)
95 {
96     CvMutex* t = static_cast<CvMutex*>(arg);
97     int ret = ffrt_mutex_lock(t->lock_);
98     if (ret != ffrt_success) {
99         *t->ret = ERR_CODE_1;
100     }
101 
102     while (*t->a != 1) {
103         ret = ffrt_cond_wait(t->cond, t->lock_);
104         if (ret != ffrt_success) {
105             *t->ret = ERR_CODE_2;
106         }
107     }
108     *t->b += 1;
109     ret = ffrt_mutex_unlock(t->lock_);
110     if (ret != ffrt_success) {
111         *t->ret = ERR_CODE_3;
112     }
113 }
114 
FuncWait2(void * arg)115 void FuncWait2(void* arg)
116 {
117     CvMutex* t = static_cast<CvMutex*>(arg);
118     int ret = ffrt_mutex_lock(t->lock_);
119     if (ret != ffrt_success) {
120         *t->ret = ERR_CODE_1;
121     }
122 
123     while (*t->a != 1) {
124         ret = ffrt_cond_wait(t->cond, t->lock_);
125         if (ret != ffrt_success) {
126             *t->ret = ERR_CODE_2;
127         }
128     }
129     *t->b += 1;
130     ret = ffrt_mutex_unlock(t->lock_);
131     if (ret != ffrt_success) {
132         *t->ret = ERR_CODE_3;
133     }
134 }
135 
FuncWaitTimeout(void * arg)136 void FuncWaitTimeout(void* arg)
137 {
138     CvMutex* t = static_cast<CvMutex*>(arg);
139     int ret = ffrt_mutex_lock(t->lock_);
140     if (ret != ffrt_success) {
141         *t->ret = ERR_CODE_1;
142     }
143     timespec ts;
144     clock_gettime(CLOCK_MONOTONIC, &ts);
145     ts.tv_sec += ERR_CODE_2;
146 
147     ret = ffrt_cond_timedwait(t->cond, t->lock_, &ts);
148     *t->ret = ret;
149     if (ret == ffrt_success) {
150         *(t->a) *= ERR_CODE_3;
151     }
152     ret = ffrt_mutex_unlock(t->lock_);
153 }
154 
FuncSignal(void * arg)155 void FuncSignal(void* arg)
156 {
157     ffrt_usleep(FUNC_SIGNAL_SLEEP);
158     CvMutex* t = static_cast<CvMutex*>(arg);
159     int ret = ffrt_mutex_lock(t->lock_);
160     if (ret != ffrt_success) {
161         *t->ret = ERR_CODE_1;
162     }
163     *(t->a) = 1;
164     ret = ffrt_cond_signal(t->cond);
165     if (ret != ffrt_success) {
166         *t->ret = ERR_CODE_2;
167     }
168     ret = ffrt_mutex_unlock(t->lock_);
169     if (ret != ffrt_success) {
170         *t->ret = ERR_CODE_3;
171     }
172 }
173 
FuncBroadcast(void * arg)174 void FuncBroadcast(void* arg)
175 {
176     ffrt_usleep(100000);
177     CvMutex* t = static_cast<CvMutex*>(arg);
178     int ret = ffrt_mutex_lock(t->lock_);
179     if (ret != ffrt_success) {
180         *t->ret = ERR_CODE_1;
181     }
182     *(t->a) = 1;
183     ret = ffrt_cond_broadcast(t->cond);
184     if (ret != ffrt_success) {
185         *t->ret = ERR_CODE_2;
186     }
187     ret = ffrt_mutex_unlock(t->lock_);
188     if (ret != ffrt_success) {
189         *t->ret = ERR_CODE_3;
190     }
191 }
192 
FuncSignalApi(void * arg)193 void FuncSignalApi(void* arg)
194 {
195     ffrt_usleep(FUNC_SIGNAL_SLEEP);
196     CvMutex* t = static_cast<CvMutex*>(arg);
197     int ret = ffrt_mutex_lock(t->lock_);
198     if (ret != ffrt_success) {
199         *t->ret = ERR_CODE_1;
200     }
201     *(t->a) = 1;
202     ret = ffrt_cond_signal(nullptr);
203     if (ret != ffrt_error_inval) {
204         *t->ret = ERR_CODE_4;
205     }
206     ret = ffrt_cond_signal(t->cond);
207     if (ret != ffrt_success) {
208         *t->ret = ERR_CODE_2;
209     }
210     ret = ffrt_mutex_unlock(t->lock_);
211     if (ret != ffrt_success) {
212         *t->ret = ERR_CODE_3;
213     }
214 }
215 
FuncBroadcastApi(void * arg)216 void FuncBroadcastApi(void* arg)
217 {
218     ffrt_usleep(100000);
219     CvMutex* t = static_cast<CvMutex*>(arg);
220     int ret = ffrt_mutex_lock(t->lock_);
221     if (ret != ffrt_success) {
222         *t->ret = 1;
223     }
224     *(t->a) = 1;
225     ret = ffrt_cond_broadcast(nullptr);
226     if (ret != ffrt_error_inval) {
227         *t->ret = 4;
228     }
229     ret = ffrt_cond_broadcast(t->cond);
230     if (ret != ffrt_success) {
231         *t->ret = 2;
232     }
233     ret = ffrt_mutex_unlock(t->lock_);
234     if (ret != ffrt_success) {
235         *t->ret = 3;
236     }
237 }
238 
FuncWaitApi(void * arg)239 void FuncWaitApi(void* arg)
240 {
241     CvMutex* t = static_cast<CvMutex*>(arg);
242     int ret = ffrt_mutex_lock(t->lock_);
243     if (ret != ffrt_success) {
244         *t->ret = 1;
245     }
246 
247     ret = ffrt_cond_wait(nullptr, t->lock_);
248     if (ret != ffrt_error_inval) {
249         *t->ret = 4;
250     }
251     ret = ffrt_cond_wait(t->cond, nullptr);
252     if (ret != ffrt_error_inval) {
253         *t->ret = 5;
254     }
255     while (*t->a != 1) {
256         ret = ffrt_cond_wait(t->cond, t->lock_);
257     if (ret != ffrt_success) {
258         *t->ret = 2;
259     }
260     }
261     *t->b += 1;
262     ret = ffrt_mutex_unlock(t->lock_);
263     if (ret != ffrt_success) {
264         *t->ret = 3;
265     }
266 }
267 
FuncWaitTimeoutApi(void * arg)268 void FuncWaitTimeoutApi(void* arg)
269 {
270     CvMutex* t = static_cast<CvMutex*>(arg);
271     int ret = ffrt_mutex_lock(t->lock_);
272     if (ret != ffrt_success) {
273         *t->ret = 1;
274     }
275     timespec ts;
276     clock_gettime(CLOCK_MONOTONIC, &ts);
277     ts.tv_sec += *t->dur;
278 
279     ret = ffrt_cond_timedwait(nullptr, t->lock_, &ts);
280     if (ret != ffrt_error_inval) {
281         *t->ret = 4;
282     }
283     ret = ffrt_cond_timedwait(t->cond, nullptr, &ts);
284     if (ret != ffrt_error_inval) {
285         *t->ret = 5;
286     }
287     ret = ffrt_cond_timedwait(t->cond, t->lock_, nullptr);
288     if (ret != ffrt_error_inval) {
289         *t->ret = 6;
290     }
291     clock_gettime(CLOCK_MONOTONIC, &ts);
292     ts.tv_sec += *t->dur;
293     ret = ffrt_cond_timedwait(t->cond, t->lock_, &ts);
294     *t->ret = ret;
295     if (ret == ffrt_success) {
296         *(t->a) *= 10;
297     }
298     ret = ffrt_mutex_unlock(t->lock_);
299     if (ret != ffrt_success) {
300         *t->ret = 3;
301     }
302 }
303 
304 typedef struct {
305     ffrt_function_header_t header;
306     ffrt_function_t func;
307     ffrt_function_t after_func;
308     void* arg;
309 } CFunction;
310 
FfrtExecFunctionWrapper(void * t)311 static void FfrtExecFunctionWrapper(void* t)
312 {
313     CFunction* f = static_cast<CFunction*>(t);
314     if (f->func) {
315         f->func(f->arg);
316     }
317 }
318 
FfrtDestroyFunctionWrapper(void * t)319 static void FfrtDestroyFunctionWrapper(void* t)
320 {
321     CFunction* f = static_cast<CFunction*>(t);
322     if (f->after_func) {
323         f->after_func(f->arg);
324     }
325 }
326 
327 #define FFRT_STATIC_ASSERT(cond, msg) int x(int static_assertion_##msg[(cond) ? 1 : -1])
ffrt_create_function_wrapper(const ffrt_function_t func,const ffrt_function_t after_func,void * arg,ffrt_function_kind_t kind_t=ffrt_function_kind_general)328 static inline ffrt_function_header_t* ffrt_create_function_wrapper(const ffrt_function_t func,
329     const ffrt_function_t after_func, void* arg, ffrt_function_kind_t kind_t = ffrt_function_kind_general)
330 {
331     FFRT_STATIC_ASSERT(sizeof(CFunction) <= ffrt_auto_managed_function_storage_size,
332         size_of_function_must_be_less_than_ffrt_auto_managed_function_storage_size);
333     CFunction* f = static_cast<CFunction*>(ffrt_alloc_auto_managed_function_storage_base(kind_t));
334     f->header.exec = FfrtExecFunctionWrapper;
335     f->header.destroy = FfrtDestroyFunctionWrapper;
336     f->func = func;
337     f->after_func = after_func;
338     f->arg = arg;
339     return reinterpret_cast<ffrt_function_header_t*>(f);
340 }
341 
342 template<class T>
343 struct Function {
344     ffrt_function_header_t header;
345     T closure;
346 };
347 
348 template<class T>
ExecFunctionWrapper(void * t)349 void ExecFunctionWrapper(void* t)
350 {
351     auto f = reinterpret_cast<Function<std::decay_t<T>>*>(t);
352     f->closure();
353 }
354 
355 template<class T>
DestroyFunctionWrapper(void * t)356 void DestroyFunctionWrapper(void* t)
357 {
358     auto f = reinterpret_cast<Function<std::decay_t<T>>*>(t);
359     f->closure = nullptr;
360 }
361 
362 template<class T>
create_function_wrapper(T && func,ffrt_function_kind_t kind=ffrt_function_kind_general)363 static inline ffrt_function_header_t* create_function_wrapper(T&& func,
364     ffrt_function_kind_t kind = ffrt_function_kind_general)
365 {
366     using function_type = Function<std::decay_t<T>>;
367     auto p = ffrt_alloc_auto_managed_function_storage_base(kind);
368     auto f = new (p)function_type;
369     f->header.exec = ExecFunctionWrapper<T>;
370     f->header.destroy = DestroyFunctionWrapper<T>;
371     f->closure = std::forward<T>(func);
372     return reinterpret_cast<ffrt_function_header_t*>(f);
373 }
374 
ConditionVariableTest001(napi_env env,napi_callback_info info)375 static napi_value ConditionVariableTest001(napi_env env, napi_callback_info info)
376 {
377     int resultEnd = 0;
378     //验证ffrt_cond_signal唤醒一个wait功能是否正确
379     ffrt_cond_t cond;
380     int ret = ffrt_cond_init(&cond, nullptr);
381     if (ret != ffrt_success) {
382         resultEnd = 7;
383     }
384 
385     int a = 0;
386     int b = 0;
387     ffrt_mutex_t lock_;
388     CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
389     ret = ffrt_mutex_init(&lock_, nullptr);
390     if (ret != ffrt_success) {
391         resultEnd = 8;
392     }
393 
394     std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
395     ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
396     ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
397     std::function<void()>&& FfrtFunc2 = [&t]() { FuncSignal(static_cast<void*>(&t)); };
398     ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
399     ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
400     ffrt_wait();
401     if (*(t.b) != 1) {
402         resultEnd = 9;
403     }
404     if (t.ret != nullptr) {
405         resultEnd = *(t.ret);
406     }
407     ffrt_cond_destroy(&cond);
408     ffrt_mutex_destroy(&lock_);
409     napi_value flag = nullptr;
410     napi_create_double(env, resultEnd, &flag);
411     return flag;
412 }
413 
ConditionVariableTest002(napi_env env,napi_callback_info info)414 static napi_value ConditionVariableTest002(napi_env env, napi_callback_info info)
415 {
416     int resultEnd = 0;
417     // 验证ffrt_cond_broadcast唤醒一个wait功能是否正确
418     ffrt_cond_t cond;
419     int ret = ffrt_cond_init(&cond, nullptr);
420     if (ret != ffrt_success) {
421         resultEnd = 7;
422     }
423 
424     int a = 0;
425     int b = 0;
426     ffrt_mutex_t lock_;
427     CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
428     ret = ffrt_mutex_init(&lock_, nullptr);
429     if (ret != ffrt_success) {
430         resultEnd = 8;
431     }
432 
433     std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
434     ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
435     ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
436     std::function<void()>&& FfrtFunc3 = [&t]() { FuncBroadcast(static_cast<void*>(&t)); };
437     ffrt_function_header_t* ffrt_func3 = create_function_wrapper((FfrtFunc3));
438     ffrt_submit_base(ffrt_func3, nullptr, nullptr, nullptr);
439     ffrt_wait();
440     if (*(t.b) != 1) {
441         resultEnd = 9;
442     }
443     if (t.ret != nullptr) {
444         resultEnd = *(t.ret);
445     }
446     ffrt_cond_destroy(&cond);
447     ffrt_mutex_destroy(&lock_);
448     napi_value flag = nullptr;
449     napi_create_double(env, resultEnd, &flag);
450     return flag;
451 }
452 
ConditionVariableTest003(napi_env env,napi_callback_info info)453 static napi_value ConditionVariableTest003(napi_env env, napi_callback_info info)
454 {
455     int resultEnd = 0;
456     // 验证ffrt_cond_broadcast唤醒多个wait功能是否正确
457     ffrt_cond_t cond;
458     int ret = ffrt_cond_init(&cond, nullptr);
459     if (ret != ffrt_success) {
460         resultEnd = 7;
461     }
462 
463     int a = 0;
464     int b = 0;
465     ffrt_mutex_t lock_;
466     CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
467     ret = ffrt_mutex_init(&lock_, nullptr);
468     if (ret != ffrt_success) {
469         resultEnd = 8;
470     }
471 
472     std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
473     ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
474     ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
475     std::function<void()>&& FfrtFunc2 = [&t]() { FuncWait2(static_cast<void*>(&t)); };
476     ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
477     ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
478     std::function<void()>&& FfrtFunc3 = [&t]() { FuncBroadcast(static_cast<void*>(&t)); };
479     ffrt_function_header_t* ffrt_func3 = create_function_wrapper((FfrtFunc3));
480     ffrt_submit_base(ffrt_func3, nullptr, nullptr, nullptr);
481     ffrt_wait();
482     if (*(t.b) != 2) {
483         resultEnd = 9;
484     }
485     if (t.ret != nullptr) {
486         resultEnd = *(t.ret);
487     }
488     ffrt_cond_destroy(&cond);
489     ffrt_mutex_destroy(&lock_);
490     napi_value flag = nullptr;
491     napi_create_double(env, resultEnd, &flag);
492     return flag;
493 }
494 
ConditionVariableTest004(napi_env env,napi_callback_info info)495 static napi_value ConditionVariableTest004(napi_env env, napi_callback_info info)
496 {
497     int resultEnd = 0;
498     // 验证ffrt_cond_signal只能唤醒一个wait功能正确
499     ffrt_cond_t cond;
500     int ret = ffrt_cond_init(&cond, nullptr);
501     if (ret != ffrt_success) {
502         resultEnd = 7;
503     }
504 
505     int a = 0;
506     int b = 0;
507     ffrt_mutex_t lock_;
508     CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
509     ret = ffrt_mutex_init(&lock_, nullptr);
510     if (ret != ffrt_success) {
511         resultEnd = 8;
512     }
513 
514     std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
515     ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
516     ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
517     std::function<void()>&& FfrtFunc2 = [&t]() { FuncWait2(static_cast<void*>(&t)); };
518     ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
519     ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
520     std::function<void()>&& FfrtFunc3 = [&t]() { FuncSignal(static_cast<void*>(&t)); };
521     ffrt_function_header_t* ffrt_func3 = create_function_wrapper((FfrtFunc3));
522     ffrt_task_handle_t task3 = ffrt_submit_h_base(ffrt_func3, nullptr, nullptr, nullptr);
523     const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task3}};
524     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
525     ffrt_wait_deps(&wait);
526     ffrt_usleep(100000);
527     if (*(t.b) != 1) {
528         resultEnd = 10;
529     }
530 
531     ffrt_func3 = create_function_wrapper((FfrtFunc3));
532     ffrt_submit_base(ffrt_func3, nullptr, nullptr, nullptr);
533     ffrt_wait();
534     if (*(t.b) != 2) {
535         resultEnd = 9;
536     }
537     if (t.ret != nullptr) {
538         resultEnd = *(t.ret);
539     }
540 
541     ffrt_cond_destroy(&cond);
542     ffrt_mutex_destroy(&lock_);
543     ffrt_task_handle_destroy(task3);
544     napi_value flag = nullptr;
545     napi_create_double(env, resultEnd, &flag);
546     return flag;
547 }
548 
ConditionVariableApiTest001(napi_env env,napi_callback_info info)549 static napi_value ConditionVariableApiTest001(napi_env env, napi_callback_info info)
550 {
551     int resultEnd = 0;
552     //验证ffrt_cond_init接口异常参数
553     ffrt_cond_t cond;
554     int ret = ffrt_cond_init(nullptr, nullptr);
555     if (ret != ffrt_error_inval) {
556         resultEnd = 7;
557     }
558     ffrt_condattr_t attr;
559     ret = ffrt_cond_init(&cond, &attr);
560     if (ret != ffrt_success) {
561         resultEnd = 8;
562     }
563 
564     int a = 0;
565     int b = 0;
566     ffrt_mutex_t lock_;
567     CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
568     ret = ffrt_mutex_init(&lock_, nullptr);
569     if (ret != ffrt_success) {
570         resultEnd = 9;
571     }
572 
573     std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
574     ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
575     ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
576     std::function<void()>&& FfrtFunc2 = [&t]() { FuncSignal(static_cast<void*>(&t)); };
577     ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
578     ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
579     ffrt_wait();
580     if (*(t.b) != 1) {
581         resultEnd = 10;
582     }
583     if (t.ret != nullptr) {
584         resultEnd = *(t.ret);
585     }
586     ffrt_cond_destroy(&cond);
587     ffrt_mutex_destroy(&lock_);
588     napi_value flag = nullptr;
589     napi_create_double(env, resultEnd, &flag);
590     return flag;
591 }
592 
ConditionVariableApiTest002(napi_env env,napi_callback_info info)593 static napi_value ConditionVariableApiTest002(napi_env env, napi_callback_info info)
594 {
595     int resultEnd = 0;
596     //验证ffrt_cond_signal接口异常参数
597     ffrt_cond_t cond;
598     int ret = ffrt_cond_init(&cond, nullptr);
599     if (ret != ffrt_success) {
600         resultEnd = 7;
601     }
602 
603     int a = 0;
604     int b = 0;
605     ffrt_mutex_t lock_;
606     CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
607     ret = ffrt_mutex_init(&lock_, nullptr);
608     if (ret != ffrt_success) {
609         resultEnd = 8;
610     }
611 
612     std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
613     ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
614     ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
615     std::function<void()>&& FfrtFunc2 = [&t]() { FuncSignalApi(static_cast<void*>(&t)); };
616     ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
617     ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
618     ffrt_wait();
619     if (*(t.b) != 1) {
620         resultEnd = 10;
621     }
622     if (t.ret != nullptr) {
623         resultEnd = *(t.ret);
624     }
625     ffrt_cond_destroy(&cond);
626     ffrt_mutex_destroy(&lock_);
627     napi_value flag = nullptr;
628     napi_create_double(env, resultEnd, &flag);
629     return flag;
630 }
631 
ConditionVariableApiTest003(napi_env env,napi_callback_info info)632 static napi_value ConditionVariableApiTest003(napi_env env, napi_callback_info info)
633 {
634     int resultEnd = 0;
635     // 验证ffrt_cond_broadcast接口异常参数
636     ffrt_cond_t cond;
637     int ret = ffrt_cond_init(&cond, nullptr);
638     if (ret != ffrt_success) {
639         resultEnd = 7;
640     }
641 
642     int a = 0;
643     int b = 0;
644     ffrt_mutex_t lock_;
645     CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
646     ret = ffrt_mutex_init(&lock_, nullptr);
647     if (ret != ffrt_success) {
648         resultEnd = 8;
649     }
650 
651     std::function<void()>&& FfrtFunc1 = [&t]() { FuncWait1(static_cast<void*>(&t)); };
652     ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
653     ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
654     std::function<void()>&& FfrtFunc3 = [&t]() { FuncBroadcastApi(static_cast<void*>(&t)); };
655     ffrt_function_header_t* ffrt_func3 = create_function_wrapper((FfrtFunc3));
656     ffrt_submit_base(ffrt_func3, nullptr, nullptr, nullptr);
657     ffrt_wait();
658     if (*(t.b) != 1) {
659         resultEnd = 10;
660     }
661     if (t.ret != nullptr) {
662         resultEnd = *(t.ret);
663     }
664     ffrt_cond_destroy(&cond);
665     ffrt_mutex_destroy(&lock_);
666     napi_value flag = nullptr;
667     napi_create_double(env, resultEnd, &flag);
668     return flag;
669 }
670 
ConditionVariableApiTest004(napi_env env,napi_callback_info info)671 static napi_value ConditionVariableApiTest004(napi_env env, napi_callback_info info)
672 {
673     int resultEnd = 0;
674     //验证ffrt_cond_wait接口异常参数
675     ffrt_cond_t cond;
676     int ret = ffrt_cond_init(&cond, nullptr);
677     if (ret != ffrt_success) {
678         resultEnd = 7;
679     }
680 
681     int a = 0;
682     int b = 0;
683     ffrt_mutex_t lock_;
684     CvMutex t = {&cond, &a, &b, &lock_, nullptr, nullptr};
685     ret = ffrt_mutex_init(&lock_, nullptr);
686     if (ret != ffrt_success) {
687         resultEnd = 8;
688     }
689 
690     std::function<void()>&& FfrtFunc1 = [&t]() { FuncWaitApi(static_cast<void*>(&t)); };
691     ffrt_function_header_t* ffrt_func1 = create_function_wrapper((FfrtFunc1));
692     ffrt_submit_base(ffrt_func1, nullptr, nullptr, nullptr);
693     std::function<void()>&& FfrtFunc2 = [&t]() { FuncSignal(static_cast<void*>(&t)); };
694     ffrt_function_header_t* ffrt_func2 = create_function_wrapper((FfrtFunc2));
695     ffrt_submit_base(ffrt_func2, nullptr, nullptr, nullptr);
696     ffrt_wait();
697     if (*(t.b) != 1) {
698         resultEnd = 10;
699     }
700     if (t.ret != nullptr) {
701         resultEnd = *(t.ret);
702     }
703     ffrt_cond_destroy(&cond);
704     ffrt_mutex_destroy(&lock_);
705     napi_value flag = nullptr;
706     napi_create_double(env, resultEnd, &flag);
707     return flag;
708 }
709 
DelayCTest001(napi_env env,napi_callback_info info)710 static napi_value DelayCTest001(napi_env env, napi_callback_info info)
711 {
712     int result = 0;
713     // 验证delay的set和get c接口
714     int a = 0;
715     ffrt_task_attr_t task_attr;
716     (void)ffrt_task_attr_init(&task_attr);
717     ffrt_task_attr_set_delay(&task_attr, 5000);
718 
719     double t;
720     auto start = std::chrono::high_resolution_clock::now();
721     std::function<void()>&& OnePlusFunc = [&a]() { a += 1; };
722     ffrt_task_handle_t task = ffrt_submit_h_base(create_function_wrapper(OnePlusFunc), {}, {}, &task_attr);
723     const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
724     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
725     ffrt_wait_deps(&wait);
726     auto end = std::chrono::high_resolution_clock::now();
727     std::chrono::duration<double, std::micro> elapsed = end-start;
728     t = elapsed.count();
729     if (a != 1) {
730         result = 1;
731     }
732     if (t <= 5000 || t >= 20000) {
733         result = 2;
734     }
735 
736     uint64_t delay = ffrt_task_attr_get_delay(&task_attr);
737     if (delay != 5000) {
738         result = 3;
739     }
740     ffrt_task_attr_destroy(&task_attr);
741     ffrt_task_handle_destroy(task);
742     napi_value flag = nullptr;
743     napi_create_double(env, result, &flag);
744     return flag;
745 }
746 
FfrtYieldC0001(napi_env env,napi_callback_info info)747 static napi_value FfrtYieldC0001(napi_env env, napi_callback_info info)
748 {
749     int result = 0;
750     int x = 0;
751     pthread_mutex_t lock;
752     int ret = (pthread_mutex_init(&lock, nullptr));
753     if (ret != 0) {
754         result = 1;
755     }
756     std::function<void()>&& func1 = [&]() {
757         while (true) {
758             pthread_mutex_lock(&lock);
759             if (x == 1) {
760                 pthread_mutex_unlock(&lock);
761                 return;
762             } else {
763                 pthread_mutex_unlock(&lock);
764                 usleep(1000);
765                 ffrt_yield();
766             }
767         }
768     };
769     std::function<void()>&& func2 = [&]() {
770         pthread_mutex_lock(&lock);
771         x++;
772         pthread_mutex_unlock(&lock);
773     };
774     ffrt_task_handle_t task = ffrt_submit_h_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
775     for (int i = 0; i < 20; i++) {
776         ffrt_submit_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
777     }
778     ffrt_submit_base(create_function_wrapper(func2), nullptr, nullptr, nullptr);
779     const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
780     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
781     ffrt_wait_deps(&wait);
782     if (x != 1) {
783         result = 7;
784     }
785     ffrt_wait();
786     if (x != 1) {
787         result = 8;
788     }
789     ffrt_task_handle_destroy(task);
790     pthread_mutex_destroy(&lock);
791     napi_value flag = nullptr;
792     napi_create_double(env, result, &flag);
793     return flag;
794 }
795 
RecursiveMutexAbnormalParamTest001(napi_env env,napi_callback_info info)796 static napi_value RecursiveMutexAbnormalParamTest001(napi_env env, napi_callback_info info)
797 {
798     int result = 0;
799     int type = 0;
800     ffrt_mutexattr_t attr;
801     ffrt_mutex_t mtx;
802     int ret = ffrt_mutexattr_init(&attr);
803     if (ret != ffrt_success) {
804         result = ERR_CODE_1;
805     }
806     ret = ffrt_mutexattr_settype(&attr, ffrt_mutex_recursive);
807     if (ret != ffrt_success) {
808         result = ERR_CODE_2;
809     }
810     ret = ffrt_mutexattr_gettype(&attr, &type);
811     if (ret != ffrt_success) {
812         result = ERR_CODE_3;
813     }
814     ret = ffrt_mutex_init(&mtx, &attr);
815     if (ret != ffrt_success) {
816         result = ERR_CODE_4;
817     }
818     ret = ffrt_mutexattr_destroy(&attr);
819     if (ret != ffrt_success) {
820         result = ERR_CODE_5;
821     }
822     ret = ffrt_mutex_destroy(&mtx);
823     if (ret != ffrt_success) {
824         result = ERR_CODE_6;
825     }
826     napi_value flag = nullptr;
827     napi_create_double(env, result, &flag);
828     return flag;
829 }
830 
RecursiveMutexAbnormalInvalidParamTest001(napi_env env,napi_callback_info info)831 static napi_value RecursiveMutexAbnormalInvalidParamTest001(napi_env env, napi_callback_info info)
832 {
833     int result = 0;
834     ffrt_mutexattr_t attr;
835     int ret = ffrt_mutexattr_init(NULL);
836     if (ret != ffrt_error_inval) {
837         result = ERR_CODE_1;
838     }
839     ret = ffrt_mutexattr_settype(NULL, ffrt_mutex_recursive);
840     if (ret != ffrt_error_inval) {
841         result = ERR_CODE_2;
842     }
843     ret = ffrt_mutexattr_settype(&attr, -1);
844     if (ret != ffrt_error_inval) {
845         result = ERR_CODE_3;
846     }
847     ret = ffrt_mutexattr_gettype(NULL, NULL);
848     if (ret != ffrt_error_inval) {
849         result = ERR_CODE_4;
850     }
851     ret = ffrt_mutexattr_destroy(NULL);
852     if (ret != ffrt_error_inval) {
853         result = ERR_CODE_5;
854     }
855     napi_value flag = nullptr;
856     napi_create_double(env, result, &flag);
857     return flag;
858 }
859 
MutexAbnormalParamTest001(napi_env env,napi_callback_info info)860 static napi_value MutexAbnormalParamTest001(napi_env env, napi_callback_info info)
861 {
862     int result = 0;
863     ffrt_mutex_t mtx;
864     ffrt_mutexattr_t attr;
865     int ret = ffrt_mutex_init(NULL, &attr);
866     if (ret != ffrt_error_inval) {
867         result = 1;
868     }
869     ffrt_mutexattr_init(&attr);
870     ret = ffrt_mutex_init(&mtx, &attr);
871     if (ret != ffrt_success) {
872         result = 2;
873     }
874     ret = ffrt_mutex_init(&mtx, nullptr);
875     if (ret != ffrt_success) {
876         result = 3;
877     }
878     ret = ffrt_mutex_destroy(NULL);
879     if (ret != ffrt_error_inval) {
880         result = 4;
881     }
882     ret = ffrt_mutex_destroy(&mtx);
883     if (ret != ffrt_success) {
884         result = 5;
885     }
886     napi_value flag = nullptr;
887     napi_create_double(env, result, &flag);
888     return flag;
889 }
890 
MutexAbnormalParamTest002(napi_env env,napi_callback_info info)891 static napi_value MutexAbnormalParamTest002(napi_env env, napi_callback_info info)
892 {
893     int result = 0;
894     ffrt_mutex_t mtx;
895     int ret = ffrt_mutex_init(&mtx, nullptr);
896     if (ret != ffrt_success) {
897         result = 1;
898     }
899     std::function<void()>&& func = [&]() {
900         ret = ffrt_mutex_lock(NULL);
901         if (ret != ffrt_error_inval) {
902             result = 2;
903         }
904         ret = ffrt_mutex_lock(&mtx);
905         ret = ffrt_mutex_unlock(NULL);
906         if (ret != ffrt_error_inval) {
907             result = 3;
908         }
909         ret = ffrt_mutex_trylock(NULL);
910         if (ret != ffrt_error_inval) {
911             result = 4;
912         }
913         ret = ffrt_mutex_trylock(&mtx);   // 没抢到锁
914         if (ret != ffrt_error_busy) {
915             result = 5;
916         }
917         ret = ffrt_mutex_destroy(NULL);
918         if (ret != ffrt_error_inval) {
919             result = 6;
920         }
921         ret = ffrt_mutex_unlock(&mtx);
922         if (ret != ffrt_success) {
923             result = 7;
924         }
925     };
926     ffrt_submit_base(create_function_wrapper(func), nullptr, nullptr, nullptr);
927     ffrt_wait();
928     ret = ffrt_mutex_destroy(&mtx);
929     if (ret != ffrt_success) {
930         result = 8;
931     }
932     napi_value flag = nullptr;
933     napi_create_double(env, result, &flag);
934     return flag;
935 }
936 
MutexTest006(napi_env env,napi_callback_info info)937 static napi_value MutexTest006(napi_env env, napi_callback_info info)
938 {
939     int resultEnd = 0;
940     int x = 0;
941     ffrt_mutex_t lock;
942     int ret = ffrt_mutex_init(&lock, nullptr);
943     if (ret != ffrt_success) {
944         resultEnd = 1;
945     }
946     std::function<void()>&& func1 = [&]() {
947         ffrt_usleep(50 * 1000);
948         int res = ffrt_mutex_lock(&lock);
949         if (res != ffrt_success) {
950             resultEnd = 2;
951         }
952         x = x * 2;
953         res = ffrt_mutex_unlock(&lock);
954         if (res != ffrt_success) {
955             resultEnd = 3;
956         }
957     };
958     std::function<void()>&& func2 = [&]() {
959         int res = ffrt_mutex_lock(&lock);
960         if (res != ffrt_success) {
961             resultEnd = 4;
962         }
963         ffrt_usleep(100 * 1000);
964         x++;
965         res = ffrt_mutex_unlock(&lock);
966         if (res != ffrt_success) {
967             resultEnd = 5;
968         }
969     };
970     ffrt_submit_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
971     ffrt_submit_base(create_function_wrapper(func2), nullptr, nullptr, nullptr);
972     ffrt_wait();
973     if (x != 2) {
974         resultEnd = 6;
975     }
976     ffrt_mutex_destroy(&lock);
977     napi_value flag = nullptr;
978     napi_create_double(env, resultEnd, &flag);
979     return flag;
980 }
981 
MutexTest007(napi_env env,napi_callback_info info)982 static napi_value MutexTest007(napi_env env, napi_callback_info info)
983 {
984     int resultEnd = 0;
985     int x = 0;
986     ffrt_mutex_t lock;
987     int ret = ffrt_mutex_init(&lock, nullptr);
988     if (ret != ffrt_success) {
989         resultEnd = 1;
990     }
991     std::function<void()>&& func1 = [&]() {
992         ffrt_usleep(50 * 1000);
993         int res = ffrt_mutex_lock(&lock);
994         if (res != ffrt_success) {
995             resultEnd = 2;
996         }
997         x = x * 2;
998         res = ffrt_mutex_unlock(&lock);
999         if (res != ffrt_success) {
1000             resultEnd = 3;
1001         }
1002     };
1003     std::function<void()>&& func2 = [&]() {
1004         int res = ffrt_mutex_lock(&lock);
1005         if (res != ffrt_success) {
1006             resultEnd = 4;
1007         }
1008         x++;
1009         res = ffrt_mutex_unlock(&lock);
1010         if (res != ffrt_success) {
1011             resultEnd = 5;
1012         }
1013     };
1014     ffrt_submit_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
1015     ffrt_submit_base(create_function_wrapper(func2), nullptr, nullptr, nullptr);
1016     ffrt_wait();
1017     ffrt_mutex_destroy(&lock);
1018     napi_value flag = nullptr;
1019     napi_create_double(env, resultEnd, &flag);
1020     return flag;
1021 }
1022 
MutexTest008(napi_env env,napi_callback_info info)1023 static napi_value MutexTest008(napi_env env, napi_callback_info info)
1024 {
1025     int resultEnd = 0;
1026     int x = 0;
1027     int y = 0;
1028     ffrt_mutex_t lock;
1029     int ret = ffrt_mutex_init(&lock, nullptr);
1030     if (ret != ffrt_success) {
1031         resultEnd = 1;
1032     }
1033     std::function<void()>&& func1 = [&]() {
1034         usleep(30 * 1000);
1035         while (ffrt_mutex_trylock(&lock)) {
1036             y++;
1037             usleep(20 * 1000);
1038         }
1039         x = x * 2;
1040         int res = ffrt_mutex_unlock(&lock);
1041         if (res != ffrt_success) {
1042             resultEnd = 2;
1043         }
1044         return;
1045     };
1046     std::function<void()>&& func2 = [&]() {
1047         int res = ffrt_mutex_lock(&lock);
1048         if (res != ffrt_success) {
1049             resultEnd = 3;
1050         }
1051         usleep(100 * 1000);
1052         x++;
1053         res = ffrt_mutex_unlock(&lock);
1054         if (res != ffrt_success) {
1055             resultEnd = 4;
1056         }
1057     };
1058     ffrt_submit_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
1059     ffrt_submit_base(create_function_wrapper(func2), nullptr, nullptr, nullptr);
1060     ffrt_wait();
1061     if (x != 2) {
1062         resultEnd = 5;
1063     }
1064     if (y == 0) {
1065         resultEnd = 6;
1066     }
1067     ffrt_mutex_destroy(&lock);
1068     napi_value flag = nullptr;
1069     napi_create_double(env, resultEnd, &flag);
1070     return flag;
1071 }
1072 
SharedMutexTest001(napi_env env,napi_callback_info info)1073 static napi_value SharedMutexTest001(napi_env env, napi_callback_info info)
1074 {
1075     int resultEnd = 0;
1076     ffrt_rwlock_t rwlock;
1077     int x = 0;
1078     int ret = ffrt_rwlock_init(&rwlock, nullptr);
1079     if (ret != ffrt_success) {
1080         resultEnd = ERR_CODE_1;
1081     }
1082     OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "fun0 resultEnd is %{public}d", resultEnd);
1083 
1084     std::function<void()>&& func1 = [&]() {
1085         OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "fun1 start resultEnd is %{public}d", resultEnd);
1086         int res = ffrt_rwlock_wrlock(&rwlock);
1087         if (res != ffrt_success) {
1088             resultEnd = ERR_CODE_2;
1089         }
1090         usleep(MULTIPLE_RADIO * TASK_DELAY_TIME);
1091         x++;
1092         res = ffrt_rwlock_unlock(&rwlock);
1093         if (res != ffrt_success) {
1094             resultEnd = ERR_CODE_3;
1095         }
1096         OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "fun1 end resultEnd is %{public}d", resultEnd);
1097     };
1098 
1099     std::function<void()>&& func2 = [&]() {
1100         OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "fun2 start resultEnd is %{public}d", resultEnd);
1101         usleep(SLEEP_TIME);
1102         int res1 = ffrt_rwlock_rdlock(&rwlock);
1103         if (res1 != ffrt_success) {
1104             resultEnd = ERR_CODE_4;
1105         }
1106         res1 = ffrt_rwlock_unlock(&rwlock);
1107         if (res1 != ffrt_success) {
1108             resultEnd = ERR_CODE_5;
1109         }
1110         OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "fun2 end resultEnd is %{public}d", resultEnd);
1111     };
1112 
1113     std::function<void()>&& func3 = [&]() {
1114         OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "fun3 start resultEnd is %{public}d", resultEnd);
1115         usleep(SLEEP_TIME);
1116         int res2 = ffrt_rwlock_trywrlock(&rwlock);
1117         if (res2 == ffrt_success) {
1118             x++;
1119             ffrt_rwlock_unlock(&rwlock);
1120         }
1121     };
1122 
1123     std::function<void()>&& func4 = [&]() {
1124         OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "fun4 start resultEnd is %{public}d", resultEnd);
1125         usleep(SLEEP_TIME);
1126         int res3 = ffrt_rwlock_tryrdlock(&rwlock);
1127         if (res3 == ffrt_success) {
1128             ffrt_rwlock_unlock(&rwlock);
1129         }
1130     };
1131     ffrt_submit_base(create_function_wrapper(func1), nullptr, nullptr, nullptr);
1132     ffrt_submit_base(create_function_wrapper(func2), nullptr, nullptr, nullptr);
1133     ffrt_submit_base(create_function_wrapper(func3), nullptr, nullptr, nullptr);
1134     ffrt_submit_base(create_function_wrapper(func4), nullptr, nullptr, nullptr);
1135     ffrt_wait();
1136     ffrt_rwlock_destroy(&rwlock);
1137     if (x != 1) {
1138         resultEnd = ERR_CODE_6;
1139     }
1140     OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT SHARED_MUTEX", "wait after resultEnd is %{public}d", resultEnd);
1141     napi_value flag = nullptr;
1142     napi_create_double(env, resultEnd, &flag);
1143     return flag;
1144 }
1145 
QueueApiTest001(napi_env env,napi_callback_info info)1146 static napi_value QueueApiTest001(napi_env env, napi_callback_info info)
1147 {
1148     int result = 0;
1149     // ffrt_queue_create接口type为异常值
1150     ffrt_queue_attr_t queue_attr;
1151     (void)ffrt_queue_attr_init(&queue_attr);
1152     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_max, "test_queue", &queue_attr);
1153     if (queue_handle != nullptr) {
1154         result = 3;
1155     }
1156 
1157     // 销毁队列
1158     ffrt_queue_attr_destroy(&queue_attr);
1159     ffrt_queue_destroy(queue_handle);
1160     napi_value flag = nullptr;
1161     napi_create_double(env, result, &flag);
1162     return flag;
1163 }
1164 
QueueApiTest002(napi_env env,napi_callback_info info)1165 static napi_value QueueApiTest002(napi_env env, napi_callback_info info)
1166 {
1167     int result = 0;
1168     // ffrt_queue_create接口name为空
1169     ffrt_queue_attr_t queue_attr;
1170     (void)ffrt_queue_attr_init(&queue_attr);
1171     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, nullptr, &queue_attr);
1172     if (queue_handle == nullptr) {
1173         result = 3;
1174     }
1175 
1176     int a = 0;
1177     ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a,
1178         ffrt_function_kind_queue), nullptr);
1179 
1180     usleep(SLEEP_TIME);
1181     if (a != 1) {
1182         result = 1;
1183     }
1184 
1185     // 销毁队列
1186     ffrt_queue_attr_destroy(&queue_attr);
1187     ffrt_queue_destroy(queue_handle);
1188     napi_value flag = nullptr;
1189     napi_create_double(env, result, &flag);
1190     return flag;
1191 }
1192 
QueueApiTest003(napi_env env,napi_callback_info info)1193 static napi_value QueueApiTest003(napi_env env, napi_callback_info info)
1194 {
1195     int result = 0;
1196     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", nullptr);
1197     if (queue_handle == nullptr) {
1198         result = 3;
1199     }
1200     napi_value flag = nullptr;
1201     napi_create_double(env, result, &flag);
1202     return flag;
1203 }
1204 
QueueApiTest004(napi_env env,napi_callback_info info)1205 static napi_value QueueApiTest004(napi_env env, napi_callback_info info)
1206 {
1207     int result = 0;
1208     (void)ffrt_queue_attr_init(nullptr);
1209     napi_value flag = nullptr;
1210     napi_create_double(env, result, &flag);
1211     return flag;
1212 }
1213 
QueueApiTest005(napi_env env,napi_callback_info info)1214 static napi_value QueueApiTest005(napi_env env, napi_callback_info info)
1215 {
1216     int result = 0;
1217     // ffrt_queue_attr_destroy接口attr为异常值
1218     ffrt_queue_attr_t queue_attr;
1219     (void)ffrt_queue_attr_init(&queue_attr);
1220     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1221     if (queue_handle == nullptr) {
1222         result = 3;
1223     }
1224 
1225     int a = 0;
1226     ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle, ffrt_create_function_wrapper(OnePlusForTest,
1227         nullptr, &a, ffrt_function_kind_queue), nullptr);
1228     ffrt_queue_wait(handle);
1229     if (a != 1) {
1230         result = 1;
1231     }
1232     ffrt_task_handle_destroy(handle);
1233     // 销毁队列
1234     ffrt_queue_attr_destroy(nullptr);
1235     ffrt_queue_attr_destroy(&queue_attr);
1236     ffrt_queue_destroy(queue_handle);
1237     napi_value flag = nullptr;
1238     napi_create_double(env, result, &flag);
1239     return flag;
1240 }
1241 
QueueApiTest006(napi_env env,napi_callback_info info)1242 static napi_value QueueApiTest006(napi_env env, napi_callback_info info)
1243 {
1244     int result = 0;
1245     // ffrt_queue_attr_set_qos接口attr为异常值
1246     ffrt_queue_attr_t queue_attr;
1247     (void)ffrt_queue_attr_init(&queue_attr);
1248     ffrt_queue_attr_set_qos(nullptr, static_cast<ffrt_qos_t>(ffrt_qos_utility));
1249     ffrt_qos_t qos = ffrt_queue_attr_get_qos(&queue_attr);
1250     if (qos != static_cast<int>(ffrt_qos_default)) {
1251         result = 2;
1252     }
1253     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1254     if (queue_handle == nullptr) {
1255         result = 3;
1256     }
1257 
1258     int a = 0;
1259     ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle, ffrt_create_function_wrapper(OnePlusForTest,
1260         nullptr, &a, ffrt_function_kind_queue), nullptr);
1261     ffrt_queue_wait(handle);
1262     if (a != 1) {
1263         result = 1;
1264     }
1265     ffrt_task_handle_destroy(handle);
1266 
1267     // 销毁队列
1268     ffrt_queue_attr_destroy(&queue_attr);
1269     ffrt_queue_destroy(queue_handle);
1270     napi_value flag = nullptr;
1271     napi_create_double(env, result, &flag);
1272     return flag;
1273 }
1274 
QueueApiTest007(napi_env env,napi_callback_info info)1275 static napi_value QueueApiTest007(napi_env env, napi_callback_info info)
1276 {
1277     int result = 0;
1278     // ffrt_queue_attr_set_qos接口qos为异常值
1279     // 设置qos为-1
1280     ffrt_queue_attr_t queue_attr;
1281     ffrt_queue_t queue_handle;
1282     (void)ffrt_queue_attr_init(&queue_attr);
1283     ffrt_queue_attr_set_qos(&queue_attr, static_cast<ffrt_qos_t>(ffrt_qos_inherit));
1284     ffrt_qos_t ret = ffrt_queue_attr_get_qos(&queue_attr);
1285     if (ret != static_cast<int>(ffrt_qos_inherit)) {
1286         result = 1;
1287     }
1288     queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1289 
1290     int a = 0;
1291     ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
1292         ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1293 
1294     ffrt_queue_wait(handle);
1295     if (a != 1) {
1296         result = 2;
1297     }
1298 
1299     ffrt_task_handle_destroy(handle);
1300     ffrt_queue_destroy(queue_handle);
1301 
1302     // 设置qos为-2
1303     ffrt_queue_attr_set_qos(&queue_attr, static_cast<ffrt_qos_t>(-2));
1304     ret = ffrt_queue_attr_get_qos(&queue_attr);
1305     if (ret != static_cast<int>(ffrt_qos_inherit)) {
1306         result = 1;
1307     }
1308     queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1309 
1310     handle = ffrt_queue_submit_h(queue_handle,
1311         ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1312 
1313     ffrt_queue_wait(handle);
1314     if (a != 2) {
1315         result = 3;
1316     }
1317 
1318     ffrt_queue_attr_destroy(&queue_attr);
1319     ffrt_task_handle_destroy(handle);
1320     ffrt_queue_destroy(queue_handle);
1321     napi_value flag = nullptr;
1322     napi_create_double(env, result, &flag);
1323     return flag;
1324 }
1325 
QueueApiTest008(napi_env env,napi_callback_info info)1326 static napi_value QueueApiTest008(napi_env env, napi_callback_info info)
1327 {
1328     int result = 0;
1329     // ffrt_queue_attr_get_qos接口attr为异常值
1330     ffrt_queue_attr_t queue_attr;
1331     (void)ffrt_queue_attr_init(&queue_attr);
1332     ffrt_queue_attr_set_qos(&queue_attr, static_cast<ffrt_qos_t>(ffrt_qos_utility));
1333     ffrt_qos_t ret = ffrt_queue_attr_get_qos(nullptr);
1334     if (ret != static_cast<int>(ffrt_qos_default)) {
1335         result = 2;
1336     }
1337     ret = ffrt_queue_attr_get_qos(&queue_attr);
1338     if (ret != static_cast<int>(ffrt_qos_utility)) {
1339         result = 1;
1340     }
1341     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1342     if (queue_handle == nullptr) {
1343         result = 3;
1344     }
1345 
1346     int a = 0;
1347     ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle, ffrt_create_function_wrapper(OnePlusForTest,
1348         nullptr, &a, ffrt_function_kind_queue), nullptr);
1349     ffrt_queue_wait(handle);
1350     if (a != 1) {
1351         result = 1;
1352     }
1353     ffrt_task_handle_destroy(handle);
1354 
1355     // 销毁队列
1356     ffrt_queue_attr_destroy(&queue_attr);
1357     ffrt_queue_destroy(queue_handle);
1358     napi_value flag = nullptr;
1359     napi_create_double(env, result, &flag);
1360     return flag;
1361 }
1362 
QueueApiTest009(napi_env env,napi_callback_info info)1363 static napi_value QueueApiTest009(napi_env env, napi_callback_info info)
1364 {
1365     int result = 0;
1366     // ffrt_queue_destroy接口queue为异常值
1367     ffrt_queue_attr_t queue_attr;
1368     (void)ffrt_queue_attr_init(&queue_attr);
1369     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1370     if (queue_handle == nullptr) {
1371         result = 3;
1372     }
1373 
1374     int a = 0;
1375     ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle, ffrt_create_function_wrapper(OnePlusForTest,
1376         nullptr, &a, ffrt_function_kind_queue), nullptr);
1377     ffrt_queue_wait(handle);
1378     if (a != 1) {
1379         result = 1;
1380     }
1381     ffrt_task_handle_destroy(handle);
1382 
1383     // 销毁队列
1384     ffrt_queue_attr_destroy(&queue_attr);
1385     ffrt_queue_destroy(nullptr);
1386     ffrt_queue_destroy(queue_handle);
1387     napi_value flag = nullptr;
1388     napi_create_double(env, result, &flag);
1389     return flag;
1390 }
1391 
QueueApiTest010(napi_env env,napi_callback_info info)1392 static napi_value QueueApiTest010(napi_env env, napi_callback_info info)
1393 {
1394     int result = 0;
1395     // ffrt_queue_submit接口queue或f为异常值
1396     ffrt_queue_attr_t queue_attr;
1397     (void)ffrt_queue_attr_init(&queue_attr);
1398     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1399     if (queue_handle == nullptr) {
1400         result = 3;
1401     }
1402 
1403     int a = 0;
1404     ffrt_queue_submit(nullptr, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a,
1405         ffrt_function_kind_queue), nullptr);
1406     ffrt_queue_submit(queue_handle, nullptr, nullptr);
1407     ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle, ffrt_create_function_wrapper(OnePlusForTest,
1408         nullptr, &a, ffrt_function_kind_queue), nullptr);
1409     ffrt_queue_wait(handle);
1410     if (a != 1) {
1411         result = 1;
1412     }
1413     ffrt_task_handle_destroy(handle);
1414 
1415     // 销毁队列
1416     ffrt_queue_attr_destroy(&queue_attr);
1417     ffrt_queue_destroy(queue_handle);
1418     napi_value flag = nullptr;
1419     napi_create_double(env, result, &flag);
1420     return flag;
1421 }
1422 
QueueApiTest011(napi_env env,napi_callback_info info)1423 static napi_value QueueApiTest011(napi_env env, napi_callback_info info)
1424 {
1425     int result = 0;
1426     // ffrt_queue_submit_h接口queue或f为异常值
1427     ffrt_queue_attr_t queue_attr;
1428     (void)ffrt_queue_attr_init(&queue_attr);
1429     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1430     if (queue_handle == nullptr) {
1431         result = 3;
1432     }
1433 
1434     int a = 0;
1435     ffrt_task_handle_t handle = ffrt_queue_submit_h(nullptr,
1436         ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1437     if (handle != nullptr) {
1438         result = 1;
1439     }
1440     handle = ffrt_queue_submit_h(queue_handle, nullptr, nullptr);
1441     if (handle != nullptr) {
1442         result = 2;
1443     }
1444     handle = ffrt_queue_submit_h(queue_handle,
1445         ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1446 
1447     ffrt_queue_wait(handle);
1448     if (a != 1) {
1449         result = 1;
1450     }
1451 
1452     // 销毁队列
1453     ffrt_queue_attr_destroy(&queue_attr);
1454     ffrt_task_handle_destroy(handle);
1455     ffrt_queue_destroy(queue_handle);
1456     napi_value flag = nullptr;
1457     napi_create_double(env, result, &flag);
1458     return flag;
1459 }
1460 
QueueApiTest012(napi_env env,napi_callback_info info)1461 static napi_value QueueApiTest012(napi_env env, napi_callback_info info)
1462 {
1463     int result = 0;
1464     // ffrt_queue_wait接口handle为异常值
1465     ffrt_queue_attr_t queue_attr;
1466     (void)ffrt_queue_attr_init(&queue_attr);
1467     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1468     if (queue_handle == nullptr) {
1469         result = 3;
1470     }
1471 
1472     int a = 0;
1473     ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
1474         ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1475 
1476     ffrt_queue_wait(nullptr);
1477     ffrt_queue_wait(handle);
1478     if (a != 1) {
1479         result = 1;
1480     }
1481 
1482     // 销毁队列
1483     ffrt_queue_attr_destroy(&queue_attr);
1484     ffrt_task_handle_destroy(handle);
1485     ffrt_queue_destroy(queue_handle);
1486     napi_value flag = nullptr;
1487     napi_create_double(env, result, &flag);
1488     return flag;
1489 }
1490 
QueueApiTest013(napi_env env,napi_callback_info info)1491 static napi_value QueueApiTest013(napi_env env, napi_callback_info info)
1492 {
1493     int result = 0;
1494     // ffrt_queue_cancel接口handle为异常值
1495     ffrt_queue_attr_t queue_attr;
1496     (void)ffrt_queue_attr_init(&queue_attr);
1497     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1498 
1499     int a = 0;
1500     ffrt_task_attr_t task_attr;
1501     (void)ffrt_task_attr_init(&task_attr);
1502     ffrt_task_attr_set_delay(&task_attr, 1000000); // 设置任务1s后才执行
1503     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1504         ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), &task_attr);
1505 
1506     int ret = ffrt_queue_cancel(nullptr);
1507     if (ret != -1) {
1508         result = 1;
1509     }
1510     ret = ffrt_queue_cancel(task1);
1511     if (ret != 0) {
1512         result = 2;
1513     }
1514     if (a != 0) {
1515         result = 3;
1516     }
1517 
1518     ffrt_task_attr_destroy(&task_attr);
1519     ffrt_task_handle_destroy(task1);
1520 
1521     // 销毁队列
1522     ffrt_queue_attr_destroy(&queue_attr);
1523     ffrt_queue_destroy(queue_handle);
1524     if (a != 0) {
1525         result = 4;
1526     }
1527     napi_value flag = nullptr;
1528     napi_create_double(env, result, &flag);
1529     return flag;
1530 }
1531 
QueueCancelTest001(napi_env env,napi_callback_info info)1532 static napi_value QueueCancelTest001(napi_env env, napi_callback_info info)
1533 {
1534     int result = 0;
1535     // cancel一个delay的未执行task
1536     ffrt_queue_attr_t queue_attr;
1537     (void)ffrt_queue_attr_init(&queue_attr);
1538     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1539 
1540     int a = 0;
1541     ffrt_task_attr_t task_attr;
1542     (void)ffrt_task_attr_init(&task_attr);
1543     ffrt_task_attr_set_delay(&task_attr, 1000000); // 设置任务1s后才执行
1544     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1545         ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), &task_attr);
1546 
1547     int ret = ffrt_queue_cancel(task1);
1548     if (ret != 0) {
1549         result = 2;
1550     }
1551     if (a != 0) {
1552         result = 3;
1553     }
1554 
1555     ffrt_task_attr_destroy(&task_attr);
1556     ffrt_task_handle_destroy(task1);
1557 
1558     // 销毁队列
1559     ffrt_queue_attr_destroy(&queue_attr);
1560     ffrt_queue_destroy(queue_handle);
1561     if (a != 0) {
1562         result = 4;
1563     }
1564     napi_value flag = nullptr;
1565     napi_create_double(env, result, &flag);
1566     return flag;
1567 }
1568 
QueueCancelTest003(napi_env env,napi_callback_info info)1569 static napi_value QueueCancelTest003(napi_env env, napi_callback_info info)
1570 {
1571     int result = 0;
1572     // cancel一个执行中task,ffrt的sleep
1573     ffrt_queue_attr_t queue_attr;
1574     (void)ffrt_queue_attr_init(&queue_attr);
1575     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1576 
1577     int a = 0;
1578     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1579         ffrt_create_function_wrapper(OnePlusSleepForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1580 
1581     usleep(2000);
1582     int ret = ffrt_queue_cancel(task1);
1583     if (ret != 1) {
1584         result = 2;
1585     }
1586     if (a != 0) {
1587         result = 3;
1588     }
1589     ffrt_task_handle_destroy(task1);
1590     if (a != 0) {
1591         result = 4;
1592     }
1593 
1594     // 销毁队列
1595     ffrt_queue_attr_destroy(&queue_attr);
1596     ffrt_queue_destroy(queue_handle);
1597     if (a != 1) {
1598         result = 5;
1599     }
1600     napi_value flag = nullptr;
1601     napi_create_double(env, result, &flag);
1602     return flag;
1603 }
1604 
QueueCancelTest004(napi_env env,napi_callback_info info)1605 static napi_value QueueCancelTest004(napi_env env, napi_callback_info info)
1606 {
1607     int result = 0;
1608     // cancel一个已执行的task
1609     ffrt_queue_attr_t queue_attr;
1610     (void)ffrt_queue_attr_init(&queue_attr);
1611     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1612 
1613     int a = 0;
1614     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1615         ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1616     ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
1617         ffrt_create_function_wrapper(OnePlusSleepForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1618 
1619     ffrt_queue_wait(task1);
1620     int ret = ffrt_queue_cancel(task1);
1621     if (ret != 1) {
1622         result = 2;
1623     }
1624     if (a != 1) {
1625         result = 3;
1626     }
1627     ffrt_queue_wait(task2);
1628     if (a != 2) {
1629         result = 4;
1630     }
1631     ffrt_task_handle_destroy(task1);
1632     ffrt_task_handle_destroy(task2);
1633 
1634     // 销毁队列
1635     ffrt_queue_attr_destroy(&queue_attr);
1636     ffrt_queue_destroy(queue_handle);
1637     napi_value flag = nullptr;
1638     napi_create_double(env, result, &flag);
1639     return flag;
1640 }
1641 
QueueDelayTest001(napi_env env,napi_callback_info info)1642 static napi_value QueueDelayTest001(napi_env env, napi_callback_info info)
1643 {
1644     int resultEnd = 0;
1645     // 验证delay时间的正确性,先提交一个非延时task,再提交一个delay 5s的task,再提交一个delay 2s的task
1646     int result = 0;
1647     ffrt_task_attr_t task_attr1;
1648     ffrt_task_attr_t task_attr2;
1649     (void)ffrt_task_attr_init(&task_attr1);
1650     (void)ffrt_task_attr_init(&task_attr2);
1651     ffrt_task_attr_set_delay(&task_attr1, UNIT_TASK_DELAY_500);
1652     ffrt_task_attr_set_delay(&task_attr2, UNIT_TASK_DELAY);
1653 
1654     std::function<void()>&& MultipleFunc = [&result]() { MultipleForTest(static_cast<void*>(&result)); };
1655     ffrt_queue_attr_t queue_attr;
1656     (void)ffrt_queue_attr_init(&queue_attr);
1657     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1658     ffrt_queue_submit(queue_handle, create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), nullptr);
1659     double t;
1660     auto start = std::chrono::high_resolution_clock::now();
1661     std::function<void()>&& OnePlusFunc = [&result]() { OnePlusForTest(static_cast<void*>(&result)); };
1662     std::function<void()>&& OneSubFunc = [&result]() { SubForTest(static_cast<void*>(&result)); };
1663     ffrt_task_handle_t handle1 = ffrt_queue_submit_h(queue_handle,
1664         create_function_wrapper(OneSubFunc, ffrt_function_kind_queue), &task_attr1);
1665     ffrt_task_handle_t handle2 = ffrt_queue_submit_h(queue_handle,
1666         create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr2);
1667 
1668     ffrt_queue_wait(handle2);
1669     auto end = std::chrono::high_resolution_clock::now();
1670     std::chrono::duration<double, std::milli> elapsed = end-start;
1671     t = elapsed.count();
1672     if (result != 1) {
1673         resultEnd = 1;
1674     }
1675     if (t <= COST_TIME_200 || t >= COST_TIME_300) {
1676         resultEnd = 2;
1677     }
1678 
1679     ffrt_queue_wait(handle1);
1680     end = std::chrono::high_resolution_clock::now();
1681     elapsed = end-start;
1682     t = elapsed.count();
1683     if (result != 0) {
1684         resultEnd = 3;
1685     }
1686     if (t <= COST_TIME_500 || t >= COST_TIME_600) {
1687         resultEnd = 4;
1688     }
1689     ffrt_task_handle_destroy(handle1);
1690     ffrt_task_handle_destroy(handle2);
1691     ffrt_queue_attr_destroy(&queue_attr);
1692     ffrt_queue_destroy(queue_handle);
1693     napi_value flag = nullptr;
1694     napi_create_double(env, resultEnd, &flag);
1695     return flag;
1696 }
1697 
QueueDelayTest002(napi_env env,napi_callback_info info)1698 static napi_value QueueDelayTest002(napi_env env, napi_callback_info info)
1699 {
1700     int result = 0;
1701     // 验证delay时间的正确性,提交一个delay 5ms的task
1702     ffrt_queue_attr_t queue_attr;
1703     (void)ffrt_queue_attr_init(&queue_attr);
1704     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1705 
1706     int a = 0;
1707     ffrt_task_attr_t task_attr;
1708     (void)ffrt_task_attr_init(&task_attr);
1709     ffrt_task_attr_set_delay(&task_attr, 5000); // 设置任务5ms后才执行
1710 
1711     double t;
1712     auto start = std::chrono::high_resolution_clock::now();
1713     std::function<void()>&& OnePlusFunc = [&a]() { OnePlusForTest((void *)(&a)); };
1714     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1715         create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr);
1716     ffrt_queue_wait(task1);
1717     auto end = std::chrono::high_resolution_clock::now();
1718     std::chrono::duration<double, std::micro> elapsed = end-start;
1719     t = elapsed.count();
1720     if (a != 1) {
1721         result = 1;
1722     }
1723     if (t <= 5000 || t >= 10000) {
1724         result = 2;
1725     }
1726     uint64_t delay = ffrt_task_attr_get_delay(&task_attr);
1727     if (delay != 5000) {
1728         result = 3;
1729     }
1730     ffrt_task_attr_destroy(&task_attr);
1731     ffrt_task_handle_destroy(task1);
1732     ffrt_queue_attr_destroy(&queue_attr);
1733     ffrt_queue_destroy(queue_handle);
1734     napi_value flag = nullptr;
1735     napi_create_double(env, result, &flag);
1736     return flag;
1737 }
1738 
QueueDelayTest005(napi_env env,napi_callback_info info)1739 static napi_value QueueDelayTest005(napi_env env, napi_callback_info info)
1740 {
1741     int result = 0;
1742     // 等待delay任务时提交一个task可以快速调度
1743     ffrt_queue_attr_t queue_attr;
1744     (void)ffrt_queue_attr_init(&queue_attr);
1745     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1746 
1747     int a = 0;
1748     ffrt_task_attr_t task_attr;
1749     (void)ffrt_task_attr_init(&task_attr);
1750     ffrt_task_attr_set_delay(&task_attr, UNIT_TASK_DELAY_500);
1751     std::function<void()>&& MultipleFunc = [&a]() { MultipleForTest(static_cast<void*>(&a)); };
1752     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1753         create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), &task_attr);
1754 
1755     double t;
1756     auto start = std::chrono::high_resolution_clock::now();
1757     std::function<void()>&& OnePlusFunc = [&a]() { OnePlusForTest(static_cast<void*>(&a)); };
1758     ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
1759         create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), nullptr);
1760     ffrt_queue_wait(task2);
1761     auto end = std::chrono::high_resolution_clock::now();
1762     std::chrono::duration<double, std::milli> elapsed = end-start;
1763     t = elapsed.count();
1764     if (a != 1) {
1765         result = 1;
1766     }
1767     if (t >= COST_TIME) {
1768         result = 2;
1769     }
1770 
1771     ffrt_queue_wait(task1);
1772     if (a != 10) {
1773         result = 3;
1774     }
1775     uint64_t delay = ffrt_task_attr_get_delay(&task_attr);
1776     if (delay != UNIT_TASK_DELAY_500) {
1777         result = 4;
1778     }
1779     ffrt_task_attr_destroy(&task_attr);
1780     ffrt_task_handle_destroy(task1);
1781     ffrt_task_handle_destroy(task2);
1782 
1783     // 销毁队列
1784     ffrt_queue_attr_destroy(&queue_attr);
1785     ffrt_queue_destroy(queue_handle);
1786     napi_value flag = nullptr;
1787     napi_create_double(env, result, &flag);
1788     return flag;
1789 }
1790 
QueueDfxTest001(napi_env env,napi_callback_info info)1791 static napi_value QueueDfxTest001(napi_env env, napi_callback_info info)
1792 {
1793     int result = 0;
1794     // ffrt_queue_attr_set_timeout接口attr为异常值
1795     ffrt_queue_attr_t queue_attr;
1796     (void)ffrt_queue_attr_init(&queue_attr);
1797     ffrt_queue_attr_set_timeout(nullptr, 10000);
1798     uint64_t time = ffrt_queue_attr_get_timeout(&queue_attr);
1799     if (time != 0) {
1800         result = 1;
1801     }
1802     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1803     if (queue_handle == nullptr) {
1804         result = 2;
1805     }
1806     // 销毁队列
1807     ffrt_queue_attr_destroy(&queue_attr);
1808     ffrt_queue_destroy(queue_handle);
1809     napi_value flag = nullptr;
1810     napi_create_double(env, result, &flag);
1811     return flag;
1812 }
1813 
QueueDfxTest002(napi_env env,napi_callback_info info)1814 static napi_value QueueDfxTest002(napi_env env, napi_callback_info info)
1815 {
1816     int result = 0;
1817     // ffrt_queue_attr_get_timeout接口attr为异常值
1818     ffrt_queue_attr_t queue_attr;
1819     (void)ffrt_queue_attr_init(&queue_attr);
1820     ffrt_queue_attr_set_timeout(&queue_attr, 10000);
1821     uint64_t time = ffrt_queue_attr_get_timeout(nullptr);
1822     if (time != 0) {
1823         result = 1;
1824     }
1825     time = ffrt_queue_attr_get_timeout(&queue_attr);
1826     if (time != 10000) {
1827         result = 2;
1828     }
1829     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1830     if (queue_handle == nullptr) {
1831         result = 3;
1832     }
1833 
1834     // 销毁队列
1835     ffrt_queue_attr_destroy(&queue_attr);
1836     ffrt_queue_destroy(queue_handle);
1837     napi_value flag = nullptr;
1838     napi_create_double(env, result, &flag);
1839     return flag;
1840 }
1841 
QueueDfxTest003(napi_env env,napi_callback_info info)1842 static napi_value QueueDfxTest003(napi_env env, napi_callback_info info)
1843 {
1844     int result = 0;
1845     // ffrt_queue_attr_set_callback接口attr为异常值
1846     int end = 0;
1847     std::function<void()> cbOne = [&end]() {
1848         end++;
1849     };
1850     ffrt_queue_attr_t queue_attr;
1851     (void)ffrt_queue_attr_init(&queue_attr);
1852     ffrt_queue_attr_set_callback(nullptr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
1853     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1854     if (queue_handle == nullptr) {
1855         result = 3;
1856     }
1857 
1858     // 销毁队列
1859     ffrt_queue_attr_destroy(&queue_attr);
1860     ffrt_queue_destroy(queue_handle);
1861     napi_value flag = nullptr;
1862     napi_create_double(env, result, &flag);
1863     return flag;
1864 }
1865 
QueueDfxTest004(napi_env env,napi_callback_info info)1866 static napi_value QueueDfxTest004(napi_env env, napi_callback_info info)
1867 {
1868     int result = 0;
1869     int end = 0;
1870     std::function<void()> cbOne = [&end]() {
1871         end++;
1872     };
1873     ffrt_queue_attr_t queue_attr;
1874     (void)ffrt_queue_attr_init(&queue_attr);
1875     ffrt_queue_attr_set_callback(&queue_attr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
1876     ffrt_function_header_t* func = ffrt_queue_attr_get_callback(nullptr);
1877     if (func != nullptr) {
1878         result = 1;
1879     }
1880     func = ffrt_queue_attr_get_callback(&queue_attr);
1881     if (func == nullptr) {
1882         result = 2;
1883     }
1884     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1885     if (queue_handle == nullptr) {
1886         result = 3;
1887     }
1888 
1889     // 销毁队列
1890     ffrt_queue_destroy(queue_handle);
1891     ffrt_queue_attr_destroy(&queue_attr);
1892     napi_value flag = nullptr;
1893     napi_create_double(env, result, &flag);
1894     return flag;
1895 }
1896 
QueueDfxTest005(napi_env env,napi_callback_info info)1897 static napi_value QueueDfxTest005(napi_env env, napi_callback_info info)
1898 {
1899     int resultEnd = 0;
1900     int x = 0;
1901     int end = 0;
1902     std::function<void()> cbOne = [&end]() {
1903         end++;
1904     };
1905     ffrt_queue_attr_t queue_attr;
1906     (void)ffrt_queue_attr_init(&queue_attr);
1907     ffrt_queue_attr_set_timeout(&queue_attr, 10000);
1908     ffrt_queue_attr_set_callback(&queue_attr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
1909     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1910     std::function<void()>&& basicFunc1 = [&] {
1911         x++;
1912         usleep(500 * 1000);
1913     };
1914     ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
1915         create_function_wrapper(basicFunc1, ffrt_function_kind_queue), nullptr);
1916     ffrt_queue_wait(handle);
1917     if (x != 1) {
1918         resultEnd = 1;
1919     }
1920     if (end != 1) {
1921         resultEnd = 2;
1922     }
1923 
1924     std::function<void()>&& basicFunc2 = [&] {
1925         x++;
1926         ffrt_usleep(500 * 1000);
1927     };
1928     ffrt_task_handle_t handle1 = ffrt_queue_submit_h(queue_handle,
1929         create_function_wrapper(basicFunc2, ffrt_function_kind_queue), nullptr);
1930     ffrt_queue_wait(handle1);
1931     if (x != 2) {
1932         resultEnd = 3;
1933     }
1934     if (end != 2) {
1935         resultEnd = 4;
1936     }
1937 
1938     ffrt_task_handle_destroy(handle);
1939     ffrt_task_handle_destroy(handle1);
1940     ffrt_queue_attr_destroy(&queue_attr);
1941     ffrt_queue_destroy(queue_handle);
1942     napi_value flag = nullptr;
1943     napi_create_double(env, resultEnd, &flag);
1944     return flag;
1945 }
1946 
QueueDfxTest006(napi_env env,napi_callback_info info)1947 static napi_value QueueDfxTest006(napi_env env, napi_callback_info info)
1948 {
1949     int resultEnd = 0;
1950     int x = 0;
1951     int end = 0;
1952     std::function<void()> cbOne = [&end]() {
1953         end++;
1954     };
1955     ffrt_queue_attr_t queue_attr;
1956     (void)ffrt_queue_attr_init(&queue_attr);
1957     ffrt_queue_attr_set_timeout(&queue_attr, 10000);
1958     ffrt_queue_attr_set_callback(&queue_attr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
1959     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1960 
1961     ffrt_task_handle_t handle[5];
1962     std::function<void()>&& basicFunc = [&] {
1963             x++;
1964     };
1965     for (int i = 0; i < 5; ++i) {
1966         handle[i] = ffrt_queue_submit_h(queue_handle,
1967             create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
1968     }
1969     ffrt_queue_wait(handle[4]);
1970     if (x != 5) {
1971         resultEnd = 1;
1972     }
1973     if (end != 0) {
1974         resultEnd = 2;
1975     }
1976     for (int i = 0; i < 5; i++) {
1977         ffrt_task_handle_destroy(handle[i]);
1978     }
1979     ffrt_queue_attr_destroy(&queue_attr);
1980     ffrt_queue_destroy(queue_handle);
1981     napi_value flag = nullptr;
1982     napi_create_double(env, resultEnd, &flag);
1983     return flag;
1984 }
1985 
QueueTest001(napi_env env,napi_callback_info info)1986 static napi_value QueueTest001(napi_env env, napi_callback_info info)
1987 {
1988     ffrt_queue_attr_t queue_attr;
1989     (void)ffrt_queue_attr_init(&queue_attr);
1990     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1991     int result = 0;
1992     ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &result,
1993         ffrt_function_kind_queue), nullptr);
1994     ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(MultipleForTest, nullptr, &result,
1995         ffrt_function_kind_queue), nullptr);
1996     ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
1997         ffrt_create_function_wrapper(SubForTest, nullptr, &result, ffrt_function_kind_queue), nullptr);
1998     ffrt_queue_wait(handle);
1999     ffrt_task_handle_destroy(handle);
2000     napi_value flag = nullptr;
2001     napi_create_double(env, result, &flag);
2002     ffrt_queue_attr_destroy(&queue_attr);
2003     ffrt_queue_destroy(queue_handle);
2004     return flag;
2005 }
2006 
QueueTest002(napi_env env,napi_callback_info info)2007 static napi_value QueueTest002(napi_env env, napi_callback_info info)
2008 {
2009     const int maxNum = (int)ffrt_qos_user_initiated + 1;
2010     ffrt_queue_attr_t queue_attr[maxNum];
2011     ffrt_queue_t queue_handle[maxNum];
2012     for (int num = 0; num < maxNum; num++) {
2013         (void)ffrt_queue_attr_init(&queue_attr[num]);
2014         ffrt_queue_attr_set_qos(&queue_attr[num], num);
2015         queue_handle[num] = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr[num]);
2016     }
2017 
2018     int a = 0;
2019     int result[maxNum] = {0};
2020     ffrt_task_handle_t task[maxNum][10];
2021     for (int i = 0; i < 10; i++) {
2022         for (int num = 0; num < maxNum; num++) {
2023             task[num][i] = ffrt_queue_submit_h(queue_handle[num],
2024                 ffrt_create_function_wrapper(OnePlusForTest, NULL, &result[num], ffrt_function_kind_queue), nullptr);
2025         }
2026     }
2027     for (int num = 0; num < maxNum; num++) {
2028         ffrt_queue_wait(task[num][9]);
2029         OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT QUEUE", "result in queue %{public}d is %{public}d", num, result[num]);
2030         if (result[num] != 10) {
2031             a = 1;
2032         }
2033     }
2034     for (int i = 0; i < 10; i++) {
2035         for (int num = 0; num < maxNum; num++) {
2036             ffrt_task_handle_destroy(task[num][i]);
2037         }
2038     }
2039     for (int num = 0; num < maxNum; num++) {
2040         OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT QUEUE", "qos in queue task %{public}d is %{public}d", num,
2041             ffrt_queue_attr_get_qos(&queue_attr[num]));
2042         if (ffrt_queue_attr_get_qos(&queue_attr[num]) != num) {
2043             a = 1;
2044         }
2045         ffrt_queue_attr_destroy(&queue_attr[num]);
2046         ffrt_queue_destroy(queue_handle[num]);
2047     }
2048     napi_value flag = nullptr;
2049     napi_create_double(env, a, &flag);
2050     return flag;
2051 }
2052 
QueueTest003(napi_env env,napi_callback_info info)2053 static napi_value QueueTest003(napi_env env, napi_callback_info info)
2054 {
2055     int resultEnd = 0;
2056     // 创建多个相同qos队列,分别调度执行task
2057     ffrt_queue_attr_t queue_attr;
2058     (void)ffrt_queue_attr_init(&queue_attr);
2059     ffrt_queue_t queue_handle[10];
2060     for (int num = 0; num < 10; num++) {
2061         queue_handle[num] = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
2062     }
2063 
2064     int result[10] = {0};
2065     void *addr;
2066     ffrt_task_handle_t task[10][10];
2067     for (int i = 0; i < 10; i++) {
2068         for (int num = 0; num < 10; num++) {
2069             addr = static_cast<void *>(&result[num]);
2070             std::function<void()> basicFunc = [=]() { OnePlusForTest(addr); };
2071             task[num][i] = ffrt_queue_submit_h(queue_handle[num],
2072                 create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
2073         }
2074     }
2075     for (int num = 0; num < 10; num++) {
2076         ffrt_queue_wait(task[num][9]);
2077         if (result[num] != 10) {
2078             resultEnd = num + 1;
2079         }
2080     }
2081 
2082     for (int i = 0; i < 10; i++) {
2083         for (int num = 0; num < 10; num++) {
2084             ffrt_task_handle_destroy(task[num][i]);
2085         }
2086     }
2087 
2088     ffrt_queue_attr_destroy(&queue_attr);
2089     for (int num = 0; num < 10; num++) {
2090         ffrt_queue_destroy(queue_handle[num]);
2091     }
2092     napi_value flag = nullptr;
2093     napi_create_double(env, resultEnd, &flag);
2094     return flag;
2095 }
2096 
QueueWaitTest001(napi_env env,napi_callback_info info)2097 static napi_value QueueWaitTest001(napi_env env, napi_callback_info info)
2098 {
2099     int result = 0;
2100     // wait一个delay的未执行task
2101     ffrt_queue_attr_t queue_attr;
2102     (void)ffrt_queue_attr_init(&queue_attr);
2103     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
2104 
2105     int a = 0;
2106     ffrt_task_attr_t task_attr;
2107     (void)ffrt_task_attr_init(&task_attr);
2108     ffrt_task_attr_set_delay(&task_attr, UNIT_TASK_DELAY);
2109     std::function<void()>&& OnePlusFunc = [&a]() { OnePlusForTest(static_cast<void*>(&a)); };
2110     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
2111         create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr);
2112 
2113     ffrt_queue_wait(task1);
2114     if (a != 1) {
2115         result = 1;
2116     }
2117 
2118     ffrt_task_attr_destroy(&task_attr);
2119     ffrt_task_handle_destroy(task1);
2120 
2121     // 销毁队列
2122     ffrt_queue_attr_destroy(&queue_attr);
2123     ffrt_queue_destroy(queue_handle);
2124     napi_value flag = nullptr;
2125     napi_create_double(env, result, &flag);
2126     return flag;
2127 }
2128 
SubmitAbnormalTest(napi_env env,napi_callback_info info)2129 static napi_value SubmitAbnormalTest(napi_env env, napi_callback_info info)
2130 {
2131     int result = 0;
2132     int x = 0;
2133     std::function<void()>&& func = [&]() { x = x + 1;};
2134     const std::vector<ffrt_dependence_t> in_deps = {{ffrt_dependence_data, &x}};
2135     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
2136     const std::vector<ffrt_dependence_t> out_deps = {{ffrt_dependence_data, &x}};
2137     ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
2138     ffrt_function_header_t* ffrt_header_t = create_function_wrapper((func));
2139 
2140     ffrt_submit_base(nullptr, &in, &out, nullptr);
2141     ffrt_submit_h_base(nullptr, &in, &out, nullptr);
2142     ffrt_task_handle_destroy(nullptr);
2143     ffrt_submit_base(ffrt_header_t, &in, &out, nullptr);
2144     ffrt_wait();
2145     if (x != 1) {
2146         result = 1;
2147     }
2148     napi_value flag = nullptr;
2149     napi_create_double(env, result, &flag);
2150     return flag;
2151 }
2152 
SubmitBasicTest001(napi_env env,napi_callback_info info)2153 static napi_value SubmitBasicTest001(napi_env env, napi_callback_info info)
2154 {
2155     int result = 0;
2156     int x = 0;
2157     std::function<void()>&& func = [&]() { x = x + 1;};
2158     const std::vector<ffrt_dependence_t> in_deps = {{ffrt_dependence_data, &x}};
2159     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
2160     const std::vector<ffrt_dependence_t> out_deps = {{ffrt_dependence_data, &x}};
2161     ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
2162     ffrt_function_header_t* ffrt_header_t = create_function_wrapper((func));
2163     ffrt_submit_base(ffrt_header_t, &in, &out, nullptr);
2164     ffrt_wait();
2165     if (x != 1) {
2166         result = 1;
2167     }
2168     napi_value flag = nullptr;
2169     napi_create_double(env, result, &flag);
2170     return flag;
2171 }
2172 
SubmitBasicTest002(napi_env env,napi_callback_info info)2173 static napi_value SubmitBasicTest002(napi_env env, napi_callback_info info)
2174 {
2175     int result = 0;
2176     const uint32_t sleepTime = 5 * 1000;
2177     int a = 0;
2178     ffrt_task_attr_t attr;
2179     ffrt_task_attr_init(&attr);
2180     ffrt_submit_base(ffrt_create_function_wrapper(OnePlusForTest, NULL, &a), NULL, NULL, &attr);
2181     ffrt_wait();
2182     usleep(sleepTime);
2183     if (a != 1) {
2184         result = 3;
2185     }
2186     ffrt_task_attr_destroy(&attr);
2187     napi_value flag = nullptr;
2188     napi_create_double(env, result, &flag);
2189     return flag;
2190 }
2191 
SubmitInDependEmptyTest(napi_env env,napi_callback_info info)2192 static napi_value SubmitInDependEmptyTest(napi_env env, napi_callback_info info)
2193 {
2194     int result = 0;
2195     const uint32_t sleepTime = 10 * 1000;
2196     int x = 0;
2197     int y = 0;
2198     std::function<void()>&& basic1Func = [&]() {
2199         x = x + 1;
2200         usleep(sleepTime);
2201     };
2202     std::function<void()>&& basic2Func = [&]() {
2203         y = y + 1;
2204         usleep(sleepTime);
2205     };
2206     ffrt_task_attr_t attr1;
2207     ffrt_task_attr_init(&attr1);
2208     ffrt_task_attr_set_qos(&attr1, static_cast<int>(ffrt_qos_background));
2209     ffrt_task_attr_t attr2;
2210     ffrt_task_attr_init(&attr2);
2211     ffrt_task_attr_set_qos(&attr2, static_cast<int>(ffrt_qos_utility));
2212     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2213     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2214     const std::vector<ffrt_dependence_t> in1_deps = {};
2215     ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2216     const std::vector<ffrt_dependence_t> in2_deps = {};
2217     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2218     ffrt_submit_base(basic1Func_ht, &in1, nullptr, &attr1);
2219     ffrt_submit_base(basic2Func_ht, &in2, nullptr, &attr2);
2220     ffrt_wait();
2221     if (x != 1) {
2222         result = 1;
2223     }
2224     if (y != 1) {
2225         result = 2;
2226     }
2227     ffrt_task_attr_destroy(&attr1);
2228     ffrt_task_attr_destroy(&attr2);
2229     napi_value flag = nullptr;
2230     napi_create_double(env, result, &flag);
2231     return flag;
2232 }
2233 
SubmitInDependNullptrTest(napi_env env,napi_callback_info info)2234 static napi_value SubmitInDependNullptrTest(napi_env env, napi_callback_info info)
2235 {
2236     int result = 0;
2237     const uint32_t sleepTime = 10 * 1000;
2238     int x = 0;
2239     int y = 0;
2240     std::function<void()>&& basic1Func = [&]() {
2241         x = x + 1;
2242         usleep(sleepTime);
2243     };
2244     std::function<void()>&& basic2Func = [&]() {
2245         y = y + 1;
2246         usleep(sleepTime);
2247     };
2248     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2249     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2250     const std::vector<ffrt_dependence_t> in1_deps = {{ffrt_dependence_data, NULL}};
2251     ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2252     const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, NULL}};
2253     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2254     ffrt_submit_base(basic1Func_ht, &in1, nullptr, nullptr);
2255     ffrt_submit_base(basic2Func_ht, &in2, nullptr, nullptr);
2256     ffrt_wait();
2257     if (x != 1) {
2258         result = 1;
2259     }
2260     if (y != 1) {
2261         result = 2;
2262     }
2263     napi_value flag = nullptr;
2264     napi_create_double(env, result, &flag);
2265     return flag;
2266 }
2267 
SubmitOuDependEmptyTest(napi_env env,napi_callback_info info)2268 static napi_value SubmitOuDependEmptyTest(napi_env env, napi_callback_info info)
2269 {
2270     int result = 0;
2271     const uint32_t sleepTime = 10 * 1000;
2272     int x = 0;
2273     int y = 0;
2274     std::function<void()>&& basic1Func = [&]() {
2275         x = x + 1;
2276         usleep(sleepTime);
2277     };
2278     std::function<void()>&& basic2Func = [&]() {
2279         y = y + 1;
2280         usleep(sleepTime);
2281     };
2282     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2283     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2284     const std::vector<ffrt_dependence_t> in1_deps = {};
2285     ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2286     const std::vector<ffrt_dependence_t> in2_deps = {};
2287     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2288     const std::vector<ffrt_dependence_t> ou1_deps = {};
2289     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2290     const std::vector<ffrt_dependence_t> ou2_deps = {};
2291     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2292     ffrt_submit_base(basic1Func_ht, &in1, &ou1, nullptr);
2293     ffrt_submit_base(basic2Func_ht, &in2, &ou2, nullptr);
2294     ffrt_wait();
2295     if (x != 1) {
2296         result = 1;
2297     }
2298     if (y != 1) {
2299         result = 2;
2300     }
2301     napi_value flag = nullptr;
2302     napi_create_double(env, result, &flag);
2303     return flag;
2304 }
2305 
SubmitOuDependNullptrTest(napi_env env,napi_callback_info info)2306 static napi_value SubmitOuDependNullptrTest(napi_env env, napi_callback_info info)
2307 {
2308     int result = 0;
2309     const uint32_t sleepTime = 10 * 1000;
2310     int x = 0;
2311     int y = 0;
2312     std::function<void()>&& basic1Func = [&]() {
2313         x = x + 1;
2314         usleep(sleepTime);
2315         if (y != 0) {
2316             result = 1;
2317         }
2318     };
2319     std::function<void()>&& basic2Func = [&]() {
2320         y = y + 1;
2321         usleep(sleepTime);
2322         if (x != 1) {
2323             result = 2;
2324         }
2325     };
2326     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2327     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2328     const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, NULL}};
2329     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2330     const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, NULL}};
2331     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2332     ffrt_submit_base(basic1Func_ht, nullptr, &ou1, nullptr);
2333     ffrt_submit_base(basic2Func_ht, nullptr, &ou2, nullptr);
2334     ffrt_wait();
2335     if (x != 1) {
2336         result = 3;
2337     }
2338     if (y != 1) {
2339         result = 4;
2340     }
2341     napi_value flag = nullptr;
2342     napi_create_double(env, result, &flag);
2343     return flag;
2344 }
2345 
SubmitIODependTest001(napi_env env,napi_callback_info info)2346 static napi_value SubmitIODependTest001(napi_env env, napi_callback_info info)
2347 {
2348     int result = 0;
2349     int x = 0;
2350     int y = 0;
2351     int z = 0;
2352     std::function<void()>&& basic1Func = [&]() {
2353         ffrt_usleep(10 * 1000);
2354         x = x + 1;
2355     };
2356     std::function<void()>&& basic2Func = [&]() {
2357         ffrt_usleep(5 * 1000);
2358         y = y + 1;
2359     };
2360     std::function<void()>&& basic3Func = [&]() {
2361         z = x + y;
2362     };
2363     const std::vector<ffrt_dependence_t> in3_deps = {{ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2364     ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2365     const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}};
2366     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2367     const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &y}};
2368     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2369     const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &z}};
2370     ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2371     ffrt_submit_base(create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2372     ffrt_submit_base(create_function_wrapper(basic2Func), nullptr, &ou2, nullptr);
2373     ffrt_submit_base(create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2374     ffrt_wait();
2375     if (z != 2) {
2376         result = 1;
2377     }
2378     napi_value flag = nullptr;
2379     napi_create_double(env, result, &flag);
2380     return flag;
2381 }
2382 
SubmitIODependTest002(napi_env env,napi_callback_info info)2383 static napi_value SubmitIODependTest002(napi_env env, napi_callback_info info)
2384 {
2385     int result = 0;
2386     int x = 0;
2387     int y = 0;
2388     int z = 0;
2389     int t = 0;
2390     std::function<void()>&& basic1Func = [&]() {
2391         usleep(10 * 1000);
2392         x = x + 1;
2393         y = y + 1;
2394     };
2395     std::function<void()>&& basic2Func = [&]() {
2396         z = x * 5;
2397     };
2398     std::function<void()>&& basic3Func = [&]() {
2399         t = y * 10;
2400     };
2401     const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, &x}};
2402     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2403     const std::vector<ffrt_dependence_t> in3_deps = {{ffrt_dependence_data, &y}};
2404     ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2405     const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2406     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2407     const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &z}};
2408     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2409     const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &t}};
2410     ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2411     ffrt_submit_base(create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2412     ffrt_submit_base(create_function_wrapper(basic2Func), &in2, &ou2, nullptr);
2413     ffrt_submit_base(create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2414     ffrt_wait();
2415     if (z != 5) {
2416         result = 1;
2417     }
2418     if (t != 10) {
2419         result = 2;
2420     }
2421     napi_value flag = nullptr;
2422     napi_create_double(env, result, &flag);
2423     return flag;
2424 }
2425 
SubmitHIODependTest001(napi_env env,napi_callback_info info)2426 static napi_value SubmitHIODependTest001(napi_env env, napi_callback_info info)
2427 {
2428     int result = 0;
2429     int x = 0;
2430     int y = 0;
2431     int z = 0;
2432     std::function<void()>&& basic1Func = [&]() {
2433         ffrt_usleep(10 * 1000);
2434         x = x + 1;
2435     };
2436     std::function<void()>&& basic2Func = [&]() {
2437         ffrt_usleep(5 * 1000);
2438         y = y + 1;
2439     };
2440     std::function<void()>&& basic3Func = [&]() {
2441         z = x + y;
2442     };
2443     const std::vector<ffrt_dependence_t> in3_deps = {
2444         {ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2445     ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2446     const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}};
2447     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2448     const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &y}};
2449     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2450     const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &z}};
2451     ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2452     ffrt_task_handle_t task1 = ffrt_submit_h_base(
2453         create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2454     ffrt_task_handle_t task2 = ffrt_submit_h_base(
2455         create_function_wrapper(basic2Func), nullptr, &ou2, nullptr);
2456     ffrt_task_handle_t task3 = ffrt_submit_h_base(
2457         create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2458     const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task3}};
2459     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2460     ffrt_wait_deps(&wait);
2461     if (z != 2) {
2462         result = 1;
2463     }
2464     ffrt_task_handle_destroy(task1);
2465     ffrt_task_handle_destroy(task2);
2466     ffrt_task_handle_destroy(task3);
2467     napi_value flag = nullptr;
2468     napi_create_double(env, result, &flag);
2469     return flag;
2470 }
2471 
SubmitHIODependTest002(napi_env env,napi_callback_info info)2472 static napi_value SubmitHIODependTest002(napi_env env, napi_callback_info info)
2473 {
2474     int result = 0;
2475     int x = 0;
2476     int y = 0;
2477     int z = 0;
2478     int t = 0;
2479     std::function<void()>&& basic1Func = [&]() {
2480         usleep(10 * 1000);
2481         x = x + 1;
2482         y = y + 1;
2483     };
2484     std::function<void()>&& basic2Func = [&]() {
2485         z = x * 5;
2486     };
2487     std::function<void()>&& basic3Func = [&]() {
2488         t = y * 10;
2489     };
2490     const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, &x}};
2491     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2492     const std::vector<ffrt_dependence_t> in3_deps = {{ffrt_dependence_data, &y}};
2493     ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2494     const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2495     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2496     const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &z}};
2497     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2498     const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &t}};
2499     ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2500     ffrt_task_handle_t task1 = ffrt_submit_h_base(create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2501     ffrt_task_handle_t task2 = ffrt_submit_h_base(create_function_wrapper(basic2Func), &in2, &ou2, nullptr);
2502     ffrt_task_handle_t task3 = ffrt_submit_h_base(create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2503     const std::vector<ffrt_dependence_t> wait2_deps = {{ffrt_dependence_task, task2}};
2504     ffrt_deps_t wait2{static_cast<uint32_t>(wait2_deps.size()), wait2_deps.data()};
2505     ffrt_wait_deps(&wait2);
2506     if (z != 5) {
2507         result = 1;
2508     }
2509     const std::vector<ffrt_dependence_t> wait3_deps = {{ffrt_dependence_task, task3}};
2510     ffrt_deps_t wait3{static_cast<uint32_t>(wait3_deps.size()), wait3_deps.data()};
2511     ffrt_wait_deps(&wait3);
2512     if (t != 10) {
2513         result = 2;
2514     }
2515     ffrt_task_handle_destroy(task1);
2516     ffrt_task_handle_destroy(task2);
2517     ffrt_task_handle_destroy(task3);
2518     napi_value flag = nullptr;
2519     napi_create_double(env, result, &flag);
2520     return flag;
2521 }
2522 
SubmitIn0Ou0WaitNullTask1Test(napi_env env,napi_callback_info info)2523 static napi_value SubmitIn0Ou0WaitNullTask1Test(napi_env env, napi_callback_info info)
2524 {
2525     int result = 0;
2526     const uint32_t sleepTime = 30 * 1000;
2527     int x = 0;
2528     ffrt_task_attr_t attr;
2529     ffrt_task_attr_init(&attr);
2530     std::function<void()>&& basicFunc = [&]() {
2531         if (x != 0) {
2532             result = 1;
2533         }
2534         usleep(sleepTime);
2535         x = x + 1;
2536     };
2537     ffrt_function_header_t* basicFunc_ht = create_function_wrapper((basicFunc));
2538     const std::vector<ffrt_dependence_t> in_deps = {};
2539     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
2540     const std::vector<ffrt_dependence_t> ou_deps = {};
2541     ffrt_deps_t ou{static_cast<uint32_t>(ou_deps.size()), ou_deps.data()};
2542     const std::vector<ffrt_dependence_t> wait_deps = {};
2543     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2544     const ffrt_deps_t *wait_null = nullptr;
2545     ffrt_submit_base(basicFunc_ht, &in, &ou, &attr);
2546     if (x != 0) {
2547         result = 2;
2548     }
2549     ffrt_wait_deps(wait_null);
2550     if (x != 0) {
2551         result = 3;
2552     }
2553     ffrt_wait_deps(&wait);
2554     if (x != 0) {
2555         result = 4;
2556     }
2557     ffrt_wait();
2558     if (x != 1) {
2559         result = 5;
2560     }
2561     ffrt_task_attr_destroy(&attr);
2562     napi_value flag = nullptr;
2563     napi_create_double(env, result, &flag);
2564     return flag;
2565 }
2566 
SubmitHBasicTest001(napi_env env,napi_callback_info info)2567 static napi_value SubmitHBasicTest001(napi_env env, napi_callback_info info)
2568 {
2569     int result = 0;
2570     int x = 0;
2571     std::function<void()>&& func = [&]() { x = x + 1;};
2572     const std::vector<ffrt_dependence_t> in_deps = {{ffrt_dependence_data, &x}};
2573     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
2574     const std::vector<ffrt_dependence_t> out_deps = {{ffrt_dependence_data, &x}};
2575     ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
2576     ffrt_function_header_t* ffrt_header_t = create_function_wrapper((func));
2577     ffrt_task_handle_t task = ffrt_submit_h_base(ffrt_header_t, &in, &out, nullptr);
2578     const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_data, &x}};
2579     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2580     ffrt_wait_deps(&wait);
2581     if (x != 1) {
2582         result = 1;
2583     }
2584     ffrt_task_handle_destroy(task);
2585     napi_value flag = nullptr;
2586     napi_create_double(env, result, &flag);
2587     return flag;
2588 }
2589 
SubmitHBasicTest002(napi_env env,napi_callback_info info)2590 static napi_value SubmitHBasicTest002(napi_env env, napi_callback_info info)
2591 {
2592     int result = 0;
2593     const uint32_t sleepTime = 5 * 1000;
2594     int a = 0;
2595     ffrt_task_attr_t attr;
2596     ffrt_task_attr_init(&attr);
2597     ffrt_task_handle_t task = ffrt_submit_h_base(
2598         ffrt_create_function_wrapper(OnePlusForTest, NULL, &a), NULL, NULL, &attr);
2599     const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
2600     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2601     ffrt_wait_deps(&wait);
2602     usleep(sleepTime);
2603     if (a != 1) {
2604         result = 3;
2605     }
2606     ffrt_task_attr_destroy(&attr);
2607     ffrt_task_handle_destroy(task);
2608     napi_value flag = nullptr;
2609     napi_create_double(env, result, &flag);
2610     return flag;
2611 }
2612 
SubmitHInDependEmptyTest(napi_env env,napi_callback_info info)2613 static napi_value SubmitHInDependEmptyTest(napi_env env, napi_callback_info info)
2614 {
2615     int result = 0;
2616     const uint32_t sleepTime = 10 * 1000;
2617     int x = 0;
2618     int y = 0;
2619     std::function<void()>&& basic1Func = [&]() {
2620         x = x + 1;
2621         usleep(sleepTime);
2622     };
2623     std::function<void()>&& basic2Func = [&]() {
2624         y = y + 1;
2625         usleep(sleepTime);
2626     };
2627     ffrt_task_attr_t attr1;
2628     ffrt_task_attr_init(&attr1);
2629     ffrt_task_attr_set_qos(&attr1, static_cast<int>(ffrt_qos_background));
2630     ffrt_task_attr_t attr2;
2631     ffrt_task_attr_init(&attr2);
2632     ffrt_task_attr_set_qos(&attr2, static_cast<int>(ffrt_qos_utility));
2633     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2634     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2635     const std::vector<ffrt_dependence_t> in1_deps = {};
2636     ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2637     const std::vector<ffrt_dependence_t> in2_deps = {};
2638     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2639     ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, &in1, nullptr, &attr1);
2640     ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, &in2, nullptr, &attr2);
2641     const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2642     ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2643     const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2644     ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2645     ffrt_wait_deps(&wait1);
2646     if (x != 1) {
2647         result = 1;
2648     }
2649     ffrt_wait_deps(&wait2);
2650     if (y != 1) {
2651         result = 2;
2652     }
2653     ffrt_task_attr_destroy(&attr1);
2654     ffrt_task_attr_destroy(&attr2);
2655     ffrt_task_handle_destroy(task1);
2656     ffrt_task_handle_destroy(task2);
2657     napi_value flag = nullptr;
2658     napi_create_double(env, result, &flag);
2659     return flag;
2660 }
2661 
SubmitHInDependNullptrTest(napi_env env,napi_callback_info info)2662 static napi_value SubmitHInDependNullptrTest(napi_env env, napi_callback_info info)
2663 {
2664     int result = 0;
2665     const uint32_t sleepTime = 10 * 1000;
2666     int x = 0;
2667     int y = 0;
2668     std::function<void()>&& basic1Func = [&]() {
2669         x = x + 1;
2670         usleep(sleepTime);
2671     };
2672     std::function<void()>&& basic2Func = [&]() {
2673         y = y + 1;
2674         usleep(sleepTime);
2675     };
2676     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2677     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2678     const std::vector<ffrt_dependence_t> in1_deps = {{ffrt_dependence_data, NULL}};
2679     ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2680     const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, NULL}};
2681     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2682     ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, &in1, nullptr, nullptr);
2683     ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, &in2, nullptr, nullptr);
2684     const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2685     ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2686     const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2687     ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2688     ffrt_wait_deps(&wait1);
2689     if (x != 1) {
2690         result = 1;
2691     }
2692     ffrt_wait_deps(&wait2);
2693     if (y != 1) {
2694         result = 2;
2695     }
2696     ffrt_task_handle_destroy(task1);
2697     ffrt_task_handle_destroy(task2);
2698     napi_value flag = nullptr;
2699     napi_create_double(env, result, &flag);
2700     return flag;
2701 }
2702 
SubmitHOuDependEmptyTest(napi_env env,napi_callback_info info)2703 static napi_value SubmitHOuDependEmptyTest(napi_env env, napi_callback_info info)
2704 {
2705     int result = 0;
2706     const uint32_t sleepTime = 10 * 1000;
2707     int x = 0;
2708     int y = 0;
2709     std::function<void()>&& basic1Func = [&]() {
2710         x = x + 1;
2711         usleep(sleepTime);
2712     };
2713     std::function<void()>&& basic2Func = [&]() {
2714         y = y + 1;
2715         usleep(sleepTime);
2716     };
2717     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2718     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2719     const std::vector<ffrt_dependence_t> in1_deps = {};
2720     ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2721     const std::vector<ffrt_dependence_t> in2_deps = {};
2722     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2723     const std::vector<ffrt_dependence_t> ou1_deps = {};
2724     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2725     const std::vector<ffrt_dependence_t> ou2_deps = {};
2726     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2727     ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, &in1, &ou1, nullptr);
2728     ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, &in2, &ou2, nullptr);
2729     const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2730     ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2731     const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2732     ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2733     ffrt_wait_deps(&wait1);
2734     if (x != 1) {
2735         result = 1;
2736     }
2737     ffrt_wait_deps(&wait2);
2738     if (y != 1) {
2739         result = 2;
2740     }
2741     ffrt_task_handle_destroy(task1);
2742     ffrt_task_handle_destroy(task2);
2743     napi_value flag = nullptr;
2744     napi_create_double(env, result, &flag);
2745     return flag;
2746 }
2747 
SubmitHOuDependNullptrTest(napi_env env,napi_callback_info info)2748 static napi_value SubmitHOuDependNullptrTest(napi_env env, napi_callback_info info)
2749 {
2750     int result = 0;
2751     const uint32_t sleepTime = 10 * 1000;
2752     int x = 0;
2753     int y = 0;
2754     std::function<void()>&& basic1Func = [&]() {
2755         x = x + 1;
2756         usleep(sleepTime);
2757         if (y != 0) {
2758             result = 1;
2759         }
2760     };
2761     std::function<void()>&& basic2Func = [&]() {
2762         y = y + 1;
2763         usleep(sleepTime);
2764         if (x != 1) {
2765             result = 2;
2766         }
2767     };
2768     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2769     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2770     const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, NULL}};
2771     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2772     const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, NULL}};
2773     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2774     ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, nullptr, &ou1, nullptr);
2775     ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, nullptr, &ou2, nullptr);
2776     const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2777     ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2778     const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2779     ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2780     ffrt_wait_deps(&wait1);
2781     if (x != 1) {
2782         result = 3;
2783     }
2784     ffrt_wait_deps(&wait2);
2785     if (y != 1) {
2786         result = 4;
2787     }
2788     ffrt_task_handle_destroy(task1);
2789     ffrt_task_handle_destroy(task2);
2790     napi_value flag = nullptr;
2791     napi_create_double(env, result, &flag);
2792     return flag;
2793 }
2794 
2795 
SleepForTest000(napi_env env,napi_callback_info info)2796 static napi_value SleepForTest000(napi_env env, napi_callback_info info)
2797 {
2798     int resultEnd = 0;
2799     // sleep 1ms,验证sleep时间的正确性
2800     double t;
2801     std::function<void()>&& func = [&]() {
2802         auto start = std::chrono::high_resolution_clock::now();
2803         ffrt_usleep(0);
2804         auto end = std::chrono::high_resolution_clock::now();
2805         std::chrono::duration<double, std::milli> elapsed = end-start;
2806         t = elapsed.count();
2807     };
2808     ffrt_submit_base(create_function_wrapper(func), nullptr, nullptr, nullptr);
2809     ffrt_wait();
2810     if (t <= 0 || t > 10) {
2811         resultEnd = 1;
2812     }
2813     napi_value flag = nullptr;
2814     napi_create_double(env, resultEnd, &flag);
2815     return flag;
2816 }
2817 
SleepForTest001(napi_env env,napi_callback_info info)2818 static napi_value SleepForTest001(napi_env env, napi_callback_info info)
2819 {
2820     int resultEnd = 0;
2821     // sleep 1ms,验证sleep时间的正确性
2822     double t;
2823     std::function<void()>&& func = [&]() {
2824         auto start = std::chrono::high_resolution_clock::now();
2825         ffrt_usleep(1000);
2826         auto end = std::chrono::high_resolution_clock::now();
2827         std::chrono::duration<double, std::milli> elapsed = end-start;
2828         t = elapsed.count();
2829     };
2830     ffrt_submit_base(create_function_wrapper(func), nullptr, nullptr, nullptr);
2831     ffrt_wait();
2832     if (t <= 1 || t > 10) {
2833         resultEnd = 1;
2834     }
2835     napi_value flag = nullptr;
2836     napi_create_double(env, resultEnd, &flag);
2837     return flag;
2838 }
2839 
TaskAttrAbnormalTest(napi_env env,napi_callback_info info)2840 static napi_value TaskAttrAbnormalTest(napi_env env, napi_callback_info info)
2841 {
2842     int result = 0;
2843     ffrt_task_attr_t attr;
2844     int ret = ffrt_task_attr_init(nullptr);
2845     if (ret != -1) {
2846         result = 1;
2847     }
2848     ret = ffrt_task_attr_init(&attr);
2849     ffrt_task_attr_set_qos(nullptr, static_cast<int>(ffrt_qos_default));
2850     ffrt_task_attr_set_name(nullptr, nullptr);
2851     ffrt_task_attr_set_delay(nullptr, 0);
2852     ffrt_qos_t ffrt_qos = ffrt_task_attr_get_qos(nullptr);
2853     if (ffrt_qos != ffrt_qos_default) {
2854         result = 2;
2855     }
2856     const char* name = ffrt_task_attr_get_name(nullptr);
2857     if (name != nullptr) {
2858         result = 3;
2859     }
2860     uint64_t delay = ffrt_task_attr_get_delay(nullptr);
2861     if (delay != 0) {
2862         result = 4;
2863     }
2864     ffrt_task_attr_destroy(nullptr);
2865     ffrt_task_attr_destroy(&attr);
2866     napi_value flag = nullptr;
2867     napi_create_double(env, result, &flag);
2868     return flag;
2869 }
2870 
TaskAttrQosIllegalTest(napi_env env,napi_callback_info info)2871 static napi_value TaskAttrQosIllegalTest(napi_env env, napi_callback_info info)
2872 {
2873     int result = 0;
2874     ffrt_task_attr_t attr;
2875     ffrt_task_attr_init(&attr);
2876     int minVal = static_cast<int>(ffrt_qos_inherit) - 1;
2877     ffrt_task_attr_set_qos(&attr, minVal);
2878     int queryVal = int(ffrt_task_attr_get_qos(&attr));
2879     if (queryVal != -1) {
2880         result = 1;
2881     }
2882     ffrt_task_attr_destroy(&attr);
2883     napi_value flag = nullptr;
2884     napi_create_double(env, result, &flag);
2885     return flag;
2886 }
2887 
TaskAttrQosQueryTest(napi_env env,napi_callback_info info)2888 static napi_value TaskAttrQosQueryTest(napi_env env, napi_callback_info info)
2889 {
2890     int result = 0;
2891     ffrt_task_attr_t attr;
2892     ffrt_task_attr_get_qos(&attr);
2893     int ret = ffrt_task_attr_init(&attr);
2894     if (ret != 0) {
2895         result = 1;
2896     }
2897     int qosVal = ffrt_task_attr_get_qos(&attr);
2898     if (qosVal != ffrt_qos_default) {
2899         result = 2;
2900     }
2901     ffrt_task_attr_destroy(&attr);
2902     napi_value flag = nullptr;
2903     napi_create_double(env, result, &flag);
2904     return flag;
2905 }
2906 
TaskAttrSetNameTest(napi_env env,napi_callback_info info)2907 static napi_value TaskAttrSetNameTest(napi_env env, napi_callback_info info)
2908 {
2909     int result = 0;
2910     ffrt_task_attr_t attr;
2911     (void)ffrt_task_attr_init(&attr);
2912     std::string name(ffrt_task_attr_get_name(&attr));
2913     if (name != "") {
2914         result = 1;
2915     }
2916     ffrt_task_attr_set_name(&attr, "Task Name");
2917     std::string reName(ffrt_task_attr_get_name(&attr));
2918     if (reName != "Task Name") {
2919         result = 2;
2920     }
2921     ffrt_task_attr_destroy(&attr);
2922     std::string desName(ffrt_task_attr_get_name(&attr));
2923     napi_value flag = nullptr;
2924     napi_create_double(env, result, &flag);
2925     return flag;
2926 }
2927 
TaskAttrSetQosTest(napi_env env,napi_callback_info info)2928 static napi_value TaskAttrSetQosTest(napi_env env, napi_callback_info info)
2929 {
2930     int result = 0;
2931     ffrt_task_attr_t attr;
2932     ffrt_task_attr_init(&attr);
2933     int minLevel = static_cast<int>(ffrt_qos_inherit);
2934     int maxLevel = static_cast<int>(ffrt_qos_user_initiated);
2935     for (int idx = minLevel; idx <= maxLevel; idx++) {
2936         ffrt_task_attr_set_qos(&attr, idx);
2937         int qosVal = int(ffrt_task_attr_get_qos(&attr));
2938         if (qosVal != idx) {
2939             result = idx + 2;
2940         }
2941     }
2942     ffrt_task_attr_destroy(&attr);
2943     napi_value flag = nullptr;
2944     napi_create_double(env, result, &flag);
2945     return flag;
2946 }
2947 
2948 typedef struct {
2949     int timerId;
2950     int result;
2951     uint64_t timeout;
2952     high_resolution_clock::time_point submitTime;
2953     high_resolution_clock::time_point dispatchTime;
2954     bool finish;
2955 } TimerDataT;
2956 
StallUs(size_t us)2957 static inline void StallUs(size_t us)
2958 {
2959     auto start = std::chrono::system_clock::now();
2960     size_t passed = 0;
2961     while (passed < us) {
2962         passed = std::chrono::duration_cast<std::chrono::microseconds>
2963             (std::chrono::system_clock::now() - start).count();
2964     }
2965 }
2966 
ThreadFunc(void * p)2967 void* ThreadFunc(void *p)
2968 {
2969     ffrt_loop_run(p);
2970     return nullptr;
2971 }
2972 
TimerCb(void * data)2973 static void TimerCb(void *data)
2974 {
2975     printf("enter TimerCb\n");
2976     const double error = 100;
2977     TimerDataT *timerData = reinterpret_cast<TimerDataT *>(data);
2978     timerData->dispatchTime = high_resolution_clock::now();
2979     auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(
2980         timerData->dispatchTime - timerData->submitTime);
2981     double realTimeVal = elapsed.count();
2982     if (realTimeVal < timerData->timeout - error || realTimeVal > timerData->timeout + error) {
2983         timerData->result += 1;
2984     }
2985     timerData->finish = true;
2986 }
2987 
ffrt_timer_start_abnormal_0001(napi_env env,napi_callback_info info)2988 static napi_value ffrt_timer_start_abnormal_0001(napi_env env, napi_callback_info info)
2989 {
2990     high_resolution_clock::time_point startT = high_resolution_clock::now();
2991     TimerDataT timerData1 = {.timerId = 1, .timeout = 0, .submitTime = startT, .finish = false, .result = 0};
2992     int ret = ffrt_timer_start(-1, 0, reinterpret_cast<void *>(&timerData1), nullptr, false);
2993 
2994     int result = 0;
2995     if (ret != -1) {
2996         result += 1;
2997     }
2998     napi_value flag = nullptr;
2999     napi_create_double(env, result, &flag);
3000     return flag;
3001 }
3002 
ffrt_timer_start_0001(napi_env env,napi_callback_info info)3003 static napi_value ffrt_timer_start_0001(napi_env env, napi_callback_info info)
3004 {
3005     high_resolution_clock::time_point startT = high_resolution_clock::now();
3006     TimerDataT timerData1 = {.timerId = 1, .timeout = 0, .submitTime = startT, .finish = false, .result = 0};
3007     ffrt_timer_start(ffrt_qos_default, 0, reinterpret_cast<void *>(&timerData1), TimerCb, false);
3008     bool finish = false;
3009     while (!finish) {
3010         usleep(1);
3011         bool flag = false;
3012         if (timerData1.finish) {
3013             flag = true;
3014         }
3015         finish = (flag == true ? true : false);
3016     }
3017     napi_value flag = nullptr;
3018     napi_create_double(env, timerData1.result, &flag);
3019     return flag;
3020 }
3021 
ffrt_timer_start_0002(napi_env env,napi_callback_info info)3022 static napi_value ffrt_timer_start_0002(napi_env env, napi_callback_info info)
3023 {
3024     const int timerCount = 100;
3025     bool finish = false;
3026     TimerDataT timerData[timerCount];
3027     high_resolution_clock::time_point startT = high_resolution_clock::now();
3028     ffrt_qos_default_t qos_type[5] = {ffrt_qos_inherit, ffrt_qos_background, ffrt_qos_utility,
3029         ffrt_qos_default, ffrt_qos_user_initiated};
3030     for (int i = 0; i < timerCount; ++i) {
3031         uint64_t timeout = 0;
3032         const int mod1 = 500;
3033         const int mod2 = 5;
3034         timeout = rand() % mod1;
3035         int qosidx = rand() % mod2;
3036         timerData[i] = {.timerId = i, .timeout = timeout, .submitTime = startT, .finish = false, .result = 0};
3037         ffrt_timer_start(qos_type[qosidx], timeout, (void *)&timerData[i], TimerCb, false);
3038     }
3039 
3040     while (!finish) {
3041         usleep(1);
3042         bool flag = true;
3043         for (int i = 0; i < timerCount; ++i) {
3044             flag = (flag && timerData[i].finish);
3045         }
3046         finish = flag == true ? true : false;
3047     }
3048     napi_value flag = nullptr;
3049     for (int i = 0; i < timerCount; ++i) {
3050         flag = nullptr;
3051         napi_create_double(env, timerData[i].result, &flag);
3052     }
3053     return flag;
3054 }
3055 
TimerCbCancel(void * data)3056 static void TimerCbCancel(void *data)
3057 {
3058     printf("enter TimerCbCancel\n");
3059     const uint32_t slpTime = 500 * 1000;
3060     StallUs(slpTime);
3061     TimerDataT *timerData = reinterpret_cast<TimerDataT *>(data);
3062     timerData->finish = true;
3063 }
3064 
ffrt_timer_cancel_0001(napi_env env,napi_callback_info info)3065 static napi_value ffrt_timer_cancel_0001(napi_env env, napi_callback_info info)
3066 {
3067     const uint32_t delayTime = 2000;
3068     TimerDataT timerData = { .finish = false, .result = 0};
3069     int handle = ffrt_timer_start(ffrt_qos_default, delayTime, reinterpret_cast<void *>(&timerData),
3070         TimerCbCancel, false);
3071     int abnormalHandle = handle + 1;
3072     ffrt_timer_stop(ffrt_qos_default, abnormalHandle);
3073     ffrt_timer_stop(ffrt_qos_default, handle);
3074     ffrt_timer_stop(ffrt_qos_default, handle);
3075     if (timerData.finish != false) {
3076         timerData.result += 1;
3077     }
3078     napi_value flag = nullptr;
3079     napi_create_double(env, timerData.result, &flag);
3080     return flag;
3081 }
3082 
ffrt_loop_abnormal_0001(napi_env env,napi_callback_info info)3083 static napi_value ffrt_loop_abnormal_0001(napi_env env, napi_callback_info info)
3084 {
3085     ffrt_queue_attr_t queue_attr;
3086     (void)ffrt_queue_attr_init(&queue_attr);
3087     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3088 
3089     int result2 = 0;
3090     const int addnum = 20;
3091     std::function<void()>&& basicFunc2 = [&result2]() {result2 += addnum;};
3092     auto loop = ffrt_loop_create(queue_handle);
3093 
3094     int result = 0;
3095     if (loop == nullptr) {
3096         result += 1;
3097     }
3098 
3099     ffrt_queue_attr_destroy(&queue_attr);
3100     ffrt_queue_destroy(queue_handle);
3101     napi_value flag = nullptr;
3102     napi_create_double(env, result, &flag);
3103     return flag;
3104 }
3105 
ffrt_loop_abnormal_0002(napi_env env,napi_callback_info info)3106 static napi_value ffrt_loop_abnormal_0002(napi_env env, napi_callback_info info)
3107 {
3108     auto loop = ffrt_loop_create(nullptr);
3109     int result = 0;
3110     if (loop != nullptr) {
3111         result += 1;
3112     }
3113     int res2 = ffrt_loop_destroy(loop);
3114     if (res2 != -1) {
3115         result += 1;
3116     }
3117     int res3 = ffrt_loop_run(loop);
3118     if (res3 != -1) {
3119         result += 1;
3120     }
3121     auto res4 = ffrt_queue_attr_get_max_concurrency(nullptr);
3122     if (res4 != 0) {
3123         result += 1;
3124     }
3125     napi_value flag = nullptr;
3126     napi_create_double(env, result, &flag);
3127     return flag;
3128 }
3129 
ffrt_loop_0001(napi_env env,napi_callback_info info)3130 static napi_value ffrt_loop_0001(napi_env env, napi_callback_info info)
3131 {
3132     ffrt_queue_attr_t queue_attr;
3133     (void)ffrt_queue_attr_init(&queue_attr);
3134     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3135     auto loop = ffrt_loop_create(queue_handle);
3136     ffrt_task_attr_t task_attr;
3137     (void)ffrt_task_attr_init(&task_attr);
3138     ffrt_task_attr_set_delay(&task_attr, TASK_DELAY_TIME);
3139     int result1 = 0;
3140     const int loopCnt = 1000;
3141     std::function<void()>&& basicFunc1 = [&result1]() {for (int i = 0; i < loopCnt; ++i) {result1 += 1;}};
3142     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
3143         create_function_wrapper(basicFunc1, ffrt_function_kind_queue), &task_attr);
3144     pthread_t thread;
3145     pthread_create(&thread, 0, ThreadFunc, loop);
3146     int result2 = 0;
3147     const int addnum = 20;
3148     std::function<void()>&& basicFunc2 = [&result2]() {result2 += addnum;};
3149     ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
3150         create_function_wrapper(basicFunc2, ffrt_function_kind_queue), nullptr);
3151     ffrt_queue_wait(task1);
3152     ffrt_queue_wait(task2);
3153     int result = 0;
3154     if (result1 != loopCnt || result2 != addnum) {
3155         result = ERR_CODE_1;
3156     }
3157     int result3 = 0;
3158     std::function<void()>&& basicFunc3 = [&result3]() {result3 += addnum;};
3159     std::function<void()> &&SleepFunc = [] () {usleep(SLEEP_TIME);};
3160     ffrt_task_handle_t sleepTask = ffrt_queue_submit_h(queue_handle, create_function_wrapper(SleepFunc,
3161         ffrt_function_kind_queue), nullptr);
3162     ffrt_task_handle_t task3 = ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc3,
3163         ffrt_function_kind_queue), nullptr);
3164     int ret = ffrt_queue_cancel(task3);
3165     if (ret != 0 || result3 != 0) {
3166         result = ERR_CODE_2;
3167     }
3168     ffrt_queue_wait(sleepTask);
3169     ffrt_loop_stop(loop);
3170     pthread_join(thread, nullptr);
3171     int destoryRet = ffrt_loop_destroy(loop);
3172     if (destoryRet != 0) {
3173         result = ERR_CODE_3;
3174     }
3175     ffrt_queue_attr_destroy(&queue_attr);
3176     ffrt_queue_destroy(queue_handle);
3177     napi_value flag = nullptr;
3178     napi_create_double(env, result, &flag);
3179     return flag;
3180 }
3181 
ffrt_loop_0002(napi_env env,napi_callback_info info)3182 static napi_value ffrt_loop_0002(napi_env env, napi_callback_info info)
3183 {
3184     ffrt_queue_attr_t queue_attr;
3185     (void)ffrt_queue_attr_init(&queue_attr);
3186     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3187     auto loop = ffrt_loop_create(queue_handle);
3188     pthread_t thread;
3189     pthread_create(&thread, 0, ThreadFunc, loop);
3190 
3191     int result1 = 0;
3192     const int addTen = 10;
3193     std::function<void()>&& basicFunc1 = [&result1]() {result1 += addTen;};
3194     std::function<void()> &&SleepFunc = [] () {usleep(SLEEP_TIME);};
3195     ffrt_task_handle_t sleepTask = ffrt_queue_submit_h(queue_handle, create_function_wrapper(SleepFunc,
3196         ffrt_function_kind_queue), nullptr);
3197     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc1,
3198         ffrt_function_kind_queue), nullptr);
3199     int result = 0;
3200     int ret1 = ffrt_queue_cancel(task1);
3201     if (ret1 != 0) {
3202         result = ERR_CODE_1;
3203     }
3204     ffrt_queue_wait(sleepTask);
3205     int result2 = 0;
3206     const int addTwenty = 20;
3207     std::function<void()>&& basicFunc2 = [&result2]() {result2 += addTwenty;};
3208     ffrt_task_handle_t sleepTask2 = ffrt_queue_submit_h(queue_handle, create_function_wrapper(SleepFunc,
3209         ffrt_function_kind_queue), nullptr);
3210     ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
3211         create_function_wrapper(basicFunc2, ffrt_function_kind_queue), nullptr);
3212     int ret2 = ffrt_queue_cancel(task2);
3213     if (ret2 != 0) {
3214         result = ERR_CODE_2;
3215     }
3216     ffrt_queue_wait(sleepTask2);
3217     ffrt_loop_stop(loop);
3218     pthread_join(thread, nullptr);
3219     ffrt_loop_destroy(loop);
3220     ffrt_queue_attr_destroy(&queue_attr);
3221     ffrt_queue_destroy(queue_handle);
3222     napi_value flag = nullptr;
3223     napi_create_double(env, result, &flag);
3224     return flag;
3225 }
3226 
ffrt_queue_parallel_api_0001(napi_env env,napi_callback_info info)3227 static napi_value ffrt_queue_parallel_api_0001(napi_env env, napi_callback_info info)
3228 {
3229     int result = 0;
3230     ffrt_queue_attr_t queue_attr;
3231     (void)ffrt_queue_attr_init(&queue_attr);
3232     const int maxConcurrency1 = 4;
3233     ffrt_queue_attr_set_max_concurrency(nullptr, maxConcurrency1);
3234     int concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3235     if (concurrency != 1) {
3236         result += 1;
3237     }
3238 
3239     const int maxConcurrency2 = 0;
3240     ffrt_queue_attr_set_max_concurrency(&queue_attr, maxConcurrency2);
3241     concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3242     if (concurrency != 1) {
3243         result += 1;
3244     }
3245     const int maxConcurrency3 = 100;
3246     ffrt_queue_attr_set_max_concurrency(&queue_attr, maxConcurrency3);
3247     concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3248     if (concurrency != maxConcurrency3) {
3249         result += 1;
3250     }
3251 
3252     // 销毁队列
3253     ffrt_queue_attr_destroy(&queue_attr);
3254 
3255     napi_value flag = nullptr;
3256     napi_create_double(env, result, &flag);
3257     return flag;
3258 }
3259 
ffrt_queue_parallel_api_0002(napi_env env,napi_callback_info info)3260 static napi_value ffrt_queue_parallel_api_0002(napi_env env, napi_callback_info info)
3261 {
3262     int result = 0;
3263     const int pri = 4;
3264     ffrt_queue_attr_t queue_attr;
3265     (void)ffrt_queue_attr_init(&queue_attr);
3266     ffrt_queue_attr_set_max_concurrency(&queue_attr, pri);
3267     int concurrency = ffrt_queue_attr_get_max_concurrency(nullptr);
3268     if (concurrency != 0) {
3269         result += 1;
3270     }
3271     concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3272     if (concurrency != pri) {
3273         result += 1;
3274     }
3275 
3276     // 销毁队列
3277     ffrt_queue_attr_destroy(&queue_attr);
3278     napi_value flag = nullptr;
3279     napi_create_double(env, result, &flag);
3280     return flag;
3281 }
3282 
ffrt_queue_parallel_api_0003(napi_env env,napi_callback_info info)3283 static napi_value ffrt_queue_parallel_api_0003(napi_env env, napi_callback_info info)
3284 {
3285     int result = 0;
3286     ffrt_task_attr_t task_attr;
3287     (void)ffrt_task_attr_init(&task_attr);
3288     ffrt_task_attr_set_queue_priority(nullptr, ffrt_queue_priority_immediate);
3289     int priority = ffrt_task_attr_get_queue_priority(&task_attr);
3290     if (priority != ffrt_queue_priority_low) {
3291         result += 1;
3292     }
3293 
3294     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_low);
3295     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3296     if (priority != ffrt_queue_priority_low) {
3297         result += 1;
3298     }
3299 
3300     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_low);
3301     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3302     if (priority != ffrt_queue_priority_low) {
3303         result += 1;
3304     }
3305 
3306     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_immediate);
3307     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3308     if (priority != ffrt_queue_priority_immediate) {
3309         result += 1;
3310     }
3311 
3312     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_high);
3313     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3314     if (priority != ffrt_queue_priority_high) {
3315         result += 1;
3316     }
3317 
3318     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_idle);
3319     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3320     if (priority != ffrt_queue_priority_idle) {
3321         result += 1;
3322     }
3323 
3324     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_low);
3325     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3326     if (priority != ffrt_queue_priority_low) {
3327         result += 1;
3328     }
3329 
3330     const ffrt_queue_priority_t abnormal_pri = (ffrt_queue_priority_t)100;
3331     ffrt_task_attr_set_queue_priority(&task_attr, abnormal_pri);
3332     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3333     if (priority != ffrt_queue_priority_low) {
3334         result += 1;
3335     }
3336     // 销毁队列
3337     ffrt_task_attr_destroy(&task_attr);
3338     napi_value flag = nullptr;
3339     napi_create_double(env, result, &flag);
3340     return flag;
3341 }
3342 
ffrt_queue_parallel_api_0004(napi_env env,napi_callback_info info)3343 static napi_value ffrt_queue_parallel_api_0004(napi_env env, napi_callback_info info)
3344 {
3345     int result = 0;
3346     ffrt_task_attr_t task_attr;
3347     (void)ffrt_task_attr_init(&task_attr);
3348     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_immediate);
3349     int priority = ffrt_task_attr_get_queue_priority(nullptr);
3350     if (priority != 0) {
3351         result += 1;
3352     }
3353 
3354     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3355     if (priority != ffrt_queue_priority_immediate) {
3356         result += 1;
3357     }
3358     // 销毁队列
3359     ffrt_task_attr_destroy(&task_attr);
3360     napi_value flag = nullptr;
3361     napi_create_double(env, result, &flag);
3362     return flag;
3363 }
3364 
queue_parallel_cancel_0001(napi_env env,napi_callback_info info)3365 static napi_value queue_parallel_cancel_0001(napi_env env, napi_callback_info info)
3366 {
3367     int result = 0;
3368     const int taskRes = 9;
3369     ffrt_queue_attr_t queue_attr;
3370     (void)ffrt_queue_attr_init(&queue_attr);
3371     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3372 
3373     int res = 0;
3374     const uint32_t delayTime = 1000000;
3375     ffrt_task_attr_t task_attr;
3376     (void)ffrt_task_attr_init(&task_attr);
3377     ffrt_task_attr_set_delay(&task_attr, delayTime);
3378     std::function<void()> &&OnePlusFunc = [&res] () {OnePlusForTest((void *)(&res));};
3379 
3380     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
3381         create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr);
3382 
3383     int ret = ffrt_queue_cancel(task1);
3384     if (res != 0) {
3385         result += 1;
3386     }
3387     ret = ffrt_queue_cancel(task1);
3388     if (ret != 1) {
3389         result += 1;
3390     }
3391 
3392     std::function<void()> &&MultipleFunc = [&res] () {MultipleForTest((void *)(&res));};
3393     std::function<void()> &&OneSubFunc = [&res] () {SubForTest((void *)(&res));};
3394     ffrt_queue_submit_h(queue_handle, create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), nullptr);
3395     ffrt_queue_submit_h(queue_handle, create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), nullptr);
3396     ffrt_task_handle_t task3 = ffrt_queue_submit_h(queue_handle,
3397         create_function_wrapper(OneSubFunc, ffrt_function_kind_queue), nullptr);
3398     ffrt_queue_wait(task3);
3399     if (res != taskRes) {
3400         result += 1;
3401     }
3402 
3403     ffrt_task_attr_destroy(&task_attr);
3404     ffrt_task_handle_destroy(task1);
3405     ffrt_task_handle_destroy(task3);
3406 
3407     ffrt_queue_attr_destroy(&queue_attr);
3408     ffrt_queue_destroy(queue_handle);
3409 
3410     napi_value flag = nullptr;
3411     napi_create_double(env, result, &flag);
3412     return flag;
3413 }
3414 
queue_parallel_cancel_0002(napi_env env,napi_callback_info info)3415 static napi_value queue_parallel_cancel_0002(napi_env env, napi_callback_info info)
3416 {
3417     int result = 0;
3418     const uint32_t delayTime = 2000;
3419     ffrt_queue_attr_t queue_attr;
3420     (void)ffrt_queue_attr_init(&queue_attr);
3421     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3422 
3423     int res = 0;
3424     std::function<void()> &&OnePlusFfrtSleepFunc = [&res] () {OnePlusSleepForTest((void *)(&res));};
3425     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
3426         create_function_wrapper(OnePlusFfrtSleepFunc, ffrt_function_kind_queue), nullptr);
3427 
3428     usleep(delayTime);
3429     ffrt_queue_cancel(task1);
3430     if (res != 0) {
3431         result += 1;
3432     }
3433     ffrt_queue_wait(task1);
3434     if (res != 1) {
3435         result += 1;
3436     }
3437 
3438     ffrt_task_handle_destroy(task1);
3439     ffrt_queue_attr_destroy(&queue_attr);
3440     ffrt_queue_destroy(queue_handle);
3441 
3442     napi_value flag = nullptr;
3443     napi_create_double(env, result, &flag);
3444     return flag;
3445 }
3446 
queue_parallel_0001(napi_env env,napi_callback_info info)3447 static napi_value queue_parallel_0001(napi_env env, napi_callback_info info)
3448 {
3449     int result = 0;
3450     const int taskRes = 9;
3451     ffrt_queue_attr_t queue_attr;
3452     (void)ffrt_queue_attr_init(&queue_attr);
3453     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3454 
3455     int res = 0;
3456     const uint32_t delayTime = 2000;
3457 
3458     std::function<void()> &&OnePlusFunc = [&res] () {OnePlusForTest((void *)(&res));};
3459     std::function<void()> &&MultipleFunc = [&res] () {MultipleForTest((void *)(&res));};
3460     std::function<void()> &&OneSubFunc = [&res] () {SubForTest((void *)(&res));};
3461 
3462     ffrt_queue_submit(queue_handle, create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), nullptr);
3463     ffrt_queue_submit(queue_handle, create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), nullptr);
3464     ffrt_task_handle_t task3 = ffrt_queue_submit_h(queue_handle,
3465         create_function_wrapper(OneSubFunc, ffrt_function_kind_queue), nullptr);
3466     ffrt_queue_wait(task3);
3467     if (res != taskRes) {
3468         result += 1;
3469     }
3470     usleep(delayTime);
3471     int concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3472     if (concurrency != 1) {
3473         result += 1;
3474     }
3475 
3476     ffrt_task_handle_destroy(task3);
3477     ffrt_queue_attr_destroy(&queue_attr);
3478     ffrt_queue_destroy(queue_handle);
3479 
3480     napi_value flag = nullptr;
3481     napi_create_double(env, result, &flag);
3482     return flag;
3483 }
3484 
DivForTest(void * data)3485 inline void DivForTest(void *data)
3486 {
3487     const int div = 3;
3488     (*static_cast<int*>(data)) /= div;
3489 }
3490 
TwoPlusForTest(void * data)3491 inline void TwoPlusForTest(void *data)
3492 {
3493     const int plus = 2;
3494     (*static_cast<int*>(data)) += plus;
3495 }
3496 
TwoSubForTest(void * data)3497 inline void TwoSubForTest(void *data)
3498 {
3499     const int sub = 2;
3500     (*static_cast<int*>(data)) -= sub;
3501 }
3502 
queue_parallel_0002(napi_env env,napi_callback_info info)3503 static napi_value queue_parallel_0002(napi_env env, napi_callback_info info)
3504 {
3505     int result = 0;
3506     const int maxConcurrency = 1;
3507     const int taskRes = 9;
3508     ffrt_queue_attr_t queue_attr;
3509     (void)ffrt_queue_attr_init(&queue_attr);
3510     ffrt_queue_attr_set_max_concurrency(&queue_attr, maxConcurrency);
3511     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3512 
3513     int res = 3;
3514     ffrt_task_handle_t task;
3515     std::function<void()> &&DivFunc = [&res] () {DivForTest((void *)(&res));};
3516     std::function<void()> &&MultipleFunc = [&res] () {MultipleForTest((void *)(&res));};
3517     std::function<void()> &&OnePlusFunc = [&res] () {OnePlusForTest((void *)(&res));};
3518     std::function<void()> &&SubFunc = [&res] () {SubForTest((void *)(&res));};
3519     std::function<void()> &&TwoPlusFunc = [&res] () {TwoPlusForTest((void *)(&res));};
3520     std::function<void()> &&TwoSubFunc = [&res] () {TwoSubForTest((void *)(&res));};
3521     std::function<void()> &&SleepFunc = [] () {sleep(1);};
3522 
3523     const int taskCnt = 6;
3524     ffrt_task_attr_t task_attr[taskCnt];
3525     for (int i = 0; i < taskCnt; ++i) {
3526         (void)ffrt_task_attr_init(&task_attr[i]);
3527 
3528         const ffrt_queue_priority_t pri = (ffrt_queue_priority_t)(taskCnt - i);
3529         ffrt_task_attr_set_queue_priority(&task_attr[i], pri);
3530     }
3531     ffrt_task_attr_t task_attr_tmp;
3532     (void)ffrt_task_attr_init(&task_attr_tmp);
3533     ffrt_task_attr_set_queue_priority(&task_attr_tmp, ffrt_queue_priority_immediate);
3534     ffrt_queue_submit(queue_handle, create_function_wrapper(SleepFunc, ffrt_function_kind_queue), &task_attr_tmp);
3535     ffrt_queue_submit(queue_handle, create_function_wrapper(TwoSubFunc, ffrt_function_kind_queue), &task_attr[0]);
3536     ffrt_queue_submit(queue_handle, create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr[1]);
3537     ffrt_queue_submit(queue_handle, create_function_wrapper(DivFunc, ffrt_function_kind_queue), &task_attr[2]);
3538     int waitIdex = 3;
3539     task = ffrt_queue_submit_h(queue_handle, create_function_wrapper(
3540         SubFunc, ffrt_function_kind_queue), &task_attr[waitIdex]);
3541     ffrt_queue_submit(queue_handle, create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), &task_attr[4]);
3542     ffrt_queue_submit(queue_handle, create_function_wrapper(TwoPlusFunc, ffrt_function_kind_queue), &task_attr[5]);
3543 
3544     ffrt_queue_wait(task);
3545     if (res != taskRes) {
3546         result += 1;
3547     }
3548     for (int i = 0; i < taskCnt; ++i) {
3549         (void) ffrt_task_attr_destroy(&task_attr[i]);
3550     }
3551     ffrt_task_handle_destroy(task);
3552     ffrt_queue_attr_destroy(&queue_attr);
3553     ffrt_queue_destroy(queue_handle);
3554 
3555     napi_value flag = nullptr;
3556     napi_create_double(env, result, &flag);
3557     return flag;
3558 }
3559 
Testfun(void * data)3560 static void Testfun(void* data)
3561 {
3562     *(int*)data += 1;
3563     printf("%d, timeout callback\n", *(int*)data);
3564 }
3565 
3566 static void (*g_cb)(void*) = Testfun;
3567 
3568 struct TestData {
3569     int fd;
3570     uint64_t expected;
3571 };
3572 
TestCallBack(void * token,uint32_t event)3573 static void TestCallBack(void* token, uint32_t event)
3574 {
3575     printf("g_cb done\n");
3576 }
3577 
ffrt_loop_abnormal_0003(napi_env env,napi_callback_info info)3578 static napi_value ffrt_loop_abnormal_0003(napi_env env, napi_callback_info info)
3579 {
3580     int result = 0;
3581     int result1 = 0;
3582     std::function<void()>&& basicFunc1 = [&result1]() { result1 += 1; };
3583     auto loop = ffrt_loop_create(nullptr);
3584     if (loop != nullptr) {
3585         result += 1;
3586     }
3587     int res1 = ffrt_loop_destroy(loop);
3588     if (res1 != -1) {
3589         result += 1;
3590     }
3591     int res2 = ffrt_loop_run(loop);
3592     if (res2 != -1) {
3593         result += 1;
3594     }
3595     auto res5 = ffrt_queue_attr_get_max_concurrency(nullptr);
3596     if (res5 != 0) {
3597         result += 1;
3598     }
3599     int ret6 = ffrt_loop_timer_stop(loop, 0);
3600     if (ret6 != -1) {
3601         result += 1;
3602     }
3603 
3604     napi_value flag = nullptr;
3605     napi_create_double(env, result, &flag);
3606     return flag;
3607 }
3608 
ffrt_loop_normal_0003(napi_env env,napi_callback_info info)3609 static napi_value ffrt_loop_normal_0003(napi_env env, napi_callback_info info)
3610 {
3611     int result = 0;
3612     ffrt_queue_attr_t queue_attr;
3613     (void)ffrt_queue_attr_init(&queue_attr);
3614     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3615     auto loop = ffrt_loop_create(queue_handle);
3616     int result1 = 0;
3617     std::function<void()>&& basicFunc1 = [&result1]() {
3618         int testNumber = 10;
3619         result1 += testNumber;
3620     };
3621     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
3622         create_function_wrapper(basicFunc1, ffrt_function_kind_queue), nullptr);
3623     pthread_t thread;
3624     pthread_create(&thread, 0, ThreadFunc, loop);
3625     static int staticReslult = 0;
3626     int* xf = &staticReslult;
3627     void* data = xf;
3628     uint64_t timeout1 = 20;
3629     uint64_t timeout2 = 10;
3630     uint64_t expected = 0xabacadae;
3631     int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
3632     printf("testfd=%d\n", testFd);
3633     struct  TestData testData{.fd = testFd, .expected = expected};
3634     int res1 = ffrt_loop_timer_start(loop, timeout1, data, g_cb, false);
3635     int res2 = ffrt_loop_timer_start(loop, timeout2, data, g_cb, false);
3636 
3637     ffrt_loop_epoll_ctl(loop, 1, testFd, 0x00000001U, (void*)(&testData), TestCallBack);
3638     ssize_t n = write(testFd, &expected, sizeof(uint64_t));
3639     int sleepNumber = 25000;
3640     usleep(sleepNumber);
3641     ffrt_loop_epoll_ctl(loop, 1, testFd, 0, nullptr, nullptr);
3642     int testNumber4 = 2;
3643     int result2 = 0;
3644     std::function<void()>&& basicFunc2 = [&result2]() {
3645         int testNumber2 = 20;
3646         result2 += testNumber2;
3647     };
3648     ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
3649         create_function_wrapper(basicFunc2, ffrt_function_kind_queue), nullptr);
3650     ffrt_queue_wait(task1);
3651     ffrt_queue_wait(task2);
3652     int testNumber1 = 10;
3653     int testNumber3 = 20;
3654     if (res2 != 1 or res1 != 0 or result2 != testNumber3 or result1 != testNumber1 or
3655         n != sizeof(uint64_t) or staticReslult != testNumber4) {
3656         result += 1;
3657     }
3658     ffrt_loop_stop(loop);
3659     pthread_join(thread, nullptr);
3660     ffrt_queue_attr_destroy(&queue_attr);
3661     ffrt_queue_destroy(queue_handle);
3662     napi_value flag = nullptr;
3663     napi_create_double(env, result, &flag);
3664     return flag;
3665 }
3666 
ffrt_get_main_queue_0001(napi_env env,napi_callback_info info)3667 static napi_value ffrt_get_main_queue_0001(napi_env env, napi_callback_info info)
3668 {
3669     int result = 0;
3670     //ffrt test case begin
3671     ffrt_queue_attr_t queue_attr;
3672     (void)ffrt_queue_attr_init(&queue_attr);
3673     ffrt_queue_t currentQueue = ffrt_get_main_queue();
3674     if (currentQueue == nullptr) {
3675         result += 1;
3676     }
3677     napi_value flag = nullptr;
3678     napi_create_double(env, result, &flag);
3679     return flag;
3680 }
ffrt_get_current_queue_0001(napi_env env,napi_callback_info info)3681 static napi_value ffrt_get_current_queue_0001(napi_env env, napi_callback_info info)
3682 {
3683     int result = 0;
3684     //ffrt test case begin
3685     ffrt_queue_attr_t queue_attr;
3686     (void)ffrt_queue_attr_init(&queue_attr);
3687     ffrt_queue_t currentQueue = ffrt_get_current_queue();
3688     if (currentQueue == nullptr) {
3689         result += 1;
3690     }
3691     napi_value flag = nullptr;
3692     napi_create_double(env, result, &flag);
3693     return flag;
3694 }
3695 
ffrt_this_task_get_qos_0001(napi_env env,napi_callback_info info)3696 static napi_value ffrt_this_task_get_qos_0001(napi_env env, napi_callback_info info)
3697 {
3698     int result = 0;
3699     //ffrt test case begin
3700     ffrt_queue_attr_t queue_attr;
3701     (void)ffrt_queue_attr_init(&queue_attr);
3702     ffrt_queue_t currentQueue = ffrt_get_current_queue();
3703     ffrt_task_attr_t attr;
3704     ffrt_task_attr_init(&attr);
3705     ffrt_task_attr_set_qos(&attr, ffrt_qos_user_initiated);
3706     int result1 = 0;
3707     std::function<void()> &&basicFunc = [&result]() {
3708         ffrt_qos_t qos = ffrt_this_task_get_qos();
3709         if (qos != ffrt_qos_user_initiated) {
3710             result += 1;
3711         };
3712     };
3713     ffrt_queue_submit_h(currentQueue, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &attr);
3714     napi_value flag = nullptr;
3715     napi_create_double(env, result, &flag);
3716     if (result1 != 1) {
3717         result += 1;
3718         }
3719     return flag;
3720 }
3721 
ffrt_attr_stack_size_0001(napi_env env,napi_callback_info info)3722 static napi_value ffrt_attr_stack_size_0001(napi_env env, napi_callback_info info)
3723 {
3724     int result = 0;
3725     // 验证stack_size的set和get c接口
3726     int a = 0;
3727     ffrt_task_attr_t task_attr;
3728     (void)ffrt_task_attr_init(&task_attr);
3729     ffrt_task_attr_set_stack_size(&task_attr, UNIT_STACK_SIZE);
3730 
3731     std::function<void()>&& OnePlusFunc = [&a]() { a += 1; };
3732     ffrt_task_handle_t task = ffrt_submit_h_base(create_function_wrapper(OnePlusFunc), {}, {}, &task_attr);
3733     const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
3734     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
3735     ffrt_wait_deps(&wait);
3736     if (a != 1) {
3737         result = ERR_CODE_1;
3738     }
3739 
3740     uint64_t stackSize = ffrt_task_attr_get_stack_size(&task_attr);
3741     if (stackSize != UNIT_STACK_SIZE) {
3742         result = ERR_CODE_2;
3743     }
3744     ffrt_task_attr_destroy(&task_attr);
3745     ffrt_task_handle_destroy(task);
3746     napi_value flag = nullptr;
3747     napi_create_double(env, result, &flag);
3748     return flag;
3749 }
3750 
ffrt_task_handle_ref_0001(napi_env env,napi_callback_info info)3751 static napi_value ffrt_task_handle_ref_0001(napi_env env, napi_callback_info info)
3752 {
3753     int result = 0;
3754     // 验证handle的set和get c接口
3755     int a = 0;
3756     ffrt_task_attr_t task_attr;
3757     (void)ffrt_task_attr_init(&task_attr);
3758     ffrt_task_attr_set_delay(&task_attr, UNIT_TASK_DELAY);
3759 
3760     std::function<void()>&& OnePlusFunc = [&a]() { a += 1; };
3761     ffrt_task_handle_t task = ffrt_submit_h_base(create_function_wrapper(OnePlusFunc), {}, {}, &task_attr);
3762     uint32_t count = ffrt_task_handle_inc_ref(task);
3763     if (count != TASK_SUBMIT_REF) {
3764         result = ERR_CODE_1;
3765     }
3766     count = ffrt_task_handle_dec_ref(task);
3767     if (count != TASK_RELEASE_REF) {
3768         result = ERR_CODE_2;
3769     }
3770     const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
3771     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
3772     ffrt_wait_deps(&wait);
3773     if (a != 1) {
3774         result = ERR_CODE_3;
3775     }
3776     ffrt_task_attr_destroy(&task_attr);
3777     ffrt_task_handle_destroy(task);
3778     napi_value flag = nullptr;
3779     napi_create_double(env, result, &flag);
3780     return flag;
3781 }
3782 
OnePlusForTestQos(void * arg)3783 inline void OnePlusForTestQos(void* arg)
3784 {
3785     *(int*)arg = ffrt_this_task_update_qos(ffrt_qos_background);
3786     *(int*)arg += PARAM_100;
3787 }
3788 
OnePlusForGetIdTest(void * arg)3789 inline void OnePlusForGetIdTest(void* arg)
3790 {
3791     *(uint64_t*)arg = ffrt_this_task_get_id();
3792 }
3793 
FfrtThisTaskGetId(napi_env env,napi_callback_info info)3794 static napi_value FfrtThisTaskGetId(napi_env env, napi_callback_info info)
3795 {
3796     uint64_t taskId = SUCCESS;
3797     std::function<void()>&& GetPidFunc = [&taskId]() { OnePlusForGetIdTest((void *)(&taskId)); };
3798     ffrt_submit_base(create_function_wrapper(GetPidFunc), nullptr, nullptr, nullptr);
3799     ffrt_wait();
3800     napi_value result = nullptr;
3801     napi_create_int32(env, taskId != SUCCESS, &result);
3802     return result;
3803 }
3804 
FfrtThisTaskUpdateQos(napi_env env,napi_callback_info info)3805 static napi_value FfrtThisTaskUpdateQos(napi_env env, napi_callback_info info)
3806 {
3807     int pos = FAIL;
3808     std::function<void()>&& UpdateQosFunc = [&pos]() { OnePlusForTestQos((void *)(&pos)); };
3809     ffrt_submit_base(create_function_wrapper(UpdateQosFunc), nullptr, nullptr, nullptr);
3810     ffrt_wait();
3811     napi_value result = nullptr;
3812     napi_create_int32(env, pos, &result);
3813     return result;
3814 }
3815 
3816 EXTERN_C_START
Init(napi_env env,napi_value exports)3817 static napi_value Init(napi_env env, napi_value exports)
3818 {
3819     napi_property_descriptor desc[] = {
3820         { "conditionVariableTest001", nullptr, ConditionVariableTest001, nullptr, nullptr, nullptr,
3821             napi_default, nullptr },
3822         { "conditionVariableTest002", nullptr, ConditionVariableTest002, nullptr, nullptr, nullptr,
3823             napi_default, nullptr },
3824         { "conditionVariableTest003", nullptr, ConditionVariableTest003, nullptr, nullptr, nullptr,
3825             napi_default, nullptr },
3826         { "conditionVariableTest004", nullptr, ConditionVariableTest004, nullptr, nullptr, nullptr,
3827             napi_default, nullptr },
3828         { "conditionVariableApiTest001", nullptr, ConditionVariableApiTest001, nullptr, nullptr, nullptr,
3829             napi_default, nullptr },
3830         { "conditionVariableApiTest002", nullptr, ConditionVariableApiTest002, nullptr, nullptr, nullptr,
3831             napi_default, nullptr },
3832         { "conditionVariableApiTest003", nullptr, ConditionVariableApiTest003, nullptr, nullptr, nullptr,
3833             napi_default, nullptr },
3834         { "conditionVariableApiTest004", nullptr, ConditionVariableApiTest004, nullptr, nullptr, nullptr,
3835             napi_default, nullptr },
3836         { "delayCTest001", nullptr, DelayCTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3837         { "ffrtYieldC0001", nullptr, FfrtYieldC0001, nullptr, nullptr, nullptr, napi_default, nullptr },
3838         { "recursiveMutexAbnormalParamTest001", nullptr, RecursiveMutexAbnormalParamTest001, nullptr,
3839             nullptr, nullptr, napi_default, nullptr },
3840         { "recursiveMutexAbnormalInvalidParamTest001", nullptr, RecursiveMutexAbnormalInvalidParamTest001, nullptr,
3841             nullptr, nullptr, napi_default, nullptr },
3842         { "mutexAbnormalParamTest001", nullptr, MutexAbnormalParamTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3843         { "mutexAbnormalParamTest002", nullptr, MutexAbnormalParamTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
3844         { "mutexTest006", nullptr, MutexTest006, nullptr, nullptr, nullptr, napi_default, nullptr },
3845         { "mutexTest007", nullptr, MutexTest007, nullptr, nullptr, nullptr, napi_default, nullptr },
3846         { "mutexTest008", nullptr, MutexTest008, nullptr, nullptr, nullptr, napi_default, nullptr },
3847         { "queueApiTest001", nullptr, QueueApiTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3848         { "queueApiTest002", nullptr, QueueApiTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
3849         { "queueApiTest003", nullptr, QueueApiTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
3850         { "queueApiTest004", nullptr, QueueApiTest004, nullptr, nullptr, nullptr, napi_default, nullptr },
3851         { "queueApiTest005", nullptr, QueueApiTest005, nullptr, nullptr, nullptr, napi_default, nullptr },
3852         { "queueApiTest006", nullptr, QueueApiTest006, nullptr, nullptr, nullptr, napi_default, nullptr },
3853         { "queueApiTest007", nullptr, QueueApiTest007, nullptr, nullptr, nullptr, napi_default, nullptr },
3854         { "queueApiTest008", nullptr, QueueApiTest008, nullptr, nullptr, nullptr, napi_default, nullptr },
3855         { "queueApiTest009", nullptr, QueueApiTest009, nullptr, nullptr, nullptr, napi_default, nullptr },
3856         { "queueApiTest010", nullptr, QueueApiTest010, nullptr, nullptr, nullptr, napi_default, nullptr },
3857         { "queueApiTest011", nullptr, QueueApiTest011, nullptr, nullptr, nullptr, napi_default, nullptr },
3858         { "queueApiTest012", nullptr, QueueApiTest012, nullptr, nullptr, nullptr, napi_default, nullptr },
3859         { "queueApiTest013", nullptr, QueueApiTest013, nullptr, nullptr, nullptr, napi_default, nullptr },
3860         { "queueCancelTest001", nullptr, QueueCancelTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3861         { "queueCancelTest003", nullptr, QueueCancelTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
3862         { "queueCancelTest004", nullptr, QueueCancelTest004, nullptr, nullptr, nullptr, napi_default, nullptr },
3863         { "queueDelayTest001", nullptr, QueueDelayTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3864         { "queueDelayTest002", nullptr, QueueDelayTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
3865         { "queueDelayTest005", nullptr, QueueDelayTest005, nullptr, nullptr, nullptr, napi_default, nullptr },
3866         { "queueDfxTest001", nullptr, QueueDfxTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3867         { "queueDfxTest002", nullptr, QueueDfxTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
3868         { "queueDfxTest003", nullptr, QueueDfxTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
3869         { "queueDfxTest004", nullptr, QueueDfxTest004, nullptr, nullptr, nullptr, napi_default, nullptr },
3870         { "queueDfxTest005", nullptr, QueueDfxTest005, nullptr, nullptr, nullptr, napi_default, nullptr },
3871         { "queueDfxTest006", nullptr, QueueDfxTest006, nullptr, nullptr, nullptr, napi_default, nullptr },
3872         { "queueTest001", nullptr, QueueTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3873         { "queueTest002", nullptr, QueueTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
3874         { "queueTest003", nullptr, QueueTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
3875         { "queueWaitTest001", nullptr, QueueWaitTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3876         { "submitAbnormalTest", nullptr, SubmitAbnormalTest, nullptr, nullptr, nullptr, napi_default, nullptr },
3877         { "submitBasicTest001", nullptr, SubmitBasicTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3878         { "submitBasicTest002", nullptr, SubmitBasicTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
3879         { "submitInDependEmptyTest", nullptr, SubmitInDependEmptyTest, nullptr, nullptr, nullptr,
3880             napi_default, nullptr },
3881         { "submitInDependNullptrTest", nullptr, SubmitInDependNullptrTest, nullptr, nullptr, nullptr,
3882             napi_default, nullptr },
3883         { "submitOuDependEmptyTest", nullptr, SubmitOuDependEmptyTest, nullptr, nullptr, nullptr,
3884             napi_default, nullptr },
3885         { "submitOuDependNullptrTest", nullptr, SubmitOuDependNullptrTest, nullptr, nullptr, nullptr,
3886             napi_default, nullptr },
3887         { "submitIODependTest001", nullptr, SubmitIODependTest001, nullptr, nullptr, nullptr,
3888             napi_default, nullptr },
3889         { "submitIODependTest002", nullptr, SubmitIODependTest002, nullptr, nullptr, nullptr,
3890             napi_default, nullptr },
3891         { "submitIn0Ou0WaitNullTask1Test", nullptr, SubmitIn0Ou0WaitNullTask1Test, nullptr, nullptr, nullptr,
3892             napi_default, nullptr },
3893         { "submitHBasicTest001", nullptr, SubmitHBasicTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3894         { "submitHBasicTest002", nullptr, SubmitHBasicTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
3895         { "submitHInDependEmptyTest", nullptr, SubmitHInDependEmptyTest, nullptr, nullptr, nullptr,
3896             napi_default, nullptr },
3897         { "submitHInDependNullptrTest", nullptr, SubmitHInDependNullptrTest, nullptr, nullptr, nullptr,
3898             napi_default, nullptr },
3899         { "submitHOuDependEmptyTest", nullptr, SubmitHOuDependEmptyTest, nullptr, nullptr, nullptr,
3900             napi_default, nullptr },
3901         { "submitHOuDependNullptrTest", nullptr, SubmitHOuDependNullptrTest, nullptr, nullptr, nullptr,
3902             napi_default, nullptr },
3903         { "submitHIODependTest001", nullptr, SubmitHIODependTest001, nullptr, nullptr, nullptr,
3904             napi_default, nullptr },
3905         { "submitHIODependTest002", nullptr, SubmitHIODependTest002, nullptr, nullptr, nullptr,
3906             napi_default, nullptr },
3907         { "sleepForTest000", nullptr, SleepForTest000, nullptr, nullptr, nullptr, napi_default, nullptr },
3908         { "sleepForTest001", nullptr, SleepForTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3909         { "taskAttrAbnormalTest", nullptr, TaskAttrAbnormalTest, nullptr, nullptr, nullptr, napi_default, nullptr },
3910         { "taskAttrQosIllegalTest", nullptr, TaskAttrQosIllegalTest, nullptr, nullptr, nullptr, napi_default, nullptr },
3911         { "taskAttrQosQueryTest", nullptr, TaskAttrQosQueryTest, nullptr, nullptr, nullptr, napi_default, nullptr },
3912         { "taskAttrSetNameTest", nullptr, TaskAttrSetNameTest, nullptr, nullptr, nullptr, napi_default, nullptr },
3913         { "taskAttrSetQosTest", nullptr, TaskAttrSetQosTest, nullptr, nullptr, nullptr, napi_default, nullptr },
3914         { "ffrt_timer_start_0001", nullptr, ffrt_timer_start_0001, nullptr, nullptr, nullptr, napi_default, nullptr },
3915         { "ffrt_timer_start_0002", nullptr, ffrt_timer_start_0002, nullptr, nullptr, nullptr, napi_default, nullptr },
3916         { "ffrt_timer_cancel_0001", nullptr, ffrt_timer_cancel_0001, nullptr, nullptr, nullptr, napi_default, nullptr },
3917         { "ffrt_loop_0001", nullptr, ffrt_loop_0001, nullptr, nullptr, nullptr, napi_default, nullptr },
3918         { "ffrt_loop_0002", nullptr, ffrt_loop_0002, nullptr, nullptr, nullptr, napi_default, nullptr },
3919         { "ffrt_timer_start_abnormal_0001", nullptr, ffrt_timer_start_abnormal_0001, nullptr,
3920             nullptr, nullptr, napi_default, nullptr },
3921         { "ffrt_loop_abnormal_0001", nullptr, ffrt_loop_abnormal_0001, nullptr, nullptr, nullptr,
3922             napi_default, nullptr },
3923         { "ffrt_loop_abnormal_0002", nullptr, ffrt_loop_abnormal_0002, nullptr, nullptr, nullptr,
3924             napi_default, nullptr },
3925         { "ffrt_queue_parallel_api_0001", nullptr, ffrt_queue_parallel_api_0001, nullptr, nullptr,
3926             nullptr, napi_default,
3927             nullptr },
3928         { "ffrt_queue_parallel_api_0002", nullptr, ffrt_queue_parallel_api_0002, nullptr, nullptr,
3929             nullptr, napi_default, nullptr },
3930         { "ffrt_queue_parallel_api_0003", nullptr, ffrt_queue_parallel_api_0003, nullptr, nullptr,
3931             nullptr, napi_default, nullptr },
3932         { "ffrt_queue_parallel_api_0004", nullptr, ffrt_queue_parallel_api_0004, nullptr, nullptr,
3933             nullptr, napi_default, nullptr },
3934         { "queue_parallel_cancel_0001", nullptr, queue_parallel_cancel_0001, nullptr, nullptr,
3935             nullptr, napi_default, nullptr },
3936         { "queue_parallel_cancel_0002", nullptr, queue_parallel_cancel_0002, nullptr, nullptr,
3937             nullptr, napi_default, nullptr },
3938         { "queue_parallel_0001", nullptr, queue_parallel_0001, nullptr, nullptr, nullptr, napi_default, nullptr },
3939         { "queue_parallel_0002", nullptr, queue_parallel_0002, nullptr, nullptr, nullptr, napi_default, nullptr },
3940         { "ffrt_loop_abnormal_0003", nullptr, ffrt_loop_abnormal_0003, nullptr, nullptr,
3941             nullptr, napi_default, nullptr },
3942         { "ffrt_loop_normal_0003", nullptr, ffrt_loop_normal_0003, nullptr, nullptr,
3943             nullptr, napi_default, nullptr },
3944         { "ffrt_get_main_queue_0001", nullptr, ffrt_get_main_queue_0001, nullptr, nullptr,
3945             nullptr, napi_default, nullptr },
3946         { "ffrt_get_current_queue_0001", nullptr, ffrt_get_current_queue_0001, nullptr, nullptr,
3947             nullptr, napi_default, nullptr },
3948         { "ffrt_this_task_get_qos_0001", nullptr, ffrt_this_task_get_qos_0001, nullptr, nullptr,
3949             nullptr, napi_default, nullptr },
3950         { "ffrt_attr_stack_size_0001", nullptr, ffrt_attr_stack_size_0001, nullptr, nullptr,
3951             nullptr, napi_default, nullptr },
3952         { "ffrt_task_handle_ref_0001", nullptr, ffrt_task_handle_ref_0001, nullptr, nullptr,
3953             nullptr, napi_default, nullptr },
3954         { "ffrtThisTaskGetId", nullptr, FfrtThisTaskGetId, nullptr, nullptr, nullptr, napi_default, nullptr },
3955         { "ffrtThisTaskUpdateQos", nullptr, FfrtThisTaskUpdateQos, nullptr, nullptr, nullptr, napi_default, nullptr },
3956         { "sharedMutexTest001", nullptr, SharedMutexTest001, nullptr, nullptr, nullptr, napi_default, nullptr }
3957     };
3958     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
3959     return exports;
3960 }
3961 EXTERN_C_END
3962 
3963 static napi_module demoModule = {
3964     .nm_version =1,
3965     .nm_flags = 0,
3966     .nm_filename = nullptr,
3967     .nm_register_func = Init,
3968     .nm_modname = "entry",
3969     .nm_priv = ((void*)0),
3970     .reserved = { 0 },
3971 };
3972 
RegisterEntryModule(void)3973 extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
3974 {
3975     napi_module_register(&demoModule);
3976 }
3977