Index: net/base/net_util_unittest.cc |
=================================================================== |
--- net/base/net_util_unittest.cc (revision 31214) |
+++ net/base/net_util_unittest.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
@@ -345,6 +345,11 @@ |
#endif |
}; |
+struct AdjustOffsetCase { |
+ size_t input_offset; |
+ size_t output_offset; |
+}; |
+ |
struct CompliantHostCase { |
const char* host; |
bool expected_output; |
@@ -782,14 +787,10 @@ |
// ja || zh-TW,en || ko,ja -> IDNToUnicodeSlow |
if (j == 3 || j == 17 || j == 18) |
continue; |
- std::wstring output; |
- net::IDNToUnicode(idn_cases[i].input, |
- static_cast<int>(strlen(idn_cases[i].input)), |
- kLanguages[j], |
- &output); |
+ std::wstring output(net::IDNToUnicode(idn_cases[i].input, |
+ strlen(idn_cases[i].input), kLanguages[j], NULL)); |
std::wstring expected(idn_cases[i].unicode_allowed[j] ? |
- idn_cases[i].unicode_output : |
- ASCIIToWide(idn_cases[i].input)); |
+ idn_cases[i].unicode_output : ASCIIToWide(idn_cases[i].input)); |
AppendLanguagesToOutputs(kLanguages[j], &expected, &output); |
EXPECT_EQ(expected, output); |
} |
@@ -802,20 +803,43 @@ |
// !(ja || zh-TW,en || ko,ja) -> IDNToUnicodeFast |
if (!(j == 3 || j == 17 || j == 18)) |
continue; |
- std::wstring output; |
- net::IDNToUnicode(idn_cases[i].input, |
- static_cast<int>(strlen(idn_cases[i].input)), |
- kLanguages[j], |
- &output); |
+ std::wstring output(net::IDNToUnicode(idn_cases[i].input, |
+ strlen(idn_cases[i].input), kLanguages[j], NULL)); |
std::wstring expected(idn_cases[i].unicode_allowed[j] ? |
- idn_cases[i].unicode_output : |
- ASCIIToWide(idn_cases[i].input)); |
+ idn_cases[i].unicode_output : ASCIIToWide(idn_cases[i].input)); |
AppendLanguagesToOutputs(kLanguages[j], &expected, &output); |
EXPECT_EQ(expected, output); |
} |
} |
} |
+TEST(NetUtilTest, IDNToUnicodeAdjustOffset) { |
+ const AdjustOffsetCase adjust_cases[] = { |
+ {0, 0}, |
+ {2, 2}, |
+ {4, 4}, |
+ {5, 5}, |
+ {6, std::wstring::npos}, |
+ {16, std::wstring::npos}, |
+ {17, 7}, |
+ {18, 8}, |
+ {19, std::wstring::npos}, |
+ {25, std::wstring::npos}, |
+ {34, 12}, |
+ {35, 13}, |
+ {38, 16}, |
+ {39, std::wstring::npos}, |
+ {std::wstring::npos, std::wstring::npos}, |
+ }; |
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(adjust_cases); ++i) { |
+ size_t offset = adjust_cases[i].input_offset; |
+ // "test.\x89c6\x9891.\x5317\x4eac\x5927\x5b78.test" |
+ net::IDNToUnicode("test.xn--cy2a840a.xn--1lq90ic7f1rc.test", 39, L"zh-CN", |
+ &offset); |
+ EXPECT_EQ(adjust_cases[i].output_offset, offset); |
+ } |
+} |
+ |
TEST(NetUtilTest, CompliantHost) { |
const CompliantHostCase compliant_host_cases[] = { |
{"", false}, |
@@ -1328,7 +1352,7 @@ |
size_t prefix_len; |
std::wstring formatted = net::FormatUrl( |
GURL(tests[i].input), tests[i].languages, tests[i].omit, |
- tests[i].escape_rules, NULL, &prefix_len); |
+ tests[i].escape_rules, NULL, &prefix_len, NULL); |
EXPECT_EQ(tests[i].output, formatted) << tests[i].description; |
EXPECT_EQ(tests[i].prefix_len, prefix_len) << tests[i].description; |
} |
@@ -1340,7 +1364,7 @@ |
std::wstring formatted = net::FormatUrl( |
GURL("http://\xE3\x82\xB0:\xE3\x83\xBC@xn--qcka1pmc.jp:8080/" |
"%E3%82%B0/?q=%E3%82%B0#\xE3\x82\xB0"), |
- L"ja", false, UnescapeRule::NONE, &parsed, NULL); |
+ L"ja", false, UnescapeRule::NONE, &parsed, NULL, NULL); |
EXPECT_EQ(L"http://%E3%82%B0:%E3%83%BC@\x30B0\x30FC\x30B0\x30EB.jp:8080" |
L"/%E3%82%B0/?q=%E3%82%B0#\x30B0", formatted); |
EXPECT_EQ(L"%E3%82%B0", |
@@ -1360,7 +1384,7 @@ |
formatted = net::FormatUrl( |
GURL("http://\xE3\x82\xB0:\xE3\x83\xBC@xn--qcka1pmc.jp:8080/" |
"%E3%82%B0/?q=%E3%82%B0#\xE3\x82\xB0"), |
- L"ja", false, UnescapeRule::NORMAL, &parsed, NULL); |
+ L"ja", false, UnescapeRule::NORMAL, &parsed, NULL, NULL); |
EXPECT_EQ(L"http://\x30B0:\x30FC@\x30B0\x30FC\x30B0\x30EB.jp:8080" |
L"/\x30B0/?q=\x30B0#\x30B0", formatted); |
EXPECT_EQ(L"\x30B0", |
@@ -1379,7 +1403,7 @@ |
formatted = net::FormatUrl( |
GURL("http://\xE3\x82\xB0:\xE3\x83\xBC@xn--qcka1pmc.jp:8080/" |
"%E3%82%B0/?q=%E3%82%B0#\xE3\x82\xB0"), |
- L"ja", true, UnescapeRule::NORMAL, &parsed, NULL); |
+ L"ja", true, UnescapeRule::NORMAL, &parsed, NULL, NULL); |
EXPECT_EQ(L"http://\x30B0\x30FC\x30B0\x30EB.jp:8080" |
L"/\x30B0/?q=\x30B0#\x30B0", formatted); |
EXPECT_FALSE(parsed.username.is_valid()); |
@@ -1395,7 +1419,7 @@ |
// View-source case. |
formatted = net::FormatUrl( |
GURL("view-source:http://user:passwd@host:81/path?query#ref"), |
- L"", true, UnescapeRule::NORMAL, &parsed, NULL); |
+ L"", true, UnescapeRule::NORMAL, &parsed, NULL, NULL); |
EXPECT_EQ(L"view-source:http://host:81/path?query#ref", formatted); |
EXPECT_EQ(L"view-source:http", |
formatted.substr(parsed.scheme.begin, parsed.scheme.len)); |
@@ -1408,6 +1432,124 @@ |
EXPECT_EQ(L"ref", formatted.substr(parsed.ref.begin, parsed.ref.len)); |
} |
+TEST(NetUtilTest, FormatUrlAdjustOffset) { |
+ const AdjustOffsetCase basic_cases[] = { |
+ {0, 0}, |
+ {3, 3}, |
+ {5, 5}, |
+ {6, 6}, |
+ {13, 13}, |
+ {21, 21}, |
+ {22, 22}, |
+ {23, 23}, |
+ {25, 25}, |
+ {26, std::wstring::npos}, |
+ {500000, std::wstring::npos}, |
+ {std::wstring::npos, std::wstring::npos}, |
+ }; |
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(basic_cases); ++i) { |
+ size_t offset = basic_cases[i].input_offset; |
+ net::FormatUrl(GURL("http://www.google.com/foo/"), L"en", true, |
+ UnescapeRule::NORMAL, NULL, NULL, &offset); |
+ EXPECT_EQ(basic_cases[i].output_offset, offset); |
+ } |
+ |
+ const struct { |
+ const char* input_url; |
+ size_t input_offset; |
+ size_t output_offset; |
+ } omit_auth_cases[] = { |
+ {"http://foo:bar@www.google.com/", 6, 6}, |
+ {"http://foo:bar@www.google.com/", 7, 7}, |
+ {"http://foo:bar@www.google.com/", 8, std::wstring::npos}, |
+ {"http://foo:bar@www.google.com/", 10, std::wstring::npos}, |
+ {"http://foo:bar@www.google.com/", 11, std::wstring::npos}, |
+ {"http://foo:bar@www.google.com/", 14, std::wstring::npos}, |
+ {"http://foo:bar@www.google.com/", 15, 7}, |
+ {"http://foo:bar@www.google.com/", 25, 17}, |
+ {"http://foo@www.google.com/", 9, std::wstring::npos}, |
+ {"http://foo@www.google.com/", 11, 7}, |
+ }; |
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(omit_auth_cases); ++i) { |
+ size_t offset = omit_auth_cases[i].input_offset; |
+ net::FormatUrl(GURL(omit_auth_cases[i].input_url), L"en", true, |
+ UnescapeRule::NORMAL, NULL, NULL, &offset); |
+ EXPECT_EQ(omit_auth_cases[i].output_offset, offset); |
+ } |
+ |
+ const AdjustOffsetCase view_source_cases[] = { |
+ {0, 0}, |
+ {3, 3}, |
+ {11, 11}, |
+ {12, 12}, |
+ {13, 13}, |
+ {19, 19}, |
+ {20, std::wstring::npos}, |
+ {23, 19}, |
+ {26, 22}, |
+ {std::wstring::npos, std::wstring::npos}, |
+ }; |
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(view_source_cases); ++i) { |
+ size_t offset = view_source_cases[i].input_offset; |
+ net::FormatUrl(GURL("view-source:http://foo@www.google.com/"), L"en", true, |
+ UnescapeRule::NORMAL, NULL, NULL, &offset); |
+ EXPECT_EQ(view_source_cases[i].output_offset, offset); |
+ } |
+ |
+ const AdjustOffsetCase idn_hostname_cases[] = { |
+ {8, std::wstring::npos}, |
+ {16, std::wstring::npos}, |
+ {24, std::wstring::npos}, |
+ {25, 12}, |
+ {30, 17}, |
+ }; |
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(idn_hostname_cases); ++i) { |
+ size_t offset = idn_hostname_cases[i].input_offset; |
+ // "http://\x671d\x65e5\x3042\x3055\x3072.jp/foo/" |
+ net::FormatUrl(GURL("http://xn--l8jvb1ey91xtjb.jp/foo/"), L"ja", true, |
+ UnescapeRule::NORMAL, NULL, NULL, &offset); |
+ EXPECT_EQ(idn_hostname_cases[i].output_offset, offset); |
+ } |
+ |
+ const AdjustOffsetCase unescape_cases[] = { |
+ {25, 25}, |
+ {26, std::wstring::npos}, |
+ {27, std::wstring::npos}, |
+ {28, 26}, |
+ {35, std::wstring::npos}, |
+ {41, 31}, |
+ {59, 33}, |
+ {60, std::wstring::npos}, |
+ {67, std::wstring::npos}, |
+ {68, std::wstring::npos}, |
+ }; |
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(unescape_cases); ++i) { |
+ size_t offset = unescape_cases[i].input_offset; |
+ // "http://www.google.com/foo bar/\x30B0\x30FC\x30B0\x30EB" |
+ net::FormatUrl(GURL( |
+ "http://www.google.com/foo%20bar/%E3%82%B0%E3%83%BC%E3%82%B0%E3%83%AB"), |
+ L"en", true, UnescapeRule::SPACES, NULL, NULL, &offset); |
+ EXPECT_EQ(unescape_cases[i].output_offset, offset); |
+ } |
+ |
+ const AdjustOffsetCase ref_cases[] = { |
+ {30, 30}, |
+ {31, 31}, |
+ {32, std::wstring::npos}, |
+ {34, 32}, |
+ {37, 33}, |
+ {38, std::wstring::npos}, |
+ }; |
+ for (size_t i = 0; i < ARRAYSIZE_UNSAFE(ref_cases); ++i) { |
+ size_t offset = ref_cases[i].input_offset; |
+ // "http://www.google.com/foo.html#\x30B0\x30B0z" |
+ net::FormatUrl(GURL( |
+ "http://www.google.com/foo.html#\xE3\x82\xB0\xE3\x82\xB0z"), L"en", |
+ true, UnescapeRule::NORMAL, NULL, NULL, &offset); |
+ EXPECT_EQ(ref_cases[i].output_offset, offset); |
+ } |
+} |
+ |
TEST(NetUtilTest, SimplifyUrlForRequest) { |
struct { |
const char* input_url; |
@@ -1466,4 +1608,3 @@ |
EXPECT_EQ(i, net::explicitly_allowed_ports.size()); |
} |
} |
- |