| Index: url/url_canon_unittest.cc
|
| ===================================================================
|
| --- url/url_canon_unittest.cc (revision 225023)
|
| +++ url/url_canon_unittest.cc (working copy)
|
| @@ -399,19 +399,138 @@
|
| {"%ef%bc%85%ef%bc%90%ef%bc%90.com", L"%ef%bc%85%ef%bc%90%ef%bc%90.com", "%00.com", url_parse::Component(0, 7), CanonHostInfo::BROKEN, -1, ""},
|
| // Basic IDN support, UTF-8 and UTF-16 input should be converted to IDN
|
| {"\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xbd\xa0\xe5\xa5\xbd", L"\x4f60\x597d\x4f60\x597d", "xn--6qqa088eba", url_parse::Component(0, 14), CanonHostInfo::NEUTRAL, -1, ""},
|
| + // See http://unicode.org/cldr/utility/idna.jsp for other
|
| + // examples/experiments and http://goo.gl/7yG11o
|
| + // for the full list of characters handled differently by
|
| + // IDNA 2003, UTS 46 (http://unicode.org/reports/tr46/ ) and IDNA 2008.
|
| +
|
| + // 4 Deviation characters are mapped/ignored in UTS 46 transitional
|
| + // mechansm. UTS 46, table 4 row (g).
|
| + // Sharp-s is mapped to 'ss' in UTS 46 and IDNA 2003.
|
| + // Otherwise, it'd be "xn--fuball-cta.de".
|
| + {"fu\xc3\x9f" "ball.de", L"fu\x00df" L"ball.de", "fussball.de",
|
| + url_parse::Component(0, 11), CanonHostInfo::NEUTRAL, -1, ""},
|
| + // Final-sigma (U+03C3) is mapped to regular sigma (U+03C2).
|
| + // Otherwise, it'd be "xn--wxaijb9b".
|
| + {"\xcf\x83\xcf\x8c\xce\xbb\xce\xbf\xcf\x82", L"\x3c3\x3cc\x3bb\x3bf\x3c2",
|
| + "xn--wxaikc6b", url_parse::Component(0, 12),
|
| + CanonHostInfo::NEUTRAL, -1, ""},
|
| + // ZWNJ (U+200C) and ZWJ (U+200D) are mapped away in UTS 46 transitional
|
| + // handling as well as in IDNA 2003.
|
| + {"a\xe2\x80\x8c" "b\xe2\x80\x8d" "c", L"a\x200c" L"b\x200d" L"c", "abc",
|
| + url_parse::Component(0, 3), CanonHostInfo::NEUTRAL, -1, ""},
|
| + // ZWJ between Devanagari characters is still mapped away in UTS 46
|
| + // transitional handling. IDNA 2008 would give xn--11bo0mv54g.
|
| + {"\xe0\xa4\x95\xe0\xa5\x8d\xe2\x80\x8d\xe0\xa4\x9c",
|
| + L"\x915\x94d\x200d\x91c", "xn--11bo0m",
|
| + url_parse::Component(0, 10), CanonHostInfo::NEUTRAL, -1, ""},
|
| + // Fullwidth exclamation mark is disallowed. UTS 46, table 4, row (b)
|
| + // However, we do allow this at the moment because we don't use
|
| + // STD3 rules and canonicalize full-width ASCII to ASCII.
|
| + {"wow\xef\xbc\x81", L"wow\xff01", "wow%21",
|
| + url_parse::Component(0, 6), CanonHostInfo::NEUTRAL, -1, ""},
|
| + // U+2132 (turned capital F) is disallowed. UTS 46, table 4, row (c)
|
| + // Allowed in IDNA 2003, but the mapping changed after Unicode 3.2
|
| + {"\xe2\x84\xb2oo", L"\x2132oo", "%E2%84%B2oo",
|
| + url_parse::Component(0, 11), CanonHostInfo::BROKEN, -1, ""},
|
| + // U+2F868 (CJK Comp) is disallowed. UTS 46, table 4, row (d)
|
| + // Allowed in IDNA 2003, but the mapping changed after Unicode 3.2
|
| + {"\xf0\xaf\xa1\xa8\xe5\xa7\xbb.cn", L"\xd87e\xdc68\x59fb.cn",
|
| + "%F0%AF%A1%A8%E5%A7%BB.cn",
|
| + url_parse::Component(0, 24), CanonHostInfo::BROKEN, -1, ""},
|
| + // Maps uppercase letters to lower case letters. UTS 46 table 4 row (e)
|
| + {"M\xc3\x9cNCHEN", L"M\xdcNCHEN", "xn--mnchen-3ya",
|
| + url_parse::Component(0, 14), CanonHostInfo::NEUTRAL, -1, ""},
|
| + // Symbol/punctuations are allowed in IDNA 2003/UTS46.
|
| + // Not allowed in IDNA 2008. UTS 46 table 4 row (f).
|
| + {"\xe2\x99\xa5ny.us", L"\x2665ny.us", "xn--ny-s0x.us",
|
| + url_parse::Component(0, 13), CanonHostInfo::NEUTRAL, -1, ""},
|
| + // U+11013 is new in Unicode 6.0 and is allowed. UTS 46 table 4, row (h)
|
| + // We used to allow it because we passed through unassigned code points.
|
| + {"\xf0\x91\x80\x93.com", L"\xd804\xdc13.com", "xn--n00d.com",
|
| + url_parse::Component(0, 12), CanonHostInfo::NEUTRAL, -1, ""},
|
| + // U+0602 is disallowed in UTS46/IDNA 2008. UTS 46 table 4, row(i)
|
| + // Used to be allowed in INDA 2003.
|
| + {"\xd8\x82.eg", L"\x602.eg", "%D8%82.eg",
|
| + url_parse::Component(0, 9), CanonHostInfo::BROKEN, -1, ""},
|
| + // U+20B7 is new in Unicode 5.2 (not a part of IDNA 2003 based
|
| + // on Unicode 3.2). We did allow it in the past because we let unassigned
|
| + // code point pass. We continue to allow it even though it's a
|
| + // "punctuation and symbol" blocked in IDNA 2008.
|
| + // UTS 46 table 4, row (j)
|
| + {"\xe2\x82\xb7.com", L"\x20b7.com", "xn--wzg.com",
|
| + url_parse::Component(0, 11), CanonHostInfo::NEUTRAL, -1, ""},
|
| + // Maps uppercase letters to lower case letters.
|
| + // In IDNA 2003, it's allowed without case-folding
|
| + // ( xn--bc-7cb.com ) because it's not defined in Unicode 3.2
|
| + // (added in Unicode 4.1). UTS 46 table 4 row (k)
|
| + {"bc\xc8\xba.com", L"bc\x23a.com", "xn--bc-is1a.com",
|
| + url_parse::Component(0, 15), CanonHostInfo::NEUTRAL, -1, ""},
|
| + // BiDi check test
|
| + // "Divehi" in Divehi (Thaana script) ends with BidiClass=NSM.
|
| + // Disallowed in IDNA 2003 but now allowed in UTS 46/IDNA 2008.
|
| + {"\xde\x8b\xde\xa8\xde\x88\xde\xac\xde\x80\xde\xa8",
|
| + L"\x78b\x7a8\x788\x7ac\x780\x7a8", "xn--hqbpi0jcw",
|
| + url_parse::Component(0, 13), CanonHostInfo::NEUTRAL, -1, ""},
|
| + // Disallowed in both IDNA 2003 and 2008 with BiDi check.
|
| + // Labels starting with a RTL character cannot end with a LTR character.
|
| + {"\xd8\xac\xd8\xa7\xd8\xb1xyz", L"\x62c\x627\x631xyz",
|
| + "%D8%AC%D8%A7%D8%B1xyz", url_parse::Component(0, 21),
|
| + CanonHostInfo::BROKEN, -1, ""},
|
| + // Labels starting with a RTL character can end with BC=EN (European
|
| + // number). Disallowed in IDNA 2003 but now allowed.
|
| + {"\xd8\xac\xd8\xa7\xd8\xb1" "2", L"\x62c\x627\x631" L"2",
|
| + "xn--2-ymcov", url_parse::Component(0, 11),
|
| + CanonHostInfo::NEUTRAL, -1, ""},
|
| + // Labels starting with a RTL character cannot have "L" characters
|
| + // even if it ends with an BC=EN. Disallowed in both IDNA 2003/2008.
|
| + {"\xd8\xac\xd8\xa7\xd8\xb1xy2", L"\x62c\x627\x631xy2",
|
| + "%D8%AC%D8%A7%D8%B1xy2", url_parse::Component(0, 21),
|
| + CanonHostInfo::BROKEN, -1, ""},
|
| + // Labels starting with a RTL character can end with BC=AN (Arabic number)
|
| + // Disallowed in IDNA 2003, but now allowed.
|
| + {"\xd8\xac\xd8\xa7\xd8\xb1\xd9\xa2", L"\x62c\x627\x631\x662",
|
| + "xn--mgbjq0r", url_parse::Component(0, 11),
|
| + CanonHostInfo::NEUTRAL, -1, ""},
|
| + // Labels starting with a RTL character cannot have "L" characters
|
| + // even if it ends with an BC=AN (Arabic number).
|
| + // Disallowed in both IDNA 2003/2008.
|
| + {"\xd8\xac\xd8\xa7\xd8\xb1xy\xd9\xa2", L"\x62c\x627\x631xy\x662",
|
| + "%D8%AC%D8%A7%D8%B1xy%D9%A2", url_parse::Component(0, 26),
|
| + CanonHostInfo::BROKEN, -1, ""},
|
| + // Labels starting with a RTL character cannot mix BC=EN and BC=AN
|
| + {"\xd8\xac\xd8\xa7\xd8\xb1xy2\xd9\xa2", L"\x62c\x627\x631xy2\x662",
|
| + "%D8%AC%D8%A7%D8%B1xy2%D9%A2", url_parse::Component(0, 27),
|
| + CanonHostInfo::BROKEN, -1, ""},
|
| + // As of Unicode 6.2, U+20CF is not assigned. We do not allow it.
|
| + {"\xe2\x83\x8f.com", L"\x20cf.com", "%E2%83%8F.com",
|
| + url_parse::Component(0, 13), CanonHostInfo::BROKEN, -1, ""},
|
| + // U+0080 is not allowed.
|
| + {"\xc2\x80.com", L"\x80.com", "%C2%80.com",
|
| + url_parse::Component(0, 10), CanonHostInfo::BROKEN, -1, ""},
|
| // Mixed UTF-8 and escaped UTF-8 (narrow case) and UTF-16 and escaped
|
| + // Mixed UTF-8 and escaped UTF-8 (narrow case) and UTF-16 and escaped
|
| // UTF-8 (wide case). The output should be equivalent to the true wide
|
| // character input above).
|
| - {"%E4%BD%A0%E5%A5%BD\xe4\xbd\xa0\xe5\xa5\xbd", L"%E4%BD%A0%E5%A5%BD\x4f60\x597d", "xn--6qqa088eba", url_parse::Component(0, 14), CanonHostInfo::NEUTRAL, -1, ""},
|
| + {"%E4%BD%A0%E5%A5%BD\xe4\xbd\xa0\xe5\xa5\xbd",
|
| + L"%E4%BD%A0%E5%A5%BD\x4f60\x597d", "xn--6qqa088eba",
|
| + url_parse::Component(0, 14), CanonHostInfo::NEUTRAL, -1, ""},
|
| // Invalid escaped characters should fail and the percents should be
|
| // escaped.
|
| - {"%zz%66%a", L"%zz%66%a", "%25zzf%25a", url_parse::Component(0, 10), CanonHostInfo::BROKEN, -1, ""},
|
| + {"%zz%66%a", L"%zz%66%a", "%25zzf%25a", url_parse::Component(0, 10),
|
| + CanonHostInfo::BROKEN, -1, ""},
|
| // If we get an invalid character that has been escaped.
|
| - {"%25", L"%25", "%25", url_parse::Component(0, 3), CanonHostInfo::BROKEN, -1, ""},
|
| - {"hello%00", L"hello%00", "hello%00", url_parse::Component(0, 8), CanonHostInfo::BROKEN, -1, ""},
|
| + {"%25", L"%25", "%25", url_parse::Component(0, 3),
|
| + CanonHostInfo::BROKEN, -1, ""},
|
| + {"hello%00", L"hello%00", "hello%00", url_parse::Component(0, 8),
|
| + CanonHostInfo::BROKEN, -1, ""},
|
| // Escaped numbers should be treated like IP addresses if they are.
|
| - {"%30%78%63%30%2e%30%32%35%30.01", L"%30%78%63%30%2e%30%32%35%30.01", "192.168.0.1", url_parse::Component(0, 11), CanonHostInfo::IPV4, 3, "C0A80001"},
|
| - {"%30%78%63%30%2e%30%32%35%30.01%2e", L"%30%78%63%30%2e%30%32%35%30.01%2e", "192.168.0.1", url_parse::Component(0, 11), CanonHostInfo::IPV4, 3, "C0A80001"},
|
| + {"%30%78%63%30%2e%30%32%35%30.01", L"%30%78%63%30%2e%30%32%35%30.01",
|
| + "192.168.0.1", url_parse::Component(0, 11), CanonHostInfo::IPV4, 3,
|
| + "C0A80001"},
|
| + {"%30%78%63%30%2e%30%32%35%30.01%2e", L"%30%78%63%30%2e%30%32%35%30.01%2e",
|
| + "192.168.0.1", url_parse::Component(0, 11), CanonHostInfo::IPV4, 3,
|
| + "C0A80001"},
|
| // Invalid escaping should trigger the regular host error handling.
|
| {"%3g%78%63%30%2e%30%32%35%30%2E.01", L"%3g%78%63%30%2e%30%32%35%30%2E.01", "%253gxc0.0250..01", url_parse::Component(0, 17), CanonHostInfo::BROKEN, -1, ""},
|
| // Something that isn't exactly an IP should get treated as a host and
|
| @@ -423,9 +542,12 @@
|
| // Broken IP addresses get marked as such.
|
| {"192.168.0.257", L"192.168.0.257", "192.168.0.257", url_parse::Component(0, 13), CanonHostInfo::BROKEN, -1, ""},
|
| {"[google.com]", L"[google.com]", "[google.com]", url_parse::Component(0, 12), CanonHostInfo::BROKEN, -1, ""},
|
| - // Cyrillic letter followed buy ( should return punicode for ( escaped before punicode string was created. I.e.
|
| - // if ( is escaped after punicode is created we would get xn--%28-8tb (incorrect).
|
| - {"\xd1\x82(", L"\x0442(", "xn--%28-7ed", url_parse::Component(0, 11), CanonHostInfo::NEUTRAL, -1, ""},
|
| + // Cyrillic letter followed by '(' should return punycode for '(' escaped
|
| + // before punycode string was created. I.e.
|
| + // if '(' is escaped after punycode is created we would get xn--%28-8tb
|
| + // (incorrect).
|
| + {"\xd1\x82(", L"\x0442(", "xn--%28-7ed", url_parse::Component(0, 11),
|
| + CanonHostInfo::NEUTRAL, -1, ""},
|
| // Address with all hexidecimal characters with leading number of 1<<32
|
| // or greater and should return NEUTRAL rather than BROKEN if not all
|
| // components are numbers.
|
| @@ -453,10 +575,13 @@
|
| output.Complete();
|
|
|
| EXPECT_EQ(host_cases[i].expected_family != CanonHostInfo::BROKEN,
|
| - success);
|
| - EXPECT_EQ(std::string(host_cases[i].expected), out_str);
|
| - EXPECT_EQ(host_cases[i].expected_component.begin, out_comp.begin);
|
| - EXPECT_EQ(host_cases[i].expected_component.len, out_comp.len);
|
| + success) << "for input: " << host_cases[i].input8;
|
| + EXPECT_EQ(std::string(host_cases[i].expected), out_str) <<
|
| + "for input: " << host_cases[i].input8;
|
| + EXPECT_EQ(host_cases[i].expected_component.begin, out_comp.begin) <<
|
| + "for input: " << host_cases[i].input8;
|
| + EXPECT_EQ(host_cases[i].expected_component.len, out_comp.len) <<
|
| + "for input: " << host_cases[i].input8;
|
| }
|
|
|
| // Wide version.
|
|
|