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)230f282c48SPatrick 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)290f282c48SPatrick 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 ;
93*06f265f6SPatrick Williams auto slot = newBusIdReq(b).call_async([&](message&&) {
94*06f265f6SPatrick Williams throw std::runtime_error("testerror");
95*06f265f6SPatrick Williams });
96472b7022SWilliam A. Kennington III b.wait(1s);
97472b7022SWilliam A. Kennington III b.process_discard();
98472b7022SWilliam A. Kennington III }(),
99472b7022SWilliam A. Kennington III "testerror");
100472b7022SWilliam A. Kennington III }
101472b7022SWilliam A. Kennington III
102472b7022SWilliam A. Kennington III } // namespace message
103472b7022SWilliam A. Kennington III } // namespace sdbusplus
104