15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/dns/address_sorter.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <winsock2.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/address_list.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/winsock_init.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IPEndPoint MakeEndPoint(const std::string& str) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IPAddressNumber addr; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(ParseIPLiteralToNumber(str, &addr)); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return IPEndPoint(addr, 0); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OnSortComplete(AddressList* result_buf, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const CompletionCallback& callback, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AddressList& result) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (success) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *result_buf = result; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(success ? OK : ERR_FAILED); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(AddressSorterTest, Sort) { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_result = OK; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EnsureWinsockInit(); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOCKET sock = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sock == INVALID_SOCKET) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_result = ERR_FAILED; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) closesocket(sock); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<AddressSorter> sorter(AddressSorter::CreateAddressSorter()); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddressList list; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back(MakeEndPoint("10.0.0.1")); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back(MakeEndPoint("8.8.8.8")); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back(MakeEndPoint("::1")); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) list.push_back(MakeEndPoint("2001:4860:4860::8888")); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddressList result; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestCompletionCallback callback; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sorter->Sort(list, base::Bind(&OnSortComplete, &result, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.callback())); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_result, callback.WaitForResult()); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 67