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); | |
461 } | 460 } |
462 | 461 |
463 // Helper to strignize an IP number (used to define expectations). | 462 // Helper to strignize an IP number (used to define expectations). |
464 std::string DumpIPNumber(const IPAddressNumber& v) { | 463 std::string DumpIPNumber(const IPAddressNumber& v) { |
465 std::string out; | 464 std::string out; |
466 for (size_t i = 0; i < v.size(); ++i) { | 465 for (size_t i = 0; i < v.size(); ++i) { |
467 if (i != 0) | 466 if (i != 0) |
468 out.append(","); | 467 out.append(","); |
469 out.append(base::IntToString(static_cast<int>(v[i]))); | 468 out.append(base::IntToString(static_cast<int>(v[i]))); |
470 } | 469 } |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 // Extract the unescaped identity. | 642 // Extract the unescaped identity. |
644 string16 username, password; | 643 string16 username, password; |
645 GetIdentityFromURL(url, &username, &password); | 644 GetIdentityFromURL(url, &username, &password); |
646 | 645 |
647 // Verify that it was decoded as UTF8. | 646 // Verify that it was decoded as UTF8. |
648 EXPECT_EQ(ASCIIToUTF16("foo"), username); | 647 EXPECT_EQ(ASCIIToUTF16("foo"), username); |
649 EXPECT_EQ(WideToUTF16(L"\x4f60\x597d"), password); | 648 EXPECT_EQ(WideToUTF16(L"\x4f60\x597d"), password); |
650 } | 649 } |
651 | 650 |
652 // Just a bunch of fake headers. | 651 // Just a bunch of fake headers. |
653 const wchar_t* google_headers = | 652 const char* google_headers = |
654 L"HTTP/1.1 200 OK\n" | 653 "HTTP/1.1 200 OK\n" |
655 L"Content-TYPE: text/html; charset=utf-8\n" | 654 "Content-TYPE: text/html; charset=utf-8\n" |
656 L"Content-disposition: attachment; filename=\"download.pdf\"\n" | 655 "Content-disposition: attachment; filename=\"download.pdf\"\n" |
657 L"Content-Length: 378557\n" | 656 "Content-Length: 378557\n" |
658 L"X-Google-Google1: 314159265\n" | 657 "X-Google-Google1: 314159265\n" |
659 L"X-Google-Google2: aaaa2:7783,bbb21:9441\n" | 658 "X-Google-Google2: aaaa2:7783,bbb21:9441\n" |
660 L"X-Google-Google4: home\n" | 659 "X-Google-Google4: home\n" |
661 L"Transfer-Encoding: chunked\n" | 660 "Transfer-Encoding: chunked\n" |
662 L"Set-Cookie: HEHE_AT=6666x66beef666x6-66xx6666x66; Path=/mail\n" | 661 "Set-Cookie: HEHE_AT=6666x66beef666x6-66xx6666x66; Path=/mail\n" |
663 L"Set-Cookie: HEHE_HELP=owned:0;Path=/\n" | 662 "Set-Cookie: HEHE_HELP=owned:0;Path=/\n" |
664 L"Set-Cookie: S=gmail=Xxx-beefbeefbeef_beefb:gmail_yj=beefbeef000beefbee" | 663 "Set-Cookie: S=gmail=Xxx-beefbeefbeef_beefb:gmail_yj=beefbeef000beefbee" |
665 L"fbee:gmproxy=bee-fbeefbe; Domain=.google.com; Path=/\n" | 664 "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" | 665 "X-Google-Google2: /one/two/three/four/five/six/seven-height/nine:9411\n" |
667 L"Server: GFE/1.3\n" | 666 "Server: GFE/1.3\n" |
668 L"Transfer-Encoding: chunked\n" | 667 "Transfer-Encoding: chunked\n" |
669 L"Date: Mon, 13 Nov 2006 21:38:09 GMT\n" | 668 "Date: Mon, 13 Nov 2006 21:38:09 GMT\n" |
670 L"Expires: Tue, 14 Nov 2006 19:23:58 GMT\n" | 669 "Expires: Tue, 14 Nov 2006 19:23:58 GMT\n" |
671 L"X-Malformed: bla; arg=test\"\n" | 670 "X-Malformed: bla; arg=test\"\n" |
672 L"X-Malformed2: bla; arg=\n" | 671 "X-Malformed2: bla; arg=\n" |
673 L"X-Test: bla; arg1=val1; arg2=val2"; | 672 "X-Test: bla; arg1=val1; arg2=val2"; |
674 | 673 |
675 TEST(NetUtilTest, GetSpecificHeader) { | 674 TEST(NetUtilTest, GetSpecificHeader) { |
676 const HeaderCase tests[] = { | 675 const HeaderCase tests[] = { |
677 {L"content-type", L"text/html; charset=utf-8"}, | 676 {"content-type", "text/html; charset=utf-8"}, |
678 {L"CONTENT-LENGTH", L"378557"}, | 677 {"CONTENT-LENGTH", "378557"}, |
679 {L"Date", L"Mon, 13 Nov 2006 21:38:09 GMT"}, | 678 {"Date", "Mon, 13 Nov 2006 21:38:09 GMT"}, |
680 {L"Bad-Header", L""}, | 679 {"Bad-Header", ""}, |
681 {L"", L""}, | 680 {"", ""}, |
682 }; | 681 }; |
683 | 682 |
684 // Test first with google_headers. | 683 // Test first with google_headers. |
685 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 684 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
686 std::wstring result = GetSpecificHeader(google_headers, | 685 std::string result = |
687 tests[i].header_name); | 686 GetSpecificHeader(google_headers, tests[i].header_name); |
688 EXPECT_EQ(result, tests[i].expected); | 687 EXPECT_EQ(result, tests[i].expected); |
689 } | 688 } |
690 | 689 |
691 // Test again with empty headers. | 690 // Test again with empty headers. |
692 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 691 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
693 std::wstring result = GetSpecificHeader(L"", tests[i].header_name); | 692 std::string result = GetSpecificHeader(std::string(), tests[i].header_name); |
694 EXPECT_EQ(result, std::wstring()); | 693 EXPECT_EQ(result, std::string()); |
695 } | 694 } |
696 } | 695 } |
697 | 696 |
698 TEST(NetUtilTest, GetHeaderParamValue) { | 697 TEST(NetUtilTest, GetHeaderParamValue) { |
699 const HeaderParamCase tests[] = { | 698 const HeaderParamCase tests[] = { |
700 {L"Content-type", L"charset", L"utf-8"}, | 699 {"Content-type", "charset", "utf-8"}, |
701 {L"content-disposition", L"filename", L"download.pdf"}, | 700 {"content-disposition", "filename", "download.pdf"}, |
702 {L"Content-Type", L"badparam", L""}, | 701 {"Content-Type", "badparam", ""}, |
703 {L"X-Malformed", L"arg", L"test\""}, | 702 {"X-Malformed", "arg", "test\""}, |
704 {L"X-Malformed2", L"arg", L""}, | 703 {"X-Malformed2", "arg", ""}, |
705 {L"X-Test", L"arg1", L"val1"}, | 704 {"X-Test", "arg1", "val1"}, |
706 {L"X-Test", L"arg2", L"val2"}, | 705 {"X-Test", "arg2", "val2"}, |
707 {L"Bad-Header", L"badparam", L""}, | 706 {"Bad-Header", "badparam", ""}, |
708 {L"Bad-Header", L"", L""}, | 707 {"Bad-Header", "", ""}, |
709 {L"", L"badparam", L""}, | 708 {"", "badparam", ""}, |
710 {L"", L"", L""}, | 709 {"", "", ""}, |
711 }; | 710 }; |
712 // TODO(mpcomplete): add tests for other formats of headers. | 711 // TODO(mpcomplete): add tests for other formats of headers. |
713 | 712 |
714 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 713 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
715 std::wstring header_value = | 714 std::string header_value = |
716 GetSpecificHeader(google_headers, tests[i].header_name); | 715 GetSpecificHeader(google_headers, tests[i].header_name); |
717 std::wstring result = | 716 std::string result = |
718 GetHeaderParamValue(header_value, tests[i].param_name, | 717 GetHeaderParamValue(header_value, tests[i].param_name, |
719 QuoteRule::REMOVE_OUTER_QUOTES); | 718 QuoteRule::REMOVE_OUTER_QUOTES); |
720 EXPECT_EQ(result, tests[i].expected); | 719 EXPECT_EQ(result, tests[i].expected); |
721 } | 720 } |
722 | 721 |
723 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { | 722 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { |
724 std::wstring header_value = | 723 std::string header_value = |
725 GetSpecificHeader(L"", tests[i].header_name); | 724 GetSpecificHeader(std::string(), tests[i].header_name); |
726 std::wstring result = | 725 std::string result = |
727 GetHeaderParamValue(header_value, tests[i].param_name, | 726 GetHeaderParamValue(header_value, tests[i].param_name, |
728 QuoteRule::REMOVE_OUTER_QUOTES); | 727 QuoteRule::REMOVE_OUTER_QUOTES); |
729 EXPECT_EQ(result, std::wstring()); | 728 EXPECT_EQ(result, std::string()); |
730 } | 729 } |
731 } | 730 } |
732 | 731 |
733 TEST(NetUtilTest, GetHeaderParamValueQuotes) { | 732 TEST(NetUtilTest, GetHeaderParamValueQuotes) { |
734 struct { | 733 struct { |
735 const char* header; | 734 const char* header; |
736 const char* expected_with_quotes; | 735 const char* expected_with_quotes; |
737 const char* expected_without_quotes; | 736 const char* expected_without_quotes; |
738 } tests[] = { | 737 } tests[] = { |
739 {"filename=foo", "foo", "foo"}, | 738 {"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; | 933 << "Failed on input: " << tests[i].header_field; |
935 } | 934 } |
936 } | 935 } |
937 | 936 |
938 TEST(NetUtilTest, IDNToUnicodeFast) { | 937 TEST(NetUtilTest, IDNToUnicodeFast) { |
939 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(idn_cases); i++) { | 938 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(idn_cases); i++) { |
940 for (size_t j = 0; j < arraysize(kLanguages); j++) { | 939 for (size_t j = 0; j < arraysize(kLanguages); j++) { |
941 // ja || zh-TW,en || ko,ja -> IDNToUnicodeSlow | 940 // ja || zh-TW,en || ko,ja -> IDNToUnicodeSlow |
942 if (j == 3 || j == 17 || j == 18) | 941 if (j == 3 || j == 17 || j == 18) |
943 continue; | 942 continue; |
944 std::wstring output(IDNToUnicode(idn_cases[i].input, | 943 string16 output(IDNToUnicode(idn_cases[i].input, |
945 strlen(idn_cases[i].input), kLanguages[j], NULL)); | 944 strlen(idn_cases[i].input), kLanguages[j])); |
946 std::wstring expected(idn_cases[i].unicode_allowed[j] ? | 945 string16 expected(idn_cases[i].unicode_allowed[j] ? |
947 idn_cases[i].unicode_output : ASCIIToWide(idn_cases[i].input)); | 946 WideToUTF16(idn_cases[i].unicode_output) : |
| 947 ASCIIToUTF16(idn_cases[i].input)); |
948 AppendLanguagesToOutputs(kLanguages[j], &expected, &output); | 948 AppendLanguagesToOutputs(kLanguages[j], &expected, &output); |
949 EXPECT_EQ(expected, output); | 949 EXPECT_EQ(expected, output); |
950 } | 950 } |
951 } | 951 } |
952 } | 952 } |
953 | 953 |
954 TEST(NetUtilTest, IDNToUnicodeSlow) { | 954 TEST(NetUtilTest, IDNToUnicodeSlow) { |
955 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(idn_cases); i++) { | 955 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(idn_cases); i++) { |
956 for (size_t j = 0; j < arraysize(kLanguages); j++) { | 956 for (size_t j = 0; j < arraysize(kLanguages); j++) { |
957 // !(ja || zh-TW,en || ko,ja) -> IDNToUnicodeFast | 957 // !(ja || zh-TW,en || ko,ja) -> IDNToUnicodeFast |
958 if (!(j == 3 || j == 17 || j == 18)) | 958 if (!(j == 3 || j == 17 || j == 18)) |
959 continue; | 959 continue; |
960 std::wstring output(IDNToUnicode(idn_cases[i].input, | 960 string16 output(IDNToUnicode(idn_cases[i].input, |
961 strlen(idn_cases[i].input), kLanguages[j], NULL)); | 961 strlen(idn_cases[i].input), kLanguages[j])); |
962 std::wstring expected(idn_cases[i].unicode_allowed[j] ? | 962 string16 expected(idn_cases[i].unicode_allowed[j] ? |
963 idn_cases[i].unicode_output : ASCIIToWide(idn_cases[i].input)); | 963 WideToUTF16(idn_cases[i].unicode_output) : |
| 964 ASCIIToUTF16(idn_cases[i].input)); |
964 AppendLanguagesToOutputs(kLanguages[j], &expected, &output); | 965 AppendLanguagesToOutputs(kLanguages[j], &expected, &output); |
965 EXPECT_EQ(expected, output); | 966 EXPECT_EQ(expected, output); |
966 } | 967 } |
967 } | 968 } |
968 } | 969 } |
969 | 970 |
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) { | 971 TEST(NetUtilTest, CompliantHost) { |
1012 const CompliantHostCase compliant_host_cases[] = { | 972 const CompliantHostCase compliant_host_cases[] = { |
1013 {"", "", false}, | 973 {"", "", false}, |
1014 {"a", "", true}, | 974 {"a", "", true}, |
1015 {"-", "", false}, | 975 {"-", "", false}, |
1016 {".", "", false}, | 976 {".", "", false}, |
1017 {"9", "", false}, | 977 {"9", "", false}, |
1018 {"9", "a", true}, | 978 {"9", "a", true}, |
1019 {"9a", "", false}, | 979 {"9a", "", false}, |
1020 {"9a", "a", true}, | 980 {"9a", "a", true}, |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1242 std::wstring default_name = test_cases[i].default_filename; | 1202 std::wstring default_name = test_cases[i].default_filename; |
1243 string16 filename = GetSuggestedFilename( | 1203 string16 filename = GetSuggestedFilename( |
1244 GURL(test_cases[i].url), test_cases[i].content_disp_header, | 1204 GURL(test_cases[i].url), test_cases[i].content_disp_header, |
1245 test_cases[i].referrer_charset, WideToUTF16(default_name)); | 1205 test_cases[i].referrer_charset, WideToUTF16(default_name)); |
1246 EXPECT_EQ(std::wstring(test_cases[i].expected_filename), | 1206 EXPECT_EQ(std::wstring(test_cases[i].expected_filename), |
1247 UTF16ToWide(filename)) | 1207 UTF16ToWide(filename)) |
1248 << "Iteration " << i << ": " << test_cases[i].url; | 1208 << "Iteration " << i << ": " << test_cases[i].url; |
1249 } | 1209 } |
1250 } | 1210 } |
1251 | 1211 |
| 1212 TEST(NetUtilTest, AppendFormattedHostAdjustOffset) { |
| 1213 const AdjustOffsetCase adjust_cases[] = { |
| 1214 {7, 7}, |
| 1215 {9, 9}, |
| 1216 {11, 11}, |
| 1217 {12, 12}, |
| 1218 {13, string16::npos}, |
| 1219 {23, string16::npos}, |
| 1220 {24, 14}, |
| 1221 {25, 15}, |
| 1222 {26, string16::npos}, |
| 1223 {32, string16::npos}, |
| 1224 {41, 19}, |
| 1225 {42, 20}, |
| 1226 {45, 23}, |
| 1227 {46, string16::npos}, |
| 1228 {string16::npos, string16::npos}, |
| 1229 }; |
| 1230 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(adjust_cases); ++i) { |
| 1231 size_t offset = adjust_cases[i].input_offset; |
| 1232 // "test.\x89c6\x9891.\x5317\x4eac\x5927\x5b78.test" |
| 1233 string16 output; |
| 1234 AppendFormattedHost(GURL("http://test.xn--cy2a840a.xn--1lq90ic7f1rc.test/"), |
| 1235 "zh-CN", &output, NULL, &offset); |
| 1236 EXPECT_EQ(adjust_cases[i].output_offset, offset); |
| 1237 } |
| 1238 |
| 1239 std::vector<size_t> offsets; |
| 1240 // 7 == "http://" |
| 1241 for (size_t i = 7; i < 47; ++i) |
| 1242 offsets.push_back(i); |
| 1243 string16 output; |
| 1244 AppendFormattedHostWithOffsets( |
| 1245 GURL("http://test.xn--cy2a840a.xn--1lq90ic7f1rc.test/"), "zh-CN", &output, |
| 1246 NULL, &offsets); |
| 1247 size_t expected[] = {7, 8, 9, 10, 11, 12, kNpos, kNpos, kNpos, kNpos, kNpos, |
| 1248 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 14, 15, kNpos, |
| 1249 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, |
| 1250 kNpos, kNpos, kNpos, kNpos, kNpos, kNpos, 19, 20, 21, 22, |
| 1251 23, kNpos}; |
| 1252 ASSERT_EQ(40U, arraysize(expected)); |
| 1253 for (size_t i = 0; i < 40; ++i) |
| 1254 EXPECT_EQ(expected[i], offsets[i]); |
| 1255 } |
| 1256 |
1252 // This is currently a windows specific function. | 1257 // This is currently a windows specific function. |
1253 #if defined(OS_WIN) | 1258 #if defined(OS_WIN) |
1254 namespace { | 1259 namespace { |
1255 | 1260 |
1256 struct GetDirectoryListingEntryCase { | 1261 struct GetDirectoryListingEntryCase { |
1257 const wchar_t* name; | 1262 const wchar_t* name; |
1258 const char* raw_bytes; | 1263 const char* raw_bytes; |
1259 bool is_dir; | 1264 bool is_dir; |
1260 int64 filesize; | 1265 int64 filesize; |
1261 base::Time time; | 1266 base::Time time; |
(...skipping 1115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2377 std::back_inserter(new_offsets), | 2382 std::back_inserter(new_offsets), |
2378 ClampComponentOffset(5)); | 2383 ClampComponentOffset(5)); |
2379 size_t expected_1[] = {kNpos, kNpos, kNpos, kNpos, kNpos, 5, 6, 7, 8, 9}; | 2384 size_t expected_1[] = {kNpos, kNpos, kNpos, kNpos, kNpos, 5, 6, 7, 8, 9}; |
2380 EXPECT_EQ(new_offsets.size(), arraysize(expected_1)); | 2385 EXPECT_EQ(new_offsets.size(), arraysize(expected_1)); |
2381 EXPECT_EQ(new_offsets.size(), old_offsets.size()); | 2386 EXPECT_EQ(new_offsets.size(), old_offsets.size()); |
2382 for (size_t i = 0; i < arraysize(expected_1); ++i) | 2387 for (size_t i = 0; i < arraysize(expected_1); ++i) |
2383 EXPECT_EQ(expected_1[i], new_offsets[i]); | 2388 EXPECT_EQ(expected_1[i], new_offsets[i]); |
2384 } | 2389 } |
2385 | 2390 |
2386 } // namespace net | 2391 } // namespace net |
OLD | NEW |