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 }