| Index: net/base/address_list_unittest.cc
|
| diff --git a/net/base/address_list_unittest.cc b/net/base/address_list_unittest.cc
|
| index dbd0f24b9c0c90fb69e284b144e597ea53884d20..219d28967987f0d8162d2c79f25a5b594eb91b47 100644
|
| --- a/net/base/address_list_unittest.cc
|
| +++ b/net/base/address_list_unittest.cc
|
| @@ -1,9 +1,13 @@
|
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| #include "net/base/address_list.h"
|
|
|
| +#if defined(OS_POSIX)
|
| +#include <arpa/inet.h> // For inet_pton
|
| +#endif // defined(OS_POSIX)
|
| +
|
| #include "base/string_util.h"
|
| #include "net/base/host_resolver_proc.h"
|
| #include "net/base/net_util.h"
|
| @@ -17,27 +21,29 @@ namespace {
|
|
|
| // Use getaddrinfo() to allocate an addrinfo structure.
|
| void CreateAddressList(const std::string& hostname,
|
| - net::AddressList* addrlist, int port) {
|
| + int port,
|
| + net::AddressList* addrlist) {
|
| #if defined(OS_WIN)
|
| net::EnsureWinsockInit();
|
| #endif
|
| int rv = SystemHostResolverProc(hostname,
|
| net::ADDRESS_FAMILY_UNSPECIFIED,
|
| + 0,
|
| addrlist);
|
| EXPECT_EQ(0, rv);
|
| addrlist->SetPort(port);
|
| }
|
|
|
| void CreateLongAddressList(net::AddressList* addrlist, int port) {
|
| - CreateAddressList("192.168.1.1", addrlist, port);
|
| + CreateAddressList("192.168.1.1", port, addrlist);
|
| net::AddressList second_list;
|
| - CreateAddressList("192.168.1.2", &second_list, port);
|
| + CreateAddressList("192.168.1.2", port, &second_list);
|
| addrlist->Append(second_list.head());
|
| }
|
|
|
| TEST(AddressListTest, GetPort) {
|
| net::AddressList addrlist;
|
| - CreateAddressList("192.168.1.1", &addrlist, 81);
|
| + CreateAddressList("192.168.1.1", 81, &addrlist);
|
| EXPECT_EQ(81, addrlist.GetPort());
|
|
|
| addrlist.SetPort(83);
|
| @@ -46,7 +52,7 @@ TEST(AddressListTest, GetPort) {
|
|
|
| TEST(AddressListTest, Assignment) {
|
| net::AddressList addrlist1;
|
| - CreateAddressList("192.168.1.1", &addrlist1, 85);
|
| + CreateAddressList("192.168.1.1", 85, &addrlist1);
|
| EXPECT_EQ(85, addrlist1.GetPort());
|
|
|
| // Should reference the same data as addrlist1 -- so when we change addrlist1
|
| @@ -105,10 +111,10 @@ TEST(AddressListTest, CopyNonRecursive) {
|
|
|
| TEST(AddressListTest, Append) {
|
| net::AddressList addrlist1;
|
| - CreateAddressList("192.168.1.1", &addrlist1, 11);
|
| + CreateAddressList("192.168.1.1", 11, &addrlist1);
|
| EXPECT_EQ(11, addrlist1.GetPort());
|
| net::AddressList addrlist2;
|
| - CreateAddressList("192.168.1.2", &addrlist2, 12);
|
| + CreateAddressList("192.168.1.2", 12, &addrlist2);
|
| EXPECT_EQ(12, addrlist2.GetPort());
|
|
|
| ASSERT_TRUE(addrlist1.head()->ai_next == NULL);
|
| @@ -120,4 +126,52 @@ TEST(AddressListTest, Append) {
|
| EXPECT_EQ(12, addrlist3.GetPort());
|
| }
|
|
|
| +static const char* kCanonicalHost = "canonical.bar.com";
|
| +
|
| +TEST(AddressListTest, Canonical) {
|
| + // Create an addrinfo with a canonical name.
|
| + sockaddr_in address;
|
| + EXPECT_EQ(1, inet_pton(AF_INET, "10.0.0.1", &address));
|
| + struct addrinfo ai;
|
| + memset(&ai, 0x0, sizeof(ai));
|
| + ai.ai_family = AF_INET;
|
| + ai.ai_socktype = SOCK_STREAM;
|
| + ai.ai_addrlen = sizeof(address);
|
| + ai.ai_addr = reinterpret_cast<sockaddr*>(&address);
|
| + ai.ai_canonname = const_cast<char *>(kCanonicalHost);
|
| +
|
| + // Copy the addrinfo struct into an AddressList object and
|
| + // make sure it seems correct.
|
| + net::AddressList addrlist1;
|
| + addrlist1.Copy(&ai, true);
|
| + const struct addrinfo* addrinfo1 = addrlist1.head();
|
| + EXPECT_TRUE(addrinfo1 != NULL);
|
| + EXPECT_TRUE(addrinfo1->ai_next == NULL);
|
| + std::string canon_name1;
|
| + EXPECT_TRUE(addrlist1.GetCanonicalName(&canon_name1));
|
| + EXPECT_EQ("canonical.bar.com", canon_name1);
|
| +
|
| + // Copy the AddressList to another one.
|
| + net::AddressList addrlist2;
|
| + addrlist2.Copy(addrinfo1, true);
|
| + const struct addrinfo* addrinfo2 = addrlist2.head();
|
| + EXPECT_TRUE(addrinfo2 != NULL);
|
| + EXPECT_TRUE(addrinfo2->ai_next == NULL);
|
| + EXPECT_TRUE(addrinfo2->ai_canonname != NULL);
|
| + EXPECT_NE(addrinfo1, addrinfo2);
|
| + EXPECT_NE(addrinfo1->ai_canonname, addrinfo2->ai_canonname);
|
| + std::string canon_name2;
|
| + EXPECT_TRUE(addrlist2.GetCanonicalName(&canon_name2));
|
| + EXPECT_EQ("canonical.bar.com", canon_name2);
|
| +
|
| + // Make sure that GetCanonicalName correctly returns false
|
| + // when ai_canonname is NULL.
|
| + ai.ai_canonname = NULL;
|
| + net::AddressList addrlist_no_canon;
|
| + addrlist_no_canon.Copy(&ai, true);
|
| + std::string canon_name3 = "blah";
|
| + EXPECT_FALSE(addrlist_no_canon.GetCanonicalName(&canon_name3));
|
| + EXPECT_EQ("blah", canon_name3);
|
| +}
|
| +
|
| } // namespace
|
|
|