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
3 // found in the LICENSE file.
5 #include "net/base/net_util.h"
11 #include "base/files/file_path.h"
12 #include "base/format_macros.h"
13 #include "base/scoped_native_library.h"
14 #include "base/strings/string_number_conversions.h"
15 #include "base/strings/string_util.h"
16 #include "base/strings/stringprintf.h"
17 #include "base/strings/utf_string_conversions.h"
18 #include "base/sys_byteorder.h"
19 #include "base/time/time.h"
21 #if !defined(OS_NACL) && !defined(OS_WIN)
23 #include <netinet/in.h>
24 #endif // !OS_NACL && !OS_WIN
25 #include "testing/gtest/include/gtest/gtest.h"
31 #include "base/win/windows_version.h"
32 #include "net/base/net_util_win.h"
35 #if !defined(OS_MACOSX) && !defined(OS_NACL) && !defined(OS_WIN)
36 #include "net/base/address_tracker_linux.h"
37 #endif // !OS_MACOSX && !OS_NACL && !OS_WIN
40 #include "net/base/net_util_posix.h"
43 using base::ASCIIToUTF16;
44 using base::WideToUTF16;
51 const char* header_name;
55 // Fills in sockaddr for the given 32-bit address (IPv4.)
56 // |bytes| should be an array of length 4.
57 void MakeIPv4Address(const uint8* bytes, int port, SockaddrStorage* storage) {
58 memset(&storage->addr_storage, 0, sizeof(storage->addr_storage));
59 storage->addr_len = sizeof(struct sockaddr_in);
60 struct sockaddr_in* addr4 = reinterpret_cast<sockaddr_in*>(storage->addr);
61 addr4->sin_port = base::HostToNet16(port);
62 addr4->sin_family = AF_INET;
63 memcpy(&addr4->sin_addr, bytes, 4);
66 // Fills in sockaddr for the given 128-bit address (IPv6.)
67 // |bytes| should be an array of length 16.
68 void MakeIPv6Address(const uint8* bytes, int port, SockaddrStorage* storage) {
69 memset(&storage->addr_storage, 0, sizeof(storage->addr_storage));
70 storage->addr_len = sizeof(struct sockaddr_in6);
71 struct sockaddr_in6* addr6 = reinterpret_cast<sockaddr_in6*>(storage->addr);
72 addr6->sin6_port = base::HostToNet16(port);
73 addr6->sin6_family = AF_INET6;
74 memcpy(&addr6->sin6_addr, bytes, 16);
77 // Helper to strignize an IP number (used to define expectations).
78 std::string DumpIPNumber(const IPAddressNumber& v) {
80 for (size_t i = 0; i < v.size(); ++i) {
83 out.append(base::IntToString(static_cast<int>(v[i])));
88 } // anonymous namespace
90 TEST(NetUtilTest, GetIdentityFromURL) {
92 const char* input_url;
93 const char* expected_username;
94 const char* expected_password;
97 "http://username:password@google.com",
101 { // Test for http://crbug.com/19200
102 "http://username:p@ssword@google.com",
106 { // Special URL characters should be unescaped.
107 "http://username:p%3fa%26s%2fs%23@google.com",
111 { // Username contains %20.
112 "http://use rname:password@google.com",
117 "http://use%00rname:password@google.com",
121 { // Use a '+' in the username.
122 "http://use+rname:password@google.com",
126 { // Use a '&' in the password.
127 "http://username:p&ssword@google.com",
132 for (size_t i = 0; i < arraysize(tests); ++i) {
133 SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i,
134 tests[i].input_url));
135 GURL url(tests[i].input_url);
137 base::string16 username, password;
138 GetIdentityFromURL(url, &username, &password);
140 EXPECT_EQ(ASCIIToUTF16(tests[i].expected_username), username);
141 EXPECT_EQ(ASCIIToUTF16(tests[i].expected_password), password);
145 // Try extracting a username which was encoded with UTF8.
146 TEST(NetUtilTest, GetIdentityFromURL_UTF8) {
147 GURL url(WideToUTF16(L"http://foo:\x4f60\x597d@blah.com"));
149 EXPECT_EQ("foo", url.username());
150 EXPECT_EQ("%E4%BD%A0%E5%A5%BD", url.password());
152 // Extract the unescaped identity.
153 base::string16 username, password;
154 GetIdentityFromURL(url, &username, &password);
156 // Verify that it was decoded as UTF8.
157 EXPECT_EQ(ASCIIToUTF16("foo"), username);
158 EXPECT_EQ(WideToUTF16(L"\x4f60\x597d"), password);
161 // Just a bunch of fake headers.
162 const char* google_headers =
164 "Content-TYPE: text/html; charset=utf-8\n"
165 "Content-disposition: attachment; filename=\"download.pdf\"\n"
166 "Content-Length: 378557\n"
167 "X-Google-Google1: 314159265\n"
168 "X-Google-Google2: aaaa2:7783,bbb21:9441\n"
169 "X-Google-Google4: home\n"
170 "Transfer-Encoding: chunked\n"
171 "Set-Cookie: HEHE_AT=6666x66beef666x6-66xx6666x66; Path=/mail\n"
172 "Set-Cookie: HEHE_HELP=owned:0;Path=/\n"
173 "Set-Cookie: S=gmail=Xxx-beefbeefbeef_beefb:gmail_yj=beefbeef000beefbee"
174 "fbee:gmproxy=bee-fbeefbe; Domain=.google.com; Path=/\n"
175 "X-Google-Google2: /one/two/three/four/five/six/seven-height/nine:9411\n"
177 "Transfer-Encoding: chunked\n"
178 "Date: Mon, 13 Nov 2006 21:38:09 GMT\n"
179 "Expires: Tue, 14 Nov 2006 19:23:58 GMT\n"
180 "X-Malformed: bla; arg=test\"\n"
181 "X-Malformed2: bla; arg=\n"
182 "X-Test: bla; arg1=val1; arg2=val2";
184 TEST(NetUtilTest, GetSpecificHeader) {
185 const HeaderCase tests[] = {
186 {"content-type", "text/html; charset=utf-8"},
187 {"CONTENT-LENGTH", "378557"},
188 {"Date", "Mon, 13 Nov 2006 21:38:09 GMT"},
193 // Test first with google_headers.
194 for (size_t i = 0; i < arraysize(tests); ++i) {
196 GetSpecificHeader(google_headers, tests[i].header_name);
197 EXPECT_EQ(result, tests[i].expected);
200 // Test again with empty headers.
201 for (size_t i = 0; i < arraysize(tests); ++i) {
202 std::string result = GetSpecificHeader(std::string(), tests[i].header_name);
203 EXPECT_EQ(result, std::string());
207 TEST(NetUtilTest, CompliantHost) {
208 struct CompliantHostCase {
210 bool expected_output;
213 const CompliantHostCase compliant_host_cases[] = {
235 {"1.2.3.4.5.", true},
238 for (size_t i = 0; i < arraysize(compliant_host_cases); ++i) {
239 EXPECT_EQ(compliant_host_cases[i].expected_output,
240 IsCanonicalizedHostCompliant(compliant_host_cases[i].host));
244 TEST(NetUtilTest, ParseHostAndPort) {
248 const char* expected_host;
252 {"foo:10", true, "foo", 10},
253 {"foo", true, "foo", -1},
255 "[1080:0:0:0:8:800:200C:4171]:11",
257 "1080:0:0:0:8:800:200C:4171",
261 "[1080:0:0:0:8:800:200C:4171]",
263 "1080:0:0:0:8:800:200C:4171",
267 // Because no validation is done on the host, the following are accepted,
268 // even though they are invalid names.
269 {"]", true, "]", -1},
270 {"::1", true, ":", 1},
272 {"foo:bar", false, "", -1},
273 {"foo:", false, "", -1},
274 {":", false, "", -1},
275 {":80", false, "", -1},
277 {"porttoolong:300000", false, "", -1},
278 {"usrname@host", false, "", -1},
279 {"usrname:password@host", false, "", -1},
280 {":password@host", false, "", -1},
281 {":password@host:80", false, "", -1},
282 {":password@host", false, "", -1},
283 {"@host", false, "", -1},
284 {"[", false, "", -1},
285 {"[]", false, "", -1},
288 for (size_t i = 0; i < arraysize(tests); ++i) {
291 bool ok = ParseHostAndPort(tests[i].input, &host, &port);
293 EXPECT_EQ(tests[i].success, ok);
295 if (tests[i].success) {
296 EXPECT_EQ(tests[i].expected_host, host);
297 EXPECT_EQ(tests[i].expected_port, port);
302 TEST(NetUtilTest, GetHostAndPort) {
305 const char* expected_host_and_port;
307 { GURL("http://www.foo.com/x"), "www.foo.com:80"},
308 { GURL("http://www.foo.com:21/x"), "www.foo.com:21"},
310 // For IPv6 literals should always include the brackets.
311 { GURL("http://[1::2]/x"), "[1::2]:80"},
312 { GURL("http://[::a]:33/x"), "[::a]:33"},
314 for (size_t i = 0; i < arraysize(tests); ++i) {
315 std::string host_and_port = GetHostAndPort(tests[i].url);
316 EXPECT_EQ(std::string(tests[i].expected_host_and_port), host_and_port);
320 TEST(NetUtilTest, GetHostAndOptionalPort) {
323 const char* expected_host_and_port;
325 { GURL("http://www.foo.com/x"), "www.foo.com"},
326 { GURL("http://www.foo.com:21/x"), "www.foo.com:21"},
328 // For IPv6 literals should always include the brackets.
329 { GURL("http://[1::2]/x"), "[1::2]"},
330 { GURL("http://[::a]:33/x"), "[::a]:33"},
332 for (size_t i = 0; i < arraysize(tests); ++i) {
333 std::string host_and_port = GetHostAndOptionalPort(tests[i].url);
334 EXPECT_EQ(std::string(tests[i].expected_host_and_port), host_and_port);
338 TEST(NetUtilTest, IPAddressToString) {
339 uint8 addr1[4] = {0, 0, 0, 0};
340 EXPECT_EQ("0.0.0.0", IPAddressToString(addr1, sizeof(addr1)));
342 uint8 addr2[4] = {192, 168, 0, 1};
343 EXPECT_EQ("192.168.0.1", IPAddressToString(addr2, sizeof(addr2)));
345 uint8 addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
346 EXPECT_EQ("fedc:ba98::", IPAddressToString(addr3, sizeof(addr3)));
349 TEST(NetUtilTest, IPAddressToStringWithPort) {
350 uint8 addr1[4] = {0, 0, 0, 0};
351 EXPECT_EQ("0.0.0.0:3", IPAddressToStringWithPort(addr1, sizeof(addr1), 3));
353 uint8 addr2[4] = {192, 168, 0, 1};
354 EXPECT_EQ("192.168.0.1:99",
355 IPAddressToStringWithPort(addr2, sizeof(addr2), 99));
357 uint8 addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
358 EXPECT_EQ("[fedc:ba98::]:8080",
359 IPAddressToStringWithPort(addr3, sizeof(addr3), 8080));
362 TEST(NetUtilTest, NetAddressToString_IPv4) {
367 {{0, 0, 0, 0}, "0.0.0.0"},
368 {{127, 0, 0, 1}, "127.0.0.1"},
369 {{192, 168, 0, 1}, "192.168.0.1"},
372 for (size_t i = 0; i < arraysize(tests); ++i) {
373 SockaddrStorage storage;
374 MakeIPv4Address(tests[i].addr, 80, &storage);
375 std::string result = NetAddressToString(storage.addr, storage.addr_len);
376 EXPECT_EQ(std::string(tests[i].result), result);
380 TEST(NetUtilTest, NetAddressToString_IPv6) {
385 {{0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0xFE, 0xDC, 0xBA,
386 0x98, 0x76, 0x54, 0x32, 0x10},
387 "fedc:ba98:7654:3210:fedc:ba98:7654:3210"},
390 for (size_t i = 0; i < arraysize(tests); ++i) {
391 SockaddrStorage storage;
392 MakeIPv6Address(tests[i].addr, 80, &storage);
393 EXPECT_EQ(std::string(tests[i].result),
394 NetAddressToString(storage.addr, storage.addr_len));
398 TEST(NetUtilTest, NetAddressToStringWithPort_IPv4) {
399 uint8 addr[] = {127, 0, 0, 1};
400 SockaddrStorage storage;
401 MakeIPv4Address(addr, 166, &storage);
402 std::string result = NetAddressToStringWithPort(storage.addr,
404 EXPECT_EQ("127.0.0.1:166", result);
407 TEST(NetUtilTest, NetAddressToStringWithPort_IPv6) {
409 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0xFE, 0xDC, 0xBA,
410 0x98, 0x76, 0x54, 0x32, 0x10
412 SockaddrStorage storage;
413 MakeIPv6Address(addr, 361, &storage);
414 std::string result = NetAddressToStringWithPort(storage.addr,
417 // May fail on systems that don't support IPv6.
419 EXPECT_EQ("[fedc:ba98:7654:3210:fedc:ba98:7654:3210]:361", result);
422 TEST(NetUtilTest, GetHostName) {
423 // We can't check the result of GetHostName() directly, since the result
424 // will differ across machines. Our goal here is to simply exercise the
425 // code path, and check that things "look about right".
426 std::string hostname = GetHostName();
427 EXPECT_FALSE(hostname.empty());
430 TEST(NetUtilTest, SimplifyUrlForRequest) {
432 const char* input_url;
433 const char* expected_simplified_url;
436 // Reference section should be stripped.
437 "http://www.google.com:78/foobar?query=1#hash",
438 "http://www.google.com:78/foobar?query=1",
441 // Reference section can itself contain #.
442 "http://192.168.0.1?query=1#hash#10#11#13#14",
443 "http://192.168.0.1?query=1",
445 { // Strip username/password.
446 "http://user:pass@google.com",
447 "http://google.com/",
449 { // Strip both the reference and the username/password.
450 "http://user:pass@google.com:80/sup?yo#X#X",
451 "http://google.com/sup?yo",
453 { // Try an HTTPS URL -- strip both the reference and the username/password.
454 "https://user:pass@google.com:80/sup?yo#X#X",
455 "https://google.com:80/sup?yo",
457 { // Try an FTP URL -- strip both the reference and the username/password.
458 "ftp://user:pass@google.com:80/sup?yo#X#X",
459 "ftp://google.com:80/sup?yo",
461 { // Try a nonstandard URL
462 "foobar://user:pass@google.com:80/sup?yo#X#X",
463 "foobar://user:pass@google.com:80/sup?yo",
466 for (size_t i = 0; i < arraysize(tests); ++i) {
467 SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i,
468 tests[i].input_url));
469 GURL input_url(GURL(tests[i].input_url));
470 GURL expected_url(GURL(tests[i].expected_simplified_url));
471 EXPECT_EQ(expected_url, SimplifyUrlForRequest(input_url));
475 TEST(NetUtilTest, SetExplicitlyAllowedPortsTest) {
476 std::string invalid[] = { "1,2,a", "'1','2'", "1, 2, 3", "1 0,11,12" };
477 std::string valid[] = { "", "1", "1,2", "1,2,3", "10,11,12,13" };
479 for (size_t i = 0; i < arraysize(invalid); ++i) {
480 SetExplicitlyAllowedPorts(invalid[i]);
481 EXPECT_EQ(0, static_cast<int>(GetCountOfExplicitlyAllowedPorts()));
484 for (size_t i = 0; i < arraysize(valid); ++i) {
485 SetExplicitlyAllowedPorts(valid[i]);
486 EXPECT_EQ(i, GetCountOfExplicitlyAllowedPorts());
490 TEST(NetUtilTest, GetHostOrSpecFromURL) {
491 EXPECT_EQ("example.com",
492 GetHostOrSpecFromURL(GURL("http://example.com/test")));
493 EXPECT_EQ("example.com",
494 GetHostOrSpecFromURL(GURL("http://example.com./test")));
495 EXPECT_EQ("file:///tmp/test.html",
496 GetHostOrSpecFromURL(GURL("file:///tmp/test.html")));
499 TEST(NetUtilTest, GetAddressFamily) {
500 IPAddressNumber number;
501 EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &number));
502 EXPECT_EQ(ADDRESS_FAMILY_IPV4, GetAddressFamily(number));
503 EXPECT_TRUE(ParseIPLiteralToNumber("1:abcd::3:4:ff", &number));
504 EXPECT_EQ(ADDRESS_FAMILY_IPV6, GetAddressFamily(number));
507 // Test that invalid IP literals fail to parse.
508 TEST(NetUtilTest, ParseIPLiteralToNumber_FailParse) {
509 IPAddressNumber number;
511 EXPECT_FALSE(ParseIPLiteralToNumber("bad value", &number));
512 EXPECT_FALSE(ParseIPLiteralToNumber("bad:value", &number));
513 EXPECT_FALSE(ParseIPLiteralToNumber(std::string(), &number));
514 EXPECT_FALSE(ParseIPLiteralToNumber("192.168.0.1:30", &number));
515 EXPECT_FALSE(ParseIPLiteralToNumber(" 192.168.0.1 ", &number));
516 EXPECT_FALSE(ParseIPLiteralToNumber("[::1]", &number));
519 // Test parsing an IPv4 literal.
520 TEST(NetUtilTest, ParseIPLiteralToNumber_IPv4) {
521 IPAddressNumber number;
522 EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &number));
523 EXPECT_EQ("192,168,0,1", DumpIPNumber(number));
524 EXPECT_EQ("192.168.0.1", IPAddressToString(number));
527 // Test parsing an IPv6 literal.
528 TEST(NetUtilTest, ParseIPLiteralToNumber_IPv6) {
529 IPAddressNumber number;
530 EXPECT_TRUE(ParseIPLiteralToNumber("1:abcd::3:4:ff", &number));
531 EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", DumpIPNumber(number));
532 EXPECT_EQ("1:abcd::3:4:ff", IPAddressToString(number));
535 // Test mapping an IPv4 address to an IPv6 address.
536 TEST(NetUtilTest, ConvertIPv4NumberToIPv6Number) {
537 IPAddressNumber ipv4_number;
538 EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &ipv4_number));
540 IPAddressNumber ipv6_number =
541 ConvertIPv4NumberToIPv6Number(ipv4_number);
543 // ::ffff:192.168.0.1
544 EXPECT_EQ("0,0,0,0,0,0,0,0,0,0,255,255,192,168,0,1",
545 DumpIPNumber(ipv6_number));
546 EXPECT_EQ("::ffff:c0a8:1", IPAddressToString(ipv6_number));
549 TEST(NetUtilTest, ParseURLHostnameToNumber_FailParse) {
550 IPAddressNumber number;
552 EXPECT_FALSE(ParseURLHostnameToNumber("bad value", &number));
553 EXPECT_FALSE(ParseURLHostnameToNumber("bad:value", &number));
554 EXPECT_FALSE(ParseURLHostnameToNumber(std::string(), &number));
555 EXPECT_FALSE(ParseURLHostnameToNumber("192.168.0.1:30", &number));
556 EXPECT_FALSE(ParseURLHostnameToNumber(" 192.168.0.1 ", &number));
557 EXPECT_FALSE(ParseURLHostnameToNumber("::1", &number));
560 TEST(NetUtilTest, ParseURLHostnameToNumber_IPv4) {
561 IPAddressNumber number;
562 EXPECT_TRUE(ParseURLHostnameToNumber("192.168.0.1", &number));
563 EXPECT_EQ("192,168,0,1", DumpIPNumber(number));
564 EXPECT_EQ("192.168.0.1", IPAddressToString(number));
567 TEST(NetUtilTest, ParseURLHostnameToNumber_IPv6) {
568 IPAddressNumber number;
569 EXPECT_TRUE(ParseURLHostnameToNumber("[1:abcd::3:4:ff]", &number));
570 EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", DumpIPNumber(number));
571 EXPECT_EQ("1:abcd::3:4:ff", IPAddressToString(number));
574 TEST(NetUtilTest, IsIPv4Mapped) {
575 IPAddressNumber ipv4_number;
576 EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &ipv4_number));
577 EXPECT_FALSE(IsIPv4Mapped(ipv4_number));
579 IPAddressNumber ipv6_number;
580 EXPECT_TRUE(ParseIPLiteralToNumber("::1", &ipv4_number));
581 EXPECT_FALSE(IsIPv4Mapped(ipv6_number));
583 IPAddressNumber ipv4mapped_number;
584 EXPECT_TRUE(ParseIPLiteralToNumber("::ffff:0101:1", &ipv4mapped_number));
585 EXPECT_TRUE(IsIPv4Mapped(ipv4mapped_number));
588 TEST(NetUtilTest, ConvertIPv4MappedToIPv4) {
589 IPAddressNumber ipv4mapped_number;
590 EXPECT_TRUE(ParseIPLiteralToNumber("::ffff:0101:1", &ipv4mapped_number));
591 IPAddressNumber expected;
592 EXPECT_TRUE(ParseIPLiteralToNumber("1.1.0.1", &expected));
593 IPAddressNumber result = ConvertIPv4MappedToIPv4(ipv4mapped_number);
594 EXPECT_EQ(expected, result);
597 // Test parsing invalid CIDR notation literals.
598 TEST(NetUtilTest, ParseCIDRBlock_Invalid) {
599 const char* bad_literals[] = {
615 for (size_t i = 0; i < arraysize(bad_literals); ++i) {
616 IPAddressNumber ip_number;
617 size_t prefix_length_in_bits;
619 EXPECT_FALSE(ParseCIDRBlock(bad_literals[i],
621 &prefix_length_in_bits));
625 // Test parsing a valid CIDR notation literal.
626 TEST(NetUtilTest, ParseCIDRBlock_Valid) {
627 IPAddressNumber ip_number;
628 size_t prefix_length_in_bits;
630 EXPECT_TRUE(ParseCIDRBlock("192.168.0.1/11",
632 &prefix_length_in_bits));
634 EXPECT_EQ("192,168,0,1", DumpIPNumber(ip_number));
635 EXPECT_EQ(11u, prefix_length_in_bits);
638 TEST(NetUtilTest, IPNumberMatchesPrefix) {
640 const char* cidr_literal;
641 const char* ip_literal;
642 bool expected_to_match;
644 // IPv4 prefix with IPv4 inputs.
661 // IPv6 prefix with IPv6 inputs.
673 // IPv6 prefix with IPv4 inputs.
680 "::ffff:192.168.0.1/112",
685 // IPv4 prefix with IPv6 inputs.
693 "::ffff:10.12.33.44",
697 for (size_t i = 0; i < arraysize(tests); ++i) {
698 SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s, %s", i,
699 tests[i].cidr_literal,
700 tests[i].ip_literal));
702 IPAddressNumber ip_number;
703 EXPECT_TRUE(ParseIPLiteralToNumber(tests[i].ip_literal, &ip_number));
705 IPAddressNumber ip_prefix;
706 size_t prefix_length_in_bits;
708 EXPECT_TRUE(ParseCIDRBlock(tests[i].cidr_literal,
710 &prefix_length_in_bits));
712 EXPECT_EQ(tests[i].expected_to_match,
713 IPNumberMatchesPrefix(ip_number,
715 prefix_length_in_bits));
719 TEST(NetUtilTest, IsLocalhost) {
720 EXPECT_TRUE(net::IsLocalhost("localhost"));
721 EXPECT_TRUE(net::IsLocalhost("localhost.localdomain"));
722 EXPECT_TRUE(net::IsLocalhost("localhost6"));
723 EXPECT_TRUE(net::IsLocalhost("localhost6.localdomain6"));
724 EXPECT_TRUE(net::IsLocalhost("127.0.0.1"));
725 EXPECT_TRUE(net::IsLocalhost("127.0.1.0"));
726 EXPECT_TRUE(net::IsLocalhost("127.1.0.0"));
727 EXPECT_TRUE(net::IsLocalhost("127.0.0.255"));
728 EXPECT_TRUE(net::IsLocalhost("127.0.255.0"));
729 EXPECT_TRUE(net::IsLocalhost("127.255.0.0"));
730 EXPECT_TRUE(net::IsLocalhost("::1"));
731 EXPECT_TRUE(net::IsLocalhost("0:0:0:0:0:0:0:1"));
733 EXPECT_FALSE(net::IsLocalhost("localhostx"));
734 EXPECT_FALSE(net::IsLocalhost("foo.localdomain"));
735 EXPECT_FALSE(net::IsLocalhost("localhost6x"));
736 EXPECT_FALSE(net::IsLocalhost("localhost.localdomain6"));
737 EXPECT_FALSE(net::IsLocalhost("localhost6.localdomain"));
738 EXPECT_FALSE(net::IsLocalhost("127.0.0.1.1"));
739 EXPECT_FALSE(net::IsLocalhost(".127.0.0.255"));
740 EXPECT_FALSE(net::IsLocalhost("::2"));
741 EXPECT_FALSE(net::IsLocalhost("::1:1"));
742 EXPECT_FALSE(net::IsLocalhost("0:0:0:0:1:0:0:1"));
743 EXPECT_FALSE(net::IsLocalhost("::1:1"));
744 EXPECT_FALSE(net::IsLocalhost("0:0:0:0:0:0:0:0:1"));
747 // Verify GetNetworkList().
748 TEST(NetUtilTest, GetNetworkList) {
749 NetworkInterfaceList list;
750 ASSERT_TRUE(GetNetworkList(&list, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES));
751 for (NetworkInterfaceList::iterator it = list.begin();
752 it != list.end(); ++it) {
753 // Verify that the names are not empty.
754 EXPECT_FALSE(it->name.empty());
755 EXPECT_FALSE(it->friendly_name.empty());
757 // Verify that the address is correct.
758 EXPECT_TRUE(it->address.size() == kIPv4AddressSize ||
759 it->address.size() == kIPv6AddressSize)
760 << "Invalid address of size " << it->address.size();
761 bool all_zeroes = true;
762 for (size_t i = 0; i < it->address.size(); ++i) {
763 if (it->address[i] != 0) {
768 EXPECT_FALSE(all_zeroes);
769 EXPECT_GT(it->network_prefix, 1u);
770 EXPECT_LE(it->network_prefix, it->address.size() * 8);
773 // On Windows |name| is NET_LUID.
774 base::ScopedNativeLibrary phlpapi_lib(
775 base::FilePath(FILE_PATH_LITERAL("iphlpapi.dll")));
776 ASSERT_TRUE(phlpapi_lib.is_valid());
777 typedef NETIO_STATUS (WINAPI* ConvertInterfaceIndexToLuid)(NET_IFINDEX,
779 ConvertInterfaceIndexToLuid interface_to_luid =
780 reinterpret_cast<ConvertInterfaceIndexToLuid>(
781 phlpapi_lib.GetFunctionPointer("ConvertInterfaceIndexToLuid"));
783 typedef NETIO_STATUS (WINAPI* ConvertInterfaceLuidToGuid)(NET_LUID*,
785 ConvertInterfaceLuidToGuid luid_to_guid =
786 reinterpret_cast<ConvertInterfaceLuidToGuid>(
787 phlpapi_lib.GetFunctionPointer("ConvertInterfaceLuidToGuid"));
789 if (interface_to_luid && luid_to_guid) {
791 EXPECT_EQ(interface_to_luid(it->interface_index, &luid), NO_ERROR);
793 EXPECT_EQ(luid_to_guid(&luid, &guid), NO_ERROR);
795 StringFromCLSID(guid, &name);
796 EXPECT_STREQ(base::UTF8ToWide(it->name).c_str(), name);
800 EXPECT_LT(base::win::GetVersion(), base::win::VERSION_VISTA);
801 EXPECT_LT(it->interface_index, 1u << 24u); // Must fit 0.x.x.x.
802 EXPECT_NE(it->interface_index, 0u); // 0 means to use default.
804 if (it->type == NetworkChangeNotifier::CONNECTION_WIFI) {
805 EXPECT_NE(WIFI_PHY_LAYER_PROTOCOL_NONE, GetWifiPHYLayerProtocol());
807 #elif !defined(OS_ANDROID)
808 char name[IF_NAMESIZE];
809 EXPECT_TRUE(if_indextoname(it->interface_index, name));
810 EXPECT_STREQ(it->name.c_str(), name);
815 #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(OS_NACL)
817 char* CopyInterfaceName(const char* ifname, int ifname_size, char* output) {
818 EXPECT_LT(ifname_size, IF_NAMESIZE);
819 memcpy(output, ifname, ifname_size);
823 static const char ifname_em1[] = "em1";
824 char* GetInterfaceName(unsigned int interface_index, char* ifname) {
825 return CopyInterfaceName(ifname_em1, arraysize(ifname_em1), ifname);
828 static const char ifname_vm[] = "vmnet";
829 char* GetInterfaceNameVM(unsigned int interface_index, char* ifname) {
830 return CopyInterfaceName(ifname_vm, arraysize(ifname_vm), ifname);
833 TEST(NetUtilTest, GetNetworkListTrimming) {
834 NetworkInterfaceList results;
835 ::base::hash_set<int> online_links;
836 net::internal::AddressTrackerLinux::AddressMap address_map;
838 const unsigned char kIPv6LocalAddr[] = {
839 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1};
840 const unsigned char kIPv6Addr[] =
841 {0x24, 0x01, 0xfa, 0x00, 0x00, 0x04, 0x10, 0x00, 0xbe, 0x30, 0x5b, 0xff,
842 0xfe, 0xe5, 0x00, 0xc3};
844 IPAddressNumber ipv6_local_address(
845 kIPv6LocalAddr, kIPv6LocalAddr + arraysize(kIPv6LocalAddr));
846 IPAddressNumber ipv6_address(kIPv6Addr, kIPv6Addr + arraysize(kIPv6Addr));
848 // Interface 1 is offline.
849 struct ifaddrmsg msg = {
851 1, /* prefix length */
852 IFA_F_TEMPORARY, /* address flags */
857 // Address of offline links should be ignored.
858 ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
860 net::internal::GetNetworkListImpl(&results,
861 INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES,
865 EXPECT_EQ(results.size(), 0ul);
867 // Mark interface 1 online.
868 online_links.insert(1);
870 // Local address should be trimmed out.
873 address_map.insert(std::make_pair(ipv6_local_address, msg)).second);
875 net::internal::GetNetworkListImpl(&results,
876 INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES,
880 EXPECT_EQ(results.size(), 0ul);
882 // vmware address should return by default.
884 ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
886 net::internal::GetNetworkListImpl(&results,
887 INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES,
890 GetInterfaceNameVM));
891 EXPECT_EQ(results.size(), 1ul);
892 EXPECT_EQ(results[0].name, ifname_vm);
893 EXPECT_EQ(results[0].network_prefix, 1ul);
894 EXPECT_EQ(results[0].address, ipv6_address);
897 // vmware address should be trimmed out if policy specified so.
899 ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
901 net::internal::GetNetworkListImpl(&results,
902 EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES,
905 GetInterfaceNameVM));
906 EXPECT_EQ(results.size(), 0ul);
909 // Addresses with banned attributes should be ignored.
911 msg.ifa_flags = IFA_F_TENTATIVE;
912 ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
914 net::internal::GetNetworkListImpl(&results,
915 INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES,
919 EXPECT_EQ(results.size(), 0ul);
922 // Addresses with allowed attribute IFA_F_TEMPORARY should be returned and
923 // attributes should be translated correctly.
925 msg.ifa_flags = IFA_F_TEMPORARY;
926 ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
928 net::internal::GetNetworkListImpl(&results,
929 INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES,
933 EXPECT_EQ(results.size(), 1ul);
934 EXPECT_EQ(results[0].name, ifname_em1);
935 EXPECT_EQ(results[0].network_prefix, 1ul);
936 EXPECT_EQ(results[0].address, ipv6_address);
937 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_TEMPORARY);
940 // Addresses with allowed attribute IFA_F_DEPRECATED should be returned and
941 // attributes should be translated correctly.
943 msg.ifa_flags = IFA_F_DEPRECATED;
944 ASSERT_TRUE(address_map.insert(std::make_pair(ipv6_address, msg)).second);
946 net::internal::GetNetworkListImpl(&results,
947 INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES,
951 EXPECT_EQ(results.size(), 1ul);
952 EXPECT_EQ(results[0].name, ifname_em1);
953 EXPECT_EQ(results[0].network_prefix, 1ul);
954 EXPECT_EQ(results[0].address, ipv6_address);
955 EXPECT_EQ(results[0].ip_address_attributes, IP_ADDRESS_ATTRIBUTE_DEPRECATED);
964 bool read_int_or_bool(DWORD data_size,
968 return !!*reinterpret_cast<uint8*>(data);
970 return !!*reinterpret_cast<uint32*>(data);
972 LOG(FATAL) << "That is not a type I know!";
977 int GetWifiOptions() {
978 const internal::WlanApi& wlanapi = internal::WlanApi::GetInstance();
979 if (!wlanapi.initialized)
982 internal::WlanHandle client;
983 DWORD cur_version = 0;
984 const DWORD kMaxClientVersion = 2;
985 DWORD result = wlanapi.OpenHandle(
986 kMaxClientVersion, &cur_version, &client);
987 if (result != ERROR_SUCCESS)
990 WLAN_INTERFACE_INFO_LIST* interface_list_ptr = NULL;
991 result = wlanapi.enum_interfaces_func(client.Get(), NULL,
992 &interface_list_ptr);
993 if (result != ERROR_SUCCESS)
995 scoped_ptr<WLAN_INTERFACE_INFO_LIST, internal::WlanApiDeleter> interface_list(
998 for (unsigned i = 0; i < interface_list->dwNumberOfItems; ++i) {
999 WLAN_INTERFACE_INFO* info = &interface_list->InterfaceInfo[i];
1003 result = wlanapi.query_interface_func(
1005 &info->InterfaceGuid,
1006 wlan_intf_opcode_background_scan_enabled,
1011 if (result != ERROR_SUCCESS)
1013 if (!read_int_or_bool(data_size, data)) {
1014 options |= WIFI_OPTIONS_DISABLE_SCAN;
1016 internal::WlanApi::GetInstance().free_memory_func(data);
1018 result = wlanapi.query_interface_func(
1020 &info->InterfaceGuid,
1021 wlan_intf_opcode_media_streaming_mode,
1026 if (result != ERROR_SUCCESS)
1028 if (read_int_or_bool(data_size, data)) {
1029 options |= WIFI_OPTIONS_MEDIA_STREAMING_MODE;
1031 internal::WlanApi::GetInstance().free_memory_func(data);
1033 // Just the the options from the first succesful
1038 // No wifi interface found.
1044 int GetWifiOptions() {
1051 void TryChangeWifiOptions(int options) {
1052 int previous_options = GetWifiOptions();
1053 scoped_ptr<ScopedWifiOptions> scoped_options = SetWifiOptions(options);
1054 EXPECT_EQ(previous_options | options, GetWifiOptions());
1055 scoped_options.reset();
1056 EXPECT_EQ(previous_options, GetWifiOptions());
1061 // Test SetWifiOptions().
1062 TEST(NetUtilTest, SetWifiOptionsTest) {
1063 TryChangeWifiOptions(0);
1064 TryChangeWifiOptions(WIFI_OPTIONS_DISABLE_SCAN);
1065 TryChangeWifiOptions(WIFI_OPTIONS_MEDIA_STREAMING_MODE);
1066 TryChangeWifiOptions(WIFI_OPTIONS_DISABLE_SCAN |
1067 WIFI_OPTIONS_MEDIA_STREAMING_MODE);
1070 struct NonUniqueNameTestData {
1072 const char* hostname;
1075 // Google Test pretty-printer.
1076 void PrintTo(const NonUniqueNameTestData& data, std::ostream* os) {
1077 ASSERT_TRUE(data.hostname);
1078 *os << " hostname: " << testing::PrintToString(data.hostname)
1079 << "; is_unique: " << testing::PrintToString(data.is_unique);
1082 const NonUniqueNameTestData kNonUniqueNameTestData[] = {
1083 // Domains under ICANN-assigned domains.
1084 { true, "google.com" },
1085 { true, "google.co.uk" },
1086 // Domains under private registries.
1087 { true, "appspot.com" },
1088 { true, "test.appspot.com" },
1089 // Unreserved IPv4 addresses (in various forms).
1090 { true, "8.8.8.8" },
1091 { true, "99.64.0.0" },
1092 { true, "212.15.0.0" },
1094 { true, "212.15.0" },
1095 { true, "3557752832" },
1096 // Reserved IPv4 addresses (in various forms).
1097 { false, "192.168.0.0" },
1098 { false, "192.168.0.6" },
1099 { false, "10.0.0.5" },
1101 { false, "10.0.0" },
1102 { false, "3232235526" },
1103 // Unreserved IPv6 addresses.
1104 { true, "FFC0:ba98:7654:3210:FEDC:BA98:7654:3210" },
1105 { true, "2000:ba98:7654:2301:EFCD:BA98:7654:3210" },
1106 // Reserved IPv6 addresses.
1107 { false, "::192.9.5.5" },
1108 { false, "FEED::BEEF" },
1109 { false, "FEC0:ba98:7654:3210:FEDC:BA98:7654:3210" },
1110 // 'internal'/non-IANA assigned domains.
1111 { false, "intranet" },
1112 { false, "intranet." },
1113 { false, "intranet.example" },
1114 { false, "host.intranet.example" },
1115 // gTLDs under discussion, but not yet assigned.
1116 { false, "intranet.corp" },
1117 { false, "example.tech" },
1118 { false, "intranet.internal" },
1119 // Invalid host names are treated as unique - but expected to be
1120 // filtered out before then.
1121 { true, "junk)(£)$*!@~#" },
1122 { true, "w$w.example.com" },
1123 { true, "nocolonsallowed:example" },
1124 { true, "[::4.5.6.9]" },
1127 class NetUtilNonUniqueNameTest
1128 : public testing::TestWithParam<NonUniqueNameTestData> {
1130 virtual ~NetUtilNonUniqueNameTest() {}
1133 bool IsUnique(const std::string& hostname) {
1134 return !IsHostnameNonUnique(hostname);
1138 // Test that internal/non-unique names are properly identified as such, but
1139 // that IP addresses and hosts beneath registry-controlled domains are flagged
1141 TEST_P(NetUtilNonUniqueNameTest, IsHostnameNonUnique) {
1142 const NonUniqueNameTestData& test_data = GetParam();
1144 EXPECT_EQ(test_data.is_unique, IsUnique(test_data.hostname));
1147 INSTANTIATE_TEST_CASE_P(, NetUtilNonUniqueNameTest,
1148 testing::ValuesIn(kNonUniqueNameTestData));