• 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 "fiber_utils.h"
27 #include <mutex>
28 #include <thread>
29 #include <string>
30 #include <unistd.h>
31 #include <pthread.h>
32 #include <sys/eventfd.h>
33 #define FAIL (-1)
34 #define SUCCESS 0
35 #define PARAM_100 100
36 
37 using namespace std;
38 using namespace std::chrono;
39 
40 const int ERR_CODE_1 = 1;
41 const int ERR_CODE_2 = 2;
42 const int ERR_CODE_3 = 3;
43 const int ERR_CODE_4 = 4;
44 const int ERR_CODE_5 = 5;
45 const int ERR_CODE_6 = 6;
46 const int ERR_CODE_7 = 7;
47 const int ERR_CODE_8 = 8;
48 const int ERR_CODE_9 = 9;
49 const uint64_t UNIT_STACK_SIZE = 2 * 1024 * 1024;
50 const uint64_t UNIT_TASK_DELAY = 200000;
51 const uint32_t TASK_SUBMIT_REF = 2;
52 const uint32_t TASK_RELEASE_REF = 3;
53 const uint32_t TASK_DELAY_TIME = 1000;
54 const int MULTIPLE_RADIO = 10;
55 const uint64_t PLUS_SLEEP_TIME = 200000;
56 const uint64_t FUNC_SIGNAL_SLEEP = 30000;
57 const uint64_t SLEEP_TIME = 2000;
58 const uint64_t UNIT_TASK_DELAY_500 = 500000;
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 = 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 = 2;
1089         }
1090         usleep(10 * 1000);
1091         x++;
1092         res = ffrt_rwlock_unlock(&rwlock);
1093         if (res != ffrt_success) {
1094             resultEnd = 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(2 * 1000);
1102         int res1 = ffrt_rwlock_rdlock(&rwlock);
1103         if (res1 != ffrt_success) {
1104             resultEnd = 4;
1105         }
1106         res1 = ffrt_rwlock_unlock(&rwlock);
1107         if (res1 != ffrt_success) {
1108             resultEnd = 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(2 * 1000);
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(2 * 1000);
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 = 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 
QueueApiTest014(napi_env env,napi_callback_info info)1532 static napi_value QueueApiTest014(napi_env env, napi_callback_info info)
1533 {
1534     int result = 0;
1535     // ffrt_queue_wait接口handle为异常值
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     if (queue_handle == nullptr) {
1540         result += 1;
1541     }
1542     int a = 0;
1543     ffrt_task_handle_t handle = ffrt_queue_submit_h_f(queue_handle, OnePlusForTest, &a, nullptr);
1544     ffrt_queue_wait(handle);
1545     if (a != 1) {
1546         result += 1;
1547     }
1548     // 销毁队列
1549     ffrt_queue_attr_destroy(&queue_attr);
1550     ffrt_task_handle_destroy(handle);
1551     ffrt_queue_destroy(queue_handle);
1552     napi_value flag = nullptr;
1553     napi_create_double(env, result, &flag);
1554     return flag;
1555 }
1556 
QueueApiTest015(napi_env env,napi_callback_info info)1557 static napi_value QueueApiTest015(napi_env env, napi_callback_info info)
1558 {
1559     int result = 0;
1560     // ffrt_queue_wait接口handle为异常值
1561     ffrt_queue_attr_t queue_attr;
1562     (void)ffrt_queue_attr_init(&queue_attr);
1563     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1564     if (queue_handle == nullptr) {
1565         result += 1;
1566     }
1567     int a = 0;
1568     ffrt_queue_submit_f(queue_handle, OnePlusForTest, &a, nullptr);
1569     usleep(SLEEP_TIME);
1570     if (a != 1) {
1571         result += 1;
1572     }
1573     // 销毁队列
1574     ffrt_queue_attr_destroy(&queue_attr);
1575     ffrt_queue_destroy(queue_handle);
1576     napi_value flag = nullptr;
1577     napi_create_double(env, result, &flag);
1578     return flag;
1579 }
1580 
QueueApiTest016(napi_env env,napi_callback_info info)1581 static napi_value QueueApiTest016(napi_env env, napi_callback_info info)
1582 {
1583     int result = 0;
1584     ffrt_queue_attr_t queue_attr;
1585     (void)ffrt_queue_attr_init(&queue_attr);
1586 
1587     ffrt_queue_attr_set_thread_mode(&queue_attr, true);
1588     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1589     if (queue_handle == nullptr) {
1590         result += 1;
1591     }
1592     int a = 0;
1593     std::function<void()>&& basicFunc = [&a]() {
1594         a += 1;
1595     };
1596     ffrt_queue_submit(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
1597     if (!ffrt_queue_attr_get_thread_mode(&queue_attr)) {
1598         result += 1;
1599     }
1600 
1601     // 销毁队列
1602     ffrt_queue_attr_destroy(&queue_attr);
1603     ffrt_queue_destroy(queue_handle);
1604     napi_value flag = nullptr;
1605     napi_create_double(env, result, &flag);
1606     return flag;
1607 }
1608 
QueueCancelTest001(napi_env env,napi_callback_info info)1609 static napi_value QueueCancelTest001(napi_env env, napi_callback_info info)
1610 {
1611     int result = 0;
1612     // cancel一个delay的未执行task
1613     ffrt_queue_attr_t queue_attr;
1614     (void)ffrt_queue_attr_init(&queue_attr);
1615     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1616 
1617     int a = 0;
1618     ffrt_task_attr_t task_attr;
1619     (void)ffrt_task_attr_init(&task_attr);
1620     ffrt_task_attr_set_delay(&task_attr, 1000000); // 设置任务1s后才执行
1621     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1622         ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), &task_attr);
1623 
1624     int ret = ffrt_queue_cancel(task1);
1625     if (ret != 0) {
1626         result = 2;
1627     }
1628     if (a != 0) {
1629         result = 3;
1630     }
1631 
1632     ffrt_task_attr_destroy(&task_attr);
1633     ffrt_task_handle_destroy(task1);
1634 
1635     // 销毁队列
1636     ffrt_queue_attr_destroy(&queue_attr);
1637     ffrt_queue_destroy(queue_handle);
1638     if (a != 0) {
1639         result = 4;
1640     }
1641     napi_value flag = nullptr;
1642     napi_create_double(env, result, &flag);
1643     return flag;
1644 }
1645 
QueueCancelTest003(napi_env env,napi_callback_info info)1646 static napi_value QueueCancelTest003(napi_env env, napi_callback_info info)
1647 {
1648     int result = 0;
1649     // cancel一个执行中task,ffrt的sleep
1650     ffrt_queue_attr_t queue_attr;
1651     (void)ffrt_queue_attr_init(&queue_attr);
1652     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1653 
1654     int a = 0;
1655     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1656         ffrt_create_function_wrapper(OnePlusSleepForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1657 
1658     usleep(2000);
1659     int ret = ffrt_queue_cancel(task1);
1660     if (ret != 1) {
1661         result = 2;
1662     }
1663     if (a != 0) {
1664         result = 3;
1665     }
1666     ffrt_task_handle_destroy(task1);
1667     if (a != 0) {
1668         result = 4;
1669     }
1670 
1671     // 销毁队列
1672     ffrt_queue_attr_destroy(&queue_attr);
1673     ffrt_queue_destroy(queue_handle);
1674     if (a != 1) {
1675         result = 5;
1676     }
1677     napi_value flag = nullptr;
1678     napi_create_double(env, result, &flag);
1679     return flag;
1680 }
1681 
QueueCancelTest004(napi_env env,napi_callback_info info)1682 static napi_value QueueCancelTest004(napi_env env, napi_callback_info info)
1683 {
1684     int result = 0;
1685     // cancel一个已执行的task
1686     ffrt_queue_attr_t queue_attr;
1687     (void)ffrt_queue_attr_init(&queue_attr);
1688     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1689 
1690     int a = 0;
1691     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1692         ffrt_create_function_wrapper(OnePlusForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1693     ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
1694         ffrt_create_function_wrapper(OnePlusSleepForTest, nullptr, &a, ffrt_function_kind_queue), nullptr);
1695 
1696     ffrt_queue_wait(task1);
1697     int ret = ffrt_queue_cancel(task1);
1698     if (ret != 1) {
1699         result = 2;
1700     }
1701     if (a != 1) {
1702         result = 3;
1703     }
1704     ffrt_queue_wait(task2);
1705     if (a != 2) {
1706         result = 4;
1707     }
1708     ffrt_task_handle_destroy(task1);
1709     ffrt_task_handle_destroy(task2);
1710 
1711     // 销毁队列
1712     ffrt_queue_attr_destroy(&queue_attr);
1713     ffrt_queue_destroy(queue_handle);
1714     napi_value flag = nullptr;
1715     napi_create_double(env, result, &flag);
1716     return flag;
1717 }
1718 
QueueDelayTest001(napi_env env,napi_callback_info info)1719 static napi_value QueueDelayTest001(napi_env env, napi_callback_info info)
1720 {
1721     int resultEnd = 0;
1722     // 验证delay时间的正确性,先提交一个非延时task,再提交一个delay 5s的task,再提交一个delay 2s的task
1723     int result = 0;
1724     ffrt_task_attr_t task_attr1;
1725     ffrt_task_attr_t task_attr2;
1726     (void)ffrt_task_attr_init(&task_attr1);
1727     (void)ffrt_task_attr_init(&task_attr2);
1728     ffrt_task_attr_set_delay(&task_attr1, UNIT_TASK_DELAY_500);
1729     ffrt_task_attr_set_delay(&task_attr2, UNIT_TASK_DELAY);
1730 
1731     std::function<void()>&& MultipleFunc = [&result]() { MultipleForTest(static_cast<void*>(&result)); };
1732     ffrt_queue_attr_t queue_attr;
1733     (void)ffrt_queue_attr_init(&queue_attr);
1734     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1735     ffrt_queue_submit(queue_handle, create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), nullptr);
1736     double t;
1737     auto start = std::chrono::high_resolution_clock::now();
1738     std::function<void()>&& OnePlusFunc = [&result]() { OnePlusForTest(static_cast<void*>(&result)); };
1739     std::function<void()>&& OneSubFunc = [&result]() { SubForTest(static_cast<void*>(&result)); };
1740     ffrt_task_handle_t handle1 = ffrt_queue_submit_h(queue_handle,
1741         create_function_wrapper(OneSubFunc, ffrt_function_kind_queue), &task_attr1);
1742     ffrt_task_handle_t handle2 = ffrt_queue_submit_h(queue_handle,
1743         create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr2);
1744 
1745     ffrt_queue_wait(handle2);
1746     auto end = std::chrono::high_resolution_clock::now();
1747     std::chrono::duration<double, std::milli> elapsed = end-start;
1748     t = elapsed.count();
1749     if (result != 1) {
1750         resultEnd = 1;
1751     }
1752     if (t <= COST_TIME_200 || t >= COST_TIME_300) {
1753         resultEnd = 2;
1754     }
1755 
1756     ffrt_queue_wait(handle1);
1757     end = std::chrono::high_resolution_clock::now();
1758     elapsed = end-start;
1759     t = elapsed.count();
1760     if (result != 0) {
1761         resultEnd = 3;
1762     }
1763     if (t <= COST_TIME_500 || t >= COST_TIME_600) {
1764         resultEnd = 4;
1765     }
1766     ffrt_task_handle_destroy(handle1);
1767     ffrt_task_handle_destroy(handle2);
1768     ffrt_queue_attr_destroy(&queue_attr);
1769     ffrt_queue_destroy(queue_handle);
1770     napi_value flag = nullptr;
1771     napi_create_double(env, resultEnd, &flag);
1772     return flag;
1773 }
1774 
QueueDelayTest002(napi_env env,napi_callback_info info)1775 static napi_value QueueDelayTest002(napi_env env, napi_callback_info info)
1776 {
1777     int result = 0;
1778     // 验证delay时间的正确性,提交一个delay 5ms的task
1779     ffrt_queue_attr_t queue_attr;
1780     (void)ffrt_queue_attr_init(&queue_attr);
1781     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1782 
1783     int a = 0;
1784     ffrt_task_attr_t task_attr;
1785     (void)ffrt_task_attr_init(&task_attr);
1786     ffrt_task_attr_set_delay(&task_attr, 5000); // 设置任务5ms后才执行
1787 
1788     double t;
1789     auto start = std::chrono::high_resolution_clock::now();
1790     std::function<void()>&& OnePlusFunc = [&a]() { OnePlusForTest((void *)(&a)); };
1791     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1792         create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr);
1793     ffrt_queue_wait(task1);
1794     auto end = std::chrono::high_resolution_clock::now();
1795     std::chrono::duration<double, std::micro> elapsed = end-start;
1796     t = elapsed.count();
1797     if (a != 1) {
1798         result = 1;
1799     }
1800     if (t <= 5000 || t >= 10000) {
1801         result = 2;
1802     }
1803     uint64_t delay = ffrt_task_attr_get_delay(&task_attr);
1804     if (delay != 5000) {
1805         result = 3;
1806     }
1807     ffrt_task_attr_destroy(&task_attr);
1808     ffrt_task_handle_destroy(task1);
1809     ffrt_queue_attr_destroy(&queue_attr);
1810     ffrt_queue_destroy(queue_handle);
1811     napi_value flag = nullptr;
1812     napi_create_double(env, result, &flag);
1813     return flag;
1814 }
1815 
QueueDelayTest005(napi_env env,napi_callback_info info)1816 static napi_value QueueDelayTest005(napi_env env, napi_callback_info info)
1817 {
1818     int result = 0;
1819     // 等待delay任务时提交一个task可以快速调度
1820     ffrt_queue_attr_t queue_attr;
1821     (void)ffrt_queue_attr_init(&queue_attr);
1822     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1823 
1824     int a = 0;
1825     ffrt_task_attr_t task_attr;
1826     (void)ffrt_task_attr_init(&task_attr);
1827     ffrt_task_attr_set_delay(&task_attr, UNIT_TASK_DELAY_500);
1828     std::function<void()>&& MultipleFunc = [&a]() { MultipleForTest(static_cast<void*>(&a)); };
1829     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
1830         create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), &task_attr);
1831 
1832     double t;
1833     auto start = std::chrono::high_resolution_clock::now();
1834     std::function<void()>&& OnePlusFunc = [&a]() { OnePlusForTest(static_cast<void*>(&a)); };
1835     ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
1836         create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), nullptr);
1837     ffrt_queue_wait(task2);
1838     auto end = std::chrono::high_resolution_clock::now();
1839     std::chrono::duration<double, std::milli> elapsed = end-start;
1840     t = elapsed.count();
1841     if (a != 1) {
1842         result = 1;
1843     }
1844     OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT QUEUE", "test2 cost %{public}f ms", t);
1845     ffrt_queue_wait(task1);
1846     if (a != 10) {
1847         result = 3;
1848     }
1849     uint64_t delay = ffrt_task_attr_get_delay(&task_attr);
1850     if (delay != UNIT_TASK_DELAY_500) {
1851         result = 4;
1852     }
1853     ffrt_task_attr_destroy(&task_attr);
1854     ffrt_task_handle_destroy(task1);
1855     ffrt_task_handle_destroy(task2);
1856 
1857     // 销毁队列
1858     ffrt_queue_attr_destroy(&queue_attr);
1859     ffrt_queue_destroy(queue_handle);
1860     napi_value flag = nullptr;
1861     napi_create_double(env, result, &flag);
1862     return flag;
1863 }
1864 
QueueDfxTest001(napi_env env,napi_callback_info info)1865 static napi_value QueueDfxTest001(napi_env env, napi_callback_info info)
1866 {
1867     int result = 0;
1868     // ffrt_queue_attr_set_timeout接口attr为异常值
1869     ffrt_queue_attr_t queue_attr;
1870     (void)ffrt_queue_attr_init(&queue_attr);
1871     ffrt_queue_attr_set_timeout(nullptr, 10000);
1872     uint64_t time = ffrt_queue_attr_get_timeout(&queue_attr);
1873     if (time != 0) {
1874         result = 1;
1875     }
1876     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1877     if (queue_handle == nullptr) {
1878         result = 2;
1879     }
1880     // 销毁队列
1881     ffrt_queue_attr_destroy(&queue_attr);
1882     ffrt_queue_destroy(queue_handle);
1883     napi_value flag = nullptr;
1884     napi_create_double(env, result, &flag);
1885     return flag;
1886 }
1887 
QueueDfxTest002(napi_env env,napi_callback_info info)1888 static napi_value QueueDfxTest002(napi_env env, napi_callback_info info)
1889 {
1890     int result = 0;
1891     // ffrt_queue_attr_get_timeout接口attr为异常值
1892     ffrt_queue_attr_t queue_attr;
1893     (void)ffrt_queue_attr_init(&queue_attr);
1894     ffrt_queue_attr_set_timeout(&queue_attr, 10000);
1895     uint64_t time = ffrt_queue_attr_get_timeout(nullptr);
1896     if (time != 0) {
1897         result = 1;
1898     }
1899     time = ffrt_queue_attr_get_timeout(&queue_attr);
1900     if (time != 10000) {
1901         result = 2;
1902     }
1903     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1904     if (queue_handle == nullptr) {
1905         result = 3;
1906     }
1907 
1908     // 销毁队列
1909     ffrt_queue_attr_destroy(&queue_attr);
1910     ffrt_queue_destroy(queue_handle);
1911     napi_value flag = nullptr;
1912     napi_create_double(env, result, &flag);
1913     return flag;
1914 }
1915 
QueueDfxTest003(napi_env env,napi_callback_info info)1916 static napi_value QueueDfxTest003(napi_env env, napi_callback_info info)
1917 {
1918     int result = 0;
1919     // ffrt_queue_attr_set_callback接口attr为异常值
1920     int end = 0;
1921     std::function<void()> cbOne = [&end]() {
1922         end++;
1923     };
1924     ffrt_queue_attr_t queue_attr;
1925     (void)ffrt_queue_attr_init(&queue_attr);
1926     ffrt_queue_attr_set_callback(nullptr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
1927     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1928     if (queue_handle == nullptr) {
1929         result = 3;
1930     }
1931 
1932     // 销毁队列
1933     ffrt_queue_attr_destroy(&queue_attr);
1934     ffrt_queue_destroy(queue_handle);
1935     napi_value flag = nullptr;
1936     napi_create_double(env, result, &flag);
1937     return flag;
1938 }
1939 
QueueDfxTest004(napi_env env,napi_callback_info info)1940 static napi_value QueueDfxTest004(napi_env env, napi_callback_info info)
1941 {
1942     int result = 0;
1943     int end = 0;
1944     std::function<void()> cbOne = [&end]() {
1945         end++;
1946     };
1947     ffrt_queue_attr_t queue_attr;
1948     (void)ffrt_queue_attr_init(&queue_attr);
1949     ffrt_queue_attr_set_callback(&queue_attr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
1950     ffrt_function_header_t* func = ffrt_queue_attr_get_callback(nullptr);
1951     if (func != nullptr) {
1952         result = 1;
1953     }
1954     func = ffrt_queue_attr_get_callback(&queue_attr);
1955     if (func == nullptr) {
1956         result = 2;
1957     }
1958     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1959     if (queue_handle == nullptr) {
1960         result = 3;
1961     }
1962 
1963     // 销毁队列
1964     ffrt_queue_destroy(queue_handle);
1965     ffrt_queue_attr_destroy(&queue_attr);
1966     napi_value flag = nullptr;
1967     napi_create_double(env, result, &flag);
1968     return flag;
1969 }
1970 
QueueDfxTest005(napi_env env,napi_callback_info info)1971 static napi_value QueueDfxTest005(napi_env env, napi_callback_info info)
1972 {
1973     int resultEnd = 0;
1974     int x = 0;
1975     int end = 0;
1976     std::function<void()> cbOne = [&end]() {
1977         end++;
1978     };
1979     ffrt_queue_attr_t queue_attr;
1980     (void)ffrt_queue_attr_init(&queue_attr);
1981     ffrt_queue_attr_set_timeout(&queue_attr, 10000);
1982     ffrt_queue_attr_set_callback(&queue_attr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
1983     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
1984     std::function<void()>&& basicFunc1 = [&] {
1985         x++;
1986         usleep(500 * 1000);
1987     };
1988     ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
1989         create_function_wrapper(basicFunc1, ffrt_function_kind_queue), nullptr);
1990     ffrt_queue_wait(handle);
1991     if (x != 1) {
1992         resultEnd = 1;
1993     }
1994     if (end != 1) {
1995         resultEnd = 2;
1996     }
1997 
1998     std::function<void()>&& basicFunc2 = [&] {
1999         x++;
2000         ffrt_usleep(500 * 1000);
2001     };
2002     ffrt_task_handle_t handle1 = ffrt_queue_submit_h(queue_handle,
2003         create_function_wrapper(basicFunc2, ffrt_function_kind_queue), nullptr);
2004     ffrt_queue_wait(handle1);
2005     if (x != 2) {
2006         resultEnd = 3;
2007     }
2008     if (end != 2) {
2009         resultEnd = 4;
2010     }
2011 
2012     ffrt_task_handle_destroy(handle);
2013     ffrt_task_handle_destroy(handle1);
2014     ffrt_queue_attr_destroy(&queue_attr);
2015     ffrt_queue_destroy(queue_handle);
2016     napi_value flag = nullptr;
2017     napi_create_double(env, resultEnd, &flag);
2018     return flag;
2019 }
2020 
QueueDfxTest006(napi_env env,napi_callback_info info)2021 static napi_value QueueDfxTest006(napi_env env, napi_callback_info info)
2022 {
2023     int resultEnd = 0;
2024     int x = 0;
2025     int end = 0;
2026     std::function<void()> cbOne = [&end]() {
2027         end++;
2028     };
2029     ffrt_queue_attr_t queue_attr;
2030     (void)ffrt_queue_attr_init(&queue_attr);
2031     ffrt_queue_attr_set_timeout(&queue_attr, 10000);
2032     ffrt_queue_attr_set_callback(&queue_attr, create_function_wrapper(cbOne, ffrt_function_kind_queue));
2033     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
2034 
2035     ffrt_task_handle_t handle[5];
2036     std::function<void()>&& basicFunc = [&] {
2037             x++;
2038     };
2039     for (int i = 0; i < 5; ++i) {
2040         handle[i] = ffrt_queue_submit_h(queue_handle,
2041             create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
2042     }
2043     ffrt_queue_wait(handle[4]);
2044     if (x != 5) {
2045         resultEnd = 1;
2046     }
2047     if (end != 0) {
2048         resultEnd = 2;
2049     }
2050     for (int i = 0; i < 5; i++) {
2051         ffrt_task_handle_destroy(handle[i]);
2052     }
2053     ffrt_queue_attr_destroy(&queue_attr);
2054     ffrt_queue_destroy(queue_handle);
2055     napi_value flag = nullptr;
2056     napi_create_double(env, resultEnd, &flag);
2057     return flag;
2058 }
2059 
QueueTest001(napi_env env,napi_callback_info info)2060 static napi_value QueueTest001(napi_env env, napi_callback_info info)
2061 {
2062     ffrt_queue_attr_t queue_attr;
2063     (void)ffrt_queue_attr_init(&queue_attr);
2064     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
2065     int result = 0;
2066     ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(OnePlusForTest, nullptr, &result,
2067         ffrt_function_kind_queue), nullptr);
2068     ffrt_queue_submit(queue_handle, ffrt_create_function_wrapper(MultipleForTest, nullptr, &result,
2069         ffrt_function_kind_queue), nullptr);
2070     ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
2071         ffrt_create_function_wrapper(SubForTest, nullptr, &result, ffrt_function_kind_queue), nullptr);
2072     ffrt_queue_wait(handle);
2073     ffrt_task_handle_destroy(handle);
2074     napi_value flag = nullptr;
2075     napi_create_double(env, result, &flag);
2076     ffrt_queue_attr_destroy(&queue_attr);
2077     ffrt_queue_destroy(queue_handle);
2078     return flag;
2079 }
2080 
QueueTest002(napi_env env,napi_callback_info info)2081 static napi_value QueueTest002(napi_env env, napi_callback_info info)
2082 {
2083     const int maxNum = (int)ffrt_qos_user_initiated + 1;
2084     ffrt_queue_attr_t queue_attr[maxNum];
2085     ffrt_queue_t queue_handle[maxNum];
2086     for (int num = 0; num < maxNum; num++) {
2087         (void)ffrt_queue_attr_init(&queue_attr[num]);
2088         ffrt_queue_attr_set_qos(&queue_attr[num], num);
2089         queue_handle[num] = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr[num]);
2090     }
2091 
2092     int a = 0;
2093     int result[maxNum] = {0};
2094     ffrt_task_handle_t task[maxNum][10];
2095     for (int i = 0; i < 10; i++) {
2096         for (int num = 0; num < maxNum; num++) {
2097             task[num][i] = ffrt_queue_submit_h(queue_handle[num],
2098                 ffrt_create_function_wrapper(OnePlusForTest, NULL, &result[num], ffrt_function_kind_queue), nullptr);
2099         }
2100     }
2101     for (int num = 0; num < maxNum; num++) {
2102         ffrt_queue_wait(task[num][9]);
2103         OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT QUEUE", "result in queue %{public}d is %{public}d", num, result[num]);
2104         if (result[num] != 10) {
2105             a = 1;
2106         }
2107     }
2108     for (int i = 0; i < 10; i++) {
2109         for (int num = 0; num < maxNum; num++) {
2110             ffrt_task_handle_destroy(task[num][i]);
2111         }
2112     }
2113     for (int num = 0; num < maxNum; num++) {
2114         OH_LOG_Print(LOG_APP, LOG_INFO, 1, "FFRT QUEUE", "qos in queue task %{public}d is %{public}d", num,
2115             ffrt_queue_attr_get_qos(&queue_attr[num]));
2116         if (ffrt_queue_attr_get_qos(&queue_attr[num]) != num) {
2117             a = 1;
2118         }
2119         ffrt_queue_attr_destroy(&queue_attr[num]);
2120         ffrt_queue_destroy(queue_handle[num]);
2121     }
2122     napi_value flag = nullptr;
2123     napi_create_double(env, a, &flag);
2124     return flag;
2125 }
2126 
QueueTest003(napi_env env,napi_callback_info info)2127 static napi_value QueueTest003(napi_env env, napi_callback_info info)
2128 {
2129     int resultEnd = 0;
2130     // 创建多个相同qos队列,分别调度执行task
2131     ffrt_queue_attr_t queue_attr;
2132     (void)ffrt_queue_attr_init(&queue_attr);
2133     ffrt_queue_t queue_handle[10];
2134     for (int num = 0; num < 10; num++) {
2135         queue_handle[num] = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
2136     }
2137 
2138     int result[10] = {0};
2139     void *addr;
2140     ffrt_task_handle_t task[10][10];
2141     for (int i = 0; i < 10; i++) {
2142         for (int num = 0; num < 10; num++) {
2143             addr = static_cast<void *>(&result[num]);
2144             std::function<void()> basicFunc = [=]() { OnePlusForTest(addr); };
2145             task[num][i] = ffrt_queue_submit_h(queue_handle[num],
2146                 create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
2147         }
2148     }
2149     for (int num = 0; num < 10; num++) {
2150         ffrt_queue_wait(task[num][9]);
2151         if (result[num] != 10) {
2152             resultEnd = num + 1;
2153         }
2154     }
2155 
2156     for (int i = 0; i < 10; i++) {
2157         for (int num = 0; num < 10; num++) {
2158             ffrt_task_handle_destroy(task[num][i]);
2159         }
2160     }
2161 
2162     ffrt_queue_attr_destroy(&queue_attr);
2163     for (int num = 0; num < 10; num++) {
2164         ffrt_queue_destroy(queue_handle[num]);
2165     }
2166     napi_value flag = nullptr;
2167     napi_create_double(env, resultEnd, &flag);
2168     return flag;
2169 }
2170 
QueueWaitTest001(napi_env env,napi_callback_info info)2171 static napi_value QueueWaitTest001(napi_env env, napi_callback_info info)
2172 {
2173     int result = 0;
2174     // wait一个delay的未执行task
2175     ffrt_queue_attr_t queue_attr;
2176     (void)ffrt_queue_attr_init(&queue_attr);
2177     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
2178 
2179     int a = 0;
2180     ffrt_task_attr_t task_attr;
2181     (void)ffrt_task_attr_init(&task_attr);
2182     ffrt_task_attr_set_delay(&task_attr, UNIT_TASK_DELAY);
2183     std::function<void()>&& OnePlusFunc = [&a]() { OnePlusForTest(static_cast<void*>(&a)); };
2184     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
2185         create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr);
2186 
2187     ffrt_queue_wait(task1);
2188     if (a != 1) {
2189         result = 1;
2190     }
2191 
2192     ffrt_task_attr_destroy(&task_attr);
2193     ffrt_task_handle_destroy(task1);
2194 
2195     // 销毁队列
2196     ffrt_queue_attr_destroy(&queue_attr);
2197     ffrt_queue_destroy(queue_handle);
2198     napi_value flag = nullptr;
2199     napi_create_double(env, result, &flag);
2200     return flag;
2201 }
2202 
SubmitAbnormalTest(napi_env env,napi_callback_info info)2203 static napi_value SubmitAbnormalTest(napi_env env, napi_callback_info info)
2204 {
2205     int result = 0;
2206     int x = 0;
2207     std::function<void()>&& func = [&]() { x = x + 1;};
2208     const std::vector<ffrt_dependence_t> in_deps = {{ffrt_dependence_data, &x}};
2209     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
2210     const std::vector<ffrt_dependence_t> out_deps = {{ffrt_dependence_data, &x}};
2211     ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
2212     ffrt_function_header_t* ffrt_header_t = create_function_wrapper((func));
2213 
2214     ffrt_submit_base(nullptr, &in, &out, nullptr);
2215     ffrt_submit_h_base(nullptr, &in, &out, nullptr);
2216     ffrt_task_handle_destroy(nullptr);
2217     ffrt_submit_base(ffrt_header_t, &in, &out, nullptr);
2218     ffrt_wait();
2219     if (x != 1) {
2220         result = 1;
2221     }
2222     napi_value flag = nullptr;
2223     napi_create_double(env, result, &flag);
2224     return flag;
2225 }
2226 
SubmitBasicTest001(napi_env env,napi_callback_info info)2227 static napi_value SubmitBasicTest001(napi_env env, napi_callback_info info)
2228 {
2229     int result = 0;
2230     int x = 0;
2231     std::function<void()>&& func = [&]() { x = x + 1;};
2232     const std::vector<ffrt_dependence_t> in_deps = {{ffrt_dependence_data, &x}};
2233     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
2234     const std::vector<ffrt_dependence_t> out_deps = {{ffrt_dependence_data, &x}};
2235     ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
2236     ffrt_function_header_t* ffrt_header_t = create_function_wrapper((func));
2237     ffrt_submit_base(ffrt_header_t, &in, &out, nullptr);
2238     ffrt_wait();
2239     if (x != 1) {
2240         result = 1;
2241     }
2242     napi_value flag = nullptr;
2243     napi_create_double(env, result, &flag);
2244     return flag;
2245 }
2246 
SubmitBasicTest002(napi_env env,napi_callback_info info)2247 static napi_value SubmitBasicTest002(napi_env env, napi_callback_info info)
2248 {
2249     int result = 0;
2250     const uint32_t sleepTime = 5 * 1000;
2251     int a = 0;
2252     ffrt_task_attr_t attr;
2253     ffrt_task_attr_init(&attr);
2254     ffrt_submit_base(ffrt_create_function_wrapper(OnePlusForTest, NULL, &a), NULL, NULL, &attr);
2255     ffrt_wait();
2256     usleep(sleepTime);
2257     if (a != 1) {
2258         result = 3;
2259     }
2260     ffrt_task_attr_destroy(&attr);
2261     napi_value flag = nullptr;
2262     napi_create_double(env, result, &flag);
2263     return flag;
2264 }
2265 
SubmitInDependEmptyTest(napi_env env,napi_callback_info info)2266 static napi_value SubmitInDependEmptyTest(napi_env env, napi_callback_info info)
2267 {
2268     int result = 0;
2269     const uint32_t sleepTime = 10 * 1000;
2270     int x = 0;
2271     int y = 0;
2272     std::function<void()>&& basic1Func = [&]() {
2273         x = x + 1;
2274         usleep(sleepTime);
2275     };
2276     std::function<void()>&& basic2Func = [&]() {
2277         y = y + 1;
2278         usleep(sleepTime);
2279     };
2280     ffrt_task_attr_t attr1;
2281     ffrt_task_attr_init(&attr1);
2282     ffrt_task_attr_set_qos(&attr1, static_cast<int>(ffrt_qos_background));
2283     ffrt_task_attr_t attr2;
2284     ffrt_task_attr_init(&attr2);
2285     ffrt_task_attr_set_qos(&attr2, static_cast<int>(ffrt_qos_utility));
2286     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2287     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2288     const std::vector<ffrt_dependence_t> in1_deps = {};
2289     ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2290     const std::vector<ffrt_dependence_t> in2_deps = {};
2291     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2292     ffrt_submit_base(basic1Func_ht, &in1, nullptr, &attr1);
2293     ffrt_submit_base(basic2Func_ht, &in2, nullptr, &attr2);
2294     ffrt_wait();
2295     if (x != 1) {
2296         result = 1;
2297     }
2298     if (y != 1) {
2299         result = 2;
2300     }
2301     ffrt_task_attr_destroy(&attr1);
2302     ffrt_task_attr_destroy(&attr2);
2303     napi_value flag = nullptr;
2304     napi_create_double(env, result, &flag);
2305     return flag;
2306 }
2307 
SubmitInDependNullptrTest(napi_env env,napi_callback_info info)2308 static napi_value SubmitInDependNullptrTest(napi_env env, napi_callback_info info)
2309 {
2310     int result = 0;
2311     const uint32_t sleepTime = 10 * 1000;
2312     int x = 0;
2313     int y = 0;
2314     std::function<void()>&& basic1Func = [&]() {
2315         x = x + 1;
2316         usleep(sleepTime);
2317     };
2318     std::function<void()>&& basic2Func = [&]() {
2319         y = y + 1;
2320         usleep(sleepTime);
2321     };
2322     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2323     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2324     const std::vector<ffrt_dependence_t> in1_deps = {{ffrt_dependence_data, NULL}};
2325     ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2326     const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, NULL}};
2327     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2328     ffrt_submit_base(basic1Func_ht, &in1, nullptr, nullptr);
2329     ffrt_submit_base(basic2Func_ht, &in2, nullptr, nullptr);
2330     ffrt_wait();
2331     if (x != 1) {
2332         result = 1;
2333     }
2334     if (y != 1) {
2335         result = 2;
2336     }
2337     napi_value flag = nullptr;
2338     napi_create_double(env, result, &flag);
2339     return flag;
2340 }
2341 
SubmitOuDependEmptyTest(napi_env env,napi_callback_info info)2342 static napi_value SubmitOuDependEmptyTest(napi_env env, napi_callback_info info)
2343 {
2344     int result = 0;
2345     const uint32_t sleepTime = 10 * 1000;
2346     int x = 0;
2347     int y = 0;
2348     std::function<void()>&& basic1Func = [&]() {
2349         x = x + 1;
2350         usleep(sleepTime);
2351     };
2352     std::function<void()>&& basic2Func = [&]() {
2353         y = y + 1;
2354         usleep(sleepTime);
2355     };
2356     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2357     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2358     const std::vector<ffrt_dependence_t> in1_deps = {};
2359     ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2360     const std::vector<ffrt_dependence_t> in2_deps = {};
2361     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2362     const std::vector<ffrt_dependence_t> ou1_deps = {};
2363     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2364     const std::vector<ffrt_dependence_t> ou2_deps = {};
2365     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2366     ffrt_submit_base(basic1Func_ht, &in1, &ou1, nullptr);
2367     ffrt_submit_base(basic2Func_ht, &in2, &ou2, nullptr);
2368     ffrt_wait();
2369     if (x != 1) {
2370         result = 1;
2371     }
2372     if (y != 1) {
2373         result = 2;
2374     }
2375     napi_value flag = nullptr;
2376     napi_create_double(env, result, &flag);
2377     return flag;
2378 }
2379 
SubmitOuDependNullptrTest(napi_env env,napi_callback_info info)2380 static napi_value SubmitOuDependNullptrTest(napi_env env, napi_callback_info info)
2381 {
2382     int result = 0;
2383     const uint32_t sleepTime = 10 * 1000;
2384     int x = 0;
2385     int y = 0;
2386     std::function<void()>&& basic1Func = [&]() {
2387         x = x + 1;
2388         usleep(sleepTime);
2389         if (y != 0) {
2390             result = 1;
2391         }
2392     };
2393     std::function<void()>&& basic2Func = [&]() {
2394         y = y + 1;
2395         usleep(sleepTime);
2396         if (x != 1) {
2397             result = 2;
2398         }
2399     };
2400     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2401     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2402     const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, NULL}};
2403     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2404     const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, NULL}};
2405     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2406     ffrt_submit_base(basic1Func_ht, nullptr, &ou1, nullptr);
2407     ffrt_submit_base(basic2Func_ht, nullptr, &ou2, nullptr);
2408     ffrt_wait();
2409     if (x != 1) {
2410         result = 3;
2411     }
2412     if (y != 1) {
2413         result = 4;
2414     }
2415     napi_value flag = nullptr;
2416     napi_create_double(env, result, &flag);
2417     return flag;
2418 }
2419 
SubmitIODependTest001(napi_env env,napi_callback_info info)2420 static napi_value SubmitIODependTest001(napi_env env, napi_callback_info info)
2421 {
2422     int result = 0;
2423     int x = 0;
2424     int y = 0;
2425     int z = 0;
2426     std::function<void()>&& basic1Func = [&]() {
2427         ffrt_usleep(10 * 1000);
2428         x = x + 1;
2429     };
2430     std::function<void()>&& basic2Func = [&]() {
2431         ffrt_usleep(5 * 1000);
2432         y = y + 1;
2433     };
2434     std::function<void()>&& basic3Func = [&]() {
2435         z = x + y;
2436     };
2437     const std::vector<ffrt_dependence_t> in3_deps = {{ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2438     ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2439     const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}};
2440     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2441     const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &y}};
2442     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2443     const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &z}};
2444     ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2445     ffrt_submit_base(create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2446     ffrt_submit_base(create_function_wrapper(basic2Func), nullptr, &ou2, nullptr);
2447     ffrt_submit_base(create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2448     ffrt_wait();
2449     if (z != 2) {
2450         result = 1;
2451     }
2452     napi_value flag = nullptr;
2453     napi_create_double(env, result, &flag);
2454     return flag;
2455 }
2456 
SubmitIODependTest002(napi_env env,napi_callback_info info)2457 static napi_value SubmitIODependTest002(napi_env env, napi_callback_info info)
2458 {
2459     int result = 0;
2460     int x = 0;
2461     int y = 0;
2462     int z = 0;
2463     int t = 0;
2464     std::function<void()>&& basic1Func = [&]() {
2465         usleep(10 * 1000);
2466         x = x + 1;
2467         y = y + 1;
2468     };
2469     std::function<void()>&& basic2Func = [&]() {
2470         z = x * 5;
2471     };
2472     std::function<void()>&& basic3Func = [&]() {
2473         t = y * 10;
2474     };
2475     const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, &x}};
2476     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2477     const std::vector<ffrt_dependence_t> in3_deps = {{ffrt_dependence_data, &y}};
2478     ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2479     const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2480     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2481     const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &z}};
2482     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2483     const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &t}};
2484     ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2485     ffrt_submit_base(create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2486     ffrt_submit_base(create_function_wrapper(basic2Func), &in2, &ou2, nullptr);
2487     ffrt_submit_base(create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2488     ffrt_wait();
2489     if (z != 5) {
2490         result = 1;
2491     }
2492     if (t != 10) {
2493         result = 2;
2494     }
2495     napi_value flag = nullptr;
2496     napi_create_double(env, result, &flag);
2497     return flag;
2498 }
2499 
SubmitHIODependTest001(napi_env env,napi_callback_info info)2500 static napi_value SubmitHIODependTest001(napi_env env, napi_callback_info info)
2501 {
2502     int result = 0;
2503     int x = 0;
2504     int y = 0;
2505     int z = 0;
2506     std::function<void()>&& basic1Func = [&]() {
2507         ffrt_usleep(10 * 1000);
2508         x = x + 1;
2509     };
2510     std::function<void()>&& basic2Func = [&]() {
2511         ffrt_usleep(5 * 1000);
2512         y = y + 1;
2513     };
2514     std::function<void()>&& basic3Func = [&]() {
2515         z = x + y;
2516     };
2517     const std::vector<ffrt_dependence_t> in3_deps = {
2518         {ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2519     ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2520     const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}};
2521     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2522     const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &y}};
2523     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2524     const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &z}};
2525     ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2526     ffrt_task_handle_t task1 = ffrt_submit_h_base(
2527         create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2528     ffrt_task_handle_t task2 = ffrt_submit_h_base(
2529         create_function_wrapper(basic2Func), nullptr, &ou2, nullptr);
2530     ffrt_task_handle_t task3 = ffrt_submit_h_base(
2531         create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2532     const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task3}};
2533     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2534     ffrt_wait_deps(&wait);
2535     if (z != 2) {
2536         result = 1;
2537     }
2538     ffrt_task_handle_destroy(task1);
2539     ffrt_task_handle_destroy(task2);
2540     ffrt_task_handle_destroy(task3);
2541     napi_value flag = nullptr;
2542     napi_create_double(env, result, &flag);
2543     return flag;
2544 }
2545 
SubmitHIODependTest002(napi_env env,napi_callback_info info)2546 static napi_value SubmitHIODependTest002(napi_env env, napi_callback_info info)
2547 {
2548     int result = 0;
2549     int x = 0;
2550     int y = 0;
2551     int z = 0;
2552     int t = 0;
2553     std::function<void()>&& basic1Func = [&]() {
2554         usleep(10 * 1000);
2555         x = x + 1;
2556         y = y + 1;
2557     };
2558     std::function<void()>&& basic2Func = [&]() {
2559         z = x * 5;
2560     };
2561     std::function<void()>&& basic3Func = [&]() {
2562         t = y * 10;
2563     };
2564     const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, &x}};
2565     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2566     const std::vector<ffrt_dependence_t> in3_deps = {{ffrt_dependence_data, &y}};
2567     ffrt_deps_t in3{static_cast<uint32_t>(in3_deps.size()), in3_deps.data()};
2568     const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, &x}, {ffrt_dependence_data, &y}};
2569     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2570     const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, &z}};
2571     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2572     const std::vector<ffrt_dependence_t> ou3_deps = {{ffrt_dependence_data, &t}};
2573     ffrt_deps_t ou3{static_cast<uint32_t>(ou3_deps.size()), ou3_deps.data()};
2574     ffrt_task_handle_t task1 = ffrt_submit_h_base(create_function_wrapper(basic1Func), nullptr, &ou1, nullptr);
2575     ffrt_task_handle_t task2 = ffrt_submit_h_base(create_function_wrapper(basic2Func), &in2, &ou2, nullptr);
2576     ffrt_task_handle_t task3 = ffrt_submit_h_base(create_function_wrapper(basic3Func), &in3, &ou3, nullptr);
2577     const std::vector<ffrt_dependence_t> wait2_deps = {{ffrt_dependence_task, task2}};
2578     ffrt_deps_t wait2{static_cast<uint32_t>(wait2_deps.size()), wait2_deps.data()};
2579     ffrt_wait_deps(&wait2);
2580     if (z != 5) {
2581         result = 1;
2582     }
2583     const std::vector<ffrt_dependence_t> wait3_deps = {{ffrt_dependence_task, task3}};
2584     ffrt_deps_t wait3{static_cast<uint32_t>(wait3_deps.size()), wait3_deps.data()};
2585     ffrt_wait_deps(&wait3);
2586     if (t != 10) {
2587         result = 2;
2588     }
2589     ffrt_task_handle_destroy(task1);
2590     ffrt_task_handle_destroy(task2);
2591     ffrt_task_handle_destroy(task3);
2592     napi_value flag = nullptr;
2593     napi_create_double(env, result, &flag);
2594     return flag;
2595 }
2596 
SubmitIn0Ou0WaitNullTask1Test(napi_env env,napi_callback_info info)2597 static napi_value SubmitIn0Ou0WaitNullTask1Test(napi_env env, napi_callback_info info)
2598 {
2599     int result = 0;
2600     const uint32_t sleepTime = 30 * 1000;
2601     int x = 0;
2602     ffrt_task_attr_t attr;
2603     ffrt_task_attr_init(&attr);
2604     std::function<void()>&& basicFunc = [&]() {
2605         if (x != 0) {
2606             result = 1;
2607         }
2608         usleep(sleepTime);
2609         x = x + 1;
2610     };
2611     ffrt_function_header_t* basicFunc_ht = create_function_wrapper((basicFunc));
2612     const std::vector<ffrt_dependence_t> in_deps = {};
2613     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
2614     const std::vector<ffrt_dependence_t> ou_deps = {};
2615     ffrt_deps_t ou{static_cast<uint32_t>(ou_deps.size()), ou_deps.data()};
2616     const std::vector<ffrt_dependence_t> wait_deps = {};
2617     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2618     const ffrt_deps_t *wait_null = nullptr;
2619     ffrt_submit_base(basicFunc_ht, &in, &ou, &attr);
2620     if (x != 0) {
2621         result = 2;
2622     }
2623     ffrt_wait_deps(wait_null);
2624     if (x != 0) {
2625         result = 3;
2626     }
2627     ffrt_wait_deps(&wait);
2628     if (x != 0) {
2629         result = 4;
2630     }
2631     ffrt_wait();
2632     if (x != 1) {
2633         result = 5;
2634     }
2635     ffrt_task_attr_destroy(&attr);
2636     napi_value flag = nullptr;
2637     napi_create_double(env, result, &flag);
2638     return flag;
2639 }
2640 
SubmitHBasicTest001(napi_env env,napi_callback_info info)2641 static napi_value SubmitHBasicTest001(napi_env env, napi_callback_info info)
2642 {
2643     int result = 0;
2644     int x = 0;
2645     std::function<void()>&& func = [&]() { x = x + 1;};
2646     const std::vector<ffrt_dependence_t> in_deps = {{ffrt_dependence_data, &x}};
2647     ffrt_deps_t in{static_cast<uint32_t>(in_deps.size()), in_deps.data()};
2648     const std::vector<ffrt_dependence_t> out_deps = {{ffrt_dependence_data, &x}};
2649     ffrt_deps_t out{static_cast<uint32_t>(out_deps.size()), out_deps.data()};
2650     ffrt_function_header_t* ffrt_header_t = create_function_wrapper((func));
2651     ffrt_task_handle_t task = ffrt_submit_h_base(ffrt_header_t, &in, &out, nullptr);
2652     const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_data, &x}};
2653     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2654     ffrt_wait_deps(&wait);
2655     if (x != 1) {
2656         result = 1;
2657     }
2658     ffrt_task_handle_destroy(task);
2659     napi_value flag = nullptr;
2660     napi_create_double(env, result, &flag);
2661     return flag;
2662 }
2663 
SubmitHBasicTest002(napi_env env,napi_callback_info info)2664 static napi_value SubmitHBasicTest002(napi_env env, napi_callback_info info)
2665 {
2666     int result = 0;
2667     const uint32_t sleepTime = 5 * 1000;
2668     int a = 0;
2669     ffrt_task_attr_t attr;
2670     ffrt_task_attr_init(&attr);
2671     ffrt_task_handle_t task = ffrt_submit_h_base(
2672         ffrt_create_function_wrapper(OnePlusForTest, NULL, &a), NULL, NULL, &attr);
2673     const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
2674     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2675     ffrt_wait_deps(&wait);
2676     usleep(sleepTime);
2677     if (a != 1) {
2678         result = 3;
2679     }
2680     ffrt_task_attr_destroy(&attr);
2681     ffrt_task_handle_destroy(task);
2682     napi_value flag = nullptr;
2683     napi_create_double(env, result, &flag);
2684     return flag;
2685 }
2686 
SubmitHFTest001(napi_env env,napi_callback_info info)2687 static napi_value SubmitHFTest001(napi_env env, napi_callback_info info)
2688 {
2689     int result = 0;
2690     int a = 0;
2691     ffrt_task_attr_t attr;
2692     ffrt_task_attr_init(&attr);
2693     ffrt_task_handle_t task = ffrt_submit_h_f(OnePlusForTest, &a, nullptr, nullptr, &attr);
2694     const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
2695     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
2696     ffrt_wait_deps(&wait);
2697     if (a != 1) {
2698         result += 1;
2699     }
2700     ffrt_task_attr_destroy(&attr);
2701     ffrt_task_handle_destroy(task);
2702     napi_value flag = nullptr;
2703     napi_create_double(env, result, &flag);
2704     return flag;
2705 }
2706 
SubmitFTest001(napi_env env,napi_callback_info info)2707 static napi_value SubmitFTest001(napi_env env, napi_callback_info info)
2708 {
2709     int result = 0;
2710     int a = 0;
2711     ffrt_task_attr_t attr;
2712     ffrt_task_attr_init(&attr);
2713     ffrt_submit_f(OnePlusForTest, &a, nullptr, nullptr, &attr);
2714     ffrt_wait();
2715     if (a != 1) {
2716         result += 1;
2717     }
2718     ffrt_task_attr_destroy(&attr);
2719     napi_value flag = nullptr;
2720     napi_create_double(env, result, &flag);
2721     return flag;
2722 }
2723 
SubmitHInDependEmptyTest(napi_env env,napi_callback_info info)2724 static napi_value SubmitHInDependEmptyTest(napi_env env, napi_callback_info info)
2725 {
2726     int result = 0;
2727     const uint32_t sleepTime = 10 * 1000;
2728     int x = 0;
2729     int y = 0;
2730     std::function<void()>&& basic1Func = [&]() {
2731         x = x + 1;
2732         usleep(sleepTime);
2733     };
2734     std::function<void()>&& basic2Func = [&]() {
2735         y = y + 1;
2736         usleep(sleepTime);
2737     };
2738     ffrt_task_attr_t attr1;
2739     ffrt_task_attr_init(&attr1);
2740     ffrt_task_attr_set_qos(&attr1, static_cast<int>(ffrt_qos_background));
2741     ffrt_task_attr_t attr2;
2742     ffrt_task_attr_init(&attr2);
2743     ffrt_task_attr_set_qos(&attr2, static_cast<int>(ffrt_qos_utility));
2744     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2745     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2746     const std::vector<ffrt_dependence_t> in1_deps = {};
2747     ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2748     const std::vector<ffrt_dependence_t> in2_deps = {};
2749     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2750     ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, &in1, nullptr, &attr1);
2751     ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, &in2, nullptr, &attr2);
2752     const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2753     ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2754     const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2755     ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2756     ffrt_wait_deps(&wait1);
2757     if (x != 1) {
2758         result = 1;
2759     }
2760     ffrt_wait_deps(&wait2);
2761     if (y != 1) {
2762         result = 2;
2763     }
2764     ffrt_task_attr_destroy(&attr1);
2765     ffrt_task_attr_destroy(&attr2);
2766     ffrt_task_handle_destroy(task1);
2767     ffrt_task_handle_destroy(task2);
2768     napi_value flag = nullptr;
2769     napi_create_double(env, result, &flag);
2770     return flag;
2771 }
2772 
SubmitHInDependNullptrTest(napi_env env,napi_callback_info info)2773 static napi_value SubmitHInDependNullptrTest(napi_env env, napi_callback_info info)
2774 {
2775     int result = 0;
2776     const uint32_t sleepTime = 10 * 1000;
2777     int x = 0;
2778     int y = 0;
2779     std::function<void()>&& basic1Func = [&]() {
2780         x = x + 1;
2781         usleep(sleepTime);
2782     };
2783     std::function<void()>&& basic2Func = [&]() {
2784         y = y + 1;
2785         usleep(sleepTime);
2786     };
2787     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2788     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2789     const std::vector<ffrt_dependence_t> in1_deps = {{ffrt_dependence_data, NULL}};
2790     ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2791     const std::vector<ffrt_dependence_t> in2_deps = {{ffrt_dependence_data, NULL}};
2792     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2793     ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, &in1, nullptr, nullptr);
2794     ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, &in2, nullptr, nullptr);
2795     const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2796     ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2797     const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2798     ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2799     ffrt_wait_deps(&wait1);
2800     if (x != 1) {
2801         result = 1;
2802     }
2803     ffrt_wait_deps(&wait2);
2804     if (y != 1) {
2805         result = 2;
2806     }
2807     ffrt_task_handle_destroy(task1);
2808     ffrt_task_handle_destroy(task2);
2809     napi_value flag = nullptr;
2810     napi_create_double(env, result, &flag);
2811     return flag;
2812 }
2813 
SubmitHOuDependEmptyTest(napi_env env,napi_callback_info info)2814 static napi_value SubmitHOuDependEmptyTest(napi_env env, napi_callback_info info)
2815 {
2816     int result = 0;
2817     const uint32_t sleepTime = 10 * 1000;
2818     int x = 0;
2819     int y = 0;
2820     std::function<void()>&& basic1Func = [&]() {
2821         x = x + 1;
2822         usleep(sleepTime);
2823     };
2824     std::function<void()>&& basic2Func = [&]() {
2825         y = y + 1;
2826         usleep(sleepTime);
2827     };
2828     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2829     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2830     const std::vector<ffrt_dependence_t> in1_deps = {};
2831     ffrt_deps_t in1{static_cast<uint32_t>(in1_deps.size()), in1_deps.data()};
2832     const std::vector<ffrt_dependence_t> in2_deps = {};
2833     ffrt_deps_t in2{static_cast<uint32_t>(in2_deps.size()), in2_deps.data()};
2834     const std::vector<ffrt_dependence_t> ou1_deps = {};
2835     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2836     const std::vector<ffrt_dependence_t> ou2_deps = {};
2837     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2838     ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, &in1, &ou1, nullptr);
2839     ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, &in2, &ou2, nullptr);
2840     const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2841     ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2842     const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2843     ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2844     ffrt_wait_deps(&wait1);
2845     if (x != 1) {
2846         result = 1;
2847     }
2848     ffrt_wait_deps(&wait2);
2849     if (y != 1) {
2850         result = 2;
2851     }
2852     ffrt_task_handle_destroy(task1);
2853     ffrt_task_handle_destroy(task2);
2854     napi_value flag = nullptr;
2855     napi_create_double(env, result, &flag);
2856     return flag;
2857 }
2858 
SubmitHOuDependNullptrTest(napi_env env,napi_callback_info info)2859 static napi_value SubmitHOuDependNullptrTest(napi_env env, napi_callback_info info)
2860 {
2861     int result = 0;
2862     const uint32_t sleepTime = 10 * 1000;
2863     int x = 0;
2864     int y = 0;
2865     std::function<void()>&& basic1Func = [&]() {
2866         x = x + 1;
2867         usleep(sleepTime);
2868         if (y != 0) {
2869             result = 1;
2870         }
2871     };
2872     std::function<void()>&& basic2Func = [&]() {
2873         y = y + 1;
2874         usleep(sleepTime);
2875         if (x != 1) {
2876             result = 2;
2877         }
2878     };
2879     ffrt_function_header_t* basic1Func_ht = create_function_wrapper((basic1Func));
2880     ffrt_function_header_t* basic2Func_ht = create_function_wrapper((basic2Func));
2881     const std::vector<ffrt_dependence_t> ou1_deps = {{ffrt_dependence_data, NULL}};
2882     ffrt_deps_t ou1{static_cast<uint32_t>(ou1_deps.size()), ou1_deps.data()};
2883     const std::vector<ffrt_dependence_t> ou2_deps = {{ffrt_dependence_data, NULL}};
2884     ffrt_deps_t ou2{static_cast<uint32_t>(ou2_deps.size()), ou2_deps.data()};
2885     ffrt_task_handle_t task1 = ffrt_submit_h_base(basic1Func_ht, nullptr, &ou1, nullptr);
2886     ffrt_task_handle_t task2 = ffrt_submit_h_base(basic2Func_ht, nullptr, &ou2, nullptr);
2887     const std::vector<ffrt_dependence_t> wait_deps1 = {{ffrt_dependence_task, task1}};
2888     ffrt_deps_t wait1{static_cast<uint32_t>(wait_deps1.size()), wait_deps1.data()};
2889     const std::vector<ffrt_dependence_t> wait_deps2 = {{ffrt_dependence_task, task2}};
2890     ffrt_deps_t wait2{static_cast<uint32_t>(wait_deps2.size()), wait_deps2.data()};
2891     ffrt_wait_deps(&wait1);
2892     if (x != 1) {
2893         result = 3;
2894     }
2895     ffrt_wait_deps(&wait2);
2896     if (y != 1) {
2897         result = 4;
2898     }
2899     ffrt_task_handle_destroy(task1);
2900     ffrt_task_handle_destroy(task2);
2901     napi_value flag = nullptr;
2902     napi_create_double(env, result, &flag);
2903     return flag;
2904 }
2905 
2906 
SleepForTest000(napi_env env,napi_callback_info info)2907 static napi_value SleepForTest000(napi_env env, napi_callback_info info)
2908 {
2909     int resultEnd = 0;
2910     // sleep 1ms,验证sleep时间的正确性
2911     double t;
2912     std::function<void()>&& func = [&]() {
2913         auto start = std::chrono::high_resolution_clock::now();
2914         ffrt_usleep(0);
2915         auto end = std::chrono::high_resolution_clock::now();
2916         std::chrono::duration<double, std::milli> elapsed = end-start;
2917         t = elapsed.count();
2918     };
2919     ffrt_submit_base(create_function_wrapper(func), nullptr, nullptr, nullptr);
2920     ffrt_wait();
2921     if (t <= 0 || t > 10) {
2922         resultEnd = 1;
2923     }
2924     napi_value flag = nullptr;
2925     napi_create_double(env, resultEnd, &flag);
2926     return flag;
2927 }
2928 
SleepForTest001(napi_env env,napi_callback_info info)2929 static napi_value SleepForTest001(napi_env env, napi_callback_info info)
2930 {
2931     int resultEnd = 0;
2932     // sleep 1ms,验证sleep时间的正确性
2933     double t;
2934     std::function<void()>&& func = [&]() {
2935         auto start = std::chrono::high_resolution_clock::now();
2936         ffrt_usleep(1000);
2937         auto end = std::chrono::high_resolution_clock::now();
2938         std::chrono::duration<double, std::milli> elapsed = end-start;
2939         t = elapsed.count();
2940     };
2941     ffrt_submit_base(create_function_wrapper(func), nullptr, nullptr, nullptr);
2942     ffrt_wait();
2943     if (t <= 1 || t > 10) {
2944         resultEnd = 1;
2945     }
2946     napi_value flag = nullptr;
2947     napi_create_double(env, resultEnd, &flag);
2948     return flag;
2949 }
2950 
TaskAttrAbnormalTest(napi_env env,napi_callback_info info)2951 static napi_value TaskAttrAbnormalTest(napi_env env, napi_callback_info info)
2952 {
2953     int result = 0;
2954     ffrt_task_attr_t attr;
2955     int ret = ffrt_task_attr_init(nullptr);
2956     if (ret != -1) {
2957         result = 1;
2958     }
2959     ret = ffrt_task_attr_init(&attr);
2960     ffrt_task_attr_set_qos(nullptr, static_cast<int>(ffrt_qos_default));
2961     ffrt_task_attr_set_name(nullptr, nullptr);
2962     ffrt_task_attr_set_delay(nullptr, 0);
2963     ffrt_qos_t ffrt_qos = ffrt_task_attr_get_qos(nullptr);
2964     if (ffrt_qos != ffrt_qos_default) {
2965         result = 2;
2966     }
2967     const char* name = ffrt_task_attr_get_name(nullptr);
2968     if (name != nullptr) {
2969         result = 3;
2970     }
2971     uint64_t delay = ffrt_task_attr_get_delay(nullptr);
2972     if (delay != 0) {
2973         result = 4;
2974     }
2975     ffrt_task_attr_destroy(nullptr);
2976     ffrt_task_attr_destroy(&attr);
2977     napi_value flag = nullptr;
2978     napi_create_double(env, result, &flag);
2979     return flag;
2980 }
2981 
TaskAttrQosIllegalTest(napi_env env,napi_callback_info info)2982 static napi_value TaskAttrQosIllegalTest(napi_env env, napi_callback_info info)
2983 {
2984     int result = 0;
2985     ffrt_task_attr_t attr;
2986     ffrt_task_attr_init(&attr);
2987     int minVal = static_cast<int>(ffrt_qos_inherit) - 1;
2988     ffrt_task_attr_set_qos(&attr, minVal);
2989     int queryVal = int(ffrt_task_attr_get_qos(&attr));
2990     if (queryVal != -1) {
2991         result = 1;
2992     }
2993     ffrt_task_attr_destroy(&attr);
2994     napi_value flag = nullptr;
2995     napi_create_double(env, result, &flag);
2996     return flag;
2997 }
2998 
TaskAttrQosQueryTest(napi_env env,napi_callback_info info)2999 static napi_value TaskAttrQosQueryTest(napi_env env, napi_callback_info info)
3000 {
3001     int result = 0;
3002     ffrt_task_attr_t attr;
3003     ffrt_task_attr_get_qos(&attr);
3004     int ret = ffrt_task_attr_init(&attr);
3005     if (ret != 0) {
3006         result = 1;
3007     }
3008     int qosVal = ffrt_task_attr_get_qos(&attr);
3009     if (qosVal != ffrt_qos_default) {
3010         result = 2;
3011     }
3012     ffrt_task_attr_destroy(&attr);
3013     napi_value flag = nullptr;
3014     napi_create_double(env, result, &flag);
3015     return flag;
3016 }
3017 
TaskAttrSetNameTest(napi_env env,napi_callback_info info)3018 static napi_value TaskAttrSetNameTest(napi_env env, napi_callback_info info)
3019 {
3020     int result = 0;
3021     ffrt_task_attr_t attr;
3022     (void)ffrt_task_attr_init(&attr);
3023     std::string name(ffrt_task_attr_get_name(&attr));
3024     if (name != "") {
3025         result = 1;
3026     }
3027     ffrt_task_attr_set_name(&attr, "Task Name");
3028     std::string reName(ffrt_task_attr_get_name(&attr));
3029     if (reName != "Task Name") {
3030         result = 2;
3031     }
3032     ffrt_task_attr_destroy(&attr);
3033     std::string desName(ffrt_task_attr_get_name(&attr));
3034     napi_value flag = nullptr;
3035     napi_create_double(env, result, &flag);
3036     return flag;
3037 }
3038 
TaskAttrSetQosTest(napi_env env,napi_callback_info info)3039 static napi_value TaskAttrSetQosTest(napi_env env, napi_callback_info info)
3040 {
3041     int result = 0;
3042     ffrt_task_attr_t attr;
3043     ffrt_task_attr_init(&attr);
3044     int minLevel = static_cast<int>(ffrt_qos_inherit);
3045     int maxLevel = static_cast<int>(ffrt_qos_user_initiated);
3046     for (int idx = minLevel; idx <= maxLevel; idx++) {
3047         ffrt_task_attr_set_qos(&attr, idx);
3048         int qosVal = int(ffrt_task_attr_get_qos(&attr));
3049         if (qosVal != idx) {
3050             result = idx + 2;
3051         }
3052     }
3053     ffrt_task_attr_destroy(&attr);
3054     napi_value flag = nullptr;
3055     napi_create_double(env, result, &flag);
3056     return flag;
3057 }
3058 
3059 typedef struct {
3060     int timerId;
3061     int result;
3062     uint64_t timeout;
3063     high_resolution_clock::time_point submitTime;
3064     high_resolution_clock::time_point dispatchTime;
3065     bool finish;
3066 } TimerDataT;
3067 
StallUs(size_t us)3068 static inline void StallUs(size_t us)
3069 {
3070     auto start = std::chrono::system_clock::now();
3071     size_t passed = 0;
3072     while (passed < us) {
3073         passed = std::chrono::duration_cast<std::chrono::microseconds>
3074             (std::chrono::system_clock::now() - start).count();
3075     }
3076 }
3077 
ThreadFunc(void * p)3078 void* ThreadFunc(void *p)
3079 {
3080     ffrt_loop_run(p);
3081     return nullptr;
3082 }
3083 
TimerCb(void * data)3084 static void TimerCb(void *data)
3085 {
3086     printf("enter TimerCb\n");
3087     const double error = 100;
3088     TimerDataT *timerData = reinterpret_cast<TimerDataT *>(data);
3089     timerData->dispatchTime = high_resolution_clock::now();
3090     auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(
3091         timerData->dispatchTime - timerData->submitTime);
3092     double realTimeVal = elapsed.count();
3093     if (realTimeVal < timerData->timeout - error || realTimeVal > timerData->timeout + error) {
3094         timerData->result += 1;
3095     }
3096     timerData->finish = true;
3097 }
3098 
ffrt_timer_start_abnormal_0001(napi_env env,napi_callback_info info)3099 static napi_value ffrt_timer_start_abnormal_0001(napi_env env, napi_callback_info info)
3100 {
3101     high_resolution_clock::time_point startT = high_resolution_clock::now();
3102     TimerDataT timerData1 = {.timerId = 1, .timeout = 0, .submitTime = startT, .finish = false, .result = 0};
3103     int ret = ffrt_timer_start(-1, 0, reinterpret_cast<void *>(&timerData1), nullptr, false);
3104 
3105     int result = 0;
3106     if (ret != -1) {
3107         result += 1;
3108     }
3109     napi_value flag = nullptr;
3110     napi_create_double(env, result, &flag);
3111     return flag;
3112 }
3113 
ffrt_timer_start_0001(napi_env env,napi_callback_info info)3114 static napi_value ffrt_timer_start_0001(napi_env env, napi_callback_info info)
3115 {
3116     high_resolution_clock::time_point startT = high_resolution_clock::now();
3117     TimerDataT timerData1 = {.timerId = 1, .timeout = 0, .submitTime = startT, .finish = false, .result = 0};
3118     ffrt_timer_start(ffrt_qos_default, 0, reinterpret_cast<void *>(&timerData1), TimerCb, false);
3119     bool finish = false;
3120     while (!finish) {
3121         usleep(1);
3122         bool flag = false;
3123         if (timerData1.finish) {
3124             flag = true;
3125         }
3126         finish = (flag == true ? true : false);
3127     }
3128     napi_value flag = nullptr;
3129     napi_create_double(env, timerData1.result, &flag);
3130     return flag;
3131 }
3132 
ffrt_timer_start_0002(napi_env env,napi_callback_info info)3133 static napi_value ffrt_timer_start_0002(napi_env env, napi_callback_info info)
3134 {
3135     const int timerCount = 100;
3136     bool finish = false;
3137     TimerDataT timerData[timerCount];
3138     high_resolution_clock::time_point startT = high_resolution_clock::now();
3139     ffrt_qos_default_t qos_type[5] = {ffrt_qos_inherit, ffrt_qos_background, ffrt_qos_utility,
3140         ffrt_qos_default, ffrt_qos_user_initiated};
3141     for (int i = 0; i < timerCount; ++i) {
3142         uint64_t timeout = 0;
3143         const int mod1 = 500;
3144         const int mod2 = 5;
3145         timeout = rand() % mod1;
3146         int qosidx = rand() % mod2;
3147         timerData[i] = {.timerId = i, .timeout = timeout, .submitTime = startT, .finish = false, .result = 0};
3148         ffrt_timer_start(qos_type[qosidx], timeout, (void *)&timerData[i], TimerCb, false);
3149     }
3150 
3151     while (!finish) {
3152         usleep(1);
3153         bool flag = true;
3154         for (int i = 0; i < timerCount; ++i) {
3155             flag = (flag && timerData[i].finish);
3156         }
3157         finish = flag == true ? true : false;
3158     }
3159     napi_value flag = nullptr;
3160     for (int i = 0; i < timerCount; ++i) {
3161         flag = nullptr;
3162         napi_create_double(env, timerData[i].result, &flag);
3163     }
3164     return flag;
3165 }
3166 
TimerCbCancel(void * data)3167 static void TimerCbCancel(void *data)
3168 {
3169     printf("enter TimerCbCancel\n");
3170     const uint32_t slpTime = 500 * 1000;
3171     StallUs(slpTime);
3172     TimerDataT *timerData = reinterpret_cast<TimerDataT *>(data);
3173     timerData->finish = true;
3174 }
3175 
ffrt_timer_cancel_0001(napi_env env,napi_callback_info info)3176 static napi_value ffrt_timer_cancel_0001(napi_env env, napi_callback_info info)
3177 {
3178     const uint32_t delayTime = 2000;
3179     TimerDataT timerData = { .finish = false, .result = 0};
3180     int handle = ffrt_timer_start(ffrt_qos_default, delayTime, reinterpret_cast<void *>(&timerData),
3181         TimerCbCancel, false);
3182     int abnormalHandle = handle + 1;
3183     ffrt_timer_stop(ffrt_qos_default, abnormalHandle);
3184     ffrt_timer_stop(ffrt_qos_default, handle);
3185     ffrt_timer_stop(ffrt_qos_default, handle);
3186     if (timerData.finish != false) {
3187         timerData.result += 1;
3188     }
3189     napi_value flag = nullptr;
3190     napi_create_double(env, timerData.result, &flag);
3191     return flag;
3192 }
3193 
ffrt_loop_abnormal_0001(napi_env env,napi_callback_info info)3194 static napi_value ffrt_loop_abnormal_0001(napi_env env, napi_callback_info info)
3195 {
3196     ffrt_queue_attr_t queue_attr;
3197     (void)ffrt_queue_attr_init(&queue_attr);
3198     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3199 
3200     int result2 = 0;
3201     const int addnum = 20;
3202     std::function<void()>&& basicFunc2 = [&result2]() {result2 += addnum;};
3203     auto loop = ffrt_loop_create(queue_handle);
3204 
3205     int result = 0;
3206     if (loop == nullptr) {
3207         result += 1;
3208     }
3209 
3210     ffrt_queue_attr_destroy(&queue_attr);
3211     ffrt_queue_destroy(queue_handle);
3212     napi_value flag = nullptr;
3213     napi_create_double(env, result, &flag);
3214     return flag;
3215 }
3216 
ffrt_loop_abnormal_0002(napi_env env,napi_callback_info info)3217 static napi_value ffrt_loop_abnormal_0002(napi_env env, napi_callback_info info)
3218 {
3219     auto loop = ffrt_loop_create(nullptr);
3220     int result = 0;
3221     if (loop != nullptr) {
3222         result += 1;
3223     }
3224     int res2 = ffrt_loop_destroy(loop);
3225     if (res2 != -1) {
3226         result += 1;
3227     }
3228     int res3 = ffrt_loop_run(loop);
3229     if (res3 != -1) {
3230         result += 1;
3231     }
3232     auto res4 = ffrt_queue_attr_get_max_concurrency(nullptr);
3233     if (res4 != 0) {
3234         result += 1;
3235     }
3236     napi_value flag = nullptr;
3237     napi_create_double(env, result, &flag);
3238     return flag;
3239 }
3240 
ffrt_loop_0001(napi_env env,napi_callback_info info)3241 static napi_value ffrt_loop_0001(napi_env env, napi_callback_info info)
3242 {
3243     ffrt_queue_attr_t queue_attr;
3244     (void)ffrt_queue_attr_init(&queue_attr);
3245     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3246     auto loop = ffrt_loop_create(queue_handle);
3247     ffrt_task_attr_t task_attr;
3248     (void)ffrt_task_attr_init(&task_attr);
3249     ffrt_task_attr_set_delay(&task_attr, TASK_DELAY_TIME);
3250     int result1 = 0;
3251     const int loopCnt = 1000;
3252     std::function<void()>&& basicFunc1 = [&result1]() {for (int i = 0; i < loopCnt; ++i) {result1 += 1;}};
3253     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
3254         create_function_wrapper(basicFunc1, ffrt_function_kind_queue), &task_attr);
3255     pthread_t thread;
3256     pthread_create(&thread, 0, ThreadFunc, loop);
3257     int result2 = 0;
3258     const int addnum = 20;
3259     std::function<void()>&& basicFunc2 = [&result2]() {result2 += addnum;};
3260     ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
3261         create_function_wrapper(basicFunc2, ffrt_function_kind_queue), nullptr);
3262     ffrt_queue_wait(task1);
3263     ffrt_queue_wait(task2);
3264     int result = 0;
3265     if (result1 != loopCnt || result2 != addnum) {
3266         result = ERR_CODE_1;
3267     }
3268     int result3 = 0;
3269     std::function<void()>&& basicFunc3 = [&result3]() {result3 += addnum;};
3270     std::function<void()> &&SleepFunc = [] () {usleep(SLEEP_TIME);};
3271     ffrt_task_handle_t sleepTask = ffrt_queue_submit_h(queue_handle, create_function_wrapper(SleepFunc,
3272         ffrt_function_kind_queue), nullptr);
3273     ffrt_task_handle_t task3 = ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc3,
3274         ffrt_function_kind_queue), nullptr);
3275     int ret = ffrt_queue_cancel(task3);
3276     if (ret != 0 || result3 != 0) {
3277         result = ERR_CODE_2;
3278     }
3279     ffrt_queue_wait(sleepTask);
3280     ffrt_loop_stop(loop);
3281     pthread_join(thread, nullptr);
3282     int destoryRet = ffrt_loop_destroy(loop);
3283     if (destoryRet != 0) {
3284         result = ERR_CODE_3;
3285     }
3286     ffrt_queue_attr_destroy(&queue_attr);
3287     ffrt_queue_destroy(queue_handle);
3288     napi_value flag = nullptr;
3289     napi_create_double(env, result, &flag);
3290     return flag;
3291 }
3292 
ffrt_loop_0002(napi_env env,napi_callback_info info)3293 static napi_value ffrt_loop_0002(napi_env env, napi_callback_info info)
3294 {
3295     ffrt_queue_attr_t queue_attr;
3296     (void)ffrt_queue_attr_init(&queue_attr);
3297     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3298     auto loop = ffrt_loop_create(queue_handle);
3299     pthread_t thread;
3300     pthread_create(&thread, 0, ThreadFunc, loop);
3301 
3302     int result1 = 0;
3303     const int addTen = 10;
3304     std::function<void()>&& basicFunc1 = [&result1]() {result1 += addTen;};
3305     std::function<void()> &&SleepFunc = [] () {usleep(SLEEP_TIME);};
3306     ffrt_task_handle_t sleepTask = ffrt_queue_submit_h(queue_handle, create_function_wrapper(SleepFunc,
3307         ffrt_function_kind_queue), nullptr);
3308     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc1,
3309         ffrt_function_kind_queue), nullptr);
3310     int result = 0;
3311     int ret1 = ffrt_queue_cancel(task1);
3312     if (ret1 != 0) {
3313         result = ERR_CODE_1;
3314     }
3315     ffrt_queue_wait(sleepTask);
3316     int result2 = 0;
3317     const int addTwenty = 20;
3318     std::function<void()>&& basicFunc2 = [&result2]() {result2 += addTwenty;};
3319     ffrt_task_handle_t sleepTask2 = ffrt_queue_submit_h(queue_handle, create_function_wrapper(SleepFunc,
3320         ffrt_function_kind_queue), nullptr);
3321     ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
3322         create_function_wrapper(basicFunc2, ffrt_function_kind_queue), nullptr);
3323     int ret2 = ffrt_queue_cancel(task2);
3324     if (ret2 != 0) {
3325         result = ERR_CODE_2;
3326     }
3327     ffrt_queue_wait(sleepTask2);
3328     ffrt_loop_stop(loop);
3329     pthread_join(thread, nullptr);
3330     ffrt_loop_destroy(loop);
3331     ffrt_queue_attr_destroy(&queue_attr);
3332     ffrt_queue_destroy(queue_handle);
3333     napi_value flag = nullptr;
3334     napi_create_double(env, result, &flag);
3335     return flag;
3336 }
3337 
ffrt_queue_parallel_api_0001(napi_env env,napi_callback_info info)3338 static napi_value ffrt_queue_parallel_api_0001(napi_env env, napi_callback_info info)
3339 {
3340     int result = 0;
3341     ffrt_queue_attr_t queue_attr;
3342     (void)ffrt_queue_attr_init(&queue_attr);
3343     const int maxConcurrency1 = 4;
3344     ffrt_queue_attr_set_max_concurrency(nullptr, maxConcurrency1);
3345     int concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3346     if (concurrency != 1) {
3347         result += 1;
3348     }
3349 
3350     const int maxConcurrency2 = 0;
3351     ffrt_queue_attr_set_max_concurrency(&queue_attr, maxConcurrency2);
3352     concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3353     if (concurrency != 1) {
3354         result += 1;
3355     }
3356     const int maxConcurrency3 = 100;
3357     ffrt_queue_attr_set_max_concurrency(&queue_attr, maxConcurrency3);
3358     concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3359     if (concurrency != maxConcurrency3) {
3360         result += 1;
3361     }
3362 
3363     // 销毁队列
3364     ffrt_queue_attr_destroy(&queue_attr);
3365 
3366     napi_value flag = nullptr;
3367     napi_create_double(env, result, &flag);
3368     return flag;
3369 }
3370 
ffrt_queue_parallel_api_0002(napi_env env,napi_callback_info info)3371 static napi_value ffrt_queue_parallel_api_0002(napi_env env, napi_callback_info info)
3372 {
3373     int result = 0;
3374     const int pri = 4;
3375     ffrt_queue_attr_t queue_attr;
3376     (void)ffrt_queue_attr_init(&queue_attr);
3377     ffrt_queue_attr_set_max_concurrency(&queue_attr, pri);
3378     int concurrency = ffrt_queue_attr_get_max_concurrency(nullptr);
3379     if (concurrency != 0) {
3380         result += 1;
3381     }
3382     concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3383     if (concurrency != pri) {
3384         result += 1;
3385     }
3386 
3387     // 销毁队列
3388     ffrt_queue_attr_destroy(&queue_attr);
3389     napi_value flag = nullptr;
3390     napi_create_double(env, result, &flag);
3391     return flag;
3392 }
3393 
ffrt_queue_parallel_api_0003(napi_env env,napi_callback_info info)3394 static napi_value ffrt_queue_parallel_api_0003(napi_env env, napi_callback_info info)
3395 {
3396     int result = 0;
3397     ffrt_task_attr_t task_attr;
3398     (void)ffrt_task_attr_init(&task_attr);
3399     ffrt_task_attr_set_queue_priority(nullptr, ffrt_queue_priority_immediate);
3400     int priority = ffrt_task_attr_get_queue_priority(&task_attr);
3401     if (priority != ffrt_queue_priority_low) {
3402         result += 1;
3403     }
3404 
3405     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_low);
3406     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3407     if (priority != ffrt_queue_priority_low) {
3408         result += 1;
3409     }
3410 
3411     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_low);
3412     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3413     if (priority != ffrt_queue_priority_low) {
3414         result += 1;
3415     }
3416 
3417     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_immediate);
3418     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3419     if (priority != ffrt_queue_priority_immediate) {
3420         result += 1;
3421     }
3422 
3423     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_high);
3424     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3425     if (priority != ffrt_queue_priority_high) {
3426         result += 1;
3427     }
3428 
3429     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_idle);
3430     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3431     if (priority != ffrt_queue_priority_idle) {
3432         result += 1;
3433     }
3434 
3435     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_low);
3436     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3437     if (priority != ffrt_queue_priority_low) {
3438         result += 1;
3439     }
3440 
3441     const ffrt_queue_priority_t abnormal_pri = (ffrt_queue_priority_t)100;
3442     ffrt_task_attr_set_queue_priority(&task_attr, abnormal_pri);
3443     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3444     if (priority != ffrt_queue_priority_low) {
3445         result += 1;
3446     }
3447     // 销毁队列
3448     ffrt_task_attr_destroy(&task_attr);
3449     napi_value flag = nullptr;
3450     napi_create_double(env, result, &flag);
3451     return flag;
3452 }
3453 
ffrt_queue_parallel_api_0004(napi_env env,napi_callback_info info)3454 static napi_value ffrt_queue_parallel_api_0004(napi_env env, napi_callback_info info)
3455 {
3456     int result = 0;
3457     ffrt_task_attr_t task_attr;
3458     (void)ffrt_task_attr_init(&task_attr);
3459     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_immediate);
3460     int priority = ffrt_task_attr_get_queue_priority(nullptr);
3461     if (priority != 0) {
3462         result += 1;
3463     }
3464 
3465     priority = ffrt_task_attr_get_queue_priority(&task_attr);
3466     if (priority != ffrt_queue_priority_immediate) {
3467         result += 1;
3468     }
3469     // 销毁队列
3470     ffrt_task_attr_destroy(&task_attr);
3471     napi_value flag = nullptr;
3472     napi_create_double(env, result, &flag);
3473     return flag;
3474 }
3475 
queue_parallel_cancel_0001(napi_env env,napi_callback_info info)3476 static napi_value queue_parallel_cancel_0001(napi_env env, napi_callback_info info)
3477 {
3478     int result = 0;
3479     const int taskRes = 9;
3480     ffrt_queue_attr_t queue_attr;
3481     (void)ffrt_queue_attr_init(&queue_attr);
3482     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3483 
3484     int res = 0;
3485     const uint32_t delayTime = 1000000;
3486     ffrt_task_attr_t task_attr;
3487     (void)ffrt_task_attr_init(&task_attr);
3488     ffrt_task_attr_set_delay(&task_attr, delayTime);
3489     std::function<void()> &&OnePlusFunc = [&res] () {OnePlusForTest((void *)(&res));};
3490 
3491     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
3492         create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr);
3493 
3494     int ret = ffrt_queue_cancel(task1);
3495     if (res != 0) {
3496         result += 1;
3497     }
3498     ret = ffrt_queue_cancel(task1);
3499     if (ret != 1) {
3500         result += 1;
3501     }
3502 
3503     std::function<void()> &&MultipleFunc = [&res] () {MultipleForTest((void *)(&res));};
3504     std::function<void()> &&OneSubFunc = [&res] () {SubForTest((void *)(&res));};
3505     ffrt_queue_submit_h(queue_handle, create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), nullptr);
3506     ffrt_queue_submit_h(queue_handle, create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), nullptr);
3507     ffrt_task_handle_t task3 = ffrt_queue_submit_h(queue_handle,
3508         create_function_wrapper(OneSubFunc, ffrt_function_kind_queue), nullptr);
3509     ffrt_queue_wait(task3);
3510     if (res != taskRes) {
3511         result += 1;
3512     }
3513 
3514     ffrt_task_attr_destroy(&task_attr);
3515     ffrt_task_handle_destroy(task1);
3516     ffrt_task_handle_destroy(task3);
3517 
3518     ffrt_queue_attr_destroy(&queue_attr);
3519     ffrt_queue_destroy(queue_handle);
3520 
3521     napi_value flag = nullptr;
3522     napi_create_double(env, result, &flag);
3523     return flag;
3524 }
3525 
queue_parallel_cancel_0002(napi_env env,napi_callback_info info)3526 static napi_value queue_parallel_cancel_0002(napi_env env, napi_callback_info info)
3527 {
3528     int result = 0;
3529     const uint32_t delayTime = 2000;
3530     ffrt_queue_attr_t queue_attr;
3531     (void)ffrt_queue_attr_init(&queue_attr);
3532     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3533 
3534     int res = 0;
3535     std::function<void()> &&OnePlusFfrtSleepFunc = [&res] () {OnePlusSleepForTest((void *)(&res));};
3536     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
3537         create_function_wrapper(OnePlusFfrtSleepFunc, ffrt_function_kind_queue), nullptr);
3538 
3539     usleep(delayTime);
3540     ffrt_queue_cancel(task1);
3541     if (res != 0) {
3542         result += 1;
3543     }
3544     ffrt_queue_wait(task1);
3545     if (res != 1) {
3546         result += 1;
3547     }
3548 
3549     ffrt_task_handle_destroy(task1);
3550     ffrt_queue_attr_destroy(&queue_attr);
3551     ffrt_queue_destroy(queue_handle);
3552 
3553     napi_value flag = nullptr;
3554     napi_create_double(env, result, &flag);
3555     return flag;
3556 }
3557 
queue_parallel_0001(napi_env env,napi_callback_info info)3558 static napi_value queue_parallel_0001(napi_env env, napi_callback_info info)
3559 {
3560     int result = 0;
3561     const int taskRes = 9;
3562     ffrt_queue_attr_t queue_attr;
3563     (void)ffrt_queue_attr_init(&queue_attr);
3564     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3565 
3566     int res = 0;
3567     const uint32_t delayTime = 2000;
3568 
3569     std::function<void()> &&OnePlusFunc = [&res] () {OnePlusForTest((void *)(&res));};
3570     std::function<void()> &&MultipleFunc = [&res] () {MultipleForTest((void *)(&res));};
3571     std::function<void()> &&OneSubFunc = [&res] () {SubForTest((void *)(&res));};
3572 
3573     ffrt_queue_submit(queue_handle, create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), nullptr);
3574     ffrt_queue_submit(queue_handle, create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), nullptr);
3575     ffrt_task_handle_t task3 = ffrt_queue_submit_h(queue_handle,
3576         create_function_wrapper(OneSubFunc, ffrt_function_kind_queue), nullptr);
3577     ffrt_queue_wait(task3);
3578     if (res != taskRes) {
3579         result += 1;
3580     }
3581     usleep(delayTime);
3582     int concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
3583     if (concurrency != 1) {
3584         result += 1;
3585     }
3586 
3587     ffrt_task_handle_destroy(task3);
3588     ffrt_queue_attr_destroy(&queue_attr);
3589     ffrt_queue_destroy(queue_handle);
3590 
3591     napi_value flag = nullptr;
3592     napi_create_double(env, result, &flag);
3593     return flag;
3594 }
3595 
DivForTest(void * data)3596 inline void DivForTest(void *data)
3597 {
3598     const int div = 3;
3599     (*static_cast<int*>(data)) /= div;
3600 }
3601 
TwoPlusForTest(void * data)3602 inline void TwoPlusForTest(void *data)
3603 {
3604     const int plus = 2;
3605     (*static_cast<int*>(data)) += plus;
3606 }
3607 
TwoSubForTest(void * data)3608 inline void TwoSubForTest(void *data)
3609 {
3610     const int sub = 2;
3611     (*static_cast<int*>(data)) -= sub;
3612 }
3613 
queue_parallel_0002(napi_env env,napi_callback_info info)3614 static napi_value queue_parallel_0002(napi_env env, napi_callback_info info)
3615 {
3616     int result = 0;
3617     const int maxConcurrency = 1;
3618     const int taskRes = 9;
3619     ffrt_queue_attr_t queue_attr;
3620     (void)ffrt_queue_attr_init(&queue_attr);
3621     ffrt_queue_attr_set_max_concurrency(&queue_attr, maxConcurrency);
3622     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3623 
3624     int res = 3;
3625     ffrt_task_handle_t task;
3626     std::function<void()> &&DivFunc = [&res] () {DivForTest((void *)(&res));};
3627     std::function<void()> &&MultipleFunc = [&res] () {MultipleForTest((void *)(&res));};
3628     std::function<void()> &&OnePlusFunc = [&res] () {OnePlusForTest((void *)(&res));};
3629     std::function<void()> &&SubFunc = [&res] () {SubForTest((void *)(&res));};
3630     std::function<void()> &&TwoPlusFunc = [&res] () {TwoPlusForTest((void *)(&res));};
3631     std::function<void()> &&TwoSubFunc = [&res] () {TwoSubForTest((void *)(&res));};
3632     std::function<void()> &&SleepFunc = [] () {sleep(1);};
3633 
3634     const int taskCnt = 6;
3635     ffrt_task_attr_t task_attr[taskCnt];
3636     for (int i = 0; i < taskCnt; ++i) {
3637         (void)ffrt_task_attr_init(&task_attr[i]);
3638 
3639         const ffrt_queue_priority_t pri = (ffrt_queue_priority_t)(taskCnt - i);
3640         ffrt_task_attr_set_queue_priority(&task_attr[i], pri);
3641     }
3642     ffrt_task_attr_t task_attr_tmp;
3643     (void)ffrt_task_attr_init(&task_attr_tmp);
3644     ffrt_task_attr_set_queue_priority(&task_attr_tmp, ffrt_queue_priority_immediate);
3645     ffrt_queue_submit(queue_handle, create_function_wrapper(SleepFunc, ffrt_function_kind_queue), &task_attr_tmp);
3646     ffrt_queue_submit(queue_handle, create_function_wrapper(TwoSubFunc, ffrt_function_kind_queue), &task_attr[0]);
3647     ffrt_queue_submit(queue_handle, create_function_wrapper(OnePlusFunc, ffrt_function_kind_queue), &task_attr[1]);
3648     ffrt_queue_submit(queue_handle, create_function_wrapper(DivFunc, ffrt_function_kind_queue), &task_attr[2]);
3649     int waitIdex = 3;
3650     task = ffrt_queue_submit_h(queue_handle, create_function_wrapper(
3651         SubFunc, ffrt_function_kind_queue), &task_attr[waitIdex]);
3652     ffrt_queue_submit(queue_handle, create_function_wrapper(MultipleFunc, ffrt_function_kind_queue), &task_attr[4]);
3653     ffrt_queue_submit(queue_handle, create_function_wrapper(TwoPlusFunc, ffrt_function_kind_queue), &task_attr[5]);
3654 
3655     ffrt_queue_wait(task);
3656     if (res != taskRes) {
3657         result += 1;
3658     }
3659     for (int i = 0; i < taskCnt; ++i) {
3660         (void) ffrt_task_attr_destroy(&task_attr[i]);
3661     }
3662     ffrt_task_handle_destroy(task);
3663     ffrt_queue_attr_destroy(&queue_attr);
3664     ffrt_queue_destroy(queue_handle);
3665 
3666     napi_value flag = nullptr;
3667     napi_create_double(env, result, &flag);
3668     return flag;
3669 }
3670 
Testfun(void * data)3671 static void Testfun(void* data)
3672 {
3673     *(int*)data += 1;
3674     printf("%d, timeout callback\n", *(int*)data);
3675 }
3676 
3677 static void (*g_cb)(void*) = Testfun;
3678 
3679 struct TestData {
3680     int fd;
3681     uint64_t expected;
3682 };
3683 
TestCallBack(void * token,uint32_t event)3684 static void TestCallBack(void* token, uint32_t event)
3685 {
3686     printf("g_cb done\n");
3687 }
3688 
ffrt_loop_abnormal_0003(napi_env env,napi_callback_info info)3689 static napi_value ffrt_loop_abnormal_0003(napi_env env, napi_callback_info info)
3690 {
3691     int result = 0;
3692     int result1 = 0;
3693     std::function<void()>&& basicFunc1 = [&result1]() { result1 += 1; };
3694     auto loop = ffrt_loop_create(nullptr);
3695     if (loop != nullptr) {
3696         result += 1;
3697     }
3698     int res1 = ffrt_loop_destroy(loop);
3699     if (res1 != -1) {
3700         result += 1;
3701     }
3702     int res2 = ffrt_loop_run(loop);
3703     if (res2 != -1) {
3704         result += 1;
3705     }
3706     auto res5 = ffrt_queue_attr_get_max_concurrency(nullptr);
3707     if (res5 != 0) {
3708         result += 1;
3709     }
3710     int ret6 = ffrt_loop_timer_stop(loop, 0);
3711     if (ret6 != -1) {
3712         result += 1;
3713     }
3714 
3715     napi_value flag = nullptr;
3716     napi_create_double(env, result, &flag);
3717     return flag;
3718 }
3719 
ffrt_loop_normal_0003(napi_env env,napi_callback_info info)3720 static napi_value ffrt_loop_normal_0003(napi_env env, napi_callback_info info)
3721 {
3722     int result = 0;
3723     ffrt_queue_attr_t queue_attr;
3724     (void)ffrt_queue_attr_init(&queue_attr);
3725     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_concurrent, "test_queue", &queue_attr);
3726     auto loop = ffrt_loop_create(queue_handle);
3727     int result1 = 0;
3728     std::function<void()>&& basicFunc1 = [&result1]() {
3729         int testNumber = 10;
3730         result1 += testNumber;
3731     };
3732     ffrt_task_handle_t task1 = ffrt_queue_submit_h(queue_handle,
3733         create_function_wrapper(basicFunc1, ffrt_function_kind_queue), nullptr);
3734     pthread_t thread;
3735     pthread_create(&thread, 0, ThreadFunc, loop);
3736     static int staticReslult = 0;
3737     int* xf = &staticReslult;
3738     void* data = xf;
3739     uint64_t timeout1 = 20;
3740     uint64_t timeout2 = 10;
3741     uint64_t expected = 0xabacadae;
3742     int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
3743     printf("testfd=%d\n", testFd);
3744     struct  TestData testData{.fd = testFd, .expected = expected};
3745     int res1 = ffrt_loop_timer_start(loop, timeout1, data, g_cb, false);
3746     int res2 = ffrt_loop_timer_start(loop, timeout2, data, g_cb, false);
3747 
3748     ffrt_loop_epoll_ctl(loop, 1, testFd, 0x00000001U, (void*)(&testData), TestCallBack);
3749     ssize_t n = write(testFd, &expected, sizeof(uint64_t));
3750     int sleepNumber = 25000;
3751     usleep(sleepNumber);
3752     ffrt_loop_epoll_ctl(loop, 1, testFd, 0, nullptr, nullptr);
3753     int testNumber4 = 2;
3754     int result2 = 0;
3755     std::function<void()>&& basicFunc2 = [&result2]() {
3756         int testNumber2 = 20;
3757         result2 += testNumber2;
3758     };
3759     ffrt_task_handle_t task2 = ffrt_queue_submit_h(queue_handle,
3760         create_function_wrapper(basicFunc2, ffrt_function_kind_queue), nullptr);
3761     ffrt_queue_wait(task1);
3762     ffrt_queue_wait(task2);
3763     int testNumber1 = 10;
3764     int testNumber3 = 20;
3765     if (res2 != 1 or res1 != 0 or result2 != testNumber3 or result1 != testNumber1 or
3766         n != sizeof(uint64_t) or staticReslult != testNumber4) {
3767         result += 1;
3768     }
3769     ffrt_loop_stop(loop);
3770     pthread_join(thread, nullptr);
3771     ffrt_queue_attr_destroy(&queue_attr);
3772     ffrt_queue_destroy(queue_handle);
3773     napi_value flag = nullptr;
3774     napi_create_double(env, result, &flag);
3775     return flag;
3776 }
3777 
ffrt_get_main_queue_0001(napi_env env,napi_callback_info info)3778 static napi_value ffrt_get_main_queue_0001(napi_env env, napi_callback_info info)
3779 {
3780     int result = 0;
3781     //ffrt test case begin
3782     ffrt_queue_attr_t queue_attr;
3783     (void)ffrt_queue_attr_init(&queue_attr);
3784     ffrt_queue_t currentQueue = ffrt_get_main_queue();
3785     if (currentQueue == nullptr) {
3786         result += 1;
3787     }
3788     napi_value flag = nullptr;
3789     napi_create_double(env, result, &flag);
3790     return flag;
3791 }
ffrt_get_current_queue_0001(napi_env env,napi_callback_info info)3792 static napi_value ffrt_get_current_queue_0001(napi_env env, napi_callback_info info)
3793 {
3794     int result = 0;
3795     //ffrt test case begin
3796     ffrt_queue_attr_t queue_attr;
3797     (void)ffrt_queue_attr_init(&queue_attr);
3798     ffrt_queue_t currentQueue = ffrt_get_current_queue();
3799     if (currentQueue == nullptr) {
3800         result += 1;
3801     }
3802     napi_value flag = nullptr;
3803     napi_create_double(env, result, &flag);
3804     return flag;
3805 }
3806 
ffrt_this_task_get_qos_0001(napi_env env,napi_callback_info info)3807 static napi_value ffrt_this_task_get_qos_0001(napi_env env, napi_callback_info info)
3808 {
3809     int result = 0;
3810     //ffrt test case begin
3811     ffrt_queue_attr_t queue_attr;
3812     (void)ffrt_queue_attr_init(&queue_attr);
3813     ffrt_queue_t currentQueue = ffrt_get_current_queue();
3814     ffrt_task_attr_t attr;
3815     ffrt_task_attr_init(&attr);
3816     ffrt_task_attr_set_qos(&attr, ffrt_qos_user_initiated);
3817     int result1 = 0;
3818     std::function<void()> &&basicFunc = [&result]() {
3819         ffrt_qos_t qos = ffrt_this_task_get_qos();
3820         if (qos != ffrt_qos_user_initiated) {
3821             result += 1;
3822         };
3823     };
3824     ffrt_queue_submit_h(currentQueue, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &attr);
3825     napi_value flag = nullptr;
3826     napi_create_double(env, result, &flag);
3827     if (result1 != 1) {
3828         result += 1;
3829         }
3830     return flag;
3831 }
3832 
ffrt_attr_stack_size_0001(napi_env env,napi_callback_info info)3833 static napi_value ffrt_attr_stack_size_0001(napi_env env, napi_callback_info info)
3834 {
3835     int result = 0;
3836     // 验证stack_size的set和get c接口
3837     int a = 0;
3838     ffrt_task_attr_t task_attr;
3839     (void)ffrt_task_attr_init(&task_attr);
3840     ffrt_task_attr_set_stack_size(&task_attr, UNIT_STACK_SIZE);
3841 
3842     std::function<void()>&& OnePlusFunc = [&a]() { a += 1; };
3843     ffrt_task_handle_t task = ffrt_submit_h_base(create_function_wrapper(OnePlusFunc), {}, {}, &task_attr);
3844     const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
3845     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
3846     ffrt_wait_deps(&wait);
3847     if (a != 1) {
3848         result = ERR_CODE_1;
3849     }
3850 
3851     uint64_t stackSize = ffrt_task_attr_get_stack_size(&task_attr);
3852     if (stackSize != UNIT_STACK_SIZE) {
3853         result = ERR_CODE_2;
3854     }
3855     ffrt_task_attr_destroy(&task_attr);
3856     ffrt_task_handle_destroy(task);
3857     napi_value flag = nullptr;
3858     napi_create_double(env, result, &flag);
3859     return flag;
3860 }
3861 
ffrt_task_handle_ref_0001(napi_env env,napi_callback_info info)3862 static napi_value ffrt_task_handle_ref_0001(napi_env env, napi_callback_info info)
3863 {
3864     int result = 0;
3865     // 验证handle的set和get c接口
3866     int a = 0;
3867     ffrt_task_attr_t task_attr;
3868     (void)ffrt_task_attr_init(&task_attr);
3869     ffrt_task_attr_set_delay(&task_attr, UNIT_TASK_DELAY);
3870 
3871     std::function<void()>&& OnePlusFunc = [&a]() { a += 1; };
3872     ffrt_task_handle_t task = ffrt_submit_h_base(create_function_wrapper(OnePlusFunc), {}, {}, &task_attr);
3873     uint32_t count = ffrt_task_handle_inc_ref(task);
3874     if (count != TASK_SUBMIT_REF) {
3875         result = ERR_CODE_1;
3876     }
3877     count = ffrt_task_handle_dec_ref(task);
3878     if (count != TASK_RELEASE_REF) {
3879         result = ERR_CODE_2;
3880     }
3881     const std::vector<ffrt_dependence_t> wait_deps = {{ffrt_dependence_task, task}};
3882     ffrt_deps_t wait{static_cast<uint32_t>(wait_deps.size()), wait_deps.data()};
3883     ffrt_wait_deps(&wait);
3884     if (a != 1) {
3885         result = ERR_CODE_3;
3886     }
3887     ffrt_task_attr_destroy(&task_attr);
3888     ffrt_task_handle_destroy(task);
3889     napi_value flag = nullptr;
3890     napi_create_double(env, result, &flag);
3891     return flag;
3892 }
3893 
OnePlusForTestQos(void * arg)3894 inline void OnePlusForTestQos(void* arg)
3895 {
3896     *(int*)arg = ffrt_this_task_update_qos(ffrt_qos_background);
3897     *(int*)arg += PARAM_100;
3898 }
3899 
OnePlusForGetIdTest(void * arg)3900 inline void OnePlusForGetIdTest(void* arg)
3901 {
3902     *(uint64_t*)arg = ffrt_this_task_get_id();
3903 }
3904 
FfrtThisTaskGetId(napi_env env,napi_callback_info info)3905 static napi_value FfrtThisTaskGetId(napi_env env, napi_callback_info info)
3906 {
3907     uint64_t taskId = SUCCESS;
3908     std::function<void()>&& GetPidFunc = [&taskId]() { OnePlusForGetIdTest((void *)(&taskId)); };
3909     ffrt_submit_base(create_function_wrapper(GetPidFunc), nullptr, nullptr, nullptr);
3910     ffrt_wait();
3911     napi_value result = nullptr;
3912     napi_create_int32(env, taskId != SUCCESS, &result);
3913     return result;
3914 }
3915 
FfrtThisTaskUpdateQos(napi_env env,napi_callback_info info)3916 static napi_value FfrtThisTaskUpdateQos(napi_env env, napi_callback_info info)
3917 {
3918     int pos = FAIL;
3919     std::function<void()>&& UpdateQosFunc = [&pos]() { OnePlusForTestQos((void *)(&pos)); };
3920     ffrt_submit_base(create_function_wrapper(UpdateQosFunc), nullptr, nullptr, nullptr);
3921     ffrt_wait();
3922     napi_value result = nullptr;
3923     napi_create_int32(env, pos, &result);
3924     return result;
3925 }
3926 
SuspendFunc(void * p)3927 static bool SuspendFunc([[maybe_unused]] void* p)
3928 {
3929     return true;
3930 }
3931 
ffrt_fiber_001(napi_env env,napi_callback_info info)3932 static napi_value ffrt_fiber_001(napi_env env, napi_callback_info info)
3933 {
3934     constexpr uint64_t stackSize = 16 * 1024;
3935     std::array<char, stackSize> stack;
3936     using fiber_t = ffrt::Fiber<>;
3937     std::atomic<int> a = {0};
3938     auto t = fiber_t::Init([&a] {
3939         for (int i = 0; i < 10; i++) {
3940             a++;
3941             fiber_t::Suspend(SuspendFunc);
3942         }
3943     }, &stack, stackSize);
3944     t->Start();
3945 
3946     napi_value result;
3947     napi_create_double(env, a.load(), &result);
3948     return result;
3949 }
3950 
3951 EXTERN_C_START
Init(napi_env env,napi_value exports)3952 static napi_value Init(napi_env env, napi_value exports)
3953 {
3954     napi_property_descriptor desc[] = {
3955         { "conditionVariableTest001", nullptr, ConditionVariableTest001, nullptr, nullptr, nullptr,
3956             napi_default, nullptr },
3957         { "conditionVariableTest002", nullptr, ConditionVariableTest002, nullptr, nullptr, nullptr,
3958             napi_default, nullptr },
3959         { "conditionVariableTest003", nullptr, ConditionVariableTest003, nullptr, nullptr, nullptr,
3960             napi_default, nullptr },
3961         { "conditionVariableTest004", nullptr, ConditionVariableTest004, nullptr, nullptr, nullptr,
3962             napi_default, nullptr },
3963         { "conditionVariableApiTest001", nullptr, ConditionVariableApiTest001, nullptr, nullptr, nullptr,
3964             napi_default, nullptr },
3965         { "conditionVariableApiTest002", nullptr, ConditionVariableApiTest002, nullptr, nullptr, nullptr,
3966             napi_default, nullptr },
3967         { "conditionVariableApiTest003", nullptr, ConditionVariableApiTest003, nullptr, nullptr, nullptr,
3968             napi_default, nullptr },
3969         { "conditionVariableApiTest004", nullptr, ConditionVariableApiTest004, nullptr, nullptr, nullptr,
3970             napi_default, nullptr },
3971         { "delayCTest001", nullptr, DelayCTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3972         { "ffrtYieldC0001", nullptr, FfrtYieldC0001, nullptr, nullptr, nullptr, napi_default, nullptr },
3973         { "recursiveMutexAbnormalParamTest001", nullptr, RecursiveMutexAbnormalParamTest001, nullptr,
3974             nullptr, nullptr, napi_default, nullptr },
3975         { "recursiveMutexAbnormalInvalidParamTest001", nullptr, RecursiveMutexAbnormalInvalidParamTest001, nullptr,
3976             nullptr, nullptr, napi_default, nullptr },
3977         { "mutexAbnormalParamTest001", nullptr, MutexAbnormalParamTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3978         { "mutexAbnormalParamTest002", nullptr, MutexAbnormalParamTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
3979         { "mutexTest006", nullptr, MutexTest006, nullptr, nullptr, nullptr, napi_default, nullptr },
3980         { "mutexTest007", nullptr, MutexTest007, nullptr, nullptr, nullptr, napi_default, nullptr },
3981         { "mutexTest008", nullptr, MutexTest008, nullptr, nullptr, nullptr, napi_default, nullptr },
3982         { "queueApiTest001", nullptr, QueueApiTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3983         { "queueApiTest002", nullptr, QueueApiTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
3984         { "queueApiTest003", nullptr, QueueApiTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
3985         { "queueApiTest004", nullptr, QueueApiTest004, nullptr, nullptr, nullptr, napi_default, nullptr },
3986         { "queueApiTest005", nullptr, QueueApiTest005, nullptr, nullptr, nullptr, napi_default, nullptr },
3987         { "queueApiTest006", nullptr, QueueApiTest006, nullptr, nullptr, nullptr, napi_default, nullptr },
3988         { "queueApiTest007", nullptr, QueueApiTest007, nullptr, nullptr, nullptr, napi_default, nullptr },
3989         { "queueApiTest008", nullptr, QueueApiTest008, nullptr, nullptr, nullptr, napi_default, nullptr },
3990         { "queueApiTest009", nullptr, QueueApiTest009, nullptr, nullptr, nullptr, napi_default, nullptr },
3991         { "queueApiTest010", nullptr, QueueApiTest010, nullptr, nullptr, nullptr, napi_default, nullptr },
3992         { "queueApiTest011", nullptr, QueueApiTest011, nullptr, nullptr, nullptr, napi_default, nullptr },
3993         { "queueApiTest012", nullptr, QueueApiTest012, nullptr, nullptr, nullptr, napi_default, nullptr },
3994         { "queueApiTest013", nullptr, QueueApiTest013, nullptr, nullptr, nullptr, napi_default, nullptr },
3995         { "queueApiTest014", nullptr, QueueApiTest014, nullptr, nullptr, nullptr, napi_default, nullptr },
3996         { "queueApiTest015", nullptr, QueueApiTest015, nullptr, nullptr, nullptr, napi_default, nullptr },
3997         { "queueApiTest016", nullptr, QueueApiTest016, nullptr, nullptr, nullptr, napi_default, nullptr },
3998         { "queueCancelTest001", nullptr, QueueCancelTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
3999         { "queueCancelTest003", nullptr, QueueCancelTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
4000         { "queueCancelTest004", nullptr, QueueCancelTest004, nullptr, nullptr, nullptr, napi_default, nullptr },
4001         { "queueDelayTest001", nullptr, QueueDelayTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4002         { "queueDelayTest002", nullptr, QueueDelayTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
4003         { "queueDelayTest005", nullptr, QueueDelayTest005, nullptr, nullptr, nullptr, napi_default, nullptr },
4004         { "queueDfxTest001", nullptr, QueueDfxTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4005         { "queueDfxTest002", nullptr, QueueDfxTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
4006         { "queueDfxTest003", nullptr, QueueDfxTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
4007         { "queueDfxTest004", nullptr, QueueDfxTest004, nullptr, nullptr, nullptr, napi_default, nullptr },
4008         { "queueDfxTest005", nullptr, QueueDfxTest005, nullptr, nullptr, nullptr, napi_default, nullptr },
4009         { "queueDfxTest006", nullptr, QueueDfxTest006, nullptr, nullptr, nullptr, napi_default, nullptr },
4010         { "queueTest001", nullptr, QueueTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4011         { "queueTest002", nullptr, QueueTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
4012         { "queueTest003", nullptr, QueueTest003, nullptr, nullptr, nullptr, napi_default, nullptr },
4013         { "queueWaitTest001", nullptr, QueueWaitTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4014         { "submitAbnormalTest", nullptr, SubmitAbnormalTest, nullptr, nullptr, nullptr, napi_default, nullptr },
4015         { "submitBasicTest001", nullptr, SubmitBasicTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4016         { "submitBasicTest002", nullptr, SubmitBasicTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
4017         { "submitInDependEmptyTest", nullptr, SubmitInDependEmptyTest, nullptr, nullptr, nullptr,
4018             napi_default, nullptr },
4019         { "submitInDependNullptrTest", nullptr, SubmitInDependNullptrTest, nullptr, nullptr, nullptr,
4020             napi_default, nullptr },
4021         { "submitOuDependEmptyTest", nullptr, SubmitOuDependEmptyTest, nullptr, nullptr, nullptr,
4022             napi_default, nullptr },
4023         { "submitOuDependNullptrTest", nullptr, SubmitOuDependNullptrTest, nullptr, nullptr, nullptr,
4024             napi_default, nullptr },
4025         { "submitIODependTest001", nullptr, SubmitIODependTest001, nullptr, nullptr, nullptr,
4026             napi_default, nullptr },
4027         { "submitIODependTest002", nullptr, SubmitIODependTest002, nullptr, nullptr, nullptr,
4028             napi_default, nullptr },
4029         { "submitIn0Ou0WaitNullTask1Test", nullptr, SubmitIn0Ou0WaitNullTask1Test, nullptr, nullptr, nullptr,
4030             napi_default, nullptr },
4031         { "submitHBasicTest001", nullptr, SubmitHBasicTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4032         { "submitHBasicTest002", nullptr, SubmitHBasicTest002, nullptr, nullptr, nullptr, napi_default, nullptr },
4033         { "submitHFTest001", nullptr, SubmitHFTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4034         { "submitFTest001", nullptr, SubmitFTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4035         { "submitHInDependEmptyTest", nullptr, SubmitHInDependEmptyTest, nullptr, nullptr, nullptr,
4036             napi_default, nullptr },
4037         { "submitHInDependNullptrTest", nullptr, SubmitHInDependNullptrTest, nullptr, nullptr, nullptr,
4038             napi_default, nullptr },
4039         { "submitHOuDependEmptyTest", nullptr, SubmitHOuDependEmptyTest, nullptr, nullptr, nullptr,
4040             napi_default, nullptr },
4041         { "submitHOuDependNullptrTest", nullptr, SubmitHOuDependNullptrTest, nullptr, nullptr, nullptr,
4042             napi_default, nullptr },
4043         { "submitHIODependTest001", nullptr, SubmitHIODependTest001, nullptr, nullptr, nullptr,
4044             napi_default, nullptr },
4045         { "submitHIODependTest002", nullptr, SubmitHIODependTest002, nullptr, nullptr, nullptr,
4046             napi_default, nullptr },
4047         { "sleepForTest000", nullptr, SleepForTest000, nullptr, nullptr, nullptr, napi_default, nullptr },
4048         { "sleepForTest001", nullptr, SleepForTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4049         { "taskAttrAbnormalTest", nullptr, TaskAttrAbnormalTest, nullptr, nullptr, nullptr, napi_default, nullptr },
4050         { "taskAttrQosIllegalTest", nullptr, TaskAttrQosIllegalTest, nullptr, nullptr, nullptr, napi_default, nullptr },
4051         { "taskAttrQosQueryTest", nullptr, TaskAttrQosQueryTest, nullptr, nullptr, nullptr, napi_default, nullptr },
4052         { "taskAttrSetNameTest", nullptr, TaskAttrSetNameTest, nullptr, nullptr, nullptr, napi_default, nullptr },
4053         { "taskAttrSetQosTest", nullptr, TaskAttrSetQosTest, nullptr, nullptr, nullptr, napi_default, nullptr },
4054         { "ffrt_timer_start_0001", nullptr, ffrt_timer_start_0001, nullptr, nullptr, nullptr, napi_default, nullptr },
4055         { "ffrt_timer_start_0002", nullptr, ffrt_timer_start_0002, nullptr, nullptr, nullptr, napi_default, nullptr },
4056         { "ffrt_timer_cancel_0001", nullptr, ffrt_timer_cancel_0001, nullptr, nullptr, nullptr, napi_default, nullptr },
4057         { "ffrt_loop_0001", nullptr, ffrt_loop_0001, nullptr, nullptr, nullptr, napi_default, nullptr },
4058         { "ffrt_loop_0002", nullptr, ffrt_loop_0002, nullptr, nullptr, nullptr, napi_default, nullptr },
4059         { "ffrt_timer_start_abnormal_0001", nullptr, ffrt_timer_start_abnormal_0001, nullptr,
4060             nullptr, nullptr, napi_default, nullptr },
4061         { "ffrt_loop_abnormal_0001", nullptr, ffrt_loop_abnormal_0001, nullptr, nullptr, nullptr,
4062             napi_default, nullptr },
4063         { "ffrt_loop_abnormal_0002", nullptr, ffrt_loop_abnormal_0002, nullptr, nullptr, nullptr,
4064             napi_default, nullptr },
4065         { "ffrt_queue_parallel_api_0001", nullptr, ffrt_queue_parallel_api_0001, nullptr, nullptr,
4066             nullptr, napi_default,
4067             nullptr },
4068         { "ffrt_queue_parallel_api_0002", nullptr, ffrt_queue_parallel_api_0002, nullptr, nullptr,
4069             nullptr, napi_default, nullptr },
4070         { "ffrt_queue_parallel_api_0003", nullptr, ffrt_queue_parallel_api_0003, nullptr, nullptr,
4071             nullptr, napi_default, nullptr },
4072         { "ffrt_queue_parallel_api_0004", nullptr, ffrt_queue_parallel_api_0004, nullptr, nullptr,
4073             nullptr, napi_default, nullptr },
4074         { "queue_parallel_cancel_0001", nullptr, queue_parallel_cancel_0001, nullptr, nullptr,
4075             nullptr, napi_default, nullptr },
4076         { "queue_parallel_cancel_0002", nullptr, queue_parallel_cancel_0002, nullptr, nullptr,
4077             nullptr, napi_default, nullptr },
4078         { "queue_parallel_0001", nullptr, queue_parallel_0001, nullptr, nullptr, nullptr, napi_default, nullptr },
4079         { "queue_parallel_0002", nullptr, queue_parallel_0002, nullptr, nullptr, nullptr, napi_default, nullptr },
4080         { "ffrt_loop_abnormal_0003", nullptr, ffrt_loop_abnormal_0003, nullptr, nullptr,
4081             nullptr, napi_default, nullptr },
4082         { "ffrt_loop_normal_0003", nullptr, ffrt_loop_normal_0003, nullptr, nullptr,
4083             nullptr, napi_default, nullptr },
4084         { "ffrt_get_main_queue_0001", nullptr, ffrt_get_main_queue_0001, nullptr, nullptr,
4085             nullptr, napi_default, nullptr },
4086         { "ffrt_get_current_queue_0001", nullptr, ffrt_get_current_queue_0001, nullptr, nullptr,
4087             nullptr, napi_default, nullptr },
4088         { "ffrt_this_task_get_qos_0001", nullptr, ffrt_this_task_get_qos_0001, nullptr, nullptr,
4089             nullptr, napi_default, nullptr },
4090         { "ffrt_attr_stack_size_0001", nullptr, ffrt_attr_stack_size_0001, nullptr, nullptr,
4091             nullptr, napi_default, nullptr },
4092         { "ffrt_task_handle_ref_0001", nullptr, ffrt_task_handle_ref_0001, nullptr, nullptr,
4093             nullptr, napi_default, nullptr },
4094         { "ffrtThisTaskGetId", nullptr, FfrtThisTaskGetId, nullptr, nullptr, nullptr, napi_default, nullptr },
4095         { "ffrtThisTaskUpdateQos", nullptr, FfrtThisTaskUpdateQos, nullptr, nullptr, nullptr, napi_default, nullptr },
4096         { "sharedMutexTest001", nullptr, SharedMutexTest001, nullptr, nullptr, nullptr, napi_default, nullptr },
4097         { "ffrt_fiber_001", nullptr, ffrt_fiber_001, nullptr, nullptr, nullptr, napi_default, nullptr }
4098     };
4099     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
4100     return exports;
4101 }
4102 EXTERN_C_END
4103 
4104 static napi_module demoModule = {
4105     .nm_version =1,
4106     .nm_flags = 0,
4107     .nm_filename = nullptr,
4108     .nm_register_func = Init,
4109     .nm_modname = "entry",
4110     .nm_priv = ((void*)0),
4111     .reserved = { 0 },
4112 };
4113 
RegisterEntryModule(void)4114 extern "C" __attribute__((constructor)) void RegisterEntryModule(void)
4115 {
4116     napi_module_register(&demoModule);
4117 }
4118