| 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 |