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}