| 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" |
| 11 #include "base/time/time.h" | 11 #include "base/time/time.h" |
| 12 #include "chrome/browser/permissions/permission_request.h" |
| 12 #include "chrome/common/safe_browsing/permission_report.pb.h" | 13 #include "chrome/common/safe_browsing/permission_report.pb.h" |
| 13 #include "components/variations/active_field_trials.h" | 14 #include "components/variations/active_field_trials.h" |
| 14 #include "content/public/browser/permission_type.h" | 15 #include "content/public/browser/permission_type.h" |
| 15 #include "net/url_request/report_sender.h" | 16 #include "net/url_request/report_sender.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 17 | 18 |
| 18 using content::PermissionType; | 19 using content::PermissionType; |
| 19 | 20 |
| 20 namespace safe_browsing { | 21 namespace safe_browsing { |
| 21 | 22 |
| 22 namespace { | 23 namespace { |
| 23 | 24 |
| 24 // URL to upload permission action reports. | 25 // URL to upload permission action reports. |
| 25 const char kPermissionActionReportingUploadUrl[] = | 26 const char kPermissionActionReportingUploadUrl[] = |
| 26 "http://safebrowsing.googleusercontent.com/safebrowsing/clientreport/" | 27 "http://safebrowsing.googleusercontent.com/safebrowsing/clientreport/" |
| 27 "permission-action"; | 28 "permission-action"; |
| 28 | 29 |
| 29 const int kMaximumReportsPerOriginPerPermissionPerMinute = 5; | 30 const int kMaximumReportsPerOriginPerPermissionPerMinute = 5; |
| 30 | 31 |
| 31 const char kDummyOriginOne[] = "http://example.test/"; | 32 const char kDummyOriginOne[] = "http://example.test/"; |
| 32 const char kDummyOriginTwo[] = "http://example2.test/"; | 33 const char kDummyOriginTwo[] = "http://example2.test/"; |
| 33 const PermissionType kDummyPermissionOne = PermissionType::GEOLOCATION; | 34 const PermissionType kDummyPermissionOne = PermissionType::GEOLOCATION; |
| 34 const PermissionType kDummyPermissionTwo = PermissionType::NOTIFICATIONS; | 35 const PermissionType kDummyPermissionTwo = PermissionType::NOTIFICATIONS; |
| 35 const PermissionAction kDummyAction = GRANTED; | 36 const PermissionAction kDummyAction = GRANTED; |
| 36 const PermissionSourceUI kDummySourceUI = PermissionSourceUI::PROMPT; | 37 const PermissionSourceUI kDummySourceUI = PermissionSourceUI::PROMPT; |
| 38 const PermissionRequestGestureType kDummyGestureType = |
| 39 PermissionRequestGestureType::GESTURE; |
| 37 | 40 |
| 38 const char kDummyTrialOne[] = "trial one"; | 41 const char kDummyTrialOne[] = "trial one"; |
| 39 const char kDummyGroupOne[] = "group one"; | 42 const char kDummyGroupOne[] = "group one"; |
| 40 const char kDummyTrialTwo[] = "trial two"; | 43 const char kDummyTrialTwo[] = "trial two"; |
| 41 const char kDummyGroupTwo[] = "group two"; | 44 const char kDummyGroupTwo[] = "group two"; |
| 42 | 45 |
| 43 const char kFeatureOnByDefaultName[] = "OnByDefault"; | 46 const char kFeatureOnByDefaultName[] = "OnByDefault"; |
| 44 struct base::Feature kFeatureOnByDefault { | 47 struct base::Feature kFeatureOnByDefault { |
| 45 kFeatureOnByDefaultName, base::FEATURE_ENABLED_BY_DEFAULT | 48 kFeatureOnByDefaultName, base::FEATURE_ENABLED_BY_DEFAULT |
| 46 }; | 49 }; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 base::SimpleTestClock* clock_; | 104 base::SimpleTestClock* clock_; |
| 102 | 105 |
| 103 std::unique_ptr<PermissionReporter> permission_reporter_; | 106 std::unique_ptr<PermissionReporter> permission_reporter_; |
| 104 }; | 107 }; |
| 105 | 108 |
| 106 // Test that PermissionReporter::SendReport sends a serialized report string to | 109 // Test that PermissionReporter::SendReport sends a serialized report string to |
| 107 // SafeBrowsing CSD servers. | 110 // SafeBrowsing CSD servers. |
| 108 TEST_F(PermissionReporterTest, SendReport) { | 111 TEST_F(PermissionReporterTest, SendReport) { |
| 109 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 112 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
| 110 kDummyAction, kDummySourceUI, | 113 kDummyAction, kDummySourceUI, |
| 111 false /* user_gesture */); | 114 kDummyGestureType); |
| 112 | 115 |
| 113 PermissionReport permission_report; | 116 PermissionReport permission_report; |
| 114 ASSERT_TRUE( | 117 ASSERT_TRUE( |
| 115 permission_report.ParseFromString(mock_report_sender_->latest_report())); | 118 permission_report.ParseFromString(mock_report_sender_->latest_report())); |
| 116 EXPECT_EQ(PermissionReport::GEOLOCATION, permission_report.permission()); | 119 EXPECT_EQ(PermissionReport::GEOLOCATION, permission_report.permission()); |
| 117 EXPECT_EQ(PermissionReport::GRANTED, permission_report.action()); | 120 EXPECT_EQ(PermissionReport::GRANTED, permission_report.action()); |
| 118 EXPECT_EQ(PermissionReport::PROMPT, permission_report.source_ui()); | 121 EXPECT_EQ(PermissionReport::PROMPT, permission_report.source_ui()); |
| 122 EXPECT_EQ(PermissionReport::GESTURE, permission_report.gesture()); |
| 119 EXPECT_EQ(kDummyOriginOne, permission_report.origin()); | 123 EXPECT_EQ(kDummyOriginOne, permission_report.origin()); |
| 120 EXPECT_TRUE(permission_report.request_trigger().empty()); | |
| 121 #if defined(OS_ANDROID) | 124 #if defined(OS_ANDROID) |
| 122 EXPECT_EQ(PermissionReport::ANDROID_PLATFORM, | 125 EXPECT_EQ(PermissionReport::ANDROID_PLATFORM, |
| 123 permission_report.platform_type()); | 126 permission_report.platform_type()); |
| 124 #elif defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_CHROMEOS) || \ | 127 #elif defined(OS_MACOSX) || defined(OS_WIN) || defined(OS_CHROMEOS) || \ |
| 125 defined(OS_LINUX) | 128 defined(OS_LINUX) |
| 126 EXPECT_EQ(PermissionReport::DESKTOP_PLATFORM, | 129 EXPECT_EQ(PermissionReport::DESKTOP_PLATFORM, |
| 127 permission_report.platform_type()); | 130 permission_report.platform_type()); |
| 128 #endif | 131 #endif |
| 129 | 132 |
| 130 EXPECT_EQ(GURL(kPermissionActionReportingUploadUrl), | 133 EXPECT_EQ(GURL(kPermissionActionReportingUploadUrl), |
| 131 mock_report_sender_->latest_report_uri()); | 134 mock_report_sender_->latest_report_uri()); |
| 132 } | 135 } |
| 133 | 136 |
| 134 // Test that PermissionReporter::SendReport sends a serialized report string | 137 // Test that PermissionReporter::SendReport sends a serialized report string |
| 135 // with request trigger to SafeBrowsing CSD servers. | |
| 136 TEST_F(PermissionReporterTest, SendReportWithRequestTrigger) { | |
| 137 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | |
| 138 kDummyAction, kDummySourceUI, | |
| 139 true /* user_gesture */); | |
| 140 | |
| 141 PermissionReport permission_report; | |
| 142 ASSERT_TRUE( | |
| 143 permission_report.ParseFromString(mock_report_sender_->latest_report())); | |
| 144 EXPECT_EQ(1, permission_report.request_trigger().size()); | |
| 145 EXPECT_EQ(PermissionReport::AFTER_GESTURE, | |
| 146 static_cast<PermissionReport::RequestTrigger>( | |
| 147 permission_report.request_trigger(0))); | |
| 148 } | |
| 149 | |
| 150 // Test that PermissionReporter::SendReport sends a serialized report string | |
| 151 // with field trials to SafeBrowsing CSD servers. | 138 // with field trials to SafeBrowsing CSD servers. |
| 152 TEST_F(PermissionReporterTest, SendReportWithFieldTrials) { | 139 TEST_F(PermissionReporterTest, SendReportWithFieldTrials) { |
| 153 typedef std::set<variations::ActiveGroupId, variations::ActiveGroupIdCompare> | 140 typedef std::set<variations::ActiveGroupId, variations::ActiveGroupIdCompare> |
| 154 ActiveGroupIdSet; | 141 ActiveGroupIdSet; |
| 155 | 142 |
| 156 // Add and activate dummy field trials. | 143 // Add and activate dummy field trials. |
| 157 base::FieldTrialList field_trial_list(nullptr); | 144 base::FieldTrialList field_trial_list(nullptr); |
| 158 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); | 145 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); |
| 159 base::FieldTrial* trial_one = | 146 base::FieldTrial* trial_one = |
| 160 base::FieldTrialList::CreateFieldTrial(kDummyTrialOne, kDummyGroupOne); | 147 base::FieldTrialList::CreateFieldTrial(kDummyTrialOne, kDummyGroupOne); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 173 | 160 |
| 174 // This is necessary to activate both field trials. | 161 // This is necessary to activate both field trials. |
| 175 base::FeatureList::IsEnabled(kFeatureOnByDefault); | 162 base::FeatureList::IsEnabled(kFeatureOnByDefault); |
| 176 base::FeatureList::IsEnabled(kFeatureOffByDefault); | 163 base::FeatureList::IsEnabled(kFeatureOffByDefault); |
| 177 | 164 |
| 178 EXPECT_TRUE(base::FieldTrialList::IsTrialActive(trial_one->trial_name())); | 165 EXPECT_TRUE(base::FieldTrialList::IsTrialActive(trial_one->trial_name())); |
| 179 EXPECT_TRUE(base::FieldTrialList::IsTrialActive(trial_two->trial_name())); | 166 EXPECT_TRUE(base::FieldTrialList::IsTrialActive(trial_two->trial_name())); |
| 180 | 167 |
| 181 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 168 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
| 182 kDummyAction, kDummySourceUI, | 169 kDummyAction, kDummySourceUI, |
| 183 false /* user_gesture */); | 170 kDummyGestureType); |
| 184 | 171 |
| 185 PermissionReport permission_report; | 172 PermissionReport permission_report; |
| 186 ASSERT_TRUE( | 173 ASSERT_TRUE( |
| 187 permission_report.ParseFromString(mock_report_sender_->latest_report())); | 174 permission_report.ParseFromString(mock_report_sender_->latest_report())); |
| 188 | 175 |
| 189 variations::ActiveGroupId field_trial_one = | 176 variations::ActiveGroupId field_trial_one = |
| 190 variations::MakeActiveGroupId(kDummyTrialOne, kDummyGroupOne); | 177 variations::MakeActiveGroupId(kDummyTrialOne, kDummyGroupOne); |
| 191 variations::ActiveGroupId field_trial_two = | 178 variations::ActiveGroupId field_trial_two = |
| 192 variations::MakeActiveGroupId(kDummyTrialTwo, kDummyGroupTwo); | 179 variations::MakeActiveGroupId(kDummyTrialTwo, kDummyGroupTwo); |
| 193 ActiveGroupIdSet expected_group_ids = {field_trial_one, field_trial_two}; | 180 ActiveGroupIdSet expected_group_ids = {field_trial_one, field_trial_two}; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 204 // Test that PermissionReporter::IsReportThresholdExceeded returns false only | 191 // Test that PermissionReporter::IsReportThresholdExceeded returns false only |
| 205 // when the number of reports sent in the last one minute per origin per | 192 // when the number of reports sent in the last one minute per origin per |
| 206 // permission is under a threshold. | 193 // permission is under a threshold. |
| 207 TEST_F(PermissionReporterTest, IsReportThresholdExceeded) { | 194 TEST_F(PermissionReporterTest, IsReportThresholdExceeded) { |
| 208 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 195 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
| 209 | 196 |
| 210 int reports_to_send = kMaximumReportsPerOriginPerPermissionPerMinute; | 197 int reports_to_send = kMaximumReportsPerOriginPerPermissionPerMinute; |
| 211 while (reports_to_send--) | 198 while (reports_to_send--) |
| 212 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 199 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
| 213 kDummyAction, kDummySourceUI, | 200 kDummyAction, kDummySourceUI, |
| 214 false /* user_gesture */); | 201 kDummyGestureType); |
| 215 EXPECT_EQ(5, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 202 EXPECT_EQ(5, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
| 216 | 203 |
| 217 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 204 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
| 218 kDummyAction, kDummySourceUI, | 205 kDummyAction, kDummySourceUI, |
| 219 false /* user_gesture */); | 206 kDummyGestureType); |
| 220 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 207 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
| 221 | 208 |
| 222 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionTwo, | 209 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionTwo, |
| 223 kDummyAction, kDummySourceUI, | 210 kDummyAction, kDummySourceUI, |
| 224 false /* user_gesture */); | 211 kDummyGestureType); |
| 225 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 212 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
| 226 | 213 |
| 227 permission_reporter_->SendReport(GURL(kDummyOriginTwo), kDummyPermissionOne, | 214 permission_reporter_->SendReport(GURL(kDummyOriginTwo), kDummyPermissionOne, |
| 228 kDummyAction, kDummySourceUI, | 215 kDummyAction, kDummySourceUI, |
| 229 false /* user_gesture */); | 216 kDummyGestureType); |
| 230 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 217 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
| 231 | 218 |
| 232 clock_->Advance(base::TimeDelta::FromMinutes(1)); | 219 clock_->Advance(base::TimeDelta::FromMinutes(1)); |
| 233 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 220 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
| 234 kDummyAction, kDummySourceUI, | 221 kDummyAction, kDummySourceUI, |
| 235 false /* user_gesture */); | 222 kDummyGestureType); |
| 236 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 223 EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
| 237 | 224 |
| 238 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); | 225 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
| 239 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 226 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
| 240 kDummyAction, kDummySourceUI, | 227 kDummyAction, kDummySourceUI, |
| 241 false /* user_gesture */); | 228 kDummyGestureType); |
| 242 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); | 229 EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
| 243 | 230 |
| 244 clock_->Advance(base::TimeDelta::FromMinutes(1)); | 231 clock_->Advance(base::TimeDelta::FromMinutes(1)); |
| 245 reports_to_send = 12; | 232 reports_to_send = 12; |
| 246 while (reports_to_send--) { | 233 while (reports_to_send--) { |
| 247 clock_->Advance(base::TimeDelta::FromSeconds(5)); | 234 clock_->Advance(base::TimeDelta::FromSeconds(5)); |
| 248 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, | 235 permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
| 249 kDummyAction, kDummySourceUI, | 236 kDummyAction, kDummySourceUI, |
| 250 false /* user_gesture */); | 237 kDummyGestureType); |
| 251 } | 238 } |
| 252 EXPECT_EQ(kMaximumReportsPerOriginPerPermissionPerMinute, | 239 EXPECT_EQ(kMaximumReportsPerOriginPerPermissionPerMinute, |
| 253 mock_report_sender_->GetAndResetNumberOfReportsSent()); | 240 mock_report_sender_->GetAndResetNumberOfReportsSent()); |
| 254 } | 241 } |
| 255 | 242 |
| 256 } // namespace safe_browsing | 243 } // namespace safe_browsing |
| OLD | NEW |