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}