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/base/net_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string.h>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <ostream>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/format_macros.h"
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/scoped_native_library.h"
145e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
165e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_byteorder.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN)
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <iphlpapi.h>
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <objbase.h>
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/win/windows_version.h"
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/base/net_util_win.h"
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif !defined(OS_ANDROID)
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <net/if.h>
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif  // OS_WIN
31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::WideToUTF16;
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct HeaderCase {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* header_name;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* expected;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CompliantHostCase {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* host;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* desired_tld;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool expected_output;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fills in sockaddr for the given 32-bit address (IPv4.)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |bytes| should be an array of length 4.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MakeIPv4Address(const uint8* bytes, int port, SockaddrStorage* storage) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&storage->addr_storage, 0, sizeof(storage->addr_storage));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage->addr_len = sizeof(struct sockaddr_in);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct sockaddr_in* addr4 = reinterpret_cast<sockaddr_in*>(storage->addr);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  addr4->sin_port = base::HostToNet16(port);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  addr4->sin_family = AF_INET;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(&addr4->sin_addr, bytes, 4);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Fills in sockaddr for the given 128-bit address (IPv6.)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |bytes| should be an array of length 16.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MakeIPv6Address(const uint8* bytes, int port, SockaddrStorage* storage) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&storage->addr_storage, 0, sizeof(storage->addr_storage));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  storage->addr_len = sizeof(struct sockaddr_in6);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct sockaddr_in6* addr6 = reinterpret_cast<sockaddr_in6*>(storage->addr);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  addr6->sin6_port = base::HostToNet16(port);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  addr6->sin6_family = AF_INET6;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memcpy(&addr6->sin6_addr, bytes, 16);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Helper to strignize an IP number (used to define expectations).
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstd::string DumpIPNumber(const IPAddressNumber& v) {
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::string out;
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0; i < v.size(); ++i) {
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    if (i != 0)
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      out.append(",");
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    out.append(base::IntToString(static_cast<int>(v[i])));
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return out;
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
83c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}  // anonymous namespace
84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(NetUtilTest, GetIdentityFromURL) {
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  struct {
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const char* input_url;
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const char* expected_username;
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    const char* expected_password;
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  } tests[] = {
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://username:password@google.com",
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "username",
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "password",
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Test for http://crbug.com/19200
97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://username:p@ssword@google.com",
98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "username",
99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "p@ssword",
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Special URL characters should be unescaped.
102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://username:p%3fa%26s%2fs%23@google.com",
103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "username",
104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "p?a&s/s#",
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Username contains %20.
107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://use rname:password@google.com",
108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "use rname",
109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "password",
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Keep %00 as is.
112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://use%00rname:password@google.com",
113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "use%00rname",
114c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "password",
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
116c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Use a '+' in the username.
117c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://use+rname:password@google.com",
118c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "use+rname",
119c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "password",
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
121c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    { // Use a '&' in the password.
122c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "http://username:p&ssword@google.com",
123c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "username",
124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      "p&ssword",
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
128c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i,
129c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                    tests[i].input_url));
130c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    GURL url(tests[i].input_url);
131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
132c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::string16 username, password;
133c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    GetIdentityFromURL(url, &username, &password);
134c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
135c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_EQ(ASCIIToUTF16(tests[i].expected_username), username);
136c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_EQ(ASCIIToUTF16(tests[i].expected_password), password);
137c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
138c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
139c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
140c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Try extracting a username which was encoded with UTF8.
141c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(NetUtilTest, GetIdentityFromURL_UTF8) {
142c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GURL url(WideToUTF16(L"http://foo:\x4f60\x597d@blah.com"));
143c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
144c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ("foo", url.username());
145c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ("%E4%BD%A0%E5%A5%BD", url.password());
146c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Extract the unescaped identity.
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::string16 username, password;
149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  GetIdentityFromURL(url, &username, &password);
150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Verify that it was decoded as UTF8.
152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(ASCIIToUTF16("foo"), username);
153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(WideToUTF16(L"\x4f60\x597d"), password);
154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Just a bunch of fake headers.
157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst char* google_headers =
158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "HTTP/1.1 200 OK\n"
159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "Content-TYPE: text/html; charset=utf-8\n"
160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "Content-disposition: attachment; filename=\"download.pdf\"\n"
161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "Content-Length: 378557\n"
162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "X-Google-Google1: 314159265\n"
163c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "X-Google-Google2: aaaa2:7783,bbb21:9441\n"
164c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "X-Google-Google4: home\n"
165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "Transfer-Encoding: chunked\n"
166c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "Set-Cookie: HEHE_AT=6666x66beef666x6-66xx6666x66; Path=/mail\n"
167c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "Set-Cookie: HEHE_HELP=owned:0;Path=/\n"
168c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "Set-Cookie: S=gmail=Xxx-beefbeefbeef_beefb:gmail_yj=beefbeef000beefbee"
169c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch       "fbee:gmproxy=bee-fbeefbe; Domain=.google.com; Path=/\n"
170c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "X-Google-Google2: /one/two/three/four/five/six/seven-height/nine:9411\n"
171c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "Server: GFE/1.3\n"
172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "Transfer-Encoding: chunked\n"
173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "Date: Mon, 13 Nov 2006 21:38:09 GMT\n"
174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "Expires: Tue, 14 Nov 2006 19:23:58 GMT\n"
175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "X-Malformed: bla; arg=test\"\n"
176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "X-Malformed2: bla; arg=\n"
177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    "X-Test: bla; arg1=val1; arg2=val2";
178c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(NetUtilTest, GetSpecificHeader) {
180c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const HeaderCase tests[] = {
181c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"content-type", "text/html; charset=utf-8"},
182c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"CONTENT-LENGTH", "378557"},
183c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"Date", "Mon, 13 Nov 2006 21:38:09 GMT"},
184c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"Bad-Header", ""},
185c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"", ""},
186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
187c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Test first with google_headers.
189c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    std::string result =
191c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        GetSpecificHeader(google_headers, tests[i].header_name);
192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_EQ(result, tests[i].expected);
193c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
194c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Test again with empty headers.
196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    std::string result = GetSpecificHeader(std::string(), tests[i].header_name);
198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_EQ(result, std::string());
199c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  }
200c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
201c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST(NetUtilTest, CompliantHost) {
203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const CompliantHostCase compliant_host_cases[] = {
204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"", "", false},
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"a", "", true},
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"-", "", false},
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {".", "", false},
208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"9", "", true},
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"9a", "", true},
210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"a.", "", true},
211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"a.a", "", true},
212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"9.a", "", true},
213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"a.9", "", true},
214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"_9a", "", false},
215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"-9a", "", false},
216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"-9a", "a", true},
217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"a.a9", "", true},
218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"a.-a9", "", false},
219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"a+9a", "", false},
220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"-a.a9", "", true},
221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"1-.a-b", "", true},
222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"1_.a-b", "", false},
223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"1-2.a_b", "", true},
224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"a.b.c.d.e", "", true},
225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"1.2.3.4.5", "", true},
226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    {"1.2.3.4.5.", "", true},
227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(compliant_host_cases); ++i) {
230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    EXPECT_EQ(compliant_host_cases[i].expected_output,
231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        IsCanonicalizedHostCompliant(compliant_host_cases[i].host,
232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                     compliant_host_cases[i].desired_tld));
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, ParseHostAndPort) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* input;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool success;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* expected_host;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int expected_port;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } tests[] = {
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Valid inputs:
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"foo:10", true, "foo", 10},
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"foo", true, "foo", -1},
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[1080:0:0:0:8:800:200C:4171]:11",
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "1080:0:0:0:8:800:200C:4171",
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      11
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "[1080:0:0:0:8:800:200C:4171]",
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      true,
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "1080:0:0:0:8:800:200C:4171",
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      -1
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Because no validation is done on the host, the following are accepted,
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // even though they are invalid names.
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {"]", true, "]", -1},
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {"::1", true, ":", 1},
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Invalid inputs:
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"foo:bar", false, "", -1},
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"foo:", false, "", -1},
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {":", false, "", -1},
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {":80", false, "", -1},
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"", false, "", -1},
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"porttoolong:300000", false, "", -1},
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"usrname@host", false, "", -1},
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"usrname:password@host", false, "", -1},
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {":password@host", false, "", -1},
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {":password@host:80", false, "", -1},
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {":password@host", false, "", -1},
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {"@host", false, "", -1},
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {"[", false, "", -1},
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {"[]", false, "", -1},
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string host;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int port;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool ok = ParseHostAndPort(tests[i].input, &host, &port);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(tests[i].success, ok);
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (tests[i].success) {
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(tests[i].expected_host, host);
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(tests[i].expected_port, port);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, GetHostAndPort) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* expected_host_and_port;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } tests[] = {
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { GURL("http://www.foo.com/x"), "www.foo.com:80"},
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { GURL("http://www.foo.com:21/x"), "www.foo.com:21"},
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For IPv6 literals should always include the brackets.
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { GURL("http://[1::2]/x"), "[1::2]:80"},
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { GURL("http://[::a]:33/x"), "[::a]:33"},
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string host_and_port = GetHostAndPort(tests[i].url);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(tests[i].expected_host_and_port), host_and_port);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, GetHostAndOptionalPort) {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* expected_host_and_port;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } tests[] = {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { GURL("http://www.foo.com/x"), "www.foo.com"},
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { GURL("http://www.foo.com:21/x"), "www.foo.com:21"},
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // For IPv6 literals should always include the brackets.
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { GURL("http://[1::2]/x"), "[1::2]"},
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { GURL("http://[::a]:33/x"), "[::a]:33"},
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string host_and_port = GetHostAndOptionalPort(tests[i].url);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(tests[i].expected_host_and_port), host_and_port);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, IPAddressToString) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 addr1[4] = {0, 0, 0, 0};
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0.0.0.0", IPAddressToString(addr1, sizeof(addr1)));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 addr2[4] = {192, 168, 0, 1};
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("192.168.0.1", IPAddressToString(addr2, sizeof(addr2)));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("fedc:ba98::", IPAddressToString(addr3, sizeof(addr3)));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, IPAddressToStringWithPort) {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 addr1[4] = {0, 0, 0, 0};
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0.0.0.0:3", IPAddressToStringWithPort(addr1, sizeof(addr1), 3));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 addr2[4] = {192, 168, 0, 1};
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("192.168.0.1:99",
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            IPAddressToStringWithPort(addr2, sizeof(addr2), 99));
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("[fedc:ba98::]:8080",
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            IPAddressToStringWithPort(addr3, sizeof(addr3), 8080));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, NetAddressToString_IPv4) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8 addr[4];
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* result;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } tests[] = {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {{0, 0, 0, 0}, "0.0.0.0"},
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {{127, 0, 0, 1}, "127.0.0.1"},
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {{192, 168, 0, 1}, "192.168.0.1"},
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SockaddrStorage storage;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeIPv4Address(tests[i].addr, 80, &storage);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string result = NetAddressToString(storage.addr, storage.addr_len);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(tests[i].result), result);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, NetAddressToString_IPv6) {
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8 addr[16];
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* result;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } tests[] = {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {{0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0xFE, 0xDC, 0xBA,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x98, 0x76, 0x54, 0x32, 0x10},
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     "fedc:ba98:7654:3210:fedc:ba98:7654:3210"},
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SockaddrStorage storage;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MakeIPv6Address(tests[i].addr, 80, &storage);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(std::string(tests[i].result),
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        NetAddressToString(storage.addr, storage.addr_len));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, NetAddressToStringWithPort_IPv4) {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 addr[] = {127, 0, 0, 1};
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SockaddrStorage storage;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MakeIPv4Address(addr, 166, &storage);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result = NetAddressToStringWithPort(storage.addr,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  storage.addr_len);
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("127.0.0.1:166", result);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, NetAddressToStringWithPort_IPv6) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 addr[] = {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0xFE, 0xDC, 0xBA,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0x98, 0x76, 0x54, 0x32, 0x10
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SockaddrStorage storage;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MakeIPv6Address(addr, 361, &storage);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string result = NetAddressToStringWithPort(storage.addr,
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  storage.addr_len);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // May fail on systems that don't support IPv6.
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!result.empty())
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("[fedc:ba98:7654:3210:fedc:ba98:7654:3210]:361", result);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, GetHostName) {
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We can't check the result of GetHostName() directly, since the result
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will differ across machines. Our goal here is to simply exercise the
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // code path, and check that things "look about right".
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string hostname = GetHostName();
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(hostname.empty());
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, SimplifyUrlForRequest) {
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* input_url;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* expected_simplified_url;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } tests[] = {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Reference section should be stripped.
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.google.com:78/foobar?query=1#hash",
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.google.com:78/foobar?query=1",
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Reference section can itself contain #.
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://192.168.0.1?query=1#hash#10#11#13#14",
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://192.168.0.1?query=1",
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Strip username/password.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://user:pass@google.com",
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://google.com/",
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Strip both the reference and the username/password.
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://user:pass@google.com:80/sup?yo#X#X",
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://google.com/sup?yo",
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Try an HTTPS URL -- strip both the reference and the username/password.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "https://user:pass@google.com:80/sup?yo#X#X",
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "https://google.com:80/sup?yo",
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Try an FTP URL -- strip both the reference and the username/password.
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ftp://user:pass@google.com:80/sup?yo#X#X",
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ftp://google.com:80/sup?yo",
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    { // Try a nonstandard URL
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "foobar://user:pass@google.com:80/sup?yo#X#X",
455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "foobar://user:pass@google.com:80/sup?yo",
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i,
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    tests[i].input_url));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL input_url(GURL(tests[i].input_url));
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL expected_url(GURL(tests[i].expected_simplified_url));
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_url, SimplifyUrlForRequest(input_url));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, SetExplicitlyAllowedPortsTest) {
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string invalid[] = { "1,2,a", "'1','2'", "1, 2, 3", "1 0,11,12" };
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string valid[] = { "", "1", "1,2", "1,2,3", "10,11,12,13" };
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(invalid); ++i) {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetExplicitlyAllowedPorts(invalid[i]);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0, static_cast<int>(GetCountOfExplicitlyAllowedPorts()));
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(valid); ++i) {
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetExplicitlyAllowedPorts(valid[i]);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(i, GetCountOfExplicitlyAllowedPorts());
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, GetHostOrSpecFromURL) {
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("example.com",
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetHostOrSpecFromURL(GURL("http://example.com/test")));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("example.com",
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetHostOrSpecFromURL(GURL("http://example.com./test")));
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("file:///tmp/test.html",
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetHostOrSpecFromURL(GURL("file:///tmp/test.html")));
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
49190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST(NetUtilTest, GetAddressFamily) {
49290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  IPAddressNumber number;
49390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &number));
49490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ADDRESS_FAMILY_IPV4, GetAddressFamily(number));
49590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_TRUE(ParseIPLiteralToNumber("1:abcd::3:4:ff", &number));
49690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(ADDRESS_FAMILY_IPV6, GetAddressFamily(number));
49790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
49890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that invalid IP literals fail to parse.
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, ParseIPLiteralToNumber_FailParse) {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber number;
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ParseIPLiteralToNumber("bad value", &number));
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ParseIPLiteralToNumber("bad:value", &number));
505c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(ParseIPLiteralToNumber(std::string(), &number));
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ParseIPLiteralToNumber("192.168.0.1:30", &number));
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ParseIPLiteralToNumber("  192.168.0.1  ", &number));
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ParseIPLiteralToNumber("[::1]", &number));
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test parsing an IPv4 literal.
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, ParseIPLiteralToNumber_IPv4) {
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber number;
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &number));
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("192,168,0,1", DumpIPNumber(number));
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("192.168.0.1", IPAddressToString(number));
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test parsing an IPv6 literal.
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, ParseIPLiteralToNumber_IPv6) {
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber number;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ParseIPLiteralToNumber("1:abcd::3:4:ff", &number));
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", DumpIPNumber(number));
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("1:abcd::3:4:ff", IPAddressToString(number));
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test mapping an IPv4 address to an IPv6 address.
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, ConvertIPv4NumberToIPv6Number) {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber ipv4_number;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &ipv4_number));
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber ipv6_number =
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertIPv4NumberToIPv6Number(ipv4_number);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ::ffff:192.168.0.1
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("0,0,0,0,0,0,0,0,0,0,255,255,192,168,0,1",
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            DumpIPNumber(ipv6_number));
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("::ffff:c0a8:1", IPAddressToString(ipv6_number));
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST(NetUtilTest, ParseURLHostnameToNumber_FailParse) {
5426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  IPAddressNumber number;
5436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
5446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(ParseURLHostnameToNumber("bad value", &number));
5456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(ParseURLHostnameToNumber("bad:value", &number));
5466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(ParseURLHostnameToNumber(std::string(), &number));
5476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(ParseURLHostnameToNumber("192.168.0.1:30", &number));
5486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(ParseURLHostnameToNumber("  192.168.0.1  ", &number));
5496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_FALSE(ParseURLHostnameToNumber("::1", &number));
5506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
5516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
5526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST(NetUtilTest, ParseURLHostnameToNumber_IPv4) {
5536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  IPAddressNumber number;
5546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_TRUE(ParseURLHostnameToNumber("192.168.0.1", &number));
5556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ("192,168,0,1", DumpIPNumber(number));
5566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ("192.168.0.1", IPAddressToString(number));
5576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
5586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
5596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST(NetUtilTest, ParseURLHostnameToNumber_IPv6) {
5606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  IPAddressNumber number;
5616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_TRUE(ParseURLHostnameToNumber("[1:abcd::3:4:ff]", &number));
5626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", DumpIPNumber(number));
5636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  EXPECT_EQ("1:abcd::3:4:ff", IPAddressToString(number));
5646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
5656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, IsIPv4Mapped) {
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber ipv4_number;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &ipv4_number));
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsIPv4Mapped(ipv4_number));
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber ipv6_number;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ParseIPLiteralToNumber("::1", &ipv4_number));
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(IsIPv4Mapped(ipv6_number));
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber ipv4mapped_number;
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ParseIPLiteralToNumber("::ffff:0101:1", &ipv4mapped_number));
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(IsIPv4Mapped(ipv4mapped_number));
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, ConvertIPv4MappedToIPv4) {
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber ipv4mapped_number;
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ParseIPLiteralToNumber("::ffff:0101:1", &ipv4mapped_number));
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber expected;
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ParseIPLiteralToNumber("1.1.0.1", &expected));
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber result = ConvertIPv4MappedToIPv4(ipv4mapped_number);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(expected, result);
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test parsing invalid CIDR notation literals.
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, ParseCIDRBlock_Invalid) {
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* bad_literals[] = {
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "foobar",
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "192.168.0.1",
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "::1",
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "/",
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "/1",
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "1",
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "192.168.1.1/-1",
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "192.168.1.1/33",
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "::1/-3",
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "a::3/129",
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "::1/x",
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "192.168.0.1//11"
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(bad_literals); ++i) {
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPAddressNumber ip_number;
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t prefix_length_in_bits;
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ParseCIDRBlock(bad_literals[i],
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &ip_number,
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     &prefix_length_in_bits));
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test parsing a valid CIDR notation literal.
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, ParseCIDRBlock_Valid) {
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPAddressNumber ip_number;
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t prefix_length_in_bits;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ParseCIDRBlock("192.168.0.1/11",
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  &ip_number,
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  &prefix_length_in_bits));
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("192,168,0,1", DumpIPNumber(ip_number));
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(11u, prefix_length_in_bits);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, IPNumberMatchesPrefix) {
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct {
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* cidr_literal;
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* ip_literal;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool expected_to_match;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } tests[] = {
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // IPv4 prefix with IPv4 inputs.
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "10.10.1.32/27",
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "10.10.1.44",
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "10.10.1.32/27",
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "10.10.1.90",
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "10.10.1.32/27",
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "10.10.1.90",
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // IPv6 prefix with IPv6 inputs.
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "2001:db8::/32",
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "2001:DB8:3:4::5",
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "2001:db8::/32",
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "2001:c8::",
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // IPv6 prefix with IPv4 inputs.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "2001:db8::/33",
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "192.168.0.1",
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "::ffff:192.168.0.1/112",
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "192.168.33.77",
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // IPv4 prefix with IPv6 inputs.
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "10.11.33.44/16",
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "::ffff:0a0b:89",
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "10.11.33.44/16",
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "::ffff:10.12.33.44",
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s, %s", i,
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    tests[i].cidr_literal,
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    tests[i].ip_literal));
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPAddressNumber ip_number;
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ParseIPLiteralToNumber(tests[i].ip_literal, &ip_number));
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPAddressNumber ip_prefix;
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    size_t prefix_length_in_bits;
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ParseCIDRBlock(tests[i].cidr_literal,
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               &ip_prefix,
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               &prefix_length_in_bits));
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(tests[i].expected_to_match,
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              IPNumberMatchesPrefix(ip_number,
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ip_prefix,
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    prefix_length_in_bits));
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, IsLocalhost) {
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(net::IsLocalhost("localhost"));
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(net::IsLocalhost("localhost.localdomain"));
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(net::IsLocalhost("localhost6"));
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(net::IsLocalhost("localhost6.localdomain6"));
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(net::IsLocalhost("127.0.0.1"));
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(net::IsLocalhost("127.0.1.0"));
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(net::IsLocalhost("127.1.0.0"));
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(net::IsLocalhost("127.0.0.255"));
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(net::IsLocalhost("127.0.255.0"));
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(net::IsLocalhost("127.255.0.0"));
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(net::IsLocalhost("::1"));
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(net::IsLocalhost("0:0:0:0:0:0:0:1"));
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(net::IsLocalhost("localhostx"));
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(net::IsLocalhost("foo.localdomain"));
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(net::IsLocalhost("localhost6x"));
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(net::IsLocalhost("localhost.localdomain6"));
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(net::IsLocalhost("localhost6.localdomain"));
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(net::IsLocalhost("127.0.0.1.1"));
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(net::IsLocalhost(".127.0.0.255"));
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(net::IsLocalhost("::2"));
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(net::IsLocalhost("::1:1"));
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(net::IsLocalhost("0:0:0:0:1:0:0:1"));
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(net::IsLocalhost("::1:1"));
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(net::IsLocalhost("0:0:0:0:0:0:0:0:1"));
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify GetNetworkList().
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(NetUtilTest, GetNetworkList) {
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NetworkInterfaceList list;
7425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(GetNetworkList(&list, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES));
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (NetworkInterfaceList::iterator it = list.begin();
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != list.end(); ++it) {
745a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Verify that the names are not empty.
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(it->name.empty());
747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_FALSE(it->friendly_name.empty());
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Verify that the address is correct.
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(it->address.size() == kIPv4AddressSize ||
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                it->address.size() == kIPv6AddressSize)
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "Invalid address of size " << it->address.size();
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool all_zeroes = true;
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (size_t i = 0; i < it->address.size(); ++i) {
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (it->address[i] != 0) {
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        all_zeroes = false;
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(all_zeroes);
7614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    EXPECT_GT(it->network_prefix, 1u);
76268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_LE(it->network_prefix, it->address.size() * 8);
763a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
764a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN)
765a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // On Windows |name| is NET_LUID.
766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::ScopedNativeLibrary phlpapi_lib(
767a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        base::FilePath(FILE_PATH_LITERAL("iphlpapi.dll")));
768a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(phlpapi_lib.is_valid());
769a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    typedef NETIO_STATUS (WINAPI* ConvertInterfaceIndexToLuid)(NET_IFINDEX,
770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                               PNET_LUID);
771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ConvertInterfaceIndexToLuid interface_to_luid =
772a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        reinterpret_cast<ConvertInterfaceIndexToLuid>(
773a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            phlpapi_lib.GetFunctionPointer("ConvertInterfaceIndexToLuid"));
774a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
775a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    typedef NETIO_STATUS (WINAPI* ConvertInterfaceLuidToGuid)(NET_LUID*,
776a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                              GUID*);
777a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ConvertInterfaceLuidToGuid luid_to_guid =
778a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        reinterpret_cast<ConvertInterfaceLuidToGuid>(
779a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            phlpapi_lib.GetFunctionPointer("ConvertInterfaceLuidToGuid"));
780a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
781a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (interface_to_luid && luid_to_guid) {
782a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      NET_LUID luid;
783a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(interface_to_luid(it->interface_index, &luid), NO_ERROR);
784a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      GUID guid;
785a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_EQ(luid_to_guid(&luid, &guid), NO_ERROR);
786a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      LPOLESTR name;
787a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      StringFromCLSID(guid, &name);
7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_STREQ(base::UTF8ToWide(it->name).c_str(), name);
789a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      CoTaskMemFree(name);
790a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      continue;
791a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    } else {
792a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_LT(base::win::GetVersion(), base::win::VERSION_VISTA);
793a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_LT(it->interface_index, 1u << 24u);  // Must fit 0.x.x.x.
794a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      EXPECT_NE(it->interface_index, 0u);  // 0 means to use default.
795a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
796010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (it->type == NetworkChangeNotifier::CONNECTION_WIFI) {
797010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      EXPECT_NE(WIFI_PHY_LAYER_PROTOCOL_NONE, GetWifiPHYLayerProtocol());
798010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    }
799a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif !defined(OS_ANDROID)
800a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    char name[IF_NAMESIZE];
801a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_TRUE(if_indextoname(it->interface_index, name));
802a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_STREQ(it->name.c_str(), name);
803a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace {
8081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN)
8101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool read_int_or_bool(DWORD data_size,
8111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      PVOID data) {
8121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (data_size) {
8131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case 1:
8141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return !!*reinterpret_cast<uint8*>(data);
8151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case 4:
8161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return !!*reinterpret_cast<uint32*>(data);
8171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
8181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      LOG(FATAL) << "That is not a type I know!";
8191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return false;
8201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
8221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint GetWifiOptions() {
8241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const internal::WlanApi& wlanapi = internal::WlanApi::GetInstance();
8251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!wlanapi.initialized)
8261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return -1;
8271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  internal::WlanHandle client;
8291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DWORD cur_version = 0;
8301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const DWORD kMaxClientVersion = 2;
8311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DWORD result = wlanapi.OpenHandle(
8321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      kMaxClientVersion, &cur_version, &client);
8331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (result != ERROR_SUCCESS)
8341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return -1;
8351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WLAN_INTERFACE_INFO_LIST* interface_list_ptr = NULL;
8371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  result = wlanapi.enum_interfaces_func(client.Get(), NULL,
8381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                        &interface_list_ptr);
8391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (result != ERROR_SUCCESS)
8401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return -1;
8411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<WLAN_INTERFACE_INFO_LIST, internal::WlanApiDeleter> interface_list(
8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      interface_list_ptr);
8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (unsigned i = 0; i < interface_list->dwNumberOfItems; ++i) {
8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WLAN_INTERFACE_INFO* info = &interface_list->InterfaceInfo[i];
8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DWORD data_size;
8471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    PVOID data;
8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    int options = 0;
8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    result = wlanapi.query_interface_func(
8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        client.Get(),
8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &info->InterfaceGuid,
8521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        wlan_intf_opcode_background_scan_enabled,
8531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        NULL,
8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &data_size,
8551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &data,
8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        NULL);
8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (result != ERROR_SUCCESS)
8581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      continue;
8591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (!read_int_or_bool(data_size, data)) {
8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      options |= WIFI_OPTIONS_DISABLE_SCAN;
8611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
8621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    internal::WlanApi::GetInstance().free_memory_func(data);
8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    result = wlanapi.query_interface_func(
8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        client.Get(),
8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &info->InterfaceGuid,
8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        wlan_intf_opcode_media_streaming_mode,
8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        NULL,
8691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &data_size,
8701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        &data,
8711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        NULL);
8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (result != ERROR_SUCCESS)
8731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      continue;
8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (read_int_or_bool(data_size, data)) {
8751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      options |= WIFI_OPTIONS_MEDIA_STREAMING_MODE;
8761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    internal::WlanApi::GetInstance().free_memory_func(data);
8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // Just the the options from the first succesful
8801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // interface.
8811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return options;
8821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
8831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // No wifi interface found.
8851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return -1;
8861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
8871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else  // OS_WIN
8891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciint GetWifiOptions() {
8911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Not supported.
8921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return -1;
8931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
8941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // OS_WIN
8961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
8971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid TryChangeWifiOptions(int options) {
8981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int previous_options = GetWifiOptions();
8991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<ScopedWifiOptions> scoped_options = SetWifiOptions(options);
9001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(previous_options | options, GetWifiOptions());
9011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_options.reset();
9021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(previous_options, GetWifiOptions());
9031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
9041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};  // namespace
9061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
9071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test SetWifiOptions().
9081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST(NetUtilTest, SetWifiOptionsTest) {
9091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TryChangeWifiOptions(0);
9101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TryChangeWifiOptions(WIFI_OPTIONS_DISABLE_SCAN);
9111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TryChangeWifiOptions(WIFI_OPTIONS_MEDIA_STREAMING_MODE);
9121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TryChangeWifiOptions(WIFI_OPTIONS_DISABLE_SCAN |
9131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       WIFI_OPTIONS_MEDIA_STREAMING_MODE);
9141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
9151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
916a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)struct NonUniqueNameTestData {
917a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool is_unique;
918a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const char* hostname;
919a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
920a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
921a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Google Test pretty-printer.
922a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void PrintTo(const NonUniqueNameTestData& data, std::ostream* os) {
923a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(data.hostname);
924a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  *os << " hostname: " << testing::PrintToString(data.hostname)
925a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      << "; is_unique: " << testing::PrintToString(data.is_unique);
926a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
927a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
928a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)const NonUniqueNameTestData kNonUniqueNameTestData[] = {
929a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Domains under ICANN-assigned domains.
930a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { true, "google.com" },
931a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { true, "google.co.uk" },
932a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Domains under private registries.
933a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { true, "appspot.com" },
934a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { true, "test.appspot.com" },
9353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Unreserved IPv4 addresses (in various forms).
936a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { true, "8.8.8.8" },
9373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, "99.64.0.0" },
9383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, "212.15.0.0" },
9393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, "212.15" },
9403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, "212.15.0" },
9413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, "3557752832" },
9423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Reserved IPv4 addresses (in various forms).
9433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { false, "192.168.0.0" },
9443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { false, "192.168.0.6" },
9453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { false, "10.0.0.5" },
9463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { false, "10.0" },
9473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { false, "10.0.0" },
9483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { false, "3232235526" },
9493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Unreserved IPv6 addresses.
9503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, "FFC0:ba98:7654:3210:FEDC:BA98:7654:3210" },
9513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { true, "2000:ba98:7654:2301:EFCD:BA98:7654:3210" },
9523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    // Reserved IPv6 addresses.
9533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { false, "::192.9.5.5" },
9543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { false, "FEED::BEEF" },
9553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    { false, "FEC0:ba98:7654:3210:FEDC:BA98:7654:3210" },
956a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // 'internal'/non-IANA assigned domains.
957a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { false, "intranet" },
958a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { false, "intranet." },
959a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { false, "intranet.example" },
960a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { false, "host.intranet.example" },
961a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // gTLDs under discussion, but not yet assigned.
962a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { false, "intranet.corp" },
963a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { false, "example.tech" },
964a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { false, "intranet.internal" },
965a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // Invalid host names are treated as unique - but expected to be
966a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    // filtered out before then.
967a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { true, "junk)(£)$*!@~#" },
968a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { true, "w$w.example.com" },
969a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { true, "nocolonsallowed:example" },
970a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    { true, "[::4.5.6.9]" },
971a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
972a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
973a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class NetUtilNonUniqueNameTest
974a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : public testing::TestWithParam<NonUniqueNameTestData> {
975a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
976a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual ~NetUtilNonUniqueNameTest() {}
977a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
978a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected:
979a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool IsUnique(const std::string& hostname) {
980a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return !IsHostnameNonUnique(hostname);
981a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
982a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
983a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
984a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Test that internal/non-unique names are properly identified as such, but
985a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// that IP addresses and hosts beneath registry-controlled domains are flagged
986a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// as unique names.
987a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_P(NetUtilNonUniqueNameTest, IsHostnameNonUnique) {
988a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const NonUniqueNameTestData& test_data = GetParam();
989a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
990a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(test_data.is_unique, IsUnique(test_data.hostname));
991a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
992a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
993a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(, NetUtilNonUniqueNameTest,
994a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                        testing::ValuesIn(kNonUniqueNameTestData));
995a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
997