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