xref: /openbmc/sdbusplus/test/message/call.cpp (revision 6db88387)
1472b7022SWilliam A. Kennington III #include <sdbusplus/bus.hpp>
2472b7022SWilliam A. Kennington III #include <sdbusplus/message.hpp>
3472b7022SWilliam A. Kennington III 
4472b7022SWilliam A. Kennington III #include <chrono>
5472b7022SWilliam A. Kennington III #include <string>
6472b7022SWilliam A. Kennington III 
7472b7022SWilliam A. Kennington III #include <gtest/gtest.h>
8472b7022SWilliam A. Kennington III 
9472b7022SWilliam A. Kennington III namespace sdbusplus
10472b7022SWilliam A. Kennington III {
11472b7022SWilliam A. Kennington III namespace message
12472b7022SWilliam A. Kennington III {
13472b7022SWilliam A. Kennington III 
14472b7022SWilliam A. Kennington III using namespace std::literals::chrono_literals;
15472b7022SWilliam A. Kennington III 
16472b7022SWilliam A. Kennington III std::string globalId;
17472b7022SWilliam A. Kennington III 
setGlobalId(message && m)18472b7022SWilliam A. Kennington III void setGlobalId(message&& m)
19472b7022SWilliam A. Kennington III {
20472b7022SWilliam A. Kennington III     m.read(globalId);
21472b7022SWilliam A. Kennington III }
22472b7022SWilliam A. Kennington III 
newBusIdReq(bus_t & b)23*0f282c48SPatrick Williams message newBusIdReq(bus_t& b)
24472b7022SWilliam A. Kennington III {
25472b7022SWilliam A. Kennington III     return b.new_method_call("org.freedesktop.DBus", "/org/freedesktop/DBus",
26472b7022SWilliam A. Kennington III                              "org.freedesktop.DBus", "GetId");
27472b7022SWilliam A. Kennington III }
28472b7022SWilliam A. Kennington III 
syncBusId(bus_t & b)29*0f282c48SPatrick Williams std::string syncBusId(bus_t& b)
30472b7022SWilliam A. Kennington III {
31472b7022SWilliam A. Kennington III     std::string ret;
32472b7022SWilliam A. Kennington III     newBusIdReq(b).call().read(ret);
33472b7022SWilliam A. Kennington III     return ret;
34472b7022SWilliam A. Kennington III }
35472b7022SWilliam A. Kennington III 
TEST(CallAsync,Function)36472b7022SWilliam A. Kennington III TEST(CallAsync, Function)
37472b7022SWilliam A. Kennington III {
38472b7022SWilliam A. Kennington III     auto b = bus::new_default();
39472b7022SWilliam A. Kennington III     globalId = "";
40472b7022SWilliam A. Kennington III     while (b.process_discard())
41472b7022SWilliam A. Kennington III         ;
42472b7022SWilliam A. Kennington III     auto slot = newBusIdReq(b).call_async(setGlobalId);
43472b7022SWilliam A. Kennington III     b.wait(1s);
44472b7022SWilliam A. Kennington III     b.process_discard();
45472b7022SWilliam A. Kennington III     EXPECT_EQ(syncBusId(b), globalId);
46472b7022SWilliam A. Kennington III }
47472b7022SWilliam A. Kennington III 
TEST(CallAsync,FunctionPointer)48472b7022SWilliam A. Kennington III TEST(CallAsync, FunctionPointer)
49472b7022SWilliam A. Kennington III {
50472b7022SWilliam A. Kennington III     auto b = bus::new_default();
51472b7022SWilliam A. Kennington III     globalId = "";
52472b7022SWilliam A. Kennington III     while (b.process_discard())
53472b7022SWilliam A. Kennington III         ;
54472b7022SWilliam A. Kennington III     auto slot = newBusIdReq(b).call_async(&setGlobalId);
55472b7022SWilliam A. Kennington III     b.wait(1s);
56472b7022SWilliam A. Kennington III     b.process_discard();
57472b7022SWilliam A. Kennington III     EXPECT_EQ(syncBusId(b), globalId);
58472b7022SWilliam A. Kennington III }
59472b7022SWilliam A. Kennington III 
TEST(CallAsync,Lambda)60472b7022SWilliam A. Kennington III TEST(CallAsync, Lambda)
61472b7022SWilliam A. Kennington III {
62472b7022SWilliam A. Kennington III     auto b = bus::new_default();
63472b7022SWilliam A. Kennington III     std::string id;
64472b7022SWilliam A. Kennington III     while (b.process_discard())
65472b7022SWilliam A. Kennington III         ;
66472b7022SWilliam A. Kennington III     auto slot = newBusIdReq(b).call_async([&](message&& m) { m.read(id); });
67472b7022SWilliam A. Kennington III     b.wait(1s);
68472b7022SWilliam A. Kennington III     b.process_discard();
69472b7022SWilliam A. Kennington III     EXPECT_EQ(syncBusId(b), id);
70472b7022SWilliam A. Kennington III }
71472b7022SWilliam A. Kennington III 
TEST(CallAsync,SlotDrop)72472b7022SWilliam A. Kennington III TEST(CallAsync, SlotDrop)
73472b7022SWilliam A. Kennington III {
74472b7022SWilliam A. Kennington III     auto b = bus::new_default();
75472b7022SWilliam A. Kennington III     globalId = "";
76472b7022SWilliam A. Kennington III     while (b.process_discard())
77472b7022SWilliam A. Kennington III         ;
78472b7022SWilliam A. Kennington III     {
79472b7022SWilliam A. Kennington III         auto slot = newBusIdReq(b).call_async(setGlobalId);
80472b7022SWilliam A. Kennington III     }
81472b7022SWilliam A. Kennington III     b.wait(1s);
82472b7022SWilliam A. Kennington III     b.process_discard();
83472b7022SWilliam A. Kennington III     EXPECT_EQ("", globalId);
84472b7022SWilliam A. Kennington III }
85472b7022SWilliam A. Kennington III 
TEST(CallAsync,ExceptionCaught)86472b7022SWilliam A. Kennington III TEST(CallAsync, ExceptionCaught)
87472b7022SWilliam A. Kennington III {
88472b7022SWilliam A. Kennington III     EXPECT_DEATH(
89472b7022SWilliam A. Kennington III         [] {
90472b7022SWilliam A. Kennington III         auto b = bus::new_bus();
91472b7022SWilliam A. Kennington III         while (b.process_discard())
92472b7022SWilliam A. Kennington III             ;
93472b7022SWilliam A. Kennington III         auto slot = newBusIdReq(b).call_async(
94472b7022SWilliam A. Kennington III             [&](message&&) { throw std::runtime_error("testerror"); });
95472b7022SWilliam A. Kennington III         b.wait(1s);
96472b7022SWilliam A. Kennington III         b.process_discard();
97472b7022SWilliam A. Kennington III     }(),
98472b7022SWilliam A. Kennington III         "testerror");
99472b7022SWilliam A. Kennington III }
100472b7022SWilliam A. Kennington III 
101472b7022SWilliam A. Kennington III } // namespace message
102472b7022SWilliam A. Kennington III } // namespace sdbusplus
103