xref: /openbmc/telemetry/tests/src/dbus_environment.cpp (revision 51f0fd501f4b772533271d15cb27d396186a7192)
1 #include "dbus_environment.hpp"
2 
3 #include <future>
4 #include <thread>
5 
6 DbusEnvironment::~DbusEnvironment()
7 {
8     teardown();
9 }
10 
11 void DbusEnvironment::SetUp()
12 {
13     if (setUp == false)
14     {
15         setUp = true;
16 
17         bus = std::make_shared<sdbusplus::asio::connection>(ioc);
18         bus->request_name(serviceName());
19 
20         objServer = std::make_unique<sdbusplus::asio::object_server>(bus);
21     }
22 }
23 
24 void DbusEnvironment::TearDown()
25 {
26     ioc.poll();
27 
28     futures.clear();
29 }
30 
31 void DbusEnvironment::teardown()
32 {
33     if (setUp == true)
34     {
35         setUp = false;
36 
37         objServer = nullptr;
38         bus = nullptr;
39     }
40 }
41 
42 boost::asio::io_context& DbusEnvironment::getIoc()
43 {
44     return ioc;
45 }
46 
47 std::shared_ptr<sdbusplus::asio::connection> DbusEnvironment::getBus()
48 {
49     return bus;
50 }
51 
52 std::shared_ptr<sdbusplus::asio::object_server> DbusEnvironment::getObjServer()
53 {
54     return objServer;
55 }
56 
57 const char* DbusEnvironment::serviceName()
58 {
59     return "telemetry.ut";
60 }
61 
62 std::function<void()> DbusEnvironment::setPromise(std::string_view name)
63 {
64     auto promise = std::make_shared<std::promise<bool>>();
65     futures[std::string(name)].emplace_back(promise->get_future());
66     return [p = std::move(promise)]() { p->set_value(true); };
67 }
68 
69 bool DbusEnvironment::waitForFuture(std::string_view name, Milliseconds timeout)
70 {
71     return waitForFuture(getFuture(name), timeout);
72 }
73 
74 bool DbusEnvironment::waitForFutures(std::string_view name,
75                                      Milliseconds timeout)
76 {
77     auto& data = futures[std::string(name)];
78     auto ret = waitForFutures(
79         std::move(data), true, [](auto sum, auto val) { return sum && val; },
80         timeout);
81     data = std::vector<std::future<bool>>{};
82     return ret;
83 }
84 
85 std::future<bool> DbusEnvironment::getFuture(std::string_view name)
86 {
87     auto& data = futures[std::string(name)];
88     auto it = data.begin();
89 
90     if (it != data.end())
91     {
92         auto result = std::move(*it);
93         data.erase(it);
94         return result;
95     }
96 
97     return {};
98 }
99 
100 void DbusEnvironment::sleepFor(Milliseconds timeout)
101 {
102     auto end = std::chrono::high_resolution_clock::now() + timeout;
103 
104     while (std::chrono::high_resolution_clock::now() < end)
105     {
106         synchronizeIoc();
107         std::this_thread::yield();
108     }
109 
110     synchronizeIoc();
111 }
112 
113 Milliseconds DbusEnvironment::measureTime(std::function<void()> fun)
114 {
115     auto begin = std::chrono::high_resolution_clock::now();
116     fun();
117     auto end = std::chrono::high_resolution_clock::now();
118 
119     return std::chrono::duration_cast<Milliseconds>(end - begin);
120 }
121 
122 boost::asio::io_context DbusEnvironment::ioc;
123 std::shared_ptr<sdbusplus::asio::connection> DbusEnvironment::bus;
124 std::shared_ptr<sdbusplus::asio::object_server> DbusEnvironment::objServer;
125 std::map<std::string, std::vector<std::future<bool>>> DbusEnvironment::futures;
126 bool DbusEnvironment::setUp = false;
127