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