Index: chrome/browser/safe_browsing/permission_reporter_unittest.cc |
diff --git a/chrome/browser/safe_browsing/permission_reporter_unittest.cc b/chrome/browser/safe_browsing/permission_reporter_unittest.cc |
index ddb88731cf09d545bfc39415fabc71bcb4e40666..dc1ce633e9a02547ce973e2541cda0bd0d38795a 100644 |
--- a/chrome/browser/safe_browsing/permission_reporter_unittest.cc |
+++ b/chrome/browser/safe_browsing/permission_reporter_unittest.cc |
@@ -7,6 +7,8 @@ |
#include "base/feature_list.h" |
#include "base/memory/ptr_util.h" |
#include "base/metrics/field_trial.h" |
+#include "base/test/simple_test_clock.h" |
+#include "base/time/time.h" |
#include "chrome/common/safe_browsing/permission_report.pb.h" |
#include "components/variations/active_field_trials.h" |
#include "content/public/browser/permission_type.h" |
@@ -24,13 +26,13 @@ const char kPermissionActionReportingUploadUrl[] = |
"http://safebrowsing.googleusercontent.com/safebrowsing/clientreport/" |
"permission-action"; |
-const char kDummyOrigin[] = "http://example.test/"; |
-const PermissionType kDummyPermission = PermissionType::GEOLOCATION; |
+const int kMaximumReportsPerOriginPerPermissionPerMinute = 5; |
+ |
+const char kDummyOriginOne[] = "http://example.test/"; |
+const char kDummyOriginTwo[] = "http://example2.test/"; |
+const PermissionType kDummyPermissionOne = PermissionType::GEOLOCATION; |
+const PermissionType kDummyPermissionTwo = PermissionType::NOTIFICATIONS; |
const PermissionAction kDummyAction = GRANTED; |
-const PermissionReport::PermissionType kDummyPermissionReportPermission = |
- PermissionReport::GEOLOCATION; |
-const PermissionReport::Action kDummyPermissionReportAction = |
- PermissionReport::GRANTED; |
const char kDummyTrialOne[] = "trial one"; |
const char kDummyGroupOne[] = "group one"; |
@@ -50,21 +52,32 @@ struct base::Feature kFeatureOffByDefault { |
// A mock ReportSender that keeps track of the last report sent. |
class MockReportSender : public net::ReportSender { |
public: |
- MockReportSender() : net::ReportSender(nullptr, DO_NOT_SEND_COOKIES) {} |
+ MockReportSender() : net::ReportSender(nullptr, DO_NOT_SEND_COOKIES) { |
+ number_of_reports_ = 0; |
+ } |
+ |
~MockReportSender() override {} |
void Send(const GURL& report_uri, const std::string& report) override { |
latest_report_uri_ = report_uri; |
latest_report_ = report; |
+ number_of_reports_++; |
} |
const GURL& latest_report_uri() { return latest_report_uri_; } |
const std::string& latest_report() { return latest_report_; } |
+ int GetAndResetNumberOfReportsSent() { |
+ int new_reports = number_of_reports_; |
+ number_of_reports_ = 0; |
+ return new_reports; |
+ } |
+ |
private: |
GURL latest_report_uri_; |
std::string latest_report_; |
+ int number_of_reports_; |
DISALLOW_COPY_AND_ASSIGN(MockReportSender); |
}; |
@@ -73,29 +86,34 @@ class MockReportSender : public net::ReportSender { |
class PermissionReporterTest : public ::testing::Test { |
protected: |
- PermissionReporterTest() |
- : mock_report_sender_(new MockReportSender()), |
- permission_reporter_( |
- new PermissionReporter(base::WrapUnique(mock_report_sender_))) {} |
+ void SetUp() override { |
+ mock_report_sender_ = new MockReportSender; |
+ clock_ = new base::SimpleTestClock; |
+ permission_reporter_.reset(new PermissionReporter( |
+ base::WrapUnique(mock_report_sender_), base::WrapUnique(clock_))); |
+ } |
// Owned by |permission_reporter_|. |
MockReportSender* mock_report_sender_; |
+ // Owned by |permission_reporter_|. |
+ base::SimpleTestClock* clock_; |
+ |
std::unique_ptr<PermissionReporter> permission_reporter_; |
}; |
// Test that PermissionReporter::SendReport sends a serialized report string to |
// SafeBrowsing CSD servers. |
TEST_F(PermissionReporterTest, SendReport) { |
- permission_reporter_->SendReport(GURL(kDummyOrigin), kDummyPermission, |
+ permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
kDummyAction); |
PermissionReport permission_report; |
ASSERT_TRUE( |
permission_report.ParseFromString(mock_report_sender_->latest_report())); |
- EXPECT_EQ(kDummyPermissionReportPermission, permission_report.permission()); |
- EXPECT_EQ(kDummyPermissionReportAction, permission_report.action()); |
- EXPECT_EQ(kDummyOrigin, permission_report.origin()); |
+ EXPECT_EQ(PermissionReport::GEOLOCATION, permission_report.permission()); |
+ EXPECT_EQ(PermissionReport::GRANTED, permission_report.action()); |
+ EXPECT_EQ(kDummyOriginOne, permission_report.origin()); |
#if defined(OS_ANDROID) |
EXPECT_EQ(PermissionReport::ANDROID_PLATFORM, |
permission_report.platform_type()); |
@@ -140,7 +158,7 @@ TEST_F(PermissionReporterTest, SendReportWithFieldTrials) { |
EXPECT_TRUE(base::FieldTrialList::IsTrialActive(trial_one->trial_name())); |
EXPECT_TRUE(base::FieldTrialList::IsTrialActive(trial_two->trial_name())); |
- permission_reporter_->SendReport(GURL(kDummyOrigin), kDummyPermission, |
+ permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
kDummyAction); |
PermissionReport permission_report; |
@@ -162,4 +180,49 @@ TEST_F(PermissionReporterTest, SendReportWithFieldTrials) { |
EXPECT_EQ(0U, expected_group_ids.size()); |
} |
+// Test that PermissionReporter::IsReportThresholdExceeded returns false only |
+// when the number of reports sent in the last one minute per origin per |
+// permission is under a threshold. |
+TEST_F(PermissionReporterTest, IsReportThresholdExceeded) { |
+ EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
+ |
+ int reports_to_send = kMaximumReportsPerOriginPerPermissionPerMinute; |
+ while (reports_to_send--) |
+ permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
+ kDummyAction); |
+ EXPECT_EQ(5, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
+ |
+ permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
+ kDummyAction); |
+ EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
+ |
+ permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionTwo, |
+ kDummyAction); |
+ EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
+ |
+ permission_reporter_->SendReport(GURL(kDummyOriginTwo), kDummyPermissionOne, |
+ kDummyAction); |
+ EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
+ |
+ clock_->Advance(base::TimeDelta::FromMinutes(1)); |
+ permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
+ kDummyAction); |
+ EXPECT_EQ(0, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
+ |
+ clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
+ permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
+ kDummyAction); |
+ EXPECT_EQ(1, mock_report_sender_->GetAndResetNumberOfReportsSent()); |
+ |
+ clock_->Advance(base::TimeDelta::FromMinutes(1)); |
+ reports_to_send = 12; |
+ while (reports_to_send--) { |
+ clock_->Advance(base::TimeDelta::FromSeconds(5)); |
+ permission_reporter_->SendReport(GURL(kDummyOriginOne), kDummyPermissionOne, |
+ kDummyAction); |
+ } |
+ EXPECT_EQ(kMaximumReportsPerOriginPerPermissionPerMinute, |
+ mock_report_sender_->GetAndResetNumberOfReportsSent()); |
+} |
+ |
} // namespace safe_browsing |