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 #include "chrome/common/content_settings_pattern_parser.h"
      7 
      8 #include "testing/gmock/include/gmock/gmock.h"
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 
     11 namespace {
     12 typedef ContentSettingsPattern::BuilderInterface BuilderInterface;
     13 }  // namespace
     14 
     15 class MockBuilder : public ContentSettingsPattern::BuilderInterface {
     16  public:
     17   MOCK_METHOD0(WithSchemeWildcard, BuilderInterface*());
     18   MOCK_METHOD0(WithDomainWildcard, BuilderInterface*());
     19   MOCK_METHOD0(WithPortWildcard, BuilderInterface*());
     20   MOCK_METHOD1(WithScheme, BuilderInterface*(const std::string& scheme));
     21   MOCK_METHOD1(WithHost, BuilderInterface*(const std::string& host));
     22   MOCK_METHOD1(WithPort, BuilderInterface*(const std::string& port));
     23   MOCK_METHOD1(WithPath, BuilderInterface*(const std::string& path));
     24   MOCK_METHOD0(WithPathWildcard, BuilderInterface*());
     25   MOCK_METHOD0(Invalid, BuilderInterface*());
     26   MOCK_METHOD0(Build, ContentSettingsPattern());
     27 };
     28 
     29 TEST(ContentSettingsPatternParserTest, ParsePatterns) {
     30   // Test valid patterns
     31   ::testing::StrictMock<MockBuilder> builder;
     32 
     33   // WithPathWildcard() is not called for "*". (Need a strict Mock for this
     34   // case.)
     35   EXPECT_CALL(builder, WithSchemeWildcard()).Times(1).WillOnce(
     36       ::testing::Return(&builder));
     37   EXPECT_CALL(builder, WithDomainWildcard()).Times(1).WillOnce(
     38       ::testing::Return(&builder));
     39   EXPECT_CALL(builder, WithPortWildcard()).Times(1).WillOnce(
     40       ::testing::Return(&builder));
     41   content_settings::PatternParser::Parse("*", &builder);
     42   ::testing::Mock::VerifyAndClear(&builder);
     43 
     44   EXPECT_CALL(builder, WithScheme("http")).Times(1).WillOnce(
     45       ::testing::Return(&builder));
     46   EXPECT_CALL(builder, WithHost("www.youtube.com")).Times(1).WillOnce(
     47       ::testing::Return(&builder));
     48   EXPECT_CALL(builder, WithPort("8080")).Times(1).WillOnce(
     49       ::testing::Return(&builder));
     50   content_settings::PatternParser::Parse(
     51       "http://www.youtube.com:8080", &builder);
     52   ::testing::Mock::VerifyAndClear(&builder);
     53 
     54   EXPECT_CALL(builder, WithSchemeWildcard()).Times(1).WillOnce(
     55       ::testing::Return(&builder));
     56   EXPECT_CALL(builder, WithHost("www.gmail.com")).Times(1).WillOnce(
     57       ::testing::Return(&builder));
     58   EXPECT_CALL(builder, WithPort("80")).Times(1).WillOnce(
     59       ::testing::Return(&builder));
     60   content_settings::PatternParser::Parse("*://www.gmail.com:80", &builder);
     61   ::testing::Mock::VerifyAndClear(&builder);
     62 
     63   EXPECT_CALL(builder, WithScheme("http")).Times(1).WillOnce(
     64       ::testing::Return(&builder));
     65   EXPECT_CALL(builder, WithHost("www.gmail.com")).Times(1).WillOnce(
     66       ::testing::Return(&builder));
     67   EXPECT_CALL(builder, WithPortWildcard()).Times(1).WillOnce(
     68       ::testing::Return(&builder));
     69   content_settings::PatternParser::Parse("http://www.gmail.com:*", &builder);
     70   ::testing::Mock::VerifyAndClear(&builder);
     71 
     72   EXPECT_CALL(builder, WithScheme("http")).Times(1).WillOnce(
     73       ::testing::Return(&builder));
     74   EXPECT_CALL(builder, WithDomainWildcard()).WillOnce(
     75       ::testing::Return(&builder));
     76   EXPECT_CALL(builder, WithHost("google.com")).Times(1).WillOnce(
     77       ::testing::Return(&builder));
     78   EXPECT_CALL(builder, WithPort("80")).Times(1).WillOnce(
     79       ::testing::Return(&builder));
     80   content_settings::PatternParser::Parse("http://[*.]google.com:80", &builder);
     81   ::testing::Mock::VerifyAndClear(&builder);
     82 
     83   EXPECT_CALL(builder, WithScheme("https")).Times(1).WillOnce(
     84       ::testing::Return(&builder));
     85   EXPECT_CALL(builder, WithHost("[::1]")).Times(1).WillOnce(
     86       ::testing::Return(&builder));
     87   EXPECT_CALL(builder, WithPort("8080")).Times(1).WillOnce(
     88       ::testing::Return(&builder));
     89   content_settings::PatternParser::Parse("https://[::1]:8080", &builder);
     90   ::testing::Mock::VerifyAndClear(&builder);
     91 
     92   EXPECT_CALL(builder, WithScheme("http")).Times(1).WillOnce(
     93       ::testing::Return(&builder));
     94   EXPECT_CALL(builder, WithHost("127.0.0.1")).Times(1).WillOnce(
     95       ::testing::Return(&builder));
     96   EXPECT_CALL(builder, WithPort("8080")).Times(1).WillOnce(
     97       ::testing::Return(&builder));
     98   content_settings::PatternParser::Parse("http://127.0.0.1:8080", &builder);
     99   ::testing::Mock::VerifyAndClear(&builder);
    100 
    101   // Test valid pattern short forms
    102   EXPECT_CALL(builder, WithSchemeWildcard()).Times(1).WillOnce(
    103       ::testing::Return(&builder));
    104   EXPECT_CALL(builder, WithHost("www.youtube.com")).Times(1).WillOnce(
    105       ::testing::Return(&builder));
    106   EXPECT_CALL(builder, WithPort("8080")).Times(1).WillOnce(
    107       ::testing::Return(&builder));
    108   content_settings::PatternParser::Parse("www.youtube.com:8080", &builder);
    109   ::testing::Mock::VerifyAndClear(&builder);
    110 
    111   EXPECT_CALL(builder, WithSchemeWildcard()).Times(1).WillOnce(
    112       ::testing::Return(&builder));
    113   EXPECT_CALL(builder, WithHost("www.youtube.com")).Times(1).WillOnce(
    114       ::testing::Return(&builder));
    115   EXPECT_CALL(builder, WithPortWildcard()).Times(1).WillOnce(
    116       ::testing::Return(&builder));
    117   content_settings::PatternParser::Parse("www.youtube.com", &builder);
    118   ::testing::Mock::VerifyAndClear(&builder);
    119 
    120   EXPECT_CALL(builder, WithSchemeWildcard()).Times(1).WillOnce(
    121       ::testing::Return(&builder));
    122   EXPECT_CALL(builder, WithDomainWildcard()).Times(1).WillOnce(
    123       ::testing::Return(&builder));
    124   EXPECT_CALL(builder, WithHost("youtube.com")).Times(1).WillOnce(
    125       ::testing::Return(&builder));
    126   EXPECT_CALL(builder, WithPortWildcard()).Times(1).WillOnce(
    127       ::testing::Return(&builder));
    128   content_settings::PatternParser::Parse("[*.]youtube.com", &builder);
    129   ::testing::Mock::VerifyAndClear(&builder);
    130 
    131   // Test invalid patterns
    132   EXPECT_CALL(builder, WithSchemeWildcard()).Times(1).WillOnce(
    133       ::testing::Return(&builder));
    134   EXPECT_CALL(builder, Invalid()).Times(1).WillOnce(
    135       ::testing::Return(&builder));
    136   content_settings::PatternParser::Parse("*youtube.com", &builder);
    137   ::testing::Mock::VerifyAndClear(&builder);
    138 
    139   EXPECT_CALL(builder, WithSchemeWildcard()).Times(1).WillOnce(
    140       ::testing::Return(&builder));
    141   EXPECT_CALL(builder, Invalid()).Times(1).WillOnce(
    142       ::testing::Return(&builder));
    143   content_settings::PatternParser::Parse("*.youtube.com", &builder);
    144   ::testing::Mock::VerifyAndClear(&builder);
    145 
    146   EXPECT_CALL(builder, WithSchemeWildcard()).Times(1).WillOnce(
    147       ::testing::Return(&builder));
    148   EXPECT_CALL(builder, Invalid()).Times(1).WillOnce(
    149       ::testing::Return(&builder));
    150   content_settings::PatternParser::Parse("www.youtube.com*", &builder);
    151   ::testing::Mock::VerifyAndClear(&builder);
    152 }
    153 
    154 TEST(ContentSettingsPatternParserTest, ParseFilePatterns) {
    155   ::testing::StrictMock<MockBuilder> builder;
    156 
    157   EXPECT_CALL(builder, WithScheme("file")).Times(1).WillOnce(
    158       ::testing::Return(&builder));
    159   EXPECT_CALL(builder, WithPath("/foo/bar/test.html")).Times(1).WillOnce(
    160       ::testing::Return(&builder));
    161   content_settings::PatternParser::Parse(
    162       "file:///foo/bar/test.html", &builder);
    163   ::testing::Mock::VerifyAndClear(&builder);
    164 
    165   EXPECT_CALL(builder, WithScheme("file")).Times(1).WillOnce(
    166       ::testing::Return(&builder));
    167   EXPECT_CALL(builder, WithDomainWildcard()).Times(1).WillOnce(
    168       ::testing::Return(&builder));
    169   content_settings::PatternParser::Parse(
    170       "file://*", &builder);
    171   ::testing::Mock::VerifyAndClear(&builder);
    172 
    173   EXPECT_CALL(builder, WithScheme("file")).Times(1).WillOnce(
    174       ::testing::Return(&builder));
    175   EXPECT_CALL(builder, WithDomainWildcard()).Times(1).WillOnce(
    176       ::testing::Return(&builder));
    177   EXPECT_CALL(builder, WithPath("/")).Times(1).WillOnce(
    178       ::testing::Return(&builder));
    179   content_settings::PatternParser::Parse(
    180       "file://*/", &builder);
    181   ::testing::Mock::VerifyAndClear(&builder);
    182 
    183   EXPECT_CALL(builder, WithScheme("file")).Times(1).WillOnce(
    184       ::testing::Return(&builder));
    185   EXPECT_CALL(builder, WithDomainWildcard()).Times(1).WillOnce(
    186       ::testing::Return(&builder));
    187   EXPECT_CALL(builder, WithPathWildcard()).Times(1).WillOnce(
    188       ::testing::Return(&builder));
    189   content_settings::PatternParser::Parse(
    190       "file://*/*", &builder);
    191   ::testing::Mock::VerifyAndClear(&builder);
    192 
    193   EXPECT_CALL(builder, WithScheme("file")).Times(1).WillOnce(
    194       ::testing::Return(&builder));
    195   EXPECT_CALL(builder, WithPathWildcard()).Times(1).WillOnce(
    196       ::testing::Return(&builder));
    197   content_settings::PatternParser::Parse(
    198       "file:///*", &builder);
    199   ::testing::Mock::VerifyAndClear(&builder);
    200 
    201   // Invalid file patterns.
    202   EXPECT_CALL(builder, WithScheme("file")).Times(1).WillOnce(
    203       ::testing::Return(&builder));
    204   EXPECT_CALL(builder, Invalid()).Times(1).WillOnce(
    205       ::testing::Return(&builder));
    206   content_settings::PatternParser::Parse(
    207       "file://**", &builder);
    208   ::testing::Mock::VerifyAndClear(&builder);
    209 }
    210 
    211 TEST(ContentSettingsPatternParserTest, SerializePatterns) {
    212   ContentSettingsPattern::PatternParts parts;
    213   parts.scheme = "http";
    214   parts.host = "www.youtube.com";
    215   parts.port = "8080";
    216   EXPECT_STREQ("http://www.youtube.com:8080",
    217                content_settings::PatternParser::ToString(parts).c_str());
    218 
    219   parts = ContentSettingsPattern::PatternParts();
    220   parts.scheme = "file";
    221   parts.path = "/foo/bar/test.html";
    222   EXPECT_STREQ("file:///foo/bar/test.html",
    223                content_settings::PatternParser::ToString(parts).c_str());
    224 
    225   parts = ContentSettingsPattern::PatternParts();
    226   parts.scheme = "file";
    227   parts.path = "";
    228   parts.is_path_wildcard = true;
    229   EXPECT_EQ("file:///*", content_settings::PatternParser::ToString(parts));
    230 }
    231