blob: 4780cc52179edad554c3e32ec8dfee5eb85a3e48 [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
75std::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
90void 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
103std::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
113boost::asio::io_context DbusEnvironment::ioc;
114std::shared_ptr<sdbusplus::asio::connection> DbusEnvironment::bus;
115std::shared_ptr<sdbusplus::asio::object_server> DbusEnvironment::objServer;
116std::map<std::string, std::vector<std::future<bool>>> DbusEnvironment::futures;
117bool DbusEnvironment::setUp = false;