15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/content_settings_pattern.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSettingsPattern Pattern(const std::string& str) {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ContentSettingsPattern::FromString(str);
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, RealWorldPatterns) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is the place for real world patterns that unveiled bugs.
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("[*.]ikea.com",
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("[*.]ikea.com").ToString().c_str());
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, GURL) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Document and verify GURL behavior.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://mail.google.com:80");
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-1, url.IntPort());
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", url.port());
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = GURL("http://mail.google.com");
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-1, url.IntPort());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", url.port());
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = GURL("https://mail.google.com:443");
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-1, url.IntPort());
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", url.port());
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = GURL("https://mail.google.com");
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-1, url.IntPort());
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", url.port());
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url = GURL("http://mail.google.com");
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(-1, url.IntPort());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", url.port());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, FromURL) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTICE: When content settings pattern are created from a GURL the following
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // happens:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - If the GURL scheme is "http" the scheme wildcard is used. Otherwise the
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   GURL scheme is used.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - A domain wildcard is added to the GURL host.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // - A port wildcard is used instead of the schemes default port.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   In case of non-default ports the specific GURL port is used.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern pattern = ContentSettingsPattern::FromURL(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.youtube.com"));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.IsValid());
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("[*.]www.youtube.com", pattern.ToString().c_str());
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Patterns created from a URL.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern = ContentSettingsPattern::FromURL(GURL("http://www.google.com"));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("http://www.google.com")));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("http://foo.www.google.com")));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("http://www.google.com:80")));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("http://www.google.com:81")));
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pattern.Matches(GURL("https://mail.google.com")));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("https://www.google.com")));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern = ContentSettingsPattern::FromURL(GURL("http://www.google.com:80"));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("http://www.google.com")));
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("http://www.google.com:80")));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("http://www.google.com:81")));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern = ContentSettingsPattern::FromURL(GURL("https://www.google.com:443"));
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("https://www.google.com")));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("https://foo.www.google.com")));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("https://www.google.com:443")));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pattern.Matches(GURL("https://www.google.com:444")));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pattern.Matches(GURL("http://www.google.com:443")));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern = ContentSettingsPattern::FromURL(GURL("https://127.0.0.1"));
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.IsValid());
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("https://127.0.0.1:443", pattern.ToString().c_str());
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern = ContentSettingsPattern::FromURL(GURL("http://[::1]"));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.IsValid());
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern = ContentSettingsPattern::FromURL(GURL("file:///foo/bar.html"));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.IsValid());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("file:///foo/bar.html", pattern.ToString());
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, FilesystemUrls) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern pattern =
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURL(GURL("http://www.google.com"));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("filesystem:http://www.google.com/temporary/")));
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("filesystem:http://foo.www.google.com/temporary/")));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("filesystem:http://www.google.com:80/temporary/")));
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("filesystem:http://www.google.com:81/temporary/")));
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern = ContentSettingsPattern::FromURL(GURL("https://www.google.com"));
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("filesystem:https://www.google.com/temporary/")));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("filesystem:https://www.google.com:443/temporary/")));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("filesystem:https://foo.www.google.com/temporary/")));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pattern.Matches(
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("filesystem:https://www.google.com:81/temporary/")));
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A pattern from a filesystem URLs is equivalent to a pattern from the inner
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URL of the filesystem URL.
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern pattern2 = ContentSettingsPattern::FromURL(
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("filesystem:https://www.google.com/temporary/"));
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::IDENTITY, pattern.Compare(pattern2));
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("https://[*.]www.google.com:443", pattern2.ToString().c_str());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern =
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURL(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GURL("filesystem:file:///temporary/foo/bar"));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("filesystem:file:///temporary/")));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("filesystem:file:///temporary/test.txt")));
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("file:///temporary")));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pattern.Matches(GURL("file://foo/bar")));
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern2 =
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURL(
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GURL("filesystem:file:///persistent/foo2/bar2"));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::IDENTITY, pattern.Compare(pattern2));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, FromURLNoWildcard) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If no port is specifed GURLs always use the default port for the schemes
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HTTP and HTTPS. Hence a GURL always carries a port specification either
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // explicitly or implicitly. Therefore if a content settings pattern is
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // created from a GURL with no wildcard, specific values are used for the
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // scheme, host and port part of the pattern.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creating content settings patterns from strings behaves different. Pattern
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // parts that are omitted in pattern specifications (strings), are completed
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // with a wildcard.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern pattern = ContentSettingsPattern::FromURLNoWildcard(
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.example.com"));
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.IsValid());
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("http://www.example.com:80", pattern.ToString().c_str());
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("http://www.example.com")));
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pattern.Matches(GURL("https://www.example.com")));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pattern.Matches(GURL("http://foo.www.example.com")));
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern = ContentSettingsPattern::FromURLNoWildcard(
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("https://www.example.com"));
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.IsValid());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("https://www.example.com:443", pattern.ToString().c_str());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pattern.Matches(GURL("http://www.example.com")));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("https://www.example.com")));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pattern.Matches(GURL("http://foo.www.example.com")));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Pattern for filesystem URLs
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pattern =
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURLNoWildcard(
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GURL("filesystem:http://www.google.com/temporary/"));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.IsValid());
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(GURL("http://www.google.com")));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pattern.Matches(GURL("http://foo.www.google.com")));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pattern.Matches(
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("filesystem:http://www.google.com/persistent/")));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pattern.Matches(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("filesystem:https://www.google.com/persistent/")));
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pattern.Matches(
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("filesystem:https://www.google.com:81/temporary/")));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(pattern.Matches(
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("filesystem:https://foo.www.google.com/temporary/")));
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, Wildcard) {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContentSettingsPattern::Wildcard().IsValid());
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContentSettingsPattern::Wildcard().Matches(
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.google.com")));
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContentSettingsPattern::Wildcard().Matches(
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("https://www.google.com")));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContentSettingsPattern::Wildcard().Matches(
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("https://myhost:8080")));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ContentSettingsPattern::Wildcard().Matches(
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("file:///foo/bar.txt")));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("*", ContentSettingsPattern::Wildcard().ToString().c_str());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::IDENTITY,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ContentSettingsPattern::Wildcard().Compare(
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ContentSettingsPattern::Wildcard()));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, TrimEndingDotFromHost) {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("www.example.com").IsValid());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("www.example.com").Matches(
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.example.com")));
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("www.example.com").Matches(
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.example.com.")));
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("www.example.com.").IsValid());
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("www.example.com",
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("www.example.com.").ToString().c_str());
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("www.example.com.") == Pattern("www.example.com"));
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(Pattern(".").IsValid());
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_STREQ(".", Pattern(".").ToString().c_str());
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, FromString_WithNoWildcards) {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HTTP patterns with default port.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("http://www.example.com:80").IsValid());
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("http://www.example.com:80",
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("http://www.example.com:80").ToString().c_str());
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HTTP patterns with none default port.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("http://www.example.com:81").IsValid());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("http://www.example.com:81",
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("http://www.example.com:81").ToString().c_str());
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HTTPS patterns with default port.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("https://www.example.com:443").IsValid());
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("https://www.example.com:443",
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("https://www.example.com:443").ToString().c_str());
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // HTTPS patterns with none default port.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("https://www.example.com:8080").IsValid());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("https://www.example.com:8080",
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("https://www.example.com:8080").ToString().c_str());
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, FromString_FilePatterns) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "/" is an invalid file path.
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file:///").IsValid());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Non-empty domains aren't allowed in file patterns.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file://foo/").IsValid());
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file://localhost/foo/bar/test.html").IsValid());
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file://*").IsValid());
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file://*/").IsValid());
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file://*/*").IsValid());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file://*/foo/bar/test.html").IsValid());
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file://[*.]/").IsValid());
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is the only valid file path wildcard format.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("file:///*").IsValid());
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("file:///*", Pattern("file:///*").ToString());
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wildcards are not allowed anywhere in the file path.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file:///f*o/bar/file.html").IsValid());
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file:///*/bar/file.html").IsValid());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file:///foo/*").IsValid());
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file:///foo/bar/*").IsValid());
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file:///foo/*/file.html").IsValid());
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file:///foo/bar/*.html").IsValid());
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file:///foo/bar/file.*").IsValid());
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("file:///tmp/test.html").IsValid());
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("file:///tmp/file.html",
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("file:///tmp/file.html").ToString());
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("file:///tmp/test.html").Matches(
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("file:///tmp/test.html")));
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file:///tmp/test.html").Matches(
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("file:///tmp/other.html")));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file:///tmp/test.html").Matches(
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://example.org/")));
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("file:///*").Matches(GURL("file:///tmp/test.html")));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("file:///*").Matches(
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("file://localhost/tmp/test.html")));
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, FromString_ExtensionPatterns) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("chrome-extension://peoadpeiejnhkmpaakpnompolbglelel/")
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .IsValid());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("chrome-extension://peoadpeiejnhkmpaakpnompolbglelel/",
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Pattern("chrome-extension://peoadpeiejnhkmpaakpnompolbglelel/")
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          .ToString());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("chrome-extension://peoadpeiejnhkmpaakpnompolbglelel/")
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      .Matches(GURL("chrome-extension://peoadpeiejnhkmpaakpnompolbglelel/")));
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, FromString_WithIPAdresses) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPv4
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("192.168.0.1").IsValid());
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("192.168.1.1", Pattern("192.168.1.1").ToString().c_str());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("https://192.168.0.1:8080").IsValid());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("https://192.168.0.1:8080",
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("https://192.168.0.1:8080").ToString().c_str());
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Subdomain wildcards should be only valid for hosts, not for IP addresses.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("[*.]127.0.0.1").IsValid());
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPv6
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[::1]").IsValid());
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("[::1]", Pattern("[::1]").ToString().c_str());
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("https://[::1]:8080").IsValid());
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("https://[::1]:8080",
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("https://[::1]:8080").ToString().c_str());
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, FromString_WithWildcards) {
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creating content settings patterns from strings completes pattern parts
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that are omitted in pattern specifications (strings) with a wildcard.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The wildcard pattern.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("*").IsValid());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("*", Pattern("*").ToString().c_str());
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::IDENTITY,
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("*").Compare(ContentSettingsPattern::Wildcard()));
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Patterns with port wildcard.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("http://example.com:*").IsValid());
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("http://example.com",
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("http://example.com:*").ToString().c_str());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("https://example.com").IsValid());
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("https://example.com",
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("https://example.com").ToString().c_str());
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("*://www.google.com.com:8080").IsValid());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("www.google.com:8080",
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("*://www.google.com:8080").ToString().c_str());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("*://www.google.com:8080").Matches(
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.google.com:8080")));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("*://www.google.com:8080").Matches(
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("https://www.google.com:8080")));
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Pattern("*://www.google.com").Matches(GURL("file:///foo/bar.html")));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("www.example.com:8080").IsValid());
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Patterns with port and scheme wildcard.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("*://www.example.com:*").IsValid());
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("www.example.com",
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("*://www.example.com:*").ToString().c_str());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("*://www.example.com").IsValid());
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("www.example.com",
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("*://www.example.com").ToString().c_str());
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("www.example.com:*").IsValid());
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("www.example.com",
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("www.example.com:*").ToString().c_str());
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("www.example.com").IsValid());
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("www.example.com",
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("www.example.com").ToString().c_str());
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("www.example.com").Matches(
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.example.com/")));
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("example.com").Matches(
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://example.org/")));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Patterns with domain wildcard.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]example.com").IsValid());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("[*.]example.com",
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("[*.]example.com").ToString().c_str());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]example.com").Matches(
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://example.com/")));
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]example.com").Matches(
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://foo.example.com/")));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("[*.]example.com").Matches(
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://example.org/")));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]google.com:80").Matches(
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://mail.google.com:80")));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("[*.]google.com:80").Matches(
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://mail.google.com:81")));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]google.com:80").Matches(
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.google.com")));
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]google.com:8080").Matches(
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://mail.google.com:8080")));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]google.com:443").Matches(
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("https://mail.google.com:443")));
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]google.com:443").Matches(
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("https://www.google.com")));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]google.com:4321").Matches(
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("https://mail.google.com:4321")));
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]example.com").Matches(
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://example.com/")));
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]example.com").Matches(
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GURL("http://www.example.com/")));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Patterns with host wildcard
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]").IsValid());
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("http://*").IsValid());
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("http://[*.]").IsValid());
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(std::string("http://*"), Pattern("http://[*.]").ToString());
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("http://*:8080").IsValid());
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("*://*").IsValid());
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("*", Pattern("*://*").ToString().c_str());
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, FromString_Canonicalized) {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UTF-8 patterns.
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]\xC4\x87ira.com").IsValid());
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("[*.]xn--ira-ppa.com",
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("[*.]\xC4\x87ira.com").ToString().c_str());
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("\xC4\x87ira.com").IsValid());
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("xn--ira-ppa.com",
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("\xC4\x87ira.com").ToString().c_str());
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("file:///\xC4\x87ira.html").IsValid());
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("file:///%C4%87ira.html",
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("file:///\xC4\x87ira.html").ToString().c_str());
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // File path normalization.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("file:///tmp/bar/../test.html").IsValid());
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("file:///tmp/test.html",
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("file:///tmp/bar/../test.html").ToString().c_str());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, InvalidPatterns) {
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // StubObserver expects an empty pattern top be returned as empty string.
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ContentSettingsPattern().IsValid());
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", ContentSettingsPattern().ToString().c_str());
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Empty pattern string
423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(Pattern(std::string()).IsValid());
424c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_STREQ("", Pattern(std::string()).ToString().c_str());
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pattern strings with invalid scheme part.
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("ftp://myhost.org").IsValid());
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", Pattern("ftp://myhost.org").ToString().c_str());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pattern strings with invalid host part.
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("*example.com").IsValid());
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", Pattern("*example.com").ToString().c_str());
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("example.*").IsValid());
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", Pattern("example.*").ToString().c_str());
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("*\xC4\x87ira.com").IsValid());
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", Pattern("*\xC4\x87ira.com").ToString().c_str());
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("\xC4\x87ira.*").IsValid());
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", Pattern("\xC4\x87ira.*").ToString().c_str());
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pattern strings with invalid port parts.
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("example.com:abc").IsValid());
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", Pattern("example.com:abc").ToString().c_str());
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invalid file pattern strings.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file://").IsValid());
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", Pattern("file://").ToString().c_str());
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("file:///foo/bar.html:8080").IsValid());
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", Pattern("file:///foo/bar.html:8080").ToString().c_str());
449c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
450c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Host having multiple ending dots.
451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(Pattern("www.example.com..").IsValid());
452c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_STREQ("", Pattern("www.example.com..").ToString().c_str());
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, UnequalOperator) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("http://www.foo.com") != Pattern("http://www.foo.com*"));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("http://www.foo.com*") !=
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ContentSettingsPattern::Wildcard());
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("http://www.foo.com") !=
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ContentSettingsPattern::Wildcard());
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("http://www.foo.com") != Pattern("www.foo.com"));
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("http://www.foo.com") !=
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Pattern("http://www.foo.com:80"));
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("http://www.foo.com") != Pattern("http://www.foo.com"));
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("http://www.foo.com") == Pattern("http://www.foo.com"));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, Compare) {
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test identical patterns patterns.
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern pattern1 =
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Pattern("http://www.google.com");
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::IDENTITY, pattern1.Compare(pattern1));
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::IDENTITY,
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("http://www.google.com:80").Compare(
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("http://www.google.com:80")));
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::IDENTITY,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("*://[*.]google.com:*").Compare(
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("*://[*.]google.com:*")));
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern invalid_pattern1;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern invalid_pattern2 =
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromString("google.com*");
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compare invalid patterns.
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(!invalid_pattern1.IsValid());
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(!invalid_pattern2.IsValid());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::IDENTITY,
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            invalid_pattern1.Compare(invalid_pattern2));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(invalid_pattern1 == invalid_pattern2);
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compare a pattern with an IPv4 addresse to a pattern with a domain name.
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_POST,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("http://www.google.com").Compare(
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("127.0.0.1")));
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("127.0.0.1").Compare(
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("http://www.google.com")));
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("127.0.0.1") > Pattern("http://www.google.com"));
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("http://www.google.com") < Pattern("127.0.0.1"));
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compare a pattern with an IPv6 address to a patterns with a domain name.
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_POST,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("http://www.google.com").Compare(
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("[::1]")));
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("[::1]").Compare(
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("http://www.google.com")));
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[::1]") > Pattern("http://www.google.com"));
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("http://www.google.com") < Pattern("[::1]"));
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compare a pattern with an IPv6 addresse to a pattern with an IPv4 addresse.
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("127.0.0.1").Compare(
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("[::1]")));
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_POST,
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("[::1]").Compare(
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("127.0.0.1")));
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[::1]") < Pattern("127.0.0.1"));
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("127.0.0.1") > Pattern("[::1]"));
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("http://www.google.com").Compare(
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("http://www.youtube.com")));
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("http://[*.]google.com").Compare(
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("http://[*.]youtube.com")));
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_POST,
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("http://[*.]host.com").Compare(
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("http://[*.]evilhost.com")));
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_POST,
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("*://www.google.com:80").Compare(
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("*://www.google.com:8080")));
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("https://www.google.com:80").Compare(
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("http://www.google.com:80")));
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("http://[*.]google.com:90").Compare(
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("http://mail.google.com:80")));
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("https://[*.]google.com:80").Compare(
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("http://mail.google.com:80")));
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::DISJOINT_ORDER_PRE,
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("https://mail.google.com:*").Compare(
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("http://mail.google.com:80")));
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test patterns with different precedences.
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::PREDECESSOR,
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("mail.google.com").Compare(
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("[*.]google.com")));
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::SUCCESSOR,
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("[*.]google.com").Compare(
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("mail.google.com")));
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::PREDECESSOR,
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("[*.]mail.google.com").Compare(
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("[*.]google.com")));
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::SUCCESSOR,
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("[*.]google.com").Compare(
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("[*.]mail.google.com")));
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::PREDECESSOR,
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("mail.google.com:80").Compare(
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("mail.google.com:*")));
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::SUCCESSOR,
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("mail.google.com:*").Compare(
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("mail.google.com:80")));
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::PREDECESSOR,
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("https://mail.google.com:*").Compare(
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("*://mail.google.com:*")));
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::SUCCESSOR,
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("*://mail.google.com:*").Compare(
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("https://mail.google.com:*")));
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::PREDECESSOR,
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("*://mail.google.com:80").Compare(
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("https://mail.google.com:*")));
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::SUCCESSOR,
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("https://mail.google.com:*").Compare(
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                Pattern("*://mail.google.com:80")));
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test the wildcard pattern.
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::IDENTITY,
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ContentSettingsPattern::Wildcard().Compare(
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ContentSettingsPattern::Wildcard()));
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::PREDECESSOR,
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("[*.]google.com").Compare(
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ContentSettingsPattern::Wildcard()));
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::SUCCESSOR,
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ContentSettingsPattern::Wildcard().Compare(
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 Pattern("[*.]google.com")));
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::PREDECESSOR,
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            Pattern("mail.google.com").Compare(
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                ContentSettingsPattern::Wildcard()));
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ContentSettingsPattern::SUCCESSOR,
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ContentSettingsPattern::Wildcard().Compare(
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 Pattern("mail.google.com")));
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Legacy tests to ensure backwards compatibility.
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, PatternSupport_Legacy) {
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]example.com").IsValid());
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("example.com").IsValid());
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("192.168.0.1").IsValid());
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[::1]").IsValid());
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Pattern("file:///tmp/test.html").IsValid());
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("*example.com").IsValid());
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("example.*").IsValid());
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Pattern("http://example.com").IsValid());
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Pattern("https://example.com").IsValid());
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]example.com").Matches(
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GURL("http://example.com/")));
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("[*.]example.com").Matches(
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GURL("http://www.example.com/")));
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Pattern("www.example.com").Matches(
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GURL("http://www.example.com/")));
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Pattern("file:///tmp/test.html").Matches(
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              GURL("file:///tmp/test.html")));
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(Pattern(std::string()).Matches(GURL("http://www.example.com/")));
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("[*.]example.com").Matches(
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               GURL("http://example.org/")));
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(Pattern("example.com").Matches(
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               GURL("http://example.org/")));
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Pattern("file:///tmp/test.html").Matches(
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               GURL("file:///tmp/other.html")));
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Pattern("file:///tmp/test.html").Matches(
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               GURL("http://example.org/")));
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(ContentSettingsPatternTest, CanonicalizePattern_Legacy) {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Basic patterns.
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("[*.]ikea.com", Pattern("[*.]ikea.com").ToString().c_str());
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("example.com", Pattern("example.com").ToString().c_str());
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("192.168.1.1", Pattern("192.168.1.1").ToString().c_str());
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("[::1]", Pattern("[::1]").ToString().c_str());
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("file:///tmp/file.html",
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("file:///tmp/file.html").ToString().c_str());
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // UTF-8 patterns.
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("[*.]xn--ira-ppa.com",
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("[*.]\xC4\x87ira.com").ToString().c_str());
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("xn--ira-ppa.com",
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("\xC4\x87ira.com").ToString().c_str());
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("file:///%C4%87ira.html",
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("file:///\xC4\x87ira.html").ToString().c_str());
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // file:/// normalization.
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("file:///tmp/test.html",
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               Pattern("file:///tmp/bar/../test.html").ToString().c_str());
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invalid patterns.
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", Pattern("*example.com").ToString().c_str());
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", Pattern("example.*").ToString().c_str());
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", Pattern("*\xC4\x87ira.com").ToString().c_str());
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_STREQ("", Pattern("\xC4\x87ira.*").ToString().c_str());
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
673