#include #include #include #include #include namespace sdbusplus { namespace message { using namespace std::literals::chrono_literals; std::string globalId; void setGlobalId(message&& m) { m.read(globalId); } message newBusIdReq(bus::bus& b) { return b.new_method_call("org.freedesktop.DBus", "/org/freedesktop/DBus", "org.freedesktop.DBus", "GetId"); } std::string syncBusId(bus::bus& b) { std::string ret; newBusIdReq(b).call().read(ret); return ret; } TEST(CallAsync, Function) { auto b = bus::new_default(); globalId = ""; while (b.process_discard()) ; auto slot = newBusIdReq(b).call_async(setGlobalId); b.wait(1s); b.process_discard(); EXPECT_EQ(syncBusId(b), globalId); } TEST(CallAsync, FunctionPointer) { auto b = bus::new_default(); globalId = ""; while (b.process_discard()) ; auto slot = newBusIdReq(b).call_async(&setGlobalId); b.wait(1s); b.process_discard(); EXPECT_EQ(syncBusId(b), globalId); } TEST(CallAsync, Lambda) { auto b = bus::new_default(); std::string id; while (b.process_discard()) ; auto slot = newBusIdReq(b).call_async([&](message&& m) { m.read(id); }); b.wait(1s); b.process_discard(); EXPECT_EQ(syncBusId(b), id); } TEST(CallAsync, SlotDrop) { auto b = bus::new_default(); globalId = ""; while (b.process_discard()) ; { auto slot = newBusIdReq(b).call_async(setGlobalId); } b.wait(1s); b.process_discard(); EXPECT_EQ("", globalId); } TEST(CallAsync, ExceptionCaught) { EXPECT_DEATH( [] { auto b = bus::new_bus(); while (b.process_discard()) ; auto slot = newBusIdReq(b).call_async( [&](message&&) { throw std::runtime_error("testerror"); }); b.wait(1s); b.process_discard(); }(), "testerror"); } } // namespace message } // namespace sdbusplus