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,
70                                     std::chrono::milliseconds timeout)
71 {
72     return waitForFuture(getFuture(name), timeout);
73 }
74 
75 std::future<bool> DbusEnvironment::getFuture(std::string_view name)
76 {
77     auto& data = futures[std::string(name)];
78     auto it = data.begin();
79 
80     if (it != data.end())
81     {
82         auto result = std::move(*it);
83         data.erase(it);
84         return result;
85     }
86 
87     return {};
88 }
89 
90 void DbusEnvironment::sleepFor(std::chrono::milliseconds timeout)
91 {
92     auto end = std::chrono::high_resolution_clock::now() + timeout;
93 
94     while (std::chrono::high_resolution_clock::now() < end)
95     {
96         synchronizeIoc();
97         std::this_thread::yield();
98     }
99 
100     synchronizeIoc();
101 }
102 
103 std::chrono::milliseconds
104     DbusEnvironment::measureTime(std::function<void()> fun)
105 {
106     auto begin = std::chrono::high_resolution_clock::now();
107     fun();
108     auto end = std::chrono::high_resolution_clock::now();
109 
110     return std::chrono::duration_cast<std::chrono::milliseconds>(end - begin);
111 }
112 
113 boost::asio::io_context DbusEnvironment::ioc;
114 std::shared_ptr<sdbusplus::asio::connection> DbusEnvironment::bus;
115 std::shared_ptr<sdbusplus::asio::object_server> DbusEnvironment::objServer;
116 std::map<std::string, std::vector<std::future<bool>>> DbusEnvironment::futures;
117 bool DbusEnvironment::setUp = false;
118