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