blob: e483fe799221bec23e3611762ae721166362f303 [file] [log] [blame]
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +02001#include <sdbusplus/asio/object_server.hpp>
Wludzik, Jozef2f9f9b82020-10-13 09:07:45 +02002#include <sdbusplus/asio/property.hpp>
Krzysztof Grobelnyb5645942020-09-29 11:52:45 +02003
4#include <future>
5#include <thread>
6
7#include <gmock/gmock.h>
8
9class DbusEnvironment : public ::testing::Environment
10{
11 public:
12 ~DbusEnvironment();
13
14 void SetUp() override;
15 void TearDown() override;
16 void teardown();
17
18 static boost::asio::io_context& getIoc();
19 static std::shared_ptr<sdbusplus::asio::connection> getBus();
20 static std::shared_ptr<sdbusplus::asio::object_server> getObjServer();
21 static const char* serviceName();
22 static std::function<void()> setPromise(std::string_view name);
23 static void sleepFor(std::chrono::milliseconds);
24 static std::chrono::milliseconds measureTime(std::function<void()>);
25
26 static void synchronizeIoc()
27 {
28 while (ioc.poll() > 0)
29 {
30 }
31 }
32
33 template <class Functor>
34 static void synchronizedPost(Functor&& functor)
35 {
36 boost::asio::post(ioc, std::forward<Functor>(functor));
37 synchronizeIoc();
38 }
39
40 template <class T>
41 static std::optional<T> waitForFuture(
42 std::future<T> future,
43 std::chrono::milliseconds timeout = std::chrono::seconds(10))
44 {
45 constexpr auto precission = std::chrono::milliseconds(10);
46 auto elapsed = std::chrono::milliseconds(0);
47
48 while (future.valid() && elapsed < timeout)
49 {
50 synchronizeIoc();
51
52 try
53 {
54 if (future.wait_for(precission) == std::future_status::ready)
55 {
56 return future.get();
57 }
58 else
59 {
60 elapsed += precission;
61 }
62 }
63 catch (const std::future_error& e)
64 {
65 std::cerr << e.what() << "\n";
66 return {};
67 }
68 }
69
70 return {};
71 }
72
73 static bool waitForFuture(
74 std::string_view name,
75 std::chrono::milliseconds timeout = std::chrono::seconds(10));
76
77 private:
78 static std::future<bool> getFuture(std::string_view name);
79
80 static boost::asio::io_context ioc;
81 static std::shared_ptr<sdbusplus::asio::connection> bus;
82 static std::shared_ptr<sdbusplus::asio::object_server> objServer;
83 static std::map<std::string, std::vector<std::future<bool>>> futures;
84 static bool setUp;
85};