1// Copyright (c) 2011 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/browser/content_settings/content_settings_origin_identifier_value_map.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "base/values.h"
9#include "chrome/browser/content_settings/content_settings_rule.h"
10#include "chrome/browser/content_settings/content_settings_utils.h"
11#include "testing/gtest/include/gtest/gtest.h"
12#include "url/gurl.h"
13
14TEST(OriginIdentifierValueMapTest, SetGetValue) {
15  content_settings::OriginIdentifierValueMap map;
16
17  EXPECT_EQ(NULL,
18            map.GetValue(GURL("http://www.google.com"),
19                         GURL("http://www.google.com"),
20                         CONTENT_SETTINGS_TYPE_COOKIES,
21                         std::string()));
22  map.SetValue(ContentSettingsPattern::FromString("[*.]google.com"),
23               ContentSettingsPattern::FromString("[*.]google.com"),
24               CONTENT_SETTINGS_TYPE_COOKIES,
25               std::string(),
26               Value::CreateIntegerValue(1));
27
28  scoped_ptr<Value> expected_value(Value::CreateIntegerValue(1));
29  EXPECT_TRUE(expected_value->Equals(map.GetValue(GURL("http://www.google.com"),
30                                                  GURL("http://www.google.com"),
31                                                  CONTENT_SETTINGS_TYPE_COOKIES,
32                                                  std::string())));
33
34  EXPECT_EQ(NULL,
35            map.GetValue(GURL("http://www.google.com"),
36                         GURL("http://www.youtube.com"),
37                         CONTENT_SETTINGS_TYPE_COOKIES,
38                         std::string()));
39
40  EXPECT_EQ(NULL,
41            map.GetValue(GURL("http://www.youtube.com"),
42                         GURL("http://www.google.com"),
43                         CONTENT_SETTINGS_TYPE_COOKIES,
44                         std::string()));
45
46  EXPECT_EQ(NULL,
47            map.GetValue(GURL("http://www.google.com"),
48                         GURL("http://www.google.com"),
49                         CONTENT_SETTINGS_TYPE_POPUPS,
50                         std::string()));
51
52  EXPECT_EQ(NULL, map.GetValue(GURL("http://www.google.com"),
53                               GURL("http://www.google.com"),
54                               CONTENT_SETTINGS_TYPE_COOKIES,
55                               "resource_id"));
56}
57
58TEST(OriginIdentifierValueMapTest, SetDeleteValue) {
59  content_settings::OriginIdentifierValueMap map;
60
61  EXPECT_EQ(NULL, map.GetValue(GURL("http://www.google.com"),
62                               GURL("http://www.google.com"),
63                               CONTENT_SETTINGS_TYPE_PLUGINS,
64                               "java-plugin"));
65
66  // Set sample values.
67  map.SetValue(
68      ContentSettingsPattern::FromString("[*.]google.com"),
69      ContentSettingsPattern::FromString("[*.]google.com"),
70      CONTENT_SETTINGS_TYPE_PLUGINS,
71      "java-plugin",
72      Value::CreateIntegerValue(1));
73
74  int actual_value;
75  EXPECT_TRUE(map.GetValue(GURL("http://www.google.com"),
76                           GURL("http://www.google.com"),
77                           CONTENT_SETTINGS_TYPE_PLUGINS,
78                           "java-plugin")->GetAsInteger(&actual_value));
79  EXPECT_EQ(1, actual_value);
80  EXPECT_EQ(NULL, map.GetValue(GURL("http://www.google.com"),
81                               GURL("http://www.google.com"),
82                               CONTENT_SETTINGS_TYPE_PLUGINS,
83                               "flash-plugin"));
84  // Delete non-existing value.
85  map.DeleteValue(
86      ContentSettingsPattern::FromString("[*.]google.com"),
87      ContentSettingsPattern::FromString("[*.]google.com"),
88      CONTENT_SETTINGS_TYPE_PLUGINS,
89      "flash-plugin");
90  EXPECT_EQ(NULL, map.GetValue(GURL("http://www.google.com"),
91                               GURL("http://www.google.com"),
92                               CONTENT_SETTINGS_TYPE_PLUGINS,
93                               "flash-plugin"));
94  EXPECT_TRUE(map.GetValue(GURL("http://www.google.com"),
95                           GURL("http://www.google.com"),
96                           CONTENT_SETTINGS_TYPE_PLUGINS,
97                           "java-plugin")->GetAsInteger(&actual_value));
98  EXPECT_EQ(1, actual_value);
99
100  // Delete existing value.
101  map.DeleteValue(
102      ContentSettingsPattern::FromString("[*.]google.com"),
103      ContentSettingsPattern::FromString("[*.]google.com"),
104      CONTENT_SETTINGS_TYPE_PLUGINS,
105      "java-plugin");
106
107  EXPECT_EQ(NULL, map.GetValue(GURL("http://www.google.com"),
108                               GURL("http://www.google.com"),
109                               CONTENT_SETTINGS_TYPE_PLUGINS,
110                               "java-plugin"));
111}
112
113TEST(OriginIdentifierValueMapTest, Clear) {
114  content_settings::OriginIdentifierValueMap map;
115  EXPECT_TRUE(map.empty());
116
117  // Set two values.
118  map.SetValue(
119      ContentSettingsPattern::FromString("[*.]google.com"),
120      ContentSettingsPattern::FromString("[*.]google.com"),
121      CONTENT_SETTINGS_TYPE_PLUGINS,
122      "java-plugin",
123      Value::CreateIntegerValue(1));
124  map.SetValue(ContentSettingsPattern::FromString("[*.]google.com"),
125               ContentSettingsPattern::FromString("[*.]google.com"),
126               CONTENT_SETTINGS_TYPE_COOKIES,
127               std::string(),
128               Value::CreateIntegerValue(1));
129  EXPECT_FALSE(map.empty());
130  int actual_value;
131  EXPECT_TRUE(map.GetValue(GURL("http://www.google.com"),
132                           GURL("http://www.google.com"),
133                           CONTENT_SETTINGS_TYPE_PLUGINS,
134                           "java-plugin")->GetAsInteger(&actual_value));
135  EXPECT_EQ(1, actual_value);
136
137  // Clear the map.
138  map.clear();
139  EXPECT_TRUE(map.empty());
140  EXPECT_EQ(NULL, map.GetValue(GURL("http://www.google.com"),
141                               GURL("http://www.google.com"),
142                               CONTENT_SETTINGS_TYPE_PLUGINS,
143                               "java-plugin"));
144}
145
146TEST(OriginIdentifierValueMapTest, ListEntryPrecedences) {
147  content_settings::OriginIdentifierValueMap map;
148
149  map.SetValue(ContentSettingsPattern::FromString("[*.]google.com"),
150               ContentSettingsPattern::FromString("[*.]google.com"),
151               CONTENT_SETTINGS_TYPE_COOKIES,
152               std::string(),
153               Value::CreateIntegerValue(1));
154
155  map.SetValue(ContentSettingsPattern::FromString("www.google.com"),
156               ContentSettingsPattern::FromString("[*.]google.com"),
157               CONTENT_SETTINGS_TYPE_COOKIES,
158               std::string(),
159               Value::CreateIntegerValue(2));
160
161  int actual_value;
162  EXPECT_TRUE(map.GetValue(GURL("http://mail.google.com"),
163                           GURL("http://www.google.com"),
164                           CONTENT_SETTINGS_TYPE_COOKIES,
165                           std::string())->GetAsInteger(&actual_value));
166  EXPECT_EQ(1, actual_value);
167
168  EXPECT_TRUE(map.GetValue(GURL("http://www.google.com"),
169                           GURL("http://www.google.com"),
170                           CONTENT_SETTINGS_TYPE_COOKIES,
171                           std::string())->GetAsInteger(&actual_value));
172  EXPECT_EQ(2, actual_value);
173}
174
175TEST(OriginIdentifierValueMapTest, IterateEmpty) {
176  content_settings::OriginIdentifierValueMap map;
177  scoped_ptr<content_settings::RuleIterator> rule_iterator(
178      map.GetRuleIterator(CONTENT_SETTINGS_TYPE_COOKIES, std::string(), NULL));
179  EXPECT_FALSE(rule_iterator->HasNext());
180}
181
182TEST(OriginIdentifierValueMapTest, IterateNonempty) {
183  // Verify the precedence order.
184  content_settings::OriginIdentifierValueMap map;
185  ContentSettingsPattern pattern =
186      ContentSettingsPattern::FromString("[*.]google.com");
187  ContentSettingsPattern sub_pattern =
188      ContentSettingsPattern::FromString("sub.google.com");
189  map.SetValue(pattern,
190               ContentSettingsPattern::Wildcard(),
191               CONTENT_SETTINGS_TYPE_COOKIES,
192               std::string(),
193               Value::CreateIntegerValue(1));
194  map.SetValue(sub_pattern,
195               ContentSettingsPattern::Wildcard(),
196               CONTENT_SETTINGS_TYPE_COOKIES,
197               std::string(),
198               Value::CreateIntegerValue(2));
199
200  scoped_ptr<content_settings::RuleIterator> rule_iterator(
201      map.GetRuleIterator(CONTENT_SETTINGS_TYPE_COOKIES, std::string(), NULL));
202  ASSERT_TRUE(rule_iterator->HasNext());
203  content_settings::Rule rule = rule_iterator->Next();
204  EXPECT_EQ(sub_pattern, rule.primary_pattern);
205  EXPECT_EQ(2, content_settings::ValueToContentSetting(rule.value.get()));
206
207  ASSERT_TRUE(rule_iterator->HasNext());
208  rule = rule_iterator->Next();
209  EXPECT_EQ(pattern, rule.primary_pattern);
210  EXPECT_EQ(1, content_settings::ValueToContentSetting(rule.value.get()));
211}
212