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