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 #include "queue/base_queue.h"
23
24 using namespace std;
25 using namespace ffrt;
26 using namespace testing;
27 #ifdef HWTEST_TESTING_EXT_ENABLE
28 using namespace testing::ext;
29 #endif
30
31 class QueueTest : public testing::Test {
32 protected:
SetUpTestCase()33 static void SetUpTestCase()
34 {
35 }
36
TearDownTestCase()37 static void TearDownTestCase()
38 {
39 }
40
SetUp()41 void SetUp() override
42 {
43 }
44
TearDown()45 void TearDown() override
46 {
47 }
48 };
49
50 #if defined(__clang__)
51 #define OPTIMIZE_OFF __attribute__((optnone))
52 #elif defined(__GNUC__)
53 #define OPTIMIZE_OFF __attribute__((optimize(0)))
54 #else
55 #define OPTIMIZE_OFF
56 #endif
57
58 namespace {
OnePlusForTest(void * data)59 void OPTIMIZE_OFF OnePlusForTest(void* data)
60 {
61 *(int*)data += 1;
62 }
63
PrintForTest(void * data)64 void PrintForTest(void* data)
65 {
66 printf("run no input func PrintForTest\n");
67 }
68
fibonacci(int n)69 int fibonacci(int n)
70 {
71 if (n == 0 || n == 1) {
72 return n;
73 }
74 return fibonacci(n - 1) + fibonacci(n - 2);
75 }
76
FibonacciTest(void * data,int fibnum)77 void FibonacciTest(void* data, int fibnum)
78 {
79 int testnum = fibonacci(fibnum);
80 *(int*)data += testnum;
81 }
82 } // namespace
83
EmptyFunction()84 void EmptyFunction() {}
85 /*
86 * 测试用例名称 : serial_queue_submit_cancel_succ
87 * 测试用例描述:提交、取消串行延时任务成功
88 * 预置条件 :1、调用串行队列创建接口创建队列
89 * 操作步骤 :1、提交串行队列任务并执行
90 * 2、提交延时串行队列任务并执行
91 * 预期结果 :执行成功
92 */
93 HWTEST_F(QueueTest, serial_queue_submit_cancel_succ, TestSize.Level1)
94 {
95 // 创建队列
96 ffrt_queue_attr_t queue_attr;
97 (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
98 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
99
100 int result = 0;
__anon6ee974240202() 101 std::function<void()> basicFunc = [&result]() { OnePlusForTest(static_cast<void*>(&result)); };
102 reinterpret_cast<ffrt::queue*>(&queue_handle)->submit(basicFunc);
103
104 ffrt_task_handle_t task1 =
105 ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
106 ffrt_queue_wait(task1);
107 ffrt_task_handle_destroy(task1); // 销毁task_handle,必须
108 EXPECT_EQ(result, 2);
109
110 ffrt::task_handle task2 =
111 reinterpret_cast<ffrt::queue*>(&queue_handle)->submit_h(basicFunc, ffrt::task_attr().delay(1000));
112 int cancel = reinterpret_cast<ffrt::queue*>(&queue_handle)->cancel(task2);
113 ffrt_queue_attr_destroy(&queue_attr);
114 EXPECT_EQ(cancel, 0);
115 EXPECT_EQ(result, 2);
116
117 // 销毁队列
118 ffrt_queue_destroy(queue_handle);
119 }
120
121 /*
122 * 测试用例名称 : serial_queue_create_fail
123 * 测试用例描述:串行队列创建和销毁失败
124 * 预置条件 :1、调用串行队列创建接口创建队列
125 * 操作步骤 :1、调用串行队列创建接口创建队列,type为非串行队列
126 * 2、调用串行队列创建接口创建队列,type为串行队列,但name与attr为nullptr
127 * 3、调用串行队列创建接口创建队列,type为串行队列,但name为nullptr
128 * 预期结果 :1创建失败,2、3创建成功
129 */
130 HWTEST_F(QueueTest, serial_queue_create_fail, TestSize.Level1)
131 {
132 // input invalid
133 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_max, nullptr, nullptr);
134 ffrt_queue_destroy(queue_handle);
135 ffrt_queue_destroy(nullptr);
136
137 queue_handle = ffrt_queue_create(ffrt_queue_serial, nullptr, nullptr);
138 EXPECT_EQ(queue_handle == nullptr, 0);
139 ffrt_queue_destroy(queue_handle);
140
141 // succ free
142 ffrt_queue_attr_t queue_attr;
143 (void)ffrt_queue_attr_init(&queue_attr); // attr 缺少 init 无法看护
144 queue_handle = ffrt_queue_create(ffrt_queue_serial, nullptr, &queue_attr);
145 EXPECT_EQ(queue_handle == nullptr, 0);
146 ffrt_queue_attr_destroy(&queue_attr);
147 ffrt_queue_destroy(queue_handle);
148 }
149
150 /*
151 * 测试用例名称 : ffrt_task_attr_set_get_delay
152 * 测试用例描述:测试 ffrt_task_attr_set_get_delay
153 * 操作步骤 :1、调用ffrt_task_attr_set_delay接口设置队列延时时间
154 * 2、使用ffrt_task_attr_get_delay查询时间
155 * 预期结果 :查询结果与设定相同,初始值为0
156 */
157 HWTEST_F(QueueTest, ffrt_task_attr_set_get_delay, TestSize.Level1)
158 {
159 // succ free
160 ffrt_task_attr_t task_attr;
161 (void)ffrt_task_attr_init(&task_attr); // attr 缺少 init 无法看护
162 // set_attr_delay
163 uint64_t delay = 100;
164 ffrt_task_attr_set_delay(nullptr, delay);
165 ffrt_task_attr_set_delay(&task_attr, delay);
166 // error and return 0
167 delay = ffrt_task_attr_get_delay(nullptr);
168 EXPECT_EQ(delay, 0);
169 delay = ffrt_task_attr_get_delay(&task_attr);
170 EXPECT_EQ(delay, 100);
171 ffrt_task_attr_destroy(&task_attr);
172 }
173
174 /*
175 * 测试用例名称 : serial_queue_task_create_destroy_fail
176 * 测试用例描述:串行任务提交和销毁失败
177 * 操作步骤 :1、直接调用串行队列接口提交空任务,随后销毁任务
178 * 2、调用串行队列创建接口创建队列并提交空任务
179 * 3、调用串行队列创建接口创建队列并提交任务,随后销毁任务
180 * 预期结果 :2提交失败并返回nullptr,3提交成功
181 */
182 HWTEST_F(QueueTest, serial_queue_task_create_destroy_fail, TestSize.Level1)
183 {
184 // input invalid
185 ffrt_task_handle_t task = ffrt_queue_submit_h(nullptr, nullptr, nullptr);
186 ffrt_task_handle_destroy(task);
187
188 ffrt_queue_attr_t queue_attr;
189 (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
190 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
191 task = ffrt_queue_submit_h(queue_handle, nullptr, nullptr);
192 EXPECT_EQ(task == nullptr, 1);
193
194 std::function<void()> basicFunc = std::bind(PrintForTest, nullptr);
195 task = ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
196 ffrt_queue_wait(task);
197 // succ free
198 EXPECT_EQ(task == nullptr, 0);
199 ffrt_task_handle_destroy(task);
200 ffrt_queue_attr_destroy(&queue_attr);
201 ffrt_queue_destroy(queue_handle);
202 }
203
204 /*
205 * 测试用例名称 : serial_multi_submit_succ
206 * 测试用例描述:循环提交普通任务和延时任务,执行成功
207 * 操作步骤 :1、循环提交普通任务90次
208 * 2、循环提交延时任务20次,取消10次
209 * 预期结果 :总共应执行100+取消前已执行的次数
210 */
211 HWTEST_F(QueueTest, serial_multi_submit_succ, TestSize.Level1)
212 {
213 ffrt_queue_attr_t queue_attr;
214 (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
215 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
216
217 int result = 0;
218 int cancelFailedNum = 0;
__anon6ee974240302() 219 std::function<void()>&& basicFunc = [&result]() { OnePlusForTest(static_cast<void*>(&result)); };
220 ffrt_task_attr_t task_attr;
221 (void)ffrt_task_attr_init(&task_attr); // 初始化task属性,必须
222 ffrt_task_attr_set_delay(&task_attr, 100); // 设置任务0.1ms后才执行,非必须
223
224 for (int n = 0; n < 10; ++n) {
225 for (int i = 0; i < 9; ++i) {
226 ffrt_queue_submit(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
227 }
228
229 ffrt_task_handle_t t1 =
230 ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
231 ffrt_task_handle_t t2 =
232 ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
233 cancelFailedNum += ffrt_queue_cancel(t1);
234 ffrt_task_handle_destroy(t1); // 销毁task_handle,必须
235
236 ffrt_queue_wait(t2);
237 ffrt_task_handle_destroy(t2);
238 }
239
240 EXPECT_EQ(result, (cancelFailedNum + 100));
241 ffrt_queue_attr_destroy(&queue_attr);
242 ffrt_queue_destroy(queue_handle);
243 }
244
245 /*
246 * 测试用例名称 : serial_early_quit_succ
247 * 测试用例描述:主动销毁队列,未执行的任务取消
248 * 操作步骤 :1、提交10000个斐波那契任务
249 2、至少取消1个
250 * 预期结果 :取消成功
251 */
252 HWTEST_F(QueueTest, serial_early_quit_succ, TestSize.Level1)
253 {
254 ffrt_queue_attr_t queue_attr;
255 (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
256 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
257 int fibnum = 10;
258 int result = 0;
259 int expect = fibonacci(fibnum);
__anon6ee974240402() 260 std::function<void()>&& basicFunc = [&result, fibnum]() {
261 FibonacciTest(static_cast<void*>(&result), fibnum);
262 usleep(10);
263 };
264 for (int i = 0; i < 10000; ++i) {
265 ffrt_queue_submit(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
266 }
267
268 ffrt_queue_destroy(queue_handle);
269 printf("result = %d\n", result);
270 EXPECT_EQ(result < expect * 10000, 1);
271 }
272
273 /*
274 * 测试用例名称 : serial_double_cancel_failed
275 * 测试用例描述:对一个任务取消两次
276 * 操作步骤 :1、调用串行队列创建接口创建队列,设置延时并提交任务
277 2、调用两次ffrt_queue_cancel取消同一任务
278 * 预期结果 :首次取消成功,第二次取消失败
279 */
280 HWTEST_F(QueueTest, serial_double_cancel_failed, TestSize.Level1)
281 {
282 ffrt_queue_attr_t queue_attr;
283 (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
284 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
285
286 int result = 0;
__anon6ee974240502() 287 std::function<void()>&& basicFunc = [&result]() { OnePlusForTest(static_cast<void*>(&result)); };
288 ffrt_task_attr_t task_attr;
289 (void)ffrt_task_attr_init(&task_attr); // 初始化task属性,必须
290 ffrt_task_attr_set_delay(&task_attr, 100); // 设置任务0.1ms后才执行,非必须
291
292 ffrt_task_handle_t t1 =
293 ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
294 int cancel = ffrt_queue_cancel(t1);
295 EXPECT_EQ(cancel, 0);
296 cancel = ffrt_queue_cancel(t1);
297 EXPECT_EQ(cancel, 1);
298 ffrt_task_handle_destroy(t1); // 销毁task_handle,必须
299
300 ffrt_queue_destroy(queue_handle);
301 }
302
303 /*
304 * 测试用例名称 : ffrt_queue_attr_des
305 * 测试用例描述:设置串行队列qos等级,销毁队列attr
306 * 操作步骤 :1、设置队列qos等级,调用串行队列创建接口创建队列
307 2、调用ffrt_queue_attr_destroy接口销毁队列创建的attr
308 * 预期结果 :设置与销毁成功
309 */
310 HWTEST_F(QueueTest, ffrt_queue_attr_des, TestSize.Level1)
311 {
312 ffrt_queue_attr_t queue_attr;
313 (void)ffrt_queue_attr_init(&queue_attr);
314 ffrt_queue_attr_set_qos(&queue_attr, ffrt_qos_background);
315 ffrt_qos_t qos = ffrt_queue_attr_get_qos(&queue_attr);
316 EXPECT_EQ(qos == ffrt_qos_background, 1);
317 ffrt_queue_attr_destroy(&queue_attr);
318 }
319
320 HWTEST_F(QueueTest, ffrt_queue_dfx_api_0001, TestSize.Level1)
321 {
322 // ffrt_queue_attr_set_timeout接口attr为异常值
323 ffrt_queue_attr_t queue_attr;
324 (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
325 ffrt_queue_attr_set_timeout(nullptr, 10000);
326 uint64_t time = ffrt_queue_attr_get_timeout(&queue_attr);
327 EXPECT_EQ(time, 0);
328 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
329 EXPECT_TRUE(queue_handle != nullptr);
330
331 // 销毁队列
332 ffrt_queue_attr_destroy(&queue_attr);
333 ffrt_queue_destroy(queue_handle);
334 }
335
336 HWTEST_F(QueueTest, ffrt_queue_dfx_api_0002, TestSize.Level1)
337 {
338 // ffrt_queue_attr_get_timeout接口attr为异常值
339 ffrt_queue_attr_t queue_attr;
340 (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
341 ffrt_queue_attr_set_timeout(&queue_attr, 10000);
342 uint64_t time = ffrt_queue_attr_get_timeout(nullptr);
343 EXPECT_EQ(time, 0);
344 time = ffrt_queue_attr_get_timeout(&queue_attr);
345 EXPECT_EQ(time, 10000);
346 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
347 EXPECT_TRUE(queue_handle != nullptr);
348
349 // 销毁队列
350 ffrt_queue_attr_destroy(&queue_attr);
351 ffrt_queue_destroy(queue_handle);
352 }
353
354 HWTEST_F(QueueTest, ffrt_queue_dfx_api_0004, TestSize.Level1)
355 {
356 // ffrt_queue_attr_get_timeoutCb接口attr为异常值
__anon6ee974240602() 357 std::function<void()> cbOne = []() { printf("first set callback\n"); };
358
359 ffrt_queue_attr_t queue_attr;
360 (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
361 ffrt_queue_attr_set_callback(&queue_attr, ffrt::create_function_wrapper(cbOne, ffrt_function_kind_queue));
362 ffrt_function_header_t* func = ffrt_queue_attr_get_callback(nullptr);
363 EXPECT_TRUE(func == nullptr);
364 func = ffrt_queue_attr_get_callback(&queue_attr);
365 EXPECT_TRUE(func != nullptr);
366 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
367 EXPECT_TRUE(queue_handle != nullptr);
368
369 // 销毁队列
370 ffrt_queue_destroy(queue_handle);
371 ffrt_queue_attr_destroy(&queue_attr);
372 }
373
374 /*
375 * 测试用例名称 : ffrt_task_attr_set_queue_priority
376 * 测试用例描述 : 测试 ffrt_task_attr_set_queue_priority
377 * 操作步骤 : 1、调用ffrt_task_attr_set_queue_priority接口设置队列优先级
378 * 2、使用ffrt_task_attr_get_queue_priority查询优先级
379 * 预期结果 : 查询结果与设定相同,值为3
380 */
381 HWTEST_F(QueueTest, ffrt_task_attr_set_queue_priority, TestSize.Level1)
382 {
383 ffrt_task_attr_t task_attr;
384 (void)ffrt_task_attr_init(&task_attr);
385 ffrt_queue_priority_t priority = ffrt_queue_priority_low;
386 ffrt_task_attr_set_queue_priority(nullptr, priority);
387 ffrt_task_attr_set_queue_priority(&task_attr, priority);
388 priority = ffrt_task_attr_get_queue_priority(nullptr);
389 EXPECT_EQ(priority, ffrt_queue_priority_immediate);
390 priority = ffrt_task_attr_get_queue_priority(&task_attr);
391 EXPECT_EQ(priority, ffrt_queue_priority_low);
392 ffrt_task_attr_destroy(&task_attr);
393 }
394
395 /*
396 * 测试用例名称 : ffrt_queue_attr_set_max_concurrency
397 * 测试用例描述 : 测试 ffrt_queue_attr_set_max_concurrency
398 * 操作步骤 : 1、调用ffrt_queue_attr_set_max_concurrency设置FFRT并行队列,并行度为4
399 * 2、使用ffrt_queue_attr_get_max_concurrency查询并行度
400 * 预期结果 : 查询结果与设定相同,值为4
401 */
402 HWTEST_F(QueueTest, ffrt_queue_attr_set_max_concurrency, TestSize.Level1)
403 {
404 ffrt_queue_attr_t queue_attr;
405 (void)ffrt_queue_attr_init(&queue_attr);
406 uint64_t concurrency = 4;
407 ffrt_queue_attr_set_max_concurrency(nullptr, concurrency);
408 ffrt_queue_attr_set_max_concurrency(&queue_attr, concurrency);
409 concurrency = ffrt_queue_attr_get_max_concurrency(nullptr);
410 EXPECT_EQ(concurrency, 0);
411 concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
412 EXPECT_EQ(concurrency, 4);
413 ffrt_queue_attr_destroy(&queue_attr);
414
415 ffrt_queue_attr_t queue_attr1;
416 (void)ffrt_queue_attr_init(&queue_attr1);
417 concurrency = 0;
418 ffrt_queue_attr_set_max_concurrency(&queue_attr1, concurrency);
419 concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr1);
420 EXPECT_EQ(concurrency, 1);
421 ffrt_queue_attr_destroy(&queue_attr1);
422 }
423
424 /*
425 * 测试用例名称 : ffrt_queue_has_task
426 * 测试用例描述 : 测试 ffrt_queue_has_task
427 * 操作步骤 : 1、往队列中提交若干任务,其中包含待查询的任务
428 * 2、调用ffrt_queue_has_task查询任务是否在队列中
429 * 预期结果 : 查询结果与预期相同
430 */
431 HWTEST_F(QueueTest, ffrt_queue_has_task, TestSize.Level1)
432 {
433 ffrt_queue_attr_t queue_attr;
434 (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
435 ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
436
437 std::mutex lock;
438 lock.lock();
__anon6ee974240702() 439 std::function<void()> basicFunc = [&]() { lock.lock(); };
__anon6ee974240802() 440 std::function<void()> emptyFunc = []() {};
441
442 ffrt_task_attr_t task_attr;
443 ffrt_task_attr_init(&task_attr);
444 ffrt_task_attr_set_name(&task_attr, "basic_function");
445 ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
446 create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
447
448 for (int i = 0; i < 10; i++) {
449 std::string name = "empty_function_" + std::to_string(i);
450 ffrt_task_attr_set_name(&task_attr, name.c_str());
451 ffrt_queue_submit(queue_handle, create_function_wrapper(emptyFunc, ffrt_function_kind_queue), &task_attr);
452 }
453
454 // 全字匹配
455 for (int i = 0; i < 10; i++) {
456 std::string name = "empty_function_" + std::to_string(i);
457 bool hasEmptyTask = ffrt_queue_has_task(queue_handle, name.c_str());
458 EXPECT_EQ(hasEmptyTask, true);
459 }
460
461 // 正则匹配
462 bool hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_.*");
463 EXPECT_EQ(hasEmptyTask, true);
464
465 hasEmptyTask = ffrt_queue_has_task(queue_handle, "random_function");
466 EXPECT_EQ(hasEmptyTask, false);
467
468 lock.unlock();
469 ffrt_queue_wait(handle);
470
471 ffrt_task_handle_destroy(handle);
472 ffrt_task_attr_destroy(&task_attr);
473 ffrt_queue_attr_destroy(&queue_attr);
474 ffrt_queue_destroy(queue_handle);
475 }
476
477 /*
478 * 测试用例名称 : ffrt_queue_cancel_all_and_cancel_by_name
479 * 测试用例描述 : 测试 ffrt_queue_cancel_all、ffrt_queue_cancel_by_name
480 * 操作步骤 : 1、往队列中提交若干任务
481 * 2、调用ffrt_queue_cancel_by_name取消指定任务
482 * 3、调用ffrt_queue_cancel_all取消所有任务
483 * 预期结果 : 任务取消成功
484 */
485 HWTEST_F(QueueTest, ffrt_queue_cancel_all_and_cancel_by_name, TestSize.Level1)
486 {
487 ffrt_queue_attr_t queue_attr;
488 (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
489 ffrt_queue_t queue_handle = ffrt_queue_create(
490 static_cast<ffrt_queue_type_t>(ffrt_queue_eventhandler_adapter), "test_queue", &queue_attr);
491
492 std::mutex lock;
493 lock.lock();
__anon6ee974240902() 494 std::function<void()> basicFunc = [&]() { lock.lock(); };
__anon6ee974240a02() 495 std::function<void()> emptyFunc = []() {};
496
497 ffrt_task_attr_t task_attr;
498 ffrt_task_attr_init(&task_attr);
499 ffrt_task_attr_set_name(&task_attr, "basic_function");
500 ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
501 create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
502
503 for (int i = 0; i < 10; i++) {
504 std::string name = "empty_function_" + std::to_string(i);
505 ffrt_task_attr_set_name(&task_attr, name.c_str());
506 ffrt_queue_submit(queue_handle, create_function_wrapper(emptyFunc, ffrt_function_kind_queue), &task_attr);
507 }
508
509 // 测试ffrt_queue_cancel_by_name
510 bool hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_3");
511 EXPECT_EQ(hasEmptyTask, true);
512
513 ffrt_queue_cancel_by_name(queue_handle, "empty_function_3");
514
515 hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_3");
516 EXPECT_EQ(hasEmptyTask, false);
517
518 // 测试ffrt_queue_cancel_all
519 hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_.*");
520 EXPECT_EQ(hasEmptyTask, true);
521
522 bool isIdle = ffrt_queue_is_idle(queue_handle);
523 EXPECT_EQ(isIdle, false);
524
525 ffrt_queue_cancel_all(queue_handle);
526
527 hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_.*");
528 EXPECT_EQ(hasEmptyTask, false);
529
530 lock.unlock();
531 ffrt_queue_cancel_and_wait(queue_handle);
532 ffrt_queue_wait(handle);
533
534 isIdle = ffrt_queue_is_idle(queue_handle);
535 EXPECT_EQ(isIdle, true);
536
537 ffrt_task_attr_destroy(&task_attr);
538 ffrt_task_handle_destroy(handle);
539 ffrt_queue_attr_destroy(&queue_attr);
540 ffrt_queue_destroy(queue_handle);
541 }
542
543 /*
544 * 测试用例名称 : ffrt_queue_submit_head
545 * 测试用例描述 : 测试 ffrt_queue_submit_head
546 * 操作步骤 : 1、往队列中提交若干任务
547 * 2、调用ffrt_queue_submit_head提交任务至队头
548 * 预期结果 : 提交到对头的任务优先被执行
549 */
550 HWTEST_F(QueueTest, ffrt_queue_submit_head, TestSize.Level1)
551 {
552 ffrt::queue* testQueue = new ffrt::queue(static_cast<ffrt::queue_type>(
553 ffrt_inner_queue_type_t::ffrt_queue_eventhandler_adapter), "test_queue");
554
555 int result = 0;
556 std::mutex lock;
557 lock.lock();
__anon6ee974240b02() 558 std::function<void()> basicFunc = [&]() { lock.lock(); };
559 std::vector<std::function<void()>> assignFuncs(8, nullptr);
560 std::vector<int> results;
561 std::vector<int> expectResults {6, 2, 1, 4, 3, 5, 8, 7};
562 for (int idx = 0; idx < 8; idx++) {
__anon6ee974240c02() 563 assignFuncs[idx] = [idx, &results]() {
564 results.push_back(idx + 1);
565 };
566 }
567
568 ffrt::task_attr taskAttr;
569 taskAttr.priority(ffrt_queue_priority_immediate).name("basic_function");
570 testQueue->submit_head(basicFunc, taskAttr);
571 testQueue->submit_head(assignFuncs[0], taskAttr);
572 testQueue->submit_head(assignFuncs[1], taskAttr);
573
574 taskAttr.priority(ffrt_queue_priority_high);
575 testQueue->submit_head(assignFuncs[2], taskAttr);
576 testQueue->submit_head(assignFuncs[3], taskAttr);
577
578 taskAttr.priority(ffrt_queue_priority_low);
579 testQueue->submit_head(assignFuncs[4], taskAttr);
580
581 taskAttr.priority(ffrt_queue_priority_immediate);
582 testQueue->submit_head(assignFuncs[5], taskAttr);
583
584 taskAttr.priority(ffrt_queue_priority_idle);
585 ffrt::task_handle handle = testQueue->submit_head_h(assignFuncs[6], taskAttr);
586 testQueue->submit_head(assignFuncs[7], taskAttr);
587
588 lock.unlock();
589 testQueue->wait(handle);
590 EXPECT_EQ(results, expectResults);
591 }
592
593 HWTEST_F(QueueTest, ffrt_get_main_queue, TestSize.Level1)
594 {
595 // ffrt test case begin
596 ffrt::queue *serialQueue = new ffrt::queue("ffrt_normal_queue", {});
597 ffrt_queue_t mainQueue = ffrt_get_main_queue();
598 ffrt_task_attr_t attr;
599 ffrt_task_attr_init(&attr);
600 ffrt_task_attr_set_qos(&attr, ffrt_qos_user_initiated);
601 int result = 0;
__anon6ee974240d02() 602 std::function<void()>&& basicFunc = [&result]() {
603 OnePlusForTest(static_cast<void*>(&result));
604 OnePlusForTest(static_cast<void*>(&result));
605 EXPECT_EQ(result, 2);
606 usleep(3000);
607 };
608
609 ffrt::task_handle handle = serialQueue->submit_h(
__anon6ee974240e02null610 [&] {
611 result = result + 1;
612 ffrt_queue_submit(mainQueue, ffrt::create_function_wrapper(basicFunc, ffrt_function_kind_queue),
613 &attr);
614 },
615 ffrt::task_attr().qos(3).name("ffrt main_queue."));
616
617 serialQueue->wait(handle);
618 EXPECT_EQ(result, 1);
619 delete serialQueue;
620 }
621
622 HWTEST_F(QueueTest, ffrt_get_current_queue, TestSize.Level1)
623 {
624 // ffrt test case begin
625 ffrt::queue *serialQueue = new ffrt::queue("ffrt_normal_queue", {});
626 ffrt_queue_t currentQueue = ffrt_get_current_queue();
627 ffrt_task_attr_t attr;
628 ffrt_task_attr_init(&attr);
629 ffrt_task_attr_set_qos(&attr, ffrt_qos_user_initiated);
630 int result = 0;
__anon6ee974240f02() 631 std::function<void()>&& basicFunc = [&result]() {
632 OnePlusForTest(static_cast<void*>(&result));
633 OnePlusForTest(static_cast<void*>(&result));
634 EXPECT_EQ(result, 3);
635 usleep(3000);
636 };
637
638 ffrt::task_handle handle = serialQueue->submit_h(
__anon6ee974241002null639 [&] {
640 EXPECT_GT(ffrt::get_queue_id(), 0);
641 result = result + 1;
642 ffrt_queue_submit(currentQueue, ffrt::create_function_wrapper(basicFunc, ffrt_function_kind_queue),
643 &attr);
644 },
645 ffrt::task_attr().qos(3).name("ffrt current_queue."));
646
647 serialQueue->wait(handle);
648
649 EXPECT_EQ(result, 1);
650 delete serialQueue;
651 }