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