1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chromeos/network/host_resolver_impl_chromeos.h" 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/message_loop/message_loop.h" 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/run_loop.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/strings/stringprintf.h" 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chromeos/dbus/shill_device_client.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chromeos/dbus/shill_ipconfig_client.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chromeos/dbus/shill_service_client.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chromeos/network/device_state.h" 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chromeos/network/network_state.h" 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chromeos/network/network_state_handler.h" 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "dbus/object_path.h" 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "net/base/net_errors.h" 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace { 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kTestIPv4Address[] = "1.2.3.4"; 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)const char kTestIPv6Address[] = "1:2:3:4:5:6:7:8"; 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DoNothingWithCallStatus(chromeos::DBusMethodCallStatus call_status) {} 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ErrorCallbackFunction(const std::string& error_name, 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& error_message) { 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LOG(ERROR) << "Shill Error: " << error_name << " : " << error_message; 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void ResolveCompletionCallback(int result) {} 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class HostResolverImplChromeOSTest : public testing::Test { 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) public: 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) HostResolverImplChromeOSTest() {} 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~HostResolverImplChromeOSTest() {} 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void SetUp() OVERRIDE { 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci chromeos::DBusThreadManager::Initialize(); 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) network_state_handler_.reset( 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) chromeos::NetworkStateHandler::InitializeForTest()); 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const chromeos::NetworkState* default_network = 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) network_state_handler_->DefaultNetwork(); 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(default_network); 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const chromeos::DeviceState* default_device = 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) network_state_handler_->GetDeviceState(default_network->device_path()); 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_TRUE(default_device); 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SetDefaultIPConfigs(default_device->path()); 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Create the host resolver from the IO message loop. 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) io_message_loop_.PostTask( 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FROM_HERE, 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&HostResolverImplChromeOSTest::InitializeHostResolver, 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Unretained(this))); 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) io_message_loop_.RunUntilIdle(); 64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Run the main message loop to create the network observer and initialize 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // the ip address values. 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void TearDown() OVERRIDE { 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) network_state_handler_.reset(); 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) chromeos::DBusThreadManager::Shutdown(); 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) protected: 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Run from main (UI) message loop, calls Resolve on IO message loop. 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int CallResolve(net::HostResolver::RequestInfo& info) { 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) io_message_loop_.PostTask( 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FROM_HERE, 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&HostResolverImplChromeOSTest::Resolve, 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Unretained(this), 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) info)); 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) io_message_loop_.RunUntilIdle(); 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return result_; 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) net::AddressList addresses_; 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int result_; 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) private: 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Run from IO message loop. 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void InitializeHostResolver() { 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) net::HostResolver::Options options; 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) host_resolver_ = 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) chromeos::HostResolverImplChromeOS::CreateHostResolverForTest( 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::MessageLoopProxy::current(), 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) network_state_handler_.get()); 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Run from IO message loop. 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void Resolve(net::HostResolver::RequestInfo info) { 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) result_ = host_resolver_->Resolve( 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) info, 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) net::DEFAULT_PRIORITY, 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &addresses_, 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&ResolveCompletionCallback), 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NULL, 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) net_log_); 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void SetDefaultIPConfigs(const std::string& default_device_path) { 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string kTestIPv4ConfigPath("test_ip_v4_config_path"); 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string kTestIPv6ConfigPath("test_ip_v6_config_path"); 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SetIPConfig(kTestIPv4ConfigPath, shill::kTypeIPv4, kTestIPv4Address); 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SetIPConfig(kTestIPv6ConfigPath, shill::kTypeIPv6, kTestIPv6Address); 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::ListValue ip_configs; 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ip_configs.AppendString(kTestIPv4ConfigPath); 121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ip_configs.AppendString(kTestIPv6ConfigPath); 122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) chromeos::DBusThreadManager::Get()->GetShillDeviceClient()->SetProperty( 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) dbus::ObjectPath(default_device_path), 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) shill::kIPConfigsProperty, 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ip_configs, 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&base::DoNothing), 128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&ErrorCallbackFunction)); 129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::RunLoop().RunUntilIdle(); 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void SetIPConfig(const std::string& path, 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& method, 134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& address) { 135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) chromeos::DBusThreadManager::Get()->GetShillIPConfigClient()->SetProperty( 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) dbus::ObjectPath(path), 137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) shill::kAddressProperty, 138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::StringValue(address), 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&DoNothingWithCallStatus)); 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) chromeos::DBusThreadManager::Get()->GetShillIPConfigClient()->SetProperty( 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) dbus::ObjectPath(path), 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) shill::kMethodProperty, 143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::StringValue(method), 144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&DoNothingWithCallStatus)); 145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<chromeos::NetworkStateHandler> network_state_handler_; 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<net::HostResolver> host_resolver_; 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::MessageLoop io_message_loop_; 150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) net::BoundNetLog net_log_; 151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(HostResolverImplChromeOSTest); 153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}; 154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(HostResolverImplChromeOSTest, Resolve) { 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) net::HostResolver::RequestInfo info( 157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) net::HostPortPair(net::GetHostName(), 80)); 158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) info.set_address_family(net::ADDRESS_FAMILY_IPV4); 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch info.set_is_my_ip_address(true); 160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(net::OK, CallResolve(info)); 161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(1u, addresses_.size()); 162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::string expected = base::StringPrintf("%s:%d", kTestIPv4Address, 0); 163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(expected, addresses_[0].ToString()); 164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) info.set_address_family(net::ADDRESS_FAMILY_IPV6); 166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(net::OK, CallResolve(info)); 167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_EQ(2u, addresses_.size()); 168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) expected = base::StringPrintf("[%s]:%d", kTestIPv6Address, 0); 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(expected, addresses_[0].ToString()); 170f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) expected = base::StringPrintf("%s:%d", kTestIPv4Address, 0); 171f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(expected, addresses_[1].ToString()); 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 173