19
19
#include <core/dbus/dbus.h>
20
20
#include <core/dbus/fixture.h>
21
#include <core/dbus/message_streaming_operators.h>
21
22
#include <core/dbus/object.h>
22
23
#include <core/dbus/service.h>
23
24
#include <core/dbus/asio/executor.h>
61
62
auto bus = session_bus();
63
64
auto service = dbus::Service::use_service<test::Service>(bus);
64
auto object = service->object_for_path(dbus::types::ObjectPath{path});
65
auto object = dbus::Object::Stub::create(service, dbus::types::ObjectPath{path});
66
auto test_method = object->typed_method<test::Service::Method>();
66
object->invoke_method_synchronously<test::Service::Method, void>();
68
test_method->invoke_and_block();
68
70
return ::testing::Test::HasFailure() ? core::posix::exit::Status::failure : core::posix::exit::Status::success;
69
71
}, core::posix::StandardStream::empty);
76
78
core::testing::SigTermCatcher sc;
80
auto service_bus = session_bus();
78
81
auto bus = session_bus();
83
service_bus->install_executor(core::dbus::asio::make_executor(service_bus));
79
84
bus->install_executor(core::dbus::asio::make_executor(bus));
85
std::thread t1{[service_bus](){ service_bus->run(); }};
86
std::thread t2{[bus](){ bus->run(); }};
80
88
dbus::DBus daemon{bus};
82
auto service = dbus::Service::add_service<test::Service>(bus);
83
auto object = service->add_object_for_path(dbus::types::ObjectPath{path});
90
auto service = dbus::Service::add_service<test::Service>(service_bus);
91
auto object = dbus::Object::Skeleton::create(service, dbus::types::ObjectPath{path});
85
93
uint32_t sender_pid = 0, sender_uid = 0;
87
auto method = object->get_method<test::Service::Method>();
95
auto method = object->typed_method<test::Service::Method>();
89
97
method->register_invocation_handler(
90
[&daemon, &sender_pid, &sender_uid, bus](
98
[&daemon, &sender_pid, &sender_uid, bus, service_bus](
91
99
const dbus::Message::Ptr& request,
92
const dbus::Object::Ptr& context,
100
const dbus::Object::Skeleton::Ptr& context,
93
101
const dbus::MessageFactory::Ptr& mf)
95
103
auto sender = request->sender();
97
105
sender_pid = daemon.get_connection_unix_process_id(sender);
98
106
sender_uid = daemon.get_connection_unix_user(sender);
100
context->send(mf->make_method_return(request));
108
auto reply = mf->make_method_return(request);
109
reply->writer() << std::int64_t{42};
110
context->send(reply);
105
116
barrier.try_signal_ready_for(std::chrono::milliseconds{500});
107
std::thread t1{[bus](){ bus->run(); }};
108
std::thread t2{[bus](){ bus->run(); }};
110
118
sc.wait_for_signal();
112
120
if (t1.joinable())