1484543d1Sopenharmony_ci/*
2484543d1Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3484543d1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4484543d1Sopenharmony_ci * you may not use this file except in compliance with the License.
5484543d1Sopenharmony_ci * You may obtain a copy of the License at
6484543d1Sopenharmony_ci *
7484543d1Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8484543d1Sopenharmony_ci *
9484543d1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10484543d1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11484543d1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12484543d1Sopenharmony_ci * See the License for the specific language governing permissions and
13484543d1Sopenharmony_ci * limitations under the License.
14484543d1Sopenharmony_ci */
15484543d1Sopenharmony_ci
16484543d1Sopenharmony_ci#include <thread>
17484543d1Sopenharmony_ci#include <chrono>
18484543d1Sopenharmony_ci#include <gtest/gtest.h>
19484543d1Sopenharmony_ci#include "ffrt_inner.h"
20484543d1Sopenharmony_ci#include "c/queue_ext.h"
21484543d1Sopenharmony_ci#include "../common.h"
22484543d1Sopenharmony_ci
23484543d1Sopenharmony_ciusing namespace std;
24484543d1Sopenharmony_ciusing namespace ffrt;
25484543d1Sopenharmony_ciusing namespace testing;
26484543d1Sopenharmony_ci#ifdef HWTEST_TESTING_EXT_ENABLE
27484543d1Sopenharmony_ciusing namespace testing::ext;
28484543d1Sopenharmony_ci#endif
29484543d1Sopenharmony_ci
30484543d1Sopenharmony_ciclass QueueTest : public testing::Test {
31484543d1Sopenharmony_ciprotected:
32484543d1Sopenharmony_ci    static void SetUpTestCase()
33484543d1Sopenharmony_ci    {
34484543d1Sopenharmony_ci    }
35484543d1Sopenharmony_ci
36484543d1Sopenharmony_ci    static void TearDownTestCase()
37484543d1Sopenharmony_ci    {
38484543d1Sopenharmony_ci    }
39484543d1Sopenharmony_ci
40484543d1Sopenharmony_ci    virtual void SetUp()
41484543d1Sopenharmony_ci    {
42484543d1Sopenharmony_ci    }
43484543d1Sopenharmony_ci
44484543d1Sopenharmony_ci    virtual void TearDown()
45484543d1Sopenharmony_ci    {
46484543d1Sopenharmony_ci    }
47484543d1Sopenharmony_ci};
48484543d1Sopenharmony_ci
49484543d1Sopenharmony_ci#if defined(__clang__)
50484543d1Sopenharmony_ci#define OPTIMIZE_OFF __attribute__((optnone))
51484543d1Sopenharmony_ci#elif defined(__GNUC__)
52484543d1Sopenharmony_ci#define OPTIMIZE_OFF __attribute__((optimize(0)))
53484543d1Sopenharmony_ci#else
54484543d1Sopenharmony_ci#define OPTIMIZE_OFF
55484543d1Sopenharmony_ci#endif
56484543d1Sopenharmony_ci
57484543d1Sopenharmony_cinamespace {
58484543d1Sopenharmony_civoid OPTIMIZE_OFF OnePlusForTest(void* data)
59484543d1Sopenharmony_ci{
60484543d1Sopenharmony_ci    *(int*)data += 1;
61484543d1Sopenharmony_ci}
62484543d1Sopenharmony_ci
63484543d1Sopenharmony_civoid PrintForTest(void* data)
64484543d1Sopenharmony_ci{
65484543d1Sopenharmony_ci    printf("run no input func PrintForTest\n");
66484543d1Sopenharmony_ci}
67484543d1Sopenharmony_ci
68484543d1Sopenharmony_ciint fibonacci(int n)
69484543d1Sopenharmony_ci{
70484543d1Sopenharmony_ci    if (n == 0 || n == 1) {
71484543d1Sopenharmony_ci        return n;
72484543d1Sopenharmony_ci    }
73484543d1Sopenharmony_ci    return fibonacci(n - 1) + fibonacci(n - 2);
74484543d1Sopenharmony_ci}
75484543d1Sopenharmony_ci
76484543d1Sopenharmony_civoid FibonacciTest(void* data, int fibnum)
77484543d1Sopenharmony_ci{
78484543d1Sopenharmony_ci    int testnum = fibonacci(fibnum);
79484543d1Sopenharmony_ci    *(int*)data += testnum;
80484543d1Sopenharmony_ci}
81484543d1Sopenharmony_ci} // namespace
82484543d1Sopenharmony_ci
83484543d1Sopenharmony_civoid EmptyFunction() {}
84484543d1Sopenharmony_ci/*
85484543d1Sopenharmony_ci * 测试用例名称 : serial_queue_submit_cancel_succ
86484543d1Sopenharmony_ci * 测试用例描述:提交、取消串行延时任务成功
87484543d1Sopenharmony_ci * 预置条件    :1、调用串行队列创建接口创建队列
88484543d1Sopenharmony_ci * 操作步骤    :1、提交串行队列任务并执行
89484543d1Sopenharmony_ci *              2、提交延时串行队列任务并执行
90484543d1Sopenharmony_ci * 预期结果    :执行成功
91484543d1Sopenharmony_ci */
92484543d1Sopenharmony_ciHWTEST_F(QueueTest, serial_queue_submit_cancel_succ, TestSize.Level1)
93484543d1Sopenharmony_ci{
94484543d1Sopenharmony_ci    // 创建队列
95484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
96484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
97484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
98484543d1Sopenharmony_ci
99484543d1Sopenharmony_ci    int result = 0;
100484543d1Sopenharmony_ci    std::function<void()> basicFunc = [&result]() { OnePlusForTest(static_cast<void*>(&result)); };
101484543d1Sopenharmony_ci    ffrt_queue_submit(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
102484543d1Sopenharmony_ci
103484543d1Sopenharmony_ci    ffrt_task_handle_t task1 =
104484543d1Sopenharmony_ci        ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
105484543d1Sopenharmony_ci    ffrt_queue_wait(task1);
106484543d1Sopenharmony_ci    ffrt_task_handle_destroy(task1); // 销毁task_handle,必须
107484543d1Sopenharmony_ci    EXPECT_EQ(result, 2);
108484543d1Sopenharmony_ci
109484543d1Sopenharmony_ci    ffrt_task_attr_t task_attr;
110484543d1Sopenharmony_ci    (void)ffrt_task_attr_init(&task_attr); // 初始化task属性,必须
111484543d1Sopenharmony_ci    ffrt_task_attr_set_delay(&task_attr, 1000); // 设置任务1ms后才执行,非必须
112484543d1Sopenharmony_ci    ffrt_task_handle_t task2 =
113484543d1Sopenharmony_ci        ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
114484543d1Sopenharmony_ci    int cancel = ffrt_queue_cancel(task2);
115484543d1Sopenharmony_ci    ffrt_task_handle_destroy(task2); // 销毁task_handle,必须
116484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
117484543d1Sopenharmony_ci    EXPECT_EQ(cancel, 0);
118484543d1Sopenharmony_ci    EXPECT_EQ(result, 2);
119484543d1Sopenharmony_ci
120484543d1Sopenharmony_ci    // 销毁队列
121484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
122484543d1Sopenharmony_ci}
123484543d1Sopenharmony_ci
124484543d1Sopenharmony_ci/*
125484543d1Sopenharmony_ci * 测试用例名称 : serial_queue_create_fail
126484543d1Sopenharmony_ci * 测试用例描述:串行队列创建和销毁失败
127484543d1Sopenharmony_ci * 预置条件    :1、调用串行队列创建接口创建队列
128484543d1Sopenharmony_ci * 操作步骤    :1、调用串行队列创建接口创建队列,type为非串行队列
129484543d1Sopenharmony_ci *              2、调用串行队列创建接口创建队列,type为串行队列,但name与attr为nullptr
130484543d1Sopenharmony_ci *              3、调用串行队列创建接口创建队列,type为串行队列,但name为nullptr
131484543d1Sopenharmony_ci * 预期结果    :1创建失败,2、3创建成功
132484543d1Sopenharmony_ci */
133484543d1Sopenharmony_ciHWTEST_F(QueueTest, serial_queue_create_fail, TestSize.Level1)
134484543d1Sopenharmony_ci{
135484543d1Sopenharmony_ci    // input invalid
136484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_max, nullptr, nullptr);
137484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
138484543d1Sopenharmony_ci    ffrt_queue_destroy(nullptr);
139484543d1Sopenharmony_ci
140484543d1Sopenharmony_ci    queue_handle = ffrt_queue_create(ffrt_queue_serial, nullptr, nullptr);
141484543d1Sopenharmony_ci    EXPECT_EQ(queue_handle == nullptr, 0);
142484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
143484543d1Sopenharmony_ci
144484543d1Sopenharmony_ci    // succ free
145484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
146484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // attr 缺少 init 无法看护
147484543d1Sopenharmony_ci    queue_handle = ffrt_queue_create(ffrt_queue_serial, nullptr, &queue_attr);
148484543d1Sopenharmony_ci    EXPECT_EQ(queue_handle == nullptr, 0);
149484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
150484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
151484543d1Sopenharmony_ci}
152484543d1Sopenharmony_ci
153484543d1Sopenharmony_ci/*
154484543d1Sopenharmony_ci * 测试用例名称 : ffrt_task_attr_set_get_delay
155484543d1Sopenharmony_ci * 测试用例描述:测试 ffrt_task_attr_set_get_delay
156484543d1Sopenharmony_ci * 操作步骤    :1、调用ffrt_task_attr_set_delay接口设置队列延时时间
157484543d1Sopenharmony_ci *              2、使用ffrt_task_attr_get_delay查询时间
158484543d1Sopenharmony_ci * 预期结果    :查询结果与设定相同,初始值为0
159484543d1Sopenharmony_ci */
160484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_task_attr_set_get_delay, TestSize.Level1)
161484543d1Sopenharmony_ci{
162484543d1Sopenharmony_ci    // succ free
163484543d1Sopenharmony_ci    ffrt_task_attr_t task_attr;
164484543d1Sopenharmony_ci    (void)ffrt_task_attr_init(&task_attr); // attr 缺少 init 无法看护
165484543d1Sopenharmony_ci    // set_attr_delay
166484543d1Sopenharmony_ci    uint64_t delay = 100;
167484543d1Sopenharmony_ci    ffrt_task_attr_set_delay(nullptr, delay);
168484543d1Sopenharmony_ci    ffrt_task_attr_set_delay(&task_attr, delay);
169484543d1Sopenharmony_ci    // error and return 0
170484543d1Sopenharmony_ci    delay = ffrt_task_attr_get_delay(nullptr);
171484543d1Sopenharmony_ci    EXPECT_EQ(delay, 0);
172484543d1Sopenharmony_ci    delay = ffrt_task_attr_get_delay(&task_attr);
173484543d1Sopenharmony_ci    EXPECT_EQ(delay, 100);
174484543d1Sopenharmony_ci    ffrt_task_attr_destroy(&task_attr);
175484543d1Sopenharmony_ci}
176484543d1Sopenharmony_ci
177484543d1Sopenharmony_ci/*
178484543d1Sopenharmony_ci * 测试用例名称 : serial_queue_task_create_destroy_fail
179484543d1Sopenharmony_ci * 测试用例描述:串行任务提交和销毁失败
180484543d1Sopenharmony_ci * 操作步骤    :1、直接调用串行队列接口提交空任务,随后销毁任务
181484543d1Sopenharmony_ci *              2、调用串行队列创建接口创建队列并提交空任务
182484543d1Sopenharmony_ci *              3、调用串行队列创建接口创建队列并提交任务,随后销毁任务
183484543d1Sopenharmony_ci * 预期结果    :2提交失败并返回nullptr,3提交成功
184484543d1Sopenharmony_ci */
185484543d1Sopenharmony_ciHWTEST_F(QueueTest, serial_queue_task_create_destroy_fail, TestSize.Level1)
186484543d1Sopenharmony_ci{
187484543d1Sopenharmony_ci    // input invalid
188484543d1Sopenharmony_ci    ffrt_task_handle_t task = ffrt_queue_submit_h(nullptr, nullptr, nullptr);
189484543d1Sopenharmony_ci    ffrt_task_handle_destroy(task);
190484543d1Sopenharmony_ci
191484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
192484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
193484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
194484543d1Sopenharmony_ci    task = ffrt_queue_submit_h(queue_handle, nullptr, nullptr);
195484543d1Sopenharmony_ci    EXPECT_EQ(task == nullptr, 1);
196484543d1Sopenharmony_ci
197484543d1Sopenharmony_ci    std::function<void()> basicFunc = std::bind(PrintForTest, nullptr);
198484543d1Sopenharmony_ci    task = ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
199484543d1Sopenharmony_ci    ffrt_queue_wait(task);
200484543d1Sopenharmony_ci    // succ free
201484543d1Sopenharmony_ci    EXPECT_EQ(task == nullptr, 0);
202484543d1Sopenharmony_ci    ffrt_task_handle_destroy(task);
203484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
204484543d1Sopenharmony_ci}
205484543d1Sopenharmony_ci
206484543d1Sopenharmony_ci/*
207484543d1Sopenharmony_ci * 测试用例名称 : serial_multi_submit_succ
208484543d1Sopenharmony_ci * 测试用例描述:循环提交普通任务和延时任务,执行成功
209484543d1Sopenharmony_ci * 操作步骤    :1、循环提交普通任务90次
210484543d1Sopenharmony_ci *              2、循环提交延时任务20次,取消10次
211484543d1Sopenharmony_ci * 预期结果    :总共应执行100+取消前已执行的次数
212484543d1Sopenharmony_ci */
213484543d1Sopenharmony_ciHWTEST_F(QueueTest, serial_multi_submit_succ, TestSize.Level1)
214484543d1Sopenharmony_ci{
215484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
216484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
217484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
218484543d1Sopenharmony_ci
219484543d1Sopenharmony_ci    int result = 0;
220484543d1Sopenharmony_ci    int cancelFailedNum = 0;
221484543d1Sopenharmony_ci    std::function<void()>&& basicFunc = [&result]() { OnePlusForTest(static_cast<void*>(&result)); };
222484543d1Sopenharmony_ci    ffrt_task_attr_t task_attr;
223484543d1Sopenharmony_ci    (void)ffrt_task_attr_init(&task_attr); // 初始化task属性,必须
224484543d1Sopenharmony_ci    ffrt_task_attr_set_delay(&task_attr, 100); // 设置任务0.1ms后才执行,非必须
225484543d1Sopenharmony_ci
226484543d1Sopenharmony_ci    for (int n = 0; n < 10; ++n) {
227484543d1Sopenharmony_ci        for (int i = 0; i < 9; ++i) {
228484543d1Sopenharmony_ci            ffrt_queue_submit(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
229484543d1Sopenharmony_ci        }
230484543d1Sopenharmony_ci
231484543d1Sopenharmony_ci        ffrt_task_handle_t t1 =
232484543d1Sopenharmony_ci            ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
233484543d1Sopenharmony_ci        ffrt_task_handle_t t2 =
234484543d1Sopenharmony_ci            ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
235484543d1Sopenharmony_ci        cancelFailedNum += ffrt_queue_cancel(t1);
236484543d1Sopenharmony_ci        ffrt_task_handle_destroy(t1); // 销毁task_handle,必须
237484543d1Sopenharmony_ci
238484543d1Sopenharmony_ci        ffrt_queue_wait(t2);
239484543d1Sopenharmony_ci        ffrt_task_handle_destroy(t2);
240484543d1Sopenharmony_ci    }
241484543d1Sopenharmony_ci
242484543d1Sopenharmony_ci    EXPECT_EQ(result, (cancelFailedNum + 100));
243484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
244484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
245484543d1Sopenharmony_ci}
246484543d1Sopenharmony_ci
247484543d1Sopenharmony_ci/*
248484543d1Sopenharmony_ci * 测试用例名称 : serial_early_quit_succ
249484543d1Sopenharmony_ci * 测试用例描述:主动销毁队列,未执行的任务取消
250484543d1Sopenharmony_ci * 操作步骤    :1、提交10000个斐波那契任务
251484543d1Sopenharmony_ci                2、至少取消1个
252484543d1Sopenharmony_ci * 预期结果    :取消成功
253484543d1Sopenharmony_ci */
254484543d1Sopenharmony_ciHWTEST_F(QueueTest, serial_early_quit_succ, TestSize.Level1)
255484543d1Sopenharmony_ci{
256484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
257484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
258484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
259484543d1Sopenharmony_ci    int fibnum = 10;
260484543d1Sopenharmony_ci    int result = 0;
261484543d1Sopenharmony_ci    int expect = fibonacci(fibnum);
262484543d1Sopenharmony_ci    std::function<void()>&& basicFunc = [&result, fibnum]() {
263484543d1Sopenharmony_ci        FibonacciTest(static_cast<void*>(&result), fibnum);
264484543d1Sopenharmony_ci        usleep(10);
265484543d1Sopenharmony_ci    };
266484543d1Sopenharmony_ci    for (int i = 0; i < 10000; ++i) {
267484543d1Sopenharmony_ci        ffrt_queue_submit(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), nullptr);
268484543d1Sopenharmony_ci    }
269484543d1Sopenharmony_ci
270484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
271484543d1Sopenharmony_ci    printf("result = %d\n", result);
272484543d1Sopenharmony_ci    EXPECT_EQ(result < expect * 10000, 1);
273484543d1Sopenharmony_ci}
274484543d1Sopenharmony_ci
275484543d1Sopenharmony_ci/*
276484543d1Sopenharmony_ci * 测试用例名称 : serial_double_cancel_failed
277484543d1Sopenharmony_ci * 测试用例描述:对一个任务取消两次
278484543d1Sopenharmony_ci * 操作步骤    :1、调用串行队列创建接口创建队列,设置延时并提交任务
279484543d1Sopenharmony_ci                2、调用两次ffrt_queue_cancel取消同一任务
280484543d1Sopenharmony_ci * 预期结果    :首次取消成功,第二次取消失败
281484543d1Sopenharmony_ci */
282484543d1Sopenharmony_ciHWTEST_F(QueueTest, serial_double_cancel_failed, TestSize.Level1)
283484543d1Sopenharmony_ci{
284484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
285484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
286484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
287484543d1Sopenharmony_ci
288484543d1Sopenharmony_ci    int result = 0;
289484543d1Sopenharmony_ci    std::function<void()>&& basicFunc = [&result]() { OnePlusForTest(static_cast<void*>(&result)); };
290484543d1Sopenharmony_ci    ffrt_task_attr_t task_attr;
291484543d1Sopenharmony_ci    (void)ffrt_task_attr_init(&task_attr); // 初始化task属性,必须
292484543d1Sopenharmony_ci    ffrt_task_attr_set_delay(&task_attr, 100); // 设置任务0.1ms后才执行,非必须
293484543d1Sopenharmony_ci
294484543d1Sopenharmony_ci    ffrt_task_handle_t t1 =
295484543d1Sopenharmony_ci        ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
296484543d1Sopenharmony_ci    int cancel = ffrt_queue_cancel(t1);
297484543d1Sopenharmony_ci    EXPECT_EQ(cancel, 0);
298484543d1Sopenharmony_ci    cancel = ffrt_queue_cancel(t1);
299484543d1Sopenharmony_ci    EXPECT_EQ(cancel, 1);
300484543d1Sopenharmony_ci    ffrt_task_handle_destroy(t1); // 销毁task_handle,必须
301484543d1Sopenharmony_ci
302484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
303484543d1Sopenharmony_ci}
304484543d1Sopenharmony_ci
305484543d1Sopenharmony_ci/*
306484543d1Sopenharmony_ci * 测试用例名称 : ffrt_queue_attr_des
307484543d1Sopenharmony_ci * 测试用例描述:设置串行队列qos等级,销毁队列attr
308484543d1Sopenharmony_ci * 操作步骤    :1、设置队列qos等级,调用串行队列创建接口创建队列
309484543d1Sopenharmony_ci                2、调用ffrt_queue_attr_destroy接口销毁队列创建的attr
310484543d1Sopenharmony_ci * 预期结果    :设置与销毁成功
311484543d1Sopenharmony_ci */
312484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_queue_attr_des, TestSize.Level1)
313484543d1Sopenharmony_ci{
314484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
315484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr);
316484543d1Sopenharmony_ci    ffrt_queue_attr_set_qos(&queue_attr, ffrt_qos_background);
317484543d1Sopenharmony_ci    ffrt_qos_t qos = ffrt_queue_attr_get_qos(&queue_attr);
318484543d1Sopenharmony_ci    EXPECT_EQ(qos == ffrt_qos_background, 1);
319484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
320484543d1Sopenharmony_ci}
321484543d1Sopenharmony_ci
322484543d1Sopenharmony_ci/*
323484543d1Sopenharmony_ci * 测试用例名称 : ffrt_queue_delay_timeout
324484543d1Sopenharmony_ci * 测试用例描述:任务队列超时,以及延时任务
325484543d1Sopenharmony_ci * 操作步骤    :1、设置队列超时时间与超时回调,调用串行队列创建接口创建队列
326484543d1Sopenharmony_ci                2、设置延时并提交任务
327484543d1Sopenharmony_ci * 预期结果    :超时执行回调
328484543d1Sopenharmony_ci */
329484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_queue_delay_timeout, TestSize.Level1)
330484543d1Sopenharmony_ci{
331484543d1Sopenharmony_ci    int x = 0;
332484543d1Sopenharmony_ci    std::function<void()>&& basicFunc1 = [&]() {
333484543d1Sopenharmony_ci        x = x + 1;
334484543d1Sopenharmony_ci    };
335484543d1Sopenharmony_ci    ffrt_function_header_t* ffrt_header_t = ffrt::create_function_wrapper((basicFunc1));
336484543d1Sopenharmony_ci
337484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
338484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr);
339484543d1Sopenharmony_ci    ffrt_queue_attr_set_callback(&queue_attr, ffrt_header_t);
340484543d1Sopenharmony_ci    ffrt_queue_attr_set_timeout(&queue_attr, 2000);
341484543d1Sopenharmony_ci    uint64_t timeout = ffrt_queue_attr_get_timeout(&queue_attr);
342484543d1Sopenharmony_ci    EXPECT_EQ(timeout, 2000);
343484543d1Sopenharmony_ci
344484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
345484543d1Sopenharmony_ci
346484543d1Sopenharmony_ci    int result = 0;
347484543d1Sopenharmony_ci    std::function<void()>&& basicFunc = [&result]() {
348484543d1Sopenharmony_ci        OnePlusForTest(static_cast<void*>(&result));
349484543d1Sopenharmony_ci        usleep(3000);
350484543d1Sopenharmony_ci    };
351484543d1Sopenharmony_ci    ffrt_task_attr_t task_attr;
352484543d1Sopenharmony_ci    (void)ffrt_task_attr_init(&task_attr);
353484543d1Sopenharmony_ci    ffrt_task_attr_set_delay(&task_attr, 1000);
354484543d1Sopenharmony_ci
355484543d1Sopenharmony_ci    ffrt_task_handle_t t1 =
356484543d1Sopenharmony_ci        ffrt_queue_submit_h(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
357484543d1Sopenharmony_ci
358484543d1Sopenharmony_ci    ffrt_queue_wait(t1);
359484543d1Sopenharmony_ci    ffrt_task_handle_destroy(t1);
360484543d1Sopenharmony_ci    EXPECT_EQ(result, 1);
361484543d1Sopenharmony_ci    EXPECT_EQ(x, 1);
362484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
363484543d1Sopenharmony_ci}
364484543d1Sopenharmony_ci
365484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_queue_dfx_api_0001, TestSize.Level1)
366484543d1Sopenharmony_ci{
367484543d1Sopenharmony_ci    // ffrt_queue_attr_set_timeout接口attr为异常值
368484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
369484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
370484543d1Sopenharmony_ci    ffrt_queue_attr_set_timeout(nullptr, 10000);
371484543d1Sopenharmony_ci    uint64_t time = ffrt_queue_attr_get_timeout(&queue_attr);
372484543d1Sopenharmony_ci    EXPECT_EQ(time, 0);
373484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
374484543d1Sopenharmony_ci    EXPECT_TRUE(queue_handle != nullptr);
375484543d1Sopenharmony_ci
376484543d1Sopenharmony_ci    // 销毁队列
377484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
378484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
379484543d1Sopenharmony_ci}
380484543d1Sopenharmony_ci
381484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_queue_dfx_api_0002, TestSize.Level1)
382484543d1Sopenharmony_ci{
383484543d1Sopenharmony_ci    // ffrt_queue_attr_get_timeout接口attr为异常值
384484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
385484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
386484543d1Sopenharmony_ci    ffrt_queue_attr_set_timeout(&queue_attr, 10000);
387484543d1Sopenharmony_ci    uint64_t time = ffrt_queue_attr_get_timeout(nullptr);
388484543d1Sopenharmony_ci    EXPECT_EQ(time, 0);
389484543d1Sopenharmony_ci    time = ffrt_queue_attr_get_timeout(&queue_attr);
390484543d1Sopenharmony_ci    EXPECT_EQ(time, 10000);
391484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
392484543d1Sopenharmony_ci    EXPECT_TRUE(queue_handle != nullptr);
393484543d1Sopenharmony_ci
394484543d1Sopenharmony_ci    // 销毁队列
395484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
396484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
397484543d1Sopenharmony_ci}
398484543d1Sopenharmony_ci
399484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_queue_dfx_api_0003, TestSize.Level1)
400484543d1Sopenharmony_ci{
401484543d1Sopenharmony_ci    // ffrt_queue_attr_set_timeoutCb接口attr为异常值
402484543d1Sopenharmony_ci    std::function<void()> cbOne = []() { printf("first set callback\n"); };
403484543d1Sopenharmony_ci
404484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
405484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
406484543d1Sopenharmony_ci    ffrt_queue_attr_set_callback(nullptr, ffrt::create_function_wrapper(cbOne, ffrt_function_kind_queue));
407484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
408484543d1Sopenharmony_ci    EXPECT_TRUE(queue_handle != nullptr);
409484543d1Sopenharmony_ci
410484543d1Sopenharmony_ci    // 销毁队列
411484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
412484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
413484543d1Sopenharmony_ci}
414484543d1Sopenharmony_ci
415484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_queue_dfx_api_0004, TestSize.Level1)
416484543d1Sopenharmony_ci{
417484543d1Sopenharmony_ci    // ffrt_queue_attr_get_timeoutCb接口attr为异常值
418484543d1Sopenharmony_ci    std::function<void()> cbOne = []() { printf("first set callback\n"); };
419484543d1Sopenharmony_ci
420484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
421484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
422484543d1Sopenharmony_ci    ffrt_queue_attr_set_callback(&queue_attr, ffrt::create_function_wrapper(cbOne, ffrt_function_kind_queue));
423484543d1Sopenharmony_ci    ffrt_function_header_t* func = ffrt_queue_attr_get_callback(nullptr);
424484543d1Sopenharmony_ci    EXPECT_TRUE(func == nullptr);
425484543d1Sopenharmony_ci    func = ffrt_queue_attr_get_callback(&queue_attr);
426484543d1Sopenharmony_ci    EXPECT_TRUE(func != nullptr);
427484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
428484543d1Sopenharmony_ci    EXPECT_TRUE(queue_handle != nullptr);
429484543d1Sopenharmony_ci
430484543d1Sopenharmony_ci    // 销毁队列
431484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
432484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
433484543d1Sopenharmony_ci}
434484543d1Sopenharmony_ci
435484543d1Sopenharmony_ci/*
436484543d1Sopenharmony_ci * 测试用例名称 : ffrt_task_attr_set_queue_priority
437484543d1Sopenharmony_ci * 测试用例描述 : 测试 ffrt_task_attr_set_queue_priority
438484543d1Sopenharmony_ci * 操作步骤     : 1、调用ffrt_task_attr_set_queue_priority接口设置队列优先级
439484543d1Sopenharmony_ci *               2、使用ffrt_task_attr_get_queue_priority查询优先级
440484543d1Sopenharmony_ci * 预期结果    : 查询结果与设定相同,值为3
441484543d1Sopenharmony_ci */
442484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_task_attr_set_queue_priority, TestSize.Level1)
443484543d1Sopenharmony_ci{
444484543d1Sopenharmony_ci    ffrt_task_attr_t task_attr;
445484543d1Sopenharmony_ci    (void)ffrt_task_attr_init(&task_attr);
446484543d1Sopenharmony_ci    ffrt_queue_priority_t priority = ffrt_queue_priority_low;
447484543d1Sopenharmony_ci    ffrt_task_attr_set_queue_priority(nullptr, priority);
448484543d1Sopenharmony_ci    ffrt_task_attr_set_queue_priority(&task_attr, priority);
449484543d1Sopenharmony_ci    priority = ffrt_task_attr_get_queue_priority(nullptr);
450484543d1Sopenharmony_ci    EXPECT_EQ(priority, ffrt_queue_priority_immediate);
451484543d1Sopenharmony_ci    priority = ffrt_task_attr_get_queue_priority(&task_attr);
452484543d1Sopenharmony_ci    EXPECT_EQ(priority, ffrt_queue_priority_low);
453484543d1Sopenharmony_ci    ffrt_task_attr_destroy(&task_attr);
454484543d1Sopenharmony_ci}
455484543d1Sopenharmony_ci
456484543d1Sopenharmony_ci/*
457484543d1Sopenharmony_ci * 测试用例名称 : ffrt_queue_attr_set_max_concurrency
458484543d1Sopenharmony_ci * 测试用例描述 : 测试 ffrt_queue_attr_set_max_concurrency
459484543d1Sopenharmony_ci * 操作步骤     : 1、调用ffrt_queue_attr_set_max_concurrency设置FFRT并行队列,并行度为4
460484543d1Sopenharmony_ci *               2、使用ffrt_queue_attr_get_max_concurrency查询并行度
461484543d1Sopenharmony_ci * 预期结果    : 查询结果与设定相同,值为4
462484543d1Sopenharmony_ci */
463484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_queue_attr_set_max_concurrency, TestSize.Level1)
464484543d1Sopenharmony_ci{
465484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
466484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr);
467484543d1Sopenharmony_ci    uint64_t concurrency = 4;
468484543d1Sopenharmony_ci    ffrt_queue_attr_set_max_concurrency(nullptr, concurrency);
469484543d1Sopenharmony_ci    ffrt_queue_attr_set_max_concurrency(&queue_attr, concurrency);
470484543d1Sopenharmony_ci    concurrency = ffrt_queue_attr_get_max_concurrency(nullptr);
471484543d1Sopenharmony_ci    EXPECT_EQ(concurrency, 0);
472484543d1Sopenharmony_ci    concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr);
473484543d1Sopenharmony_ci    EXPECT_EQ(concurrency, 4);
474484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
475484543d1Sopenharmony_ci
476484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr1;
477484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr1);
478484543d1Sopenharmony_ci    concurrency = 0;
479484543d1Sopenharmony_ci    ffrt_queue_attr_set_max_concurrency(&queue_attr1, concurrency);
480484543d1Sopenharmony_ci    concurrency = ffrt_queue_attr_get_max_concurrency(&queue_attr1);
481484543d1Sopenharmony_ci    EXPECT_EQ(concurrency, 1);
482484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr1);
483484543d1Sopenharmony_ci}
484484543d1Sopenharmony_ci
485484543d1Sopenharmony_ci/*
486484543d1Sopenharmony_ci * 测试用例名称 : ffrt_queue_has_task
487484543d1Sopenharmony_ci * 测试用例描述 : 测试 ffrt_queue_has_task
488484543d1Sopenharmony_ci * 操作步骤     : 1、往队列中提交若干任务,其中包含待查询的任务
489484543d1Sopenharmony_ci *               2、调用ffrt_queue_has_task查询任务是否在队列中
490484543d1Sopenharmony_ci * 预期结果    : 查询结果与预期相同
491484543d1Sopenharmony_ci */
492484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_queue_has_task, TestSize.Level1)
493484543d1Sopenharmony_ci{
494484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
495484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
496484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(ffrt_queue_serial, "test_queue", &queue_attr);
497484543d1Sopenharmony_ci
498484543d1Sopenharmony_ci    std::mutex lock;
499484543d1Sopenharmony_ci    lock.lock();
500484543d1Sopenharmony_ci    std::function<void()> basicFunc = [&]() { lock.lock(); };
501484543d1Sopenharmony_ci    std::function<void()> emptyFunc = []() {};
502484543d1Sopenharmony_ci
503484543d1Sopenharmony_ci    ffrt_task_attr_t task_attr;
504484543d1Sopenharmony_ci    ffrt_task_attr_init(&task_attr);
505484543d1Sopenharmony_ci    ffrt_task_attr_set_name(&task_attr, "basic_function");
506484543d1Sopenharmony_ci    ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
507484543d1Sopenharmony_ci        create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
508484543d1Sopenharmony_ci
509484543d1Sopenharmony_ci    for (int i = 0; i < 10; i++) {
510484543d1Sopenharmony_ci        std::string name = "empty_function_" + std::to_string(i);
511484543d1Sopenharmony_ci        ffrt_task_attr_set_name(&task_attr, name.c_str());
512484543d1Sopenharmony_ci        ffrt_queue_submit(queue_handle, create_function_wrapper(emptyFunc, ffrt_function_kind_queue), &task_attr);
513484543d1Sopenharmony_ci    }
514484543d1Sopenharmony_ci
515484543d1Sopenharmony_ci    // 全字匹配
516484543d1Sopenharmony_ci    for (int i = 0; i < 10; i++) {
517484543d1Sopenharmony_ci        std::string name = "empty_function_" + std::to_string(i);
518484543d1Sopenharmony_ci        bool hasEmptyTask = ffrt_queue_has_task(queue_handle, name.c_str());
519484543d1Sopenharmony_ci        EXPECT_EQ(hasEmptyTask, true);
520484543d1Sopenharmony_ci    }
521484543d1Sopenharmony_ci
522484543d1Sopenharmony_ci    // 正则匹配
523484543d1Sopenharmony_ci    bool hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_.*");
524484543d1Sopenharmony_ci    EXPECT_EQ(hasEmptyTask, true);
525484543d1Sopenharmony_ci
526484543d1Sopenharmony_ci    hasEmptyTask = ffrt_queue_has_task(queue_handle, "random_function");
527484543d1Sopenharmony_ci    EXPECT_EQ(hasEmptyTask, false);
528484543d1Sopenharmony_ci
529484543d1Sopenharmony_ci    lock.unlock();
530484543d1Sopenharmony_ci    ffrt_queue_wait(handle);
531484543d1Sopenharmony_ci
532484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
533484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
534484543d1Sopenharmony_ci}
535484543d1Sopenharmony_ci
536484543d1Sopenharmony_ci/*
537484543d1Sopenharmony_ci * 测试用例名称 : ffrt_queue_cancel_all_and_cancel_by_name
538484543d1Sopenharmony_ci * 测试用例描述 : 测试 ffrt_queue_cancel_all、ffrt_queue_cancel_by_name
539484543d1Sopenharmony_ci * 操作步骤     : 1、往队列中提交若干任务
540484543d1Sopenharmony_ci *               2、调用ffrt_queue_cancel_by_name取消指定任务
541484543d1Sopenharmony_ci *               3、调用ffrt_queue_cancel_all取消所有任务
542484543d1Sopenharmony_ci * 预期结果    : 任务取消成功
543484543d1Sopenharmony_ci */
544484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_queue_cancel_all_and_cancel_by_name, TestSize.Level1)
545484543d1Sopenharmony_ci{
546484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
547484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
548484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(
549484543d1Sopenharmony_ci        static_cast<ffrt_queue_type_t>(ffrt_queue_eventhandler_adapter), "test_queue", &queue_attr);
550484543d1Sopenharmony_ci
551484543d1Sopenharmony_ci    std::mutex lock;
552484543d1Sopenharmony_ci    lock.lock();
553484543d1Sopenharmony_ci    std::function<void()> basicFunc = [&]() { lock.lock(); };
554484543d1Sopenharmony_ci    std::function<void()> emptyFunc = []() {};
555484543d1Sopenharmony_ci
556484543d1Sopenharmony_ci    ffrt_task_attr_t task_attr;
557484543d1Sopenharmony_ci    ffrt_task_attr_init(&task_attr);
558484543d1Sopenharmony_ci    ffrt_task_attr_set_name(&task_attr, "basic_function");
559484543d1Sopenharmony_ci    ffrt_task_handle_t handle = ffrt_queue_submit_h(queue_handle,
560484543d1Sopenharmony_ci        create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
561484543d1Sopenharmony_ci
562484543d1Sopenharmony_ci    for (int i = 0; i < 10; i++) {
563484543d1Sopenharmony_ci        std::string name = "empty_function_" + std::to_string(i);
564484543d1Sopenharmony_ci        ffrt_task_attr_set_name(&task_attr, name.c_str());
565484543d1Sopenharmony_ci        ffrt_queue_submit(queue_handle, create_function_wrapper(emptyFunc, ffrt_function_kind_queue), &task_attr);
566484543d1Sopenharmony_ci    }
567484543d1Sopenharmony_ci
568484543d1Sopenharmony_ci    // 测试ffrt_queue_cancel_by_name
569484543d1Sopenharmony_ci    bool hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_3");
570484543d1Sopenharmony_ci    EXPECT_EQ(hasEmptyTask, true);
571484543d1Sopenharmony_ci
572484543d1Sopenharmony_ci    ffrt_queue_cancel_by_name(queue_handle, "empty_function_3");
573484543d1Sopenharmony_ci
574484543d1Sopenharmony_ci    hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_3");
575484543d1Sopenharmony_ci    EXPECT_EQ(hasEmptyTask, false);
576484543d1Sopenharmony_ci
577484543d1Sopenharmony_ci    // 测试ffrt_queue_cancel_all
578484543d1Sopenharmony_ci    hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_.*");
579484543d1Sopenharmony_ci    EXPECT_EQ(hasEmptyTask, true);
580484543d1Sopenharmony_ci
581484543d1Sopenharmony_ci    bool isIdle = ffrt_queue_is_idle(queue_handle);
582484543d1Sopenharmony_ci    EXPECT_EQ(isIdle, false);
583484543d1Sopenharmony_ci
584484543d1Sopenharmony_ci    ffrt_queue_cancel_all(queue_handle);
585484543d1Sopenharmony_ci
586484543d1Sopenharmony_ci    hasEmptyTask = ffrt_queue_has_task(queue_handle, "empty_function_.*");
587484543d1Sopenharmony_ci    EXPECT_EQ(hasEmptyTask, false);
588484543d1Sopenharmony_ci
589484543d1Sopenharmony_ci    lock.unlock();
590484543d1Sopenharmony_ci    ffrt_queue_cancel_and_wait(queue_handle);
591484543d1Sopenharmony_ci    ffrt_queue_wait(handle);
592484543d1Sopenharmony_ci
593484543d1Sopenharmony_ci    isIdle = ffrt_queue_is_idle(queue_handle);
594484543d1Sopenharmony_ci    EXPECT_EQ(isIdle, true);
595484543d1Sopenharmony_ci
596484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
597484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
598484543d1Sopenharmony_ci}
599484543d1Sopenharmony_ci
600484543d1Sopenharmony_ci/*
601484543d1Sopenharmony_ci * 测试用例名称 : ffrt_queue_deque_task_priority_with_greedy
602484543d1Sopenharmony_ci * 测试用例描述 : 测试并发队列取任务逻辑
603484543d1Sopenharmony_ci * 操作步骤     : 1、往队列中提交不同优先级的若干任务
604484543d1Sopenharmony_ci * 预期结果    : 任务按照优先级从高往低执行,每执行5个高优先级任务,就执行一个低优先级任务
605484543d1Sopenharmony_ci */
606484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_queue_deque_task_priority_with_greedy, TestSize.Level1)
607484543d1Sopenharmony_ci{
608484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
609484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
610484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(
611484543d1Sopenharmony_ci        static_cast<ffrt_queue_type_t>(ffrt_queue_eventhandler_adapter), "test_queue", &queue_attr);
612484543d1Sopenharmony_ci
613484543d1Sopenharmony_ci    std::mutex lock;
614484543d1Sopenharmony_ci    lock.lock();
615484543d1Sopenharmony_ci    std::function<void()> basicFunc = [&]() { lock.lock(); };
616484543d1Sopenharmony_ci    std::vector<std::function<void()>> priorityFuncs(5, nullptr);
617484543d1Sopenharmony_ci    std::vector<int> priorityCount(5, 0);
618484543d1Sopenharmony_ci    for (int idx = 0; idx < 5; idx++) {
619484543d1Sopenharmony_ci        priorityFuncs[idx] = [idx, &priorityCount]() {
620484543d1Sopenharmony_ci            if (idx < 4 && priorityCount[idx + 1] == 0) {
621484543d1Sopenharmony_ci                priorityCount[idx]++;
622484543d1Sopenharmony_ci            }
623484543d1Sopenharmony_ci
624484543d1Sopenharmony_ci            if (idx == 4 && priorityCount[idx] == 0) {
625484543d1Sopenharmony_ci                for (int prevIdx = 0; prevIdx < 3; prevIdx++) {
626484543d1Sopenharmony_ci                    if (priorityCount[prevIdx] != 5) {
627484543d1Sopenharmony_ci                        priorityCount[4] = -1;
628484543d1Sopenharmony_ci                        return;
629484543d1Sopenharmony_ci                    }
630484543d1Sopenharmony_ci                }
631484543d1Sopenharmony_ci                priorityCount[4] = 1;
632484543d1Sopenharmony_ci            }
633484543d1Sopenharmony_ci        };
634484543d1Sopenharmony_ci    }
635484543d1Sopenharmony_ci
636484543d1Sopenharmony_ci    ffrt_task_attr_t task_attr;
637484543d1Sopenharmony_ci    ffrt_task_attr_init(&task_attr);
638484543d1Sopenharmony_ci    ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_idle);
639484543d1Sopenharmony_ci    ffrt_queue_submit(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
640484543d1Sopenharmony_ci
641484543d1Sopenharmony_ci    ffrt_task_handle_t handle;
642484543d1Sopenharmony_ci    for (int prio = 0; prio < 5; prio++) {
643484543d1Sopenharmony_ci        ffrt_task_attr_set_queue_priority(&task_attr, static_cast<ffrt_queue_priority_t>(prio));
644484543d1Sopenharmony_ci        for (int i = 0; i < 10; i++) {
645484543d1Sopenharmony_ci            handle = ffrt_queue_submit_h(queue_handle,
646484543d1Sopenharmony_ci                create_function_wrapper(priorityFuncs[prio], ffrt_function_kind_queue), &task_attr);
647484543d1Sopenharmony_ci        }
648484543d1Sopenharmony_ci    }
649484543d1Sopenharmony_ci
650484543d1Sopenharmony_ci    lock.unlock();
651484543d1Sopenharmony_ci    ffrt_queue_wait(handle);
652484543d1Sopenharmony_ci
653484543d1Sopenharmony_ci    for (int idx = 0; idx < 3; idx++) {
654484543d1Sopenharmony_ci        EXPECT_EQ(priorityCount[idx], 5);
655484543d1Sopenharmony_ci    }
656484543d1Sopenharmony_ci    EXPECT_EQ(priorityCount[3], 10);
657484543d1Sopenharmony_ci    EXPECT_EQ(priorityCount[4], 1);
658484543d1Sopenharmony_ci
659484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
660484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
661484543d1Sopenharmony_ci}
662484543d1Sopenharmony_ci
663484543d1Sopenharmony_ci/*
664484543d1Sopenharmony_ci * 测试用例名称 : ffrt_queue_submit_head
665484543d1Sopenharmony_ci * 测试用例描述 : 测试 ffrt_queue_submit_head
666484543d1Sopenharmony_ci * 操作步骤     : 1、往队列中提交若干任务
667484543d1Sopenharmony_ci *               2、调用ffrt_queue_submit_head提交任务至队头
668484543d1Sopenharmony_ci * 预期结果    : 提交到对头的任务优先被执行
669484543d1Sopenharmony_ci */
670484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_queue_submit_head, TestSize.Level1)
671484543d1Sopenharmony_ci{
672484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
673484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
674484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(
675484543d1Sopenharmony_ci        static_cast<ffrt_queue_type_t>(ffrt_queue_eventhandler_adapter), "test_queue", &queue_attr);
676484543d1Sopenharmony_ci
677484543d1Sopenharmony_ci    int result = 0;
678484543d1Sopenharmony_ci    std::mutex lock;
679484543d1Sopenharmony_ci    lock.lock();
680484543d1Sopenharmony_ci    std::function<void()> basicFunc = [&]() { lock.lock(); };
681484543d1Sopenharmony_ci    std::vector<std::function<void()>> assignFuncs(8, nullptr);
682484543d1Sopenharmony_ci    std::vector<int> results;
683484543d1Sopenharmony_ci    std::vector<int> expectResults {6, 2, 1, 4, 3, 5, 8, 7};
684484543d1Sopenharmony_ci    for (int idx = 0; idx < 8; idx++) {
685484543d1Sopenharmony_ci        assignFuncs[idx] = [idx, &results]() {
686484543d1Sopenharmony_ci            results.push_back(idx + 1);
687484543d1Sopenharmony_ci        };
688484543d1Sopenharmony_ci    }
689484543d1Sopenharmony_ci
690484543d1Sopenharmony_ci    ffrt_task_attr_t task_attr;
691484543d1Sopenharmony_ci    ffrt_task_attr_init(&task_attr);
692484543d1Sopenharmony_ci    ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_immediate);
693484543d1Sopenharmony_ci    ffrt_task_attr_set_name(&task_attr, "basic_function");
694484543d1Sopenharmony_ci    ffrt_queue_submit_head(queue_handle, create_function_wrapper(basicFunc, ffrt_function_kind_queue), &task_attr);
695484543d1Sopenharmony_ci
696484543d1Sopenharmony_ci    ffrt_queue_submit_head(queue_handle, create_function_wrapper(assignFuncs[0], ffrt_function_kind_queue), &task_attr);
697484543d1Sopenharmony_ci    ffrt_queue_submit_head(queue_handle, create_function_wrapper(assignFuncs[1], ffrt_function_kind_queue), &task_attr);
698484543d1Sopenharmony_ci
699484543d1Sopenharmony_ci    ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_high);
700484543d1Sopenharmony_ci    ffrt_queue_submit_head(queue_handle, create_function_wrapper(assignFuncs[2], ffrt_function_kind_queue), &task_attr);
701484543d1Sopenharmony_ci    ffrt_queue_submit_head(queue_handle, create_function_wrapper(assignFuncs[3], ffrt_function_kind_queue), &task_attr);
702484543d1Sopenharmony_ci
703484543d1Sopenharmony_ci    ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_low);
704484543d1Sopenharmony_ci    ffrt_queue_submit_head(queue_handle, create_function_wrapper(assignFuncs[4], ffrt_function_kind_queue), &task_attr);
705484543d1Sopenharmony_ci
706484543d1Sopenharmony_ci    ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_immediate);
707484543d1Sopenharmony_ci    ffrt_queue_submit_head(queue_handle, create_function_wrapper(assignFuncs[5], ffrt_function_kind_queue), &task_attr);
708484543d1Sopenharmony_ci
709484543d1Sopenharmony_ci    ffrt_task_attr_set_queue_priority(&task_attr, ffrt_queue_priority_idle);
710484543d1Sopenharmony_ci    ffrt_task_handle_t handle = ffrt_queue_submit_head_h(queue_handle,
711484543d1Sopenharmony_ci        create_function_wrapper(assignFuncs[6], ffrt_function_kind_queue), &task_attr);
712484543d1Sopenharmony_ci    ffrt_queue_submit_head(queue_handle, create_function_wrapper(assignFuncs[7], ffrt_function_kind_queue), &task_attr);
713484543d1Sopenharmony_ci
714484543d1Sopenharmony_ci    lock.unlock();
715484543d1Sopenharmony_ci    ffrt_queue_wait(handle);
716484543d1Sopenharmony_ci    EXPECT_EQ(results, expectResults);
717484543d1Sopenharmony_ci
718484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
719484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
720484543d1Sopenharmony_ci}
721484543d1Sopenharmony_ci
722484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_eventhandler_interactive_queue, TestSize.Level1)
723484543d1Sopenharmony_ci{
724484543d1Sopenharmony_ci    ffrt_queue_attr_t queue_attr;
725484543d1Sopenharmony_ci    (void)ffrt_queue_attr_init(&queue_attr); // 初始化属性,必须
726484543d1Sopenharmony_ci    ffrt_queue_t queue_handle = ffrt_queue_create(
727484543d1Sopenharmony_ci        static_cast<ffrt_queue_type_t>(ffrt_queue_eventhandler_interactive), "test_queue", &queue_attr);
728484543d1Sopenharmony_ci    EXPECT_TRUE(queue_handle != nullptr);
729484543d1Sopenharmony_ci
730484543d1Sopenharmony_ci    ffrt_queue_attr_destroy(&queue_attr);
731484543d1Sopenharmony_ci    ffrt_queue_destroy(queue_handle);
732484543d1Sopenharmony_ci}
733484543d1Sopenharmony_ci
734484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_get_main_queue, TestSize.Level1)
735484543d1Sopenharmony_ci{
736484543d1Sopenharmony_ci // ffrt test case begin
737484543d1Sopenharmony_ci    ffrt::queue *serialQueue = new ffrt::queue("ffrt_normal_queue", {});
738484543d1Sopenharmony_ci    ffrt_queue_t mainQueue = ffrt_get_main_queue();
739484543d1Sopenharmony_ci    ffrt_task_attr_t attr;
740484543d1Sopenharmony_ci    ffrt_task_attr_init(&attr);
741484543d1Sopenharmony_ci    ffrt_task_attr_set_qos(&attr, ffrt_qos_user_initiated);
742484543d1Sopenharmony_ci    int result = 0;
743484543d1Sopenharmony_ci    std::function<void()>&& basicFunc = [&result]() {
744484543d1Sopenharmony_ci        OnePlusForTest(static_cast<void*>(&result));
745484543d1Sopenharmony_ci        OnePlusForTest(static_cast<void*>(&result));
746484543d1Sopenharmony_ci        EXPECT_EQ(result, 2);
747484543d1Sopenharmony_ci        usleep(3000);
748484543d1Sopenharmony_ci    };
749484543d1Sopenharmony_ci
750484543d1Sopenharmony_ci    ffrt::task_handle handle = serialQueue->submit_h(
751484543d1Sopenharmony_ci        [&] {
752484543d1Sopenharmony_ci            result = result + 1;
753484543d1Sopenharmony_ci            ffrt_queue_submit(mainQueue, ffrt::create_function_wrapper(basicFunc, ffrt_function_kind_queue),
754484543d1Sopenharmony_ci                              &attr);
755484543d1Sopenharmony_ci        },
756484543d1Sopenharmony_ci        ffrt::task_attr().qos(3).name("ffrt main_queue."));
757484543d1Sopenharmony_ci
758484543d1Sopenharmony_ci    serialQueue->wait(handle);
759484543d1Sopenharmony_ci    EXPECT_EQ(result, 1);
760484543d1Sopenharmony_ci}
761484543d1Sopenharmony_ci
762484543d1Sopenharmony_ciHWTEST_F(QueueTest, ffrt_get_current_queue, TestSize.Level1)
763484543d1Sopenharmony_ci{
764484543d1Sopenharmony_ci // ffrt test case begin
765484543d1Sopenharmony_ci    ffrt::queue *serialQueue = new ffrt::queue("ffrt_normal_queue", {});
766484543d1Sopenharmony_ci    ffrt_queue_t currentQueue = ffrt_get_current_queue();
767484543d1Sopenharmony_ci    ffrt_task_attr_t attr;
768484543d1Sopenharmony_ci    ffrt_task_attr_init(&attr);
769484543d1Sopenharmony_ci    ffrt_task_attr_set_qos(&attr, ffrt_qos_user_initiated);
770484543d1Sopenharmony_ci    int result = 0;
771484543d1Sopenharmony_ci    std::function<void()>&& basicFunc = [&result]() {
772484543d1Sopenharmony_ci        OnePlusForTest(static_cast<void*>(&result));
773484543d1Sopenharmony_ci        OnePlusForTest(static_cast<void*>(&result));
774484543d1Sopenharmony_ci        EXPECT_EQ(result, 3);
775484543d1Sopenharmony_ci        usleep(3000);
776484543d1Sopenharmony_ci    };
777484543d1Sopenharmony_ci
778484543d1Sopenharmony_ci    ffrt::task_handle handle = serialQueue->submit_h(
779484543d1Sopenharmony_ci        [&] {
780484543d1Sopenharmony_ci            result = result + 1;
781484543d1Sopenharmony_ci            ffrt_queue_submit(currentQueue, ffrt::create_function_wrapper(basicFunc, ffrt_function_kind_queue),
782484543d1Sopenharmony_ci                              &attr);
783484543d1Sopenharmony_ci        },
784484543d1Sopenharmony_ci        ffrt::task_attr().qos(3).name("ffrt current_queue."));
785484543d1Sopenharmony_ci
786484543d1Sopenharmony_ci    serialQueue->wait(handle);
787484543d1Sopenharmony_ci
788484543d1Sopenharmony_ci    EXPECT_EQ(result, 1);
789484543d1Sopenharmony_ci}