1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <thread>
17 #include <chrono>
18 #include <gtest/gtest.h>
19 #include "ffrt_inner.h"
20 #include "c/queue_ext.h"
21 #include "../common.h"
22 
23 using namespace std;
24 using namespace ffrt;
25 using namespace testing;
26 #ifdef HWTEST_TESTING_EXT_ENABLE
27 using namespace testing::ext;
28 #endif
29 
30 class QueueTest : public testing::Test {
31 protected:
SetUpTestCase()32     static void SetUpTestCase()
33     {
34     }
35 
TearDownTestCase()36     static void TearDownTestCase()
37     {
38     }
39 
SetUp()40     virtual void SetUp()
41     {
42     }
43 
TearDown()44     virtual void TearDown()
45     {
46     }
47 };
48 
49 #if defined(__clang__)
50 #define OPTIMIZE_OFF __attribute__((optnone))
51 #elif defined(__GNUC__)
52 #define OPTIMIZE_OFF __attribute__((optimize(0)))
53 #else
54 #define OPTIMIZE_OFF
55 #endif
56 
57 namespace {
OnePlusForTest(void * data)58 void OPTIMIZE_OFF OnePlusForTest(void* data)
59 {
60     *(int*)data += 1;
61 }
62 
PrintForTest(void * data)63 void PrintForTest(void* data)
64 {
65     printf("run no input func PrintForTest\n");
66 }
67 
fibonacci(int n)68 int fibonacci(int n)
69 {
70     if (n == 0 || n == 1) {
71         return n;
72     }
73     return fibonacci(n - 1) + fibonacci(n - 2);
74 }
75 
FibonacciTest(void * data,int fibnum)76 void FibonacciTest(void* data, int fibnum)
77 {
78     int testnum = fibonacci(fibnum);
79     *(int*)data += testnum;
80 }
81 } // namespace
82 
83 /*
84  * 测试用例名称 :serial_queue_submit_cancel_succ
85  * 测试用例描述:提交、取消串行延时任务成功
86  * 预置条件    :1、调用串行队列创建接口创建队列
87  * 操作步骤    :1、提交串行队列任务并执行
88  *             2、提交延时串行队列任务并执行
89  * 预期结果    :执行成功
90  */
91 HWTEST_F(QueueTest, serial_queue_submit_cancel_succ, TestSize.Level1)
92 {
93     // 创建队列
94     ffrt_queue_attr_t queue_attr;
95     (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
96     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
97 
98     int result = 0;
__anon0d588a1c0202() 99     std::function<void()> basicFunc = [&result]() { OnePlusForTest(static_cast<void*>(&result)); };
100     ffrt_queue_submit(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
101 
102     ffrt_task_handle_t task1 =
103         ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
104     ffrt_queue_wait(task1);
105     ffrt_task_handle_destroy(task1); // 销毁task_handle,必须
106     EXPECT_EQ(result, 2);
107 
108     ffrt_task_attr_t task_attr;
109     (void)ffrt_task_attr_init(&task_attr); // 初始化task属性,必须
110     ffrt_task_attr_set_delay(&task_attr, 1000); // 设置任务1ms后才执行,非必须
111     ffrt_task_handle_t task2 =
112         ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
113     int cancel = ffrt_queue_cancel(task2);
114     ffrt_task_handle_destroy(task2); // 销毁task_handle,必须
115     ffrt_queue_attr_destroy(&queue_attr);
116     EXPECT_EQ(cancel, 0);
117     EXPECT_EQ(result, 2);
118 
119     // 销毁队列
120     ffrt_queue_destroy(queue_handle);
121 }
122 
123 /*
124  * 测试用例名称:serial_queue_create_fail
125  * 测试用例描述:串行队列创建和销毁失败
126  * 预置条件    :1、调用串行队列创建接口创建队列
127  * 操作步骤    :1、调用串行队列创建接口创建队列,type为非串行队列
128  *             2、调用串行队列创建接口创建队列,type为串行队列,但name和attr为nullptr
129  *             3、调用串行队列创建接口创建队列,type为串行队列,但name为nullptr
130  * 预期结果    :1创建失败,2、3创建成功
131  */
132 HWTEST_F(QueueTest, serial_queue_create_fail, TestSize.Level1)
133 {
134     // input invalid
135     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_max, nullptr, nullptr);
136     ffrt_queue_destroy(queue_handle);
137     ffrt_queue_destroy(nullptr);
138 
139     queue_handle = ffrt_queue_create(ffrt_queue_serial, nullptr, nullptr);
140     EXPECT_EQ(queue_handle == nullptr, 0);
141     ffrt_queue_destroy(queue_handle);
142 
143     // succ free
144     ffrt_queue_attr_t queue_attr;
145     (void)ffrt_queue_attr_init(&queue_attr); // attr 缺少 init 无法看护
146     queue_handle = ffrt_queue_create(ffrt_queue_serial, nullptr, &queue_attr);
147     EXPECT_EQ(queue_handle == nullptr, 0);
148     ffrt_queue_attr_destroy(&queue_attr);
149     ffrt_queue_destroy(queue_handle);
150 }
151 
152 /*
153  * 测试用例名称:ffrt_task_attr_set_get_delay
154  * 测试用例描述:测试 ffrt_task_attr_set_get_delay
155  * 操作步骤    :1、调用ffrt_task_attr_set_delay接口设置队列延时时间
156  *             2、使用ffrt_task_attr_get_delay查询时间
157  * 预期结果    :查询结果与设定相同,初始值为0
158  */
159 HWTEST_F(QueueTest, ffrt_task_attr_set_get_delay, TestSize.Level1)
160 {
161     // succ free
162     ffrt_task_attr_t task_attr;
163     (void)ffrt_task_attr_init(&task_attr); // attr 缺少 init 无法看护
164     // set_attr_delay
165     uint64_t delay = 100;
166     ffrt_task_attr_set_delay(nullptr, delay);
167     ffrt_task_attr_set_delay(&task_attr, delay);
168     // error and return 0
169     delay = ffrt_task_attr_get_delay(nullptr);
170     EXPECT_EQ(delay, 0);
171     delay = ffrt_task_attr_get_delay(&task_attr);
172     EXPECT_EQ(delay, 100);
173     ffrt_task_attr_destroy(&task_attr);
174 }
175 
176 /*
177  * 测试用例名称:serial_queue_task_create_destroy_fail
178  * 测试用例描述:串行任务提交和销毁失败
179  * 操作步骤    :1、直接调用串行队列接口提交空任务,随后销毁任务
180  *             2、调用串行队列创建接口创建队列并提交空任务
181  *             3、调用串行队列创建接口创建队列并提交任务,随后销毁任务
182  * 预期结果    :2提交失败并返回nullptr,3提交成功
183  */
184 HWTEST_F(QueueTest, serial_queue_task_create_destroy_fail, TestSize.Level1)
185 {
186     // input invalid
187     ffrt_task_handle_t task = ffrt_queue_submit_h(nullptr, nullptr, nullptr);
188     ffrt_task_handle_destroy(task);
189 
190     ffrt_queue_attr_t queue_attr;
191     (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
192     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
193     task = ffrt_queue_submit_h(queue_handle, nullptr, nullptr);
194     EXPECT_EQ(task == nullptr, 1);
195 
196     std::function<void()> basicFunc = std::bind(PrintForTest, nullptr);
197     task = ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
198     ffrt_queue_wait(task);
199     // succ free
200     EXPECT_EQ(task == nullptr, 0);
201     ffrt_task_handle_destroy(task);
202     ffrt_queue_attr_destroy(&queue_attr);
203 }
204 
205 /*
206  * 测试用例名称:serial_multi_submit_succ
207  * 测试用例描述:循环提交普通任务和延时任务,执行成功
208  * 操作步骤    :1、循环提交普通任务90次
209  *             2、循环提交延时任务20次,取消10次
210  * 预期结果    :总共应执行100+取消前已执行的次数
211  */
212 HWTEST_F(QueueTest, serial_multi_submit_succ, TestSize.Level1)
213 {
214     ffrt_queue_attr_t queue_attr;
215     (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
216     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
217 
218     int result = 0;
219     int cancelFailedNum = 0;
__anon0d588a1c0302() 220     std::function<void()>&& basicFunc = [&result]() { OnePlusForTest(static_cast<void*>(&result)); };
221     ffrt_task_attr_t task_attr;
222     (void)ffrt_task_attr_init(&task_attr); // 初始化task属性,必须
223     ffrt_task_attr_set_delay(&task_attr, 100); // 设置任务0.1ms后才执行,非必须
224 
225     for (int n = 0; n < 10; ++n) {
226         for (int i = 0; i < 9; ++i) {
227             ffrt_queue_submit(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
228         }
229 
230         ffrt_task_handle_t t1 =
231             ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
232         ffrt_task_handle_t t2 =
233             ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
234         cancelFailedNum += ffrt_queue_cancel(t1);
235         ffrt_task_handle_destroy(t1); // 销毁task_handle,必须
236 
237         ffrt_queue_wait(t2);
238         ffrt_task_handle_destroy(t2);
239     }
240 
241     EXPECT_EQ(result, (cancelFailedNum + 100));
242     ffrt_queue_attr_destroy(&queue_attr);
243     ffrt_queue_destroy(queue_handle);
244 }
245 
246 /*
247  * 测试用例名称:serial_early_quit_succ
248  * 测试用例描述:主动销毁队列,未执行的任务取消
249  * 操作步骤    :1、提交10000个斐波那契任务
250  *             2、至少取消1个
251  * 预期结果    :取消成功
252  */
253 HWTEST_F(QueueTest, serial_early_quit_succ, TestSize.Level1)
254 {
255     ffrt_queue_attr_t queue_attr;
256     (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
257     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
258     int fibnum = 10;
259     int result = 0;
260     int expect = fibonacci(fibnum);
__anon0d588a1c0402() 261     std::function<void()>&& basicFunc = [&result, fibnum]() {
262         FibonacciTest(static_cast<void*>(&result), fibnum);
263         usleep(10);
264     };
265     for (int i = 0; i < 10000; ++i) {
266         ffrt_queue_submit(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
267     }
268 
269     ffrt_queue_destroy(queue_handle);
270     printf("result = %d\n", result);
271     EXPECT_EQ(result < expect * 10000, 1);
272 }
273 
274 /*
275  * 测试用例名称:serial_double_cancel_failed
276  * 测试用例描述:对一个任务取消两次
277  * 操作步骤    :1、调用串行队列创建接口创建队列,设置延时并提交任务
278  *             2、调用两次ffrt_queue_cancel取消同一任务
279  * 预期结果    :首次取消成功,第二次取消失败
280  */
281 HWTEST_F(QueueTest, serial_double_cancel_failed, TestSize.Level1)
282 {
283     ffrt_queue_attr_t queue_attr;
284     (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
285     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
286 
287     int result = 0;
__anon0d588a1c0502() 288     std::function<void()>&& basicFunc = [&result]() { OnePlusForTest(static_cast<void*>(&result)); };
289     ffrt_task_attr_t task_attr;
290     (void)ffrt_task_attr_init(&task_attr); // 初始化task属性,必须
291     ffrt_task_attr_set_delay(&task_attr, 100); // 设置任务0.1ms后才执行,非必须
292 
293     ffrt_task_handle_t t1 =
294         ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
295     int cancel = ffrt_queue_cancel(t1);
296     EXPECT_EQ(cancel, 0);
297     cancel = ffrt_queue_cancel(t1);
298     EXPECT_EQ(cancel, 1);
299     ffrt_task_handle_destroy(t1); // 销毁task_handle,必须
300 
301     ffrt_queue_destroy(queue_handle);
302 }
303 
304 /*
305  * 测试用例名称:ffrt_queue_attr_des
306  * 测试用例描述:设置串行队列qos等级,销毁队列attr
307  * 操作步骤    :1、设置队列qos等级,调用串行队列创建接口创建队列
308  *             2、调用ffrt_queue_attr_destroy接口销毁队列创建的attr
309  * 预期结果    :设置与销毁成功
310  */
311 HWTEST_F(QueueTest, ffrt_queue_attr_des, TestSize.Level1)
312 {
313     ffrt_queue_attr_t queue_attr;
314     (void)ffrt_queue_attr_init(&queue_attr);
315     ffrt_queue_attr_set_qos(&queue_attr, ffrt_qos_background);
316     ffrt_qos_t qos = ffrt_queue_attr_get_qos(&queue_attr);
317     EXPECT_EQ(qos == ffrt_qos_background, 1);
318     ffrt_queue_attr_destroy(&queue_attr);
319 }
320 
321 /*
322  * 测试用例名称:ffrt_queue_delay_timeout
323  * 测试用例描述:任务队列超时,以及延时任务
324  * 操作步骤    :1、设置队列超时时间与超时回调,调用串行队列创建接口创建队列
325  *             2、设置延时并提交任务
326  * 预期结果    :超时执行回调
327  */
328 HWTEST_F(QueueTest, ffrt_queue_delay_timeout, TestSize.Level1)
329 {
330     int x = 0;
__anon0d588a1c0602() 331     std::function<void()>&& basicFunc1 = [&]() {
332         x = x + 1;
333     };
334     ffrt_function_header_t* ffrt_header_t = ffrt::create_function_wrapper((basicFunc1));
335 
336     ffrt_queue_attr_t queue_attr;
337     (void)ffrt_queue_attr_init(&queue_attr);
338     ffrt_queue_attr_set_callback(&queue_attr, ffrt_header_t);
339     ffrt_queue_attr_set_timeout(&queue_attr, 2000);
340     uint64_t timeout = ffrt_queue_attr_get_timeout(&queue_attr);
341     EXPECT_EQ(timeout, 2000);
342 
343     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
344 
345     int result = 0;
__anon0d588a1c0702() 346     std::function<void()>&& basicFunc = [&result]() {
347         OnePlusForTest(static_cast<void*>(&result));
348         usleep(3000);
349     };
350     ffrt_task_attr_t task_attr;
351     (void)ffrt_task_attr_init(&task_attr);
352     ffrt_task_attr_set_delay(&task_attr, 1000);
353 
354     ffrt_task_handle_t t1 =
355         ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
356 
357     ffrt_queue_wait(t1);
358     ffrt_task_handle_destroy(t1);
359     EXPECT_EQ(result, 1);
360     EXPECT_EQ(x, 1);
361     ffrt_queue_destroy(queue_handle);
362 }
363 
364 HWTEST_F(QueueTest, ffrt_queue_dfx_api_0001, TestSize.Level1)
365 {
366     // ffrt_queue_attr_set_timeout接口attr为异常值
367     ffrt_queue_attr_t queue_attr;
368     (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
369     ffrt_queue_attr_set_timeout(nullptr, 10000);
370     uint64_t time = ffrt_queue_attr_get_timeout(&queue_attr);
371     EXPECT_EQ(time, 0);
372     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
373     EXPECT_TRUE(queue_handle != nullptr);
374 
375     // 销毁队列
376     ffrt_queue_attr_destroy(&queue_attr);
377     ffrt_queue_destroy(queue_handle);
378 }
379 
380 HWTEST_F(QueueTest, ffrt_queue_dfx_api_0002, TestSize.Level1)
381 {
382     // ffrt_queue_attr_get_timeout接口attr为异常值
383     ffrt_queue_attr_t queue_attr;
384     (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
385     ffrt_queue_attr_set_timeout(&queue_attr, 10000);
386     uint64_t time = ffrt_queue_attr_get_timeout(nullptr);
387     EXPECT_EQ(time, 0);
388     time = ffrt_queue_attr_get_timeout(&queue_attr);
389     EXPECT_EQ(time, 10000);
390     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
391     EXPECT_TRUE(queue_handle != nullptr);
392 
393     // 销毁队列
394     ffrt_queue_attr_destroy(&queue_attr);
395     ffrt_queue_destroy(queue_handle);
396 }
397 
398 HWTEST_F(QueueTest, ffrt_queue_dfx_api_0003, TestSize.Level1)
399 {
400     // ffrt_queue_attr_set_timeoutCb接口attr为异常值
__anon0d588a1c0802() 401     std::function<void()> cbOne = []() { printf("first set callback\n"); };
402 
403     ffrt_queue_attr_t queue_attr;
404     (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
405     ffrt_queue_attr_set_callback(nullptr, ffrt::create_function_wrapper(cbOne, ffrt_function_kind_queue));
406     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
407     EXPECT_TRUE(queue_handle != nullptr);
408 
409     // 销毁队列
410     ffrt_queue_attr_destroy(&queue_attr);
411     ffrt_queue_destroy(queue_handle);
412 }
413 
414 HWTEST_F(QueueTest, ffrt_queue_dfx_api_0004, TestSize.Level1)
415 {
416     // ffrt_queue_attr_get_timeoutCb接口attr为异常值
__anon0d588a1c0902() 417     std::function<void()> cbOne = []() { printf("first set callback\n"); };
418 
419     ffrt_queue_attr_t queue_attr;
420     (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
421     ffrt_queue_attr_set_callback(&queue_attr, ffrt::create_function_wrapper(cbOne, ffrt_function_kind_queue));
422     ffrt_function_header_t* func = ffrt_queue_attr_get_callback(nullptr);
423     EXPECT_TRUE(func == nullptr);
424     func = ffrt_queue_attr_get_callback(&queue_attr);
425     EXPECT_TRUE(func != nullptr);
426     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
427     EXPECT_TRUE(queue_handle != nullptr);
428 
429     // 销毁队列
430     ffrt_queue_destroy(queue_handle);
431     ffrt_queue_attr_destroy(&queue_attr);
432 }
433 
434 /*
435  * 测试用例名称:ffrt_task_attr_set_queue_priority
436  * 测试用例描述:测试ffrt_task_attr_set_queue_priority
437  * 操作步骤    :1、调用ffrt_task_attr_set_queue_priority接口设置队列优先级
438  *             2、使用ffrt_task_attr_get_queue_priority查询优先级
439  * 预期结果    :查询结果与设定相同,值为3
440  */
441 HWTEST_F(QueueTest, ffrt_task_attr_set_queue_priority, TestSize.Level1)
442 {
443     ffrt_task_attr_t task_attr;
444     (void)ffrt_task_attr_init(&task_attr);
445     ffrt_queue_priority_t priority = ffrt_queue_priority_low;
446     ffrt_task_attr_set_queue_priority(nullptr, priority);
447     ffrt_task_attr_set_queue_priority(&task_attr, priority);
448     priority = ffrt_task_attr_get_queue_priority(nullptr);
449     EXPECT_EQ(priority, ffrt_queue_priority_immediate);
450     priority = ffrt_task_attr_get_queue_priority(&task_attr);
451     EXPECT_EQ(priority, ffrt_queue_priority_low);
452     ffrt_task_attr_destroy(&task_attr);
453 }
454 
455 /*
456  * 测试用例名称:ffrt_queue_attr_set_max_concurrency
457  * 测试用例描述:测试ffrt_queue_attr_set_max_concurrency
458  * 操作步骤    :1、调用ffrt_queue_attr_set_max_concurrency设置FFRT并行队列,并行度为4
459  *             2、使用ffrt_queue_attr_get_max_concurrency查询并行度
460  * 预期结果    :查询结果与设定相同,值为4
461  */
462 HWTEST_F(QueueTest, ffrt_queue_attr_set_max_concurrency, TestSize.Level1)
463 {
464     ffrt_queue_attr_t queue_attr;
465     (void)ffrt_queue_attr_init(&queue_attr);
466     uint64_t concurrency = 4;
467     ffrt_queue_attr_set_max_concurrency(nullptr, concurrency);
468     ffrt_queue_attr_set_max_concurrency(&queue_attr, concurrency);
469     concurrency = ffrt_queue_attr_get_max_concurrency(nullptr);
470     EXPECT_EQ(concurrency, 0);
471     concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
472     EXPECT_EQ(concurrency, 4);
473     ffrt_queue_attr_destroy(&queue_attr);
474 
475     ffrt_queue_attr_t queue_attr1;
476     (void)ffrt_queue_attr_init(&queue_attr1);
477     concurrency = 0;
478     ffrt_queue_attr_set_max_concurrency(&queue_attr1, concurrency);
479     concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr1);
480     EXPECT_EQ(concurrency, 1);
481     ffrt_queue_attr_destroy(&queue_attr1);
482 }
483 
484 HWTEST_F(QueueTest, ffrt_queue_has_task, TestSize.Level1)
485 {
486     ffrt_queue_attr_t queue_attr;
487     (void)ffrt_queue_attr_init(&queue_attr);
488     ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
489 
490     std::mutex lock;
491     lock.lock();
__anon0d588a1c0a02() 492     std::function<void()> basicFunc = [&]() { lock.lock(); };
__anon0d588a1c0b02() 493     std::function<void()> emptyFunc = []() {};
494 
495     ffrt_task_attr_t task_attr;
496     ffrt_task_attr_init(&task_attr);
497     ffrt_task_attr_set_name(&task_attr, "basic_function");
498     ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
499         create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
500 
501     for (int i = 0; i < 10; i++) {
502         std::string name = "empty_function_" + std::to_string(i);
503         ffrt_task_attr_set_name(&task_attr, name.c_str());
504         ffrt_queue_submit(queue_handle, create_function_wrapper(emptyFunc, ffrt_function_kind_queue), &task_attr);
505     }
506 
507     for (int i = 0; i < 10; i++) {
508         std::string name = "empty_function_" + std::to_string(i);
509         bool hasEmptyTask = ffrt_queue_has_task(queue_handle, name.c_str());
510         EXPECT_EQ(hasEmptyTask, true);
511     }
512 
513     bool hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_.*");
514     EXPECT_EQ(hasEmptyTask, true);
515 
516     hasEmptyTask = ffrt_queue_has_task(queue_handle, "random_function");
517     EXPECT_EQ(hasEmptyTask, false);
518 
519     lock.unlock();
520     ffrt_queue_wait(handle);
521 
522     ffrt_queue_attr_destroy(&queue_attr);
523     ffrt_queue_destroy(queue_handle);
524 }
525 
526 HWTEST_F(QueueTest, ffrt_queue_cancel_all_and_cancel_by_name, TestSize.Level1)
527 {
528     ffrt_queue_attr_t queue_attr;
529     (void)ffrt_queue_attr_init(&queue_attr);
530     ffrt_queue_t queue_handle = ffrt_queue_create(
531         static_cast<ffrt_queue_type_t>(ffrt_queue_eventhandler_adapter), "test_queue", &queue_attr);
532 
533     std::mutex lock;
534     lock.lock();
__anon0d588a1c0c02() 535     std::function<void()> basicFunc = [&]() { lock.lock(); };
__anon0d588a1c0d02() 536     std::function<void()> emptyFunc = []() {};
537 
538     ffrt_task_attr_t task_attr;
539     ffrt_task_attr_init(&task_attr);
540     ffrt_task_attr_set_name(&task_attr, "basic_function");
541     ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
542         create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
543 
544     for (int i = 0; i < 10; i++) {
545         std::string name = "empty_function_" + std::to_string(i);
546         ffrt_task_attr_set_name(&task_attr, name.c_str());
547         ffrt_queue_submit(queue_handle, create_function_wrapper(emptyFunc, ffrt_function_kind_queue), &task_attr);
548     }
549 
550     bool hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_3");
551     EXPECT_EQ(hasEmptyTask, true);
552 
553     ffrt_queue_cancel_by_name(queue_handle, "empty_function_3");
554 
555     hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_3");
556     EXPECT_EQ(hasEmptyTask, false);
557 
558     hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_.*");
559     EXPECT_EQ(hasEmptyTask, true);
560 
561     bool isIdle = ffrt_queue_is_idle(queue_handle);
562     EXPECT_EQ(isIdle, false);
563 
564     ffrt_queue_cancel_all(queue_handle);
565 
566     hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_.*");
567     EXPECT_EQ(hasEmptyTask, false);
568 
569     lock.unlock();
570     ffrt_queue_cancel_and_wait(queue_handle);
571     ffrt_queue_wait(handle);
572 
573     isIdle = ffrt_queue_is_idle(queue_handle);
574     EXPECT_EQ(isIdle, true);
575 
576     ffrt_queue_attr_destroy(&queue_attr);
577     ffrt_queue_destroy(queue_handle);
578 }
579 
580 HWTEST_F(QueueTest, ffrt_queue_deque_task_priority_with_greedy, TestSize.Level1)
581 {
582     ffrt_queue_attr_t queue_attr;
583     (void)ffrt_queue_attr_init(&queue_attr);
584     ffrt_queue_t queue_handle = ffrt_queue_create(
585         static_cast<ffrt_queue_type_t>(ffrt_queue_eventhandler_adapter), "test_queue", &queue_attr);
586 
587     std::mutex lock;
588     lock.lock();
__anon0d588a1c0e02() 589     std::function<void()> basicFunc = [&]() { lock.lock(); };
590     std::vector<std::function<void()>> priorityFuncs(5, nullptr);
591     std::vector<int> priorityCount(5, 0);
592     for (int idx = 0; idx < 5; idx++) {
__anon0d588a1c0f02() 593         priorityFuncs[idx] = [idx, &priorityCount]() {
594             if (idx < 4 && priorityCount[idx + 1] == 0) {
595                 priorityCount[idx]++;
596             }
597 
598             if (idx == 4 && priorityCount[idx] == 0) {
599                 for (int prevIdx = 0; prevIdx < 3; prevIdx++) {
600                     if (priorityCount[prevIdx] != 5) {
601                         priorityCount[4] = -1;
602                         return;
603                     }
604                 }
605                 priorityCount[4] = 1;
606             }
607         };
608     }
609     ffrt_task_attr_t task_attr;
610     ffrt_task_attr_init(&task_attr);
611     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_idle);
612     ffrt_queue_submit(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
613 
614     ffrt_task_handle_t handle;
615     for (int prio = 0; prio < 5; prio++) {
616         ffrt_task_attr_set_queue_priority(&task_attr, static_cast<ffrt_queue_priority_t>(prio));
617         for (int i = 0; i < 10; i++) {
618             handle = ffrt_queue_submit_h(queue_handle,
619                 create_function_wrapper(priorityFuncs[prio], ffrt_function_kind_queue), &task_attr);
620         }
621     }
622 
623     lock.unlock();
624     ffrt_queue_wait(handle);
625 
626     for (int idx = 0; idx < 3; idx++) {
627         EXPECT_EQ(priorityCount[idx], 5);
628     }
629     EXPECT_EQ(priorityCount[3], 10);
630     EXPECT_EQ(priorityCount[4], 1);
631 
632     ffrt_queue_attr_destroy(&queue_attr);
633     ffrt_queue_destroy(queue_handle);
634 }
635 
636 HWTEST_F(QueueTest, ffrt_queue_submit_head, TestSize.Level1)
637 {
638     ffrt_queue_attr_t queue_attr;
639     (void)ffrt_queue_attr_init(&queue_attr);
640     ffrt_queue_t queue_handle = ffrt_queue_create(
641         static_cast<ffrt_queue_type_t>(ffrt_queue_eventhandler_adapter), "test_queue", &queue_attr);
642 
643     int result = 0;
644     std::mutex lock;
645     lock.lock();
__anon0d588a1c1002() 646     std::function<void()> basicFunc = [&]() { lock.lock(); };
647     std::vector<std::function<void()>> assignFuncs(8, nullptr);
648     std::vector<int> results;
649     std::vector<int> expectResults {6, 2, 1, 4, 3, 5, 8, 7};
650     for (int idx = 0; idx < 8; idx++) {
__anon0d588a1c1102() 651         assignFuncs[idx] = [idx, &results]() {
652             results.push_back(idx + 1);
653         };
654     }
655 
656     ffrt_task_attr_t task_attr;
657     ffrt_task_attr_init(&task_attr);
658     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_immediate);
659     ffrt_task_attr_set_name(&task_attr, "basic_function");
660     ffrt_queue_submit_head(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
661 
662     ffrt_queue_submit_head(queue_handle, create_function_wrapper(assignFuncs[0], ffrt_function_kind_queue), &task_attr);
663     ffrt_queue_submit_head(queue_handle, create_function_wrapper(assignFuncs[1], ffrt_function_kind_queue), &task_attr);
664 
665     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_high);
666     ffrt_queue_submit_head(queue_handle, create_function_wrapper(assignFuncs[2], ffrt_function_kind_queue), &task_attr);
667     ffrt_queue_submit_head(queue_handle, create_function_wrapper(assignFuncs[3], ffrt_function_kind_queue), &task_attr);
668 
669     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_low);
670     ffrt_queue_submit_head(queue_handle, create_function_wrapper(assignFuncs[4], ffrt_function_kind_queue), &task_attr);
671 
672     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_immediate);
673     ffrt_queue_submit_head(queue_handle, create_function_wrapper(assignFuncs[5], ffrt_function_kind_queue), &task_attr);
674 
675     ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_idle);
676     ffrt_task_handle_t handle = ffrt_queue_submit_head_h(queue_handle,
677         create_function_wrapper(assignFuncs[6], ffrt_function_kind_queue), &task_attr);
678     ffrt_queue_submit_head(queue_handle, create_function_wrapper(assignFuncs[7], ffrt_function_kind_queue), &task_attr);
679 
680     lock.unlock();
681     ffrt_queue_wait(handle);
682     EXPECT_EQ(results, expectResults);
683 
684     ffrt_queue_attr_destroy(&queue_attr);
685     ffrt_queue_destroy(queue_handle);
686 }
687 
688 /*
689  * 测试用例名称:ffrt_queue_eventhandler_interactive_queue
690  * 测试用例描述:eventhandler_interactive_queue的创建
691  * 操作步骤    :初始化一个eventhandler_interactive_queue类型队列
692  * 预期结果    :能够正常初始化eventhandler_interactive_queue类型队列
693  */
694 HWTEST_F(QueueTest, ffrt_queue_eventhandler_interactive_queue, TestSize.Level1) {
695     ffrt_queue_attr_t queue_attr;
696     (void)ffrt_queue_attr_init(&queue_attr); //初始化属性,必须
697     ffrt_queue_t queue_handle = ffrt_queue_create(
698         static_cast<ffrt_queue_type_t>(ffrt_queue_eventhandler_interactive), "test queue", &queue_attr);
699     EXPECT_TRUE(queue_handle != nullptr);
700 
701     ffrt_queue_attr_destroy(&queue_attr);
702     ffrt_queue_destroy(queue_handle);
703 }
704 
705 #ifdef OHOS_STANDARD_SYSTEM
706 HWTEST_F(QueueTest, ffrt_get_main_queue, TestSize.Level1)
707 {
708  // ffrt test case begin
709     ffrt::queue *serialQueue = new ffrt::queue("ffrt_normal_queue", {});
710     ffrt_queue_t mainQueue = ffrt_get_main_queue();
711     ffrt_task_attr_t attr;
712     ffrt_task_attr_init(&attr);
713     ffrt_task_attr_set_qos(&attr, ffrt_qos_user_initiated);
714     int result = 0;
__anon0d588a1c1202() 715     std::function<void()>&& basicFunc = [&result]() {
716         OnePlusForTest(static_cast<void*>(&result));
717         OnePlusForTest(static_cast<void*>(&result));
718         EXPECT_EQ(result, 2);
719         usleep(3000);
720     };
721 
722     ffrt::task_handle handle = serialQueue->submit_h(
__anon0d588a1c1302null723         [&] {
724             result = result + 1;
725             ffrt_queue_submit(mainQueue, ffrt::create_function_wrapper(basicFunc, ffrt_function_kind_queue),
726                               &attr);
727         },
728         ffrt::task_attr().qos(3).name("ffrt main_queue."));
729 
730     serialQueue->wait(handle);
731     EXPECT_EQ(result, 1);
732 }
733 
734 HWTEST_F(QueueTest, ffrt_get_current_queue, TestSize.Level1)
735 {
736  // ffrt test case begin
737     ffrt::queue *serialQueue = new ffrt::queue("ffrt_normal_queue", {});
738     ffrt_queue_t currentQueue = ffrt_get_current_queue();
739     ffrt_task_attr_t attr;
740     ffrt_task_attr_init(&attr);
741     ffrt_task_attr_set_qos(&attr, ffrt_qos_user_initiated);
742     int result = 0;
__anon0d588a1c1402() 743     std::function<void()>&& basicFunc = [&result]() {
744         OnePlusForTest(static_cast<void*>(&result));
745         OnePlusForTest(static_cast<void*>(&result));
746         EXPECT_EQ(result, 3);
747         usleep(3000);
748     };
749 
750     ffrt::task_handle handle = serialQueue->submit_h(
__anon0d588a1c1502null751         [&] {
752             result = result + 1;
753             ffrt_queue_submit(currentQueue, ffrt::create_function_wrapper(basicFunc, ffrt_function_kind_queue),
754                               &attr);
755         },
756         ffrt::task_attr().qos(3).name("ffrt current_queue."));
757 
758     serialQueue->wait(handle);
759 
760     EXPECT_EQ(result, 1);
761 }
762 #endif