OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "components/subresource_filter/core/browser/subresource_filter_features .h" | 5 #include "components/subresource_filter/core/browser/subresource_filter_features .h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <memory> | 8 #include <memory> |
9 #include <string> | 9 #include <string> |
10 #include <vector> | |
10 | 11 |
11 #include "base/feature_list.h" | 12 #include "base/feature_list.h" |
12 #include "base/macros.h" | 13 #include "base/macros.h" |
13 #include "base/metrics/field_trial.h" | 14 #include "base/metrics/field_trial.h" |
14 #include "base/metrics/field_trial_params.h" | 15 #include "base/metrics/field_trial_params.h" |
16 #include "base/strings/string_util.h" | |
15 #include "components/subresource_filter/core/browser/subresource_filter_features _test_support.h" | 17 #include "components/subresource_filter/core/browser/subresource_filter_features _test_support.h" |
16 #include "components/variations/variations_associated_data.h" | 18 #include "components/variations/variations_associated_data.h" |
19 #include "testing/gmock/include/gmock/gmock.h" | |
17 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
18 | 21 |
19 namespace subresource_filter { | 22 namespace subresource_filter { |
20 namespace testing { | |
21 | 23 |
22 namespace { | 24 namespace { |
23 | 25 |
24 constexpr const char kTestFieldTrialName[] = "FieldTrialNameShouldNotMatter"; | 26 constexpr const char kTestFieldTrialName[] = "FieldTrialNameShouldNotMatter"; |
25 constexpr const char kTestExperimentGroupName[] = "GroupNameShouldNotMatter"; | 27 constexpr const char kTestExperimentGroupName[] = "GroupNameShouldNotMatter"; |
26 | 28 |
27 class ScopedExperimentalStateToggle { | 29 class ScopedExperimentalStateToggle { |
28 public: | 30 public: |
29 ScopedExperimentalStateToggle( | 31 ScopedExperimentalStateToggle( |
30 base::FeatureList::OverrideState feature_state, | 32 base::FeatureList::OverrideState feature_state, |
(...skipping 12 matching lines...) Expand all Loading... | |
43 scoped_feature_list_.InitWithFeatureList(std::move(feature_list)); | 45 scoped_feature_list_.InitWithFeatureList(std::move(feature_list)); |
44 } | 46 } |
45 | 47 |
46 ~ScopedExperimentalStateToggle() { | 48 ~ScopedExperimentalStateToggle() { |
47 variations::testing::ClearAllVariationParams(); | 49 variations::testing::ClearAllVariationParams(); |
48 } | 50 } |
49 | 51 |
50 private: | 52 private: |
51 base::FieldTrialList field_trial_list_; | 53 base::FieldTrialList field_trial_list_; |
52 | 54 |
53 ScopedSubresourceFilterConfigurator scoped_configurator_; | 55 testing::ScopedSubresourceFilterConfigurator scoped_configurator_; |
54 base::test::ScopedFeatureList scoped_feature_list_; | 56 base::test::ScopedFeatureList scoped_feature_list_; |
55 | 57 |
56 DISALLOW_COPY_AND_ASSIGN(ScopedExperimentalStateToggle); | 58 DISALLOW_COPY_AND_ASSIGN(ScopedExperimentalStateToggle); |
57 }; | 59 }; |
58 | 60 |
61 template <class T, size_t N> | |
62 std::vector<T> AsVector(const T (&array)[N]) { | |
63 return std::vector<T>(std::begin(array), std::end(array)); | |
64 } | |
65 | |
66 void ExpectAndRetrieveExactlyOneEnabledConfig(Configuration* actual_config) { | |
67 const auto config_list = GetEnabledConfigurations(); | |
68 ASSERT_EQ(1u, config_list->configs_by_decreasing_priority().size()); | |
69 *actual_config = config_list->configs_by_decreasing_priority().front(); | |
70 } | |
71 | |
72 void ExpectPresetCanBeEnabledByName(Configuration preset, const char* name) { | |
73 ScopedExperimentalStateToggle scoped_experimental_state( | |
74 base::FeatureList::OVERRIDE_ENABLE_FEATURE, | |
75 {{kEnablePresetsParameterName, name}}); | |
76 | |
77 const auto config_list = GetEnabledConfigurations(); | |
78 EXPECT_THAT(config_list->configs_by_decreasing_priority(), | |
79 ::testing::ElementsAre(preset, Configuration())); | |
80 } | |
81 | |
82 void ExpectPresetIsEquivalentToVariationParams( | |
83 Configuration preset, | |
84 std::map<std::string, std::string> variation_params) { | |
85 ScopedExperimentalStateToggle scoped_experimental_state( | |
86 base::FeatureList::OVERRIDE_ENABLE_FEATURE, variation_params); | |
87 | |
88 Configuration experimental_configuration; | |
89 ExpectAndRetrieveExactlyOneEnabledConfig(&experimental_configuration); | |
90 EXPECT_EQ(preset, experimental_configuration); | |
91 } | |
92 | |
59 } // namespace | 93 } // namespace |
60 } // namespace testing | |
61 | 94 |
62 TEST(SubresourceFilterFeaturesTest, ActivationLevel) { | 95 TEST(SubresourceFilterFeaturesTest, ActivationLevel) { |
63 const struct { | 96 const struct { |
64 bool feature_enabled; | 97 bool feature_enabled; |
65 const char* activation_level_param; | 98 const char* activation_level_param; |
66 ActivationLevel expected_activation_level; | 99 ActivationLevel expected_activation_level; |
67 } kTestCases[] = {{false, "", ActivationLevel::DISABLED}, | 100 } kTestCases[] = {{false, "", ActivationLevel::DISABLED}, |
68 {false, "disabled", ActivationLevel::DISABLED}, | 101 {false, "disabled", ActivationLevel::DISABLED}, |
69 {false, "dryrun", ActivationLevel::DISABLED}, | 102 {false, "dryrun", ActivationLevel::DISABLED}, |
70 {false, "enabled", ActivationLevel::DISABLED}, | 103 {false, "enabled", ActivationLevel::DISABLED}, |
71 {false, "%$ garbage !%", ActivationLevel::DISABLED}, | 104 {false, "%$ garbage !%", ActivationLevel::DISABLED}, |
72 {true, "", ActivationLevel::DISABLED}, | 105 {true, "", ActivationLevel::DISABLED}, |
73 {true, "disable", ActivationLevel::DISABLED}, | 106 {true, "disable", ActivationLevel::DISABLED}, |
74 {true, "Disable", ActivationLevel::DISABLED}, | 107 {true, "Disable", ActivationLevel::DISABLED}, |
75 {true, "disabled", ActivationLevel::DISABLED}, | 108 {true, "disabled", ActivationLevel::DISABLED}, |
76 {true, "%$ garbage !%", ActivationLevel::DISABLED}, | 109 {true, "%$ garbage !%", ActivationLevel::DISABLED}, |
77 {true, kActivationLevelDryRun, ActivationLevel::DRYRUN}, | 110 {true, kActivationLevelDryRun, ActivationLevel::DRYRUN}, |
78 {true, kActivationLevelEnabled, ActivationLevel::ENABLED}, | 111 {true, kActivationLevelEnabled, ActivationLevel::ENABLED}, |
79 {true, "Enabled", ActivationLevel::ENABLED}}; | 112 {true, "Enabled", ActivationLevel::ENABLED}}; |
80 | 113 |
81 for (const auto& test_case : kTestCases) { | 114 for (const auto& test_case : kTestCases) { |
82 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); | 115 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); |
83 SCOPED_TRACE(::testing::Message("ActivationLevelParam = \"") | 116 SCOPED_TRACE(::testing::Message("ActivationLevelParam = \"") |
84 << test_case.activation_level_param << "\""); | 117 << test_case.activation_level_param << "\""); |
85 | 118 |
86 testing::ScopedExperimentalStateToggle scoped_experimental_state( | 119 ScopedExperimentalStateToggle scoped_experimental_state( |
87 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE | 120 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE |
88 : base::FeatureList::OVERRIDE_USE_DEFAULT, | 121 : base::FeatureList::OVERRIDE_USE_DEFAULT, |
89 {{kActivationLevelParameterName, test_case.activation_level_param}, | 122 {{kActivationLevelParameterName, test_case.activation_level_param}, |
90 {kActivationScopeParameterName, kActivationScopeNoSites}}); | 123 {kActivationScopeParameterName, kActivationScopeNoSites}}); |
91 | 124 |
92 const auto active_configurations = GetActiveConfigurations(); | 125 Configuration actual_configuration; |
93 const Configuration& actual_configuration = | 126 ExpectAndRetrieveExactlyOneEnabledConfig(&actual_configuration); |
94 active_configurations->the_one_and_only(); | |
95 EXPECT_EQ(test_case.expected_activation_level, | 127 EXPECT_EQ(test_case.expected_activation_level, |
96 actual_configuration.activation_level); | 128 actual_configuration.activation_options.activation_level); |
97 EXPECT_EQ(ActivationScope::NO_SITES, actual_configuration.activation_scope); | 129 EXPECT_EQ(ActivationScope::NO_SITES, |
130 actual_configuration.activation_conditions.activation_scope); | |
98 } | 131 } |
99 } | 132 } |
100 | 133 |
101 TEST(SubresourceFilterFeaturesTest, ActivationScope) { | 134 TEST(SubresourceFilterFeaturesTest, ActivationScope) { |
102 const struct { | 135 const struct { |
103 bool feature_enabled; | 136 bool feature_enabled; |
104 const char* activation_scope_param; | 137 const char* activation_scope_param; |
105 ActivationScope expected_activation_scope; | 138 ActivationScope expected_activation_scope; |
106 } kTestCases[] = { | 139 } kTestCases[] = { |
107 {false, "", ActivationScope::NO_SITES}, | 140 {false, "", ActivationScope::NO_SITES}, |
108 {false, "no_sites", ActivationScope::NO_SITES}, | 141 {false, "no_sites", ActivationScope::NO_SITES}, |
109 {false, "allsites", ActivationScope::NO_SITES}, | 142 {false, "allsites", ActivationScope::NO_SITES}, |
110 {false, "enabled", ActivationScope::NO_SITES}, | 143 {false, "enabled", ActivationScope::NO_SITES}, |
111 {false, "%$ garbage !%", ActivationScope::NO_SITES}, | 144 {false, "%$ garbage !%", ActivationScope::NO_SITES}, |
112 {true, "", ActivationScope::NO_SITES}, | 145 {true, "", ActivationScope::NO_SITES}, |
113 {true, "nosites", ActivationScope::NO_SITES}, | 146 {true, "nosites", ActivationScope::NO_SITES}, |
114 {true, "No_sites", ActivationScope::NO_SITES}, | 147 {true, "No_sites", ActivationScope::NO_SITES}, |
115 {true, "no_sites", ActivationScope::NO_SITES}, | 148 {true, "no_sites", ActivationScope::NO_SITES}, |
116 {true, "%$ garbage !%", ActivationScope::NO_SITES}, | 149 {true, "%$ garbage !%", ActivationScope::NO_SITES}, |
117 {true, kActivationScopeAllSites, ActivationScope::ALL_SITES}, | 150 {true, kActivationScopeAllSites, ActivationScope::ALL_SITES}, |
118 {true, kActivationScopeActivationList, ActivationScope::ACTIVATION_LIST}}; | 151 {true, kActivationScopeActivationList, ActivationScope::ACTIVATION_LIST}}; |
119 | 152 |
120 for (const auto& test_case : kTestCases) { | 153 for (const auto& test_case : kTestCases) { |
121 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); | 154 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); |
122 SCOPED_TRACE(::testing::Message("ActivationScopeParam = \"") | 155 SCOPED_TRACE(::testing::Message("ActivationScopeParam = \"") |
123 << test_case.activation_scope_param << "\""); | 156 << test_case.activation_scope_param << "\""); |
124 | 157 |
125 testing::ScopedExperimentalStateToggle scoped_experimental_state( | 158 ScopedExperimentalStateToggle scoped_experimental_state( |
126 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE | 159 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE |
127 : base::FeatureList::OVERRIDE_USE_DEFAULT, | 160 : base::FeatureList::OVERRIDE_USE_DEFAULT, |
128 {{kActivationLevelParameterName, kActivationLevelDisabled}, | 161 {{kActivationLevelParameterName, kActivationLevelDisabled}, |
129 {kActivationScopeParameterName, test_case.activation_scope_param}}); | 162 {kActivationScopeParameterName, test_case.activation_scope_param}}); |
130 | 163 |
131 const auto active_configurations = GetActiveConfigurations(); | 164 Configuration actual_configuration; |
132 const Configuration& actual_configuration = | 165 ExpectAndRetrieveExactlyOneEnabledConfig(&actual_configuration); |
133 active_configurations->the_one_and_only(); | 166 EXPECT_EQ(ActivationLevel::DISABLED, |
134 EXPECT_EQ(ActivationLevel::DISABLED, actual_configuration.activation_level); | 167 actual_configuration.activation_options.activation_level); |
135 EXPECT_EQ(test_case.expected_activation_scope, | 168 EXPECT_EQ(test_case.expected_activation_scope, |
136 actual_configuration.activation_scope); | 169 actual_configuration.activation_conditions.activation_scope); |
137 } | 170 } |
138 } | 171 } |
139 | 172 |
140 TEST(SubresourceFilterFeaturesTest, ActivationLevelAndScope) { | 173 TEST(SubresourceFilterFeaturesTest, ActivationLevelAndScope) { |
141 const struct { | 174 const struct { |
142 bool feature_enabled; | 175 bool feature_enabled; |
143 const char* activation_level_param; | 176 const char* activation_level_param; |
144 ActivationLevel expected_activation_level; | 177 ActivationLevel expected_activation_level; |
145 const char* activation_scope_param; | 178 const char* activation_scope_param; |
146 ActivationScope expected_activation_scope; | 179 ActivationScope expected_activation_scope; |
(...skipping 21 matching lines...) Expand all Loading... | |
168 {true, kActivationLevelEnabled, ActivationLevel::ENABLED, | 201 {true, kActivationLevelEnabled, ActivationLevel::ENABLED, |
169 kActivationScopeAllSites, ActivationScope::ALL_SITES}, | 202 kActivationScopeAllSites, ActivationScope::ALL_SITES}, |
170 {true, kActivationLevelEnabled, ActivationLevel::ENABLED, | 203 {true, kActivationLevelEnabled, ActivationLevel::ENABLED, |
171 kActivationScopeActivationList, ActivationScope::ACTIVATION_LIST}, | 204 kActivationScopeActivationList, ActivationScope::ACTIVATION_LIST}, |
172 {true, kActivationLevelEnabled, ActivationLevel::ENABLED, | 205 {true, kActivationLevelEnabled, ActivationLevel::ENABLED, |
173 kActivationScopeAllSites, ActivationScope::ALL_SITES}, | 206 kActivationScopeAllSites, ActivationScope::ALL_SITES}, |
174 {false, kActivationLevelEnabled, ActivationLevel::DISABLED, | 207 {false, kActivationLevelEnabled, ActivationLevel::DISABLED, |
175 kActivationScopeAllSites, ActivationScope::NO_SITES}}; | 208 kActivationScopeAllSites, ActivationScope::NO_SITES}}; |
176 | 209 |
177 for (const auto& test_case : kTestCases) { | 210 for (const auto& test_case : kTestCases) { |
178 testing::ScopedExperimentalStateToggle scoped_experimental_state( | 211 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); |
212 SCOPED_TRACE(::testing::Message("ActivationLevelParam = \"") | |
213 << test_case.activation_level_param << "\""); | |
214 SCOPED_TRACE(::testing::Message("ActivationScopeParam = \"") | |
215 << test_case.activation_scope_param << "\""); | |
216 | |
217 ScopedExperimentalStateToggle scoped_experimental_state( | |
179 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE | 218 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE |
180 : base::FeatureList::OVERRIDE_USE_DEFAULT, | 219 : base::FeatureList::OVERRIDE_USE_DEFAULT, |
181 {{kActivationLevelParameterName, test_case.activation_level_param}, | 220 {{kActivationLevelParameterName, test_case.activation_level_param}, |
182 {kActivationScopeParameterName, test_case.activation_scope_param}}); | 221 {kActivationScopeParameterName, test_case.activation_scope_param}}); |
183 | 222 |
184 const auto active_configurations = GetActiveConfigurations(); | 223 Configuration actual_configuration; |
185 const Configuration& actual_configuration = | 224 ExpectAndRetrieveExactlyOneEnabledConfig(&actual_configuration); |
186 active_configurations->the_one_and_only(); | |
187 EXPECT_EQ(test_case.expected_activation_level, | 225 EXPECT_EQ(test_case.expected_activation_level, |
188 actual_configuration.activation_level); | 226 actual_configuration.activation_options.activation_level); |
189 EXPECT_EQ(test_case.expected_activation_scope, | 227 EXPECT_EQ(test_case.expected_activation_scope, |
190 actual_configuration.activation_scope); | 228 actual_configuration.activation_conditions.activation_scope); |
191 } | 229 } |
192 } | 230 } |
193 | 231 |
194 TEST(SubresourceFilterFeaturesTest, ActivationList) { | 232 TEST(SubresourceFilterFeaturesTest, ActivationList) { |
195 const std::string activation_soc_eng( | 233 const std::string activation_soc_eng( |
196 kActivationListSocialEngineeringAdsInterstitial); | 234 kActivationListSocialEngineeringAdsInterstitial); |
197 const std::string activation_phishing(kActivationListPhishingInterstitial); | 235 const std::string activation_phishing(kActivationListPhishingInterstitial); |
198 const std::string socEngPhising = activation_soc_eng + activation_phishing; | 236 const std::string socEngPhising = activation_soc_eng + activation_phishing; |
199 const std::string socEngCommaPhising = | 237 const std::string socEngCommaPhising = |
200 activation_soc_eng + "," + activation_phishing; | 238 activation_soc_eng + "," + activation_phishing; |
(...skipping 24 matching lines...) Expand all Loading... | |
225 ActivationList::PHISHING_INTERSTITIAL}, | 263 ActivationList::PHISHING_INTERSTITIAL}, |
226 {true, socEngCommaPhisingCommaGarbage.c_str(), | 264 {true, socEngCommaPhisingCommaGarbage.c_str(), |
227 ActivationList::PHISHING_INTERSTITIAL}, | 265 ActivationList::PHISHING_INTERSTITIAL}, |
228 {true, "List1, List2", ActivationList::NONE}}; | 266 {true, "List1, List2", ActivationList::NONE}}; |
229 | 267 |
230 for (const auto& test_case : kTestCases) { | 268 for (const auto& test_case : kTestCases) { |
231 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); | 269 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); |
232 SCOPED_TRACE(::testing::Message("ActivationListParam = \"") | 270 SCOPED_TRACE(::testing::Message("ActivationListParam = \"") |
233 << test_case.activation_list_param << "\""); | 271 << test_case.activation_list_param << "\""); |
234 | 272 |
235 testing::ScopedExperimentalStateToggle scoped_experimental_state( | 273 ScopedExperimentalStateToggle scoped_experimental_state( |
236 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE | 274 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE |
237 : base::FeatureList::OVERRIDE_USE_DEFAULT, | 275 : base::FeatureList::OVERRIDE_USE_DEFAULT, |
238 {{kActivationLevelParameterName, kActivationLevelDisabled}, | 276 {{kActivationLevelParameterName, kActivationLevelDisabled}, |
239 {kActivationScopeParameterName, kActivationScopeNoSites}, | 277 {kActivationScopeParameterName, kActivationScopeNoSites}, |
240 {kActivationListsParameterName, test_case.activation_list_param}}); | 278 {kActivationListsParameterName, test_case.activation_list_param}}); |
241 | 279 |
242 const auto active_configurations = GetActiveConfigurations(); | 280 Configuration actual_configuration; |
243 const Configuration& actual_configuration = | 281 ExpectAndRetrieveExactlyOneEnabledConfig(&actual_configuration); |
244 active_configurations->the_one_and_only(); | |
245 EXPECT_EQ(test_case.expected_activation_list, | 282 EXPECT_EQ(test_case.expected_activation_list, |
246 actual_configuration.activation_list); | 283 actual_configuration.activation_conditions.activation_list); |
247 } | 284 } |
248 } | 285 } |
249 | 286 |
250 TEST(SubresourceFilterFeaturesTest, PerfMeasurementRate) { | 287 TEST(SubresourceFilterFeaturesTest, PerfMeasurementRate) { |
251 const struct { | 288 const struct { |
252 bool feature_enabled; | 289 bool feature_enabled; |
253 const char* perf_measurement_param; | 290 const char* perf_measurement_param; |
254 double expected_perf_measurement_rate; | 291 double expected_perf_measurement_rate; |
255 } kTestCases[] = {{false, "not_a_number", 0}, | 292 } kTestCases[] = {{false, "not_a_number", 0}, |
256 {false, "0", 0}, | 293 {false, "0", 0}, |
257 {false, "1", 0}, | 294 {false, "1", 0}, |
258 {true, "not_a_number", 0}, | 295 {true, "not_a_number", 0}, |
259 {true, "0.5not_a_number", 0}, | 296 {true, "0.5not_a_number", 0}, |
260 {true, "0", 0}, | 297 {true, "0", 0}, |
261 {true, "0.000", 0}, | 298 {true, "0.000", 0}, |
262 {true, "0.05", 0.05}, | 299 {true, "0.05", 0.05}, |
263 {true, "0.5", 0.5}, | 300 {true, "0.5", 0.5}, |
264 {true, "1", 1}, | 301 {true, "1", 1}, |
265 {true, "1.0", 1}, | 302 {true, "1.0", 1}, |
266 {true, "0.333", 0.333}, | 303 {true, "0.333", 0.333}, |
267 {true, "1e0", 1}}; | 304 {true, "1e0", 1}}; |
268 | 305 |
269 for (const auto& test_case : kTestCases) { | 306 for (const auto& test_case : kTestCases) { |
270 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); | 307 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); |
271 SCOPED_TRACE(::testing::Message("PerfMeasurementParam = \"") | 308 SCOPED_TRACE(::testing::Message("PerfMeasurementParam = \"") |
272 << test_case.perf_measurement_param << "\""); | 309 << test_case.perf_measurement_param << "\""); |
273 | 310 |
274 testing::ScopedExperimentalStateToggle scoped_experimental_state( | 311 ScopedExperimentalStateToggle scoped_experimental_state( |
275 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE | 312 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE |
276 : base::FeatureList::OVERRIDE_USE_DEFAULT, | 313 : base::FeatureList::OVERRIDE_USE_DEFAULT, |
277 {{kPerformanceMeasurementRateParameterName, | 314 {{kPerformanceMeasurementRateParameterName, |
278 test_case.perf_measurement_param}}); | 315 test_case.perf_measurement_param}}); |
279 | 316 |
280 const auto active_configurations = GetActiveConfigurations(); | 317 Configuration actual_configuration; |
281 const Configuration& actual_configuration = | 318 ExpectAndRetrieveExactlyOneEnabledConfig(&actual_configuration); |
282 active_configurations->the_one_and_only(); | 319 EXPECT_EQ( |
283 EXPECT_EQ(test_case.expected_perf_measurement_rate, | 320 test_case.expected_perf_measurement_rate, |
284 actual_configuration.performance_measurement_rate); | 321 actual_configuration.activation_options.performance_measurement_rate); |
285 } | 322 } |
286 } | 323 } |
287 | 324 |
288 TEST(SubresourceFilterFeaturesTest, SuppressNotifications) { | 325 TEST(SubresourceFilterFeaturesTest, SuppressNotifications) { |
289 const struct { | 326 const struct { |
290 bool feature_enabled; | 327 bool feature_enabled; |
291 const char* suppress_notifications_param; | 328 const char* suppress_notifications_param; |
292 bool expected_suppress_notifications_value; | 329 bool expected_suppress_notifications_value; |
293 } kTestCases[] = {{false, "", false}, | 330 } kTestCases[] = {{false, "", false}, |
294 {false, "true", false}, | 331 {false, "true", false}, |
295 {false, "false", false}, | 332 {false, "false", false}, |
296 {false, "invalid value", false}, | 333 {false, "invalid value", false}, |
297 {true, "", false}, | 334 {true, "", false}, |
298 {true, "false", false}, | 335 {true, "false", false}, |
299 {true, "invalid value", false}, | 336 {true, "invalid value", false}, |
300 {true, "True", true}, | 337 {true, "True", true}, |
301 {true, "TRUE", true}, | 338 {true, "TRUE", true}, |
302 {true, "true", true}}; | 339 {true, "true", true}}; |
303 | 340 |
304 for (const auto& test_case : kTestCases) { | 341 for (const auto& test_case : kTestCases) { |
305 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); | 342 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); |
306 SCOPED_TRACE(::testing::Message("SuppressNotificationsParam = \"") | 343 SCOPED_TRACE(::testing::Message("SuppressNotificationsParam = \"") |
307 << test_case.suppress_notifications_param << "\""); | 344 << test_case.suppress_notifications_param << "\""); |
308 | 345 |
309 testing::ScopedExperimentalStateToggle scoped_experimental_state( | 346 ScopedExperimentalStateToggle scoped_experimental_state( |
310 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE | 347 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE |
311 : base::FeatureList::OVERRIDE_USE_DEFAULT, | 348 : base::FeatureList::OVERRIDE_USE_DEFAULT, |
312 {{kSuppressNotificationsParameterName, | 349 {{kSuppressNotificationsParameterName, |
313 test_case.suppress_notifications_param}}); | 350 test_case.suppress_notifications_param}}); |
314 | 351 |
315 const auto active_configurations = GetActiveConfigurations(); | 352 Configuration actual_configuration; |
316 const Configuration& actual_configuration = | 353 ExpectAndRetrieveExactlyOneEnabledConfig(&actual_configuration); |
317 active_configurations->the_one_and_only(); | 354 EXPECT_EQ( |
318 EXPECT_EQ(test_case.expected_suppress_notifications_value, | 355 test_case.expected_suppress_notifications_value, |
319 actual_configuration.should_suppress_notifications); | 356 actual_configuration.activation_options.should_suppress_notifications); |
320 } | 357 } |
321 } | 358 } |
322 | 359 |
323 TEST(SubresourceFilterFeaturesTest, WhitelistSiteOnReload) { | 360 TEST(SubresourceFilterFeaturesTest, WhitelistSiteOnReload) { |
324 const struct { | 361 const struct { |
325 bool feature_enabled; | 362 bool feature_enabled; |
326 const char* whitelist_site_on_reload_param; | 363 const char* whitelist_site_on_reload_param; |
327 bool expected_whitelist_site_on_reload_value; | 364 bool expected_whitelist_site_on_reload_value; |
328 } kTestCases[] = {{false, "", false}, | 365 } kTestCases[] = {{false, "", false}, |
329 {false, "true", false}, | 366 {false, "true", false}, |
330 {false, "false", false}, | 367 {false, "false", false}, |
331 {false, "invalid value", false}, | 368 {false, "invalid value", false}, |
332 {true, "", false}, | 369 {true, "", false}, |
333 {true, "false", false}, | 370 {true, "false", false}, |
334 {true, "invalid value", false}, | 371 {true, "invalid value", false}, |
335 {true, "True", true}, | 372 {true, "True", true}, |
336 {true, "TRUE", true}, | 373 {true, "TRUE", true}, |
337 {true, "true", true}}; | 374 {true, "true", true}}; |
338 | 375 |
339 for (const auto& test_case : kTestCases) { | 376 for (const auto& test_case : kTestCases) { |
340 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); | 377 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); |
341 SCOPED_TRACE(::testing::Message("WhitelistSiteOnReloadParam = \"") | 378 SCOPED_TRACE(::testing::Message("WhitelistSiteOnReloadParam = \"") |
342 << test_case.whitelist_site_on_reload_param << "\""); | 379 << test_case.whitelist_site_on_reload_param << "\""); |
343 | 380 |
344 testing::ScopedExperimentalStateToggle scoped_experimental_state( | 381 ScopedExperimentalStateToggle scoped_experimental_state( |
345 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE | 382 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE |
346 : base::FeatureList::OVERRIDE_USE_DEFAULT, | 383 : base::FeatureList::OVERRIDE_USE_DEFAULT, |
347 {{kWhitelistSiteOnReloadParameterName, | 384 {{kWhitelistSiteOnReloadParameterName, |
348 test_case.whitelist_site_on_reload_param}}); | 385 test_case.whitelist_site_on_reload_param}}); |
349 | 386 |
350 const auto active_configurations = GetActiveConfigurations(); | 387 Configuration actual_configuration; |
351 const Configuration& actual_configuration = | 388 ExpectAndRetrieveExactlyOneEnabledConfig(&actual_configuration); |
352 active_configurations->the_one_and_only(); | |
353 EXPECT_EQ(test_case.expected_whitelist_site_on_reload_value, | 389 EXPECT_EQ(test_case.expected_whitelist_site_on_reload_value, |
354 actual_configuration.should_whitelist_site_on_reload); | 390 actual_configuration.activation_options |
391 .should_whitelist_site_on_reload); | |
355 } | 392 } |
356 } | 393 } |
357 | 394 |
358 TEST(SubresourceFilterFeaturesTest, RulesetFlavor) { | 395 TEST(SubresourceFilterFeaturesTest, RulesetFlavor) { |
359 const struct { | 396 const struct { |
360 bool feature_enabled; | 397 bool feature_enabled; |
361 const char* ruleset_flavor_param; | 398 const char* ruleset_flavor_param; |
362 const char* expected_ruleset_flavor_value; | 399 const char* expected_ruleset_flavor_value; |
363 } kTestCases[] = { | 400 } kTestCases[] = { |
364 {false, "", ""}, {false, "a", ""}, {false, "test value", ""}, | 401 {false, "", ""}, {false, "a", ""}, {false, "test value", ""}, |
365 {true, "", ""}, {true, "a", "a"}, {true, "test value", "test value"}}; | 402 {true, "", ""}, {true, "a", "a"}, {true, "test value", "test value"}}; |
366 | 403 |
367 for (const auto& test_case : kTestCases) { | 404 for (const auto& test_case : kTestCases) { |
368 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); | 405 SCOPED_TRACE(::testing::Message("Enabled = ") << test_case.feature_enabled); |
369 SCOPED_TRACE(::testing::Message("Flavor = \"") | 406 SCOPED_TRACE(::testing::Message("Flavor = \"") |
370 << test_case.ruleset_flavor_param << "\""); | 407 << test_case.ruleset_flavor_param << "\""); |
371 | 408 |
372 testing::ScopedExperimentalStateToggle scoped_experimental_state( | 409 ScopedExperimentalStateToggle scoped_experimental_state( |
373 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE | 410 test_case.feature_enabled ? base::FeatureList::OVERRIDE_ENABLE_FEATURE |
374 : base::FeatureList::OVERRIDE_USE_DEFAULT, | 411 : base::FeatureList::OVERRIDE_USE_DEFAULT, |
375 {{kRulesetFlavorParameterName, test_case.ruleset_flavor_param}}); | 412 {{kRulesetFlavorParameterName, test_case.ruleset_flavor_param}}); |
376 | 413 |
377 const auto active_configurations = GetActiveConfigurations(); | 414 Configuration actual_configuration; |
378 const Configuration& actual_configuration = | 415 ExpectAndRetrieveExactlyOneEnabledConfig(&actual_configuration); |
379 active_configurations->the_one_and_only(); | |
380 EXPECT_EQ(std::string(test_case.expected_ruleset_flavor_value), | 416 EXPECT_EQ(std::string(test_case.expected_ruleset_flavor_value), |
381 actual_configuration.ruleset_flavor); | 417 actual_configuration.general_settings.ruleset_flavor); |
382 } | 418 } |
383 } | 419 } |
420 | |
421 TEST(SubresourceFilterFeaturesTest, ConfigurationPriorities) { | |
422 const Configuration kConfigurationsByDecreasingPriority[] = { | |
pkalinnikov
2017/05/04 12:04:23
nit: Can you make this const std::vector<Configura
engedy
2017/05/05 12:25:42
Done.
| |
423 {ActivationLevel::ENABLED, ActivationScope::ACTIVATION_LIST, | |
424 ActivationList::SUBRESOURCE_FILTER}, | |
425 {ActivationLevel::ENABLED, ActivationScope::ACTIVATION_LIST, | |
426 ActivationList::PHISHING_INTERSTITIAL}, | |
427 {ActivationLevel::ENABLED, ActivationScope::ACTIVATION_LIST, | |
428 ActivationList::SOCIAL_ENG_ADS_INTERSTITIAL}, | |
429 {ActivationLevel::ENABLED, ActivationScope::ALL_SITES}, | |
430 {ActivationLevel::ENABLED, ActivationScope::NO_SITES}, | |
431 {ActivationLevel::DRYRUN, ActivationScope::ACTIVATION_LIST}, | |
432 {ActivationLevel::DRYRUN, ActivationScope::ALL_SITES}, | |
433 {ActivationLevel::DRYRUN, ActivationScope::NO_SITES}, | |
434 {ActivationLevel::DISABLED, ActivationScope::ACTIVATION_LIST}, | |
435 {ActivationLevel::DISABLED, ActivationScope::ALL_SITES}, | |
436 {ActivationLevel::DISABLED, ActivationScope::NO_SITES}, | |
437 Configuration() /* default constructor */ | |
pkalinnikov
2017/05/04 12:04:23
nit: comma?
engedy
2017/05/05 12:25:42
I am not sure I understand. We don't have trailing
pkalinnikov
2017/05/05 13:29:58
I suggested to put comma after /* default_construc
engedy
2017/05/05 19:24:10
OK, for consistency, let's not have a trailing com
| |
438 }; | |
439 | |
440 const std::vector<Configuration> expected_order_by_decreasing_priority = | |
441 AsVector(kConfigurationsByDecreasingPriority); | |
442 std::vector<Configuration> reverse_order( | |
443 expected_order_by_decreasing_priority.rbegin(), | |
444 expected_order_by_decreasing_priority.rend()); | |
445 subresource_filter::testing::ScopedSubresourceFilterConfigurator | |
446 scoped_configuration(std::move(reverse_order)); | |
pkalinnikov
2017/05/04 12:04:23
#include <utility> for std::move.
engedy
2017/05/05 12:25:42
Done.
| |
447 EXPECT_THAT( | |
448 GetEnabledConfigurations()->configs_by_decreasing_priority(), | |
449 ::testing::ElementsAreArray(expected_order_by_decreasing_priority)); | |
450 } | |
451 | |
452 TEST(SubresourceFilterFeaturesTest, MostSpecificRulesetFlavor) { | |
453 const struct { | |
454 const char* expected_ruleset_flavor_selected; | |
455 std::vector<std::string> ruleset_flavors; | |
456 } kTestCases[] = {{"", std::vector<std::string>()}, | |
457 {"", {""}}, | |
458 {"a", {"a"}}, | |
459 {"e", {"e"}}, | |
460 {"foo", {"foo"}}, | |
461 {"", {"", ""}}, | |
462 {"a", {"a", ""}}, | |
463 {"a", {"", "a"}}, | |
464 {"a", {"a", "a"}}, | |
465 {"c", {"b", "", "c"}}, | |
466 {"b", {"", "b", "a"}}, | |
467 {"foo", {"", "a", "foo"}}, | |
468 {"foo", {"foo", "bar", "b"}}}; | |
469 | |
470 for (const auto& test_case : kTestCases) { | |
471 SCOPED_TRACE(::testing::Message() | |
472 << "ruleset_flavors: " | |
473 << ::testing::PrintToString(test_case.ruleset_flavors)); | |
474 | |
475 std::vector<Configuration> configs; | |
476 for (const auto& ruleset_flavor : test_case.ruleset_flavors) { | |
477 Configuration config; | |
478 config.general_settings.ruleset_flavor = ruleset_flavor; | |
479 configs.push_back(std::move(config)); | |
480 } | |
481 | |
482 subresource_filter::testing::ScopedSubresourceFilterConfigurator | |
483 scoped_configuration(std::move(configs)); | |
484 EXPECT_EQ(test_case.expected_ruleset_flavor_selected, | |
485 GetEnabledConfigurations()->GetMostSpecificRulesetFlavor()); | |
486 } | |
487 } | |
488 | |
489 TEST(SubresourceFilterFeaturesTest, EnabledConfigurations_FeatureDisabled) { | |
490 ScopedExperimentalStateToggle scoped_experimental_state( | |
491 base::FeatureList::OVERRIDE_USE_DEFAULT, | |
492 std::map<std::string, std::string>()); | |
493 | |
494 const auto config_list = GetEnabledConfigurations(); | |
495 EXPECT_THAT(config_list->configs_by_decreasing_priority(), | |
496 ::testing::ElementsAre(Configuration())); | |
497 EXPECT_EQ(std::string(), config_list->GetMostSpecificRulesetFlavor()); | |
498 } | |
499 | |
500 TEST(SubresourceFilterFeaturesTest, | |
501 EnabledConfigurations_FeatureEnabledWithNoParameters) { | |
502 ScopedExperimentalStateToggle scoped_experimental_state( | |
503 base::FeatureList::OVERRIDE_USE_DEFAULT, {}); | |
504 | |
505 const auto config_list = GetEnabledConfigurations(); | |
506 EXPECT_THAT(config_list->configs_by_decreasing_priority(), | |
507 ::testing::ElementsAre(Configuration())); | |
508 EXPECT_EQ(std::string(), config_list->GetMostSpecificRulesetFlavor()); | |
509 } | |
510 | |
511 TEST(SubresourceFilterFeaturesTest, PresetForLiveRunOnPhishingSites) { | |
512 ExpectPresetCanBeEnabledByName( | |
513 Configuration::MakePresetForLiveRunOnPhishingSites(), | |
514 kPresetLiveRunOnPhishingSites); | |
515 ExpectPresetIsEquivalentToVariationParams( | |
516 Configuration::MakePresetForLiveRunOnPhishingSites(), | |
517 {{kActivationLevelParameterName, kActivationLevelEnabled}, | |
518 {kActivationScopeParameterName, kActivationScopeActivationList}, | |
519 {kActivationListsParameterName, kActivationListPhishingInterstitial}}); | |
520 } | |
521 | |
522 TEST(SubresourceFilterFeaturesTest, | |
523 PresetForPerformanceTestingDryRunOnAllSites) { | |
524 ExpectPresetCanBeEnabledByName( | |
525 Configuration::MakePresetForPerformanceTestingDryRunOnAllSites(), | |
526 kPresetPerformanceTestingDryRunOnAllSites); | |
527 ExpectPresetIsEquivalentToVariationParams( | |
528 Configuration::MakePresetForPerformanceTestingDryRunOnAllSites(), | |
529 {{kActivationLevelParameterName, kActivationLevelDryRun}, | |
530 {kActivationScopeParameterName, kActivationScopeAllSites}, | |
531 {kPerformanceMeasurementRateParameterName, "1.0"}}); | |
532 } | |
533 | |
534 TEST(SubresourceFilterFeaturesTest, EnabledConfigurations_MultiplePresets) { | |
535 const std::string kPhishing(kPresetLiveRunOnPhishingSites); | |
536 const std::string kPerfTest(kPresetPerformanceTestingDryRunOnAllSites); | |
537 const struct { | |
538 std::string preset_name_list; | |
539 } kTestCases[] = { | |
540 {kPhishing + "," + kPerfTest}, | |
541 {kPerfTest + "," + kPhishing}, | |
542 {base::ToUpperASCII(kPhishing) + "," + base::ToUpperASCII(kPerfTest)}, | |
543 {",, ," + kPerfTest + ",," + kPhishing}, | |
544 {"garbage,garbage2," + kPerfTest + "," + kPhishing}}; | |
545 | |
546 for (const auto& test_case : kTestCases) { | |
547 SCOPED_TRACE(::testing::Message() | |
548 << "preset_name_list: " << test_case.preset_name_list); | |
549 | |
550 ScopedExperimentalStateToggle scoped_experimental_state( | |
551 base::FeatureList::OVERRIDE_ENABLE_FEATURE, | |
552 {{kEnablePresetsParameterName, test_case.preset_name_list}}); | |
553 | |
554 const auto config_list = GetEnabledConfigurations(); | |
555 EXPECT_THAT( | |
556 config_list->configs_by_decreasing_priority(), | |
557 ::testing::ElementsAre( | |
558 Configuration::MakePresetForLiveRunOnPhishingSites(), | |
559 Configuration::MakePresetForPerformanceTestingDryRunOnAllSites(), | |
560 Configuration())); | |
561 EXPECT_EQ(std::string(), config_list->GetMostSpecificRulesetFlavor()); | |
562 } | |
563 } | |
564 | |
565 TEST(SubresourceFilterFeaturesTest, | |
566 EnabledConfigurations_MultiplePresetsAndExperimentalConfig) { | |
567 const std::string kPhishing(kPresetLiveRunOnPhishingSites); | |
568 const std::string kPerfTest(kPresetPerformanceTestingDryRunOnAllSites); | |
569 const std::string kTestRulesetFlavor("foobar"); | |
570 | |
571 ScopedExperimentalStateToggle scoped_experimental_state( | |
572 base::FeatureList::OVERRIDE_ENABLE_FEATURE, | |
573 {{kEnablePresetsParameterName, kPhishing + "," + kPerfTest}, | |
574 {kActivationLevelParameterName, kActivationLevelDryRun}, | |
575 {kActivationScopeParameterName, kActivationScopeActivationList}, | |
576 {kActivationListsParameterName, kActivationListSubresourceFilter}, | |
577 {kRulesetFlavorParameterName, kTestRulesetFlavor}}); | |
578 | |
579 Configuration experimental_config(ActivationLevel::DRYRUN, | |
580 ActivationScope::ACTIVATION_LIST, | |
581 ActivationList::SUBRESOURCE_FILTER); | |
582 experimental_config.general_settings.ruleset_flavor = kTestRulesetFlavor; | |
583 | |
584 const auto config_list = GetEnabledConfigurations(); | |
585 EXPECT_THAT( | |
586 config_list->configs_by_decreasing_priority(), | |
587 ::testing::ElementsAre( | |
588 Configuration::MakePresetForLiveRunOnPhishingSites(), | |
589 experimental_config, | |
590 Configuration::MakePresetForPerformanceTestingDryRunOnAllSites())); | |
591 EXPECT_EQ(kTestRulesetFlavor, config_list->GetMostSpecificRulesetFlavor()); | |
592 } | |
593 | |
384 } // namespace subresource_filter | 594 } // namespace subresource_filter |
OLD | NEW |