xref: /openbmc/boost-dbus/test/avahi.cpp (revision da3eeb6afd298e879dbc9a049c7bcdd9c848baba)
1a83e5951SBenjamin Kietzman // Copyright (c) Benjamin Kietzman (github.com/bkietz)
2a83e5951SBenjamin Kietzman //
3a83e5951SBenjamin Kietzman // Distributed under the Boost Software License, Version 1.0. (See accompanying
4a83e5951SBenjamin Kietzman // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5a83e5951SBenjamin Kietzman 
6a83e5951SBenjamin Kietzman #include <dbus/connection.hpp>
716d80fe9SBenjamin Kietzman #include <dbus/endpoint.hpp>
8a83e5951SBenjamin Kietzman #include <dbus/filter.hpp>
9a83e5951SBenjamin Kietzman #include <dbus/match.hpp>
10*da3eeb6aSEd Tanous #include <dbus/message.hpp>
11*da3eeb6aSEd Tanous #include <functional>
12b2c2467dSBenjamin Kietzman 
13a83e5951SBenjamin Kietzman #include <unistd.h>
14*da3eeb6aSEd Tanous #include <gtest/gtest.h>
15b2c2467dSBenjamin Kietzman 
16*da3eeb6aSEd Tanous TEST(AvahiTest, GetHostName) {
17*da3eeb6aSEd Tanous   dbus::endpoint test_daemon("org.freedesktop.Avahi", "/",
1816d80fe9SBenjamin Kietzman                              "org.freedesktop.Avahi.Server");
19*da3eeb6aSEd Tanous   boost::asio::io_service io;
20*da3eeb6aSEd Tanous   dbus::connection system_bus(io, dbus::bus::system);
21a83e5951SBenjamin Kietzman 
22*da3eeb6aSEd Tanous   dbus::message m = dbus::message::new_call(test_daemon, "GetHostName");
23a83e5951SBenjamin Kietzman 
24*da3eeb6aSEd Tanous   system_bus.async_send(
25*da3eeb6aSEd Tanous       m, [&](const boost::system::error_code ec, dbus::message r) {
26a83e5951SBenjamin Kietzman 
27*da3eeb6aSEd Tanous         std::string avahi_hostname;
28*da3eeb6aSEd Tanous         std::string hostname;
29*da3eeb6aSEd Tanous 
30a83e5951SBenjamin Kietzman         // get hostname from a system call
31a83e5951SBenjamin Kietzman         char c[1024];
32a83e5951SBenjamin Kietzman         gethostname(c, 1024);
33*da3eeb6aSEd Tanous         hostname = c;
34a83e5951SBenjamin Kietzman 
35b2c2467dSBenjamin Kietzman         r.unpack(avahi_hostname);
36b2c2467dSBenjamin Kietzman 
37*da3eeb6aSEd Tanous         // Get only the host name, not the fqdn
38*da3eeb6aSEd Tanous         auto unix_hostname = hostname.substr(0, hostname.find("."));
39b2c2467dSBenjamin Kietzman         EXPECT_EQ(unix_hostname, avahi_hostname);
40b2c2467dSBenjamin Kietzman 
41b2c2467dSBenjamin Kietzman         io.stop();
42*da3eeb6aSEd Tanous       });
43*da3eeb6aSEd Tanous   boost::asio::deadline_timer t(io, boost::posix_time::seconds(10));
44*da3eeb6aSEd Tanous   t.async_wait([&](const boost::system::error_code& /*e*/) {
45b2c2467dSBenjamin Kietzman     io.stop();
46*da3eeb6aSEd Tanous     FAIL() << "Callback was never called\n";
47*da3eeb6aSEd Tanous   });
48a83e5951SBenjamin Kietzman   io.run();
49a83e5951SBenjamin Kietzman }
50a83e5951SBenjamin Kietzman 
51*da3eeb6aSEd Tanous TEST(AvahiTest, ServiceBrowser) {
52*da3eeb6aSEd Tanous   boost::asio::io_service io;
53*da3eeb6aSEd Tanous   dbus::connection system_bus(io, dbus::bus::system);
54a83e5951SBenjamin Kietzman 
55*da3eeb6aSEd Tanous   dbus::endpoint test_daemon("org.freedesktop.Avahi", "/",
56*da3eeb6aSEd Tanous                              "org.freedesktop.Avahi.Server");
57a83e5951SBenjamin Kietzman   // create new service browser
58*da3eeb6aSEd Tanous   dbus::message m1 = dbus::message::new_call(test_daemon, "ServiceBrowserNew");
59*da3eeb6aSEd Tanous   m1.pack<int32_t>(-1)
60*da3eeb6aSEd Tanous    .pack<int32_t>(-1)
61*da3eeb6aSEd Tanous    .pack<std::string>("_http._tcp")
62*da3eeb6aSEd Tanous    .pack<std::string>("local")
63*da3eeb6aSEd Tanous    .pack<uint32_t>(0);
64a83e5951SBenjamin Kietzman 
65*da3eeb6aSEd Tanous   dbus::message r = system_bus.send(m1);
66*da3eeb6aSEd Tanous   std::string browser_path;
67a83e5951SBenjamin Kietzman   r.unpack(browser_path);
68*da3eeb6aSEd Tanous   testing::Test::RecordProperty("browserPath", browser_path);
69a83e5951SBenjamin Kietzman 
70*da3eeb6aSEd Tanous   dbus::match ma(system_bus, "type='signal',path='" + browser_path + "'");
71*da3eeb6aSEd Tanous   dbus::filter f(system_bus, [](dbus::message& m) {
72*da3eeb6aSEd Tanous     auto member = m.get_member();
73*da3eeb6aSEd Tanous     return member == "NameAcquired";
74*da3eeb6aSEd Tanous   });
75a83e5951SBenjamin Kietzman 
76*da3eeb6aSEd Tanous   std::function<void(boost::system::error_code, dbus::message)> event_handler =
77*da3eeb6aSEd Tanous       [&](boost::system::error_code ec, dbus::message s) {
78*da3eeb6aSEd Tanous         testing::Test::RecordProperty("firstSignal", s.get_member());
79*da3eeb6aSEd Tanous         std::string a = s.get_member();
80*da3eeb6aSEd Tanous         std::string dude;
81*da3eeb6aSEd Tanous         s.unpack(dude);
82*da3eeb6aSEd Tanous         f.async_dispatch(event_handler);
83*da3eeb6aSEd Tanous         io.stop();
84*da3eeb6aSEd Tanous       };
85*da3eeb6aSEd Tanous   f.async_dispatch(event_handler);
86b2c2467dSBenjamin Kietzman 
87*da3eeb6aSEd Tanous   boost::asio::deadline_timer t(io, boost::posix_time::seconds(10));
88*da3eeb6aSEd Tanous   t.async_wait([&](const boost::system::error_code& /*e*/) {
89*da3eeb6aSEd Tanous     io.stop();
90*da3eeb6aSEd Tanous     FAIL() << "Callback was never called\n";
91*da3eeb6aSEd Tanous   });
92a83e5951SBenjamin Kietzman   io.run();
93a83e5951SBenjamin Kietzman }
94