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