• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <thread>
17 #include <chrono>
18 #include <gtest/gtest.h>
19 #include "ffrt_inner.h"
20 #include "c/loop.h"
21 #include "c/ffrt_ipc.h"
22 #define private public
23 #define protected public
24 #include "sync/poller.h"
25 #include "tm/cpu_task.h"
26 #include "tm/scpu_task.h"
27 #undef private
28 #undef protected
29 #include "util.h"
30 #include "../common.h"
31 
32 using namespace std;
33 using namespace ffrt;
34 using namespace testing;
35 #ifdef HWTEST_TESTING_EXT_ENABLE
36 using namespace testing::ext;
37 #endif
38 
39 class PollerTest : public testing::Test {
40 protected:
SetUpTestCase()41     static void SetUpTestCase()
42     {
43     }
44 
TearDownTestCase()45     static void TearDownTestCase()
46     {
47     }
48 
SetUp()49     void SetUp() override
50     {
51     }
52 
TearDown()53     void TearDown() override
54     {
55     }
56 };
57 
Testfun(void * data)58 static void Testfun(void* data)
59 {
60     int* testData = static_cast<int*>(data);
61     *testData += 1;
62     printf("%d, timeout callback\n", *testData);
63 }
64 static void (*g_cb)(void*) = Testfun;
65 
66 /*
67  * 测试用例名称:poll_once_batch_timeout
68  * 测试用例描述:PollOnce批量超时测试
69  * 预置条件    :无
70  * 操作步骤    :1、调用注册接口
71                 2、单次调用PollOnce
72  * 预期结果    :1、超时任务全部从队列中清除
73                 2、当实际超时时间很长,但是传入超时时间很短,应该按传入时间执行
74  */
75 HWTEST_F(PollerTest, poll_once_batch_timeout, TestSize.Level0)
76 {
77     Poller poller;
78     // 1、组装timeMap_
79     static int result0 = 0;
80     int* xf = &result0;
81     void* data = xf;
82     uint64_t timeout = 10;
83     uint64_t timeout1 = 11;
84     uint64_t timeout2 = 12;
85     uint64_t sleepTime = 25000;
86     poller.RegisterTimer(timeout, data, g_cb, false);
87     poller.RegisterTimer(timeout1, data, g_cb, false);
88     poller.RegisterTimer(timeout2, data, g_cb, false);
89     // 调用PollOnce,预计timerMap_为空,全部清除
90     usleep(sleepTime);
91     poller.PollOnce(1);
92     EXPECT_EQ(true, poller.DetermineEmptyMap());
93 
94     uint64_t timeout3 = 10000;
95     uint64_t timeout4 = 100;
96     int loopNum = 2;
97     poller.RegisterTimer(timeout3, data, g_cb, false);
98     TimePoint start = std::chrono::steady_clock::now();
99     for (int i = 0; i < loopNum; ++i) {
100         poller.PollOnce(timeout4);
101     }
102     TimePoint end = std::chrono::steady_clock::now();
103     int m = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
104     // 预计等待时间为100,可能有几毫秒的误差
105     EXPECT_EQ(true, m >= timeout4 && m < timeout3);
106 }
107 
108 /*
109  * 测试用例名称:poll_once_batch_timeout
110  * 测试用例描述:PollOnce批量超时测试
111  * 预置条件    :无
112  * 操作步骤    :1、调用注册接口,注册repeat为true的timer
113                 2、创建两个线程,并发PollerOnce和Unregister
114  * 预期结果    :1、任务全部从队列中清除
115  */
116 HWTEST_F(PollerTest, unregister_timer_001, TestSize.Level0)
117 {
118     Poller poller;
119     // 1、组装timeMap_
120     static int result0 = 0;
121     int* xf = &result0;
122     void* data = xf;
123     uint64_t timeout = 1;
124     uint64_t sleepTime = 2500;
125     int maxIter = 100;
126     // 2、 创建两个线程,并发PollerOnce和Unregister
127     for (int i = 0; i < maxIter; i++) {
128         int timerHandle = poller.RegisterTimer(timeout, data, g_cb, true);
129         EXPECT_FALSE(poller.timerMap_.empty());
130         auto boundPollonce = std::bind(&Poller::PollOnce, &poller, timeout);
131         auto boundUnregister = std::bind(&Poller::UnregisterTimer, &poller, timerHandle);
132         usleep(sleepTime);
133         std::thread thread1(boundPollonce);
134         std::thread thread2(boundUnregister);
135         thread1.join();
136         thread2.join();
137         EXPECT_TRUE(poller.timerMap_.empty());
138         EXPECT_TRUE(poller.executedHandle_.empty());
139         poller.timerMap_.clear();
140         poller.executedHandle_.clear();
141     }
142 }
143 
144 std::mutex g_mutexRegister;
145 std::condition_variable g_cvRegister;
146 
WaitCallback(void * data)147 void WaitCallback(void* data)
148 {
149     auto dependency = reinterpret_cast<std::atomic<int>*>(data);
150     while (*dependency != 1) {
151         std::this_thread::yield();
152     }
153 }
154 
EmptyCallback(void * data)155 void EmptyCallback(void* data) {}
156 
157 /*
158  * 测试用例名称:multi_timer_dependency
159  * 测试用例描述:poller批量超时回调依赖测试
160  * 预置条件    :构造三个超时时间相同的timer,回调A依赖回调B执行完成,回调B依赖timer C取消成功,三者并发
161  * 操作步骤    :1、调用PollOnce接口
162  * 预期结果    :1、三个回调执行完成,没有卡死现象
163  */
164 HWTEST_F(PollerTest, multi_timer_dependency, TestSize.Level0)
165 {
166     // dependency can be accessed by multiple threads:
167     // the polling and the updating thread. Hence,
168     // it must be defined as atomic in order to
169     // prevent data-race
170     std::atomic<int> dependency = 0;
__anonbe7a08cf0102null171     ffrt::task_handle handle = ffrt::submit_h([&] {
172         std::unique_lock lk(g_mutexRegister);
173         g_cvRegister.wait(lk);
174         dependency = 1;
175     });
176 
177     TimePoint timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(100);
178     TimerDataWithCb data(&dependency, WaitCallback, nullptr, false, 100);
179     data.handle = 0;
180 
181     Poller poller;
182     poller.timerMap_.emplace(timeout, data);
183 
184     data.handle++;
185     data.cb = EmptyCallback;
186     poller.timerMap_.emplace(timeout, data);
187 
__anonbe7a08cf0202null188     std::thread th1([&] { poller.PollOnce(-1); });
__anonbe7a08cf0302null189     std::thread th2([&] {
190         usleep(100 * 1000);
191         poller.UnregisterTimer(1);
192         g_cvRegister.notify_all();
193     });
194 
195     th1.join();
196     th2.join();
197     ffrt::wait({handle});
198 }
199 
200 /*
201  * 测试用例名称:multi_timer_dependency_unregister_self
202  * 测试用例描述:poller批量超时回调,解注册自身依赖测试
203  * 预置条件    :构造两个超时时间相同的timer,回调A依赖回调B执行完成,回调B依赖另一个线程的timer A取消成功,三者并发
204  * 操作步骤    :调用PollOnce接口
205  * 预期结果    :三个回调执行完成,没有卡死现象
206  */
207 HWTEST_F(PollerTest, multi_timer_dependency_unregister_self, TestSize.Level0)
208 {
209     // dependency can be accessed by multiple threads:
210     // the polling and the updating thread. Hence,
211     // it must be defined as atomic in order to
212     // prevent data-race
213     std::atomic<int> dependency = 0;
214 
215     TimePoint timeout = std::chrono::steady_clock::now() + std::chrono::milliseconds(100);
216     TimerDataWithCb data(&dependency, WaitCallback, nullptr, false, 100);
217     data.handle = 0;
218 
219     Poller poller;
220     poller.timerMap_.emplace(timeout, data);
221 
222     data.handle++;
223     data.cb = EmptyCallback;
224     poller.timerMap_.emplace(timeout, data);
225 
__anonbe7a08cf0402null226     ffrt::task_handle handle = ffrt::submit_h([&] {
227         std::unique_lock lk(g_mutexRegister);
228         g_cvRegister.wait(lk);
229         poller.IsTimerReady();
230         dependency = 1;
231     });
232 
__anonbe7a08cf0502null233     std::thread th1([&] { poller.PollOnce(-1); });
__anonbe7a08cf0602null234     std::thread th2([&] {
235         usleep(100 * 1000);
236         g_cvRegister.notify_all();
237         poller.UnregisterTimer(0);
238     });
239 
240     th1.join();
241     th2.join();
242     ffrt::wait({handle});
243 }
244 
245 /*
246  * 测试用例名称 : fetch_cached_event_unmask DoTaskFdAdd
247  * 测试用例描述 : 遍历本地events缓存,并提出缓存event
248  * 预置条件     : 无
249  * 操作步骤     :
250  * 预期结果     :
251  */
252 HWTEST_F(PollerTest, TestCacheDelFd001, TestSize.Level0)
253 {
254     Poller poller;
255     CPUEUTask* currTask = static_cast<CPUEUTask*>(malloc(sizeof(CPUEUTask)));
256     int fd = 1001;
257     int fd1 = 1002;
258     poller.CacheDelFd(fd, currTask);
259     poller.CacheDelFd(fd1, currTask);
260     std::unique_ptr<struct WakeDataWithCb> maskWakeData = std::make_unique<WakeDataWithCb>(fd, nullptr,
261         nullptr, currTask);
262     std::unique_ptr<struct WakeDataWithCb> maskWakeData1 = std::make_unique<WakeDataWithCb>(fd1, nullptr,
263         nullptr, currTask);
264     poller.CacheMaskWakeData(currTask, maskWakeData);
265     poller.CacheMaskWakeData(currTask, maskWakeData1);
266 
267     EXPECT_EQ(2, poller.m_delFdCacheMap.size());
268     EXPECT_EQ(1, poller.m_maskWakeDataWithCbMap.size());
269     EXPECT_EQ(2, poller.m_maskWakeDataWithCbMap[currTask].size());
270 
271     poller.ClearMaskWakeDataWithCbCacheWithFd(currTask, fd);
272     EXPECT_EQ(2, poller.m_delFdCacheMap.size());
273     EXPECT_EQ(1, poller.m_maskWakeDataWithCbMap.size());
274     EXPECT_EQ(1, poller.m_maskWakeDataWithCbMap[currTask].size());
275 
276     poller.ClearMaskWakeDataWithCbCacheWithFd(currTask, fd1);
277     EXPECT_EQ(2, poller.m_delFdCacheMap.size());
278     EXPECT_EQ(0, poller.m_maskWakeDataWithCbMap.size());
279     EXPECT_EQ(0, poller.m_maskWakeDataWithCbMap[currTask].size());
280 
281     free(currTask);
282 }
283 
284 /*
285  * 测试用例名称 : fetch_cached_event_unmask DoTaskFdAdd
286  * 测试用例描述 : 遍历本地events缓存,并提出缓存event
287  * 预置条件     : 无
288  * 操作步骤     :
289  * 预期结果     :
290  */
291 HWTEST_F(PollerTest, TestCacheDelFd002, TestSize.Level0)
292 {
293     Poller poller;
294     CPUEUTask* currTask = static_cast<CPUEUTask*>(malloc(sizeof(CPUEUTask)));
295     int fd = 1001;
296     int fd1 = 1002;
297     poller.m_delFdCacheMap.emplace(fd, currTask);
298     poller.m_delFdCacheMap.emplace(fd1, currTask);
299     std::unique_ptr<struct WakeDataWithCb> maskWakeData = std::make_unique<WakeDataWithCb>(fd, nullptr,
300         nullptr, currTask);
301     std::unique_ptr<struct WakeDataWithCb> maskWakeData1 = std::make_unique<WakeDataWithCb>(fd1, nullptr,
302         nullptr, currTask);
303     poller.m_maskWakeDataWithCbMap[currTask].emplace_back(std::move(maskWakeData));
304     poller.m_maskWakeDataWithCbMap[currTask].emplace_back(std::move(maskWakeData1));
305 
306     EXPECT_EQ(2, poller.m_delFdCacheMap.size());
307     EXPECT_EQ(1, poller.m_maskWakeDataWithCbMap.size());
308     EXPECT_EQ(2, poller.m_maskWakeDataWithCbMap[currTask].size());
309 
310     poller.ClearMaskWakeDataWithCbCache(currTask);
311 
312     EXPECT_EQ(0, poller.m_delFdCacheMap.size());
313     EXPECT_EQ(0, poller.m_maskWakeDataWithCbMap.size());
314     EXPECT_EQ(0, poller.m_maskWakeDataWithCbMap[currTask].size());
315 
316     free(currTask);
317 }
318 
319 /*
320  * 测试用例名称 : fetch_cached_event_unmask DoTaskFdAdd
321  * 测试用例描述 : 遍历本地events缓存,并提出缓存event
322  * 预置条件     : 无
323  * 操作步骤     :
324  * 预期结果     :
325  */
326 HWTEST_F(PollerTest, TestCacheDelFd003, TestSize.Level0)
327 {
328     Poller poller;
329     CPUEUTask* currTask = static_cast<CPUEUTask*>(malloc(sizeof(CPUEUTask)));
330     int fd = 1001;
331     int fd1 = 1002;
332     poller.m_delFdCacheMap.emplace(fd, currTask);
333     poller.m_delFdCacheMap.emplace(fd1, currTask);
334     std::unique_ptr<struct WakeDataWithCb> maskWakeData = std::make_unique<WakeDataWithCb>(fd, nullptr,
335         nullptr, currTask);
336     std::unique_ptr<struct WakeDataWithCb> maskWakeData1 = std::make_unique<WakeDataWithCb>(fd1, nullptr,
337         nullptr, currTask);
338     poller.m_maskWakeDataWithCbMap[currTask].emplace_back(std::move(maskWakeData));
339     poller.m_maskWakeDataWithCbMap[currTask].emplace_back(std::move(maskWakeData1));
340 
341     EXPECT_EQ(2, poller.m_delFdCacheMap.size());
342     EXPECT_EQ(1, poller.m_maskWakeDataWithCbMap.size());
343     EXPECT_EQ(2, poller.m_maskWakeDataWithCbMap[currTask].size());
344 
345     poller.ClearDelFdCache(fd);
346     EXPECT_EQ(1, poller.m_delFdCacheMap.size());
347     EXPECT_EQ(1, poller.m_maskWakeDataWithCbMap.size());
348     EXPECT_EQ(1, poller.m_maskWakeDataWithCbMap[currTask].size());
349 
350     poller.ClearDelFdCache(fd1);
351     EXPECT_EQ(0, poller.m_delFdCacheMap.size());
352     EXPECT_EQ(0, poller.m_maskWakeDataWithCbMap.size());
353     EXPECT_EQ(0, poller.m_maskWakeDataWithCbMap[currTask].size());
354 
355     free(currTask);
356 }
357 
358 HWTEST_F(PollerTest, GetTaskWaitTime, TestSize.Level0)
359 {
360     Poller poller;
361     SCPUEUTask task(nullptr, nullptr, 0);
362     poller.m_waitTaskMap[&task] = SyncData();
363     poller.m_waitTaskMap[&task].waitTP = std::chrono::steady_clock::now();
364     EXPECT_EQ(poller.GetTaskWaitTime(nullptr), 0);
365     EXPECT_GT(poller.GetTaskWaitTime(&task), 0);
366 }
367 
368 HWTEST_F(PollerTest, WaitFdEventTest, TestSize.Level1)
369 {
370     Poller poller;
__anonbe7a08cf0702null371     std::thread th([&] { poller.PollOnce(30000); });
372 
373     uint64_t expected = 0x3;
374     int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
375     int op = EPOLL_CTL_ADD;
376     ffrt_qos_t qos = ffrt_qos_user_initiated;
377 
__anonbe7a08cf0802() 378     ffrt::submit([&]() {
379         int ret = poller.AddFdEvent(op, EPOLLIN, testFd, nullptr, nullptr);
380         EXPECT_EQ(ret, 0);
381         // sleep to wait event
382         ffrt_usleep(50000);
383         // get fds
384         struct epoll_event events[1024];
385         int nfds = poller.WaitFdEvent(events, 1024, -1);
386         EXPECT_EQ(nfds, 1);
387         ret = poller.DelFdEvent(testFd);
388         EXPECT_EQ(ret, 0);
389         // read vaule from fd and check
390         uint64_t value = 0;
391         ssize_t n = read(testFd, &value, sizeof(uint64_t));
392         EXPECT_EQ(n, sizeof(value));
393         EXPECT_EQ(value, expected);
394         close(testFd);
395     }, {}, {}, ffrt::task_attr().qos(ffrt_qos_user_initiated));
396 
397     stall_us(200);
398     uint64_t u1 = 1;
399     ssize_t n = write(testFd, &u1, sizeof(uint64_t));
400     uint64_t u2 = 2;
401     n = write(testFd, &u2, sizeof(uint64_t));
402     EXPECT_EQ(n, sizeof(uint64_t));
403     ffrt::wait();
404     th.detach();
405 }
406 
407 HWTEST_F(PollerTest, WaitFdEventTestLegacyMode, TestSize.Level1)
408 {
409     Poller poller;
__anonbe7a08cf0b02null410     std::thread th([&] { poller.PollOnce(30000); });
411 
412     uint64_t expected = 0x3;
413     int testFd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
414     int op = EPOLL_CTL_ADD;
415     ffrt_qos_t qos = ffrt_qos_user_initiated;
416 
__anonbe7a08cf0c02() 417     ffrt::submit([&]() {
418         ffrt_this_task_set_legacy_mode(true);
419         int ret = poller.AddFdEvent(op, EPOLLIN, testFd, nullptr, nullptr);
420         EXPECT_EQ(ret, 0);
421         // sleep to wait event
422         ffrt_usleep(50000);
423         // get fds
424         struct epoll_event events[1024];
425         int nfds = poller.WaitFdEvent(events, 1024, -1);
426         EXPECT_EQ(nfds, 1);
427         ret = poller.DelFdEvent(testFd);
428         EXPECT_EQ(ret, 0);
429         // read vaule from fd and check
430         uint64_t value = 0;
431         ssize_t n = read(testFd, &value, sizeof(uint64_t));
432         EXPECT_EQ(n, sizeof(value));
433         EXPECT_EQ(value, expected);
434         close(testFd);
435         ffrt_this_task_set_legacy_mode(false);
436     }, {}, {}, ffrt::task_attr().qos(ffrt_qos_user_initiated));
437 
438     stall_us(200);
439     uint64_t u1 = 1;
440     ssize_t n = write(testFd, &u1, sizeof(uint64_t));
441     uint64_t u2 = 2;
442     n = write(testFd, &u2, sizeof(uint64_t));
443     EXPECT_EQ(n, sizeof(uint64_t));
444     ffrt::wait();
445     th.detach();
446 }
447 
448 HWTEST_F(PollerTest, ProcessTimerDataCb, TestSize.Level1)
449 {
450     Poller poller;
451     SCPUEUTask task(nullptr, nullptr, 0);
452     task.blockType = BlockType::BLOCK_THREAD;
453     poller.m_waitTaskMap[&task] = SyncData();
454     EXPECT_EQ(poller.m_waitTaskMap.size(), 1);
455 
456     poller.ProcessTimerDataCb(nullptr);
457     EXPECT_EQ(poller.m_waitTaskMap.size(), 1);
458     poller.ProcessTimerDataCb(&task);
459     EXPECT_EQ(poller.m_waitTaskMap.size(), 0);
460 }
461 
462 HWTEST_F(PollerTest, WakeSyncTask, TestSize.Level1)
463 {
464     Poller poller;
465     SCPUEUTask task(nullptr, nullptr, 0);
466     task.blockType = BlockType::BLOCK_THREAD;
467     EventVec eventVec(1);
468     std::unordered_map<CoTask*, EventVec> syncTaskEvents = { { &task, eventVec } };
469 
470     int nfds = 0;
471     struct epoll_event event;
472     poller.m_waitTaskMap[&task] = SyncData(nullptr, 1024, nullptr, std::chrono::steady_clock::now());
473     poller.WakeSyncTask(syncTaskEvents);
474     poller.m_waitTaskMap[&task] = SyncData(&event, 1024, nullptr, std::chrono::steady_clock::now());
475     poller.WakeSyncTask(syncTaskEvents);
476     poller.m_waitTaskMap[&task] = SyncData(&event, 1024, &nfds, std::chrono::steady_clock::now());
477     poller.m_waitTaskMap[&task].timerHandle = 0;
478     poller.m_waitTaskMap[&task] = SyncData(&event, 1024, &nfds, std::chrono::steady_clock::now());
479     poller.WakeSyncTask(syncTaskEvents);
480     EXPECT_EQ(nfds, 1);
481 }
482 
483 HWTEST_F(PollerTest, ClearMaskWakeData, TestSize.Level1)
484 {
485     Poller poller;
486     SCPUEUTask task(nullptr, nullptr, 0);
487     task.blockType = BlockType::BLOCK_THREAD;
488 
489     std::unique_ptr<WakeDataWithCb> wakeData = std::make_unique<WakeDataWithCb>(0, nullptr, nullptr, nullptr);
490     poller.m_maskWakeDataWithCbMap[&task].emplace_back(std::move(wakeData));
491     poller.CacheMaskFdAndEpollDel(0, nullptr);
492     poller.ClearMaskWakeDataWithCbCacheWithFd(nullptr, 0);
493     EXPECT_EQ(poller.m_delFdCacheMap.size(), 0);
494 
495     poller.CacheMaskFdAndEpollDel(0, &task);
496     poller.ClearMaskWakeDataWithCbCacheWithFd(&task, 0);
497     EXPECT_EQ(poller.m_delFdCacheMap.size(), 1);
498     EXPECT_EQ(poller.m_delFdCacheMap[0], &task);
499 
500     poller.ClearDelFdCache(0);
501     EXPECT_EQ(poller.m_delFdCacheMap.size(), 0);
502 }
503 
504 HWTEST_F(PollerTest, ReleaseFdWakeData, TestSize.Level1)
505 {
506     Poller poller;
507     for (int i = 0; i < 3; i++) {
508         poller.m_delCntMap[i] = i;
509         std::unique_ptr<WakeDataWithCb> wakeData = std::make_unique<WakeDataWithCb>(0, nullptr, nullptr, nullptr);
510         std::unique_ptr<WakeDataWithCb> wakeData2 = std::make_unique<WakeDataWithCb>(0, nullptr, nullptr, nullptr);
511         poller.m_wakeDataMap[i].emplace_back(std::move(wakeData));
512         poller.m_wakeDataMap[i].emplace_back(std::move(wakeData2));
513     }
514 
515     poller.ReleaseFdWakeData();
516     EXPECT_EQ(poller.m_delCntMap[0], 0);
517     EXPECT_EQ(poller.m_delCntMap[1], 1);
518     EXPECT_EQ(poller.m_delCntMap.size(), 2);
519 }
520 
521 HWTEST_F(PollerTest, DeterminePollerReady, TestSize.Level1)
522 {
523     Poller poller;
524     EXPECT_FALSE(poller.DeterminePollerReady());
525     auto timePoint = std::chrono::steady_clock::now() + std::chrono::minutes(3);
526     poller.timerMap_.emplace(timePoint, TimerDataWithCb());
527     EXPECT_FALSE(poller.DeterminePollerReady());
528     poller.fdEmpty_ = false;
529     EXPECT_TRUE(poller.DeterminePollerReady());
530 }
531 
532 HWTEST_F(PollerTest, GetTimerStatus, TestSize.Level1)
533 {
534     Poller poller;
535     TimerDataWithCb data;
536     data.handle = 1;
537     poller.timerMap_.emplace(std::chrono::steady_clock::now(), data);
538     poller.executedHandle_[2] = TimerStatus::EXECUTED;
539     EXPECT_EQ(poller.GetTimerStatus(0), ffrt_timer_notfound);
540     EXPECT_EQ(poller.GetTimerStatus(1), ffrt_timer_not_executed);
541     EXPECT_EQ(poller.GetTimerStatus(2), ffrt_timer_executed);
542 
543     poller.flag_ = EpollStatus::TEARDOWN;
544     EXPECT_EQ(poller.RegisterTimer(0, nullptr, nullptr, false), -1);
545     EXPECT_EQ(poller.UnregisterTimer(0), -1);
546     EXPECT_EQ(poller.GetTimerStatus(0), ffrt_timer_notfound);
547 }
548 
549 HWTEST_F(PollerTest, FetchCachedEventAndDoUnmask, TestSize.Level1)
550 {
551     Poller poller;
552     EventVec eventVec;
553     epoll_event events[1024];
554     for (int i = 0; i < 3; i++) {
555         epoll_event event;
556         event.data.fd = i / 2;
557         eventVec.push_back(event);
558     }
559     std::unique_ptr<WakeDataWithCb> wakeData = std::make_unique<WakeDataWithCb>(0, nullptr, nullptr, nullptr);
560     poller.m_wakeDataMap[0].emplace_back(std::move(wakeData));
561     poller.m_delFdCacheMap[0] = nullptr;
562     EXPECT_EQ(poller.FetchCachedEventAndDoUnmask(eventVec, events), 2);
563 }
564 
565 HWTEST_F(PollerTest, DelFdEvent, TestSize.Level1)
566 {
567     Poller poller;
568     EXPECT_EQ(poller.DelFdEvent(0), -1);
569 
570     std::unique_ptr<WakeDataWithCb> wakeData = std::make_unique<WakeDataWithCb>(0, nullptr, nullptr, nullptr);
571     poller.m_wakeDataMap[0].emplace_back(std::move(wakeData));
572     poller.m_delCntMap[0] = 1;
573     EXPECT_EQ(poller.DelFdEvent(0), -1);
574     CPUEUTask* currTask = static_cast<CPUEUTask*>(malloc(sizeof(CPUEUTask)));
575     poller.ClearCachedEvents(currTask);
576 }
577 
578 HWTEST_F(PollerTest, Qos_Test, TestSize.Level1)
579 {
580     ffrt_qos_t qos = qos_default;
581     ffrt::QoS ffrtQos;
582     ffrt::SetFuncQosMap(nullptr);
583     ffrt_poller_wakeup(qos);
584     int ret = ffrt_epoll_get_count(qos);
585     EXPECT_EQ(ret, 0);
586     ffrt::SetFuncQosMap(ffrt::QoSMap);
587 }