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 <gtest/gtest.h> 17484543d1Sopenharmony_ci#include <cstdlib> 18484543d1Sopenharmony_ci#include <mutex> 19484543d1Sopenharmony_ci#include <cmath> 20484543d1Sopenharmony_ci#include <chrono> 21484543d1Sopenharmony_ci#include <thread> 22484543d1Sopenharmony_ci#include <fstream> 23484543d1Sopenharmony_ci#include <random> 24484543d1Sopenharmony_ci#include <algorithm> 25484543d1Sopenharmony_ci#include <cinttypes> 26484543d1Sopenharmony_ci#include "util.h" 27484543d1Sopenharmony_ci#include "ffrt_inner.h" 28484543d1Sopenharmony_ci#include "c/ffrt_ipc.h" 29484543d1Sopenharmony_ci#include "eu/co_routine.h" 30484543d1Sopenharmony_ci#include "sync/io_poller.h" 31484543d1Sopenharmony_ci#define private public 32484543d1Sopenharmony_ci#define protect public 33484543d1Sopenharmony_ci#include "util/ffrt_facade.h" 34484543d1Sopenharmony_ci#undef private 35484543d1Sopenharmony_ci#undef protect 36484543d1Sopenharmony_ci#include "../common.h" 37484543d1Sopenharmony_ci 38484543d1Sopenharmony_ciusing namespace std; 39484543d1Sopenharmony_ciusing namespace testing; 40484543d1Sopenharmony_ci#ifdef HWTEST_TESTING_EXT_ENABLE 41484543d1Sopenharmony_ciusing namespace testing::ext; 42484543d1Sopenharmony_ci#endif 43484543d1Sopenharmony_ci#ifdef APP_USE_ARM 44484543d1Sopenharmony_ci#define SIZEOF_BYTES sizeof(uint32_t) 45484543d1Sopenharmony_ci#else 46484543d1Sopenharmony_ci#define SIZEOF_BYTES sizeof(uint64_t) 47484543d1Sopenharmony_ci#endif 48484543d1Sopenharmony_ci 49484543d1Sopenharmony_ciclass ffrtIoTest : public testing::Test { 50484543d1Sopenharmony_ciprotected: 51484543d1Sopenharmony_ci static void SetUpTestCase() 52484543d1Sopenharmony_ci { 53484543d1Sopenharmony_ci } 54484543d1Sopenharmony_ci 55484543d1Sopenharmony_ci static void TearDownTestCase() 56484543d1Sopenharmony_ci { 57484543d1Sopenharmony_ci } 58484543d1Sopenharmony_ci 59484543d1Sopenharmony_ci virtual void SetUp() 60484543d1Sopenharmony_ci { 61484543d1Sopenharmony_ci ffrt::QoS qos = ffrt::ExecuteCtx::Cur()->qos; 62484543d1Sopenharmony_ci ffrt::FFRTFacade::GetPPInstance().GetPoller(qos).flag_ = ffrt::EpollStatus::WAKE; 63484543d1Sopenharmony_ci } 64484543d1Sopenharmony_ci 65484543d1Sopenharmony_ci virtual void TearDown() 66484543d1Sopenharmony_ci { 67484543d1Sopenharmony_ci ffrt::QoS qos = ffrt::ExecuteCtx::Cur()->qos; 68484543d1Sopenharmony_ci ffrt::FFRTFacade::GetPPInstance().GetPoller(qos).timerHandle_ = -1; 69484543d1Sopenharmony_ci ffrt::FFRTFacade::GetPPInstance().GetPoller(qos).timerMap_.clear(); 70484543d1Sopenharmony_ci ffrt::FFRTFacade::GetPPInstance().GetPoller(qos).executedHandle_.clear(); 71484543d1Sopenharmony_ci ffrt::FFRTFacade::GetPPInstance().GetPoller(qos).flag_ = ffrt::EpollStatus::TEARDOWN; 72484543d1Sopenharmony_ci } 73484543d1Sopenharmony_ci}; 74484543d1Sopenharmony_ci 75484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, IoPoller_1Producer_1Consumer, TestSize.Level1) 76484543d1Sopenharmony_ci{ 77484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 78484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 79484543d1Sopenharmony_ci ffrt::submit([&]() { 80484543d1Sopenharmony_ci ffrt::sync_io(testFd); 81484543d1Sopenharmony_ci uint64_t value = 0; 82484543d1Sopenharmony_ci ssize_t n = read(testFd, &value, sizeof(uint64_t)); 83484543d1Sopenharmony_ci EXPECT_EQ(n, sizeof(value)); 84484543d1Sopenharmony_ci EXPECT_EQ(value, expected); 85484543d1Sopenharmony_ci close(testFd); 86484543d1Sopenharmony_ci }, {}, {}); 87484543d1Sopenharmony_ci ffrt::submit([&]() { 88484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 89484543d1Sopenharmony_ci EXPECT_EQ(n, sizeof(uint64_t)); 90484543d1Sopenharmony_ci }, {}, {}); 91484543d1Sopenharmony_ci 92484543d1Sopenharmony_ci ffrt::wait(); 93484543d1Sopenharmony_ci} 94484543d1Sopenharmony_ci 95484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, IoPoller_1Consumer_1Producer, TestSize.Level1) 96484543d1Sopenharmony_ci{ 97484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 98484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 99484543d1Sopenharmony_ci ffrt::submit([&]() { 100484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 101484543d1Sopenharmony_ci EXPECT_EQ(n, sizeof(uint64_t)); 102484543d1Sopenharmony_ci }, {}, {}); 103484543d1Sopenharmony_ci 104484543d1Sopenharmony_ci stall_us(3); 105484543d1Sopenharmony_ci 106484543d1Sopenharmony_ci ffrt::submit([&]() { 107484543d1Sopenharmony_ci ffrt::sync_io(testFd); 108484543d1Sopenharmony_ci uint64_t value = 0; 109484543d1Sopenharmony_ci ssize_t n = read(testFd, &value, sizeof(uint64_t)); 110484543d1Sopenharmony_ci EXPECT_EQ(n, sizeof(value)); 111484543d1Sopenharmony_ci EXPECT_EQ(value, expected); 112484543d1Sopenharmony_ci close(testFd); 113484543d1Sopenharmony_ci }, {}, {}); 114484543d1Sopenharmony_ci 115484543d1Sopenharmony_ci ffrt::wait(); 116484543d1Sopenharmony_ci} 117484543d1Sopenharmony_ci 118484543d1Sopenharmony_ciuint64_t g_Ev = 0; 119484543d1Sopenharmony_ci 120484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, IoPoller_Producer_N_Consumer_N, TestSize.Level1) 121484543d1Sopenharmony_ci{ 122484543d1Sopenharmony_ci int count = 3; 123484543d1Sopenharmony_ci uint64_t ev = 0xabacadae; 124484543d1Sopenharmony_ci int testFd[count]; 125484543d1Sopenharmony_ci uint64_t evN = 0; 126484543d1Sopenharmony_ci uint64_t i; 127484543d1Sopenharmony_ci for (i = 0; i < count; i++) { 128484543d1Sopenharmony_ci testFd[i] = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 129484543d1Sopenharmony_ci if (testFd[i] < 0) { 130484543d1Sopenharmony_ci break; 131484543d1Sopenharmony_ci } 132484543d1Sopenharmony_ci evN++; 133484543d1Sopenharmony_ci g_Ev = evN; 134484543d1Sopenharmony_ci int fd = testFd[i]; 135484543d1Sopenharmony_ci ffrt::submit([fd, i]() { 136484543d1Sopenharmony_ci ffrt::sync_io(fd); 137484543d1Sopenharmony_ci uint64_t value = 0; 138484543d1Sopenharmony_ci ssize_t n = read(fd, &value, sizeof(uint64_t)); 139484543d1Sopenharmony_ci EXPECT_EQ(n, sizeof(value)); 140484543d1Sopenharmony_ci close(fd); 141484543d1Sopenharmony_ci }, {}, {}); 142484543d1Sopenharmony_ci } 143484543d1Sopenharmony_ci 144484543d1Sopenharmony_ci for (i = 0; i < evN; i++) { 145484543d1Sopenharmony_ci ffrt::submit([&, i]() { 146484543d1Sopenharmony_ci uint64_t expected = ev + i; 147484543d1Sopenharmony_ci ssize_t n = write(testFd[i], &expected, sizeof(uint64_t)); 148484543d1Sopenharmony_ci EXPECT_EQ(n, sizeof(uint64_t)); 149484543d1Sopenharmony_ci }, {}, {}); 150484543d1Sopenharmony_ci } 151484543d1Sopenharmony_ci printf("max eventfd:%" PRIu64 ".\n", evN); 152484543d1Sopenharmony_ci ffrt::wait(); 153484543d1Sopenharmony_ci} 154484543d1Sopenharmony_ci 155484543d1Sopenharmony_cistruct TestData { 156484543d1Sopenharmony_ci int fd; 157484543d1Sopenharmony_ci uint64_t expected; 158484543d1Sopenharmony_ci}; 159484543d1Sopenharmony_ci 160484543d1Sopenharmony_cistatic void testCallBack(void* token, uint32_t event) 161484543d1Sopenharmony_ci{ 162484543d1Sopenharmony_ci struct TestData* testData = reinterpret_cast<TestData*>(token); 163484543d1Sopenharmony_ci uint64_t value = 0; 164484543d1Sopenharmony_ci ssize_t n = read(testData->fd, &value, sizeof(uint64_t)); 165484543d1Sopenharmony_ci EXPECT_EQ(n, sizeof(value)); 166484543d1Sopenharmony_ci EXPECT_EQ(value, testData->expected); 167484543d1Sopenharmony_ci printf("cb done\n"); 168484543d1Sopenharmony_ci} 169484543d1Sopenharmony_ci 170484543d1Sopenharmony_cistatic void testfun(void* data) 171484543d1Sopenharmony_ci{ 172484543d1Sopenharmony_ci *(int*)data += 1; 173484543d1Sopenharmony_ci printf("%d, timeout callback\n", *(int*)data); 174484543d1Sopenharmony_ci} 175484543d1Sopenharmony_civoid (*cb)(void*) = testfun; 176484543d1Sopenharmony_ci 177484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_timer_start_succ_map_null, TestSize.Level1) 178484543d1Sopenharmony_ci{ 179484543d1Sopenharmony_ci uint64_t timeout = 20; 180484543d1Sopenharmony_ci int x = 0; 181484543d1Sopenharmony_ci int* xf = &x; 182484543d1Sopenharmony_ci void* data = xf; 183484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 184484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 185484543d1Sopenharmony_ci EXPECT_EQ(0, ffrt_timer_start(ffrt_qos_default, timeout, data, cb, false)); 186484543d1Sopenharmony_ci 187484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 188484543d1Sopenharmony_ci ffrt_epoll_ctl(ffrt_qos_default, EPOLL_CTL_ADD, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 189484543d1Sopenharmony_ci 190484543d1Sopenharmony_ci usleep(30000); 191484543d1Sopenharmony_ci ffrt::submit([&]() { 192484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 193484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 194484543d1Sopenharmony_ci }, {}, {}); 195484543d1Sopenharmony_ci ffrt_epoll_ctl(ffrt_qos_default, EPOLL_CTL_DEL, testFd, 0, nullptr, nullptr); 196484543d1Sopenharmony_ci ffrt::wait(); 197484543d1Sopenharmony_ci EXPECT_EQ(1, x); 198484543d1Sopenharmony_ci close(testFd); 199484543d1Sopenharmony_ci} 200484543d1Sopenharmony_ci 201484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_timer_start_fail_cb_null, TestSize.Level1) 202484543d1Sopenharmony_ci{ 203484543d1Sopenharmony_ci uint64_t timeout = 20; 204484543d1Sopenharmony_ci void* data = nullptr; 205484543d1Sopenharmony_ci void (*timeoutNullCb)(void*) = nullptr; 206484543d1Sopenharmony_ci 207484543d1Sopenharmony_ci EXPECT_EQ(-1, ffrt_timer_start(ffrt_qos_default, timeout, data, timeoutNullCb, false)); 208484543d1Sopenharmony_ci} 209484543d1Sopenharmony_ci 210484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_timer_start_fail_flag_teardown, TestSize.Level1) 211484543d1Sopenharmony_ci{ 212484543d1Sopenharmony_ci ffrt::QoS qos = ffrt::ExecuteCtx::Cur()->qos; 213484543d1Sopenharmony_ci ffrt::FFRTFacade::GetPPInstance().GetPoller(qos).flag_ = ffrt::EpollStatus::TEARDOWN; 214484543d1Sopenharmony_ci uint64_t timeout = 20; 215484543d1Sopenharmony_ci void* data = nullptr; 216484543d1Sopenharmony_ci 217484543d1Sopenharmony_ci EXPECT_EQ(-1, ffrt_timer_start(qos, timeout, data, cb, false)); 218484543d1Sopenharmony_ci} 219484543d1Sopenharmony_ci 220484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_timer_start_succ_short_timeout_flagwait, TestSize.Level1) 221484543d1Sopenharmony_ci{ 222484543d1Sopenharmony_ci int x = 0; 223484543d1Sopenharmony_ci int* xf = &x; 224484543d1Sopenharmony_ci void* data = xf; 225484543d1Sopenharmony_ci ffrt::QoS qos = ffrt::ExecuteCtx::Cur()->qos; 226484543d1Sopenharmony_ci uint64_t timeout1 = 200; 227484543d1Sopenharmony_ci uint64_t timeout2 = 10; 228484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 229484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 230484543d1Sopenharmony_ci ffrt::FFRTFacade::GetPPInstance().GetPoller(qos).flag_ = ffrt::EpollStatus::WAIT; 231484543d1Sopenharmony_ci EXPECT_EQ(0, ffrt_timer_start(qos, timeout1, data, cb, false)); 232484543d1Sopenharmony_ci 233484543d1Sopenharmony_ci EXPECT_EQ(1, ffrt_timer_start(qos, timeout2, data, cb, false)); 234484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 235484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_ADD, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 236484543d1Sopenharmony_ci 237484543d1Sopenharmony_ci usleep(15000); 238484543d1Sopenharmony_ci ffrt::submit([&]() { 239484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 240484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 241484543d1Sopenharmony_ci }, {}, {}); 242484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_DEL, testFd, 0, nullptr, nullptr); 243484543d1Sopenharmony_ci ffrt::wait(); 244484543d1Sopenharmony_ci EXPECT_EQ(1, x); 245484543d1Sopenharmony_ci close(testFd); 246484543d1Sopenharmony_ci} 247484543d1Sopenharmony_ci 248484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_timer_start_succ_short_timeout_flagwake, TestSize.Level1) 249484543d1Sopenharmony_ci{ 250484543d1Sopenharmony_ci int x = 0; 251484543d1Sopenharmony_ci int* xf = &x; 252484543d1Sopenharmony_ci void* data = xf; 253484543d1Sopenharmony_ci ffrt::QoS qos = ffrt::ExecuteCtx::Cur()->qos; 254484543d1Sopenharmony_ci uint64_t timeout1 = 400; 255484543d1Sopenharmony_ci uint64_t timeout2 = 10; 256484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 257484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 258484543d1Sopenharmony_ci EXPECT_EQ(0, ffrt_timer_start(qos, timeout1, data, cb, false)); 259484543d1Sopenharmony_ci ffrt::FFRTFacade::GetPPInstance().GetPoller(qos).flag_ = ffrt::EpollStatus::WAKE; 260484543d1Sopenharmony_ci EXPECT_EQ(1, ffrt_timer_start(qos, timeout2, data, cb, false)); 261484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 262484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_ADD, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 263484543d1Sopenharmony_ci 264484543d1Sopenharmony_ci usleep(15000); 265484543d1Sopenharmony_ci ffrt::submit([&]() { 266484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 267484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 268484543d1Sopenharmony_ci }, {}, {}); 269484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_DEL, testFd, 0, nullptr, nullptr); 270484543d1Sopenharmony_ci ffrt::wait(); 271484543d1Sopenharmony_ci EXPECT_EQ(1, x); 272484543d1Sopenharmony_ci close(testFd); 273484543d1Sopenharmony_ci} 274484543d1Sopenharmony_ci 275484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_timer_start_succ_long_timeout_flagwake, TestSize.Level1) 276484543d1Sopenharmony_ci{ 277484543d1Sopenharmony_ci ffrt::QoS qos = ffrt::ExecuteCtx::Cur()->qos; 278484543d1Sopenharmony_ci int x = 0; 279484543d1Sopenharmony_ci int* xf = &x; 280484543d1Sopenharmony_ci void* data = xf; 281484543d1Sopenharmony_ci uint64_t timeout1 = 10; 282484543d1Sopenharmony_ci uint64_t timeout2 = 200; 283484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 284484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 285484543d1Sopenharmony_ci 286484543d1Sopenharmony_ci EXPECT_EQ(0, ffrt_timer_start(qos, timeout1, data, cb, false)); 287484543d1Sopenharmony_ci ffrt::FFRTFacade::GetPPInstance().GetPoller(qos).flag_ = ffrt::EpollStatus::WAKE; 288484543d1Sopenharmony_ci EXPECT_EQ(1, ffrt_timer_start(qos, timeout2, data, cb, false)); 289484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 290484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_ADD, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 291484543d1Sopenharmony_ci 292484543d1Sopenharmony_ci usleep(15000); 293484543d1Sopenharmony_ci ffrt::submit([&]() { 294484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 295484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 296484543d1Sopenharmony_ci }, {}, {}); 297484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_DEL, testFd, 0, nullptr, nullptr); 298484543d1Sopenharmony_ci ffrt::wait(); 299484543d1Sopenharmony_ci EXPECT_EQ(1, x); 300484543d1Sopenharmony_ci close(testFd); 301484543d1Sopenharmony_ci} 302484543d1Sopenharmony_ci 303484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_timer_stop_fail, TestSize.Level1) 304484543d1Sopenharmony_ci{ 305484543d1Sopenharmony_ci int handle = -1; 306484543d1Sopenharmony_ci ffrt_timer_stop(ffrt_qos_default, handle); 307484543d1Sopenharmony_ci} 308484543d1Sopenharmony_ci 309484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_timer_stop_succ_mapfirst_flagwait, TestSize.Level1) 310484543d1Sopenharmony_ci{ 311484543d1Sopenharmony_ci ffrt::QoS qos = ffrt::ExecuteCtx::Cur()->qos; 312484543d1Sopenharmony_ci int x = 0; 313484543d1Sopenharmony_ci int* xf = &x; 314484543d1Sopenharmony_ci void* data = xf; 315484543d1Sopenharmony_ci uint64_t timeout1 = 20; 316484543d1Sopenharmony_ci uint64_t timeout2 = 10; 317484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 318484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 319484543d1Sopenharmony_ci 320484543d1Sopenharmony_ci EXPECT_EQ(0, ffrt_timer_start(qos, timeout1, data, cb, false)); 321484543d1Sopenharmony_ci 322484543d1Sopenharmony_ci int handle = ffrt_timer_start(qos, timeout2, data, cb, false); 323484543d1Sopenharmony_ci EXPECT_EQ(1, handle); 324484543d1Sopenharmony_ci ffrt::FFRTFacade::GetPPInstance().GetPoller(qos).flag_ = ffrt::EpollStatus::WAIT; 325484543d1Sopenharmony_ci ffrt_timer_stop(qos, handle); 326484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 327484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_ADD, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 328484543d1Sopenharmony_ci 329484543d1Sopenharmony_ci usleep(15000); 330484543d1Sopenharmony_ci ffrt::submit([&]() { 331484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 332484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 333484543d1Sopenharmony_ci }, {}, {}); 334484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_DEL, testFd, 0, nullptr, nullptr); 335484543d1Sopenharmony_ci ffrt::wait(); 336484543d1Sopenharmony_ci close(testFd); 337484543d1Sopenharmony_ci} 338484543d1Sopenharmony_ci 339484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_timer_stop_succ_mapother, TestSize.Level1) 340484543d1Sopenharmony_ci{ 341484543d1Sopenharmony_ci ffrt::QoS qos = ffrt::ExecuteCtx::Cur()->qos; 342484543d1Sopenharmony_ci int x = 0; 343484543d1Sopenharmony_ci int* xf = &x; 344484543d1Sopenharmony_ci void* data = xf; 345484543d1Sopenharmony_ci uint64_t timeout1 = 10; 346484543d1Sopenharmony_ci uint64_t timeout2 = 20; 347484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 348484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 349484543d1Sopenharmony_ci 350484543d1Sopenharmony_ci EXPECT_EQ(0, ffrt_timer_start(qos, timeout1, data, cb, false)); 351484543d1Sopenharmony_ci ffrt::FFRTFacade::GetPPInstance().GetPoller(qos).flag_ = ffrt::EpollStatus::WAIT; 352484543d1Sopenharmony_ci int handle = ffrt_timer_start(qos, timeout2, data, cb, false); 353484543d1Sopenharmony_ci EXPECT_EQ(1, handle); 354484543d1Sopenharmony_ci ffrt_timer_stop(qos, handle); 355484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 356484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_ADD, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 357484543d1Sopenharmony_ci 358484543d1Sopenharmony_ci usleep(15000); 359484543d1Sopenharmony_ci ffrt::submit([&]() { 360484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 361484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 362484543d1Sopenharmony_ci }, {}, {}); 363484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_DEL, testFd, 0, nullptr, nullptr); 364484543d1Sopenharmony_ci ffrt::wait(); 365484543d1Sopenharmony_ci close(testFd); 366484543d1Sopenharmony_ci} 367484543d1Sopenharmony_ci 368484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_timer_stop_succ_mapfirst_flagwake, TestSize.Level1) 369484543d1Sopenharmony_ci{ 370484543d1Sopenharmony_ci ffrt::QoS qos = ffrt::ExecuteCtx::Cur()->qos; 371484543d1Sopenharmony_ci int x = 0; 372484543d1Sopenharmony_ci int* xf = &x; 373484543d1Sopenharmony_ci void* data = xf; 374484543d1Sopenharmony_ci uint64_t timeout1 = 10; 375484543d1Sopenharmony_ci uint64_t timeout2 = 20; 376484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 377484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 378484543d1Sopenharmony_ci 379484543d1Sopenharmony_ci EXPECT_EQ(0, ffrt_timer_start(qos, timeout1, data, cb, false)); 380484543d1Sopenharmony_ci ffrt::FFRTFacade::GetPPInstance().GetPoller(qos).flag_ = ffrt::EpollStatus::WAKE; 381484543d1Sopenharmony_ci int handle = ffrt_timer_start(qos, timeout2, data, cb, false); 382484543d1Sopenharmony_ci EXPECT_EQ(1, handle); 383484543d1Sopenharmony_ci ffrt_timer_stop(qos, handle); 384484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 385484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_ADD, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 386484543d1Sopenharmony_ci 387484543d1Sopenharmony_ci usleep(15000); 388484543d1Sopenharmony_ci 389484543d1Sopenharmony_ci ffrt::submit([&]() { 390484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 391484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 392484543d1Sopenharmony_ci }, {}, {}); 393484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_DEL, testFd, 0, nullptr, nullptr); 394484543d1Sopenharmony_ci ffrt::wait(); 395484543d1Sopenharmony_ci close(testFd); 396484543d1Sopenharmony_ci} 397484543d1Sopenharmony_ci 398484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_timer_stop_succ_flag_teardown, TestSize.Level1) 399484543d1Sopenharmony_ci{ 400484543d1Sopenharmony_ci ffrt::QoS qos = ffrt::ExecuteCtx::Cur()->qos; 401484543d1Sopenharmony_ci int x = 0; 402484543d1Sopenharmony_ci int* xf = &x; 403484543d1Sopenharmony_ci void* data = xf; 404484543d1Sopenharmony_ci uint64_t timeout2 = 20; 405484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 406484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 407484543d1Sopenharmony_ci 408484543d1Sopenharmony_ci ffrt::FFRTFacade::GetPPInstance().GetPoller(qos).flag_ = ffrt::EpollStatus::TEARDOWN; 409484543d1Sopenharmony_ci int handle = ffrt_timer_start(qos, timeout2, data, cb, false); 410484543d1Sopenharmony_ci EXPECT_EQ(-1, handle); 411484543d1Sopenharmony_ci ffrt_timer_stop(qos, handle); 412484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 413484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_ADD, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 414484543d1Sopenharmony_ci 415484543d1Sopenharmony_ci usleep(21000); 416484543d1Sopenharmony_ci 417484543d1Sopenharmony_ci ffrt::submit([&]() { 418484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 419484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 420484543d1Sopenharmony_ci }, {}, {}); 421484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_DEL, testFd, 0, nullptr, nullptr); 422484543d1Sopenharmony_ci ffrt::wait(); 423484543d1Sopenharmony_ci EXPECT_EQ(0, x); 424484543d1Sopenharmony_ci close(testFd); 425484543d1Sopenharmony_ci} 426484543d1Sopenharmony_ci 427484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_timer_query_test, TestSize.Level1) 428484543d1Sopenharmony_ci{ 429484543d1Sopenharmony_ci int x = 0; 430484543d1Sopenharmony_ci int* xf = &x; 431484543d1Sopenharmony_ci void* data = xf; 432484543d1Sopenharmony_ci uint64_t timeout1 = 10; 433484543d1Sopenharmony_ci uint64_t timeout2 = 20; 434484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 435484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 436484543d1Sopenharmony_ci 437484543d1Sopenharmony_ci ffrt_qos_t qos = ffrt_qos_default; 438484543d1Sopenharmony_ci int handle = ffrt_timer_start(qos, timeout1, data, cb, false); 439484543d1Sopenharmony_ci EXPECT_EQ(0, ffrt_timer_query(qos, handle)); 440484543d1Sopenharmony_ci 441484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 442484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_ADD, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 443484543d1Sopenharmony_ci 444484543d1Sopenharmony_ci usleep(15000); 445484543d1Sopenharmony_ci 446484543d1Sopenharmony_ci ffrt::submit([&]() { 447484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 448484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 449484543d1Sopenharmony_ci }, {}, {}); 450484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_DEL, testFd, 0, nullptr, nullptr); 451484543d1Sopenharmony_ci ffrt::wait(); 452484543d1Sopenharmony_ci close(testFd); 453484543d1Sopenharmony_ci EXPECT_EQ(1, ffrt_timer_query(qos, handle)); 454484543d1Sopenharmony_ci} 455484543d1Sopenharmony_ci 456484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_timer_query_stop, TestSize.Level1) 457484543d1Sopenharmony_ci{ 458484543d1Sopenharmony_ci int x = 0; 459484543d1Sopenharmony_ci int* xf = &x; 460484543d1Sopenharmony_ci void* data = xf; 461484543d1Sopenharmony_ci uint64_t timeout1 = 10; 462484543d1Sopenharmony_ci uint64_t timeout2 = 20; 463484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 464484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 465484543d1Sopenharmony_ci 466484543d1Sopenharmony_ci ffrt_qos_t qos = ffrt_qos_default; 467484543d1Sopenharmony_ci int handle = ffrt_timer_start(qos, timeout1, data, cb, false); 468484543d1Sopenharmony_ci EXPECT_EQ(0, ffrt_timer_query(qos, handle)); 469484543d1Sopenharmony_ci 470484543d1Sopenharmony_ci ffrt_timer_stop(qos, handle); 471484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 472484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_ADD, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 473484543d1Sopenharmony_ci 474484543d1Sopenharmony_ci usleep(15000); 475484543d1Sopenharmony_ci 476484543d1Sopenharmony_ci ffrt::submit([&]() { 477484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 478484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 479484543d1Sopenharmony_ci }, {}, {}); 480484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_DEL, testFd, 0, nullptr, nullptr); 481484543d1Sopenharmony_ci ffrt::wait(); 482484543d1Sopenharmony_ci EXPECT_EQ(-1, ffrt_timer_query(qos, handle)); 483484543d1Sopenharmony_ci close(testFd); 484484543d1Sopenharmony_ci} 485484543d1Sopenharmony_ci 486484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_poller_deregister_qos_valid, TestSize.Level1) 487484543d1Sopenharmony_ci{ 488484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 489484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 490484543d1Sopenharmony_ci ffrt_qos_t qos_level = ffrt_qos_default; 491484543d1Sopenharmony_ci int op = EPOLL_CTL_ADD; 492484543d1Sopenharmony_ci 493484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 494484543d1Sopenharmony_ci 495484543d1Sopenharmony_ci int ret = ffrt_epoll_ctl(qos_level, op, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 496484543d1Sopenharmony_ci EXPECT_EQ(0, ret); 497484543d1Sopenharmony_ci 498484543d1Sopenharmony_ci ffrt::submit([&]() { 499484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 500484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 501484543d1Sopenharmony_ci }, {}, {}); 502484543d1Sopenharmony_ci 503484543d1Sopenharmony_ci usleep(100); 504484543d1Sopenharmony_ci 505484543d1Sopenharmony_ci ret = ffrt_epoll_ctl(qos_level, EPOLL_CTL_DEL, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 506484543d1Sopenharmony_ci EXPECT_EQ(0, ret); 507484543d1Sopenharmony_ci ffrt::wait(); 508484543d1Sopenharmony_ci close(testFd); 509484543d1Sopenharmony_ci} 510484543d1Sopenharmony_ci 511484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_poller_deregister_qos_fd_invalid, TestSize.Level1) 512484543d1Sopenharmony_ci{ 513484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 514484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 515484543d1Sopenharmony_ci ffrt_qos_t qos_level = ffrt_qos_default; 516484543d1Sopenharmony_ci int op = EPOLL_CTL_ADD; 517484543d1Sopenharmony_ci 518484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 519484543d1Sopenharmony_ci 520484543d1Sopenharmony_ci int ret = ffrt_epoll_ctl(qos_level, op, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 521484543d1Sopenharmony_ci EXPECT_EQ(0, ret); 522484543d1Sopenharmony_ci 523484543d1Sopenharmony_ci ffrt::submit([&]() { 524484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 525484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 526484543d1Sopenharmony_ci }, {}, {}); 527484543d1Sopenharmony_ci 528484543d1Sopenharmony_ci usleep(100); 529484543d1Sopenharmony_ci 530484543d1Sopenharmony_ci ret = ffrt_epoll_ctl(qos_level, EPOLL_CTL_DEL, -1, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 531484543d1Sopenharmony_ci EXPECT_EQ(-1, ret); 532484543d1Sopenharmony_ci ffrt::wait(); 533484543d1Sopenharmony_ci close(testFd); 534484543d1Sopenharmony_ci} 535484543d1Sopenharmony_ci 536484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_poller_deregister_qos_qos_invalid, TestSize.Level1) 537484543d1Sopenharmony_ci{ 538484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 539484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 540484543d1Sopenharmony_ci ffrt_qos_t qos_level = ffrt_qos_user_initiated; 541484543d1Sopenharmony_ci int op = EPOLL_CTL_ADD; 542484543d1Sopenharmony_ci 543484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 544484543d1Sopenharmony_ci 545484543d1Sopenharmony_ci int ret = ffrt_epoll_ctl(ffrt_qos_default, op, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 546484543d1Sopenharmony_ci EXPECT_EQ(0, ret); 547484543d1Sopenharmony_ci 548484543d1Sopenharmony_ci ffrt::submit([&]() { 549484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 550484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 551484543d1Sopenharmony_ci }, {}, {}); 552484543d1Sopenharmony_ci 553484543d1Sopenharmony_ci usleep(100); 554484543d1Sopenharmony_ci 555484543d1Sopenharmony_ci ret = ffrt_epoll_ctl(qos_level, EPOLL_CTL_DEL, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 556484543d1Sopenharmony_ci EXPECT_EQ(-1, ret); 557484543d1Sopenharmony_ci ffrt::wait(); 558484543d1Sopenharmony_ci close(testFd); 559484543d1Sopenharmony_ci} 560484543d1Sopenharmony_ci 561484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_task_attr_set_local_true, TestSize.Level1) 562484543d1Sopenharmony_ci{ 563484543d1Sopenharmony_ci bool isLocalSet = true; 564484543d1Sopenharmony_ci ffrt_task_attr_t attr; 565484543d1Sopenharmony_ci ffrt_task_attr_init(&attr); 566484543d1Sopenharmony_ci ffrt_task_attr_set_local(&attr, isLocalSet); 567484543d1Sopenharmony_ci bool localval = ffrt_task_attr_get_local(&attr); 568484543d1Sopenharmony_ci EXPECT_EQ(localval, isLocalSet); 569484543d1Sopenharmony_ci} 570484543d1Sopenharmony_ci 571484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_task_attr_set_local_false, TestSize.Level1) 572484543d1Sopenharmony_ci{ 573484543d1Sopenharmony_ci bool isLocalSet = false; 574484543d1Sopenharmony_ci ffrt_task_attr_t attr; 575484543d1Sopenharmony_ci ffrt_task_attr_init(&attr); 576484543d1Sopenharmony_ci ffrt_task_attr_set_local(&attr, isLocalSet); 577484543d1Sopenharmony_ci bool localval = ffrt_task_attr_get_local(&attr); 578484543d1Sopenharmony_ci EXPECT_EQ(localval, isLocalSet); 579484543d1Sopenharmony_ci} 580484543d1Sopenharmony_ci 581484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_task_attr_set_local_attr_invalid, TestSize.Level1) 582484543d1Sopenharmony_ci{ 583484543d1Sopenharmony_ci bool isLocalSet = true; 584484543d1Sopenharmony_ci ffrt_task_attr_set_local(nullptr, isLocalSet); 585484543d1Sopenharmony_ci} 586484543d1Sopenharmony_ci 587484543d1Sopenharmony_cistruct WakeData { 588484543d1Sopenharmony_ci int fd; 589484543d1Sopenharmony_ci void* data; 590484543d1Sopenharmony_ci}; 591484543d1Sopenharmony_ci 592484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_epoll_wait_valid, TestSize.Level1) 593484543d1Sopenharmony_ci{ 594484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 595484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 596484543d1Sopenharmony_ci struct WakeData m_wakeData; 597484543d1Sopenharmony_ci m_wakeData.data = nullptr; 598484543d1Sopenharmony_ci m_wakeData.fd = testFd; 599484543d1Sopenharmony_ci ffrt_qos_t qos_level = ffrt_qos_user_initiated; 600484543d1Sopenharmony_ci int op = EPOLL_CTL_ADD; 601484543d1Sopenharmony_ci epoll_event ev = { .events = EPOLLIN, .data = {.ptr = static_cast<void*>(&m_wakeData)} }; 602484543d1Sopenharmony_ci int maxevents = 1024; 603484543d1Sopenharmony_ci uint64_t timeout = 0; 604484543d1Sopenharmony_ci int result = 0; 605484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 606484543d1Sopenharmony_ci 607484543d1Sopenharmony_ci int ret = ffrt_epoll_ctl(qos_level, op, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 608484543d1Sopenharmony_ci EXPECT_EQ(0, ret); 609484543d1Sopenharmony_ci 610484543d1Sopenharmony_ci ffrt::submit([&]() { 611484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 612484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 613484543d1Sopenharmony_ci result = ffrt_epoll_wait(qos_level, &ev, maxevents, timeout); 614484543d1Sopenharmony_ci }, {}, {}); 615484543d1Sopenharmony_ci usleep(1000); 616484543d1Sopenharmony_ci EXPECT_EQ(0, result); 617484543d1Sopenharmony_ci} 618484543d1Sopenharmony_ci 619484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_epoll_wait_events_invalid, TestSize.Level1) 620484543d1Sopenharmony_ci{ 621484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 622484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 623484543d1Sopenharmony_ci struct WakeData m_wakeData; 624484543d1Sopenharmony_ci m_wakeData.data = nullptr; 625484543d1Sopenharmony_ci m_wakeData.fd = testFd; 626484543d1Sopenharmony_ci ffrt_qos_t qos_level = ffrt_qos_user_initiated; 627484543d1Sopenharmony_ci int op = EPOLL_CTL_ADD; 628484543d1Sopenharmony_ci epoll_event ev = { .events = EPOLLIN, .data = {.ptr = static_cast<void*>(&m_wakeData)} }; 629484543d1Sopenharmony_ci int maxevents = 1024; 630484543d1Sopenharmony_ci uint64_t timeout = 0; 631484543d1Sopenharmony_ci int result = 0; 632484543d1Sopenharmony_ci 633484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 634484543d1Sopenharmony_ci 635484543d1Sopenharmony_ci int ret = ffrt_epoll_ctl(qos_level, op, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 636484543d1Sopenharmony_ci EXPECT_EQ(0, ret); 637484543d1Sopenharmony_ci 638484543d1Sopenharmony_ci ffrt::submit([&]() { 639484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 640484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 641484543d1Sopenharmony_ci result = ffrt_epoll_wait(qos_level, nullptr, maxevents, timeout); 642484543d1Sopenharmony_ci }, {}, {}); 643484543d1Sopenharmony_ci usleep(1000); 644484543d1Sopenharmony_ci EXPECT_EQ(-1, result); 645484543d1Sopenharmony_ci} 646484543d1Sopenharmony_ci 647484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_epoll_wait_maxevents_invalid, TestSize.Level1) 648484543d1Sopenharmony_ci{ 649484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 650484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 651484543d1Sopenharmony_ci 652484543d1Sopenharmony_ci struct WakeData m_wakeData; 653484543d1Sopenharmony_ci m_wakeData.data = nullptr; 654484543d1Sopenharmony_ci m_wakeData.fd = testFd; 655484543d1Sopenharmony_ci ffrt_qos_t qos_level = ffrt_qos_user_initiated; 656484543d1Sopenharmony_ci int op = EPOLL_CTL_ADD; 657484543d1Sopenharmony_ci int result = 0; 658484543d1Sopenharmony_ci 659484543d1Sopenharmony_ci epoll_event ev = { .events = EPOLLIN, .data = {.ptr = static_cast<void*>(&m_wakeData)} }; 660484543d1Sopenharmony_ci int maxevents = -1; 661484543d1Sopenharmony_ci uint64_t timeout = 0; 662484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 663484543d1Sopenharmony_ci 664484543d1Sopenharmony_ci int ret = ffrt_epoll_ctl(qos_level, op, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 665484543d1Sopenharmony_ci EXPECT_EQ(0, ret); 666484543d1Sopenharmony_ci 667484543d1Sopenharmony_ci ffrt::submit([&]() { 668484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 669484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 670484543d1Sopenharmony_ci result = ffrt_epoll_wait(qos_level, &ev, maxevents, timeout); 671484543d1Sopenharmony_ci }, {}, {}); 672484543d1Sopenharmony_ci usleep(1000); 673484543d1Sopenharmony_ci EXPECT_EQ(-1, result); 674484543d1Sopenharmony_ci} 675484543d1Sopenharmony_ci 676484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_epoll_wait_timeout_invalid, TestSize.Level1) 677484543d1Sopenharmony_ci{ 678484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 679484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 680484543d1Sopenharmony_ci struct WakeData m_wakeData; 681484543d1Sopenharmony_ci m_wakeData.data = nullptr; 682484543d1Sopenharmony_ci m_wakeData.fd = testFd; 683484543d1Sopenharmony_ci ffrt_qos_t qos_level = ffrt_qos_user_initiated; 684484543d1Sopenharmony_ci int op = EPOLL_CTL_ADD; 685484543d1Sopenharmony_ci int result = 0; 686484543d1Sopenharmony_ci 687484543d1Sopenharmony_ci epoll_event ev = { .events = EPOLLIN, .data = {.ptr = static_cast<void*>(&m_wakeData)} }; 688484543d1Sopenharmony_ci int maxevents = 1024; 689484543d1Sopenharmony_ci uint64_t timeout = -1; 690484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 691484543d1Sopenharmony_ci 692484543d1Sopenharmony_ci int ret = ffrt_epoll_ctl(qos_level, op, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 693484543d1Sopenharmony_ci EXPECT_EQ(0, ret); 694484543d1Sopenharmony_ci 695484543d1Sopenharmony_ci ffrt::submit([&]() { 696484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 697484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 698484543d1Sopenharmony_ci result = ffrt_epoll_wait(qos_level, &ev, maxevents, timeout); 699484543d1Sopenharmony_ci }, {}, {}); 700484543d1Sopenharmony_ci usleep(1000); 701484543d1Sopenharmony_ci EXPECT_EQ(0, result); 702484543d1Sopenharmony_ci} 703484543d1Sopenharmony_ci 704484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_epoll_ctl_op1, TestSize.Level1) 705484543d1Sopenharmony_ci{ 706484543d1Sopenharmony_ci int op = EPOLL_CTL_ADD; 707484543d1Sopenharmony_ci ffrt_qos_t qos = ffrt_qos_default; 708484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 709484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 710484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 711484543d1Sopenharmony_ci 712484543d1Sopenharmony_ci int ret = ffrt_epoll_ctl(qos, op, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 713484543d1Sopenharmony_ci EXPECT_EQ(0, ret); 714484543d1Sopenharmony_ci} 715484543d1Sopenharmony_ci 716484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_epoll_ctl_op3, TestSize.Level1) 717484543d1Sopenharmony_ci{ 718484543d1Sopenharmony_ci int op = EPOLL_CTL_MOD; 719484543d1Sopenharmony_ci ffrt_qos_t qos = ffrt_qos_default; 720484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 721484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 722484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 723484543d1Sopenharmony_ci 724484543d1Sopenharmony_ci ffrt_epoll_ctl(qos, EPOLL_CTL_ADD, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 725484543d1Sopenharmony_ci int ret = ffrt_epoll_ctl(qos, op, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 726484543d1Sopenharmony_ci EXPECT_EQ(0, ret); 727484543d1Sopenharmony_ci} 728484543d1Sopenharmony_ci 729484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_epoll_ctl_op_invalid, TestSize.Level1) 730484543d1Sopenharmony_ci{ 731484543d1Sopenharmony_ci int op = 0; 732484543d1Sopenharmony_ci ffrt_qos_t qos = ffrt_qos_default; 733484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 734484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 735484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 736484543d1Sopenharmony_ci 737484543d1Sopenharmony_ci int ret = ffrt_epoll_ctl(qos, op, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 738484543d1Sopenharmony_ci EXPECT_EQ(-1, ret); 739484543d1Sopenharmony_ci} 740484543d1Sopenharmony_ci 741484543d1Sopenharmony_ci/** 742484543d1Sopenharmony_ci * @tc.name: ffrt_epoll_wait_valid_with_thread_mode 743484543d1Sopenharmony_ci * @tc.desc: Test ffrt_epoll_wait when valid in Thread mode 744484543d1Sopenharmony_ci * @tc.type: FUNC 745484543d1Sopenharmony_ci */ 746484543d1Sopenharmony_ciHWTEST_F(ffrtIoTest, ffrt_epoll_wait_valid_with_thread_mode, TestSize.Level1) 747484543d1Sopenharmony_ci{ 748484543d1Sopenharmony_ci uint64_t expected = 0xabacadae; 749484543d1Sopenharmony_ci int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); 750484543d1Sopenharmony_ci struct WakeData m_wakeData; 751484543d1Sopenharmony_ci m_wakeData.data = nullptr; 752484543d1Sopenharmony_ci m_wakeData.fd = testFd; 753484543d1Sopenharmony_ci ffrt_qos_t qos_level = ffrt_qos_user_initiated; 754484543d1Sopenharmony_ci int op = EPOLL_CTL_ADD; 755484543d1Sopenharmony_ci epoll_event ev = { .events = EPOLLIN, .data = {.ptr = static_cast<void*>(&m_wakeData)} }; 756484543d1Sopenharmony_ci int maxevents = 1024; 757484543d1Sopenharmony_ci uint64_t timeout = 0; 758484543d1Sopenharmony_ci int result = 0; 759484543d1Sopenharmony_ci struct TestData testData {.fd = testFd, .expected = expected}; 760484543d1Sopenharmony_ci 761484543d1Sopenharmony_ci 762484543d1Sopenharmony_ci int ret = ffrt_epoll_ctl(qos_level, op, testFd, EPOLLIN, reinterpret_cast<void*>(&testData), testCallBack); 763484543d1Sopenharmony_ci EXPECT_EQ(0, ret); 764484543d1Sopenharmony_ci 765484543d1Sopenharmony_ci ffrt::submit([&]() { 766484543d1Sopenharmony_ci ffrt_this_task_set_legacy_mode(true); 767484543d1Sopenharmony_ci ssize_t n = write(testFd, &expected, sizeof(uint64_t)); 768484543d1Sopenharmony_ci EXPECT_EQ(sizeof(n), SIZEOF_BYTES); 769484543d1Sopenharmony_ci result = ffrt_epoll_wait(qos_level, &ev, maxevents, timeout); 770484543d1Sopenharmony_ci ffrt_this_task_set_legacy_mode(false); 771484543d1Sopenharmony_ci }, {}, {}); 772484543d1Sopenharmony_ci usleep(1000); 773484543d1Sopenharmony_ci EXPECT_EQ(0, result); 774484543d1Sopenharmony_ci}