1*472b7022SWilliam A. Kennington III #include <sdbusplus/bus.hpp> 2*472b7022SWilliam A. Kennington III #include <sdbusplus/message.hpp> 3*472b7022SWilliam A. Kennington III 4*472b7022SWilliam A. Kennington III #include <chrono> 5*472b7022SWilliam A. Kennington III #include <string> 6*472b7022SWilliam A. Kennington III 7*472b7022SWilliam A. Kennington III #include <gtest/gtest.h> 8*472b7022SWilliam A. Kennington III 9*472b7022SWilliam A. Kennington III namespace sdbusplus 10*472b7022SWilliam A. Kennington III { 11*472b7022SWilliam A. Kennington III namespace message 12*472b7022SWilliam A. Kennington III { 13*472b7022SWilliam A. Kennington III 14*472b7022SWilliam A. Kennington III using namespace std::literals::chrono_literals; 15*472b7022SWilliam A. Kennington III 16*472b7022SWilliam A. Kennington III std::string globalId; 17*472b7022SWilliam A. Kennington III 18*472b7022SWilliam A. Kennington III void setGlobalId(message&& m) 19*472b7022SWilliam A. Kennington III { 20*472b7022SWilliam A. Kennington III m.read(globalId); 21*472b7022SWilliam A. Kennington III } 22*472b7022SWilliam A. Kennington III 23*472b7022SWilliam A. Kennington III message newBusIdReq(bus::bus& b) 24*472b7022SWilliam A. Kennington III { 25*472b7022SWilliam A. Kennington III return b.new_method_call("org.freedesktop.DBus", "/org/freedesktop/DBus", 26*472b7022SWilliam A. Kennington III "org.freedesktop.DBus", "GetId"); 27*472b7022SWilliam A. Kennington III } 28*472b7022SWilliam A. Kennington III 29*472b7022SWilliam A. Kennington III std::string syncBusId(bus::bus& b) 30*472b7022SWilliam A. Kennington III { 31*472b7022SWilliam A. Kennington III std::string ret; 32*472b7022SWilliam A. Kennington III newBusIdReq(b).call().read(ret); 33*472b7022SWilliam A. Kennington III return ret; 34*472b7022SWilliam A. Kennington III } 35*472b7022SWilliam A. Kennington III 36*472b7022SWilliam A. Kennington III TEST(CallAsync, Function) 37*472b7022SWilliam A. Kennington III { 38*472b7022SWilliam A. Kennington III auto b = bus::new_default(); 39*472b7022SWilliam A. Kennington III globalId = ""; 40*472b7022SWilliam A. Kennington III while (b.process_discard()) 41*472b7022SWilliam A. Kennington III ; 42*472b7022SWilliam A. Kennington III auto slot = newBusIdReq(b).call_async(setGlobalId); 43*472b7022SWilliam A. Kennington III b.wait(1s); 44*472b7022SWilliam A. Kennington III b.process_discard(); 45*472b7022SWilliam A. Kennington III EXPECT_EQ(syncBusId(b), globalId); 46*472b7022SWilliam A. Kennington III } 47*472b7022SWilliam A. Kennington III 48*472b7022SWilliam A. Kennington III TEST(CallAsync, FunctionPointer) 49*472b7022SWilliam A. Kennington III { 50*472b7022SWilliam A. Kennington III auto b = bus::new_default(); 51*472b7022SWilliam A. Kennington III globalId = ""; 52*472b7022SWilliam A. Kennington III while (b.process_discard()) 53*472b7022SWilliam A. Kennington III ; 54*472b7022SWilliam A. Kennington III auto slot = newBusIdReq(b).call_async(&setGlobalId); 55*472b7022SWilliam A. Kennington III b.wait(1s); 56*472b7022SWilliam A. Kennington III b.process_discard(); 57*472b7022SWilliam A. Kennington III EXPECT_EQ(syncBusId(b), globalId); 58*472b7022SWilliam A. Kennington III } 59*472b7022SWilliam A. Kennington III 60*472b7022SWilliam A. Kennington III TEST(CallAsync, Lambda) 61*472b7022SWilliam A. Kennington III { 62*472b7022SWilliam A. Kennington III auto b = bus::new_default(); 63*472b7022SWilliam A. Kennington III std::string id; 64*472b7022SWilliam A. Kennington III while (b.process_discard()) 65*472b7022SWilliam A. Kennington III ; 66*472b7022SWilliam A. Kennington III auto slot = newBusIdReq(b).call_async([&](message&& m) { m.read(id); }); 67*472b7022SWilliam A. Kennington III b.wait(1s); 68*472b7022SWilliam A. Kennington III b.process_discard(); 69*472b7022SWilliam A. Kennington III EXPECT_EQ(syncBusId(b), id); 70*472b7022SWilliam A. Kennington III } 71*472b7022SWilliam A. Kennington III 72*472b7022SWilliam A. Kennington III TEST(CallAsync, SlotDrop) 73*472b7022SWilliam A. Kennington III { 74*472b7022SWilliam A. Kennington III auto b = bus::new_default(); 75*472b7022SWilliam A. Kennington III globalId = ""; 76*472b7022SWilliam A. Kennington III while (b.process_discard()) 77*472b7022SWilliam A. Kennington III ; 78*472b7022SWilliam A. Kennington III { 79*472b7022SWilliam A. Kennington III auto slot = newBusIdReq(b).call_async(setGlobalId); 80*472b7022SWilliam A. Kennington III } 81*472b7022SWilliam A. Kennington III b.wait(1s); 82*472b7022SWilliam A. Kennington III b.process_discard(); 83*472b7022SWilliam A. Kennington III EXPECT_EQ("", globalId); 84*472b7022SWilliam A. Kennington III } 85*472b7022SWilliam A. Kennington III 86*472b7022SWilliam A. Kennington III TEST(CallAsync, ExceptionCaught) 87*472b7022SWilliam A. Kennington III { 88*472b7022SWilliam A. Kennington III EXPECT_DEATH( 89*472b7022SWilliam A. Kennington III [] { 90*472b7022SWilliam A. Kennington III auto b = bus::new_bus(); 91*472b7022SWilliam A. Kennington III while (b.process_discard()) 92*472b7022SWilliam A. Kennington III ; 93*472b7022SWilliam A. Kennington III auto slot = newBusIdReq(b).call_async( 94*472b7022SWilliam A. Kennington III [&](message&&) { throw std::runtime_error("testerror"); }); 95*472b7022SWilliam A. Kennington III b.wait(1s); 96*472b7022SWilliam A. Kennington III b.process_discard(); 97*472b7022SWilliam A. Kennington III }(), 98*472b7022SWilliam A. Kennington III "testerror"); 99*472b7022SWilliam A. Kennington III } 100*472b7022SWilliam A. Kennington III 101*472b7022SWilliam A. Kennington III } // namespace message 102*472b7022SWilliam A. Kennington III } // namespace sdbusplus 103