| Krzysztof Grobelny | b564594 | 2020-09-29 11:52:45 +0200 | [diff] [blame] | 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>>(); | 
| Wludzik, Jozef | b1ff1f6 | 2020-10-23 13:20:52 +0200 | [diff] [blame] | 65 | futures[std::string(name)].emplace_back(promise->get_future()); | 
| Krzysztof Grobelny | b564594 | 2020-09-29 11:52:45 +0200 | [diff] [blame] | 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 | { | 
| Krzysztof Grobelny | f32f6fe | 2020-10-30 13:51:58 +0100 | [diff] [blame] | 72 | return waitForFuture(getFuture(name), timeout); | 
| Krzysztof Grobelny | b564594 | 2020-09-29 11:52:45 +0200 | [diff] [blame] | 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; |