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