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 19 matching lines...) Expand all Loading... |
30 const int kMaximumReportsPerOriginPerPermissionPerMinute = 5; | 30 const int kMaximumReportsPerOriginPerPermissionPerMinute = 5; |
31 | 31 |
32 const char kDummyOriginOne[] = "http://example.test/"; | 32 const char kDummyOriginOne[] = "http://example.test/"; |
33 const char kDummyOriginTwo[] = "http://example2.test/"; | 33 const char kDummyOriginTwo[] = "http://example2.test/"; |
34 const PermissionType kDummyPermissionOne = PermissionType::GEOLOCATION; | 34 const PermissionType kDummyPermissionOne = PermissionType::GEOLOCATION; |
35 const PermissionType kDummyPermissionTwo = PermissionType::NOTIFICATIONS; | 35 const PermissionType kDummyPermissionTwo = PermissionType::NOTIFICATIONS; |
36 const PermissionAction kDummyAction = GRANTED; | 36 const PermissionAction kDummyAction = GRANTED; |
37 const PermissionSourceUI kDummySourceUI = PermissionSourceUI::PROMPT; | 37 const PermissionSourceUI kDummySourceUI = PermissionSourceUI::PROMPT; |
38 const PermissionRequestGestureType kDummyGestureType = | 38 const PermissionRequestGestureType kDummyGestureType = |
39 PermissionRequestGestureType::GESTURE; | 39 PermissionRequestGestureType::GESTURE; |
| 40 const int kDummyNumPriorDismissals = 10; |
| 41 const int kDummyNumPriorIgnores = 12; |
40 | 42 |
41 const char kDummyTrialOne[] = "trial one"; | 43 const char kDummyTrialOne[] = "trial one"; |
42 const char kDummyGroupOne[] = "group one"; | 44 const char kDummyGroupOne[] = "group one"; |
43 const char kDummyTrialTwo[] = "trial two"; | 45 const char kDummyTrialTwo[] = "trial two"; |
44 const char kDummyGroupTwo[] = "group two"; | 46 const char kDummyGroupTwo[] = "group two"; |
45 | 47 |
46 const char kFeatureOnByDefaultName[] = "OnByDefault"; | 48 const char kFeatureOnByDefaultName[] = "OnByDefault"; |
47 struct base::Feature kFeatureOnByDefault { | 49 struct base::Feature kFeatureOnByDefault { |
48 kFeatureOnByDefaultName, base::FEATURE_ENABLED_BY_DEFAULT | 50 kFeatureOnByDefaultName, base::FEATURE_ENABLED_BY_DEFAULT |
49 }; | 51 }; |
(...skipping 21 matching lines...) Expand all Loading... |
71 base::SimpleTestClock* clock_; | 73 base::SimpleTestClock* clock_; |
72 | 74 |
73 std::unique_ptr<PermissionReporter> permission_reporter_; | 75 std::unique_ptr<PermissionReporter> permission_reporter_; |
74 }; | 76 }; |
75 | 77 |
76 // Test that PermissionReporter::SendReport sends a serialized report string to | 78 // Test that PermissionReporter::SendReport sends a serialized report string to |
77 // SafeBrowsing CSD servers. | 79 // SafeBrowsing CSD servers. |
78 TEST_F(PermissionReporterTest, SendReport) { | 80 TEST_F(PermissionReporterTest, SendReport) { |
79 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 81 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
80 kDummyAction, kDummySourceUI, | 82 kDummyAction, kDummySourceUI, |
81 kDummyGestureType); | 83 kDummyGestureType, kDummyNumPriorDismissals, |
| 84 kDummyNumPriorIgnores); |
82 | 85 |
83 PermissionReport permission_report; | 86 PermissionReport permission_report; |
84 ASSERT_TRUE( | 87 ASSERT_TRUE( |
85 permission_report.ParseFromString(mock_report_sender_->latest_report())); | 88 permission_report.ParseFromString(mock_report_sender_->latest_report())); |
86 EXPECT_EQ(PermissionReport::GEOLOCATION, permission_report.permission()); | 89 EXPECT_EQ(PermissionReport::GEOLOCATION, permission_report.permission()); |
87 EXPECT_EQ(PermissionReport::GRANTED, permission_report.action()); | 90 EXPECT_EQ(PermissionReport::GRANTED, permission_report.action()); |
88 EXPECT_EQ(PermissionReport::PROMPT, permission_report.source_ui()); | 91 EXPECT_EQ(PermissionReport::PROMPT, permission_report.source_ui()); |
89 EXPECT_EQ(PermissionReport::GESTURE, permission_report.gesture()); | 92 EXPECT_EQ(PermissionReport::GESTURE, permission_report.gesture()); |
90 EXPECT_EQ(kDummyOriginOne, permission_report.origin()); | 93 EXPECT_EQ(kDummyOriginOne, permission_report.origin()); |
| 94 EXPECT_EQ(kDummyNumPriorDismissals, |
| 95 permission_report.num_prior_dismissals()); |
| 96 EXPECT_EQ(kDummyNumPriorIgnores, permission_report.num_prior_ignores()); |
91 #if defined(OS_ANDROID) | 97 #if defined(OS_ANDROID) |
92 EXPECT_EQ(PermissionReport::ANDROID_PLATFORM, | 98 EXPECT_EQ(PermissionReport::ANDROID_PLATFORM, |
93 permission_report.platform_type()); | 99 permission_report.platform_type()); |
94 #elif defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_CHROMEOS) || \ | 100 #elif defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_CHROMEOS) || \ |
95 defined(OS_LINUX) | 101 defined(OS_LINUX) |
96 EXPECT_EQ(PermissionReport::DESKTOP_PLATFORM, | 102 EXPECT_EQ(PermissionReport::DESKTOP_PLATFORM, |
97 permission_report.platform_type()); | 103 permission_report.platform_type()); |
98 #endif | 104 #endif |
99 | 105 |
100 EXPECT_EQ(GURL(kPermissionActionReportingUploadUrl), | 106 EXPECT_EQ(GURL(kPermissionActionReportingUploadUrl), |
(...skipping 26 matching lines...) Expand all Loading... |
127 | 133 |
128 // This is necessary to activate both field trials. | 134 // This is necessary to activate both field trials. |
129 base::FeatureList::IsEnabled(kFeatureOnByDefault); | 135 base::FeatureList::IsEnabled(kFeatureOnByDefault); |
130 base::FeatureList::IsEnabled(kFeatureOffByDefault); | 136 base::FeatureList::IsEnabled(kFeatureOffByDefault); |
131 | 137 |
132 EXPECT_TRUE(base::FieldTrialList::IsTrialActive(trial_one->trial_name())); | 138 EXPECT_TRUE(base::FieldTrialList::IsTrialActive(trial_one->trial_name())); |
133 EXPECT_TRUE(base::FieldTrialList::IsTrialActive(trial_two->trial_name())); | 139 EXPECT_TRUE(base::FieldTrialList::IsTrialActive(trial_two->trial_name())); |
134 | 140 |
135 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 141 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
136 kDummyAction, kDummySourceUI, | 142 kDummyAction, kDummySourceUI, |
137 kDummyGestureType); | 143 kDummyGestureType, kDummyNumPriorDismissals, |
| 144 kDummyNumPriorIgnores); |
138 | 145 |
139 PermissionReport permission_report; | 146 PermissionReport permission_report; |
140 ASSERT_TRUE( | 147 ASSERT_TRUE( |
141 permission_report.ParseFromString(mock_report_sender_->latest_report())); | 148 permission_report.ParseFromString(mock_report_sender_->latest_report())); |
142 | 149 |
143 variations::ActiveGroupId field_trial_one = | 150 variations::ActiveGroupId field_trial_one = |
144 variations::MakeActiveGroupId(kDummyTrialOne, kDummyGroupOne); | 151 variations::MakeActiveGroupId(kDummyTrialOne, kDummyGroupOne); |
145 variations::ActiveGroupId field_trial_two = | 152 variations::ActiveGroupId field_trial_two = |
146 variations::MakeActiveGroupId(kDummyTrialTwo, kDummyGroupTwo); | 153 variations::MakeActiveGroupId(kDummyTrialTwo, kDummyGroupTwo); |
147 ActiveGroupIdSet expected_group_ids = {field_trial_one, field_trial_two}; | 154 ActiveGroupIdSet expected_group_ids = {field_trial_one, field_trial_two}; |
148 | 155 |
149 EXPECT_EQ(2, permission_report.field_trials().size()); | 156 EXPECT_EQ(2, permission_report.field_trials().size()); |
150 for (auto field_trial : permission_report.field_trials()) { | 157 for (auto field_trial : permission_report.field_trials()) { |
151 variations::ActiveGroupId group_id = {field_trial.name_id(), | 158 variations::ActiveGroupId group_id = {field_trial.name_id(), |
152 field_trial.group_id()}; | 159 field_trial.group_id()}; |
153 EXPECT_EQ(1U, expected_group_ids.erase(group_id)); | 160 EXPECT_EQ(1U, expected_group_ids.erase(group_id)); |
154 } | 161 } |
155 EXPECT_EQ(0U, expected_group_ids.size()); | 162 EXPECT_EQ(0U, expected_group_ids.size()); |
156 } | 163 } |
157 | 164 |
158 // Test that PermissionReporter::IsReportThresholdExceeded returns false only | 165 // Test that PermissionReporter::IsReportThresholdExceeded returns false only |
159 // when the number of reports sent in the last one minute per origin per | 166 // when the number of reports sent in the last one minute per origin per |
160 // permission is under a threshold. | 167 // permission is under a threshold. |
161 TEST_F(PermissionReporterTest, IsReportThresholdExceeded) { | 168 TEST_F(PermissionReporterTest, IsReportThresholdExceeded) { |
162 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 169 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
163 | 170 |
164 int reports_to_send = kMaximumReportsPerOriginPerPermissionPerMinute; | 171 int reports_to_send = kMaximumReportsPerOriginPerPermissionPerMinute; |
165 while (reports_to_send--) | 172 while (reports_to_send--) |
166 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 173 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
167 kDummyAction, kDummySourceUI, | 174 kDummyAction, kDummySourceUI, kDummyGestureType, |
168 kDummyGestureType); | 175 kDummyNumPriorDismissals, kDummyNumPriorIgnores); |
169 EXPECT_EQ(5, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 176 EXPECT_EQ(5, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
170 | 177 |
171 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 178 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
172 kDummyAction, kDummySourceUI, | 179 kDummyAction, kDummySourceUI, kDummyGestureType, |
173 kDummyGestureType); | 180 kDummyNumPriorDismissals, kDummyNumPriorIgnores); |
174 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 181 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
175 | 182 |
176 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionTwo, | 183 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionTwo, |
177 kDummyAction, kDummySourceUI, | 184 kDummyAction, kDummySourceUI, kDummyGestureType, |
178 kDummyGestureType); | 185 kDummyNumPriorDismissals, kDummyNumPriorIgnores); |
179 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 186 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
180 | 187 |
181 permission_reporter_->SendReport(GURL(kDummyOriginTwo), kDummyPermissionOne, | 188 permission_reporter_->SendReport(GURL(kDummyOriginTwo), kDummyPermissionOne, |
182 kDummyAction, kDummySourceUI, | 189 kDummyAction, kDummySourceUI, kDummyGestureType, |
183 kDummyGestureType); | 190 kDummyNumPriorDismissals, kDummyNumPriorIgnores); |
184 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 191 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
185 | 192 |
186 clock_->Advance(base::TimeDelta::FromMinutes(1)); | 193 clock_->Advance(base::TimeDelta::FromMinutes(1)); |
187 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 194 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
188 kDummyAction, kDummySourceUI, | 195 kDummyAction, kDummySourceUI, kDummyGestureType, |
189 kDummyGestureType); | 196 kDummyNumPriorDismissals, kDummyNumPriorIgnores); |
190 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 197 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
191 | 198 |
192 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); | 199 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
193 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 200 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
194 kDummyAction, kDummySourceUI, | 201 kDummyAction, kDummySourceUI, kDummyGestureType, |
195 kDummyGestureType); | 202 kDummyNumPriorDismissals, kDummyNumPriorIgnores); |
196 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 203 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
197 | 204 |
198 clock_->Advance(base::TimeDelta::FromMinutes(1)); | 205 clock_->Advance(base::TimeDelta::FromMinutes(1)); |
199 reports_to_send = 12; | 206 reports_to_send = 12; |
200 while (reports_to_send--) { | 207 while (reports_to_send--) { |
201 clock_->Advance(base::TimeDelta::FromSeconds(5)); | 208 clock_->Advance(base::TimeDelta::FromSeconds(5)); |
202 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 209 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
203 kDummyAction, kDummySourceUI, | 210 kDummyAction, kDummySourceUI, kDummyGestureType, |
204 kDummyGestureType); | 211 kDummyNumPriorDismissals, kDummyNumPriorIgnores); |
205 } | 212 } |
206 EXPECT_EQ(kMaximumReportsPerOriginPerPermissionPerMinute, | 213 EXPECT_EQ(kMaximumReportsPerOriginPerPermissionPerMinute, |
207 mock_report_sender_->GetAndResetNumberOfReportsSent()); | 214 mock_report_sender_->GetAndResetNumberOfReportsSent()); |
208 } | 215 } |
209 | 216 |
210 } // namespace safe_browsing | 217 } // namespace safe_browsing |
OLD | NEW |