xref: /openbmc/boost-dbus/test/avahi.cpp (revision 16d80fe9ad0e4590896901c40275eed8e7cc9316)
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 <gtest/gtest.h>
7a83e5951SBenjamin Kietzman #include <dbus/connection.hpp>
8a83e5951SBenjamin Kietzman #include <dbus/message.hpp>
9*16d80fe9SBenjamin Kietzman #include <dbus/endpoint.hpp>
10a83e5951SBenjamin Kietzman #include <dbus/filter.hpp>
11a83e5951SBenjamin Kietzman #include <dbus/match.hpp>
12a83e5951SBenjamin Kietzman #include <dbus/functional.hpp>
13a83e5951SBenjamin Kietzman #include <unistd.h>
14a83e5951SBenjamin Kietzman 
15a83e5951SBenjamin Kietzman 
16a83e5951SBenjamin Kietzman class AvahiTest
17a83e5951SBenjamin Kietzman   : public testing::Test
18a83e5951SBenjamin Kietzman {
19a83e5951SBenjamin Kietzman protected:
20a83e5951SBenjamin Kietzman   static void SetUpTestCase()
21a83e5951SBenjamin Kietzman   {
22a83e5951SBenjamin Kietzman   }
23a83e5951SBenjamin Kietzman   static boost::asio::io_service io;
24a83e5951SBenjamin Kietzman   static dbus::connection system_bus;
25a83e5951SBenjamin Kietzman   static dbus::string browser_path;
26*16d80fe9SBenjamin Kietzman   static dbus::endpoint avahi_daemon;
27a83e5951SBenjamin Kietzman };
28a83e5951SBenjamin Kietzman // It seems like these should be non-static,
29a83e5951SBenjamin Kietzman // but I get a mysterious SEGFAULT for io
30a83e5951SBenjamin Kietzman //   ¿related: http://stackoverflow.com/questions/18009156/boost-asio-segfault-no-idea-why
31a83e5951SBenjamin Kietzman // and a C++ exception with description
32a83e5951SBenjamin Kietzman // "assign: File exists" for system_bus
33a83e5951SBenjamin Kietzman // (probably indicates I should upgrade connection's constructor)
34a83e5951SBenjamin Kietzman boost::asio::io_service AvahiTest::io;
35a83e5951SBenjamin Kietzman dbus::connection AvahiTest::system_bus(io, dbus::bus::system);
36a83e5951SBenjamin Kietzman dbus::string AvahiTest::browser_path;
37*16d80fe9SBenjamin Kietzman dbus::endpoint AvahiTest::avahi_daemon(
38*16d80fe9SBenjamin Kietzman   "org.freedesktop.Avahi",
39*16d80fe9SBenjamin Kietzman   "/",
40*16d80fe9SBenjamin Kietzman   "org.freedesktop.Avahi.Server");
41a83e5951SBenjamin Kietzman 
42a83e5951SBenjamin Kietzman 
43a83e5951SBenjamin Kietzman TEST_F(AvahiTest, GetHostName)
44a83e5951SBenjamin Kietzman {
45a83e5951SBenjamin Kietzman   using namespace boost::asio;
46a83e5951SBenjamin Kietzman   using namespace dbus;
47a83e5951SBenjamin Kietzman   using boost::system::error_code;
48a83e5951SBenjamin Kietzman 
49a83e5951SBenjamin Kietzman   string avahi_hostname;
50a83e5951SBenjamin Kietzman   string unix_hostname;
51a83e5951SBenjamin Kietzman 
52a83e5951SBenjamin Kietzman   {
53a83e5951SBenjamin Kietzman     // get hostname from a system call
54a83e5951SBenjamin Kietzman     char c[1024];
55a83e5951SBenjamin Kietzman     gethostname(c, 1024);
56a83e5951SBenjamin Kietzman     unix_hostname = c;
57a83e5951SBenjamin Kietzman   }
58a83e5951SBenjamin Kietzman 
59a83e5951SBenjamin Kietzman   // get hostname from the Avahi daemon
60a83e5951SBenjamin Kietzman   message m = message::new_call(
61*16d80fe9SBenjamin Kietzman     avahi_daemon,
62a83e5951SBenjamin Kietzman     "GetHostName");
63a83e5951SBenjamin Kietzman 
64a83e5951SBenjamin Kietzman   system_bus.async_send(m, [&](error_code ec, message r){
65a83e5951SBenjamin Kietzman     r.unpack(avahi_hostname);
66a83e5951SBenjamin Kietzman 
67a83e5951SBenjamin Kietzman     // this is only usually accurate
68a83e5951SBenjamin Kietzman     ASSERT_EQ(unix_hostname, avahi_hostname);
69a83e5951SBenjamin Kietzman 
70a83e5951SBenjamin Kietzman     // eventually, connection should stop itself
71a83e5951SBenjamin Kietzman     io.stop();
72a83e5951SBenjamin Kietzman   });
73a83e5951SBenjamin Kietzman 
74a83e5951SBenjamin Kietzman   io.run();
75a83e5951SBenjamin Kietzman }
76a83e5951SBenjamin Kietzman 
77a83e5951SBenjamin Kietzman 
78a83e5951SBenjamin Kietzman TEST_F(AvahiTest, ServiceBrowser)
79a83e5951SBenjamin Kietzman {
80a83e5951SBenjamin Kietzman   using namespace boost::asio;
81a83e5951SBenjamin Kietzman   using namespace dbus;
82a83e5951SBenjamin Kietzman   using boost::system::error_code;
83a83e5951SBenjamin Kietzman 
84a83e5951SBenjamin Kietzman   // create new service browser
85a83e5951SBenjamin Kietzman   message m = message::new_call(
86*16d80fe9SBenjamin Kietzman     avahi_daemon,
87a83e5951SBenjamin Kietzman     "ServiceBrowserNew");
88a83e5951SBenjamin Kietzman 
89a83e5951SBenjamin Kietzman   m.pack<int32>(-1)
90a83e5951SBenjamin Kietzman    .pack<int32>(-1)
91a83e5951SBenjamin Kietzman    .pack<string>("_http._tcp")
92a83e5951SBenjamin Kietzman    .pack<string>("local")
93a83e5951SBenjamin Kietzman    .pack<uint32>(0);
94a83e5951SBenjamin Kietzman 
95a83e5951SBenjamin Kietzman   message r = system_bus.send(m);
96a83e5951SBenjamin Kietzman 
97a83e5951SBenjamin Kietzman   r.unpack(browser_path);
98a83e5951SBenjamin Kietzman 
99a83e5951SBenjamin Kietzman   // RegEx match browser_path
100a83e5951SBenjamin Kietzman   // catch a possible exception
101a83e5951SBenjamin Kietzman }
102a83e5951SBenjamin Kietzman 
103a83e5951SBenjamin Kietzman 
104a83e5951SBenjamin Kietzman TEST_F(AvahiTest, BrowseForHttp)
105a83e5951SBenjamin Kietzman {
106a83e5951SBenjamin Kietzman   using namespace boost::asio;
107a83e5951SBenjamin Kietzman   using namespace dbus;
108a83e5951SBenjamin Kietzman   using boost::system::error_code;
109a83e5951SBenjamin Kietzman 
110a83e5951SBenjamin Kietzman   match m(system_bus, "type='signal',path='" + browser_path + "'");
111a83e5951SBenjamin Kietzman   filter f(system_bus, [](message& m){
112a83e5951SBenjamin Kietzman     return m.get_member() == "ItemNew"; });
113a83e5951SBenjamin Kietzman 
114a83e5951SBenjamin Kietzman   function<void(error_code, message)> h;
115a83e5951SBenjamin Kietzman   h = [&] (error_code ec, message m) {};
116a83e5951SBenjamin Kietzman   f.async_dispatch(h);
117a83e5951SBenjamin Kietzman   io.run();
118a83e5951SBenjamin Kietzman }
119