xref: /openbmc/sdbusplus/test/event/event.cpp (revision 6ea246af)
1d2b00440SPatrick Williams #include <sdbusplus/event.hpp>
2d2b00440SPatrick Williams 
3d2b00440SPatrick Williams #include <chrono>
4d2b00440SPatrick Williams #include <thread>
5d2b00440SPatrick Williams 
6d2b00440SPatrick Williams #include <gtest/gtest.h>
7d2b00440SPatrick Williams 
8d2b00440SPatrick Williams using namespace std::literals::chrono_literals;
9d2b00440SPatrick Williams 
10d2b00440SPatrick Williams struct Event : public testing::Test
11d2b00440SPatrick Williams {
12d2b00440SPatrick Williams     sdbusplus::event_t ev{};
13d2b00440SPatrick Williams };
14d2b00440SPatrick Williams 
TEST_F(Event,TimeoutWorks)15d2b00440SPatrick Williams TEST_F(Event, TimeoutWorks)
16d2b00440SPatrick Williams {
17d2b00440SPatrick Williams     static constexpr auto timeout = 250ms;
18d2b00440SPatrick Williams 
19d2b00440SPatrick Williams     auto start = std::chrono::steady_clock::now();
20d2b00440SPatrick Williams     ev.run_one(timeout);
21d2b00440SPatrick Williams     auto stop = std::chrono::steady_clock::now();
22d2b00440SPatrick Williams 
23d2b00440SPatrick Williams     EXPECT_TRUE(stop - start > timeout);
24*6ea246afSPatrick Williams     EXPECT_TRUE(stop - start < timeout * 3);
25d2b00440SPatrick Williams }
26d2b00440SPatrick Williams 
TEST_F(Event,Runnable)27d2b00440SPatrick Williams TEST_F(Event, Runnable)
28d2b00440SPatrick Williams {
29d2b00440SPatrick Williams     static constexpr auto timeout = 10s;
30d2b00440SPatrick Williams 
31d2b00440SPatrick Williams     std::jthread j{[&]() { ev.break_run(); }};
32d2b00440SPatrick Williams 
33d2b00440SPatrick Williams     auto start = std::chrono::steady_clock::now();
34d2b00440SPatrick Williams     ev.run_one(timeout);
35d2b00440SPatrick Williams     auto stop = std::chrono::steady_clock::now();
36d2b00440SPatrick Williams 
37d2b00440SPatrick Williams     EXPECT_TRUE(stop - start < timeout);
38d2b00440SPatrick Williams }
39d2b00440SPatrick Williams 
TEST_F(Event,ConditionSignals)40d2b00440SPatrick Williams TEST_F(Event, ConditionSignals)
41d2b00440SPatrick Williams {
42d2b00440SPatrick Williams     struct run
43d2b00440SPatrick Williams     {
44d2b00440SPatrick Williams         static int _(sd_event_source*, int, uint32_t, void* data)
45d2b00440SPatrick Williams         {
46d2b00440SPatrick Williams             *static_cast<bool*>(data) = true;
47d2b00440SPatrick Williams             return 0;
48d2b00440SPatrick Williams         }
49d2b00440SPatrick Williams     };
50d2b00440SPatrick Williams     bool ran = false;
51d2b00440SPatrick Williams 
52d2b00440SPatrick Williams     auto c = ev.add_condition(run::_, &ran);
53d2b00440SPatrick Williams     std::jthread j{[&]() { c.signal(); }};
54d2b00440SPatrick Williams 
55d2b00440SPatrick Williams     ev.run_one();
56d2b00440SPatrick Williams     EXPECT_TRUE(ran);
57d2b00440SPatrick Williams     c.ack();
58d2b00440SPatrick Williams }
593ce3159bSPatrick Williams 
TEST_F(Event,Timer)603ce3159bSPatrick Williams TEST_F(Event, Timer)
613ce3159bSPatrick Williams {
623ce3159bSPatrick Williams     static constexpr auto timeout = 50ms;
633ce3159bSPatrick Williams 
643ce3159bSPatrick Williams     struct handler
653ce3159bSPatrick Williams     {
663ce3159bSPatrick Williams         static int _(sd_event_source*, uint64_t, void* data)
673ce3159bSPatrick Williams         {
683ce3159bSPatrick Williams             *static_cast<bool*>(data) = true;
693ce3159bSPatrick Williams             return 0;
703ce3159bSPatrick Williams         }
713ce3159bSPatrick Williams     };
723ce3159bSPatrick Williams     bool ran = false;
733ce3159bSPatrick Williams 
743ce3159bSPatrick Williams     auto start = std::chrono::steady_clock::now();
753ce3159bSPatrick Williams     auto c = ev.add_oneshot_timer(handler::_, &ran, timeout);
763ce3159bSPatrick Williams     ev.run_one();
773ce3159bSPatrick Williams     auto stop = std::chrono::steady_clock::now();
783ce3159bSPatrick Williams 
793ce3159bSPatrick Williams     EXPECT_TRUE(ran);
803ce3159bSPatrick Williams     EXPECT_TRUE(stop - start > timeout);
81*6ea246afSPatrick Williams     EXPECT_TRUE(stop - start < timeout * 3);
823ce3159bSPatrick Williams }
83