Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(174)

Side by Side Diff: net/base/net_util_unittest.cc

Issue 1177933002: Resolve RFC 6761 localhost names to loopback (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: style tweaks, simplification Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/base/net_util.h" 5 #include "net/base/net_util.h"
6 6
7 #include <string.h> 7 #include <string.h>
8 8
9 #include <ostream> 9 #include <ostream>
10 10
11 #include "base/files/file_path.h" 11 #include "base/files/file_path.h"
12 #include "base/format_macros.h" 12 #include "base/format_macros.h"
13 #include "base/scoped_native_library.h" 13 #include "base/scoped_native_library.h"
14 #include "base/strings/string_number_conversions.h" 14 #include "base/strings/string_number_conversions.h"
15 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
16 #include "base/strings/stringprintf.h" 16 #include "base/strings/stringprintf.h"
17 #include "base/strings/utf_string_conversions.h" 17 #include "base/strings/utf_string_conversions.h"
18 #include "base/sys_byteorder.h" 18 #include "base/sys_byteorder.h"
19 #include "base/time/time.h" 19 #include "base/time/time.h"
20 #include "net/base/address_list.h"
20 #include "net/base/ip_endpoint.h" 21 #include "net/base/ip_endpoint.h"
21 22
22 #if !defined(OS_NACL) && !defined(OS_WIN) 23 #if !defined(OS_NACL) && !defined(OS_WIN)
23 #include <net/if.h> 24 #include <net/if.h>
24 #include <netinet/in.h> 25 #include <netinet/in.h>
25 #if defined(OS_MACOSX) 26 #if defined(OS_MACOSX)
26 #include <ifaddrs.h> 27 #include <ifaddrs.h>
27 #if !defined(OS_IOS) 28 #if !defined(OS_IOS)
28 #include <netinet/in_var.h> 29 #include <netinet/in_var.h>
29 #endif // !OS_IOS 30 #endif // !OS_IOS
(...skipping 17 matching lines...) Expand all
47 48
48 namespace net { 49 namespace net {
49 50
50 namespace { 51 namespace {
51 52
52 struct HeaderCase { 53 struct HeaderCase {
53 const char* const header_name; 54 const char* const header_name;
54 const char* const expected; 55 const char* const expected;
55 }; 56 };
56 57
58 const unsigned char kLocalhostIPv4[] = {127, 0, 0, 1};
59 const unsigned char kLocalhostIPv6[] =
60 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
61 const uint16_t kLocalhostLookupPort = 80;
62
57 // Fills in sockaddr for the given 32-bit address (IPv4.) 63 // Fills in sockaddr for the given 32-bit address (IPv4.)
58 // |bytes| should be an array of length 4. 64 // |bytes| should be an array of length 4.
59 void MakeIPv4Address(const uint8_t* bytes, int port, SockaddrStorage* storage) { 65 void MakeIPv4Address(const uint8_t* bytes, int port, SockaddrStorage* storage) {
60 memset(&storage->addr_storage, 0, sizeof(storage->addr_storage)); 66 memset(&storage->addr_storage, 0, sizeof(storage->addr_storage));
61 storage->addr_len = sizeof(struct sockaddr_in); 67 storage->addr_len = sizeof(struct sockaddr_in);
62 struct sockaddr_in* addr4 = reinterpret_cast<sockaddr_in*>(storage->addr); 68 struct sockaddr_in* addr4 = reinterpret_cast<sockaddr_in*>(storage->addr);
63 addr4->sin_port = base::HostToNet16(port); 69 addr4->sin_port = base::HostToNet16(port);
64 addr4->sin_family = AF_INET; 70 addr4->sin_family = AF_INET;
65 memcpy(&addr4->sin_addr, bytes, 4); 71 memcpy(&addr4->sin_addr, bytes, 4);
66 } 72 }
67 73
68 // Fills in sockaddr for the given 128-bit address (IPv6.) 74 // Fills in sockaddr for the given 128-bit address (IPv6.)
69 // |bytes| should be an array of length 16. 75 // |bytes| should be an array of length 16.
70 void MakeIPv6Address(const uint8_t* bytes, int port, SockaddrStorage* storage) { 76 void MakeIPv6Address(const uint8_t* bytes, int port, SockaddrStorage* storage) {
71 memset(&storage->addr_storage, 0, sizeof(storage->addr_storage)); 77 memset(&storage->addr_storage, 0, sizeof(storage->addr_storage));
72 storage->addr_len = sizeof(struct sockaddr_in6); 78 storage->addr_len = sizeof(struct sockaddr_in6);
73 struct sockaddr_in6* addr6 = reinterpret_cast<sockaddr_in6*>(storage->addr); 79 struct sockaddr_in6* addr6 = reinterpret_cast<sockaddr_in6*>(storage->addr);
74 addr6->sin6_port = base::HostToNet16(port); 80 addr6->sin6_port = base::HostToNet16(port);
75 addr6->sin6_family = AF_INET6; 81 addr6->sin6_family = AF_INET6;
76 memcpy(&addr6->sin6_addr, bytes, 16); 82 memcpy(&addr6->sin6_addr, bytes, 16);
77 } 83 }
78 84
85 bool HasEndpoint(const IPEndPoint& endpoint, const AddressList& addresses) {
86 for (const auto& address : addresses) {
87 if (endpoint == address)
88 return true;
89 }
90 return false;
91 }
92
93 void TestBothLoopbackIPs(const std::string& host) {
94 IPEndPoint localhost_ipv4(
95 IPAddressNumber(kLocalhostIPv4,
96 kLocalhostIPv4 + arraysize(kLocalhostIPv4)),
97 kLocalhostLookupPort);
98 IPEndPoint localhost_ipv6(
99 IPAddressNumber(kLocalhostIPv6,
100 kLocalhostIPv6 + arraysize(kLocalhostIPv6)),
101 kLocalhostLookupPort);
102
103 AddressList addresses;
104 EXPECT_TRUE(ResolveLocalHostname(host, kLocalhostLookupPort, &addresses));
105 EXPECT_EQ(2u, addresses.size());
106 EXPECT_TRUE(HasEndpoint(localhost_ipv4, addresses));
107 EXPECT_TRUE(HasEndpoint(localhost_ipv6, addresses));
108 }
109
110 void TestIPv6LoopbackOnly(const std::string& host) {
111 IPEndPoint localhost_ipv6(
112 IPAddressNumber(kLocalhostIPv6,
113 kLocalhostIPv6 + arraysize(kLocalhostIPv6)),
114 kLocalhostLookupPort);
115
116 AddressList addresses;
117 EXPECT_TRUE(ResolveLocalHostname(host, kLocalhostLookupPort, &addresses));
118 EXPECT_EQ(1u, addresses.size());
119 EXPECT_TRUE(HasEndpoint(localhost_ipv6, addresses));
120 }
121
79 } // anonymous namespace 122 } // anonymous namespace
80 123
81 TEST(NetUtilTest, GetIdentityFromURL) { 124 TEST(NetUtilTest, GetIdentityFromURL) {
82 struct { 125 struct {
83 const char* const input_url; 126 const char* const input_url;
84 const char* const expected_username; 127 const char* const expected_username;
85 const char* const expected_password; 128 const char* const expected_password;
86 } tests[] = { 129 } tests[] = {
87 { 130 {
88 "http://username:password@google.com", 131 "http://username:password@google.com",
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 TEST(NetUtilTest, GetAddressFamily) { 513 TEST(NetUtilTest, GetAddressFamily) {
471 IPAddressNumber number; 514 IPAddressNumber number;
472 EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &number)); 515 EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &number));
473 EXPECT_EQ(ADDRESS_FAMILY_IPV4, GetAddressFamily(number)); 516 EXPECT_EQ(ADDRESS_FAMILY_IPV4, GetAddressFamily(number));
474 EXPECT_TRUE(ParseIPLiteralToNumber("1:abcd::3:4:ff", &number)); 517 EXPECT_TRUE(ParseIPLiteralToNumber("1:abcd::3:4:ff", &number));
475 EXPECT_EQ(ADDRESS_FAMILY_IPV6, GetAddressFamily(number)); 518 EXPECT_EQ(ADDRESS_FAMILY_IPV6, GetAddressFamily(number));
476 } 519 }
477 520
478 TEST(NetUtilTest, IsLocalhost) { 521 TEST(NetUtilTest, IsLocalhost) {
479 EXPECT_TRUE(IsLocalhost("localhost")); 522 EXPECT_TRUE(IsLocalhost("localhost"));
523 EXPECT_TRUE(IsLocalhost("localhost."));
480 EXPECT_TRUE(IsLocalhost("localhost.localdomain")); 524 EXPECT_TRUE(IsLocalhost("localhost.localdomain"));
525 EXPECT_TRUE(IsLocalhost("localhost.localdomain."));
481 EXPECT_TRUE(IsLocalhost("localhost6")); 526 EXPECT_TRUE(IsLocalhost("localhost6"));
527 EXPECT_TRUE(IsLocalhost("localhost6."));
482 EXPECT_TRUE(IsLocalhost("localhost6.localdomain6")); 528 EXPECT_TRUE(IsLocalhost("localhost6.localdomain6"));
529 EXPECT_TRUE(IsLocalhost("localhost6.localdomain6."));
483 EXPECT_TRUE(IsLocalhost("127.0.0.1")); 530 EXPECT_TRUE(IsLocalhost("127.0.0.1"));
484 EXPECT_TRUE(IsLocalhost("127.0.1.0")); 531 EXPECT_TRUE(IsLocalhost("127.0.1.0"));
485 EXPECT_TRUE(IsLocalhost("127.1.0.0")); 532 EXPECT_TRUE(IsLocalhost("127.1.0.0"));
486 EXPECT_TRUE(IsLocalhost("127.0.0.255")); 533 EXPECT_TRUE(IsLocalhost("127.0.0.255"));
487 EXPECT_TRUE(IsLocalhost("127.0.255.0")); 534 EXPECT_TRUE(IsLocalhost("127.0.255.0"));
488 EXPECT_TRUE(IsLocalhost("127.255.0.0")); 535 EXPECT_TRUE(IsLocalhost("127.255.0.0"));
489 EXPECT_TRUE(IsLocalhost("::1")); 536 EXPECT_TRUE(IsLocalhost("::1"));
490 EXPECT_TRUE(IsLocalhost("0:0:0:0:0:0:0:1")); 537 EXPECT_TRUE(IsLocalhost("0:0:0:0:0:0:0:1"));
491 EXPECT_TRUE(IsLocalhost("foo.localhost")); 538 EXPECT_TRUE(IsLocalhost("foo.localhost"));
539 EXPECT_TRUE(IsLocalhost("foo.localhost."));
492 540
493 EXPECT_FALSE(IsLocalhost("localhostx")); 541 EXPECT_FALSE(IsLocalhost("localhostx"));
542 EXPECT_FALSE(IsLocalhost("localhost.x"));
494 EXPECT_FALSE(IsLocalhost("foo.localdomain")); 543 EXPECT_FALSE(IsLocalhost("foo.localdomain"));
544 EXPECT_FALSE(IsLocalhost("foo.localdomain.x"));
495 EXPECT_FALSE(IsLocalhost("localhost6x")); 545 EXPECT_FALSE(IsLocalhost("localhost6x"));
496 EXPECT_FALSE(IsLocalhost("localhost.localdomain6")); 546 EXPECT_FALSE(IsLocalhost("localhost.localdomain6"));
497 EXPECT_FALSE(IsLocalhost("localhost6.localdomain")); 547 EXPECT_FALSE(IsLocalhost("localhost6.localdomain"));
498 EXPECT_FALSE(IsLocalhost("127.0.0.1.1")); 548 EXPECT_FALSE(IsLocalhost("127.0.0.1.1"));
499 EXPECT_FALSE(IsLocalhost(".127.0.0.255")); 549 EXPECT_FALSE(IsLocalhost(".127.0.0.255"));
500 EXPECT_FALSE(IsLocalhost("::2")); 550 EXPECT_FALSE(IsLocalhost("::2"));
501 EXPECT_FALSE(IsLocalhost("::1:1")); 551 EXPECT_FALSE(IsLocalhost("::1:1"));
502 EXPECT_FALSE(IsLocalhost("0:0:0:0:1:0:0:1")); 552 EXPECT_FALSE(IsLocalhost("0:0:0:0:1:0:0:1"));
503 EXPECT_FALSE(IsLocalhost("::1:1")); 553 EXPECT_FALSE(IsLocalhost("::1:1"));
504 EXPECT_FALSE(IsLocalhost("0:0:0:0:0:0:0:0:1")); 554 EXPECT_FALSE(IsLocalhost("0:0:0:0:0:0:0:0:1"));
505 EXPECT_FALSE(IsLocalhost("foo.localhost.com")); 555 EXPECT_FALSE(IsLocalhost("foo.localhost.com"));
506 EXPECT_FALSE(IsLocalhost("foo.localhoste")); 556 EXPECT_FALSE(IsLocalhost("foo.localhoste"));
507 } 557 }
508 558
559 TEST(NetUtilTest, ResolveLocalHostname) {
560 AddressList addresses;
561
562 TestBothLoopbackIPs("localhost");
563 TestBothLoopbackIPs("localhost.");
564 TestBothLoopbackIPs("localhost.localdomain");
565 TestBothLoopbackIPs("localhost.localdomain.");
566 TestBothLoopbackIPs("foo.localhost");
567 TestBothLoopbackIPs("foo.localhost.");
568
569 TestIPv6LoopbackOnly("localhost6");
570 TestIPv6LoopbackOnly("localhost6.");
571 TestIPv6LoopbackOnly("localhost6.localdomain6");
572 TestIPv6LoopbackOnly("localhost6.localdomain6.");
573
574 EXPECT_FALSE(
575 ResolveLocalHostname("127.0.0.1", kLocalhostLookupPort, &addresses));
576 EXPECT_FALSE(ResolveLocalHostname("::1", kLocalhostLookupPort, &addresses));
577 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:1", kLocalhostLookupPort,
578 &addresses));
579 EXPECT_FALSE(
580 ResolveLocalHostname("localhostx", kLocalhostLookupPort, &addresses));
581 EXPECT_FALSE(
582 ResolveLocalHostname("localhost.x", kLocalhostLookupPort, &addresses));
583 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain", kLocalhostLookupPort,
584 &addresses));
585 EXPECT_FALSE(ResolveLocalHostname("foo.localdomain.x", kLocalhostLookupPort,
586 &addresses));
587 EXPECT_FALSE(
588 ResolveLocalHostname("localhost6x", kLocalhostLookupPort, &addresses));
589 EXPECT_FALSE(ResolveLocalHostname("localhost.localdomain6",
590 kLocalhostLookupPort, &addresses));
591 EXPECT_FALSE(ResolveLocalHostname("localhost6.localdomain",
592 kLocalhostLookupPort, &addresses));
593 EXPECT_FALSE(
594 ResolveLocalHostname("127.0.0.1.1", kLocalhostLookupPort, &addresses));
595 EXPECT_FALSE(
596 ResolveLocalHostname(".127.0.0.255", kLocalhostLookupPort, &addresses));
597 EXPECT_FALSE(ResolveLocalHostname("::2", kLocalhostLookupPort, &addresses));
598 EXPECT_FALSE(ResolveLocalHostname("::1:1", kLocalhostLookupPort, &addresses));
599 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:1:0:0:1", kLocalhostLookupPort,
600 &addresses));
601 EXPECT_FALSE(ResolveLocalHostname("::1:1", kLocalhostLookupPort, &addresses));
602 EXPECT_FALSE(ResolveLocalHostname("0:0:0:0:0:0:0:0:1", kLocalhostLookupPort,
603 &addresses));
604 EXPECT_FALSE(ResolveLocalHostname("foo.localhost.com", kLocalhostLookupPort,
605 &addresses));
606 EXPECT_FALSE(
607 ResolveLocalHostname("foo.localhoste", kLocalhostLookupPort, &addresses));
608 }
609
509 TEST(NetUtilTest, IsLocalhostTLD) { 610 TEST(NetUtilTest, IsLocalhostTLD) {
510 EXPECT_TRUE(IsLocalhostTLD("foo.localhost")); 611 EXPECT_TRUE(IsLocalhostTLD("foo.localhost"));
511 EXPECT_TRUE(IsLocalhostTLD("foo.localhost.")); 612 EXPECT_TRUE(IsLocalhostTLD("foo.localhost."));
512 EXPECT_FALSE(IsLocalhostTLD("foo.localhos")); 613 EXPECT_FALSE(IsLocalhostTLD("foo.localhos"));
513 EXPECT_FALSE(IsLocalhostTLD("foo.localhost.com")); 614 EXPECT_FALSE(IsLocalhostTLD("foo.localhost.com"));
514 EXPECT_FALSE(IsLocalhost("foo.localhoste")); 615 EXPECT_FALSE(IsLocalhost("foo.localhoste"));
515 } 616 }
516 617
517 TEST(NetUtilTest, GoogleHost) { 618 TEST(NetUtilTest, GoogleHost) {
518 struct GoogleHostCase { 619 struct GoogleHostCase {
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
624 TEST_P(NetUtilNonUniqueNameTest, IsHostnameNonUnique) { 725 TEST_P(NetUtilNonUniqueNameTest, IsHostnameNonUnique) {
625 const NonUniqueNameTestData& test_data = GetParam(); 726 const NonUniqueNameTestData& test_data = GetParam();
626 727
627 EXPECT_EQ(test_data.is_unique, IsUnique(test_data.hostname)); 728 EXPECT_EQ(test_data.is_unique, IsUnique(test_data.hostname));
628 } 729 }
629 730
630 INSTANTIATE_TEST_CASE_P(, NetUtilNonUniqueNameTest, 731 INSTANTIATE_TEST_CASE_P(, NetUtilNonUniqueNameTest,
631 testing::ValuesIn(kNonUniqueNameTestData)); 732 testing::ValuesIn(kNonUniqueNameTestData));
632 733
633 } // namespace net 734 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698