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 "chrome/browser/safe_browsing/permission_reporter.h" | 5 #include "chrome/browser/safe_browsing/permission_reporter.h" |
6 | 6 |
7 #include "base/feature_list.h" | 7 #include "base/feature_list.h" |
8 #include "base/memory/ptr_util.h" | 8 #include "base/memory/ptr_util.h" |
9 #include "base/metrics/field_trial.h" | 9 #include "base/metrics/field_trial.h" |
10 #include "base/test/simple_test_clock.h" | 10 #include "base/test/simple_test_clock.h" |
(...skipping 15 matching lines...) Expand all Loading... |
26 "http://safebrowsing.googleusercontent.com/safebrowsing/clientreport/" | 26 "http://safebrowsing.googleusercontent.com/safebrowsing/clientreport/" |
27 "permission-action"; | 27 "permission-action"; |
28 | 28 |
29 const int kMaximumReportsPerOriginPerPermissionPerMinute = 5; | 29 const int kMaximumReportsPerOriginPerPermissionPerMinute = 5; |
30 | 30 |
31 const char kDummyOriginOne[] = "http://example.test/"; | 31 const char kDummyOriginOne[] = "http://example.test/"; |
32 const char kDummyOriginTwo[] = "http://example2.test/"; | 32 const char kDummyOriginTwo[] = "http://example2.test/"; |
33 const PermissionType kDummyPermissionOne = PermissionType::GEOLOCATION; | 33 const PermissionType kDummyPermissionOne = PermissionType::GEOLOCATION; |
34 const PermissionType kDummyPermissionTwo = PermissionType::NOTIFICATIONS; | 34 const PermissionType kDummyPermissionTwo = PermissionType::NOTIFICATIONS; |
35 const PermissionAction kDummyAction = GRANTED; | 35 const PermissionAction kDummyAction = GRANTED; |
| 36 const PermissionSourceUI kDummySourceUI = PermissionSourceUI::PROMPT; |
36 | 37 |
37 const char kDummyTrialOne[] = "trial one"; | 38 const char kDummyTrialOne[] = "trial one"; |
38 const char kDummyGroupOne[] = "group one"; | 39 const char kDummyGroupOne[] = "group one"; |
39 const char kDummyTrialTwo[] = "trial two"; | 40 const char kDummyTrialTwo[] = "trial two"; |
40 const char kDummyGroupTwo[] = "group two"; | 41 const char kDummyGroupTwo[] = "group two"; |
41 | 42 |
42 const char kFeatureOnByDefaultName[] = "OnByDefault"; | 43 const char kFeatureOnByDefaultName[] = "OnByDefault"; |
43 struct base::Feature kFeatureOnByDefault { | 44 struct base::Feature kFeatureOnByDefault { |
44 kFeatureOnByDefaultName, base::FEATURE_ENABLED_BY_DEFAULT | 45 kFeatureOnByDefaultName, base::FEATURE_ENABLED_BY_DEFAULT |
45 }; | 46 }; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 // Owned by |permission_reporter_|. | 100 // Owned by |permission_reporter_|. |
100 base::SimpleTestClock* clock_; | 101 base::SimpleTestClock* clock_; |
101 | 102 |
102 std::unique_ptr<PermissionReporter> permission_reporter_; | 103 std::unique_ptr<PermissionReporter> permission_reporter_; |
103 }; | 104 }; |
104 | 105 |
105 // Test that PermissionReporter::SendReport sends a serialized report string to | 106 // Test that PermissionReporter::SendReport sends a serialized report string to |
106 // SafeBrowsing CSD servers. | 107 // SafeBrowsing CSD servers. |
107 TEST_F(PermissionReporterTest, SendReport) { | 108 TEST_F(PermissionReporterTest, SendReport) { |
108 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 109 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
109 kDummyAction); | 110 kDummyAction, kDummySourceUI); |
110 | 111 |
111 PermissionReport permission_report; | 112 PermissionReport permission_report; |
112 ASSERT_TRUE( | 113 ASSERT_TRUE( |
113 permission_report.ParseFromString(mock_report_sender_->latest_report())); | 114 permission_report.ParseFromString(mock_report_sender_->latest_report())); |
114 EXPECT_EQ(PermissionReport::GEOLOCATION, permission_report.permission()); | 115 EXPECT_EQ(PermissionReport::GEOLOCATION, permission_report.permission()); |
115 EXPECT_EQ(PermissionReport::GRANTED, permission_report.action()); | 116 EXPECT_EQ(PermissionReport::GRANTED, permission_report.action()); |
| 117 EXPECT_EQ(PermissionReport::PROMPT, permission_report.source_ui()); |
116 EXPECT_EQ(kDummyOriginOne, permission_report.origin()); | 118 EXPECT_EQ(kDummyOriginOne, permission_report.origin()); |
117 #if defined(OS_ANDROID) | 119 #if defined(OS_ANDROID) |
118 EXPECT_EQ(PermissionReport::ANDROID_PLATFORM, | 120 EXPECT_EQ(PermissionReport::ANDROID_PLATFORM, |
119 permission_report.platform_type()); | 121 permission_report.platform_type()); |
120 #elif defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_CHROMEOS) || \ | 122 #elif defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_CHROMEOS) || \ |
121 defined(OS_LINUX) | 123 defined(OS_LINUX) |
122 EXPECT_EQ(PermissionReport::DESKTOP_PLATFORM, | 124 EXPECT_EQ(PermissionReport::DESKTOP_PLATFORM, |
123 permission_report.platform_type()); | 125 permission_report.platform_type()); |
124 #endif | 126 #endif |
125 | 127 |
(...skipping 26 matching lines...) Expand all Loading... |
152 base::FeatureList::SetInstance(std::move(feature_list)); | 154 base::FeatureList::SetInstance(std::move(feature_list)); |
153 | 155 |
154 // This is necessary to activate both field trials. | 156 // This is necessary to activate both field trials. |
155 base::FeatureList::IsEnabled(kFeatureOnByDefault); | 157 base::FeatureList::IsEnabled(kFeatureOnByDefault); |
156 base::FeatureList::IsEnabled(kFeatureOffByDefault); | 158 base::FeatureList::IsEnabled(kFeatureOffByDefault); |
157 | 159 |
158 EXPECT_TRUE(base::FieldTrialList::IsTrialActive(trial_one->trial_name())); | 160 EXPECT_TRUE(base::FieldTrialList::IsTrialActive(trial_one->trial_name())); |
159 EXPECT_TRUE(base::FieldTrialList::IsTrialActive(trial_two->trial_name())); | 161 EXPECT_TRUE(base::FieldTrialList::IsTrialActive(trial_two->trial_name())); |
160 | 162 |
161 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 163 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
162 kDummyAction); | 164 kDummyAction, kDummySourceUI); |
163 | 165 |
164 PermissionReport permission_report; | 166 PermissionReport permission_report; |
165 ASSERT_TRUE( | 167 ASSERT_TRUE( |
166 permission_report.ParseFromString(mock_report_sender_->latest_report())); | 168 permission_report.ParseFromString(mock_report_sender_->latest_report())); |
167 | 169 |
168 variations::ActiveGroupId field_trial_one = | 170 variations::ActiveGroupId field_trial_one = |
169 variations::MakeActiveGroupId(kDummyTrialOne, kDummyGroupOne); | 171 variations::MakeActiveGroupId(kDummyTrialOne, kDummyGroupOne); |
170 variations::ActiveGroupId field_trial_two = | 172 variations::ActiveGroupId field_trial_two = |
171 variations::MakeActiveGroupId(kDummyTrialTwo, kDummyGroupTwo); | 173 variations::MakeActiveGroupId(kDummyTrialTwo, kDummyGroupTwo); |
172 ActiveGroupIdSet expected_group_ids = {field_trial_one, field_trial_two}; | 174 ActiveGroupIdSet expected_group_ids = {field_trial_one, field_trial_two}; |
173 | 175 |
174 EXPECT_EQ(2, permission_report.field_trials().size()); | 176 EXPECT_EQ(2, permission_report.field_trials().size()); |
175 for (auto field_trial : permission_report.field_trials()) { | 177 for (auto field_trial : permission_report.field_trials()) { |
176 variations::ActiveGroupId group_id = {field_trial.name_id(), | 178 variations::ActiveGroupId group_id = {field_trial.name_id(), |
177 field_trial.group_id()}; | 179 field_trial.group_id()}; |
178 EXPECT_EQ(1U, expected_group_ids.erase(group_id)); | 180 EXPECT_EQ(1U, expected_group_ids.erase(group_id)); |
179 } | 181 } |
180 EXPECT_EQ(0U, expected_group_ids.size()); | 182 EXPECT_EQ(0U, expected_group_ids.size()); |
181 } | 183 } |
182 | 184 |
183 // Test that PermissionReporter::IsReportThresholdExceeded returns false only | 185 // Test that PermissionReporter::IsReportThresholdExceeded returns false only |
184 // when the number of reports sent in the last one minute per origin per | 186 // when the number of reports sent in the last one minute per origin per |
185 // permission is under a threshold. | 187 // permission is under a threshold. |
186 TEST_F(PermissionReporterTest, IsReportThresholdExceeded) { | 188 TEST_F(PermissionReporterTest, IsReportThresholdExceeded) { |
187 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 189 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
188 | 190 |
189 int reports_to_send = kMaximumReportsPerOriginPerPermissionPerMinute; | 191 int reports_to_send = kMaximumReportsPerOriginPerPermissionPerMinute; |
190 while (reports_to_send--) | 192 while (reports_to_send--) |
191 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 193 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
192 kDummyAction); | 194 kDummyAction, kDummySourceUI); |
193 EXPECT_EQ(5, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 195 EXPECT_EQ(5, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
194 | 196 |
195 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 197 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
196 kDummyAction); | 198 kDummyAction, kDummySourceUI); |
197 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 199 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
198 | 200 |
199 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionTwo, | 201 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionTwo, |
200 kDummyAction); | 202 kDummyAction, kDummySourceUI); |
201 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 203 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
202 | 204 |
203 permission_reporter_->SendReport(GURL(kDummyOriginTwo), kDummyPermissionOne, | 205 permission_reporter_->SendReport(GURL(kDummyOriginTwo), kDummyPermissionOne, |
204 kDummyAction); | 206 kDummyAction, kDummySourceUI); |
205 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 207 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
206 | 208 |
207 clock_->Advance(base::TimeDelta::FromMinutes(1)); | 209 clock_->Advance(base::TimeDelta::FromMinutes(1)); |
208 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 210 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
209 kDummyAction); | 211 kDummyAction, kDummySourceUI); |
210 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 212 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
211 | 213 |
212 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); | 214 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
213 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 215 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
214 kDummyAction); | 216 kDummyAction, kDummySourceUI); |
215 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 217 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
216 | 218 |
217 clock_->Advance(base::TimeDelta::FromMinutes(1)); | 219 clock_->Advance(base::TimeDelta::FromMinutes(1)); |
218 reports_to_send = 12; | 220 reports_to_send = 12; |
219 while (reports_to_send--) { | 221 while (reports_to_send--) { |
220 clock_->Advance(base::TimeDelta::FromSeconds(5)); | 222 clock_->Advance(base::TimeDelta::FromSeconds(5)); |
221 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 223 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
222 kDummyAction); | 224 kDummyAction, kDummySourceUI); |
223 } | 225 } |
224 EXPECT_EQ(kMaximumReportsPerOriginPerPermissionPerMinute, | 226 EXPECT_EQ(kMaximumReportsPerOriginPerPermissionPerMinute, |
225 mock_report_sender_->GetAndResetNumberOfReportsSent()); | 227 mock_report_sender_->GetAndResetNumberOfReportsSent()); |
226 } | 228 } |
227 | 229 |
228 } // namespace safe_browsing | 230 } // namespace safe_browsing |
OLD | NEW |