xref: /openbmc/sdbusplus/test/message/call.cpp (revision 472b7022)
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