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