OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/file_path.h" | 9 #include "base/file_path.h" |
10 #include "base/format_macros.h" | 10 #include "base/format_macros.h" |
(...skipping 13 matching lines...) Expand all Loading... |
24 namespace { | 24 namespace { |
25 | 25 |
26 static const size_t kNpos = string16::npos; | 26 static const size_t kNpos = string16::npos; |
27 | 27 |
28 struct FileCase { | 28 struct FileCase { |
29 const wchar_t* file; | 29 const wchar_t* file; |
30 const char* url; | 30 const char* url; |
31 }; | 31 }; |
32 | 32 |
33 struct HeaderCase { | 33 struct HeaderCase { |
34 const wchar_t* header_name; | 34 const char* header_name; |
35 const wchar_t* expected; | 35 const char* expected; |
36 }; | 36 }; |
37 | 37 |
38 struct HeaderParamCase { | 38 struct HeaderParamCase { |
39 const wchar_t* header_name; | 39 const char* header_name; |
40 const wchar_t* param_name; | 40 const char* param_name; |
41 const wchar_t* expected; | 41 const char* expected; |
42 }; | 42 }; |
43 | 43 |
44 struct FileNameCDCase { | 44 struct FileNameCDCase { |
45 const char* header_field; | 45 const char* header_field; |
46 const char* referrer_charset; | 46 const char* referrer_charset; |
47 const wchar_t* expected; | 47 const wchar_t* expected; |
48 }; | 48 }; |
49 | 49 |
50 const wchar_t* kLanguages[] = { | 50 const char* kLanguages[] = { |
51 L"", L"en", L"zh-CN", L"ja", L"ko", | 51 "", "en", "zh-CN", "ja", "ko", |
52 L"he", L"ar", L"ru", L"el", L"fr", | 52 "he", "ar", "ru", "el", "fr", |
53 L"de", L"pt", L"sv", L"th", L"hi", | 53 "de", "pt", "sv", "th", "hi", |
54 L"de,en", L"el,en", L"zh-TW,en", L"ko,ja", L"he,ru,en", | 54 "de,en", "el,en", "zh-TW,en", "ko,ja", "he,ru,en", |
55 L"zh,ru,en" | 55 "zh,ru,en" |
56 }; | 56 }; |
57 | 57 |
58 struct IDNTestCase { | 58 struct IDNTestCase { |
59 const char* input; | 59 const char* input; |
60 const wchar_t* unicode_output; | 60 const wchar_t* unicode_output; |
61 const bool unicode_allowed[arraysize(kLanguages)]; | 61 const bool unicode_allowed[arraysize(kLanguages)]; |
62 }; | 62 }; |
63 | 63 |
64 // TODO(jungshik) This is just a random sample of languages and is far | 64 // TODO(jungshik) This is just a random sample of languages and is far |
65 // from exhaustive. We may have to generate all the combinations | 65 // from exhaustive. We may have to generate all the combinations |
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
444 addr6->sin6_family = ai->ai_family; | 444 addr6->sin6_family = ai->ai_family; |
445 memcpy(&addr6->sin6_addr, bytes, 16); | 445 memcpy(&addr6->sin6_addr, bytes, 16); |
446 | 446 |
447 ai->ai_addr = (sockaddr*)addr6; | 447 ai->ai_addr = (sockaddr*)addr6; |
448 return ai; | 448 return ai; |
449 } | 449 } |
450 | 450 |
451 // A helper for IDN*{Fast,Slow}. | 451 // A helper for IDN*{Fast,Slow}. |
452 // Append "::<language list>" to |expected| and |actual| to make it | 452 // Append "::<language list>" to |expected| and |actual| to make it |
453 // easy to tell which sub-case fails without debugging. | 453 // easy to tell which sub-case fails without debugging. |
454 void AppendLanguagesToOutputs(const wchar_t* languages, | 454 void AppendLanguagesToOutputs(const char* languages, |
455 std::wstring* expected, | 455 string16* expected, |
456 std::wstring* actual) { | 456 string16* actual) { |
457 expected->append(L"::"); | 457 string16 to_append = ASCIIToUTF16("::") + ASCIIToUTF16(languages); |
458 expected->append(languages); | 458 expected->append(to_append); |
459 actual->append(L"::"); | 459 actual->append(to_append); |
460 actual->append(languages); | 460 } |
| 461 |
| 462 // A pair of helpers for the FormatUrlWithOffsets() test. |
| 463 void VerboseExpect(size_t expected, |
| 464 size_t actual, |
| 465 const std::string& original_url, |
| 466 size_t position, |
| 467 const string16& formatted_url) { |
| 468 EXPECT_EQ(expected, actual) << "Original URL: " << original_url |
| 469 << " (at char " << position << ")\nFormatted URL: " << formatted_url; |
| 470 } |
| 471 |
| 472 void CheckAdjustedOffsets(const std::string& url_string, |
| 473 const std::string& languages, |
| 474 FormatUrlTypes format_types, |
| 475 UnescapeRule::Type unescape_rules, |
| 476 const AdjustOffsetCase* cases, |
| 477 size_t num_cases, |
| 478 const size_t* all_offsets) { |
| 479 GURL url(url_string); |
| 480 for (size_t i = 0; i < num_cases; ++i) { |
| 481 size_t offset = cases[i].input_offset; |
| 482 string16 formatted_url = FormatUrl(url, languages, format_types, |
| 483 unescape_rules, NULL, NULL, &offset); |
| 484 VerboseExpect(cases[i].output_offset, offset, url_string, i, formatted_url); |
| 485 } |
| 486 |
| 487 size_t url_size = url_string.length(); |
| 488 std::vector<size_t> offsets; |
| 489 for (size_t i = 0; i < url_size + 1; ++i) |
| 490 offsets.push_back(i); |
| 491 string16 formatted_url = FormatUrlWithOffsets(url, languages, format_types, |
| 492 unescape_rules, NULL, NULL, &offsets); |
| 493 for (size_t i = 0; i < url_size; ++i) |
| 494 VerboseExpect(all_offsets[i], offsets[i], url_string, i, formatted_url); |
| 495 VerboseExpect(kNpos, offsets[url_size], url_string, url_size, formatted_url); |
461 } | 496 } |
462 | 497 |
463 // Helper to strignize an IP number (used to define expectations). | 498 // Helper to strignize an IP number (used to define expectations). |
464 std::string DumpIPNumber(const IPAddressNumber& v) { | 499 std::string DumpIPNumber(const IPAddressNumber& v) { |
465 std::string out; | 500 std::string out; |
466 for (size_t i = 0; i < v.size(); ++i) { | 501 for (size_t i = 0; i < v.size(); ++i) { |
467 if (i != 0) | 502 if (i != 0) |
468 out.append(","); | 503 out.append(","); |
469 out.append(base::IntToString(static_cast<int>(v[i]))); | 504 out.append(base::IntToString(static_cast<int>(v[i]))); |
470 } | 505 } |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 // Extract the unescaped identity. | 678 // Extract the unescaped identity. |
644 string16 username, password; | 679 string16 username, password; |
645 GetIdentityFromURL(url, &username, &password); | 680 GetIdentityFromURL(url, &username, &password); |
646 | 681 |
647 // Verify that it was decoded as UTF8. | 682 // Verify that it was decoded as UTF8. |
648 EXPECT_EQ(ASCIIToUTF16("foo"), username); | 683 EXPECT_EQ(ASCIIToUTF16("foo"), username); |
649 EXPECT_EQ(WideToUTF16(L"\x4f60\x597d"), password); | 684 EXPECT_EQ(WideToUTF16(L"\x4f60\x597d"), password); |
650 } | 685 } |
651 | 686 |
652 // Just a bunch of fake headers. | 687 // Just a bunch of fake headers. |
653 const wchar_t* google_headers = | 688 const char* google_headers = |
654 L"HTTP/1.1 200 OK\n" | 689 "HTTP/1.1 200 OK\n" |
655 L"Content-TYPE: text/html; charset=utf-8\n" | 690 "Content-TYPE: text/html; charset=utf-8\n" |
656 L"Content-disposition: attachment; filename=\"download.pdf\"\n" | 691 "Content-disposition: attachment; filename=\"download.pdf\"\n" |
657 L"Content-Length: 378557\n" | 692 "Content-Length: 378557\n" |
658 L"X-Google-Google1: 314159265\n" | 693 "X-Google-Google1: 314159265\n" |
659 L"X-Google-Google2: aaaa2:7783,bbb21:9441\n" | 694 "X-Google-Google2: aaaa2:7783,bbb21:9441\n" |
660 L"X-Google-Google4: home\n" | 695 "X-Google-Google4: home\n" |
661 L"Transfer-Encoding: chunked\n" | 696 "Transfer-Encoding: chunked\n" |
662 L"Set-Cookie: HEHE_AT=6666x66beef666x6-66xx6666x66; Path=/mail\n" | 697 "Set-Cookie: HEHE_AT=6666x66beef666x6-66xx6666x66; Path=/mail\n" |
663 L"Set-Cookie: HEHE_HELP=owned:0;Path=/\n" | 698 "Set-Cookie: HEHE_HELP=owned:0;Path=/\n" |
664 L"Set-Cookie: S=gmail=Xxx-beefbeefbeef_beefb:gmail_yj=beefbeef000beefbee" | 699 "Set-Cookie: S=gmail=Xxx-beefbeefbeef_beefb:gmail_yj=beefbeef000beefbee" |
665 L"fbee:gmproxy=bee-fbeefbe; Domain=.google.com; Path=/\n" | 700 "fbee:gmproxy=bee-fbeefbe; Domain=.google.com; Path=/\n" |
666 L"X-Google-Google2: /one/two/three/four/five/six/seven-height/nine:9411\n" | 701 "X-Google-Google2: /one/two/three/four/five/six/seven-height/nine:9411\n" |
667 L"Server: GFE/1.3\n" | 702 "Server: GFE/1.3\n" |
668 L"Transfer-Encoding: chunked\n" | 703 "Transfer-Encoding: chunked\n" |
669 L"Date: Mon, 13 Nov 2006 21:38:09 GMT\n" | 704 "Date: Mon, 13 Nov 2006 21:38:09 GMT\n" |
670 L"Expires: Tue, 14 Nov 2006 19:23:58 GMT\n" | 705 "Expires: Tue, 14 Nov 2006 19:23:58 GMT\n" |
671 L"X-Malformed: bla; arg=test\"\n" | 706 "X-Malformed: bla; arg=test\"\n" |
672 L"X-Malformed2: bla; arg=\n" | 707 "X-Malformed2: bla; arg=\n" |
673 L"X-Test: bla; arg1=val1; arg2=val2"; | 708 "X-Test: bla; arg1=val1; arg2=val2"; |
674 | 709 |
675 TEST(NetUtilTest, GetSpecificHeader) { | 710 TEST(NetUtilTest, GetSpecificHeader) { |
676 const HeaderCase tests[] = { | 711 const HeaderCase tests[] = { |
677 {L"content-type", L"text/html; charset=utf-8"}, | 712 {"content-type", "text/html; charset=utf-8"}, |
678 {L"CONTENT-LENGTH", L"378557"}, | 713 {"CONTENT-LENGTH", "378557"}, |
679 {L"Date", L"Mon, 13 Nov 2006 21:38:09 GMT"}, | 714 {"Date", "Mon, 13 Nov 2006 21:38:09 GMT"}, |
680 {L"Bad-Header", L""}, | 715 {"Bad-Header", ""}, |
681 {L"", L""}, | 716 {"", ""}, |
682 }; | 717 }; |
683 | 718 |
684 // Test first with google_headers. | 719 // Test first with google_headers. |
685 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 720 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
686 std::wstring result = GetSpecificHeader(google_headers, | 721 std::string result = |
687 tests[i].header_name); | 722 GetSpecificHeader(google_headers, tests[i].header_name); |
688 EXPECT_EQ(result, tests[i].expected); | 723 EXPECT_EQ(result, tests[i].expected); |
689 } | 724 } |
690 | 725 |
691 // Test again with empty headers. | 726 // Test again with empty headers. |
692 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 727 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
693 std::wstring result = GetSpecificHeader(L"", tests[i].header_name); | 728 std::string result = GetSpecificHeader(std::string(), tests[i].header_name); |
694 EXPECT_EQ(result, std::wstring()); | 729 EXPECT_EQ(result, std::string()); |
695 } | 730 } |
696 } | 731 } |
697 | 732 |
698 TEST(NetUtilTest, GetHeaderParamValue) { | 733 TEST(NetUtilTest, GetHeaderParamValue) { |
699 const HeaderParamCase tests[] = { | 734 const HeaderParamCase tests[] = { |
700 {L"Content-type", L"charset", L"utf-8"}, | 735 {"Content-type", "charset", "utf-8"}, |
701 {L"content-disposition", L"filename", L"download.pdf"}, | 736 {"content-disposition", "filename", "download.pdf"}, |
702 {L"Content-Type", L"badparam", L""}, | 737 {"Content-Type", "badparam", ""}, |
703 {L"X-Malformed", L"arg", L"test\""}, | 738 {"X-Malformed", "arg", "test\""}, |
704 {L"X-Malformed2", L"arg", L""}, | 739 {"X-Malformed2", "arg", ""}, |
705 {L"X-Test", L"arg1", L"val1"}, | 740 {"X-Test", "arg1", "val1"}, |
706 {L"X-Test", L"arg2", L"val2"}, | 741 {"X-Test", "arg2", "val2"}, |
707 {L"Bad-Header", L"badparam", L""}, | 742 {"Bad-Header", "badparam", ""}, |
708 {L"Bad-Header", L"", L""}, | 743 {"Bad-Header", "", ""}, |
709 {L"", L"badparam", L""}, | 744 {"", "badparam", ""}, |
710 {L"", L"", L""}, | 745 {"", "", ""}, |
711 }; | 746 }; |
712 // TODO(mpcomplete): add tests for other formats of headers. | 747 // TODO(mpcomplete): add tests for other formats of headers. |
713 | 748 |
714 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 749 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
715 std::wstring header_value = | 750 std::string header_value = |
716 GetSpecificHeader(google_headers, tests[i].header_name); | 751 GetSpecificHeader(google_headers, tests[i].header_name); |
717 std::wstring result = | 752 std::string result = |
718 GetHeaderParamValue(header_value, tests[i].param_name, | 753 GetHeaderParamValue(header_value, tests[i].param_name, |
719 QuoteRule::REMOVE_OUTER_QUOTES); | 754 QuoteRule::REMOVE_OUTER_QUOTES); |
720 EXPECT_EQ(result, tests[i].expected); | 755 EXPECT_EQ(result, tests[i].expected); |
721 } | 756 } |
722 | 757 |
723 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 758 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
724 std::wstring header_value = | 759 std::string header_value = |
725 GetSpecificHeader(L"", tests[i].header_name); | 760 GetSpecificHeader(std::string(), tests[i].header_name); |
726 std::wstring result = | 761 std::string result = |
727 GetHeaderParamValue(header_value, tests[i].param_name, | 762 GetHeaderParamValue(header_value, tests[i].param_name, |
728 QuoteRule::REMOVE_OUTER_QUOTES); | 763 QuoteRule::REMOVE_OUTER_QUOTES); |
729 EXPECT_EQ(result, std::wstring()); | 764 EXPECT_EQ(result, std::string()); |
730 } | 765 } |
731 } | 766 } |
732 | 767 |
733 TEST(NetUtilTest, GetHeaderParamValueQuotes) { | 768 TEST(NetUtilTest, GetHeaderParamValueQuotes) { |
734 struct { | 769 struct { |
735 const char* header; | 770 const char* header; |
736 const char* expected_with_quotes; | 771 const char* expected_with_quotes; |
737 const char* expected_without_quotes; | 772 const char* expected_without_quotes; |
738 } tests[] = { | 773 } tests[] = { |
739 {"filename=foo", "foo", "foo"}, | 774 {"filename=foo", "foo", "foo"}, |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
934 << "Failed on input: " << tests[i].header_field; | 969 << "Failed on input: " << tests[i].header_field; |
935 } | 970 } |
936 } | 971 } |
937 | 972 |
938 TEST(NetUtilTest, IDNToUnicodeFast) { | 973 TEST(NetUtilTest, IDNToUnicodeFast) { |
939 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(idn_cases); i++) { | 974 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(idn_cases); i++) { |
940 for (size_t j = 0; j < arraysize(kLanguages); j++) { | 975 for (size_t j = 0; j < arraysize(kLanguages); j++) { |
941 // ja || zh-TW,en || ko,ja -> IDNToUnicodeSlow | 976 // ja || zh-TW,en || ko,ja -> IDNToUnicodeSlow |
942 if (j == 3 || j == 17 || j == 18) | 977 if (j == 3 || j == 17 || j == 18) |
943 continue; | 978 continue; |
944 std::wstring output(IDNToUnicode(idn_cases[i].input, | 979 string16 output(IDNToUnicode(idn_cases[i].input, kLanguages[j])); |
945 strlen(idn_cases[i].input), kLanguages[j], NULL)); | 980 string16 expected(idn_cases[i].unicode_allowed[j] ? |
946 std::wstring expected(idn_cases[i].unicode_allowed[j] ? | 981 WideToUTF16(idn_cases[i].unicode_output) : |
947 idn_cases[i].unicode_output : ASCIIToWide(idn_cases[i].input)); | 982 ASCIIToUTF16(idn_cases[i].input)); |
948 AppendLanguagesToOutputs(kLanguages[j], &expected, &output); | 983 AppendLanguagesToOutputs(kLanguages[j], &expected, &output); |
949 EXPECT_EQ(expected, output); | 984 EXPECT_EQ(expected, output); |
950 } | 985 } |
951 } | 986 } |
952 } | 987 } |
953 | 988 |
954 TEST(NetUtilTest, IDNToUnicodeSlow) { | 989 TEST(NetUtilTest, IDNToUnicodeSlow) { |
955 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(idn_cases); i++) { | 990 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(idn_cases); i++) { |
956 for (size_t j = 0; j < arraysize(kLanguages); j++) { | 991 for (size_t j = 0; j < arraysize(kLanguages); j++) { |
957 // !(ja || zh-TW,en || ko,ja) -> IDNToUnicodeFast | 992 // !(ja || zh-TW,en || ko,ja) -> IDNToUnicodeFast |
958 if (!(j == 3 || j == 17 || j == 18)) | 993 if (!(j == 3 || j == 17 || j == 18)) |
959 continue; | 994 continue; |
960 std::wstring output(IDNToUnicode(idn_cases[i].input, | 995 string16 output(IDNToUnicode(idn_cases[i].input, kLanguages[j])); |
961 strlen(idn_cases[i].input), kLanguages[j], NULL)); | 996 string16 expected(idn_cases[i].unicode_allowed[j] ? |
962 std::wstring expected(idn_cases[i].unicode_allowed[j] ? | 997 WideToUTF16(idn_cases[i].unicode_output) : |
963 idn_cases[i].unicode_output : ASCIIToWide(idn_cases[i].input)); | 998 ASCIIToUTF16(idn_cases[i].input)); |
964 AppendLanguagesToOutputs(kLanguages[j], &expected, &output); | 999 AppendLanguagesToOutputs(kLanguages[j], &expected, &output); |
965 EXPECT_EQ(expected, output); | 1000 EXPECT_EQ(expected, output); |
966 } | 1001 } |
967 } | 1002 } |
968 } | 1003 } |
969 | 1004 |
970 TEST(NetUtilTest, IDNToUnicodeAdjustOffset) { | |
971 const AdjustOffsetCase adjust_cases[] = { | |
972 {0, 0}, | |
973 {2, 2}, | |
974 {4, 4}, | |
975 {5, 5}, | |
976 {6, string16::npos}, | |
977 {16, string16::npos}, | |
978 {17, 7}, | |
979 {18, 8}, | |
980 {19, string16::npos}, | |
981 {25, string16::npos}, | |
982 {34, 12}, | |
983 {35, 13}, | |
984 {38, 16}, | |
985 {39, string16::npos}, | |
986 {string16::npos, string16::npos}, | |
987 }; | |
988 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(adjust_cases); ++i) { | |
989 size_t offset = adjust_cases[i].input_offset; | |
990 // "test.\x89c6\x9891.\x5317\x4eac\x5927\x5b78.test" | |
991 IDNToUnicode("test.xn--cy2a840a.xn--1lq90ic7f1rc.test", 39, L"zh-CN", | |
992 &offset); | |
993 EXPECT_EQ(adjust_cases[i].output_offset, offset); | |
994 } | |
995 | |
996 std::vector<size_t> offsets; | |
997 for (size_t i = 0; i < 40; ++i) | |
998 offsets.push_back(i); | |
999 IDNToUnicodeWithOffsets("test.xn--cy2a840a.xn--1lq90ic7f1rc.test", 39, | |
1000 L"zh-CN", &offsets); | |
1001 size_t expected[] = {0, 1, 2, 3, 4, 5, kNpos, kNpos, kNpos, kNpos, kNpos, | |
1002 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 7, 8, kNpos, | |
1003 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, | |
1004 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 12, 13, 14, 15, | |
1005 16, kNpos}; | |
1006 ASSERT_EQ(40U, arraysize(expected)); | |
1007 for (size_t i = 0; i < 40; ++i) | |
1008 EXPECT_EQ(expected[i], offsets[i]); | |
1009 } | |
1010 | |
1011 TEST(NetUtilTest, CompliantHost) { | 1005 TEST(NetUtilTest, CompliantHost) { |
1012 const CompliantHostCase compliant_host_cases[] = { | 1006 const CompliantHostCase compliant_host_cases[] = { |
1013 {"", "", false}, | 1007 {"", "", false}, |
1014 {"a", "", true}, | 1008 {"a", "", true}, |
1015 {"-", "", false}, | 1009 {"-", "", false}, |
1016 {".", "", false}, | 1010 {".", "", false}, |
1017 {"9", "", false}, | 1011 {"9", "", false}, |
1018 {"9", "a", true}, | 1012 {"9", "a", true}, |
1019 {"9a", "", false}, | 1013 {"9a", "", false}, |
1020 {"9a", "a", true}, | 1014 {"9a", "a", true}, |
(...skipping 766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1787 EXPECT_FALSE(parsed.port.is_valid()); | 1781 EXPECT_FALSE(parsed.port.is_valid()); |
1788 EXPECT_TRUE(parsed.path.is_valid()); | 1782 EXPECT_TRUE(parsed.path.is_valid()); |
1789 EXPECT_FALSE(parsed.query.is_valid()); | 1783 EXPECT_FALSE(parsed.query.is_valid()); |
1790 EXPECT_FALSE(parsed.ref.is_valid()); | 1784 EXPECT_FALSE(parsed.ref.is_valid()); |
1791 EXPECT_EQ(WideToUTF16(L"f"), | 1785 EXPECT_EQ(WideToUTF16(L"f"), |
1792 formatted.substr(parsed.host.begin, parsed.host.len)); | 1786 formatted.substr(parsed.host.begin, parsed.host.len)); |
1793 EXPECT_EQ(WideToUTF16(L"/"), | 1787 EXPECT_EQ(WideToUTF16(L"/"), |
1794 formatted.substr(parsed.path.begin, parsed.path.len)); | 1788 formatted.substr(parsed.path.begin, parsed.path.len)); |
1795 } | 1789 } |
1796 | 1790 |
1797 TEST(NetUtilTest, FormatUrlAdjustOffset) { | 1791 TEST(NetUtilTest, FormatUrlWithOffsets) { |
| 1792 const AdjustOffsetCase null_cases[] = { |
| 1793 {0, string16::npos}, |
| 1794 }; |
| 1795 CheckAdjustedOffsets(std::string(), "en", kFormatUrlOmitNothing, |
| 1796 UnescapeRule::NORMAL, null_cases, arraysize(null_cases), NULL); |
| 1797 |
1798 const AdjustOffsetCase basic_cases[] = { | 1798 const AdjustOffsetCase basic_cases[] = { |
1799 {0, 0}, | 1799 {0, 0}, |
1800 {3, 3}, | 1800 {3, 3}, |
1801 {5, 5}, | 1801 {5, 5}, |
1802 {6, 6}, | 1802 {6, 6}, |
1803 {13, 13}, | 1803 {13, 13}, |
1804 {21, 21}, | 1804 {21, 21}, |
1805 {22, 22}, | 1805 {22, 22}, |
1806 {23, 23}, | 1806 {23, 23}, |
1807 {25, 25}, | 1807 {25, 25}, |
1808 {26, string16::npos}, | 1808 {26, string16::npos}, |
1809 {500000, string16::npos}, | 1809 {500000, string16::npos}, |
1810 {string16::npos, string16::npos}, | 1810 {string16::npos, string16::npos}, |
1811 }; | 1811 }; |
1812 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(basic_cases); ++i) { | 1812 const size_t basic_offsets[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, |
1813 size_t offset = basic_cases[i].input_offset; | 1813 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25}; |
1814 FormatUrl(GURL("http://www.google.com/foo/"), "en", | 1814 CheckAdjustedOffsets("http://www.google.com/foo/", "en", |
1815 kFormatUrlOmitUsernamePassword, UnescapeRule::NORMAL, | 1815 kFormatUrlOmitNothing, UnescapeRule::NORMAL, basic_cases, |
1816 NULL, NULL, &offset); | 1816 arraysize(basic_cases), basic_offsets); |
1817 EXPECT_EQ(basic_cases[i].output_offset, offset); | |
1818 } | |
1819 | 1817 |
1820 size_t url_size = 26; | 1818 const AdjustOffsetCase omit_auth_cases_1[] = { |
1821 std::vector<size_t> offsets; | 1819 {6, 6}, |
1822 for (size_t i = 0; i < url_size + 1; ++i) | 1820 {7, string16::npos}, |
1823 offsets.push_back(i); | 1821 {8, string16::npos}, |
1824 FormatUrlWithOffsets(GURL("http://www.google.com/foo/"), "en", | 1822 {10, string16::npos}, |
1825 kFormatUrlOmitUsernamePassword, UnescapeRule::NORMAL, | 1823 {12, string16::npos}, |
1826 NULL, NULL, &offsets); | 1824 {14, string16::npos}, |
1827 for (size_t i = 0; i < url_size; ++i) | 1825 {15, 7}, |
1828 EXPECT_EQ(i, offsets[i]); | 1826 {25, 17}, |
1829 EXPECT_EQ(kNpos, offsets[url_size]); | 1827 }; |
| 1828 const size_t omit_auth_offsets_1[] = {0, 1, 2, 3, 4, 5, 6, kNpos, kNpos, |
| 1829 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 7, 8, 9, 10, 11, 12, 13, 14, 15, |
| 1830 16, 17, 18, 19, 20, 21}; |
| 1831 CheckAdjustedOffsets("http://foo:bar@www.google.com/", "en", |
| 1832 kFormatUrlOmitUsernamePassword, UnescapeRule::NORMAL, omit_auth_cases_1, |
| 1833 arraysize(omit_auth_cases_1), omit_auth_offsets_1); |
1830 | 1834 |
1831 const struct { | 1835 const AdjustOffsetCase omit_auth_cases_2[] = { |
1832 const char* input_url; | 1836 {9, string16::npos}, |
1833 size_t input_offset; | 1837 {11, 7}, |
1834 size_t output_offset; | |
1835 } omit_auth_cases[] = { | |
1836 {"http://foo:bar@www.google.com/", 6, 6}, | |
1837 {"http://foo:bar@www.google.com/", 7, string16::npos}, | |
1838 {"http://foo:bar@www.google.com/", 8, string16::npos}, | |
1839 {"http://foo:bar@www.google.com/", 10, string16::npos}, | |
1840 {"http://foo:bar@www.google.com/", 11, string16::npos}, | |
1841 {"http://foo:bar@www.google.com/", 14, string16::npos}, | |
1842 {"http://foo:bar@www.google.com/", 15, 7}, | |
1843 {"http://foo:bar@www.google.com/", 25, 17}, | |
1844 {"http://foo@www.google.com/", 9, string16::npos}, | |
1845 {"http://foo@www.google.com/", 11, 7}, | |
1846 }; | 1838 }; |
1847 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(omit_auth_cases); ++i) { | 1839 const size_t omit_auth_offsets_2[] = {0, 1, 2, 3, 4, 5, 6, kNpos, kNpos, |
1848 size_t offset = omit_auth_cases[i].input_offset; | 1840 kNpos, kNpos, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21}; |
1849 FormatUrl(GURL(omit_auth_cases[i].input_url), "en", | 1841 CheckAdjustedOffsets("http://foo@www.google.com/", "en", |
1850 kFormatUrlOmitUsernamePassword, UnescapeRule::NORMAL, | 1842 kFormatUrlOmitUsernamePassword, UnescapeRule::NORMAL, omit_auth_cases_2, |
1851 NULL, NULL, &offset); | 1843 arraysize(omit_auth_cases_2), omit_auth_offsets_2); |
1852 EXPECT_EQ(omit_auth_cases[i].output_offset, offset); | |
1853 } | |
1854 | 1844 |
1855 url_size = 30; | 1845 // "http://foo\x30B0:\x30B0bar@www.google.com" |
1856 offsets.clear(); | 1846 const AdjustOffsetCase dont_omit_auth_cases[] = { |
1857 for (size_t i = 0; i < url_size; ++i) | 1847 {0, 0}, |
1858 offsets.push_back(i); | 1848 /*{3, string16::npos}, |
1859 FormatUrlWithOffsets(GURL("http://foo:bar@www.google.com/"), "en", | 1849 {7, 0}, |
1860 kFormatUrlOmitUsernamePassword, UnescapeRule::NORMAL, | 1850 {11, 4}, |
1861 NULL, NULL, &offsets); | 1851 {12, string16::npos}, |
1862 for (size_t i = 0; i < 7; ++i) | 1852 {20, 5}, |
1863 EXPECT_EQ(i, offsets[i]); | 1853 {24, 9},*/ |
1864 for (size_t i = 7; i < 15; ++i) | 1854 }; |
1865 EXPECT_EQ(kNpos, offsets[i]); | 1855 const size_t dont_omit_auth_offsets[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, |
1866 for (size_t i = 16; i < url_size; ++i) | 1856 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 11, 12, kNpos, |
1867 EXPECT_EQ(i - 8 , offsets[i]); | 1857 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 13, 14, 15, 16, 17, 18, |
| 1858 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; |
| 1859 CheckAdjustedOffsets("http://foo%E3%82%B0:%E3%82%B0bar@www.google.com/", "en", |
| 1860 kFormatUrlOmitNothing, UnescapeRule::NORMAL, dont_omit_auth_cases, |
| 1861 arraysize(dont_omit_auth_cases), dont_omit_auth_offsets); |
1868 | 1862 |
1869 const AdjustOffsetCase view_source_cases[] = { | 1863 const AdjustOffsetCase view_source_cases[] = { |
1870 {0, 0}, | 1864 {0, 0}, |
1871 {3, 3}, | 1865 {3, 3}, |
1872 {11, 11}, | 1866 {11, 11}, |
1873 {12, 12}, | 1867 {12, 12}, |
1874 {13, 13}, | 1868 {13, 13}, |
1875 {18, 18}, | 1869 {18, 18}, |
1876 {19, string16::npos}, | 1870 {19, string16::npos}, |
1877 {20, string16::npos}, | 1871 {20, string16::npos}, |
1878 {23, 19}, | 1872 {23, 19}, |
1879 {26, 22}, | 1873 {26, 22}, |
1880 {string16::npos, string16::npos}, | 1874 {string16::npos, string16::npos}, |
1881 }; | 1875 }; |
1882 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(view_source_cases); ++i) { | 1876 const size_t view_source_offsets[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, |
1883 size_t offset = view_source_cases[i].input_offset; | 1877 12, 13, 14, 15, 16, 17, 18, kNpos, kNpos, kNpos, kNpos, 19, 20, 21, 22, |
1884 FormatUrl(GURL("view-source:http://foo@www.google.com/"), "en", | 1878 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33}; |
1885 kFormatUrlOmitUsernamePassword, UnescapeRule::NORMAL, | 1879 CheckAdjustedOffsets("view-source:http://foo@www.google.com/", "en", |
1886 NULL, NULL, &offset); | 1880 kFormatUrlOmitUsernamePassword, UnescapeRule::NORMAL, view_source_cases, |
1887 EXPECT_EQ(view_source_cases[i].output_offset, offset); | 1881 arraysize(view_source_cases), view_source_offsets); |
1888 } | |
1889 | 1882 |
1890 url_size = 38; | 1883 // "http://\x671d\x65e5\x3042\x3055\x3072.jp/foo/" |
1891 offsets.clear(); | 1884 const AdjustOffsetCase idn_hostname_cases_1[] = { |
1892 for (size_t i = 0; i < url_size; ++i) | |
1893 offsets.push_back(i); | |
1894 FormatUrlWithOffsets(GURL("view-source:http://foo@www.google.com/"), "en", | |
1895 kFormatUrlOmitUsernamePassword, UnescapeRule::NORMAL, | |
1896 NULL, NULL, &offsets); | |
1897 size_t expected[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, | |
1898 17, 18, kNpos, kNpos, kNpos, kNpos, 19, 20, 21, 22, 23, | |
1899 24, 25, 26, 27, 28, 29, 30, 31, 32, 33}; | |
1900 ASSERT_EQ(url_size, arraysize(expected)); | |
1901 for (size_t i = 0; i < url_size; ++i) | |
1902 EXPECT_EQ(expected[i], offsets[i]); | |
1903 | |
1904 const AdjustOffsetCase idn_hostname_cases[] = { | |
1905 {8, string16::npos}, | 1885 {8, string16::npos}, |
1906 {16, string16::npos}, | 1886 {16, string16::npos}, |
1907 {24, string16::npos}, | 1887 {24, string16::npos}, |
1908 {25, 12}, | 1888 {25, 12}, |
1909 {30, 17}, | 1889 {30, 17}, |
1910 }; | 1890 }; |
1911 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(idn_hostname_cases); ++i) { | 1891 const size_t idn_hostname_offsets_1[] = {0, 1, 2, 3, 4, 5, 6, 7, kNpos, kNpos, |
1912 size_t offset = idn_hostname_cases[i].input_offset; | 1892 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, |
1913 // "http://\x671d\x65e5\x3042\x3055\x3072.jp/foo/" | 1893 kNpos, kNpos, kNpos, kNpos, kNpos, 12, 13, 14, 15, 16, 17, 18, 19}; |
1914 FormatUrl(GURL("http://xn--l8jvb1ey91xtjb.jp/foo/"), "ja", | 1894 CheckAdjustedOffsets("http://xn--l8jvb1ey91xtjb.jp/foo/", "ja", |
1915 kFormatUrlOmitUsernamePassword, UnescapeRule::NORMAL, | 1895 kFormatUrlOmitNothing, UnescapeRule::NORMAL, idn_hostname_cases_1, |
1916 NULL, NULL, &offset); | 1896 arraysize(idn_hostname_cases_1), idn_hostname_offsets_1); |
1917 EXPECT_EQ(idn_hostname_cases[i].output_offset, offset); | |
1918 } | |
1919 | 1897 |
1920 url_size = 33; | 1898 // "http://test.\x89c6\x9891.\x5317\x4eac\x5927\x5b78.test/" |
1921 offsets.clear(); | 1899 const AdjustOffsetCase idn_hostname_cases_2[] = { |
1922 for (size_t i = 0; i < url_size; ++i) | 1900 {7, 7}, |
1923 offsets.push_back(i); | 1901 {9, 9}, |
1924 FormatUrlWithOffsets(GURL("http://xn--l8jvb1ey91xtjb.jp/foo/"), "ja", | 1902 {11, 11}, |
1925 kFormatUrlOmitUsernamePassword, UnescapeRule::NORMAL, | 1903 {12, 12}, |
1926 NULL, NULL, &offsets); | 1904 {13, string16::npos}, |
1927 size_t expected_1[] = {0, 1, 2, 3, 4, 5, 6, 7, kNpos, kNpos, kNpos, kNpos, | 1905 {23, string16::npos}, |
1928 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, | 1906 {24, 14}, |
1929 kNpos, kNpos, kNpos, kNpos, kNpos, 12, 13, 14, 15, 16, | 1907 {25, 15}, |
1930 17, 18, 19}; | 1908 {26, string16::npos}, |
1931 ASSERT_EQ(url_size, arraysize(expected_1)); | 1909 {32, string16::npos}, |
1932 for (size_t i = 0; i < url_size; ++i) | 1910 {41, 19}, |
1933 EXPECT_EQ(expected_1[i], offsets[i]); | 1911 {42, 20}, |
| 1912 {45, 23}, |
| 1913 {46, 24}, |
| 1914 {47, string16::npos}, |
| 1915 {string16::npos, string16::npos}, |
| 1916 }; |
| 1917 const size_t idn_hostname_offsets_2[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, |
| 1918 12, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, |
| 1919 kNpos, 14, 15, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, |
| 1920 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 19, 20, 21, 22, 23, 24}; |
| 1921 CheckAdjustedOffsets("http://test.xn--cy2a840a.xn--1lq90ic7f1rc.test/", |
| 1922 "zh-CN", kFormatUrlOmitNothing, UnescapeRule::NORMAL, |
| 1923 idn_hostname_cases_2, arraysize(idn_hostname_cases_2), |
| 1924 idn_hostname_offsets_2); |
1934 | 1925 |
| 1926 // "http://www.google.com/foo bar/\x30B0\x30FC\x30B0\x30EB" |
1935 const AdjustOffsetCase unescape_cases[] = { | 1927 const AdjustOffsetCase unescape_cases[] = { |
1936 {25, 25}, | 1928 {25, 25}, |
1937 {26, string16::npos}, | 1929 {26, string16::npos}, |
1938 {27, string16::npos}, | 1930 {27, string16::npos}, |
1939 {28, 26}, | 1931 {28, 26}, |
1940 {35, string16::npos}, | 1932 {35, string16::npos}, |
1941 {41, 31}, | 1933 {41, 31}, |
1942 {59, 33}, | 1934 {59, 33}, |
1943 {60, string16::npos}, | 1935 {60, string16::npos}, |
1944 {67, string16::npos}, | 1936 {67, string16::npos}, |
1945 {68, string16::npos}, | 1937 {68, string16::npos}, |
1946 }; | 1938 }; |
1947 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(unescape_cases); ++i) { | 1939 const size_t unescape_offsets[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, |
1948 size_t offset = unescape_cases[i].input_offset; | 1940 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, kNpos, kNpos, 26, 27, |
1949 // "http://www.google.com/foo bar/\x30B0\x30FC\x30B0\x30EB" | 1941 28, 29, 30, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 31, |
1950 FormatUrl(GURL( | 1942 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 32, kNpos, kNpos, |
1951 "http://www.google.com/foo%20bar/%E3%82%B0%E3%83%BC%E3%82%B0%E3%83%AB"), | 1943 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 33, kNpos, kNpos, kNpos, kNpos, |
1952 "en", kFormatUrlOmitUsernamePassword, UnescapeRule::SPACES, NULL, | 1944 kNpos, kNpos, kNpos, kNpos}; |
1953 NULL, &offset); | 1945 CheckAdjustedOffsets( |
1954 EXPECT_EQ(unescape_cases[i].output_offset, offset); | 1946 "http://www.google.com/foo%20bar/%E3%82%B0%E3%83%BC%E3%82%B0%E3%83%AB", |
1955 } | 1947 "en", kFormatUrlOmitNothing, UnescapeRule::SPACES, unescape_cases, |
| 1948 arraysize(unescape_cases), unescape_offsets); |
1956 | 1949 |
1957 url_size = 68; | 1950 // "http://www.google.com/foo.html#\x30B0\x30B0z" |
1958 offsets.clear(); | |
1959 for (size_t i = 0; i < url_size; ++i) | |
1960 offsets.push_back(i); | |
1961 FormatUrlWithOffsets(GURL( | |
1962 "http://www.google.com/foo%20bar/%E3%82%B0%E3%83%BC%E3%82%B0%E3%83%AB"), | |
1963 "en", kFormatUrlOmitUsernamePassword, UnescapeRule::SPACES, NULL, NULL, | |
1964 &offsets); | |
1965 size_t expected_2[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, | |
1966 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, kNpos, kNpos, | |
1967 26, 27, 28, 29, 30, kNpos, kNpos, kNpos, kNpos, kNpos, | |
1968 kNpos, kNpos, kNpos, 31, kNpos, kNpos, kNpos, kNpos, | |
1969 kNpos, kNpos, kNpos, kNpos, 32, kNpos, kNpos, kNpos, | |
1970 kNpos, kNpos, kNpos, kNpos, kNpos, 33, kNpos, kNpos, | |
1971 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos}; | |
1972 ASSERT_EQ(url_size, arraysize(expected_2)); | |
1973 for (size_t i = 0; i < url_size; ++i) | |
1974 EXPECT_EQ(expected_2[i], offsets[i]); | |
1975 | |
1976 const AdjustOffsetCase ref_cases[] = { | 1951 const AdjustOffsetCase ref_cases[] = { |
1977 {30, 30}, | 1952 {30, 30}, |
1978 {31, 31}, | 1953 {31, 31}, |
1979 {32, string16::npos}, | 1954 {32, string16::npos}, |
1980 {34, 32}, | 1955 {34, 32}, |
1981 {35, string16::npos}, | 1956 {35, string16::npos}, |
1982 {37, 33}, | 1957 {37, 33}, |
1983 {38, string16::npos}, | 1958 {38, string16::npos}, |
1984 }; | 1959 }; |
1985 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(ref_cases); ++i) { | 1960 const size_t ref_offsets[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, |
1986 size_t offset = ref_cases[i].input_offset; | 1961 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, |
1987 // "http://www.google.com/foo.html#\x30B0\x30B0z" | 1962 kNpos, kNpos, 32, kNpos, kNpos, 33}; |
1988 FormatUrl(GURL( | 1963 CheckAdjustedOffsets( |
1989 "http://www.google.com/foo.html#\xE3\x82\xB0\xE3\x82\xB0z"), "en", | 1964 "http://www.google.com/foo.html#\xE3\x82\xB0\xE3\x82\xB0z", "en", |
1990 kFormatUrlOmitUsernamePassword, UnescapeRule::NORMAL, NULL, NULL, | 1965 kFormatUrlOmitNothing, UnescapeRule::NORMAL, ref_cases, |
1991 &offset); | 1966 arraysize(ref_cases), ref_offsets); |
1992 EXPECT_EQ(ref_cases[i].output_offset, offset); | |
1993 } | |
1994 | |
1995 url_size = 38; | |
1996 offsets.clear(); | |
1997 for (size_t i = 0; i < url_size; ++i) | |
1998 offsets.push_back(i); | |
1999 // "http://www.google.com/foo.html#\x30B0\x30B0z" | |
2000 FormatUrlWithOffsets(GURL( | |
2001 "http://www.google.com/foo.html#\xE3\x82\xB0\xE3\x82\xB0z"), "en", | |
2002 kFormatUrlOmitUsernamePassword, UnescapeRule::NORMAL, NULL, NULL, | |
2003 &offsets); | |
2004 size_t expected_3[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, | |
2005 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, | |
2006 30, 31, kNpos, kNpos, 32, kNpos, kNpos, 33}; | |
2007 ASSERT_EQ(url_size, arraysize(expected_3)); | |
2008 for (size_t i = 0; i < url_size; ++i) | |
2009 EXPECT_EQ(expected_3[i], offsets[i]); | |
2010 | 1967 |
2011 const AdjustOffsetCase omit_http_cases[] = { | 1968 const AdjustOffsetCase omit_http_cases[] = { |
2012 {0, string16::npos}, | 1969 {0, string16::npos}, |
2013 {3, string16::npos}, | 1970 {3, string16::npos}, |
2014 {7, 0}, | 1971 {7, 0}, |
2015 {8, 1}, | 1972 {8, 1}, |
2016 }; | 1973 }; |
2017 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(omit_http_cases); ++i) { | 1974 const size_t omit_http_offsets[] = {kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, |
2018 size_t offset = omit_http_cases[i].input_offset; | 1975 kNpos, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; |
2019 FormatUrl(GURL("http://www.google.com"), "en", | 1976 CheckAdjustedOffsets("http://www.google.com/", "en", |
2020 kFormatUrlOmitHTTP, UnescapeRule::NORMAL, NULL, NULL, &offset); | 1977 kFormatUrlOmitHTTP, UnescapeRule::NORMAL, omit_http_cases, |
2021 EXPECT_EQ(omit_http_cases[i].output_offset, offset); | 1978 arraysize(omit_http_cases), omit_http_offsets); |
2022 } | |
2023 | 1979 |
2024 url_size = 23; | 1980 const AdjustOffsetCase omit_http_start_with_ftp_cases[] = { |
2025 offsets.clear(); | |
2026 for (size_t i = 0; i < url_size; ++i) | |
2027 offsets.push_back(i); | |
2028 FormatUrlWithOffsets(GURL("http://www.google.com"), "en", | |
2029 kFormatUrlOmitHTTP, UnescapeRule::NORMAL, NULL, NULL, &offsets); | |
2030 size_t expected_4[] = {kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 0, 1, | |
2031 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, kNpos}; | |
2032 ASSERT_EQ(url_size, arraysize(expected_4)); | |
2033 for (size_t i = 0; i < url_size; ++i) | |
2034 EXPECT_EQ(expected_4[i], offsets[i]); | |
2035 | |
2036 const AdjustOffsetCase omit_http_start_with_ftp[] = { | |
2037 {0, 0}, | 1981 {0, 0}, |
2038 {3, 3}, | 1982 {3, 3}, |
2039 {8, 8}, | 1983 {8, 8}, |
2040 }; | 1984 }; |
2041 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(omit_http_start_with_ftp); ++i) { | 1985 const size_t omit_http_start_with_ftp_offsets[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, |
2042 size_t offset = omit_http_start_with_ftp[i].input_offset; | 1986 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21}; |
2043 FormatUrl(GURL("http://ftp.google.com"), "en", | 1987 CheckAdjustedOffsets("http://ftp.google.com/", "en", kFormatUrlOmitHTTP, |
2044 kFormatUrlOmitHTTP, UnescapeRule::NORMAL, NULL, NULL, &offset); | 1988 UnescapeRule::NORMAL, omit_http_start_with_ftp_cases, |
2045 EXPECT_EQ(omit_http_start_with_ftp[i].output_offset, offset); | 1989 arraysize(omit_http_start_with_ftp_cases), |
2046 } | 1990 omit_http_start_with_ftp_offsets); |
2047 | |
2048 url_size = 23; | |
2049 offsets.clear(); | |
2050 for (size_t i = 0; i < url_size; ++i) | |
2051 offsets.push_back(i); | |
2052 FormatUrlWithOffsets(GURL("http://ftp.google.com"), "en", | |
2053 kFormatUrlOmitHTTP, UnescapeRule::NORMAL, NULL, NULL, &offsets); | |
2054 size_t expected_5[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, | |
2055 16, 17, 18, 19, 20, 21, kNpos}; | |
2056 ASSERT_EQ(url_size, arraysize(expected_5)); | |
2057 for (size_t i = 0; i < url_size; ++i) | |
2058 EXPECT_EQ(expected_5[i], offsets[i]); | |
2059 | 1991 |
2060 const AdjustOffsetCase omit_all_cases[] = { | 1992 const AdjustOffsetCase omit_all_cases[] = { |
2061 {12, 0}, | 1993 {12, 0}, |
2062 {13, 1}, | 1994 {13, 1}, |
2063 {0, string16::npos}, | 1995 {0, string16::npos}, |
2064 {3, string16::npos}, | 1996 {3, string16::npos}, |
2065 }; | 1997 }; |
2066 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(omit_all_cases); ++i) { | 1998 const size_t omit_all_offsets[] = {kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, |
2067 size_t offset = omit_all_cases[i].input_offset; | 1999 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 0, 1, 2, 3, 4, 5, 6, kNpos}; |
2068 FormatUrl(GURL("http://user@foo.com/"), "en", kFormatUrlOmitAll, | 2000 CheckAdjustedOffsets("http://user@foo.com/", "en", kFormatUrlOmitAll, |
2069 UnescapeRule::NORMAL, NULL, NULL, &offset); | 2001 UnescapeRule::NORMAL, omit_all_cases, |
2070 EXPECT_EQ(omit_all_cases[i].output_offset, offset); | 2002 arraysize(omit_all_cases), omit_all_offsets); |
2071 } | |
2072 | |
2073 url_size = 21; | |
2074 offsets.clear(); | |
2075 for (size_t i = 0; i < url_size; ++i) | |
2076 offsets.push_back(i); | |
2077 FormatUrlWithOffsets(GURL("http://user@foo.com/"), "en", kFormatUrlOmitAll, | |
2078 UnescapeRule::NORMAL, NULL, NULL, &offsets); | |
2079 size_t expected_6[] = {kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, | |
2080 kNpos, kNpos, kNpos, kNpos, 0, 1, 2, 3, 4, 5, 6, 7, | |
2081 kNpos}; | |
2082 ASSERT_EQ(url_size, arraysize(expected_6)); | |
2083 for (size_t i = 0; i < url_size; ++i) | |
2084 EXPECT_EQ(expected_6[i], offsets[i]); | |
2085 } | 2003 } |
2086 | 2004 |
2087 TEST(NetUtilTest, SimplifyUrlForRequest) { | 2005 TEST(NetUtilTest, SimplifyUrlForRequest) { |
2088 struct { | 2006 struct { |
2089 const char* input_url; | 2007 const char* input_url; |
2090 const char* expected_simplified_url; | 2008 const char* expected_simplified_url; |
2091 } tests[] = { | 2009 } tests[] = { |
2092 { | 2010 { |
2093 // Reference section should be stripped. | 2011 // Reference section should be stripped. |
2094 "http://www.google.com:78/foobar?query=1#hash", | 2012 "http://www.google.com:78/foobar?query=1#hash", |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2360 for (size_t i = 0; i < it->address.size(); ++i) { | 2278 for (size_t i = 0; i < it->address.size(); ++i) { |
2361 if (it->address[i] != 0) { | 2279 if (it->address[i] != 0) { |
2362 all_zeroes = false; | 2280 all_zeroes = false; |
2363 break; | 2281 break; |
2364 } | 2282 } |
2365 } | 2283 } |
2366 EXPECT_FALSE(all_zeroes); | 2284 EXPECT_FALSE(all_zeroes); |
2367 } | 2285 } |
2368 } | 2286 } |
2369 | 2287 |
2370 TEST(NetUtilTest, AdjustComponentOffset) { | |
2371 std::vector<size_t> old_offsets; | |
2372 for (size_t i = 0; i < 10; ++i) | |
2373 old_offsets.push_back(i); | |
2374 std::vector<size_t> new_offsets; | |
2375 std::transform(old_offsets.begin(), | |
2376 old_offsets.end(), | |
2377 std::back_inserter(new_offsets), | |
2378 ClampComponentOffset(5)); | |
2379 size_t expected_1[] = {kNpos, kNpos, kNpos, kNpos, kNpos, 5, 6, 7, 8, 9}; | |
2380 EXPECT_EQ(new_offsets.size(), arraysize(expected_1)); | |
2381 EXPECT_EQ(new_offsets.size(), old_offsets.size()); | |
2382 for (size_t i = 0; i < arraysize(expected_1); ++i) | |
2383 EXPECT_EQ(expected_1[i], new_offsets[i]); | |
2384 } | |
2385 | |
2386 } // namespace net | 2288 } // namespace net |
OLD | NEW |