1 /*
2  * Copyright (c) 2021-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 <cstdint>
17 #include <gtest/gtest.h>
18 
19 #include <chrono>
20 #include <thread>
21 
22 #include <fcntl.h>
23 #include <sys/resource.h>
24 #include <sys/stat.h>
25 #include <sys/time.h>
26 #include <sys/types.h>
27 #include <unistd.h>
28 
29 #include "errors.h"
30 #include "event_handler.h"
31 #include "event_queue.h"
32 #include "event_queue_base.h"
33 #include "event_runner.h"
34 #include "inner_event.h"
35 #include "event_queue_ffrt.h"
36 
37 using namespace testing::ext;
38 using namespace OHOS;
39 using namespace OHOS::AppExecFwk;
40 
41 namespace {
42 const size_t MAX_PRIORITY_NUM = 5;
43 const size_t MAX_HIGH_PRIORITY_COUNT = 5;
44 const uint32_t NUM = 2;
45 const uint32_t HIGH_PRIORITY_COUNT = 12;
46 const uint32_t LOW_PRIORITY_COUNT = 2;
47 const uint32_t IMMEDIATE_PRIORITY_COUNT = 72;
48 const int64_t DELAY_TIME = 100;
49 const int64_t REMOVE_DELAY_TIME = 10;
50 const int64_t HAS_DELAY_TIME = 10;
51 const int64_t REMOVE_WAIT_TIME = 20000;
52 const uint32_t REMOVE_EVENT_ID = 0;
53 const uint32_t HAS_EVENT_ID = 100;
54 const int64_t HAS_EVENT_PARAM = 1000;
55 const uint32_t INSERT_DELAY = 10;
56 bool isDump = false;
57 
58 std::atomic<bool> eventRan(false);
59 }  // namespace
60 
61 class DumpTest : public Dumper {
62 public:
63     /**
64      * Processes the content of a specified string.
65      * @param message the content of a specified string.
66      */
Dump(const std::string & message)67     void Dump(const std::string &message)
68     {
69         isDump = true;
70         GTEST_LOG_(INFO) << message;
71     }
72 
73     /**
74      * Obtains the tag information.
75      * which is a prefix added to each string before the string content is processed.
76      * @return the tag information.
77      */
GetTag()78     std::string GetTag()
79     {
80         return "DumpTest";
81     }
82 };
83 
84 /**
85  * Init FileDescriptor.
86  *
87  * @param fds[] pipe need.
88  * @return Returns fileDescriptor we get.
89  */
InitFileDescriptor(int32_t fds[])90 static int32_t InitFileDescriptor(int32_t fds[])
91 {
92     auto result = pipe(fds);
93     EXPECT_GE(result, 0);
94 
95     int32_t fileDescriptor = fds[0];
96     return fileDescriptor;
97 }
98 
99 /**
100  * get event from queue and compare.
101  *
102  * @param eventId of the event we want to get.
103  * @param queue we get event from this queue.
104  */
GetEventAndCompare(uint32_t eventId,EventQueue & queue)105 static void GetEventAndCompare(uint32_t eventId, EventQueue &queue)
106 {
107     auto event = queue.GetEvent();
108     EXPECT_NE(nullptr, event);
109     if (event != nullptr) {
110         auto id = event->GetInnerEventId();
111         EXPECT_EQ(eventId, id);
112     }
113 }
114 
115 /**
116  * set event handler time delay.
117  *
118  * @param delayTime of the event handle time.
119  */
DelayTest(uint8_t delayTime)120 static void DelayTest(uint8_t delayTime)
121 {
122     const uint8_t longDelta = 20;
123     const uint8_t shortDelta = 5;
124     uint32_t eventId = 0;
125     uint8_t maxDelta = shortDelta;
126     if (delayTime > 0) {
127         maxDelta = longDelta;
128     }
129 
130     EventQueueBase queue;
131     queue.Prepare();
132     auto event = InnerEvent::Get(eventId);
133     auto now = InnerEvent::Clock::now();
134     // delay event handle time delayTime ms
135     auto handleTime = now + std::chrono::milliseconds(static_cast<int64_t>(delayTime));
136     event->SetSendTime(now);
137     event->SetHandleTime(handleTime);
138     queue.Insert(event);
139     event = queue.GetEvent();
140     // block until get event from queue after delay time
141     now = InnerEvent::Clock::now();
142     EXPECT_GE(now, handleTime);
143     // check if delay time is within acceptable error
144     auto errorTime = handleTime + std::chrono::milliseconds(static_cast<int64_t>(maxDelta));
145     EXPECT_LE(now, errorTime);
146     EXPECT_NE(event, nullptr);
147     if (event != nullptr) {
148         auto id = event->GetInnerEventId();
149         EXPECT_EQ(eventId, id);
150     }
151 }
152 
153 /**
154  * Insert event and get event from queue.
155  *
156  * @param priorities[] prioritiesof event.
157  * @param priorityCount count of event we insert.
158  */
InsertPriorityTest(const EventQueue::Priority priorities[],size_t priorityCount)159 static void InsertPriorityTest(const EventQueue::Priority priorities[], size_t priorityCount)
160 {
161     std::list<uint32_t> eventIds;
162     auto now = InnerEvent::Clock::now();
163     EventQueueBase queue;
164     queue.Prepare();
165     uint32_t eventId = 0;
166 
167     // insert event into queue from IDLE priority to IMMEDIATE priority
168     for (size_t i = 0; i < priorityCount; ++i) {
169         eventIds.push_back(eventId);
170         auto event = InnerEvent::Get(eventId);
171         event->SetSendTime(now);
172         event->SetHandleTime(now);
173         queue.Insert(event, priorities[i]);
174         ++eventId;
175     }
176 
177     // get event from queue and check eventId
178     for (size_t i = 0; i < priorityCount; ++i) {
179         auto event = queue.GetEvent();
180         EXPECT_NE(nullptr, event);
181         if (event == nullptr) {
182             break;
183         }
184 
185         if (priorities[0] == EventQueue::Priority::IDLE) {
186             auto storeId = eventIds.back();
187             auto id = event->GetInnerEventId();
188             EXPECT_EQ(storeId, id);
189             eventIds.pop_back();
190         } else {
191             auto storeId = eventIds.front();
192             auto id = event->GetInnerEventId();
193             EXPECT_EQ(storeId, id);
194             eventIds.pop_front();
195         }
196     }
197 }
198 
199 /**
200  * Break event queue.
201  *
202  * @param queue we get break.
203  * @param eventId eventId of event we insert.
204  */
BreakQueueTest(EventQueue & queue,uint32_t eventId)205 static void BreakQueueTest(EventQueue &queue, uint32_t eventId)
206 {
207     auto event = queue.GetEvent();
208     EXPECT_NE(nullptr, event);
209     if (event != nullptr) {
210         auto id = event->GetInnerEventId();
211         EXPECT_EQ(eventId, id);
212         queue.Finish();
213         queue.Insert(event);
214         event = queue.GetEvent();
215         EXPECT_EQ(nullptr, event);
216     }
217 }
218 
219 /**
220  * Insert event into queue and get event.
221  *
222  * @param queue we get event from this queue.
223  * @param event event we insert into queue.
224  */
InsertAndGet(EventQueue & queue,InnerEvent::Pointer & event)225 static void InsertAndGet(EventQueue &queue, InnerEvent::Pointer &event)
226 {
227     // insert event before prepare queue
228     queue.Insert(event);
229     event = queue.GetEvent();
230     EXPECT_EQ(nullptr, event);
231     if (event != nullptr) {
232         // If event is not nullptr, the queue must be empty, so need to insert it again.
233         queue.Insert(event);
234     }
235 }
236 
237 /**
238  * Insert event and get event from queue.
239  *
240  * @param queue we insert event into this queue.
241  * @param length length of events.
242  */
InsertPriorityEvent(EventQueue & queue,size_t length)243 static void InsertPriorityEvent(EventQueue &queue, size_t length)
244 {
245     // insert two low priority events
246     for (uint32_t eventId = 0; eventId < NUM; eventId++) {
247         auto event = InnerEvent::Get(eventId);
248         auto now = InnerEvent::Clock::now();
249         event->SetSendTime(now);
250         event->SetHandleTime(now);
251         queue.Insert(event, EventQueue::Priority::LOW);
252     }
253 
254     // avoid time accuracy problem
255     usleep(INSERT_DELAY);
256 
257     // insert MAX_HIGH_PRIORITY_COUNT high priority events
258     for (uint32_t eventId = NUM; eventId < NUM * length + NUM; eventId++) {
259         auto event = InnerEvent::Get(eventId);
260         auto now = InnerEvent::Clock::now();
261         event->SetSendTime(now);
262         event->SetHandleTime(now);
263         queue.Insert(event, EventQueue::Priority::HIGH);
264     }
265 }
266 
267 /**
268  * Insert all priority event and get event from queue.
269  *
270  * @param queue we insert event into this queue.
271  */
InsertAllPriorityEvent(EventQueue & queue)272 static void InsertAllPriorityEvent(EventQueue &queue)
273 {
274     // insert low priority events
275     for (uint32_t eventId = 0; eventId < LOW_PRIORITY_COUNT; eventId++) {
276         auto event = InnerEvent::Get(eventId);
277         auto now = InnerEvent::Clock::now();
278         event->SetSendTime(now);
279         event->SetHandleTime(now);
280         queue.Insert(event, EventQueue::Priority::LOW);
281     }
282 
283     // avoid time accuracy problem
284     usleep(INSERT_DELAY);
285 
286     // insert high priority events
287     for (uint32_t eventId = LOW_PRIORITY_COUNT; eventId < HIGH_PRIORITY_COUNT; eventId++) {
288         auto event = InnerEvent::Get(eventId);
289         auto now = InnerEvent::Clock::now();
290         event->SetSendTime(now);
291         event->SetHandleTime(now);
292         queue.Insert(event, EventQueue::Priority::HIGH);
293     }
294 
295     // avoid time accuracy problem
296     usleep(INSERT_DELAY);
297 
298     // insert immediate priority events
299     for (uint32_t eventId = HIGH_PRIORITY_COUNT; eventId < IMMEDIATE_PRIORITY_COUNT; eventId++) {
300         auto event = InnerEvent::Get(eventId);
301         auto now = InnerEvent::Clock::now();
302         event->SetSendTime(now);
303         event->SetHandleTime(now);
304         queue.Insert(event, EventQueue::Priority::IMMEDIATE);
305     }
306 }
307 
308 class LibEventHandlerEventQueueTest : public testing::Test {
309 public:
310     static void SetUpTestCase(void);
311     static void TearDownTestCase(void);
312     void SetUp();
313     void TearDown();
314 };
315 
SetUpTestCase(void)316 void LibEventHandlerEventQueueTest::SetUpTestCase(void)
317 {}
318 
TearDownTestCase(void)319 void LibEventHandlerEventQueueTest::TearDownTestCase(void)
320 {}
321 
SetUp(void)322 void LibEventHandlerEventQueueTest::SetUp(void)
323 {
324     /**
325      * @tc.setup: reset the eventRan value.
326      */
327     eventRan.store(false);
328 }
329 
TearDown(void)330 void LibEventHandlerEventQueueTest::TearDown(void)
331 {}
332 
333 class MyEventHandler : public EventHandler {
334 public:
MyEventHandler(const std::shared_ptr<EventRunner> & runner)335     explicit MyEventHandler(const std::shared_ptr<EventRunner> &runner) : EventHandler(runner)
336     {}
~MyEventHandler()337     ~MyEventHandler()
338     {}
339 
ProcessEvent(const InnerEvent::Pointer &)340     void ProcessEvent(const InnerEvent::Pointer &) override
341     {
342         eventRan.store(true);
343     }
344 
345     MyEventHandler(const MyEventHandler &) = delete;
346     MyEventHandler &operator=(const MyEventHandler &) = delete;
347     MyEventHandler(MyEventHandler &&) = delete;
348     MyEventHandler &operator=(MyEventHandler &&) = delete;
349 };
350 
351 class MyFileDescriptorListener : public FileDescriptorListener {
352 public:
MyFileDescriptorListener()353     MyFileDescriptorListener()
354     {}
~MyFileDescriptorListener()355     ~MyFileDescriptorListener()
356     {}
357 
358     /* @param int32_t fileDescriptor */
OnReadable(int32_t)359     void OnReadable(int32_t)
360     {}
361 
362     /* @param int32_t fileDescriptor */
OnWritable(int32_t)363     void OnWritable(int32_t)
364     {}
365 
366     /* @param int32_t fileDescriptor */
OnException(int32_t)367     void OnException(int32_t)
368     {}
369 
370     MyFileDescriptorListener(const MyFileDescriptorListener &) = delete;
371     MyFileDescriptorListener &operator=(const MyFileDescriptorListener &) = delete;
372     MyFileDescriptorListener(MyFileDescriptorListener &&) = delete;
373     MyFileDescriptorListener &operator=(MyFileDescriptorListener &&) = delete;
374 };
375 
376 /*
377  * @tc.name: WakeAndBreak001
378  * @tc.desc: check events inserted in queue when Prepare() and
379  *           Finish() are called in right order
380  * @tc.type: FUNC
381  */
382 HWTEST_F(LibEventHandlerEventQueueTest, WakeAndBreak001, TestSize.Level1)
383 {
384     /**
385      * @tc.setup: get event and queue.
386      */
387     EventQueueBase queue;
388     uint32_t eventId = 0;
389     auto event = InnerEvent::Get(eventId);
390 
391     /**
392      * @tc.steps: step1. prepare queue and inserted in queue when Prepare() and Finish() are called in right order.
393      * @tc.expected: step1. event and event id is valid when Prepare() and Finish() are called in right order.
394      */
395     queue.Prepare();
396     queue.Insert(event);
397     BreakQueueTest(queue, eventId);
398 }
399 
400 /*
401  * @tc.name: WakeAndBreak002
402  * @tc.desc: check events inserted in queue when queue is prepared
403  *           and broken in wrong order
404  * @tc.type: FUNC
405  */
406 HWTEST_F(LibEventHandlerEventQueueTest, WakeAndBreak002, TestSize.Level1)
407 {
408     /**
409      * @tc.setup: get event and queue.
410      */
411     EventQueueBase queue;
412     uint32_t eventId = 0;
413     auto event = InnerEvent::Get(eventId);
414 
415     /**
416      * @tc.steps: step1. prepare queue and inserted in queue when Prepare() and Finish() are called in wrong order.
417      * @tc.expected: step1. event and event id is invalid when Prepare() and Finish() are called in wrong order.
418      */
419     InsertAndGet(queue, event);
420     queue.Prepare();
421     BreakQueueTest(queue, eventId);
422 }
423 
424 /*
425  * @tc.name: WakeAndBreak003
426  * @tc.desc: check events inserted in queue when queue is broken
427  *           and prepared in wrong order
428  * @tc.type: FUNC
429  */
430 HWTEST_F(LibEventHandlerEventQueueTest, WakeAndBreak003, TestSize.Level1)
431 {
432     /**
433      * @tc.setup: get event and queue.
434      */
435     EventQueueBase queue;
436     uint32_t eventId = 0;
437     auto event = InnerEvent::Get(eventId);
438 
439     InsertAndGet(queue, event);
440 
441     /**
442      * @tc.steps: step1. get and check event Finish() is called in wrong order.
443      * @tc.expected: step1. event is null.
444      */
445     queue.Finish();
446     event = queue.GetEvent();
447     EXPECT_EQ(nullptr, event);
448     if (event != nullptr) {
449         // If event is not nullptr, the queue must be empty, so need to insert it again.
450         queue.Insert(event);
451     }
452 
453     /**
454      * @tc.steps: step2. prepare queue and get event from queue when Prepare() is called in right order.
455      * @tc.expected: step2. event and event id is invalid .
456      */
457     queue.Prepare();
458     GetEventAndCompare(eventId, queue);
459 }
460 
461 /*
462  * @tc.name: WakeAndBreak004
463  * @tc.desc: check events inserted in queue and get event by function GetExpiredEvent
464  * @tc.type: FUNC
465  */
466 HWTEST_F(LibEventHandlerEventQueueTest, WakeAndBreak004, TestSize.Level1)
467 {
468     /**
469      * @tc.setup: get event and queue.
470      */
471     EventQueueBase myQueue;
472     uint32_t eventId = 0;
473     auto event = InnerEvent::Get(eventId);
474     InsertAndGet(myQueue, event);
475 
476     /**
477      * @tc.steps: step1. get and check event Finish() is called in wrong order.
478      * @tc.expected: step1. event is null.
479      */
480     myQueue.Finish();
481     event = myQueue.GetEvent();
482     EXPECT_EQ(nullptr, event);
483     if (event != nullptr) {
484         // If event is not nullptr, the queue must be empty, so need to insert it again.
485         myQueue.Insert(event);
486     }
487 
488     /**
489      * @tc.steps: step2. prepare queue and get event from queue when Prepare() is called in right order.
490      * @tc.expected: step2. event and event id is invalid .
491      */
492     myQueue.Prepare();
493     InnerEvent::TimePoint nextWakeUpTime = InnerEvent::TimePoint::max();
494     auto resultEvent = myQueue.GetExpiredEvent(nextWakeUpTime);
495     EXPECT_NE(nullptr, resultEvent);
496     EXPECT_EQ(eventId, resultEvent->GetInnerEventId());
497 }
498 
499 /*
500  * @tc.name: InsertEvent001
501  * @tc.desc: insert() event of different priorities into Queue,
502  *           from IDLE to IMMEDIATE.
503  * @tc.type: FUNC
504  */
505 HWTEST_F(LibEventHandlerEventQueueTest, InsertEvent001, TestSize.Level1)
506 {
507     /**
508      * @tc.setup: init priority array, insert event with the order int the array.
509      */
510     const EventQueue::Priority priorities[MAX_PRIORITY_NUM] = {
511         EventQueue::Priority::IDLE,
512         EventQueue::Priority::LOW,
513         EventQueue::Priority::HIGH,
514         EventQueue::Priority::IMMEDIATE,
515         EventQueue::Priority::VIP,
516     };
517 
518     /**
519      * @tc.steps: step1. insert and get event, check whether the order of the event
520      *            we get from queue is the same as we expect.
521      * @tc.expected: step1. the order is the same as we expect.
522      */
523     InsertPriorityTest(priorities, MAX_PRIORITY_NUM);
524 }
525 
526 /*
527  * @tc.name: InsertEvent002
528  * @tc.desc: insert() event of different priorities into Queue,
529  *           from IMMEDIATE to IDLE
530  * @tc.type: FUNC
531  */
532 HWTEST_F(LibEventHandlerEventQueueTest, InsertEvent002, TestSize.Level1)
533 {
534     /**
535      * @tc.setup: init priority array, insert event with the order int the array.
536      */
537     const EventQueue::Priority priorities[MAX_PRIORITY_NUM] = {
538         EventQueue::Priority::VIP,
539         EventQueue::Priority::IMMEDIATE,
540         EventQueue::Priority::HIGH,
541         EventQueue::Priority::LOW,
542         EventQueue::Priority::IDLE,
543     };
544 
545     /**
546      * @tc.steps: step1. insert and get event, check whether the order of the event
547      *            we get from queue is the same as we expect.
548      * @tc.expected: step1. the order is the same as we expect.
549      */
550     InsertPriorityTest(priorities, MAX_PRIORITY_NUM);
551 }
552 
553 /*
554  * @tc.name: InsertEvent003
555  * @tc.desc: insert nullptr event and normal event into queue,
556  *           then get event from queue
557  * @tc.type: FUNC
558  */
559 HWTEST_F(LibEventHandlerEventQueueTest, InsertEvent003, TestSize.Level1)
560 {
561     /**
562      * @tc.setup: prepare queue. and insert event into queue, insert event with the order int the array.
563      */
564     uint32_t eventId = 0;
565     EventQueueBase queue;
566     queue.Prepare();
567 
568     /**
569      * @tc.steps: step1. insert nullptr event and insert normal event into queue, and get event from queue, check
570      *            whether the event we get from queue is valid as we expect.
571      * @tc.expected: step1. the event we get after we insert normal event into queue is valid.
572      */
573     auto event = InnerEvent::Pointer(nullptr, nullptr);
574     queue.Insert(event);
575     event = InnerEvent::Get(eventId);
576     queue.Insert(event);
577     GetEventAndCompare(eventId, queue);
578 }
579 
580 /*
581  * @tc.name: InsertEvent004
582  * @tc.desc: avoid starvation in queue when insert event of
583  *           different priorities into Queue
584  * @tc.type: FUNC
585  */
586 HWTEST_F(LibEventHandlerEventQueueTest, InsertEvent004, TestSize.Level1)
587 {
588     /**
589      * @tc.setup: prepare queue.
590      */
591     const uint32_t num = 3;
592     EventQueueBase queue;
593     queue.Prepare();
594 
595     /**
596      * @tc.steps: step1. first insert MAX_HIGH_PRIORITY_COUNT high priority events, then insert two low priority events.
597      */
598     for (uint32_t eventId = 0; eventId < MAX_HIGH_PRIORITY_COUNT + 1; eventId++) {
599         auto event = InnerEvent::Get(eventId);
600         auto now = InnerEvent::Clock::now();
601         event->SetSendTime(now);
602         event->SetHandleTime(now);
603         queue.Insert(event, EventQueue::Priority::HIGH);
604     }
605 
606     for (uint32_t eventId = MAX_HIGH_PRIORITY_COUNT + 1; eventId < MAX_HIGH_PRIORITY_COUNT + num; eventId++) {
607         auto event = InnerEvent::Get(eventId);
608         auto now = InnerEvent::Clock::now();
609         event->SetSendTime(now);
610         event->SetHandleTime(now);
611         queue.Insert(event, EventQueue::Priority::LOW);
612     }
613 
614     /**
615      * @tc.steps: step2. get event from queue one by one, and check whether the event id we get from queue is the
616      *            same as we expect.
617      * @tc.expected: step2. event id we get from queue is the same as we expect.
618      */
619     for (uint32_t eventId = 0; eventId < MAX_HIGH_PRIORITY_COUNT + num; eventId++) {
620         GetEventAndCompare(eventId, queue);
621     }
622 }
623 
624 /*
625  * @tc.name: InsertEvent005
626  * @tc.desc: avoid starvation in queue when insert event of different priorities into Queue.
627  * @tc.type: FUNC
628  */
629 HWTEST_F(LibEventHandlerEventQueueTest, InsertEvent005, TestSize.Level1)
630 {
631     /**
632      * @tc.setup: prepare queue.
633      */
634     EventQueueBase queue;
635     queue.Prepare();
636 
637     /**
638      * @tc.steps: step1. first insert two low priority events, insert MAX_HIGH_PRIORITY_COUNT high priority events.
639      */
640     InsertPriorityEvent(queue, MAX_HIGH_PRIORITY_COUNT);
641 
642     /**
643      * @tc.steps: step2. get MAX_HIGH_PRIORITY_COUNT events from queue, and compare the event id.
644      * @tc.expected: step2. event we get is high priority events.
645      */
646     for (uint32_t eventId = 2; eventId < MAX_HIGH_PRIORITY_COUNT + NUM; eventId++) {
647         GetEventAndCompare(eventId, queue);
648     }
649 
650     /**
651      * @tc.steps: step3. get one event from queue, and compare the event id .
652      * @tc.expected: step3. event we get is low priority events.
653      */
654     uint32_t lowEventId = 0;
655     GetEventAndCompare(lowEventId, queue);
656 
657     /**
658      * @tc.steps: step4. get MAX_HIGH_PRIORITY_COUNT events from queue, and compare the event id .
659      * @tc.expected: step4. event we get is high priority events.
660      */
661     for (uint32_t eventId = MAX_HIGH_PRIORITY_COUNT + NUM; eventId < NUM * MAX_HIGH_PRIORITY_COUNT + NUM; eventId++) {
662         GetEventAndCompare(eventId, queue);
663     }
664 
665     /**
666      * @tc.steps: step5. get one event from queue, and compare the event id .
667      * @tc.expected: step5. event we get is low priority events.
668      */
669     lowEventId = 1;
670     GetEventAndCompare(lowEventId, queue);
671 }
672 
673 /*
674  * @tc.name: InsertEvent006
675  * @tc.desc: avoid starvation in queue when insert event of different priorities into queue.
676  * @tc.type: FUNC
677  */
678 HWTEST_F(LibEventHandlerEventQueueTest, InsertEvent006, TestSize.Level1)
679 {
680     /**
681      * @tc.setup: prepare queue.
682      */
683     const uint32_t count = 5;
684     const uint32_t highEventCount = 6;
685     EventQueueBase queue;
686     queue.Prepare();
687 
688     /**
689      * @tc.steps: step1. insert events from low priority to immediate priority into queue.
690      */
691     InsertAllPriorityEvent(queue);
692 
693     uint32_t highCount = 1;
694     uint32_t highEventId = 0;
695     uint32_t lowCount = 0;
696     uint32_t immediateCount = 1;
697 
698     /**
699      * @tc.steps: step2. get events from queue, and compare the event id .
700      * @tc.expected: step2. first we get five immediate priority events , then get one high priority event, every five
701      *               high priority events, we will get one low priority event.
702      */
703     for (uint32_t eventId = 0; eventId < IMMEDIATE_PRIORITY_COUNT - HIGH_PRIORITY_COUNT; eventId++) {
704         if (immediateCount % count == 0) {
705             GetEventAndCompare(HIGH_PRIORITY_COUNT + eventId, queue);
706             immediateCount++;
707             if (highCount % highEventCount == 0) {
708                 GetEventAndCompare(lowCount, queue);
709                 lowCount++;
710                 highCount++;
711             } else {
712                 GetEventAndCompare(LOW_PRIORITY_COUNT + highEventId, queue);
713                 highCount++;
714                 highEventId++;
715             }
716         } else {
717             GetEventAndCompare(HIGH_PRIORITY_COUNT + eventId, queue);
718             immediateCount++;
719         }
720     }
721 }
722 
723 /*
724  * @tc.name: InsertEvent007
725  * @tc.desc: delay event handle time, get event after delaytime
726  * @tc.type: FUNC
727  */
728 HWTEST_F(LibEventHandlerEventQueueTest, InsertEvent007, TestSize.Level1)
729 {
730     const uint8_t delayTime = 100;
731     /**
732      * @tc.steps: step1. insert event into queue and set handle time delay 100ms from now, then get event from queue.
733      * @tc.expected: step1. the delay time we get event from queue is about 100ms with tolerable error.
734      */
735     DelayTest(delayTime);
736 }
737 
738 /*
739  * @tc.name: InsertEvent008
740  * @tc.desc: delayTime = 0, send event and get event from queue
741  * @tc.type: FUNC
742  */
743 HWTEST_F(LibEventHandlerEventQueueTest, InsertEvent008, TestSize.Level1)
744 {
745     const uint8_t delayTime = 0;
746     /**
747      * @tc.steps: step1. insert event into queue and set handle time delay 0ms from now, then get event from queue.
748      * @tc.expected: step1. the delay time we get event from queue is about 0ms with tolerable error.
749      */
750     DelayTest(delayTime);
751 }
752 
753 /*
754  * @tc.name: EventQueue_001
755  * @tc.desc: test RemoveOrphanByHandlerId
756  * @tc.type: FUNC
757  */
758 HWTEST_F(LibEventHandlerEventQueueTest, EventQueue_001, TestSize.Level1)
759 {
760     EventQueueBase queue;
761     const std::string handlerId = "handlerId";
762     queue.RemoveOrphanByHandlerId(handlerId);
763 }
764 
765 /*
766  * @tc.name: EventQueue_002
767  * @tc.desc: test PushHistoryQueueBeforeDistribute
768  * @tc.type: FUNC
769  */
770 HWTEST_F(LibEventHandlerEventQueueTest, EventQueue_002, TestSize.Level1)
771 {
772     EventQueueBase queue;
773     auto event = queue.GetEvent();
774     EXPECT_EQ(nullptr, event);
775     queue.PushHistoryQueueBeforeDistribute(event);
776 }
777 
778 /*
779  * @tc.name: EventQueue_003
780  * @tc.desc: test PushHistoryQueueAfterDistribute
781  * @tc.type: FUNC
782  */
783 HWTEST_F(LibEventHandlerEventQueueTest, EventQueue_003, TestSize.Level1)
784 {
785     EventQueueBase queue;
786     queue.PushHistoryQueueAfterDistribute();
787 }
788 
789 /*
790  * @tc.name: EventQueue_004
791  * @tc.desc: test GetFfrtQueue
792  * @tc.type: FUNC
793  */
794 HWTEST_F(LibEventHandlerEventQueueTest, EventQueue_004, TestSize.Level1)
795 {
796     EventQueueBase queue;
797     void* ffrt = queue.GetFfrtQueue();
798     EXPECT_EQ(nullptr, ffrt);
799 }
800 
801 /*
802  * @tc.name: EventQueue_005
803  * @tc.desc: test InsertSyncEvent
804  * @tc.type: FUNC
805  */
806 HWTEST_F(LibEventHandlerEventQueueTest, EventQueue_005, TestSize.Level1)
807 {
808     EventQueueBase queue;
809     auto event = queue.GetEvent();
810     EXPECT_EQ(nullptr, event);
811     queue.InsertSyncEvent(event);
812 }
813 
814 /*
815  * @tc.name: RemoveEvent001
816  * @tc.desc: remove all the events which belong to one handler
817  * @tc.type: FUNC
818  */
819 HWTEST_F(LibEventHandlerEventQueueTest, RemoveEvent001, TestSize.Level1)
820 {
821     /**
822      * @tc.setup: init handler and runner.
823      */
824     auto runner = EventRunner::Create(true);
825     auto handler = std::make_shared<EventHandler>(runner);
826     std::atomic<bool> taskCalled(false);
__anon68462b170202() 827     auto f = [&taskCalled]() { taskCalled.store(true); };
828 
829     /**
830      * @tc.steps: step1. post a task with delay time, then remove this task ,check whether the task is executed
831      *            after delay time passed.
832      * @tc.expected: step1. the task is not executed after delay time.
833      */
834     if (handler->PostTask(f, REMOVE_DELAY_TIME, EventQueue::Priority::LOW)) {
835         handler->RemoveAllEvents();
836         usleep(REMOVE_WAIT_TIME);
837         auto called = taskCalled.load();
838         EXPECT_FALSE(called);
839     }
840 }
841 
842 /*
843  * @tc.name: RemoveEvent002
844  * @tc.desc: remove all the events which belong to one handler with same id
845  * @tc.type: FUNC
846  */
847 HWTEST_F(LibEventHandlerEventQueueTest, RemoveEvent002, TestSize.Level1)
848 {
849     /**
850      * @tc.setup: init handler and runner.
851      */
852     auto runner = EventRunner::Create(true);
853     auto handler = std::make_shared<MyEventHandler>(runner);
854     auto event = InnerEvent::Get(REMOVE_EVENT_ID);
855 
856     /**
857      * @tc.steps: step1. send an event with delay time, then remove this event with event id,
858      *                   then check whether the task is executed after delay time.
859      * @tc.expected: step1. the task is not executed after delay time.
860      */
861     handler->SendEvent(event, REMOVE_DELAY_TIME, EventQueue::Priority::LOW);
862     handler->RemoveEvent(REMOVE_EVENT_ID);
863     usleep(REMOVE_WAIT_TIME);
864     auto ran = eventRan.load();
865     EXPECT_FALSE(ran);
866 }
867 
868 /*
869  * @tc.name: RemoveEvent003
870  * @tc.desc: remove all the events which belong to one handler with same id and param
871  * @tc.type: FUNC
872  */
873 HWTEST_F(LibEventHandlerEventQueueTest, RemoveEvent003, TestSize.Level1)
874 {
875     /**
876      * @tc.setup: init handler and runner.
877      */
878     int64_t eventParam = 0;
879     auto runner = EventRunner::Create(true);
880     auto handler = std::make_shared<MyEventHandler>(runner);
881     auto event = InnerEvent::Get(REMOVE_EVENT_ID, eventParam);
882 
883     /**
884      * @tc.steps: step1. send an event with delay time, then remove this event with event id and param,
885      *                   then check whether the task is executed after delay time.
886      * @tc.expected: step1. the task is not executed after delay time.
887      */
888     handler->SendEvent(event, REMOVE_DELAY_TIME, EventQueue::Priority::LOW);
889     handler->RemoveEvent(REMOVE_EVENT_ID, eventParam);
890     usleep(REMOVE_WAIT_TIME);
891     auto ran = eventRan.load();
892     EXPECT_FALSE(ran);
893 }
894 
895 /*
896  * @tc.name: RemoveEvent004
897  * @tc.desc: remove events with task from queue
898  * @tc.type: FUNC
899  */
900 HWTEST_F(LibEventHandlerEventQueueTest, RemoveEvent004, TestSize.Level1)
901 {
902     /**
903      * @tc.setup: init handler and runner, get event with callback and name.
904      */
905     int64_t delayTime = 5;
906     int64_t delayWaitTime = 10000;
907     std::string taskName("taskName");
908     std::atomic<bool> taskCalled(false);
__anon68462b170302() 909     auto f = [&taskCalled]() { taskCalled.store(true); };
910     auto runner = EventRunner::Create(true);
911     auto handler = std::make_shared<EventHandler>(runner);
912     auto event = InnerEvent::Get(f, taskName);
913 
914     /**
915      * @tc.steps: step1. send an event with delay time, then remove this event with taskname,
916      *                   then check whether the task is executed after delay time.
917      * @tc.expected: step1. the task is not executed after delay time.
918      */
919     handler->SendEvent(event, delayTime, EventQueue::Priority::LOW);
920     handler->RemoveTask(taskName);
921     usleep(delayWaitTime);
922     auto called = taskCalled.load();
923     EXPECT_FALSE(called);
924 }
925 
926 /*
927  * @tc.name: NotifyQueue001
928  * @tc.desc: wake up the queue which is blocked when we need to execute a task
929  * @tc.type: FUNC
930  */
931 HWTEST_F(LibEventHandlerEventQueueTest, NotifyQueue001, TestSize.Level1)
932 {
933     /**
934      * @tc.setup: init handler and runner.
935      */
936     std::atomic<bool> taskCalled(false);
937     auto runner = EventRunner::Create(false);
938     auto handler = std::make_shared<EventHandler>(runner);
939 
940     /**
941      * @tc.steps: step1. post a delay task to block handler thread, then new a thread to post a task to wake up the
942      *            blocked handler.
943      * @tc.expected: step1. the task is executed as expect.
944      */
__anon68462b170402() 945     auto mainTask = [&taskCalled, &runner]() {
946         taskCalled.store(false);
947         runner->Stop();
948     };
949     handler->PostTask(mainTask, DELAY_TIME);
__anon68462b170502() 950     auto f = [&taskCalled, &handler]() {
951         usleep(10000);
952         auto task = [&taskCalled]() { taskCalled.store(true); };
953         handler->PostTask(task);
954         usleep(10000);
955         auto called = taskCalled.load();
956         EXPECT_TRUE(called);
957     };
958     std::thread newThread(f);
959     newThread.detach();
960     runner->Run();
961     auto called = taskCalled.load();
962     EXPECT_FALSE(called);
963 }
964 
965 /*
966  * @tc.name: NotifyQueue002
967  * @tc.desc: add FileDescriptor and wake up the queue with epoll which is blocked when we need to execute a task
968  * @tc.type: FUNC
969  */
970 HWTEST_F(LibEventHandlerEventQueueTest, NotifyQueue002, TestSize.Level1)
971 {
972     /**
973      * @tc.setup: init handler and runner.
974      */
975     std::atomic<bool> taskCalled(false);
976     auto runner = EventRunner::Create(false);
977     auto handler = std::make_shared<EventHandler>(runner);
978 
979     /**
980      * @tc.steps: step1. add file descripter listener to handler, handler will use epoll to wake up block thread.
981      */
982     int32_t fds[] = {-1, -1};
983     int32_t fileDescriptor = InitFileDescriptor(fds);
984     uint32_t event = 1;
985 
986     auto fileDescriptorListener = std::make_shared<MyFileDescriptorListener>();
987     handler->AddFileDescriptorListener(fileDescriptor, event, fileDescriptorListener, "NotifyQueue002");
988 
989     /**
990      * @tc.steps: step2. post a delay task to block handler thread, then new a thread to post a task to wake up the
991      *            blocked handler.
992      * @tc.expected: step2. the task is executed as expect.
993      */
__anon68462b170702() 994     auto mainThreadTask = [&taskCalled, &runner]() {
995         taskCalled.store(false);
996         runner->Stop();
997     };
998     handler->PostTask(mainThreadTask, DELAY_TIME);
__anon68462b170802() 999     auto newThreadTask = [&taskCalled, &handler]() {
1000         usleep(10000);
1001         auto tempTask = [&taskCalled]() { taskCalled.store(true); };
1002         handler->PostTask(tempTask);
1003         usleep(10000);
1004         auto called = taskCalled.load();
1005         EXPECT_TRUE(called);
1006     };
1007     std::thread newThread(newThreadTask);
1008     newThread.detach();
1009     runner->Run();
1010     auto called = taskCalled.load();
1011     EXPECT_FALSE(called);
1012 
1013     /**
1014      * @tc.steps: step3. remove file descripter listener and close pipe.
1015      */
1016     handler->RemoveFileDescriptorListener(fileDescriptor);
1017     close(fds[0]);
1018     close(fds[1]);
1019 }
1020 
1021 /*
1022  * @tc.name: NotifyQueue003
1023  * @tc.desc: wake up the queue with epoll which is blocked when we need to execute a task
1024  * @tc.type: FUNC
1025  */
1026 HWTEST_F(LibEventHandlerEventQueueTest, NotifyQueue003, TestSize.Level1)
1027 {
1028     /**
1029      * @tc.setup: init handler and runner.
1030      */
1031     std::atomic<bool> taskCalled(false);
1032     auto runner = EventRunner::Create(false);
1033     auto handler = std::make_shared<EventHandler>(runner);
1034     auto fileDescriptorListener = std::make_shared<MyFileDescriptorListener>();
1035     auto called = taskCalled.load();
__anon68462b170a02() 1036     auto main = [&taskCalled, &runner]() {
1037         taskCalled.store(false);
1038         runner->Stop();
1039     };
1040 
1041     /**
1042      * @tc.steps: step1. post delay task to block handler.
1043      */
1044     handler->PostTask(main, DELAY_TIME);
1045     int32_t fds[] = {-1, -1};
1046     int32_t fileDescriptor = InitFileDescriptor(fds);
1047     uint32_t event = 1;
1048 
1049     /**
1050      * @tc.steps: step2. new a thread to post a delay task to add file descriptor listener to handler,
1051      *            then post a new task.
1052      * @tc.expected: step2. all the task is executed as expect.
1053      */
__anon68462b170b02() 1054     auto newTask = [&handler, &fileDescriptor, &event, &fileDescriptorListener, &taskCalled]() {
1055         usleep(10000);
1056         handler->AddFileDescriptorListener(fileDescriptor, event, fileDescriptorListener, "NotifyQueue003");
1057         usleep(10000);
1058         auto newCalled = taskCalled.load();
1059         EXPECT_FALSE(newCalled);
1060         auto innerTask = [&taskCalled]() { taskCalled.store(true); };
1061         handler->PostTask(innerTask);
1062         usleep(10000);
1063         newCalled = taskCalled.load();
1064         EXPECT_TRUE(newCalled);
1065     };
1066     std::thread newThread(newTask);
1067     newThread.detach();
1068     runner->Run();
1069     called = taskCalled.load();
1070     EXPECT_FALSE(called);
1071 
1072     /**
1073      * @tc.steps: step3. remove file descripter listener and close pipe.
1074      */
1075     handler->RemoveFileDescriptorListener(fileDescriptor);
1076     close(fds[0]);
1077     close(fds[1]);
1078 }
1079 
1080 /*
1081  * @tc.name: RemoveOrphan001
1082  * @tc.desc: Remove event without owner, and check remove result
1083  * @tc.type: FUNC
1084  */
1085 HWTEST_F(LibEventHandlerEventQueueTest, RemoveOrphan001, TestSize.Level1)
1086 {
1087     /**
1088      * @tc.steps: step1. init orphan handler and post a task.
1089      */
1090     std::atomic<bool> orphanTaskCalled(false);
1091     std::atomic<bool> commonTaskCalled(false);
1092     auto runner = EventRunner::Create(false);
1093     auto orphanHandler = std::make_shared<EventHandler>(runner);
__anon68462b170d02() 1094     auto g = [&orphanTaskCalled]() { orphanTaskCalled.store(true); };
1095     orphanHandler->PostTask(g);
1096 
1097     /**
1098      * @tc.steps: step2. init common handler and post a task.
1099      */
1100     auto commonHandler = std::make_shared<EventHandler>(runner);
__anon68462b170e02() 1101     auto f = [&commonTaskCalled, &runner]() {
1102         commonTaskCalled.store(true);
1103         runner->Stop();
1104     };
1105     commonHandler->PostTask(f);
1106 
1107     /**
1108      * @tc.steps: step3. reset orphan handler and start runner.
1109      * @tc.expected: step3. the task post through orphan handler is not executed, the task
1110      *               post through common handler is executed.
1111      */
1112     orphanHandler.reset();
1113     usleep(10000);
1114     runner->Run();
1115     auto orphanCalled = orphanTaskCalled.load();
1116     EXPECT_FALSE(orphanCalled);
1117     auto commonCalled = commonTaskCalled.load();
1118     EXPECT_TRUE(commonCalled);
1119 }
1120 
1121 /*
1122  * @tc.name: AddAndRemoveFileDescriptorListener001
1123  * @tc.desc: add file descriptor listener and remove file descriptor listener with fd
1124  * @tc.type: FUNC
1125  */
1126 HWTEST_F(LibEventHandlerEventQueueTest, AddAndRemoveFileDescriptorListener001, TestSize.Level1)
1127 {
1128     /**
1129      * @tc.setup: init queue and prepare queue.
1130      */
1131     EventQueueBase queue;
1132     queue.Prepare();
1133 
1134     int32_t fds[] = {-1, -1};
1135     EXPECT_GE(pipe(fds), 0);
1136 
1137     /**
1138      * @tc.steps: step1. add file descriptor listener to queue, then remove file descriptor listener with fd,
1139      *                   close pipe.
1140      * @tc.expected: step1. add file descriptor listener success.
1141      */
1142     int32_t fileDescriptor = fds[0];
1143     uint32_t event = 1;
1144     auto fileDescriptorListener = std::make_shared<MyFileDescriptorListener>();
1145     auto result = queue.AddFileDescriptorListener(fileDescriptor, event, fileDescriptorListener,
1146         "AddAndRemoveFileDescriptorListener001");
1147     EXPECT_EQ(result, ERR_OK);
1148     queue.RemoveFileDescriptorListener(-1);
1149     queue.RemoveFileDescriptorListener(fileDescriptor);
1150     close(fds[0]);
1151     close(fds[1]);
1152 }
1153 
1154 /*
1155  * @tc.name: AddAndRemoveFileDescriptorListener002
1156  * @tc.desc: add file descriptor listener and remove file descriptor listener with handler
1157  * @tc.type: FUNC
1158  */
1159 HWTEST_F(LibEventHandlerEventQueueTest, AddAndRemoveFileDescriptorListener002, TestSize.Level1)
1160 {
1161     /**
1162      * @tc.setup: init handler and runner, prepare queue.
1163      */
1164     auto runner = EventRunner::Create(false);
1165     auto handler = std::make_shared<EventHandler>(runner);
1166     EventQueueBase queue;
1167     queue.Prepare();
1168 
1169     /**
1170      * @tc.steps: step1. add file descriptor listener to queue, then remove file descriptor listener with handler,
1171      *                   close pipe.
1172      * @tc.expected: step1. add file descriptor listener success.
1173      */
1174     int32_t fds[] = {-1, -1};
1175     int32_t fileDescriptor = InitFileDescriptor(fds);
1176     uint32_t event = 1;
1177 
1178     auto fileDescriptorListener = std::make_shared<MyFileDescriptorListener>();
1179     fileDescriptorListener->SetOwner(handler);
1180     auto result = queue.AddFileDescriptorListener(fileDescriptor, event, fileDescriptorListener,
1181         "AddAndRemoveFileDescriptorListener002");
1182     EXPECT_EQ(result, ERR_OK);
1183     queue.RemoveFileDescriptorListener(nullptr);
1184     queue.RemoveFileDescriptorListener(handler);
1185     close(fds[0]);
1186     close(fds[1]);
1187 }
1188 
1189 /*
1190  * @tc.name: AddFileDescriptorListener001
1191  * @tc.desc: add file descriptor listener multi times
1192  * @tc.type: FUNC
1193  */
1194 HWTEST_F(LibEventHandlerEventQueueTest, AddFileDescriptorListener001, TestSize.Level1)
1195 {
1196     /**
1197      * @tc.setup: init handler and runner, prepare queue.
1198      */
1199     auto runner = EventRunner::Create(false);
1200     auto handler = std::make_shared<EventHandler>(runner);
1201     EventQueueBase queue;
1202     queue.Prepare();
1203 
1204     int32_t fds[] = {-1, -1};
1205     int32_t fileDescriptor = InitFileDescriptor(fds);
1206     uint32_t listenEvent = 1;
1207 
1208     /**
1209      * @tc.steps: step1. add file descriptor listener to queue multi times, then remove file descriptor listener
1210      *                   with handler, close pipe.
1211      * @tc.expected: step1. first time add file descriptor listener success, second time failed.
1212      */
1213     auto fileDescriptorListener = std::make_shared<MyFileDescriptorListener>();
1214     fileDescriptorListener->SetOwner(handler);
1215     auto result = queue.AddFileDescriptorListener(fileDescriptor, listenEvent, fileDescriptorListener,
1216         "AddFileDescriptorListener001");
1217     EXPECT_EQ(result, ERR_OK);
1218     result = queue.AddFileDescriptorListener(fileDescriptor, listenEvent, fileDescriptorListener,
1219         "AddFileDescriptorListener001");
1220     EXPECT_EQ(result, EVENT_HANDLER_ERR_FD_ALREADY);
1221     queue.RemoveFileDescriptorListener(handler);
1222     close(fds[0]);
1223     close(fds[1]);
1224 }
1225 
1226 /*
1227  * @tc.name: AddFileDescriptorListener002
1228  * @tc.desc: add file descriptor listener with wrong type of event
1229  * @tc.type: FUNC
1230  */
1231 HWTEST_F(LibEventHandlerEventQueueTest, AddFileDescriptorListener002, TestSize.Level1)
1232 {
1233     /**
1234      * @tc.setup: init handler and runner, prepare queue.
1235      */
1236     auto runner = EventRunner::Create(false);
1237     auto handler = std::make_shared<EventHandler>(runner);
1238     EventQueueBase queue;
1239     queue.Prepare();
1240 
1241     /**
1242      * @tc.steps: step1. add file descriptor listener to queue with wrong type of event,
1243      *                   then remove file descriptor listener with handler, close pipe.
1244      * @tc.expected: step1. add file descriptor listener failed.
1245      */
1246     int32_t fds[] = {-1, -1};
1247     int32_t fileDescriptor = InitFileDescriptor(fds);
1248     uint32_t newEvent = 0;
1249 
1250     auto fileDescriptorListener = std::make_shared<MyFileDescriptorListener>();
1251     fileDescriptorListener->SetOwner(handler);
1252     auto result = queue.AddFileDescriptorListener(fileDescriptor, newEvent, fileDescriptorListener,
1253         "AddFileDescriptorListener002");
1254     EXPECT_EQ(result, EVENT_HANDLER_ERR_INVALID_PARAM);
1255     queue.RemoveFileDescriptorListener(handler);
1256     close(fds[0]);
1257     close(fds[1]);
1258 }
1259 
1260 /*
1261  * @tc.name: AddFileDescriptorListener003
1262  * @tc.desc: add file descriptor listener with nullptr listener function
1263  * @tc.type: FUNC
1264  */
1265 HWTEST_F(LibEventHandlerEventQueueTest, AddFileDescriptorListener003, TestSize.Level1)
1266 {
1267     /**
1268      * @tc.setup: init handler and runner, prepare queue.
1269      */
1270     auto runner = EventRunner::Create(false);
1271     auto handler = std::make_shared<EventHandler>(runner);
1272     EventQueueBase queue;
1273     queue.Prepare();
1274 
1275     /**
1276      * @tc.steps: step1. add file descriptor listener to queue with nullptr listener,
1277      *                   then remove file descriptor listener with handler, close pipe.
1278      * @tc.expected: step1. add file descriptor listener failed.
1279      */
1280     int32_t fds[] = {-1, -1};
1281     int32_t fileDescriptor = InitFileDescriptor(fds);
1282     uint32_t event = 1;
1283 
1284     auto fileDescriptorListener = std::make_shared<MyFileDescriptorListener>();
1285     fileDescriptorListener->SetOwner(handler);
1286     auto result = queue.AddFileDescriptorListener(fileDescriptor, event, nullptr, "AddFileDescriptorListener003");
1287     EXPECT_EQ(result, EVENT_HANDLER_ERR_INVALID_PARAM);
1288     queue.RemoveFileDescriptorListener(handler);
1289     close(fds[0]);
1290     close(fds[1]);
1291 }
1292 
1293 /*
1294  * @tc.name: AddFileDescriptorListener004
1295  * @tc.desc: add file descriptor listener with wrong fd
1296  * @tc.type: FUNC
1297  */
1298 HWTEST_F(LibEventHandlerEventQueueTest, AddFileDescriptorListener004, TestSize.Level1)
1299 {
1300     /**
1301      * @tc.setup: init handler and runner, prepare queue.
1302      */
1303     auto runner = EventRunner::Create(false);
1304     auto handler = std::make_shared<EventHandler>(runner);
1305     EventQueueBase queue;
1306     queue.Prepare();
1307 
1308     /**
1309      * @tc.steps: step1. add file descriptor listener to queue with wrong pipe, then remove
1310      *            file descriptor listener with handler, close pipe.
1311      * @tc.expected: step1. add file descriptor listener failed.
1312      */
1313     int32_t fds[] = {-1, -1};
1314 
1315     int32_t fileDescriptor = fds[0];
1316     uint32_t event = 1;
1317     auto fileDescriptorListener = std::make_shared<MyFileDescriptorListener>();
1318     fileDescriptorListener->SetOwner(handler);
1319     auto result = queue.AddFileDescriptorListener(fileDescriptor, event, fileDescriptorListener,
1320         "AddFileDescriptorListener004");
1321     EXPECT_EQ(result, EVENT_HANDLER_ERR_INVALID_PARAM);
1322     queue.RemoveFileDescriptorListener(handler);
1323     close(fds[0]);
1324     close(fds[1]);
1325 }
1326 
1327 /*
1328  * @tc.name: AddFileDescriptorListener005
1329  * @tc.desc: add file descriptor listener when there are too many open files
1330  * @tc.type: FUNC
1331  */
1332 HWTEST_F(LibEventHandlerEventQueueTest, AddFileDescriptorListener005, TestSize.Level1)
1333 {
1334     /**
1335      * @tc.setup: init queue, prepare queue.
1336      */
1337     int32_t fds[] = {-1, -1};
1338     auto result = pipe(fds);
1339     EXPECT_GE(result, 0);
1340     EventQueueBase queue;
1341     queue.Prepare();
1342     int32_t readFileDescriptor = fds[0];
1343 
1344     /**
1345      * @tc.steps: step2. add file descriptor listener to queue, then remove
1346      *            file descriptor listener with handler, close pipe.
1347      * @tc.expected: step2. add file descriptor listener failed.
1348      */
1349     uint32_t event = (FILE_DESCRIPTOR_INPUT_EVENT | FILE_DESCRIPTOR_OUTPUT_EVENT);
1350     auto fileDescriptorListener = std::make_shared<MyFileDescriptorListener>();
1351     result = queue.AddFileDescriptorListener(readFileDescriptor, event, fileDescriptorListener,
1352         "AddFileDescriptorListener005");
1353     EXPECT_EQ(result, ERR_OK);
1354     close(fds[0]);
1355     close(fds[1]);
1356 }
1357 
1358 /*
1359  * @tc.name: HasEventWithID001
1360  * @tc.desc: check whether an event with the given ID can be found among the events that have been
1361  *           sent but not processed.
1362  * @tc.type: FUNC
1363  */
1364 HWTEST_F(LibEventHandlerEventQueueTest, HasEventWithID001, TestSize.Level1)
1365 {
1366     /**
1367      * @tc.setup: init handler and runner.
1368      */
1369 
1370     auto runner = EventRunner::Create(true);
1371     auto handler = std::make_shared<EventHandler>(runner);
1372     auto event = InnerEvent::Get(HAS_EVENT_ID);
1373 
1374     /**
1375      * @tc.steps: step1. send a event with delay time, then check has this event with this id,
1376      *                   then check executed after delay time has no this event with this id.
1377      * @tc.expected: step1. Has this event with event id.
1378      */
1379     handler->SendEvent(event, HAS_DELAY_TIME, EventQueue::Priority::LOW);
1380     bool HasInnerEvent = handler->HasInnerEvent(HAS_EVENT_ID);
1381     EXPECT_TRUE(HasInnerEvent);
1382     int64_t delayWaitTime = 100000;
1383     usleep(delayWaitTime);
1384     HasInnerEvent = handler->HasInnerEvent(HAS_EVENT_ID);
1385     EXPECT_FALSE(HasInnerEvent);
1386 }
1387 
1388 /*
1389  * @tc.name: HasEventWithID002
1390  * @tc.desc: check when runner is null ptr Has Inner Event process fail
1391  * @tc.type: FUNC
1392  */
1393 HWTEST_F(LibEventHandlerEventQueueTest, HasEventWithID002, TestSize.Level1)
1394 {
1395     /**
1396      * @tc.setup: init runner.
1397      */
1398     auto handler = std::make_shared<EventHandler>(nullptr);
1399     auto event = InnerEvent::Get(HAS_EVENT_ID);
1400 
1401     /**
1402      * @tc.steps: step1. HasInnerEvent process
1403      *
1404      * @tc.expected: step1. HasInnerEvent process fail.
1405      */
1406     bool HasInnerEvent = handler->HasInnerEvent(HAS_EVENT_ID);
1407     EXPECT_FALSE(HasInnerEvent);
1408 }
1409 
1410 /*
1411  * @tc.name: HasEventWithID003
1412  * @tc.desc: check when runner is null ptr Has Inner Event process fail
1413  * @tc.type: FUNC
1414  */
1415 HWTEST_F(LibEventHandlerEventQueueTest, HasEventWithID003, TestSize.Level1)
1416 {
1417     /**
1418      * @tc.setup: init runner.
1419      */
1420     auto runner = EventRunner::Create(true);
1421 
1422     auto event = InnerEvent::Get(HAS_EVENT_ID);
1423 
1424     /**
1425      * @tc.steps: step1. HasInnerEvent process
1426      *
1427      * @tc.expected: step1. HasInnerEvent process fail.
1428      */
1429     bool HasInnerEvent = runner->GetEventQueue()->HasInnerEvent(nullptr, HAS_EVENT_ID);
1430     EXPECT_FALSE(HasInnerEvent);
1431 }
1432 
1433 /*
1434  * @tc.name: HasEventWithParam001
1435  * @tc.desc: check whether an event with the given param can be found among the events that have been
1436  *           sent but not processed.
1437  * @tc.type: FUNC
1438  */
1439 HWTEST_F(LibEventHandlerEventQueueTest, HasEventWithParam001, TestSize.Level1)
1440 {
1441     /**
1442      * @tc.setup: init handler and runner.
1443      */
1444 
1445     auto runner = EventRunner::Create(true);
1446     auto handler = std::make_shared<EventHandler>(runner);
1447     auto event = InnerEvent::Get(HAS_EVENT_ID, HAS_EVENT_PARAM);
1448 
1449     /**
1450      * @tc.steps: step1. send a event with delay time, then check has this event with this param,
1451      *                   then check executed after delay time has no this event with this param.
1452      * @tc.expected: step1. Has this event with event param.
1453      */
1454     handler->SendEvent(event, HAS_DELAY_TIME, EventQueue::Priority::LOW);
1455     bool HasInnerEvent = handler->HasInnerEvent(HAS_EVENT_PARAM);
1456     EXPECT_TRUE(HasInnerEvent);
1457     int64_t delayWaitTime = 100000;
1458     usleep(delayWaitTime);
1459     HasInnerEvent = handler->HasInnerEvent(HAS_EVENT_PARAM);
1460     EXPECT_FALSE(HasInnerEvent);
1461 }
1462 
1463 /*
1464  * @tc.name: HasEventWithParam002
1465  * @tc.desc: check when runner is null ptr Has Inner Event process fail
1466  * @tc.type: FUNC
1467  */
1468 HWTEST_F(LibEventHandlerEventQueueTest, HasEventWithParam002, TestSize.Level1)
1469 {
1470     /**
1471      * @tc.setup: init runner.
1472      */
1473     auto handler = std::make_shared<EventHandler>(nullptr);
1474     auto event = InnerEvent::Get(HAS_EVENT_PARAM);
1475 
1476     /**
1477      * @tc.steps: step1. HasInnerEvent process
1478      *
1479      * @tc.expected: step1. HasInnerEvent process fail.
1480      */
1481     bool HasInnerEvent = handler->HasInnerEvent(HAS_EVENT_PARAM);
1482     EXPECT_FALSE(HasInnerEvent);
1483 }
1484 
1485 /*
1486  * @tc.name: HasEventWithParam003
1487  * @tc.desc: check when runner is null ptr Has Inner Event process fail
1488  * @tc.type: FUNC
1489  */
1490 HWTEST_F(LibEventHandlerEventQueueTest, HasEventWithParam003, TestSize.Level1)
1491 {
1492     /**
1493      * @tc.setup: init runner.
1494      */
1495     auto runner = EventRunner::Create(true);
1496 
1497     auto event = InnerEvent::Get(HAS_EVENT_PARAM);
1498 
1499     /**
1500      * @tc.steps: step1. HasInnerEvent process
1501      *
1502      * @tc.expected: step1. HasInnerEvent process fail.
1503      */
1504     bool HasInnerEvent = runner->GetEventQueue()->HasInnerEvent(nullptr, HAS_EVENT_PARAM);
1505     EXPECT_FALSE(HasInnerEvent);
1506 }
1507 
1508 /*
1509  * @tc.name: GetEventName001
1510  * @tc.desc: check when send event has no task return event id
1511  * @tc.type: FUNC
1512  */
1513 HWTEST_F(LibEventHandlerEventQueueTest, GetEventName001, TestSize.Level1)
1514 {
1515     /**
1516      * @tc.setup: init runner and handler
1517      */
1518     auto runner = EventRunner::Create(true);
1519     auto handler = std::make_shared<EventHandler>(runner);
1520     auto event = InnerEvent::Get(HAS_EVENT_ID);
1521 
1522     /**
1523      * @tc.steps: step1. GetEventName
1524      * @tc.expected: step1. GetEventName return event id
1525      */
1526     std::string eventName = handler->GetEventName(event);
1527     EXPECT_EQ(eventName, std::to_string(HAS_EVENT_ID));
1528 }
1529 
1530 /*
1531  * @tc.name: GetEventName002
1532  * @tc.desc: check when send event has task event name is "name" return event name "name"
1533  * @tc.type: FUNC
1534  */
1535 HWTEST_F(LibEventHandlerEventQueueTest, GetEventName002, TestSize.Level1)
1536 {
1537     /**
1538      * @tc.setup: init runner and handler
1539      */
1540     auto runner = EventRunner::Create(true);
1541     auto handler = std::make_shared<EventHandler>(runner);
__anon68462b170f02() 1542     auto task = []() {; };
1543     auto event = InnerEvent::Get(task, "name");
1544 
1545     /**
1546      * @tc.steps: step1. GetEventName
1547      * @tc.expected: step1. GetEventName return name
1548      */
1549     std::string eventName = handler->GetEventName(event);
1550     EXPECT_EQ(eventName, "name");
1551 }
1552 
1553 /*
1554  * @tc.name: GetEventName003
1555  * @tc.desc: check when send event has task task name is "" return event name ""
1556  * @tc.type: FUNC
1557  */
1558 HWTEST_F(LibEventHandlerEventQueueTest, GetEventName003, TestSize.Level1)
1559 {
1560     /**
1561      * @tc.setup: init runner and handler
1562      */
1563     auto runner = EventRunner::Create(true);
1564     auto handler = std::make_shared<EventHandler>(runner);
__anon68462b171002() 1565     auto task = []() {; };
1566     auto event = InnerEvent::Get(task, "");
1567 
1568     /**
1569      * @tc.steps: step1. GetEventName
1570      * @tc.expected: step1. GetEventName return name
1571      */
1572     std::string eventName = handler->GetEventName(event);
1573     EXPECT_EQ(eventName, "");
1574 }
1575 
1576 /*
1577  * @tc.name: Dump001
1578  * @tc.desc: Check Dump
1579  * @tc.type: FUNC
1580  */
1581 HWTEST_F(LibEventHandlerEventQueueTest, Dump001, TestSize.Level1)
1582 {
1583     /**
1584      * @tc.setup: init runner and handler
1585      */
1586     auto runner = EventRunner::Create(true);
1587     auto handler = std::make_shared<EventHandler>(runner);
__anon68462b171102() 1588     auto task = []() {; };
1589     auto event = InnerEvent::Get(task, "");
1590     DumpTest dumptest;
1591     /**
1592      * @tc.steps: step1. Dump
1593      * @tc.expected: step1. Dump Success
1594      */
1595     usleep(100 * 1000);
1596     handler->Dump(dumptest);
1597     EXPECT_TRUE(isDump);
1598 }
1599 
1600 /*
1601  * @tc.name: Dump002
1602  * @tc.desc: Check Dump after post task
1603  * @tc.type: FUNC
1604  */
1605 HWTEST_F(LibEventHandlerEventQueueTest, Dump002, TestSize.Level1)
1606 {
1607     isDump = false;
1608     /**
1609      * @tc.setup: init runner and handler
1610      */
1611     auto runner = EventRunner::Create(true);
1612     auto handler = std::make_shared<EventHandler>(runner);
__anon68462b171202() 1613     auto task = []() {; };
1614     DumpTest dumptest;
1615     /**
1616      * @tc.steps: step1. PosTask then PostTask
1617      * @tc.expected: step1. PostTask success
1618      */
1619     handler->PostTask(task, HAS_DELAY_TIME, EventQueue::Priority::LOW);
1620     usleep(100 * 1000);
1621     handler->Dump(dumptest);
1622     EXPECT_TRUE(isDump);
1623 }
1624 
1625 /*
1626  * @tc.name: Dump003
1627  * @tc.desc: Check Dump after send event with event id
1628  * @tc.type: FUNC
1629  */
1630 HWTEST_F(LibEventHandlerEventQueueTest, Dump003, TestSize.Level1)
1631 {
1632     isDump = false;
1633     /**
1634      * @tc.setup: init runner and handler
1635      */
1636     auto runner = EventRunner::Create(true);
1637     auto handler = std::make_shared<EventHandler>(runner);
1638     auto event = InnerEvent::Get(HAS_EVENT_ID);
1639     DumpTest dumptest;
1640     /**
1641      * @tc.steps: step1. SendEvent then Dump
1642      * @tc.expected: step1. Dump Success
1643      */
1644     handler->SendEvent(event, HAS_DELAY_TIME, EventQueue::Priority::LOW);
1645     usleep(100 * 1000);
1646     handler->Dump(dumptest);
1647     EXPECT_TRUE(isDump);
1648 }
1649 
1650 /*
1651  * @tc.name: Dump004
1652  * @tc.desc: Check Dump after send event with event id and param
1653  * @tc.type: FUNC
1654  */
1655 HWTEST_F(LibEventHandlerEventQueueTest, Dump004, TestSize.Level1)
1656 {
1657     isDump = false;
1658     /**
1659      * @tc.setup: init runner and handler
1660      */
1661     auto runner = EventRunner::Create(true);
1662     auto handler = std::make_shared<EventHandler>(runner);
1663     auto event = InnerEvent::Get(HAS_EVENT_ID, HAS_EVENT_PARAM);
1664     DumpTest dumptest;
1665     /**
1666      * @tc.steps: step1. SendEvent then Dump
1667      * @tc.expected: step1. Dump Success
1668      */
1669     handler->SendEvent(event, HAS_DELAY_TIME, EventQueue::Priority::LOW);
1670     usleep(100 * 1000);
1671     handler->Dump(dumptest);
1672     EXPECT_TRUE(isDump);
1673 }
1674 
1675 /*
1676  * @tc.name: Dump005
1677  * @tc.desc: check when send event and post task dump success
1678  * @tc.type: FUNC
1679  */
1680 HWTEST_F(LibEventHandlerEventQueueTest, Dump005, TestSize.Level1)
1681 {
1682     isDump = false;
1683     /**
1684      * @tc.setup: init runner and handler
1685      */
1686     auto runner = EventRunner::Create(true);
1687     auto handler = std::make_shared<EventHandler>(runner);
1688     auto event = InnerEvent::Get(HAS_EVENT_ID, HAS_EVENT_PARAM);
__anon68462b171302() 1689     auto task = []() {; };
1690     DumpTest dumptest;
1691 
1692     /**
1693      * @tc.steps: step1. send event and post task then dump
1694      * @tc.expected: step1. dump success
1695      */
1696     handler->SendEvent(event, HAS_DELAY_TIME, EventQueue::Priority::LOW);
1697     handler->PostTask(task, HAS_DELAY_TIME * 2, EventQueue::Priority::LOW);
1698     usleep(100 * 1000);
1699     handler->Dump(dumptest);
1700     EXPECT_TRUE(isDump);
1701 }
1702 
1703 /*
1704  * @tc.name: IsIdle
1705  * @tc.desc: check when idle IsIdle return true
1706  * @tc.type: FUNC
1707 
1708  */
1709 HWTEST_F(LibEventHandlerEventQueueTest, IsIdle001, TestSize.Level1)
1710 {
1711     auto runner = EventRunner::Create(true);
1712     auto handler = std::make_shared<EventHandler>(runner);
1713     /**
1714      * @tc.steps: step1. IsIdle
1715      * @tc.expected: step1. when idle IsIdle return true
1716      */
1717     bool ret = handler->IsIdle();
1718     EXPECT_TRUE(ret);
1719 }
1720 
1721 /*
1722  * @tc.name: IsQueueEmpty001
1723  * @tc.desc: check when queue is empty IsQueueEmpty return true
1724  * @tc.type: FUNC
1725  */
1726 HWTEST_F(LibEventHandlerEventQueueTest, IsQueueEmpty001, TestSize.Level1)
1727 {
1728     auto runner = EventRunner::Create(true);
1729     bool ret = runner->GetEventQueue()->IsQueueEmpty();
1730     EXPECT_TRUE(ret);
1731 }
1732 
1733 /*
1734  * @tc.name: IsQueueEmpty002
1735  * @tc.desc: check when queue is not empty has low event IsQueueEmpty return false
1736  * @tc.type: FUNC
1737  */
1738 HWTEST_F(LibEventHandlerEventQueueTest, IsQueueEmpty002, TestSize.Level1)
1739 {
1740     /**
1741      * @tc.setup: init runner and handler
1742      */
1743     auto runner = EventRunner::Create(true);
1744     auto handler = std::make_shared<EventHandler>(runner);
1745     auto event = InnerEvent::Get(HAS_EVENT_ID, HAS_EVENT_PARAM);
1746 
1747     /**
1748      * @tc.steps: step1. send event and IsQueueEmpty
1749      * @tc.expected: step1. when queue is not empty has low event IsQueueEmpty return false
1750      */
1751     handler->SendEvent(event, HAS_DELAY_TIME, EventQueue::Priority::LOW);
1752     bool ret = runner->GetEventQueue()->IsQueueEmpty();
1753     EXPECT_FALSE(ret);
1754 }
1755 
1756 /*
1757  * @tc.name: IsQueueEmpty003
1758  * @tc.desc: check when queue is not empty has idle event IsQueueEmpty return false
1759  * @tc.type: FUNC
1760  */
1761 HWTEST_F(LibEventHandlerEventQueueTest, IsQueueEmpty003, TestSize.Level1)
1762 {
1763     /**
1764      * @tc.setup: init runner and handler
1765      */
1766     auto runner = EventRunner::Create(true);
1767     auto handler = std::make_shared<EventHandler>(runner);
1768     auto event = InnerEvent::Get(HAS_EVENT_ID, HAS_EVENT_PARAM);
1769 
1770     /**
1771      * @tc.steps: step1. send event and IsQueueEmpty
1772      * @tc.expected: step1. when queue is not empty has idle event IsQueueEmpty return false
1773      */
1774     handler->SendEvent(event, HAS_DELAY_TIME, EventQueue::Priority::IDLE);
1775     bool ret = runner->GetEventQueue()->IsQueueEmpty();
1776     EXPECT_FALSE(ret);
1777 }
1778 
1779 
1780 /*
1781  * @tc.name: IsQueueEmpty004
1782  * @tc.desc: check when queue is not empty has vip event IsQueueEmpty return false
1783  * @tc.type: FUNC
1784  */
1785 HWTEST_F(LibEventHandlerEventQueueTest, IsQueueEmpty004, TestSize.Level1)
1786 {
1787     /**
1788      * @tc.setup: init runner and handler
1789      */
1790     auto runner = EventRunner::Create(true);
1791     auto handler = std::make_shared<EventHandler>(runner);
1792     auto event = InnerEvent::Get(HAS_EVENT_ID, HAS_EVENT_PARAM);
1793 
1794     /**
1795      * @tc.steps: step1. send event and IsQueueEmpty
1796      * @tc.expected: step1. when queue is not empty has vip event IsQueueEmpty return false
1797      */
1798     handler->SendEvent(event, HAS_DELAY_TIME, EventQueue::Priority::VIP);
1799     bool ret = runner->GetEventQueue()->IsQueueEmpty();
1800     EXPECT_FALSE(ret);
1801 }
1802 
1803 /*
1804  * @tc.name: RemoveFileDescriptorListenerLocked
1805  * @tc.desc: RemoveFileDescriptorListenerLocked test
1806  * @tc.type: FUNC
1807  */
1808 HWTEST_F(LibEventHandlerEventQueueTest, RemoveFileDescriptorListenerLocked001, TestSize.Level1)
1809 {
1810     auto queue = std::make_shared<EventQueueBase>(nullptr);
1811     EXPECT_NE(queue, nullptr);
1812     queue->RemoveOrphan();
1813 }
1814 
1815 /*
1816  * @tc.name: RemoveOrphan
1817  * @tc.desc: RemoveOrphan test
1818  * @tc.type: FUNC
1819  */
1820 HWTEST_F(LibEventHandlerEventQueueTest, RemoveOrphan004, TestSize.Level1)
1821 {
1822     auto queue = std::make_shared<EventQueueBase>();
1823     EXPECT_NE(queue, nullptr);
1824     queue->RemoveOrphan();
1825 }
1826 
1827 /*
1828  * @tc.name: Remove
1829  * @tc.desc: Remove test
1830  * @tc.type: FUNC
1831  */
1832 HWTEST_F(LibEventHandlerEventQueueTest, Remove001, TestSize.Level1)
1833 {
1834     auto queue = std::make_shared<EventQueueBase>();
1835     EXPECT_NE(queue, nullptr);
1836     std::shared_ptr<EventHandler> owner = nullptr;
1837     queue->Remove(owner);
1838     queue->Remove(owner, 0);
1839     queue->Remove(owner, 0, 0);
1840     queue->Remove(owner, "test");
1841 
1842     auto runner = EventRunner::Create(true);
1843     owner = std::make_shared<EventHandler>(runner);
1844     queue->Remove(owner, "");
1845 }
1846 
1847 /*
1848  * @tc.name: DumpCurrentQueuesize
1849  * @tc.desc: DumpCurrentQueuesize test
1850  * @tc.type: FUNC
1851  */
1852 HWTEST_F(LibEventHandlerEventQueueTest, DumpCurrentQueuesize001, TestSize.Level1)
1853 {
1854     auto queue = std::make_shared<EventQueueBase>();
1855     EXPECT_NE(queue, nullptr);
1856     std::string result = queue->DumpCurrentQueueSize();
1857     EXPECT_NE(result, "");
1858 }
1859 
1860 /*
1861  * @tc.name: CheckFileDescriptorEvent
1862  * @tc.desc: CheckFileDescriptorEvent test
1863  * @tc.type: FUNC
1864  */
1865 HWTEST_F(LibEventHandlerEventQueueTest, CheckFileDescriptorEvent001, TestSize.Level1)
1866 {
1867     auto queue = std::make_shared<EventQueueBase>();
1868     EXPECT_NE(queue, nullptr);
1869     queue->CheckFileDescriptorEvent();
1870 }
1871 
1872 /*
1873  * @tc.name: HasPreferEvent
1874  * @tc.desc: HasPreferEvent test
1875  * @tc.type: FUNC
1876  */
1877 HWTEST_F(LibEventHandlerEventQueueTest, HasPreferEvent001, TestSize.Level1)
1878 {
1879     /**
1880      * @tc.setup: prepare queue.
1881      */
1882     EventQueueBase queue;
1883     queue.Prepare();
1884 
1885     /**
1886      * @tc.steps: step1. first insert MAX_HIGH_PRIORITY_COUNT high priority events, then insert two low priority events.
1887      */
1888     for (uint32_t eventId = 0; eventId < MAX_HIGH_PRIORITY_COUNT + 1; eventId++) {
1889         auto event = InnerEvent::Get(eventId);
1890         auto now = InnerEvent::Clock::now();
1891         event->SetSendTime(now);
1892         event->SetHandleTime(now);
1893         queue.Insert(event, EventQueue::Priority::HIGH);
1894     }
1895 
1896     /**
1897      * @tc.steps: step2. check whether there are higher priority than HIGH in event queue
1898      * @tc.expected: step2. return false.
1899      */
1900     bool hasPreferEvent1 = queue.HasPreferEvent(static_cast<int>(EventQueue::Priority::HIGH));
1901     EXPECT_FALSE(hasPreferEvent1);
1902     bool hasPreferEvent2 = queue.HasPreferEvent(static_cast<int>(EventQueue::Priority::IMMEDIATE));
1903     EXPECT_FALSE(hasPreferEvent2);
1904 }
1905 
1906 /*
1907  * @tc.name: HasPreferEvent
1908  * @tc.desc: HasPreferEvent test
1909  * @tc.type: FUNC
1910  */
1911 HWTEST_F(LibEventHandlerEventQueueTest, HasPreferEvent002, TestSize.Level1)
1912 {
1913     /**
1914      * @tc.setup: prepare queue.
1915      */
1916     EventQueueBase queue;
1917     queue.Prepare();
1918 
1919     /**
1920      * @tc.steps: step1. first insert MAX_HIGH_PRIORITY_COUNT high priority events, then insert two low priority events.
1921      */
1922     for (uint32_t eventId = 0; eventId < MAX_HIGH_PRIORITY_COUNT + 1; eventId++) {
1923         auto event = InnerEvent::Get(eventId);
1924         auto now = InnerEvent::Clock::now();
1925         event->SetSendTime(now);
1926         event->SetHandleTime(now);
1927         queue.Insert(event, EventQueue::Priority::HIGH);
1928     }
1929 
1930     /**
1931      * @tc.steps: step2. check whether there are higher priority than LOW in event queue
1932      * @tc.expected: step2. return true.
1933      */
1934     bool hasPreferEvent = queue.HasPreferEvent(static_cast<int>(EventQueue::Priority::LOW));
1935     EXPECT_TRUE(hasPreferEvent);
1936 }
1937 
1938 /*
1939  * @tc.name: TransferInnerPriority_001
1940  * @tc.desc: TransferInnerPriority_001 test
1941  * @tc.type: FUNC
1942  */
1943 HWTEST_F(LibEventHandlerEventQueueTest, TransferInnerPriority_001, TestSize.Level1)
1944 {
1945     /**
1946      * @tc.setup: prepare queue.
1947      */
1948     EventQueueFFRT queue;
1949     queue.Prepare();
1950 
1951     InnerEvent::Pointer event(nullptr, nullptr);
1952     EventQueue::Priority priority;
1953     EventInsertType insertType;
1954     priority = EventQueue::Priority::VIP;
1955     insertType = EventInsertType::AT_END;
1956     queue.Insert(event, priority, insertType);
1957     queue.InsertSyncEvent(event, priority, insertType);
1958     queue.RemoveAll();
1959     std::shared_ptr<EventHandler> owner = nullptr;
1960     queue.Remove(owner);
1961     queue.Remove(owner, 0);
1962     queue.Remove(owner, 0, 0);
1963     queue.Remove(owner, "test");
1964     uint32_t eventId = 0;
1965     int64_t param = 0;
1966     bool re = queue.HasInnerEvent(owner, eventId);
1967     EXPECT_EQ(re, false);
1968     bool re2 = queue.HasInnerEvent(owner, param);
1969     EXPECT_EQ(re2, false);
1970     DumpTest dumper;
1971     queue.Dump(dumper);
1972     std::string queueInfo;
1973     queue.DumpQueueInfo(queueInfo);
1974     bool re3 = queue.IsIdle();
1975     EXPECT_EQ(re3, true);
1976     bool re4 = queue.IsQueueEmpty();
1977     EXPECT_EQ(re4, true);
1978     std::string re5 = queue.DumpCurrentQueueSize();
1979     EXPECT_NE(re5, "test");
1980     int re6 = queue.HasPreferEvent(1);
1981     EXPECT_EQ(re6, false);
1982     queue.GetFfrtQueue();
1983 }
1984 
1985 /*
1986  * @tc.name: ObserverGc_001
1987  * @tc.desc: ObserverGc_001 test
1988  * @tc.type: FUNC
1989  */
1990 HWTEST_F(LibEventHandlerEventQueueTest, ObserverGc_001, TestSize.Level1)
1991 {
1992     /**
1993      * @tc.setup: prepare queue.
1994      */
1995     EventQueueBase queue;
1996     queue.Prepare();
1997     auto callback = [this]([[maybe_unused]]EventRunnerStage stage,
__anon68462b171402([[maybe_unused]]EventRunnerStage stage, [[maybe_unused]]const StageInfo* info) 1998         [[maybe_unused]]const StageInfo* info) -> int {
1999         return 0;
2000     };
2001     queue.AddObserver(Observer::ARKTS_GC, 1<<2, callback);
2002 }
2003 
2004 /*
2005  * @tc.name: ObserverGc_002
2006  * @tc.desc: ObserverGc_002 test
2007  * @tc.type: FUNC
2008  */
2009 HWTEST_F(LibEventHandlerEventQueueTest, ObserverGc_002, TestSize.Level1)
2010 {
2011     /**
2012      * @tc.setup: prepare queue.
2013      */
2014     EventQueueBase queue;
2015     queue.Prepare();
2016     queue.AddObserver(Observer::ARKTS_GC, 1<<2, nullptr);
2017     auto now = InnerEvent::Clock::now();
2018     queue.TryExecuteObserverCallback(now, EventRunnerStage::STAGE_BEFORE_WAITING);
2019     queue.TryExecuteObserverCallback(now, EventRunnerStage::STAGE_AFTER_WAITING);
2020 }
2021 
2022 /*
2023  * @tc.name: ObserverGc_003
2024  * @tc.desc: ObserverGc_003 test
2025  * @tc.type: FUNC
2026  */
2027 HWTEST_F(LibEventHandlerEventQueueTest, ObserverGc_003, TestSize.Level1)
2028 {
2029     /**
2030      * @tc.setup: prepare queue.
2031      */
2032     EventQueueBase queue;
2033     queue.Prepare();
2034     auto callback = [this]([[maybe_unused]]EventRunnerStage stage,
__anon68462b171502([[maybe_unused]]EventRunnerStage stage, [[maybe_unused]]const StageInfo* info) 2035         [[maybe_unused]]const StageInfo* info) -> int {
2036         return 0;
2037     };
2038     queue.AddObserver(Observer::ARKTS_GC, 1<<1, callback);
2039     auto now = InnerEvent::Clock::now();
2040     queue.TryExecuteObserverCallback(now, EventRunnerStage::STAGE_BEFORE_WAITING);
2041     queue.TryExecuteObserverCallback(now, EventRunnerStage::STAGE_AFTER_WAITING);
2042 }
2043 
2044 /*
2045  * @tc.name: ObserverGc_004
2046  * @tc.desc: ObserverGc_004 test
2047  * @tc.type: FUNC
2048  */
2049 HWTEST_F(LibEventHandlerEventQueueTest, ObserverGc_004, TestSize.Level1)
2050 {
2051     /**
2052      * @tc.setup: prepare queue.
2053      */
2054     EventQueueBase queue;
2055     queue.Prepare();
2056     auto callback = [this]([[maybe_unused]]EventRunnerStage stage,
__anon68462b171602([[maybe_unused]]EventRunnerStage stage, [[maybe_unused]]const StageInfo* info) 2057         [[maybe_unused]]const StageInfo* info) -> int {
2058         return 1;
2059     };
2060     queue.AddObserver(Observer::ARKTS_GC, 1<<2, callback);
2061     auto now = InnerEvent::Clock::now();
2062     queue.TryExecuteObserverCallback(now, EventRunnerStage::STAGE_BEFORE_WAITING);
2063     queue.TryExecuteObserverCallback(now, EventRunnerStage::STAGE_AFTER_WAITING);
2064 }