Home | History | Annotate | Download | only in common
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/common/content_settings_pattern.h"
      6 
      7 #include "testing/gtest/include/gtest/gtest.h"
      8 #include "url/gurl.h"
      9 
     10 namespace {
     11 
     12 ContentSettingsPattern Pattern(const std::string& str) {
     13   return ContentSettingsPattern::FromString(str);
     14 }
     15 
     16 }  // namespace
     17 
     18 TEST(ContentSettingsPatternTest, RealWorldPatterns) {
     19   // This is the place for real world patterns that unveiled bugs.
     20   EXPECT_STREQ("[*.]ikea.com",
     21                Pattern("[*.]ikea.com").ToString().c_str());
     22 }
     23 
     24 TEST(ContentSettingsPatternTest, GURL) {
     25   // Document and verify GURL behavior.
     26   GURL url("http://mail.google.com:80");
     27   EXPECT_EQ(-1, url.IntPort());
     28   EXPECT_EQ("", url.port());
     29 
     30   url = GURL("http://mail.google.com");
     31   EXPECT_EQ(-1, url.IntPort());
     32   EXPECT_EQ("", url.port());
     33 
     34   url = GURL("https://mail.google.com:443");
     35   EXPECT_EQ(-1, url.IntPort());
     36   EXPECT_EQ("", url.port());
     37 
     38   url = GURL("https://mail.google.com");
     39   EXPECT_EQ(-1, url.IntPort());
     40   EXPECT_EQ("", url.port());
     41 
     42   url = GURL("http://mail.google.com");
     43   EXPECT_EQ(-1, url.IntPort());
     44   EXPECT_EQ("", url.port());
     45 }
     46 
     47 TEST(ContentSettingsPatternTest, FromURL) {
     48   // NOTICE: When content settings pattern are created from a GURL the following
     49   // happens:
     50   // - If the GURL scheme is "http" the scheme wildcard is used. Otherwise the
     51   //   GURL scheme is used.
     52   // - A domain wildcard is added to the GURL host.
     53   // - A port wildcard is used instead of the schemes default port.
     54   //   In case of non-default ports the specific GURL port is used.
     55   ContentSettingsPattern pattern = ContentSettingsPattern::FromURL(
     56       GURL("http://www.youtube.com"));
     57   EXPECT_TRUE(pattern.IsValid());
     58   EXPECT_STREQ("[*.]www.youtube.com", pattern.ToString().c_str());
     59 
     60   // Patterns created from a URL.
     61   pattern = ContentSettingsPattern::FromURL(GURL("http://www.google.com"));
     62   EXPECT_TRUE(pattern.Matches(GURL("http://www.google.com")));
     63   EXPECT_TRUE(pattern.Matches(GURL("http://foo.www.google.com")));
     64   EXPECT_TRUE(pattern.Matches(GURL("http://www.google.com:80")));
     65   EXPECT_TRUE(pattern.Matches(GURL("http://www.google.com:81")));
     66   EXPECT_FALSE(pattern.Matches(GURL("https://mail.google.com")));
     67   EXPECT_TRUE(pattern.Matches(GURL("https://www.google.com")));
     68 
     69   pattern = ContentSettingsPattern::FromURL(GURL("http://www.google.com:80"));
     70   EXPECT_TRUE(pattern.Matches(GURL("http://www.google.com")));
     71   EXPECT_TRUE(pattern.Matches(GURL("http://www.google.com:80")));
     72   EXPECT_TRUE(pattern.Matches(GURL("http://www.google.com:81")));
     73 
     74   pattern = ContentSettingsPattern::FromURL(GURL("https://www.google.com:443"));
     75   EXPECT_TRUE(pattern.Matches(GURL("https://www.google.com")));
     76   EXPECT_TRUE(pattern.Matches(GURL("https://foo.www.google.com")));
     77   EXPECT_TRUE(pattern.Matches(GURL("https://www.google.com:443")));
     78   EXPECT_FALSE(pattern.Matches(GURL("https://www.google.com:444")));
     79   EXPECT_FALSE(pattern.Matches(GURL("http://www.google.com:443")));
     80 
     81   pattern = ContentSettingsPattern::FromURL(GURL("https://127.0.0.1"));
     82   EXPECT_TRUE(pattern.IsValid());
     83   EXPECT_STREQ("https://127.0.0.1:443", pattern.ToString().c_str());
     84 
     85   pattern = ContentSettingsPattern::FromURL(GURL("http://[::1]"));
     86   EXPECT_TRUE(pattern.IsValid());
     87 
     88   pattern = ContentSettingsPattern::FromURL(GURL("file:///foo/bar.html"));
     89   EXPECT_TRUE(pattern.IsValid());
     90   EXPECT_EQ("file:///foo/bar.html", pattern.ToString());
     91 }
     92 
     93 TEST(ContentSettingsPatternTest, FilesystemUrls) {
     94   ContentSettingsPattern pattern =
     95       ContentSettingsPattern::FromURL(GURL("http://www.google.com"));
     96   EXPECT_TRUE(pattern.Matches(
     97       GURL("filesystem:http://www.google.com/temporary/")));
     98   EXPECT_TRUE(pattern.Matches(
     99       GURL("filesystem:http://foo.www.google.com/temporary/")));
    100   EXPECT_TRUE(pattern.Matches(
    101       GURL("filesystem:http://www.google.com:80/temporary/")));
    102   EXPECT_TRUE(pattern.Matches(
    103       GURL("filesystem:http://www.google.com:81/temporary/")));
    104 
    105   pattern = ContentSettingsPattern::FromURL(GURL("https://www.google.com"));
    106   EXPECT_TRUE(pattern.Matches(
    107       GURL("filesystem:https://www.google.com/temporary/")));
    108   EXPECT_TRUE(pattern.Matches(
    109       GURL("filesystem:https://www.google.com:443/temporary/")));
    110   EXPECT_TRUE(pattern.Matches(
    111       GURL("filesystem:https://foo.www.google.com/temporary/")));
    112   EXPECT_FALSE(pattern.Matches(
    113       GURL("filesystem:https://www.google.com:81/temporary/")));
    114 
    115   // A pattern from a filesystem URLs is equivalent to a pattern from the inner
    116   // URL of the filesystem URL.
    117   ContentSettingsPattern pattern2 = ContentSettingsPattern::FromURL(
    118       GURL("filesystem:https://www.google.com/temporary/"));
    119   EXPECT_EQ(ContentSettingsPattern::IDENTITY, pattern.Compare(pattern2));
    120 
    121   EXPECT_STREQ("https://[*.]www.google.com:443", pattern2.ToString().c_str());
    122 
    123   pattern =
    124       ContentSettingsPattern::FromURL(
    125           GURL("filesystem:file:///temporary/foo/bar"));
    126   EXPECT_TRUE(pattern.Matches(GURL("filesystem:file:///temporary/")));
    127   EXPECT_TRUE(pattern.Matches(GURL("filesystem:file:///temporary/test.txt")));
    128   EXPECT_TRUE(pattern.Matches(GURL("file:///temporary")));
    129   EXPECT_FALSE(pattern.Matches(GURL("file://foo/bar")));
    130   pattern2 =
    131       ContentSettingsPattern::FromURL(
    132           GURL("filesystem:file:///persistent/foo2/bar2"));
    133   EXPECT_EQ(ContentSettingsPattern::IDENTITY, pattern.Compare(pattern2));
    134 }
    135 
    136 TEST(ContentSettingsPatternTest, FromURLNoWildcard) {
    137   // If no port is specifed GURLs always use the default port for the schemes
    138   // HTTP and HTTPS. Hence a GURL always carries a port specification either
    139   // explicitly or implicitly. Therefore if a content settings pattern is
    140   // created from a GURL with no wildcard, specific values are used for the
    141   // scheme, host and port part of the pattern.
    142   // Creating content settings patterns from strings behaves different. Pattern
    143   // parts that are omitted in pattern specifications (strings), are completed
    144   // with a wildcard.
    145   ContentSettingsPattern pattern = ContentSettingsPattern::FromURLNoWildcard(
    146       GURL("http://www.example.com"));
    147   EXPECT_TRUE(pattern.IsValid());
    148   EXPECT_STREQ("http://www.example.com:80", pattern.ToString().c_str());
    149   EXPECT_TRUE(pattern.Matches(GURL("http://www.example.com")));
    150   EXPECT_FALSE(pattern.Matches(GURL("https://www.example.com")));
    151   EXPECT_FALSE(pattern.Matches(GURL("http://foo.www.example.com")));
    152 
    153   pattern = ContentSettingsPattern::FromURLNoWildcard(
    154       GURL("https://www.example.com"));
    155   EXPECT_TRUE(pattern.IsValid());
    156   EXPECT_STREQ("https://www.example.com:443", pattern.ToString().c_str());
    157   EXPECT_FALSE(pattern.Matches(GURL("http://www.example.com")));
    158   EXPECT_TRUE(pattern.Matches(GURL("https://www.example.com")));
    159   EXPECT_FALSE(pattern.Matches(GURL("http://foo.www.example.com")));
    160 
    161   // Pattern for filesystem URLs
    162   pattern =
    163       ContentSettingsPattern::FromURLNoWildcard(
    164           GURL("filesystem:http://www.google.com/temporary/"));
    165   EXPECT_TRUE(pattern.IsValid());
    166   EXPECT_TRUE(pattern.Matches(GURL("http://www.google.com")));
    167   EXPECT_FALSE(pattern.Matches(GURL("http://foo.www.google.com")));
    168   EXPECT_TRUE(pattern.Matches(
    169       GURL("filesystem:http://www.google.com/persistent/")));
    170   EXPECT_FALSE(pattern.Matches(
    171       GURL("filesystem:https://www.google.com/persistent/")));
    172   EXPECT_FALSE(pattern.Matches(
    173       GURL("filesystem:https://www.google.com:81/temporary/")));
    174   EXPECT_FALSE(pattern.Matches(
    175       GURL("filesystem:https://foo.www.google.com/temporary/")));
    176 }
    177 
    178 TEST(ContentSettingsPatternTest, Wildcard) {
    179   EXPECT_TRUE(ContentSettingsPattern::Wildcard().IsValid());
    180 
    181   EXPECT_TRUE(ContentSettingsPattern::Wildcard().Matches(
    182       GURL("http://www.google.com")));
    183   EXPECT_TRUE(ContentSettingsPattern::Wildcard().Matches(
    184       GURL("https://www.google.com")));
    185   EXPECT_TRUE(ContentSettingsPattern::Wildcard().Matches(
    186       GURL("https://myhost:8080")));
    187   EXPECT_TRUE(ContentSettingsPattern::Wildcard().Matches(
    188       GURL("file:///foo/bar.txt")));
    189 
    190   EXPECT_STREQ("*", ContentSettingsPattern::Wildcard().ToString().c_str());
    191 
    192   EXPECT_EQ(ContentSettingsPattern::IDENTITY,
    193             ContentSettingsPattern::Wildcard().Compare(
    194                 ContentSettingsPattern::Wildcard()));
    195 }
    196 
    197 TEST(ContentSettingsPatternTest, TrimEndingDotFromHost) {
    198   EXPECT_TRUE(Pattern("www.example.com").IsValid());
    199   EXPECT_TRUE(Pattern("www.example.com").Matches(
    200       GURL("http://www.example.com")));
    201   EXPECT_TRUE(Pattern("www.example.com").Matches(
    202       GURL("http://www.example.com.")));
    203 
    204   EXPECT_TRUE(Pattern("www.example.com.").IsValid());
    205   EXPECT_STREQ("www.example.com",
    206                Pattern("www.example.com.").ToString().c_str());
    207 
    208   EXPECT_TRUE(Pattern("www.example.com.") == Pattern("www.example.com"));
    209 
    210   EXPECT_TRUE(Pattern(".").IsValid());
    211   EXPECT_STREQ(".", Pattern(".").ToString().c_str());
    212 }
    213 
    214 TEST(ContentSettingsPatternTest, FromString_WithNoWildcards) {
    215   // HTTP patterns with default port.
    216   EXPECT_TRUE(Pattern("http://www.example.com:80").IsValid());
    217   EXPECT_STREQ("http://www.example.com:80",
    218                Pattern("http://www.example.com:80").ToString().c_str());
    219   // HTTP patterns with none default port.
    220   EXPECT_TRUE(Pattern("http://www.example.com:81").IsValid());
    221   EXPECT_STREQ("http://www.example.com:81",
    222                Pattern("http://www.example.com:81").ToString().c_str());
    223 
    224   // HTTPS patterns with default port.
    225   EXPECT_TRUE(Pattern("https://www.example.com:443").IsValid());
    226   EXPECT_STREQ("https://www.example.com:443",
    227                Pattern("https://www.example.com:443").ToString().c_str());
    228   // HTTPS patterns with none default port.
    229   EXPECT_TRUE(Pattern("https://www.example.com:8080").IsValid());
    230   EXPECT_STREQ("https://www.example.com:8080",
    231                Pattern("https://www.example.com:8080").ToString().c_str());
    232 }
    233 
    234 TEST(ContentSettingsPatternTest, FromString_FilePatterns) {
    235   // "/" is an invalid file path.
    236   EXPECT_FALSE(Pattern("file:///").IsValid());
    237 
    238   // Non-empty domains aren't allowed in file patterns.
    239   EXPECT_FALSE(Pattern("file://foo/").IsValid());
    240   EXPECT_FALSE(Pattern("file://localhost/foo/bar/test.html").IsValid());
    241   EXPECT_FALSE(Pattern("file://*").IsValid());
    242   EXPECT_FALSE(Pattern("file://*/").IsValid());
    243   EXPECT_FALSE(Pattern("file://*/*").IsValid());
    244   EXPECT_FALSE(Pattern("file://*/foo/bar/test.html").IsValid());
    245   EXPECT_FALSE(Pattern("file://[*.]/").IsValid());
    246 
    247   // This is the only valid file path wildcard format.
    248   EXPECT_TRUE(Pattern("file:///*").IsValid());
    249   EXPECT_EQ("file:///*", Pattern("file:///*").ToString());
    250 
    251   // Wildcards are not allowed anywhere in the file path.
    252   EXPECT_FALSE(Pattern("file:///f*o/bar/file.html").IsValid());
    253   EXPECT_FALSE(Pattern("file:///*/bar/file.html").IsValid());
    254   EXPECT_FALSE(Pattern("file:///foo/*").IsValid());
    255   EXPECT_FALSE(Pattern("file:///foo/bar/*").IsValid());
    256   EXPECT_FALSE(Pattern("file:///foo/*/file.html").IsValid());
    257   EXPECT_FALSE(Pattern("file:///foo/bar/*.html").IsValid());
    258   EXPECT_FALSE(Pattern("file:///foo/bar/file.*").IsValid());
    259 
    260   EXPECT_TRUE(Pattern("file:///tmp/test.html").IsValid());
    261   EXPECT_EQ("file:///tmp/file.html",
    262             Pattern("file:///tmp/file.html").ToString());
    263   EXPECT_TRUE(Pattern("file:///tmp/test.html").Matches(
    264       GURL("file:///tmp/test.html")));
    265   EXPECT_FALSE(Pattern("file:///tmp/test.html").Matches(
    266       GURL("file:///tmp/other.html")));
    267   EXPECT_FALSE(Pattern("file:///tmp/test.html").Matches(
    268       GURL("http://example.org/")));
    269 
    270   EXPECT_TRUE(Pattern("file:///*").Matches(GURL("file:///tmp/test.html")));
    271   EXPECT_TRUE(Pattern("file:///*").Matches(
    272       GURL("file://localhost/tmp/test.html")));
    273 }
    274 
    275 TEST(ContentSettingsPatternTest, FromString_ExtensionPatterns) {
    276   EXPECT_TRUE(Pattern("chrome-extension://peoadpeiejnhkmpaakpnompolbglelel/")
    277       .IsValid());
    278   EXPECT_EQ("chrome-extension://peoadpeiejnhkmpaakpnompolbglelel/",
    279       Pattern("chrome-extension://peoadpeiejnhkmpaakpnompolbglelel/")
    280           .ToString());
    281   EXPECT_TRUE(Pattern("chrome-extension://peoadpeiejnhkmpaakpnompolbglelel/")
    282       .Matches(GURL("chrome-extension://peoadpeiejnhkmpaakpnompolbglelel/")));
    283 }
    284 
    285 TEST(ContentSettingsPatternTest, FromString_WithIPAdresses) {
    286   // IPv4
    287   EXPECT_TRUE(Pattern("192.168.0.1").IsValid());
    288   EXPECT_STREQ("192.168.1.1", Pattern("192.168.1.1").ToString().c_str());
    289   EXPECT_TRUE(Pattern("https://192.168.0.1:8080").IsValid());
    290   EXPECT_STREQ("https://192.168.0.1:8080",
    291                Pattern("https://192.168.0.1:8080").ToString().c_str());
    292 
    293   // Subdomain wildcards should be only valid for hosts, not for IP addresses.
    294   EXPECT_FALSE(Pattern("[*.]127.0.0.1").IsValid());
    295 
    296   // IPv6
    297   EXPECT_TRUE(Pattern("[::1]").IsValid());
    298   EXPECT_STREQ("[::1]", Pattern("[::1]").ToString().c_str());
    299   EXPECT_TRUE(Pattern("https://[::1]:8080").IsValid());
    300   EXPECT_STREQ("https://[::1]:8080",
    301                Pattern("https://[::1]:8080").ToString().c_str());
    302 }
    303 
    304 TEST(ContentSettingsPatternTest, FromString_WithWildcards) {
    305   // Creating content settings patterns from strings completes pattern parts
    306   // that are omitted in pattern specifications (strings) with a wildcard.
    307 
    308   // The wildcard pattern.
    309   EXPECT_TRUE(Pattern("*").IsValid());
    310   EXPECT_STREQ("*", Pattern("*").ToString().c_str());
    311   EXPECT_EQ(ContentSettingsPattern::IDENTITY,
    312             Pattern("*").Compare(ContentSettingsPattern::Wildcard()));
    313 
    314   // Patterns with port wildcard.
    315   EXPECT_TRUE(Pattern("http://example.com:*").IsValid());
    316   EXPECT_STREQ("http://example.com",
    317                Pattern("http://example.com:*").ToString().c_str());
    318 
    319   EXPECT_TRUE(Pattern("https://example.com").IsValid());
    320   EXPECT_STREQ("https://example.com",
    321                Pattern("https://example.com").ToString().c_str());
    322 
    323   EXPECT_TRUE(Pattern("*://www.google.com.com:8080").IsValid());
    324   EXPECT_STREQ("www.google.com:8080",
    325                Pattern("*://www.google.com:8080").ToString().c_str());
    326   EXPECT_TRUE(Pattern("*://www.google.com:8080").Matches(
    327       GURL("http://www.google.com:8080")));
    328   EXPECT_TRUE(Pattern("*://www.google.com:8080").Matches(
    329       GURL("https://www.google.com:8080")));
    330   EXPECT_FALSE(
    331       Pattern("*://www.google.com").Matches(GURL("file:///foo/bar.html")));
    332 
    333   EXPECT_TRUE(Pattern("www.example.com:8080").IsValid());
    334 
    335   // Patterns with port and scheme wildcard.
    336   EXPECT_TRUE(Pattern("*://www.example.com:*").IsValid());
    337   EXPECT_STREQ("www.example.com",
    338                Pattern("*://www.example.com:*").ToString().c_str());
    339 
    340   EXPECT_TRUE(Pattern("*://www.example.com").IsValid());
    341   EXPECT_STREQ("www.example.com",
    342                Pattern("*://www.example.com").ToString().c_str());
    343 
    344   EXPECT_TRUE(Pattern("www.example.com:*").IsValid());
    345   EXPECT_STREQ("www.example.com",
    346                Pattern("www.example.com:*").ToString().c_str());
    347 
    348   EXPECT_TRUE(Pattern("www.example.com").IsValid());
    349   EXPECT_STREQ("www.example.com",
    350                Pattern("www.example.com").ToString().c_str());
    351   EXPECT_TRUE(Pattern("www.example.com").Matches(
    352       GURL("http://www.example.com/")));
    353   EXPECT_FALSE(Pattern("example.com").Matches(
    354       GURL("http://example.org/")));
    355 
    356   // Patterns with domain wildcard.
    357   EXPECT_TRUE(Pattern("[*.]example.com").IsValid());
    358   EXPECT_STREQ("[*.]example.com",
    359                Pattern("[*.]example.com").ToString().c_str());
    360   EXPECT_TRUE(Pattern("[*.]example.com").Matches(
    361       GURL("http://example.com/")));
    362   EXPECT_TRUE(Pattern("[*.]example.com").Matches(
    363       GURL("http://foo.example.com/")));
    364   EXPECT_FALSE(Pattern("[*.]example.com").Matches(
    365       GURL("http://example.org/")));
    366 
    367   EXPECT_TRUE(Pattern("[*.]google.com:80").Matches(
    368       GURL("http://mail.google.com:80")));
    369   EXPECT_FALSE(Pattern("[*.]google.com:80").Matches(
    370       GURL("http://mail.google.com:81")));
    371   EXPECT_TRUE(Pattern("[*.]google.com:80").Matches(
    372       GURL("http://www.google.com")));
    373 
    374   EXPECT_TRUE(Pattern("[*.]google.com:8080").Matches(
    375       GURL("http://mail.google.com:8080")));
    376 
    377   EXPECT_TRUE(Pattern("[*.]google.com:443").Matches(
    378       GURL("https://mail.google.com:443")));
    379   EXPECT_TRUE(Pattern("[*.]google.com:443").Matches(
    380       GURL("https://www.google.com")));
    381 
    382   EXPECT_TRUE(Pattern("[*.]google.com:4321").Matches(
    383       GURL("https://mail.google.com:4321")));
    384   EXPECT_TRUE(Pattern("[*.]example.com").Matches(
    385       GURL("http://example.com/")));
    386   EXPECT_TRUE(Pattern("[*.]example.com").Matches(
    387       GURL("http://www.example.com/")));
    388 
    389   // Patterns with host wildcard
    390   EXPECT_TRUE(Pattern("[*.]").IsValid());
    391   EXPECT_TRUE(Pattern("http://*").IsValid());
    392   EXPECT_TRUE(Pattern("http://[*.]").IsValid());
    393   EXPECT_EQ(std::string("http://*"), Pattern("http://[*.]").ToString());
    394   EXPECT_TRUE(Pattern("http://*:8080").IsValid());
    395   EXPECT_TRUE(Pattern("*://*").IsValid());
    396   EXPECT_STREQ("*", Pattern("*://*").ToString().c_str());
    397 }
    398 
    399 TEST(ContentSettingsPatternTest, FromString_Canonicalized) {
    400   // UTF-8 patterns.
    401   EXPECT_TRUE(Pattern("[*.]\xC4\x87ira.com").IsValid());
    402   EXPECT_STREQ("[*.]xn--ira-ppa.com",
    403                Pattern("[*.]\xC4\x87ira.com").ToString().c_str());
    404   EXPECT_TRUE(Pattern("\xC4\x87ira.com").IsValid());
    405   EXPECT_STREQ("xn--ira-ppa.com",
    406                Pattern("\xC4\x87ira.com").ToString().c_str());
    407   EXPECT_TRUE(Pattern("file:///\xC4\x87ira.html").IsValid());
    408   EXPECT_STREQ("file:///%C4%87ira.html",
    409                Pattern("file:///\xC4\x87ira.html").ToString().c_str());
    410 
    411   // File path normalization.
    412   EXPECT_TRUE(Pattern("file:///tmp/bar/../test.html").IsValid());
    413   EXPECT_STREQ("file:///tmp/test.html",
    414                Pattern("file:///tmp/bar/../test.html").ToString().c_str());
    415 }
    416 
    417 TEST(ContentSettingsPatternTest, InvalidPatterns) {
    418   // StubObserver expects an empty pattern top be returned as empty string.
    419   EXPECT_FALSE(ContentSettingsPattern().IsValid());
    420   EXPECT_STREQ("", ContentSettingsPattern().ToString().c_str());
    421 
    422   // Empty pattern string
    423   EXPECT_FALSE(Pattern(std::string()).IsValid());
    424   EXPECT_STREQ("", Pattern(std::string()).ToString().c_str());
    425 
    426   // Pattern strings with invalid scheme part.
    427   EXPECT_FALSE(Pattern("ftp://myhost.org").IsValid());
    428   EXPECT_STREQ("", Pattern("ftp://myhost.org").ToString().c_str());
    429 
    430   // Pattern strings with invalid host part.
    431   EXPECT_FALSE(Pattern("*example.com").IsValid());
    432   EXPECT_STREQ("", Pattern("*example.com").ToString().c_str());
    433   EXPECT_FALSE(Pattern("example.*").IsValid());
    434   EXPECT_STREQ("", Pattern("example.*").ToString().c_str());
    435   EXPECT_FALSE(Pattern("*\xC4\x87ira.com").IsValid());
    436   EXPECT_STREQ("", Pattern("*\xC4\x87ira.com").ToString().c_str());
    437   EXPECT_FALSE(Pattern("\xC4\x87ira.*").IsValid());
    438   EXPECT_STREQ("", Pattern("\xC4\x87ira.*").ToString().c_str());
    439 
    440   // Pattern strings with invalid port parts.
    441   EXPECT_FALSE(Pattern("example.com:abc").IsValid());
    442   EXPECT_STREQ("", Pattern("example.com:abc").ToString().c_str());
    443 
    444   // Invalid file pattern strings.
    445   EXPECT_FALSE(Pattern("file://").IsValid());
    446   EXPECT_STREQ("", Pattern("file://").ToString().c_str());
    447   EXPECT_FALSE(Pattern("file:///foo/bar.html:8080").IsValid());
    448   EXPECT_STREQ("", Pattern("file:///foo/bar.html:8080").ToString().c_str());
    449 
    450   // Host having multiple ending dots.
    451   EXPECT_FALSE(Pattern("www.example.com..").IsValid());
    452   EXPECT_STREQ("", Pattern("www.example.com..").ToString().c_str());
    453 }
    454 
    455 TEST(ContentSettingsPatternTest, UnequalOperator) {
    456   EXPECT_TRUE(Pattern("http://www.foo.com") != Pattern("http://www.foo.com*"));
    457   EXPECT_TRUE(Pattern("http://www.foo.com*") !=
    458               ContentSettingsPattern::Wildcard());
    459 
    460   EXPECT_TRUE(Pattern("http://www.foo.com") !=
    461               ContentSettingsPattern::Wildcard());
    462 
    463   EXPECT_TRUE(Pattern("http://www.foo.com") != Pattern("www.foo.com"));
    464   EXPECT_TRUE(Pattern("http://www.foo.com") !=
    465               Pattern("http://www.foo.com:80"));
    466 
    467   EXPECT_FALSE(Pattern("http://www.foo.com") != Pattern("http://www.foo.com"));
    468   EXPECT_TRUE(Pattern("http://www.foo.com") == Pattern("http://www.foo.com"));
    469 }
    470 
    471 TEST(ContentSettingsPatternTest, Compare) {
    472   // Test identical patterns patterns.
    473   ContentSettingsPattern pattern1 =
    474       Pattern("http://www.google.com");
    475   EXPECT_EQ(ContentSettingsPattern::IDENTITY, pattern1.Compare(pattern1));
    476   EXPECT_EQ(ContentSettingsPattern::IDENTITY,
    477             Pattern("http://www.google.com:80").Compare(
    478                 Pattern("http://www.google.com:80")));
    479   EXPECT_EQ(ContentSettingsPattern::IDENTITY,
    480             Pattern("*://[*.]google.com:*").Compare(
    481                 Pattern("*://[*.]google.com:*")));
    482 
    483   ContentSettingsPattern invalid_pattern1;
    484   ContentSettingsPattern invalid_pattern2 =
    485       ContentSettingsPattern::FromString("google.com*");
    486 
    487   // Compare invalid patterns.
    488   EXPECT_TRUE(!invalid_pattern1.IsValid());
    489   EXPECT_TRUE(!invalid_pattern2.IsValid());
    490   EXPECT_EQ(ContentSettingsPattern::IDENTITY,
    491             invalid_pattern1.Compare(invalid_pattern2));
    492   EXPECT_TRUE(invalid_pattern1 == invalid_pattern2);
    493 
    494   // Compare a pattern with an IPv4 addresse to a pattern with a domain name.
    495   EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_POST,
    496             Pattern("http://www.google.com").Compare(
    497                 Pattern("127.0.0.1")));
    498   EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
    499             Pattern("127.0.0.1").Compare(
    500                 Pattern("http://www.google.com")));
    501   EXPECT_TRUE(Pattern("127.0.0.1") > Pattern("http://www.google.com"));
    502   EXPECT_TRUE(Pattern("http://www.google.com") < Pattern("127.0.0.1"));
    503 
    504   // Compare a pattern with an IPv6 address to a patterns with a domain name.
    505   EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_POST,
    506             Pattern("http://www.google.com").Compare(
    507                 Pattern("[::1]")));
    508   EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
    509             Pattern("[::1]").Compare(
    510                 Pattern("http://www.google.com")));
    511   EXPECT_TRUE(Pattern("[::1]") > Pattern("http://www.google.com"));
    512   EXPECT_TRUE(Pattern("http://www.google.com") < Pattern("[::1]"));
    513 
    514   // Compare a pattern with an IPv6 addresse to a pattern with an IPv4 addresse.
    515   EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
    516             Pattern("127.0.0.1").Compare(
    517                 Pattern("[::1]")));
    518   EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_POST,
    519             Pattern("[::1]").Compare(
    520                 Pattern("127.0.0.1")));
    521   EXPECT_TRUE(Pattern("[::1]") < Pattern("127.0.0.1"));
    522   EXPECT_TRUE(Pattern("127.0.0.1") > Pattern("[::1]"));
    523 
    524   EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
    525             Pattern("http://www.google.com").Compare(
    526                 Pattern("http://www.youtube.com")));
    527   EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
    528             Pattern("http://[*.]google.com").Compare(
    529                 Pattern("http://[*.]youtube.com")));
    530 
    531   EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_POST,
    532             Pattern("http://[*.]host.com").Compare(
    533                 Pattern("http://[*.]evilhost.com")));
    534   EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_POST,
    535             Pattern("*://www.google.com:80").Compare(
    536                 Pattern("*://www.google.com:8080")));
    537   EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
    538             Pattern("https://www.google.com:80").Compare(
    539                 Pattern("http://www.google.com:80")));
    540 
    541   EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
    542             Pattern("http://[*.]google.com:90").Compare(
    543                 Pattern("http://mail.google.com:80")));
    544   EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
    545             Pattern("https://[*.]google.com:80").Compare(
    546                 Pattern("http://mail.google.com:80")));
    547   EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
    548             Pattern("https://mail.google.com:*").Compare(
    549                 Pattern("http://mail.google.com:80")));
    550 
    551   // Test patterns with different precedences.
    552   EXPECT_EQ(ContentSettingsPattern::PREDECESSOR,
    553             Pattern("mail.google.com").Compare(
    554                 Pattern("[*.]google.com")));
    555   EXPECT_EQ(ContentSettingsPattern::SUCCESSOR,
    556             Pattern("[*.]google.com").Compare(
    557                 Pattern("mail.google.com")));
    558 
    559   EXPECT_EQ(ContentSettingsPattern::PREDECESSOR,
    560             Pattern("[*.]mail.google.com").Compare(
    561                 Pattern("[*.]google.com")));
    562   EXPECT_EQ(ContentSettingsPattern::SUCCESSOR,
    563             Pattern("[*.]google.com").Compare(
    564                 Pattern("[*.]mail.google.com")));
    565 
    566   EXPECT_EQ(ContentSettingsPattern::PREDECESSOR,
    567             Pattern("mail.google.com:80").Compare(
    568                 Pattern("mail.google.com:*")));
    569   EXPECT_EQ(ContentSettingsPattern::SUCCESSOR,
    570             Pattern("mail.google.com:*").Compare(
    571                 Pattern("mail.google.com:80")));
    572 
    573   EXPECT_EQ(ContentSettingsPattern::PREDECESSOR,
    574             Pattern("https://mail.google.com:*").Compare(
    575                 Pattern("*://mail.google.com:*")));
    576   EXPECT_EQ(ContentSettingsPattern::SUCCESSOR,
    577             Pattern("*://mail.google.com:*").Compare(
    578                 Pattern("https://mail.google.com:*")));
    579 
    580   EXPECT_EQ(ContentSettingsPattern::PREDECESSOR,
    581             Pattern("*://mail.google.com:80").Compare(
    582                 Pattern("https://mail.google.com:*")));
    583   EXPECT_EQ(ContentSettingsPattern::SUCCESSOR,
    584             Pattern("https://mail.google.com:*").Compare(
    585                 Pattern("*://mail.google.com:80")));
    586 
    587   // Test the wildcard pattern.
    588   EXPECT_EQ(ContentSettingsPattern::IDENTITY,
    589             ContentSettingsPattern::Wildcard().Compare(
    590                 ContentSettingsPattern::Wildcard()));
    591 
    592   EXPECT_EQ(ContentSettingsPattern::PREDECESSOR,
    593             Pattern("[*.]google.com").Compare(
    594                 ContentSettingsPattern::Wildcard()));
    595   EXPECT_EQ(ContentSettingsPattern::SUCCESSOR,
    596             ContentSettingsPattern::Wildcard().Compare(
    597                  Pattern("[*.]google.com")));
    598 
    599   EXPECT_EQ(ContentSettingsPattern::PREDECESSOR,
    600             Pattern("mail.google.com").Compare(
    601                 ContentSettingsPattern::Wildcard()));
    602   EXPECT_EQ(ContentSettingsPattern::SUCCESSOR,
    603             ContentSettingsPattern::Wildcard().Compare(
    604                  Pattern("mail.google.com")));
    605 }
    606 
    607 // Legacy tests to ensure backwards compatibility.
    608 
    609 TEST(ContentSettingsPatternTest, PatternSupport_Legacy) {
    610   EXPECT_TRUE(Pattern("[*.]example.com").IsValid());
    611   EXPECT_TRUE(Pattern("example.com").IsValid());
    612   EXPECT_TRUE(Pattern("192.168.0.1").IsValid());
    613   EXPECT_TRUE(Pattern("[::1]").IsValid());
    614   EXPECT_TRUE(
    615       Pattern("file:///tmp/test.html").IsValid());
    616   EXPECT_FALSE(Pattern("*example.com").IsValid());
    617   EXPECT_FALSE(Pattern("example.*").IsValid());
    618 
    619   EXPECT_TRUE(
    620       Pattern("http://example.com").IsValid());
    621   EXPECT_TRUE(
    622       Pattern("https://example.com").IsValid());
    623 
    624   EXPECT_TRUE(Pattern("[*.]example.com").Matches(
    625               GURL("http://example.com/")));
    626   EXPECT_TRUE(Pattern("[*.]example.com").Matches(
    627               GURL("http://www.example.com/")));
    628   EXPECT_TRUE(Pattern("www.example.com").Matches(
    629               GURL("http://www.example.com/")));
    630   EXPECT_TRUE(
    631       Pattern("file:///tmp/test.html").Matches(
    632               GURL("file:///tmp/test.html")));
    633   EXPECT_FALSE(Pattern(std::string()).Matches(GURL("http://www.example.com/")));
    634   EXPECT_FALSE(Pattern("[*.]example.com").Matches(
    635                GURL("http://example.org/")));
    636   EXPECT_FALSE(Pattern("example.com").Matches(
    637                GURL("http://example.org/")));
    638   EXPECT_FALSE(
    639       Pattern("file:///tmp/test.html").Matches(
    640                GURL("file:///tmp/other.html")));
    641   EXPECT_FALSE(
    642       Pattern("file:///tmp/test.html").Matches(
    643                GURL("http://example.org/")));
    644 }
    645 
    646 TEST(ContentSettingsPatternTest, CanonicalizePattern_Legacy) {
    647   // Basic patterns.
    648   EXPECT_STREQ("[*.]ikea.com", Pattern("[*.]ikea.com").ToString().c_str());
    649   EXPECT_STREQ("example.com", Pattern("example.com").ToString().c_str());
    650   EXPECT_STREQ("192.168.1.1", Pattern("192.168.1.1").ToString().c_str());
    651   EXPECT_STREQ("[::1]", Pattern("[::1]").ToString().c_str());
    652   EXPECT_STREQ("file:///tmp/file.html",
    653                Pattern("file:///tmp/file.html").ToString().c_str());
    654 
    655   // UTF-8 patterns.
    656   EXPECT_STREQ("[*.]xn--ira-ppa.com",
    657                Pattern("[*.]\xC4\x87ira.com").ToString().c_str());
    658   EXPECT_STREQ("xn--ira-ppa.com",
    659                Pattern("\xC4\x87ira.com").ToString().c_str());
    660   EXPECT_STREQ("file:///%C4%87ira.html",
    661                Pattern("file:///\xC4\x87ira.html").ToString().c_str());
    662 
    663   // file:/// normalization.
    664   EXPECT_STREQ("file:///tmp/test.html",
    665                Pattern("file:///tmp/bar/../test.html").ToString().c_str());
    666 
    667   // Invalid patterns.
    668   EXPECT_STREQ("", Pattern("*example.com").ToString().c_str());
    669   EXPECT_STREQ("", Pattern("example.*").ToString().c_str());
    670   EXPECT_STREQ("", Pattern("*\xC4\x87ira.com").ToString().c_str());
    671   EXPECT_STREQ("", Pattern("\xC4\x87ira.*").ToString().c_str());
    672 }
    673