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

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

Issue 274183002: Make it possible to build cronet without icu. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Oops...add back file Created 6 years, 7 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 | Annotate | Revision Log
« no previous file with comments | « net/android/net_jni_registrar.cc ('k') | net/base/net_util_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2014 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 <algorithm> 9 #include <vector>
10 10
11 #include "base/files/file_path.h"
12 #include "base/format_macros.h" 11 #include "base/format_macros.h"
13 #include "base/scoped_native_library.h"
14 #include "base/strings/string_number_conversions.h" 12 #include "base/strings/string_number_conversions.h"
15 #include "base/strings/string_util.h"
16 #include "base/strings/stringprintf.h"
17 #include "base/strings/sys_string_conversions.h"
18 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
19 #include "base/sys_byteorder.h"
20 #include "base/time/time.h" 14 #include "base/time/time.h"
21 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
22 #include "url/gurl.h" 16 #include "url/gurl.h"
23 17
24 #if defined(OS_WIN)
25 #include <iphlpapi.h>
26 #include <objbase.h>
27 #include "base/win/windows_version.h"
28 #elif !defined(OS_ANDROID)
29 #include <net/if.h>
30 #endif // OS_WIN
31
32 using base::ASCIIToUTF16; 18 using base::ASCIIToUTF16;
33 using base::WideToUTF16; 19 using base::WideToUTF16;
34 20
35 namespace net { 21 namespace net {
36 22
37 namespace { 23 namespace {
38 24
39 static const size_t kNpos = base::string16::npos; 25 static const size_t kNpos = base::string16::npos;
40 26
41 struct HeaderCase {
42 const char* header_name;
43 const char* expected;
44 };
45
46 struct HeaderParamCase {
47 const char* header_name;
48 const char* param_name;
49 const char* expected;
50 };
51
52 const char* kLanguages[] = { 27 const char* kLanguages[] = {
53 "", "en", "zh-CN", "ja", "ko", 28 "", "en", "zh-CN", "ja", "ko",
54 "he", "ar", "ru", "el", "fr", 29 "he", "ar", "ru", "el", "fr",
55 "de", "pt", "sv", "th", "hi", 30 "de", "pt", "sv", "th", "hi",
56 "de,en", "el,en", "zh-TW,en", "ko,ja", "he,ru,en", 31 "de,en", "el,en", "zh-TW,en", "ko,ja", "he,ru,en",
57 "zh,ru,en" 32 "zh,ru,en"
58 }; 33 };
59 34
60 struct IDNTestCase { 35 struct IDNTestCase {
61 const char* input; 36 const char* input;
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 false, false, true, false, false, 346 false, false, true, false, false,
372 true}}, 347 true}},
373 #endif 348 #endif
374 }; 349 };
375 350
376 struct AdjustOffsetCase { 351 struct AdjustOffsetCase {
377 size_t input_offset; 352 size_t input_offset;
378 size_t output_offset; 353 size_t output_offset;
379 }; 354 };
380 355
381 struct CompliantHostCase {
382 const char* host;
383 const char* desired_tld;
384 bool expected_output;
385 };
386
387 struct UrlTestData { 356 struct UrlTestData {
388 const char* description; 357 const char* description;
389 const char* input; 358 const char* input;
390 const char* languages; 359 const char* languages;
391 FormatUrlTypes format_types; 360 FormatUrlTypes format_types;
392 UnescapeRule::Type escape_rules; 361 UnescapeRule::Type escape_rules;
393 const wchar_t* output; // Use |wchar_t| to handle Unicode constants easily. 362 const wchar_t* output; // Use |wchar_t| to handle Unicode constants easily.
394 size_t prefix_len; 363 size_t prefix_len;
395 }; 364 };
396 365
397 // Fills in sockaddr for the given 32-bit address (IPv4.)
398 // |bytes| should be an array of length 4.
399 void MakeIPv4Address(const uint8* bytes, int port, SockaddrStorage* storage) {
400 memset(&storage->addr_storage, 0, sizeof(storage->addr_storage));
401 storage->addr_len = sizeof(struct sockaddr_in);
402 struct sockaddr_in* addr4 = reinterpret_cast<sockaddr_in*>(storage->addr);
403 addr4->sin_port = base::HostToNet16(port);
404 addr4->sin_family = AF_INET;
405 memcpy(&addr4->sin_addr, bytes, 4);
406 }
407
408 // Fills in sockaddr for the given 128-bit address (IPv6.)
409 // |bytes| should be an array of length 16.
410 void MakeIPv6Address(const uint8* bytes, int port, SockaddrStorage* storage) {
411 memset(&storage->addr_storage, 0, sizeof(storage->addr_storage));
412 storage->addr_len = sizeof(struct sockaddr_in6);
413 struct sockaddr_in6* addr6 = reinterpret_cast<sockaddr_in6*>(storage->addr);
414 addr6->sin6_port = base::HostToNet16(port);
415 addr6->sin6_family = AF_INET6;
416 memcpy(&addr6->sin6_addr, bytes, 16);
417 }
418
419 // A helper for IDN*{Fast,Slow}. 366 // A helper for IDN*{Fast,Slow}.
420 // Append "::<language list>" to |expected| and |actual| to make it 367 // Append "::<language list>" to |expected| and |actual| to make it
421 // easy to tell which sub-case fails without debugging. 368 // easy to tell which sub-case fails without debugging.
422 void AppendLanguagesToOutputs(const char* languages, 369 void AppendLanguagesToOutputs(const char* languages,
423 base::string16* expected, 370 base::string16* expected,
424 base::string16* actual) { 371 base::string16* actual) {
425 base::string16 to_append = ASCIIToUTF16("::") + ASCIIToUTF16(languages); 372 base::string16 to_append = ASCIIToUTF16("::") + ASCIIToUTF16(languages);
426 expected->append(to_append); 373 expected->append(to_append);
427 actual->append(to_append); 374 actual->append(to_append);
428 } 375 }
(...skipping 25 matching lines...) Expand all
454 for (size_t i = 0; i < url_length; ++i) 401 for (size_t i = 0; i < url_length; ++i)
455 VerboseExpect(output_offsets[i], offsets[i], url_string, i, formatted_url); 402 VerboseExpect(output_offsets[i], offsets[i], url_string, i, formatted_url);
456 VerboseExpect(formatted_url.length(), offsets[url_length], url_string, 403 VerboseExpect(formatted_url.length(), offsets[url_length], url_string,
457 url_length, formatted_url); 404 url_length, formatted_url);
458 VerboseExpect(base::string16::npos, offsets[url_length + 1], url_string, 405 VerboseExpect(base::string16::npos, offsets[url_length + 1], url_string,
459 500000, formatted_url); 406 500000, formatted_url);
460 VerboseExpect(base::string16::npos, offsets[url_length + 2], url_string, 407 VerboseExpect(base::string16::npos, offsets[url_length + 2], url_string,
461 std::string::npos, formatted_url); 408 std::string::npos, formatted_url);
462 } 409 }
463 410
464 // Helper to strignize an IP number (used to define expectations).
465 std::string DumpIPNumber(const IPAddressNumber& v) {
466 std::string out;
467 for (size_t i = 0; i < v.size(); ++i) {
468 if (i != 0)
469 out.append(",");
470 out.append(base::IntToString(static_cast<int>(v[i])));
471 }
472 return out;
473 }
474
475 } // anonymous namespace 411 } // anonymous namespace
476 412
477 TEST(NetUtilTest, GetIdentityFromURL) {
478 struct {
479 const char* input_url;
480 const char* expected_username;
481 const char* expected_password;
482 } tests[] = {
483 {
484 "http://username:password@google.com",
485 "username",
486 "password",
487 },
488 { // Test for http://crbug.com/19200
489 "http://username:p@ssword@google.com",
490 "username",
491 "p@ssword",
492 },
493 { // Special URL characters should be unescaped.
494 "http://username:p%3fa%26s%2fs%23@google.com",
495 "username",
496 "p?a&s/s#",
497 },
498 { // Username contains %20.
499 "http://use rname:password@google.com",
500 "use rname",
501 "password",
502 },
503 { // Keep %00 as is.
504 "http://use%00rname:password@google.com",
505 "use%00rname",
506 "password",
507 },
508 { // Use a '+' in the username.
509 "http://use+rname:password@google.com",
510 "use+rname",
511 "password",
512 },
513 { // Use a '&' in the password.
514 "http://username:p&ssword@google.com",
515 "username",
516 "p&ssword",
517 },
518 };
519 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
520 SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i,
521 tests[i].input_url));
522 GURL url(tests[i].input_url);
523
524 base::string16 username, password;
525 GetIdentityFromURL(url, &username, &password);
526
527 EXPECT_EQ(ASCIIToUTF16(tests[i].expected_username), username);
528 EXPECT_EQ(ASCIIToUTF16(tests[i].expected_password), password);
529 }
530 }
531
532 // Try extracting a username which was encoded with UTF8.
533 TEST(NetUtilTest, GetIdentityFromURL_UTF8) {
534 GURL url(WideToUTF16(L"http://foo:\x4f60\x597d@blah.com"));
535
536 EXPECT_EQ("foo", url.username());
537 EXPECT_EQ("%E4%BD%A0%E5%A5%BD", url.password());
538
539 // Extract the unescaped identity.
540 base::string16 username, password;
541 GetIdentityFromURL(url, &username, &password);
542
543 // Verify that it was decoded as UTF8.
544 EXPECT_EQ(ASCIIToUTF16("foo"), username);
545 EXPECT_EQ(WideToUTF16(L"\x4f60\x597d"), password);
546 }
547
548 // Just a bunch of fake headers.
549 const char* google_headers =
550 "HTTP/1.1 200 OK\n"
551 "Content-TYPE: text/html; charset=utf-8\n"
552 "Content-disposition: attachment; filename=\"download.pdf\"\n"
553 "Content-Length: 378557\n"
554 "X-Google-Google1: 314159265\n"
555 "X-Google-Google2: aaaa2:7783,bbb21:9441\n"
556 "X-Google-Google4: home\n"
557 "Transfer-Encoding: chunked\n"
558 "Set-Cookie: HEHE_AT=6666x66beef666x6-66xx6666x66; Path=/mail\n"
559 "Set-Cookie: HEHE_HELP=owned:0;Path=/\n"
560 "Set-Cookie: S=gmail=Xxx-beefbeefbeef_beefb:gmail_yj=beefbeef000beefbee"
561 "fbee:gmproxy=bee-fbeefbe; Domain=.google.com; Path=/\n"
562 "X-Google-Google2: /one/two/three/four/five/six/seven-height/nine:9411\n"
563 "Server: GFE/1.3\n"
564 "Transfer-Encoding: chunked\n"
565 "Date: Mon, 13 Nov 2006 21:38:09 GMT\n"
566 "Expires: Tue, 14 Nov 2006 19:23:58 GMT\n"
567 "X-Malformed: bla; arg=test\"\n"
568 "X-Malformed2: bla; arg=\n"
569 "X-Test: bla; arg1=val1; arg2=val2";
570
571 TEST(NetUtilTest, GetSpecificHeader) {
572 const HeaderCase tests[] = {
573 {"content-type", "text/html; charset=utf-8"},
574 {"CONTENT-LENGTH", "378557"},
575 {"Date", "Mon, 13 Nov 2006 21:38:09 GMT"},
576 {"Bad-Header", ""},
577 {"", ""},
578 };
579
580 // Test first with google_headers.
581 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
582 std::string result =
583 GetSpecificHeader(google_headers, tests[i].header_name);
584 EXPECT_EQ(result, tests[i].expected);
585 }
586
587 // Test again with empty headers.
588 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
589 std::string result = GetSpecificHeader(std::string(), tests[i].header_name);
590 EXPECT_EQ(result, std::string());
591 }
592 }
593
594 TEST(NetUtilTest, IDNToUnicodeFast) { 413 TEST(NetUtilTest, IDNToUnicodeFast) {
595 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(idn_cases); i++) { 414 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(idn_cases); i++) {
596 for (size_t j = 0; j < arraysize(kLanguages); j++) { 415 for (size_t j = 0; j < arraysize(kLanguages); j++) {
597 // ja || zh-TW,en || ko,ja -> IDNToUnicodeSlow 416 // ja || zh-TW,en || ko,ja -> IDNToUnicodeSlow
598 if (j == 3 || j == 17 || j == 18) 417 if (j == 3 || j == 17 || j == 18)
599 continue; 418 continue;
600 base::string16 output(IDNToUnicode(idn_cases[i].input, kLanguages[j])); 419 base::string16 output(IDNToUnicode(idn_cases[i].input, kLanguages[j]));
601 base::string16 expected(idn_cases[i].unicode_allowed[j] ? 420 base::string16 expected(idn_cases[i].unicode_allowed[j] ?
602 WideToUTF16(idn_cases[i].unicode_output) : 421 WideToUTF16(idn_cases[i].unicode_output) :
603 ASCIIToUTF16(idn_cases[i].input)); 422 ASCIIToUTF16(idn_cases[i].input));
(...skipping 12 matching lines...) Expand all
616 base::string16 output(IDNToUnicode(idn_cases[i].input, kLanguages[j])); 435 base::string16 output(IDNToUnicode(idn_cases[i].input, kLanguages[j]));
617 base::string16 expected(idn_cases[i].unicode_allowed[j] ? 436 base::string16 expected(idn_cases[i].unicode_allowed[j] ?
618 WideToUTF16(idn_cases[i].unicode_output) : 437 WideToUTF16(idn_cases[i].unicode_output) :
619 ASCIIToUTF16(idn_cases[i].input)); 438 ASCIIToUTF16(idn_cases[i].input));
620 AppendLanguagesToOutputs(kLanguages[j], &expected, &output); 439 AppendLanguagesToOutputs(kLanguages[j], &expected, &output);
621 EXPECT_EQ(expected, output); 440 EXPECT_EQ(expected, output);
622 } 441 }
623 } 442 }
624 } 443 }
625 444
626 TEST(NetUtilTest, CompliantHost) {
627 const CompliantHostCase compliant_host_cases[] = {
628 {"", "", false},
629 {"a", "", true},
630 {"-", "", false},
631 {".", "", false},
632 {"9", "", true},
633 {"9a", "", true},
634 {"a.", "", true},
635 {"a.a", "", true},
636 {"9.a", "", true},
637 {"a.9", "", true},
638 {"_9a", "", false},
639 {"-9a", "", false},
640 {"-9a", "a", true},
641 {"a.a9", "", true},
642 {"a.-a9", "", false},
643 {"a+9a", "", false},
644 {"-a.a9", "", true},
645 {"1-.a-b", "", true},
646 {"1_.a-b", "", false},
647 {"1-2.a_b", "", true},
648 {"a.b.c.d.e", "", true},
649 {"1.2.3.4.5", "", true},
650 {"1.2.3.4.5.", "", true},
651 };
652
653 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(compliant_host_cases); ++i) {
654 EXPECT_EQ(compliant_host_cases[i].expected_output,
655 IsCanonicalizedHostCompliant(compliant_host_cases[i].host,
656 compliant_host_cases[i].desired_tld));
657 }
658 }
659
660 TEST(NetUtilTest, StripWWW) { 445 TEST(NetUtilTest, StripWWW) {
661 EXPECT_EQ(base::string16(), StripWWW(base::string16())); 446 EXPECT_EQ(base::string16(), StripWWW(base::string16()));
662 EXPECT_EQ(base::string16(), StripWWW(ASCIIToUTF16("www."))); 447 EXPECT_EQ(base::string16(), StripWWW(ASCIIToUTF16("www.")));
663 EXPECT_EQ(ASCIIToUTF16("blah"), StripWWW(ASCIIToUTF16("www.blah"))); 448 EXPECT_EQ(ASCIIToUTF16("blah"), StripWWW(ASCIIToUTF16("www.blah")));
664 EXPECT_EQ(ASCIIToUTF16("blah"), StripWWW(ASCIIToUTF16("blah"))); 449 EXPECT_EQ(ASCIIToUTF16("blah"), StripWWW(ASCIIToUTF16("blah")));
665 } 450 }
666 451
667 // This is currently a windows specific function. 452 // This is currently a windows specific function.
668 #if defined(OS_WIN) 453 #if defined(OS_WIN)
669 namespace { 454 namespace {
670 455
671 struct GetDirectoryListingEntryCase { 456 struct GetDirectoryListingEntryCase {
672 const wchar_t* name; 457 const wchar_t* name;
673 const char* raw_bytes; 458 const char* raw_bytes;
674 bool is_dir; 459 bool is_dir;
675 int64 filesize; 460 int64 filesize;
676 base::Time time; 461 base::Time time;
677 const char* expected; 462 const char* expected;
678 }; 463 };
679 464
680 } // namespace 465 } // namespace
466
681 TEST(NetUtilTest, GetDirectoryListingEntry) { 467 TEST(NetUtilTest, GetDirectoryListingEntry) {
682 const GetDirectoryListingEntryCase test_cases[] = { 468 const GetDirectoryListingEntryCase test_cases[] = {
683 {L"Foo", 469 {L"Foo",
684 "", 470 "",
685 false, 471 false,
686 10000, 472 10000,
687 base::Time(), 473 base::Time(),
688 "<script>addRow(\"Foo\",\"Foo\",0,\"9.8 kB\",\"\");</script>\n"}, 474 "<script>addRow(\"Foo\",\"Foo\",0,\"9.8 kB\",\"\");</script>\n"},
689 {L"quo\"tes", 475 {L"quo\"tes",
690 "", 476 "",
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 test_cases[i].raw_bytes, 512 test_cases[i].raw_bytes,
727 test_cases[i].is_dir, 513 test_cases[i].is_dir,
728 test_cases[i].filesize, 514 test_cases[i].filesize,
729 test_cases[i].time); 515 test_cases[i].time);
730 EXPECT_EQ(test_cases[i].expected, results); 516 EXPECT_EQ(test_cases[i].expected, results);
731 } 517 }
732 } 518 }
733 519
734 #endif 520 #endif
735 521
736 TEST(NetUtilTest, ParseHostAndPort) {
737 const struct {
738 const char* input;
739 bool success;
740 const char* expected_host;
741 int expected_port;
742 } tests[] = {
743 // Valid inputs:
744 {"foo:10", true, "foo", 10},
745 {"foo", true, "foo", -1},
746 {
747 "[1080:0:0:0:8:800:200C:4171]:11",
748 true,
749 "[1080:0:0:0:8:800:200C:4171]",
750 11,
751 },
752 // Invalid inputs:
753 {"foo:bar", false, "", -1},
754 {"foo:", false, "", -1},
755 {":", false, "", -1},
756 {":80", false, "", -1},
757 {"", false, "", -1},
758 {"porttoolong:300000", false, "", -1},
759 {"usrname@host", false, "", -1},
760 {"usrname:password@host", false, "", -1},
761 {":password@host", false, "", -1},
762 {":password@host:80", false, "", -1},
763 {":password@host", false, "", -1},
764 {"@host", false, "", -1},
765 };
766
767 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
768 std::string host;
769 int port;
770 bool ok = ParseHostAndPort(tests[i].input, &host, &port);
771
772 EXPECT_EQ(tests[i].success, ok);
773
774 if (tests[i].success) {
775 EXPECT_EQ(tests[i].expected_host, host);
776 EXPECT_EQ(tests[i].expected_port, port);
777 }
778 }
779 }
780
781 TEST(NetUtilTest, GetHostAndPort) {
782 const struct {
783 GURL url;
784 const char* expected_host_and_port;
785 } tests[] = {
786 { GURL("http://www.foo.com/x"), "www.foo.com:80"},
787 { GURL("http://www.foo.com:21/x"), "www.foo.com:21"},
788
789 // For IPv6 literals should always include the brackets.
790 { GURL("http://[1::2]/x"), "[1::2]:80"},
791 { GURL("http://[::a]:33/x"), "[::a]:33"},
792 };
793 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
794 std::string host_and_port = GetHostAndPort(tests[i].url);
795 EXPECT_EQ(std::string(tests[i].expected_host_and_port), host_and_port);
796 }
797 }
798
799 TEST(NetUtilTest, GetHostAndOptionalPort) {
800 const struct {
801 GURL url;
802 const char* expected_host_and_port;
803 } tests[] = {
804 { GURL("http://www.foo.com/x"), "www.foo.com"},
805 { GURL("http://www.foo.com:21/x"), "www.foo.com:21"},
806
807 // For IPv6 literals should always include the brackets.
808 { GURL("http://[1::2]/x"), "[1::2]"},
809 { GURL("http://[::a]:33/x"), "[::a]:33"},
810 };
811 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
812 std::string host_and_port = GetHostAndOptionalPort(tests[i].url);
813 EXPECT_EQ(std::string(tests[i].expected_host_and_port), host_and_port);
814 }
815 }
816
817 TEST(NetUtilTest, IPAddressToString) {
818 uint8 addr1[4] = {0, 0, 0, 0};
819 EXPECT_EQ("0.0.0.0", IPAddressToString(addr1, sizeof(addr1)));
820
821 uint8 addr2[4] = {192, 168, 0, 1};
822 EXPECT_EQ("192.168.0.1", IPAddressToString(addr2, sizeof(addr2)));
823
824 uint8 addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
825 EXPECT_EQ("fedc:ba98::", IPAddressToString(addr3, sizeof(addr3)));
826 }
827
828 TEST(NetUtilTest, IPAddressToStringWithPort) {
829 uint8 addr1[4] = {0, 0, 0, 0};
830 EXPECT_EQ("0.0.0.0:3", IPAddressToStringWithPort(addr1, sizeof(addr1), 3));
831
832 uint8 addr2[4] = {192, 168, 0, 1};
833 EXPECT_EQ("192.168.0.1:99",
834 IPAddressToStringWithPort(addr2, sizeof(addr2), 99));
835
836 uint8 addr3[16] = {0xFE, 0xDC, 0xBA, 0x98};
837 EXPECT_EQ("[fedc:ba98::]:8080",
838 IPAddressToStringWithPort(addr3, sizeof(addr3), 8080));
839 }
840
841 TEST(NetUtilTest, NetAddressToString_IPv4) {
842 const struct {
843 uint8 addr[4];
844 const char* result;
845 } tests[] = {
846 {{0, 0, 0, 0}, "0.0.0.0"},
847 {{127, 0, 0, 1}, "127.0.0.1"},
848 {{192, 168, 0, 1}, "192.168.0.1"},
849 };
850
851 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
852 SockaddrStorage storage;
853 MakeIPv4Address(tests[i].addr, 80, &storage);
854 std::string result = NetAddressToString(storage.addr, storage.addr_len);
855 EXPECT_EQ(std::string(tests[i].result), result);
856 }
857 }
858
859 TEST(NetUtilTest, NetAddressToString_IPv6) {
860 const struct {
861 uint8 addr[16];
862 const char* result;
863 } tests[] = {
864 {{0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0xFE, 0xDC, 0xBA,
865 0x98, 0x76, 0x54, 0x32, 0x10},
866 "fedc:ba98:7654:3210:fedc:ba98:7654:3210"},
867 };
868
869 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
870 SockaddrStorage storage;
871 MakeIPv6Address(tests[i].addr, 80, &storage);
872 EXPECT_EQ(std::string(tests[i].result),
873 NetAddressToString(storage.addr, storage.addr_len));
874 }
875 }
876
877 TEST(NetUtilTest, NetAddressToStringWithPort_IPv4) {
878 uint8 addr[] = {127, 0, 0, 1};
879 SockaddrStorage storage;
880 MakeIPv4Address(addr, 166, &storage);
881 std::string result = NetAddressToStringWithPort(storage.addr,
882 storage.addr_len);
883 EXPECT_EQ("127.0.0.1:166", result);
884 }
885
886 TEST(NetUtilTest, NetAddressToStringWithPort_IPv6) {
887 uint8 addr[] = {
888 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, 0xFE, 0xDC, 0xBA,
889 0x98, 0x76, 0x54, 0x32, 0x10
890 };
891 SockaddrStorage storage;
892 MakeIPv6Address(addr, 361, &storage);
893 std::string result = NetAddressToStringWithPort(storage.addr,
894 storage.addr_len);
895
896 // May fail on systems that don't support IPv6.
897 if (!result.empty())
898 EXPECT_EQ("[fedc:ba98:7654:3210:fedc:ba98:7654:3210]:361", result);
899 }
900
901 TEST(NetUtilTest, GetHostName) {
902 // We can't check the result of GetHostName() directly, since the result
903 // will differ across machines. Our goal here is to simply exercise the
904 // code path, and check that things "look about right".
905 std::string hostname = GetHostName();
906 EXPECT_FALSE(hostname.empty());
907 }
908
909 TEST(NetUtilTest, FormatUrl) { 522 TEST(NetUtilTest, FormatUrl) {
910 FormatUrlTypes default_format_type = kFormatUrlOmitUsernamePassword; 523 FormatUrlTypes default_format_type = kFormatUrlOmitUsernamePassword;
911 const UrlTestData tests[] = { 524 const UrlTestData tests[] = {
912 {"Empty URL", "", "", default_format_type, UnescapeRule::NORMAL, L"", 0}, 525 {"Empty URL", "", "", default_format_type, UnescapeRule::NORMAL, L"", 0},
913 526
914 {"Simple URL", 527 {"Simple URL",
915 "http://www.google.com/", "", default_format_type, UnescapeRule::NORMAL, 528 "http://www.google.com/", "", default_format_type, UnescapeRule::NORMAL,
916 L"http://www.google.com/", 7}, 529 L"http://www.google.com/", 7},
917 530
918 {"With a port number and a reference", 531 {"With a port number and a reference",
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after
1448 UnescapeRule::NORMAL, omit_http_start_with_ftp_offsets); 1061 UnescapeRule::NORMAL, omit_http_start_with_ftp_offsets);
1449 1062
1450 const size_t omit_all_offsets[] = { 1063 const size_t omit_all_offsets[] = {
1451 0, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 0, kNpos, kNpos, kNpos, kNpos, 1064 0, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 0, kNpos, kNpos, kNpos, kNpos,
1452 0, 1, 2, 3, 4, 5, 6, 7 1065 0, 1, 2, 3, 4, 5, 6, 7
1453 }; 1066 };
1454 CheckAdjustedOffsets("http://user@foo.com/", "en", kFormatUrlOmitAll, 1067 CheckAdjustedOffsets("http://user@foo.com/", "en", kFormatUrlOmitAll,
1455 UnescapeRule::NORMAL, omit_all_offsets); 1068 UnescapeRule::NORMAL, omit_all_offsets);
1456 } 1069 }
1457 1070
1458 TEST(NetUtilTest, SimplifyUrlForRequest) {
1459 struct {
1460 const char* input_url;
1461 const char* expected_simplified_url;
1462 } tests[] = {
1463 {
1464 // Reference section should be stripped.
1465 "http://www.google.com:78/foobar?query=1#hash",
1466 "http://www.google.com:78/foobar?query=1",
1467 },
1468 {
1469 // Reference section can itself contain #.
1470 "http://192.168.0.1?query=1#hash#10#11#13#14",
1471 "http://192.168.0.1?query=1",
1472 },
1473 { // Strip username/password.
1474 "http://user:pass@google.com",
1475 "http://google.com/",
1476 },
1477 { // Strip both the reference and the username/password.
1478 "http://user:pass@google.com:80/sup?yo#X#X",
1479 "http://google.com/sup?yo",
1480 },
1481 { // Try an HTTPS URL -- strip both the reference and the username/password.
1482 "https://user:pass@google.com:80/sup?yo#X#X",
1483 "https://google.com:80/sup?yo",
1484 },
1485 { // Try an FTP URL -- strip both the reference and the username/password.
1486 "ftp://user:pass@google.com:80/sup?yo#X#X",
1487 "ftp://google.com:80/sup?yo",
1488 },
1489 { // Try a nonstandard URL
1490 "foobar://user:pass@google.com:80/sup?yo#X#X",
1491 "foobar://user:pass@google.com:80/sup?yo",
1492 },
1493 };
1494 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
1495 SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s", i,
1496 tests[i].input_url));
1497 GURL input_url(GURL(tests[i].input_url));
1498 GURL expected_url(GURL(tests[i].expected_simplified_url));
1499 EXPECT_EQ(expected_url, SimplifyUrlForRequest(input_url));
1500 }
1501 }
1502
1503 TEST(NetUtilTest, SetExplicitlyAllowedPortsTest) {
1504 std::string invalid[] = { "1,2,a", "'1','2'", "1, 2, 3", "1 0,11,12" };
1505 std::string valid[] = { "", "1", "1,2", "1,2,3", "10,11,12,13" };
1506
1507 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(invalid); ++i) {
1508 SetExplicitlyAllowedPorts(invalid[i]);
1509 EXPECT_EQ(0, static_cast<int>(GetCountOfExplicitlyAllowedPorts()));
1510 }
1511
1512 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(valid); ++i) {
1513 SetExplicitlyAllowedPorts(valid[i]);
1514 EXPECT_EQ(i, GetCountOfExplicitlyAllowedPorts());
1515 }
1516 }
1517
1518 TEST(NetUtilTest, GetHostOrSpecFromURL) {
1519 EXPECT_EQ("example.com",
1520 GetHostOrSpecFromURL(GURL("http://example.com/test")));
1521 EXPECT_EQ("example.com",
1522 GetHostOrSpecFromURL(GURL("http://example.com./test")));
1523 EXPECT_EQ("file:///tmp/test.html",
1524 GetHostOrSpecFromURL(GURL("file:///tmp/test.html")));
1525 }
1526
1527 TEST(NetUtilTest, GetAddressFamily) {
1528 IPAddressNumber number;
1529 EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &number));
1530 EXPECT_EQ(ADDRESS_FAMILY_IPV4, GetAddressFamily(number));
1531 EXPECT_TRUE(ParseIPLiteralToNumber("1:abcd::3:4:ff", &number));
1532 EXPECT_EQ(ADDRESS_FAMILY_IPV6, GetAddressFamily(number));
1533 }
1534
1535 // Test that invalid IP literals fail to parse.
1536 TEST(NetUtilTest, ParseIPLiteralToNumber_FailParse) {
1537 IPAddressNumber number;
1538
1539 EXPECT_FALSE(ParseIPLiteralToNumber("bad value", &number));
1540 EXPECT_FALSE(ParseIPLiteralToNumber("bad:value", &number));
1541 EXPECT_FALSE(ParseIPLiteralToNumber(std::string(), &number));
1542 EXPECT_FALSE(ParseIPLiteralToNumber("192.168.0.1:30", &number));
1543 EXPECT_FALSE(ParseIPLiteralToNumber(" 192.168.0.1 ", &number));
1544 EXPECT_FALSE(ParseIPLiteralToNumber("[::1]", &number));
1545 }
1546
1547 // Test parsing an IPv4 literal.
1548 TEST(NetUtilTest, ParseIPLiteralToNumber_IPv4) {
1549 IPAddressNumber number;
1550 EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &number));
1551 EXPECT_EQ("192,168,0,1", DumpIPNumber(number));
1552 EXPECT_EQ("192.168.0.1", IPAddressToString(number));
1553 }
1554
1555 // Test parsing an IPv6 literal.
1556 TEST(NetUtilTest, ParseIPLiteralToNumber_IPv6) {
1557 IPAddressNumber number;
1558 EXPECT_TRUE(ParseIPLiteralToNumber("1:abcd::3:4:ff", &number));
1559 EXPECT_EQ("0,1,171,205,0,0,0,0,0,0,0,3,0,4,0,255", DumpIPNumber(number));
1560 EXPECT_EQ("1:abcd::3:4:ff", IPAddressToString(number));
1561 }
1562
1563 // Test mapping an IPv4 address to an IPv6 address.
1564 TEST(NetUtilTest, ConvertIPv4NumberToIPv6Number) {
1565 IPAddressNumber ipv4_number;
1566 EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &ipv4_number));
1567
1568 IPAddressNumber ipv6_number =
1569 ConvertIPv4NumberToIPv6Number(ipv4_number);
1570
1571 // ::ffff:192.168.0.1
1572 EXPECT_EQ("0,0,0,0,0,0,0,0,0,0,255,255,192,168,0,1",
1573 DumpIPNumber(ipv6_number));
1574 EXPECT_EQ("::ffff:c0a8:1", IPAddressToString(ipv6_number));
1575 }
1576
1577 TEST(NetUtilTest, IsIPv4Mapped) {
1578 IPAddressNumber ipv4_number;
1579 EXPECT_TRUE(ParseIPLiteralToNumber("192.168.0.1", &ipv4_number));
1580 EXPECT_FALSE(IsIPv4Mapped(ipv4_number));
1581
1582 IPAddressNumber ipv6_number;
1583 EXPECT_TRUE(ParseIPLiteralToNumber("::1", &ipv4_number));
1584 EXPECT_FALSE(IsIPv4Mapped(ipv6_number));
1585
1586 IPAddressNumber ipv4mapped_number;
1587 EXPECT_TRUE(ParseIPLiteralToNumber("::ffff:0101:1", &ipv4mapped_number));
1588 EXPECT_TRUE(IsIPv4Mapped(ipv4mapped_number));
1589 }
1590
1591 TEST(NetUtilTest, ConvertIPv4MappedToIPv4) {
1592 IPAddressNumber ipv4mapped_number;
1593 EXPECT_TRUE(ParseIPLiteralToNumber("::ffff:0101:1", &ipv4mapped_number));
1594 IPAddressNumber expected;
1595 EXPECT_TRUE(ParseIPLiteralToNumber("1.1.0.1", &expected));
1596 IPAddressNumber result = ConvertIPv4MappedToIPv4(ipv4mapped_number);
1597 EXPECT_EQ(expected, result);
1598 }
1599
1600 // Test parsing invalid CIDR notation literals.
1601 TEST(NetUtilTest, ParseCIDRBlock_Invalid) {
1602 const char* bad_literals[] = {
1603 "foobar",
1604 "",
1605 "192.168.0.1",
1606 "::1",
1607 "/",
1608 "/1",
1609 "1",
1610 "192.168.1.1/-1",
1611 "192.168.1.1/33",
1612 "::1/-3",
1613 "a::3/129",
1614 "::1/x",
1615 "192.168.0.1//11"
1616 };
1617
1618 for (size_t i = 0; i < arraysize(bad_literals); ++i) {
1619 IPAddressNumber ip_number;
1620 size_t prefix_length_in_bits;
1621
1622 EXPECT_FALSE(ParseCIDRBlock(bad_literals[i],
1623 &ip_number,
1624 &prefix_length_in_bits));
1625 }
1626 }
1627
1628 // Test parsing a valid CIDR notation literal.
1629 TEST(NetUtilTest, ParseCIDRBlock_Valid) {
1630 IPAddressNumber ip_number;
1631 size_t prefix_length_in_bits;
1632
1633 EXPECT_TRUE(ParseCIDRBlock("192.168.0.1/11",
1634 &ip_number,
1635 &prefix_length_in_bits));
1636
1637 EXPECT_EQ("192,168,0,1", DumpIPNumber(ip_number));
1638 EXPECT_EQ(11u, prefix_length_in_bits);
1639 }
1640
1641 TEST(NetUtilTest, IPNumberMatchesPrefix) {
1642 struct {
1643 const char* cidr_literal;
1644 const char* ip_literal;
1645 bool expected_to_match;
1646 } tests[] = {
1647 // IPv4 prefix with IPv4 inputs.
1648 {
1649 "10.10.1.32/27",
1650 "10.10.1.44",
1651 true
1652 },
1653 {
1654 "10.10.1.32/27",
1655 "10.10.1.90",
1656 false
1657 },
1658 {
1659 "10.10.1.32/27",
1660 "10.10.1.90",
1661 false
1662 },
1663
1664 // IPv6 prefix with IPv6 inputs.
1665 {
1666 "2001:db8::/32",
1667 "2001:DB8:3:4::5",
1668 true
1669 },
1670 {
1671 "2001:db8::/32",
1672 "2001:c8::",
1673 false
1674 },
1675
1676 // IPv6 prefix with IPv4 inputs.
1677 {
1678 "2001:db8::/33",
1679 "192.168.0.1",
1680 false
1681 },
1682 {
1683 "::ffff:192.168.0.1/112",
1684 "192.168.33.77",
1685 true
1686 },
1687
1688 // IPv4 prefix with IPv6 inputs.
1689 {
1690 "10.11.33.44/16",
1691 "::ffff:0a0b:89",
1692 true
1693 },
1694 {
1695 "10.11.33.44/16",
1696 "::ffff:10.12.33.44",
1697 false
1698 },
1699 };
1700 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
1701 SCOPED_TRACE(base::StringPrintf("Test[%" PRIuS "]: %s, %s", i,
1702 tests[i].cidr_literal,
1703 tests[i].ip_literal));
1704
1705 IPAddressNumber ip_number;
1706 EXPECT_TRUE(ParseIPLiteralToNumber(tests[i].ip_literal, &ip_number));
1707
1708 IPAddressNumber ip_prefix;
1709 size_t prefix_length_in_bits;
1710
1711 EXPECT_TRUE(ParseCIDRBlock(tests[i].cidr_literal,
1712 &ip_prefix,
1713 &prefix_length_in_bits));
1714
1715 EXPECT_EQ(tests[i].expected_to_match,
1716 IPNumberMatchesPrefix(ip_number,
1717 ip_prefix,
1718 prefix_length_in_bits));
1719 }
1720 }
1721
1722 TEST(NetUtilTest, IsLocalhost) {
1723 EXPECT_TRUE(net::IsLocalhost("localhost"));
1724 EXPECT_TRUE(net::IsLocalhost("localhost.localdomain"));
1725 EXPECT_TRUE(net::IsLocalhost("localhost6"));
1726 EXPECT_TRUE(net::IsLocalhost("localhost6.localdomain6"));
1727 EXPECT_TRUE(net::IsLocalhost("127.0.0.1"));
1728 EXPECT_TRUE(net::IsLocalhost("127.0.1.0"));
1729 EXPECT_TRUE(net::IsLocalhost("127.1.0.0"));
1730 EXPECT_TRUE(net::IsLocalhost("127.0.0.255"));
1731 EXPECT_TRUE(net::IsLocalhost("127.0.255.0"));
1732 EXPECT_TRUE(net::IsLocalhost("127.255.0.0"));
1733 EXPECT_TRUE(net::IsLocalhost("::1"));
1734 EXPECT_TRUE(net::IsLocalhost("0:0:0:0:0:0:0:1"));
1735
1736 EXPECT_FALSE(net::IsLocalhost("localhostx"));
1737 EXPECT_FALSE(net::IsLocalhost("foo.localdomain"));
1738 EXPECT_FALSE(net::IsLocalhost("localhost6x"));
1739 EXPECT_FALSE(net::IsLocalhost("localhost.localdomain6"));
1740 EXPECT_FALSE(net::IsLocalhost("localhost6.localdomain"));
1741 EXPECT_FALSE(net::IsLocalhost("127.0.0.1.1"));
1742 EXPECT_FALSE(net::IsLocalhost(".127.0.0.255"));
1743 EXPECT_FALSE(net::IsLocalhost("::2"));
1744 EXPECT_FALSE(net::IsLocalhost("::1:1"));
1745 EXPECT_FALSE(net::IsLocalhost("0:0:0:0:1:0:0:1"));
1746 EXPECT_FALSE(net::IsLocalhost("::1:1"));
1747 EXPECT_FALSE(net::IsLocalhost("0:0:0:0:0:0:0:0:1"));
1748 }
1749
1750 // Verify GetNetworkList().
1751 TEST(NetUtilTest, GetNetworkList) {
1752 NetworkInterfaceList list;
1753 ASSERT_TRUE(GetNetworkList(&list, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES));
1754 for (NetworkInterfaceList::iterator it = list.begin();
1755 it != list.end(); ++it) {
1756 // Verify that the names are not empty.
1757 EXPECT_FALSE(it->name.empty());
1758 EXPECT_FALSE(it->friendly_name.empty());
1759
1760 // Verify that the address is correct.
1761 EXPECT_TRUE(it->address.size() == kIPv4AddressSize ||
1762 it->address.size() == kIPv6AddressSize)
1763 << "Invalid address of size " << it->address.size();
1764 bool all_zeroes = true;
1765 for (size_t i = 0; i < it->address.size(); ++i) {
1766 if (it->address[i] != 0) {
1767 all_zeroes = false;
1768 break;
1769 }
1770 }
1771 EXPECT_FALSE(all_zeroes);
1772 EXPECT_GT(it->network_prefix, 1u);
1773 EXPECT_LE(it->network_prefix, it->address.size() * 8);
1774
1775 #if defined(OS_WIN)
1776 // On Windows |name| is NET_LUID.
1777 base::ScopedNativeLibrary phlpapi_lib(
1778 base::FilePath(FILE_PATH_LITERAL("iphlpapi.dll")));
1779 ASSERT_TRUE(phlpapi_lib.is_valid());
1780 typedef NETIO_STATUS (WINAPI* ConvertInterfaceIndexToLuid)(NET_IFINDEX,
1781 PNET_LUID);
1782 ConvertInterfaceIndexToLuid interface_to_luid =
1783 reinterpret_cast<ConvertInterfaceIndexToLuid>(
1784 phlpapi_lib.GetFunctionPointer("ConvertInterfaceIndexToLuid"));
1785
1786 typedef NETIO_STATUS (WINAPI* ConvertInterfaceLuidToGuid)(NET_LUID*,
1787 GUID*);
1788 ConvertInterfaceLuidToGuid luid_to_guid =
1789 reinterpret_cast<ConvertInterfaceLuidToGuid>(
1790 phlpapi_lib.GetFunctionPointer("ConvertInterfaceLuidToGuid"));
1791
1792 if (interface_to_luid && luid_to_guid) {
1793 NET_LUID luid;
1794 EXPECT_EQ(interface_to_luid(it->interface_index, &luid), NO_ERROR);
1795 GUID guid;
1796 EXPECT_EQ(luid_to_guid(&luid, &guid), NO_ERROR);
1797 LPOLESTR name;
1798 StringFromCLSID(guid, &name);
1799 EXPECT_STREQ(base::UTF8ToWide(it->name).c_str(), name);
1800 CoTaskMemFree(name);
1801 continue;
1802 } else {
1803 EXPECT_LT(base::win::GetVersion(), base::win::VERSION_VISTA);
1804 EXPECT_LT(it->interface_index, 1u << 24u); // Must fit 0.x.x.x.
1805 EXPECT_NE(it->interface_index, 0u); // 0 means to use default.
1806 }
1807 if (it->type == NetworkChangeNotifier::CONNECTION_WIFI) {
1808 EXPECT_NE(WIFI_PHY_LAYER_PROTOCOL_NONE, GetWifiPHYLayerProtocol());
1809 }
1810 #elif !defined(OS_ANDROID)
1811 char name[IF_NAMESIZE];
1812 EXPECT_TRUE(if_indextoname(it->interface_index, name));
1813 EXPECT_STREQ(it->name.c_str(), name);
1814 #endif
1815 }
1816 }
1817
1818 struct NonUniqueNameTestData {
1819 bool is_unique;
1820 const char* hostname;
1821 };
1822
1823 // Google Test pretty-printer.
1824 void PrintTo(const NonUniqueNameTestData& data, std::ostream* os) {
1825 ASSERT_TRUE(data.hostname);
1826 *os << " hostname: " << testing::PrintToString(data.hostname)
1827 << "; is_unique: " << testing::PrintToString(data.is_unique);
1828 }
1829
1830 const NonUniqueNameTestData kNonUniqueNameTestData[] = {
1831 // Domains under ICANN-assigned domains.
1832 { true, "google.com" },
1833 { true, "google.co.uk" },
1834 // Domains under private registries.
1835 { true, "appspot.com" },
1836 { true, "test.appspot.com" },
1837 // Unreserved IPv4 addresses (in various forms).
1838 { true, "8.8.8.8" },
1839 { true, "99.64.0.0" },
1840 { true, "212.15.0.0" },
1841 { true, "212.15" },
1842 { true, "212.15.0" },
1843 { true, "3557752832" },
1844 // Reserved IPv4 addresses (in various forms).
1845 { false, "192.168.0.0" },
1846 { false, "192.168.0.6" },
1847 { false, "10.0.0.5" },
1848 { false, "10.0" },
1849 { false, "10.0.0" },
1850 { false, "3232235526" },
1851 // Unreserved IPv6 addresses.
1852 { true, "FFC0:ba98:7654:3210:FEDC:BA98:7654:3210" },
1853 { true, "2000:ba98:7654:2301:EFCD:BA98:7654:3210" },
1854 // Reserved IPv6 addresses.
1855 { false, "::192.9.5.5" },
1856 { false, "FEED::BEEF" },
1857 { false, "FEC0:ba98:7654:3210:FEDC:BA98:7654:3210" },
1858 // 'internal'/non-IANA assigned domains.
1859 { false, "intranet" },
1860 { false, "intranet." },
1861 { false, "intranet.example" },
1862 { false, "host.intranet.example" },
1863 // gTLDs under discussion, but not yet assigned.
1864 { false, "intranet.corp" },
1865 { false, "example.tech" },
1866 { false, "intranet.internal" },
1867 // Invalid host names are treated as unique - but expected to be
1868 // filtered out before then.
1869 { true, "junk)(£)$*!@~#" },
1870 { true, "w$w.example.com" },
1871 { true, "nocolonsallowed:example" },
1872 { true, "[::4.5.6.9]" },
1873 };
1874
1875 class NetUtilNonUniqueNameTest
1876 : public testing::TestWithParam<NonUniqueNameTestData> {
1877 public:
1878 virtual ~NetUtilNonUniqueNameTest() {}
1879
1880 protected:
1881 bool IsUnique(const std::string& hostname) {
1882 return !IsHostnameNonUnique(hostname);
1883 }
1884 };
1885
1886 // Test that internal/non-unique names are properly identified as such, but
1887 // that IP addresses and hosts beneath registry-controlled domains are flagged
1888 // as unique names.
1889 TEST_P(NetUtilNonUniqueNameTest, IsHostnameNonUnique) {
1890 const NonUniqueNameTestData& test_data = GetParam();
1891
1892 EXPECT_EQ(test_data.is_unique, IsUnique(test_data.hostname));
1893 }
1894
1895 INSTANTIATE_TEST_CASE_P(, NetUtilNonUniqueNameTest,
1896 testing::ValuesIn(kNonUniqueNameTestData));
1897
1898 } // namespace net 1071 } // namespace net
OLDNEW
« no previous file with comments | « net/android/net_jni_registrar.cc ('k') | net/base/net_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698