blob: bfe347ceb74dc87e12778afd691cd6f6341fe1a6 [file] [log] [blame]
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +02001#include "dbus_environment.hpp"
2
Szymon Dompke1cdd7e42022-06-08 14:43:13 +02003#include "helpers.hpp"
4
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +02005#include <future>
6#include <thread>
7
8DbusEnvironment::~DbusEnvironment()
9{
Michal Orzel95f77e62024-09-16 11:06:42 +020010 if (setUp == true)
11 {
12 setUp = false;
13
14 objServer = nullptr;
15 bus = nullptr;
16 }
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020017}
18
19void DbusEnvironment::SetUp()
20{
21 if (setUp == false)
22 {
23 setUp = true;
24
25 bus = std::make_shared<sdbusplus::asio::connection>(ioc);
26 bus->request_name(serviceName());
27
28 objServer = std::make_unique<sdbusplus::asio::object_server>(bus);
29 }
30}
31
32void DbusEnvironment::TearDown()
33{
34 ioc.poll();
35
36 futures.clear();
37}
38
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020039boost::asio::io_context& DbusEnvironment::getIoc()
40{
41 return ioc;
42}
43
44std::shared_ptr<sdbusplus::asio::connection> DbusEnvironment::getBus()
45{
46 return bus;
47}
48
49std::shared_ptr<sdbusplus::asio::object_server> DbusEnvironment::getObjServer()
50{
51 return objServer;
52}
53
54const char* DbusEnvironment::serviceName()
55{
56 return "telemetry.ut";
57}
58
59std::function<void()> DbusEnvironment::setPromise(std::string_view name)
60{
61 auto promise = std::make_shared<std::promise<bool>>();
Wludzik, Jozefb1ff1f62020-10-23 13:20:52 +020062 futures[std::string(name)].emplace_back(promise->get_future());
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020063 return [p = std::move(promise)]() { p->set_value(true); };
64}
65
Krzysztof Grobelny80697712021-03-04 09:49:27 +000066bool DbusEnvironment::waitForFuture(std::string_view name, Milliseconds timeout)
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020067{
Krzysztof Grobelnyf32f6fe2020-10-30 13:51:58 +010068 return waitForFuture(getFuture(name), timeout);
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020069}
70
Szymon Dompkef763c9e2021-03-12 09:19:22 +010071bool DbusEnvironment::waitForFutures(std::string_view name,
Krzysztof Grobelny80697712021-03-04 09:49:27 +000072 Milliseconds timeout)
Szymon Dompkef763c9e2021-03-12 09:19:22 +010073{
74 auto& data = futures[std::string(name)];
Patrick Williamsf535cad2024-08-16 15:21:20 -040075 auto ret = waitForFutures(std::move(data), true, [](auto sum, auto val) {
76 return sum && val;
77 }, timeout);
Szymon Dompkef763c9e2021-03-12 09:19:22 +010078 data = std::vector<std::future<bool>>{};
79 return ret;
80}
81
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020082std::future<bool> DbusEnvironment::getFuture(std::string_view name)
83{
84 auto& data = futures[std::string(name)];
85 auto it = data.begin();
86
87 if (it != data.end())
88 {
89 auto result = std::move(*it);
90 data.erase(it);
91 return result;
92 }
93
94 return {};
95}
96
Krzysztof Grobelny80697712021-03-04 09:49:27 +000097void DbusEnvironment::sleepFor(Milliseconds timeout)
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +020098{
99 auto end = std::chrono::high_resolution_clock::now() + timeout;
100
101 while (std::chrono::high_resolution_clock::now() < end)
102 {
103 synchronizeIoc();
104 std::this_thread::yield();
105 }
106
107 synchronizeIoc();
108}
109
Krzysztof Grobelny80697712021-03-04 09:49:27 +0000110Milliseconds DbusEnvironment::measureTime(std::function<void()> fun)
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200111{
112 auto begin = std::chrono::high_resolution_clock::now();
113 fun();
114 auto end = std::chrono::high_resolution_clock::now();
115
Krzysztof Grobelny80697712021-03-04 09:49:27 +0000116 return std::chrono::duration_cast<Milliseconds>(end - begin);
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +0200117}
118
119boost::asio::io_context DbusEnvironment::ioc;
120std::shared_ptr<sdbusplus::asio::connection> DbusEnvironment::bus;
121std::shared_ptr<sdbusplus::asio::object_server> DbusEnvironment::objServer;
122std::map<std::string, std::vector<std::future<bool>>> DbusEnvironment::futures;
123bool DbusEnvironment::setUp = false;