1*a0fe02caSAlexander Hansen #include "server/Test/aserver.hpp"
2*a0fe02caSAlexander Hansen #include "server/Test/client.hpp"
3*a0fe02caSAlexander Hansen #include "server/Test2/aserver.hpp"
4*a0fe02caSAlexander Hansen #include "server/Test2/client.hpp"
5*a0fe02caSAlexander Hansen #include "server/Test3/aserver.hpp"
6*a0fe02caSAlexander Hansen
7*a0fe02caSAlexander Hansen #include <sdbusplus/async/context.hpp>
8*a0fe02caSAlexander Hansen #include <sdbusplus/async/match.hpp>
9*a0fe02caSAlexander Hansen #include <sdbusplus/async/timer.hpp>
10*a0fe02caSAlexander Hansen
11*a0fe02caSAlexander Hansen class A
12*a0fe02caSAlexander Hansen {};
13*a0fe02caSAlexander Hansen
constructInterfaces(sdbusplus::async::context & ctx,std::string & busName)14*a0fe02caSAlexander Hansen auto constructInterfaces(sdbusplus::async::context& ctx, std::string& busName)
15*a0fe02caSAlexander Hansen -> sdbusplus::async::task<>
16*a0fe02caSAlexander Hansen {
17*a0fe02caSAlexander Hansen auto x = std::variant<sdbusplus::common::server::Test::EnumOne, std::string,
18*a0fe02caSAlexander Hansen sdbusplus::common::server::Test::EnumTwo>(
19*a0fe02caSAlexander Hansen sdbusplus::common::server::Test::EnumOne::OneA);
20*a0fe02caSAlexander Hansen
21*a0fe02caSAlexander Hansen sdbusplus::common::server::Test::properties_t props{
22*a0fe02caSAlexander Hansen 832, 0, 0, 0, 0, 0, 0, std::string("/my/path"), 1.0, 1.0, 1.0, 1.0, x};
23*a0fe02caSAlexander Hansen
24*a0fe02caSAlexander Hansen sdbusplus::common::server::Test2::properties_t props2{4200, 2};
25*a0fe02caSAlexander Hansen
26*a0fe02caSAlexander Hansen sdbusplus::aserver::server::Test<A> a0(ctx, "/0");
27*a0fe02caSAlexander Hansen
28*a0fe02caSAlexander Hansen sdbusplus::aserver::server::Test<A> a1(ctx, "/1", props);
29*a0fe02caSAlexander Hansen
30*a0fe02caSAlexander Hansen // construct without properties
31*a0fe02caSAlexander Hansen sdbusplus::async::server_t<A, sdbusplus::aserver::server::Test> a2(
32*a0fe02caSAlexander Hansen ctx, "/2");
33*a0fe02caSAlexander Hansen
34*a0fe02caSAlexander Hansen // construct Test with properties
35*a0fe02caSAlexander Hansen auto a3 = std::make_unique<
36*a0fe02caSAlexander Hansen sdbusplus::async::server_t<A, sdbusplus::aserver::server::Test>>(
37*a0fe02caSAlexander Hansen ctx, "/3", props);
38*a0fe02caSAlexander Hansen
39*a0fe02caSAlexander Hansen // construct Test2 with properties
40*a0fe02caSAlexander Hansen sdbusplus::async::server_t<A, sdbusplus::aserver::server::Test2> a4(
41*a0fe02caSAlexander Hansen ctx, "/4", props2);
42*a0fe02caSAlexander Hansen
43*a0fe02caSAlexander Hansen // does not compile, (wronge type of properties!)
44*a0fe02caSAlexander Hansen // sdbusplus::async::server_t<A, sdbusplus::aserver::server::Test2> ax(ctx,
45*a0fe02caSAlexander Hansen // "/x", props);
46*a0fe02caSAlexander Hansen
47*a0fe02caSAlexander Hansen // construct with both interfaces, no properties
48*a0fe02caSAlexander Hansen sdbusplus::async::server_t<A, sdbusplus::aserver::server::Test,
49*a0fe02caSAlexander Hansen sdbusplus::aserver::server::Test2>
50*a0fe02caSAlexander Hansen a5(ctx, "/5");
51*a0fe02caSAlexander Hansen
52*a0fe02caSAlexander Hansen // construct with both interfaces and properties
53*a0fe02caSAlexander Hansen auto a6 = std::make_unique<
54*a0fe02caSAlexander Hansen sdbusplus::async::server_t<A, sdbusplus::aserver::server::Test,
55*a0fe02caSAlexander Hansen sdbusplus::aserver::server::Test2>>(
56*a0fe02caSAlexander Hansen ctx, "/6", props, props2);
57*a0fe02caSAlexander Hansen
58*a0fe02caSAlexander Hansen // does not compile, (wrong order of properties!)
59*a0fe02caSAlexander Hansen // auto a7 = std::make_unique<
60*a0fe02caSAlexander Hansen // sdbusplus::async::server_t<A, sdbusplus::aserver::server::Test,
61*a0fe02caSAlexander Hansen // sdbusplus::aserver::server::Test2>>(
62*a0fe02caSAlexander Hansen // ctx, "/7", props2, props);
63*a0fe02caSAlexander Hansen
64*a0fe02caSAlexander Hansen auto a8 = std::make_unique<sdbusplus::async::server_t<
65*a0fe02caSAlexander Hansen A, sdbusplus::aserver::server::Test, sdbusplus::aserver::server::Test2,
66*a0fe02caSAlexander Hansen sdbusplus::aserver::server::Test3>>(ctx, "/8", props, props2,
67*a0fe02caSAlexander Hansen std::nullopt);
68*a0fe02caSAlexander Hansen
69*a0fe02caSAlexander Hansen auto client =
70*a0fe02caSAlexander Hansen sdbusplus::client::server::Test(ctx).service(busName).path("/3");
71*a0fe02caSAlexander Hansen
72*a0fe02caSAlexander Hansen assert(co_await client.some_value() == 832);
73*a0fe02caSAlexander Hansen
74*a0fe02caSAlexander Hansen auto client2 =
75*a0fe02caSAlexander Hansen sdbusplus::client::server::Test2(ctx).service(busName).path("/6");
76*a0fe02caSAlexander Hansen
77*a0fe02caSAlexander Hansen assert(co_await client2.new_value() == 4200);
78*a0fe02caSAlexander Hansen
79*a0fe02caSAlexander Hansen ctx.request_stop();
80*a0fe02caSAlexander Hansen
81*a0fe02caSAlexander Hansen co_return;
82*a0fe02caSAlexander Hansen }
83*a0fe02caSAlexander Hansen
main()84*a0fe02caSAlexander Hansen int main()
85*a0fe02caSAlexander Hansen {
86*a0fe02caSAlexander Hansen sdbusplus::async::context ctx;
87*a0fe02caSAlexander Hansen
88*a0fe02caSAlexander Hansen std::srand(std::chrono::system_clock::now().time_since_epoch().count());
89*a0fe02caSAlexander Hansen std::string busName = "xyz.openbmc_project.TestingMultipleInterfaces" +
90*a0fe02caSAlexander Hansen std::to_string(rand());
91*a0fe02caSAlexander Hansen
92*a0fe02caSAlexander Hansen ctx.request_name(busName.c_str());
93*a0fe02caSAlexander Hansen
94*a0fe02caSAlexander Hansen sdbusplus::server::manager_t manager(ctx.get_bus(), "/test");
95*a0fe02caSAlexander Hansen
96*a0fe02caSAlexander Hansen ctx.spawn(constructInterfaces(ctx, busName));
97*a0fe02caSAlexander Hansen
98*a0fe02caSAlexander Hansen ctx.run();
99*a0fe02caSAlexander Hansen
100*a0fe02caSAlexander Hansen return 0;
101*a0fe02caSAlexander Hansen }
102