xref: /openbmc/boost-dbus/test/avahi.cpp (revision b2c2467d272359fb30f9ba6d6ee0107ad05cede0)
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>
7a83e5951SBenjamin Kietzman #include <dbus/message.hpp>
816d80fe9SBenjamin Kietzman #include <dbus/endpoint.hpp>
9a83e5951SBenjamin Kietzman #include <dbus/filter.hpp>
10a83e5951SBenjamin Kietzman #include <dbus/match.hpp>
11a83e5951SBenjamin Kietzman #include <dbus/functional.hpp>
12*b2c2467dSBenjamin Kietzman 
13*b2c2467dSBenjamin Kietzman #include <gtest/gtest.h>
14a83e5951SBenjamin Kietzman #include <unistd.h>
15*b2c2467dSBenjamin Kietzman #include <utility/record_property.hpp>
16*b2c2467dSBenjamin Kietzman 
17*b2c2467dSBenjamin Kietzman 
18*b2c2467dSBenjamin Kietzman using namespace boost::asio;
19*b2c2467dSBenjamin Kietzman using namespace dbus;
20*b2c2467dSBenjamin Kietzman using boost::system::error_code;
21a83e5951SBenjamin Kietzman 
22a83e5951SBenjamin Kietzman 
23a83e5951SBenjamin Kietzman class AvahiTest
24a83e5951SBenjamin Kietzman   : public testing::Test
25a83e5951SBenjamin Kietzman {
26a83e5951SBenjamin Kietzman protected:
27a83e5951SBenjamin Kietzman   static void SetUpTestCase()
28a83e5951SBenjamin Kietzman   {
29a83e5951SBenjamin Kietzman   }
30*b2c2467dSBenjamin Kietzman   static io_service io;
31*b2c2467dSBenjamin Kietzman   static string browser_path;
32*b2c2467dSBenjamin Kietzman   static endpoint avahi_daemon;
33a83e5951SBenjamin Kietzman };
34a83e5951SBenjamin Kietzman // It seems like these should be non-static,
35a83e5951SBenjamin Kietzman // but I get a mysterious SEGFAULT for io
36a83e5951SBenjamin Kietzman //   ¿related: http://stackoverflow.com/questions/18009156/boost-asio-segfault-no-idea-why
37*b2c2467dSBenjamin Kietzman io_service AvahiTest::io;
38*b2c2467dSBenjamin Kietzman string AvahiTest::browser_path;
39*b2c2467dSBenjamin Kietzman endpoint AvahiTest::avahi_daemon(
4016d80fe9SBenjamin Kietzman   "org.freedesktop.Avahi",
4116d80fe9SBenjamin Kietzman   "/",
4216d80fe9SBenjamin Kietzman   "org.freedesktop.Avahi.Server");
43a83e5951SBenjamin Kietzman 
44*b2c2467dSBenjamin Kietzman struct compare_hostnames
45a83e5951SBenjamin Kietzman {
46*b2c2467dSBenjamin Kietzman   io_service& io;
47*b2c2467dSBenjamin Kietzman   connection& system_bus;
48a83e5951SBenjamin Kietzman 
49*b2c2467dSBenjamin Kietzman   void operator()(error_code ec, message r)
50*b2c2467dSBenjamin Kietzman   {
51a83e5951SBenjamin Kietzman     string avahi_hostname;
52a83e5951SBenjamin Kietzman     string unix_hostname;
53a83e5951SBenjamin Kietzman 
54a83e5951SBenjamin Kietzman     {
55a83e5951SBenjamin Kietzman       // get hostname from a system call
56a83e5951SBenjamin Kietzman       char c[1024];
57a83e5951SBenjamin Kietzman       gethostname(c, 1024);
58a83e5951SBenjamin Kietzman       unix_hostname = c;
59a83e5951SBenjamin Kietzman     }
60a83e5951SBenjamin Kietzman 
61*b2c2467dSBenjamin Kietzman     r.unpack(avahi_hostname);
62*b2c2467dSBenjamin Kietzman 
63*b2c2467dSBenjamin Kietzman     // this is only usually accurate
64*b2c2467dSBenjamin Kietzman     EXPECT_EQ(unix_hostname, avahi_hostname);
65*b2c2467dSBenjamin Kietzman 
66*b2c2467dSBenjamin Kietzman     // eventually, connection should stop itself
67*b2c2467dSBenjamin Kietzman     io.stop();
68*b2c2467dSBenjamin Kietzman   }
69*b2c2467dSBenjamin Kietzman };
70*b2c2467dSBenjamin Kietzman 
71*b2c2467dSBenjamin Kietzman bool member_is_itemnew(message& m)
72*b2c2467dSBenjamin Kietzman {
73*b2c2467dSBenjamin Kietzman   return m.get_member() == "ItemNew";
74*b2c2467dSBenjamin Kietzman }
75*b2c2467dSBenjamin Kietzman 
76*b2c2467dSBenjamin Kietzman struct handle_dispatch
77*b2c2467dSBenjamin Kietzman {
78*b2c2467dSBenjamin Kietzman   io_service& io;
79*b2c2467dSBenjamin Kietzman 
80*b2c2467dSBenjamin Kietzman   void operator()(error_code ec, message s)
81*b2c2467dSBenjamin Kietzman   {
82*b2c2467dSBenjamin Kietzman     record_property("firstSignal") << s.get_member();
83*b2c2467dSBenjamin Kietzman     io.stop();
84*b2c2467dSBenjamin Kietzman   }
85*b2c2467dSBenjamin Kietzman };
86*b2c2467dSBenjamin Kietzman 
87*b2c2467dSBenjamin Kietzman TEST_F(AvahiTest, GetHostName)
88*b2c2467dSBenjamin Kietzman {
89*b2c2467dSBenjamin Kietzman   connection system_bus(io, "unix:path=/var/run/dbus/system_bus_socket");
90*b2c2467dSBenjamin Kietzman 
91*b2c2467dSBenjamin Kietzman   {
92a83e5951SBenjamin Kietzman   message m = message::new_call(
9316d80fe9SBenjamin Kietzman     avahi_daemon,
94a83e5951SBenjamin Kietzman     "GetHostName");
95a83e5951SBenjamin Kietzman 
96*b2c2467dSBenjamin Kietzman   system_bus.async_send(m,
97*b2c2467dSBenjamin Kietzman       (compare_hostnames){ io, system_bus });
98*b2c2467dSBenjamin Kietzman   }
99a83e5951SBenjamin Kietzman 
100a83e5951SBenjamin Kietzman   io.run();
101*b2c2467dSBenjamin Kietzman /*
102a83e5951SBenjamin Kietzman }
103a83e5951SBenjamin Kietzman 
104a83e5951SBenjamin Kietzman 
105a83e5951SBenjamin Kietzman TEST_F(AvahiTest, ServiceBrowser)
106a83e5951SBenjamin Kietzman {
107cfc0655fSBenjamin Kietzman   connection system_bus(io, bus::system);
108*b2c2467dSBenjamin Kietzman   */
109cfc0655fSBenjamin Kietzman 
110*b2c2467dSBenjamin Kietzman   {
111a83e5951SBenjamin Kietzman   // create new service browser
112a83e5951SBenjamin Kietzman   message m = message::new_call(
11316d80fe9SBenjamin Kietzman     avahi_daemon,
114a83e5951SBenjamin Kietzman     "ServiceBrowserNew");
115a83e5951SBenjamin Kietzman 
116a83e5951SBenjamin Kietzman   m.pack<int32>(-1)
117a83e5951SBenjamin Kietzman    .pack<int32>(-1)
118a83e5951SBenjamin Kietzman    .pack<string>("_http._tcp")
119a83e5951SBenjamin Kietzman    .pack<string>("local")
120a83e5951SBenjamin Kietzman    .pack<uint32>(0);
121a83e5951SBenjamin Kietzman 
122a83e5951SBenjamin Kietzman   message r = system_bus.send(m);
123a83e5951SBenjamin Kietzman 
124a83e5951SBenjamin Kietzman   r.unpack(browser_path);
125*b2c2467dSBenjamin Kietzman   }
126*b2c2467dSBenjamin Kietzman   record_property("browserPath") << browser_path;
127a83e5951SBenjamin Kietzman   // RegEx match browser_path
128a83e5951SBenjamin Kietzman   // catch a possible exception
129*b2c2467dSBenjamin Kietzman   /*
130a83e5951SBenjamin Kietzman }
131a83e5951SBenjamin Kietzman 
132a83e5951SBenjamin Kietzman 
133*b2c2467dSBenjamin Kietzman 
134a83e5951SBenjamin Kietzman TEST_F(AvahiTest, BrowseForHttp)
135a83e5951SBenjamin Kietzman {
136*b2c2467dSBenjamin Kietzman   */
137*b2c2467dSBenjamin Kietzman   io.reset();
138*b2c2467dSBenjamin Kietzman   //connection system_bus1(io, bus::system);
139cfc0655fSBenjamin Kietzman 
140a83e5951SBenjamin Kietzman   match m(system_bus, "type='signal',path='" + browser_path + "'");
141*b2c2467dSBenjamin Kietzman   filter f(system_bus, member_is_itemnew);
142a83e5951SBenjamin Kietzman 
143*b2c2467dSBenjamin Kietzman   f.async_dispatch(
144*b2c2467dSBenjamin Kietzman       (handle_dispatch){ io });
145*b2c2467dSBenjamin Kietzman 
146a83e5951SBenjamin Kietzman   io.run();
147a83e5951SBenjamin Kietzman }
148