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