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