2 * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
10 #include "base/AsyncCallQueue.h"
13 #include "tests/testEvent.h"
14 #include "unitTestMain.h"
16 CPPUNIT_TEST_SUITE_REGISTRATION( testEvent
);
18 /* init legacy static-initialized modules */
27 * Test creating a Scheduler
30 testEvent::testCreate()
32 EventScheduler scheduler
= EventScheduler();
35 /// Helper for tests - an event which records the number of calls it received
39 static void Handler(void *data
) {
40 static_cast<CalledEvent
*>(data
)->calls
++;
46 /* submit two callbacks, and cancel one, then dispatch and only the other should run.
49 testEvent::testCancel()
51 EventScheduler scheduler
;
53 CalledEvent event_to_cancel
;
54 scheduler
.schedule("test event", CalledEvent::Handler
, &event
, 0, 0, false);
55 scheduler
.schedule("test event2", CalledEvent::Handler
, &event_to_cancel
, 0, 0, false);
56 scheduler
.cancel(CalledEvent::Handler
, &event_to_cancel
);
57 scheduler
.checkEvents(0);
58 AsyncCallQueue::Instance().fire();
59 CPPUNIT_ASSERT_EQUAL(1, event
.calls
);
60 CPPUNIT_ASSERT_EQUAL(0, event_to_cancel
.calls
);
63 // submit two callbacks, and then dump the queue.
67 EventScheduler scheduler
;
70 const char *expected
= "Last event to run: last event\n"
72 "Operation \tNext Execution \tWeight\tCallback Valid?\n"
73 "test event \t0.000 sec\t 0\t N/A\n"
74 "test event2 \t0.000 sec\t 0\t N/A\n";
77 expect
.append(expected
, strlen(expected
));
79 scheduler
.schedule("last event", CalledEvent::Handler
, &event
, 0, 0, false);
81 /* schedule and dispatch to set the last run event */
82 scheduler
.checkEvents(0);
83 AsyncCallQueue::Instance().fire();
84 scheduler
.schedule("test event", CalledEvent::Handler
, &event
, 0, 0, false);
85 scheduler
.schedule("test event2", CalledEvent::Handler
, &event2
, 0, 0, false);
89 scheduler
.dump(&result
);
91 /* loop over the strings, showing exactly where they differ (if at all) */
92 printf("Actual Text:\n");
93 /* TODO: these should really be just [] lookups, but String doesn't have those here yet. */
94 for (size_t i
= 0; i
< size_t(result
.contentSize()); ++i
) {
95 CPPUNIT_ASSERT(expect
.content()[i
]);
96 CPPUNIT_ASSERT(result
.content()[i
]);
98 /* slight hack to make special chars visible */
99 switch (result
.content()[i
]) {
104 printf("%c", result
.content()[i
]);
106 /* make this an int comparison, so that we can see the ASCII code at failure */
107 CPPUNIT_ASSERT_EQUAL(int(expect
.content()[i
]), int(result
.content()[i
]));
110 CPPUNIT_ASSERT_EQUAL(expect
.contentSize(), result
.contentSize());
111 CPPUNIT_ASSERT(strcmp(expect
.content(), result
.content()) == 0);
114 /* submit two callbacks, and find the right one.
117 testEvent::testFind()
119 EventScheduler scheduler
;
121 CalledEvent event_to_find
;
122 scheduler
.schedule("test event", CalledEvent::Handler
, &event
, 0, 0, false);
123 scheduler
.schedule("test event2", CalledEvent::Handler
, &event_to_find
, 0, 0, false);
124 CPPUNIT_ASSERT_EQUAL(true, scheduler
.find(CalledEvent::Handler
, &event_to_find
));
127 /* do a trivial test of invoking callbacks */
129 testEvent::testCheckEvents()
131 EventScheduler scheduler
;
133 /* with no events, its an idle engine */
134 CPPUNIT_ASSERT_EQUAL(int(AsyncEngine::EVENT_IDLE
), scheduler
.checkEvents(0));
135 /* event running now gets will get sent to the dispatcher and the
136 * engine becomes idle.
138 scheduler
.schedule("test event", CalledEvent::Handler
, &event
, 0, 0, false);
139 CPPUNIT_ASSERT_EQUAL(int(AsyncEngine::EVENT_IDLE
), scheduler
.checkEvents(0));
140 AsyncCallQueue::Instance().fire();
141 /* event running later results in a delay of the time till it runs */
142 scheduler
.schedule("test event", CalledEvent::Handler
, &event
, 2, 0, false);
143 CPPUNIT_ASSERT_EQUAL(2000, scheduler
.checkEvents(0));
144 AsyncCallQueue::Instance().fire();
145 CPPUNIT_ASSERT_EQUAL(1, event
.calls
);
148 /* for convenience we have a singleton scheduler */
150 testEvent::testSingleton()
152 EventScheduler
*scheduler
= dynamic_cast<EventScheduler
*>(EventScheduler::GetInstance());
153 CPPUNIT_ASSERT(nullptr != scheduler
);