| #include <sdbusplus/bus.hpp> |
| #include <sdbusplus/message.hpp> |
| |
| #include <chrono> |
| #include <string> |
| |
| #include <gtest/gtest.h> |
| |
| 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 |