| Index: net/reporting/reporting_delivery_agent_unittest.cc
|
| diff --git a/net/reporting/reporting_delivery_agent_unittest.cc b/net/reporting/reporting_delivery_agent_unittest.cc
|
| index b2d8fbfd3e4c561639e631ba77093d8e77448020..d62f97c0133a8623a80d76d6e6d72ccefd85c1eb 100644
|
| --- a/net/reporting/reporting_delivery_agent_unittest.cc
|
| +++ b/net/reporting/reporting_delivery_agent_unittest.cc
|
| @@ -24,88 +24,27 @@
|
| namespace net {
|
| namespace {
|
|
|
| -class MockUploader : public ReportingUploader {
|
| - public:
|
| - class PendingUpload {
|
| - public:
|
| - PendingUpload(MockUploader* uploader,
|
| - const GURL& url,
|
| - const std::string& json,
|
| - const Callback& callback)
|
| - : uploader_(uploader), url_(url), json_(json), callback_(callback) {
|
| - DCHECK(uploader_);
|
| - }
|
| -
|
| - ~PendingUpload() {}
|
| -
|
| - void Complete(Outcome outcome) {
|
| - callback_.Run(outcome);
|
| - // Deletes |this|.
|
| - uploader_->OnUploadComplete(this);
|
| - }
|
| -
|
| - const GURL& url() const { return url_; }
|
| - const std::string& json() const { return json_; }
|
| -
|
| - std::unique_ptr<base::Value> GetValue() const {
|
| - return base::JSONReader::Read(json_);
|
| - }
|
| -
|
| - private:
|
| - MockUploader* uploader_;
|
| - GURL url_;
|
| - std::string json_;
|
| - Callback callback_;
|
| - };
|
| -
|
| - MockUploader() {}
|
| - ~MockUploader() override {}
|
| -
|
| - void StartUpload(const GURL& url,
|
| - const std::string& json,
|
| - const Callback& callback) override {
|
| - uploads_.push_back(
|
| - base::MakeUnique<PendingUpload>(this, url, json, callback));
|
| - }
|
| -
|
| - const std::vector<std::unique_ptr<PendingUpload>>& pending_uploads() const {
|
| - return uploads_;
|
| - }
|
| -
|
| - void OnUploadComplete(PendingUpload* upload) {
|
| - for (auto it = uploads_.begin(); it != uploads_.end(); ++it) {
|
| - if (it->get() == upload) {
|
| - uploads_.erase(it);
|
| - return;
|
| - }
|
| - }
|
| - NOTREACHED();
|
| - }
|
| -
|
| - private:
|
| - std::vector<std::unique_ptr<PendingUpload>> uploads_;
|
| -};
|
| -
|
| -class ReportingDeliveryAgentTest : public ::testing::Test {
|
| +class ReportingDeliveryAgentTest : public ReportingTestBase {
|
| protected:
|
| - ReportingDeliveryAgentTest()
|
| - : agent_(&clock_, &cache_, &uploader_, &backoff_policy_) {
|
| - backoff_policy_.num_errors_to_ignore = 0;
|
| - backoff_policy_.initial_delay_ms = 60000;
|
| - backoff_policy_.multiply_factor = 2.0;
|
| - backoff_policy_.jitter_factor = 0.0;
|
| - backoff_policy_.maximum_backoff_ms = -1;
|
| - backoff_policy_.entry_lifetime_ms = 0;
|
| - backoff_policy_.always_use_initial_delay = false;
|
| + ReportingDeliveryAgentTest() {
|
| + ReportingPolicy policy;
|
| + policy.endpoint_backoff_policy.num_errors_to_ignore = 0;
|
| + policy.endpoint_backoff_policy.initial_delay_ms = 60000;
|
| + policy.endpoint_backoff_policy.multiply_factor = 2.0;
|
| + policy.endpoint_backoff_policy.jitter_factor = 0.0;
|
| + policy.endpoint_backoff_policy.maximum_backoff_ms = -1;
|
| + policy.endpoint_backoff_policy.entry_lifetime_ms = 0;
|
| + policy.endpoint_backoff_policy.always_use_initial_delay = false;
|
| + UsePolicy(policy);
|
| }
|
|
|
| base::TimeTicks tomorrow() {
|
| - return clock_.NowTicks() + base::TimeDelta::FromDays(1);
|
| + return tick_clock()->NowTicks() + base::TimeDelta::FromDays(1);
|
| }
|
|
|
| - const std::vector<std::unique_ptr<MockUploader::PendingUpload>>&
|
| - pending_uploads() const {
|
| - return uploader_.pending_uploads();
|
| + const std::vector<std::unique_ptr<TestReportingUploader::PendingUpload>>&
|
| + pending_uploads() {
|
| + return uploader()->pending_uploads();
|
| }
|
|
|
| const GURL kUrl_ = GURL("https://origin/path");
|
| @@ -113,12 +52,6 @@ class ReportingDeliveryAgentTest : public ::testing::Test {
|
| const GURL kEndpoint_ = GURL("https://endpoint/");
|
| const std::string kGroup_ = "group";
|
| const std::string kType_ = "type";
|
| -
|
| - base::SimpleTestTickClock clock_;
|
| - ReportingCache cache_;
|
| - MockUploader uploader_;
|
| - BackoffEntry::Policy backoff_policy_;
|
| - ReportingDeliveryAgent agent_;
|
| };
|
|
|
| TEST_F(ReportingDeliveryAgentTest, SuccessfulUpload) {
|
| @@ -127,14 +60,14 @@ TEST_F(ReportingDeliveryAgentTest, SuccessfulUpload) {
|
| base::DictionaryValue body;
|
| body.SetString("key", "value");
|
|
|
| - cache_.SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| - kGroup_, tomorrow());
|
| - cache_.AddReport(kUrl_, kGroup_, kType_, body.CreateDeepCopy(),
|
| - clock_.NowTicks(), 0);
|
| + cache()->SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| + kGroup_, tomorrow());
|
| + cache()->AddReport(kUrl_, kGroup_, kType_, body.CreateDeepCopy(),
|
| + tick_clock()->NowTicks(), 0);
|
|
|
| - clock_.Advance(base::TimeDelta::FromMilliseconds(kAgeMillis));
|
| + tick_clock()->Advance(base::TimeDelta::FromMilliseconds(kAgeMillis));
|
|
|
| - agent_.SendReports();
|
| + delivery_agent()->SendReports();
|
|
|
| ASSERT_EQ(1u, pending_uploads().size());
|
| EXPECT_EQ(kEndpoint_, pending_uploads()[0]->url());
|
| @@ -158,52 +91,52 @@ TEST_F(ReportingDeliveryAgentTest, SuccessfulUpload) {
|
|
|
| // Successful upload should remove delivered reports.
|
| std::vector<const ReportingReport*> reports;
|
| - cache_.GetReports(&reports);
|
| + cache()->GetReports(&reports);
|
| EXPECT_TRUE(reports.empty());
|
|
|
| // TODO(juliatuttle): Check that BackoffEntry was informed of success.
|
| }
|
|
|
| TEST_F(ReportingDeliveryAgentTest, FailedUpload) {
|
| - cache_.SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| - kGroup_, tomorrow());
|
| - cache_.AddReport(kUrl_, kGroup_, kType_,
|
| - base::MakeUnique<base::DictionaryValue>(), clock_.NowTicks(),
|
| - 0);
|
| + cache()->SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| + kGroup_, tomorrow());
|
| + cache()->AddReport(kUrl_, kGroup_, kType_,
|
| + base::MakeUnique<base::DictionaryValue>(),
|
| + tick_clock()->NowTicks(), 0);
|
|
|
| - agent_.SendReports();
|
| + delivery_agent()->SendReports();
|
|
|
| ASSERT_EQ(1u, pending_uploads().size());
|
| pending_uploads()[0]->Complete(ReportingUploader::Outcome::FAILURE);
|
|
|
| // Failed upload should increment reports' attempts.
|
| std::vector<const ReportingReport*> reports;
|
| - cache_.GetReports(&reports);
|
| + cache()->GetReports(&reports);
|
| ASSERT_EQ(1u, reports.size());
|
| EXPECT_EQ(1, reports[0]->attempts);
|
|
|
| // Since endpoint is now failing, an upload won't be started despite a pending
|
| // report.
|
| ASSERT_TRUE(pending_uploads().empty());
|
| - agent_.SendReports();
|
| + delivery_agent()->SendReports();
|
| EXPECT_TRUE(pending_uploads().empty());
|
| }
|
|
|
| TEST_F(ReportingDeliveryAgentTest, RemoveEndpointUpload) {
|
| static const url::Origin kDifferentOrigin(GURL("https://origin2/"));
|
|
|
| - cache_.SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| - kGroup_, tomorrow());
|
| - cache_.SetClient(kDifferentOrigin, kEndpoint_,
|
| - ReportingClient::Subdomains::EXCLUDE, kGroup_, tomorrow());
|
| - ASSERT_TRUE(FindClientInCache(&cache_, kOrigin_, kEndpoint_));
|
| - ASSERT_TRUE(FindClientInCache(&cache_, kDifferentOrigin, kEndpoint_));
|
| + cache()->SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| + kGroup_, tomorrow());
|
| + cache()->SetClient(kDifferentOrigin, kEndpoint_,
|
| + ReportingClient::Subdomains::EXCLUDE, kGroup_, tomorrow());
|
| + ASSERT_TRUE(FindClientInCache(cache(), kOrigin_, kEndpoint_));
|
| + ASSERT_TRUE(FindClientInCache(cache(), kDifferentOrigin, kEndpoint_));
|
|
|
| - cache_.AddReport(kUrl_, kGroup_, kType_,
|
| - base::MakeUnique<base::DictionaryValue>(), clock_.NowTicks(),
|
| - 0);
|
| + cache()->AddReport(kUrl_, kGroup_, kType_,
|
| + base::MakeUnique<base::DictionaryValue>(),
|
| + tick_clock()->NowTicks(), 0);
|
|
|
| - agent_.SendReports();
|
| + delivery_agent()->SendReports();
|
|
|
| ASSERT_EQ(1u, pending_uploads().size());
|
| pending_uploads()[0]->Complete(ReportingUploader::Outcome::REMOVE_ENDPOINT);
|
| @@ -211,50 +144,50 @@ TEST_F(ReportingDeliveryAgentTest, RemoveEndpointUpload) {
|
| // "Remove endpoint" upload should remove endpoint from *all* origins and
|
| // increment reports' attempts.
|
| std::vector<const ReportingReport*> reports;
|
| - cache_.GetReports(&reports);
|
| + cache()->GetReports(&reports);
|
| ASSERT_EQ(1u, reports.size());
|
| EXPECT_EQ(1, reports[0]->attempts);
|
|
|
| - EXPECT_FALSE(FindClientInCache(&cache_, kOrigin_, kEndpoint_));
|
| - EXPECT_FALSE(FindClientInCache(&cache_, kDifferentOrigin, kEndpoint_));
|
| + EXPECT_FALSE(FindClientInCache(cache(), kOrigin_, kEndpoint_));
|
| + EXPECT_FALSE(FindClientInCache(cache(), kDifferentOrigin, kEndpoint_));
|
|
|
| // Since endpoint is now failing, an upload won't be started despite a pending
|
| // report.
|
| - agent_.SendReports();
|
| + delivery_agent()->SendReports();
|
| EXPECT_TRUE(pending_uploads().empty());
|
| }
|
|
|
| TEST_F(ReportingDeliveryAgentTest, ConcurrentRemove) {
|
| - cache_.SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| - kGroup_, tomorrow());
|
| - cache_.AddReport(kUrl_, kGroup_, kType_,
|
| - base::MakeUnique<base::DictionaryValue>(), clock_.NowTicks(),
|
| - 0);
|
| + cache()->SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| + kGroup_, tomorrow());
|
| + cache()->AddReport(kUrl_, kGroup_, kType_,
|
| + base::MakeUnique<base::DictionaryValue>(),
|
| + tick_clock()->NowTicks(), 0);
|
|
|
| - agent_.SendReports();
|
| + delivery_agent()->SendReports();
|
| ASSERT_EQ(1u, pending_uploads().size());
|
|
|
| // Remove the report while the upload is running.
|
| std::vector<const ReportingReport*> reports;
|
| - cache_.GetReports(&reports);
|
| + cache()->GetReports(&reports);
|
| EXPECT_EQ(1u, reports.size());
|
|
|
| const ReportingReport* report = reports[0];
|
| - EXPECT_FALSE(cache_.IsReportDoomedForTesting(report));
|
| + EXPECT_FALSE(cache()->IsReportDoomedForTesting(report));
|
|
|
| // Report should appear removed, even though the cache has doomed it.
|
| - cache_.RemoveReports(reports);
|
| - cache_.GetReports(&reports);
|
| + cache()->RemoveReports(reports);
|
| + cache()->GetReports(&reports);
|
| EXPECT_TRUE(reports.empty());
|
| - EXPECT_TRUE(cache_.IsReportDoomedForTesting(report));
|
| + EXPECT_TRUE(cache()->IsReportDoomedForTesting(report));
|
|
|
| // Completing upload shouldn't crash, and report should still be gone.
|
| pending_uploads()[0]->Complete(ReportingUploader::Outcome::SUCCESS);
|
| - cache_.GetReports(&reports);
|
| + cache()->GetReports(&reports);
|
| EXPECT_TRUE(reports.empty());
|
| // This is slightly sketchy since |report| has been freed, but it nonetheless
|
| // should not be in the set of doomed reports.
|
| - EXPECT_FALSE(cache_.IsReportDoomedForTesting(report));
|
| + EXPECT_FALSE(cache()->IsReportDoomedForTesting(report));
|
| }
|
|
|
| // Test that the agent will combine reports destined for the same endpoint, even
|
| @@ -264,19 +197,19 @@ TEST_F(ReportingDeliveryAgentTest,
|
| static const GURL kDifferentUrl("https://origin2/path");
|
| static const url::Origin kDifferentOrigin(kDifferentUrl);
|
|
|
| - cache_.SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| - kGroup_, tomorrow());
|
| - cache_.SetClient(kDifferentOrigin, kEndpoint_,
|
| - ReportingClient::Subdomains::EXCLUDE, kGroup_, tomorrow());
|
| + cache()->SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| + kGroup_, tomorrow());
|
| + cache()->SetClient(kDifferentOrigin, kEndpoint_,
|
| + ReportingClient::Subdomains::EXCLUDE, kGroup_, tomorrow());
|
|
|
| - cache_.AddReport(kUrl_, kGroup_, kType_,
|
| - base::MakeUnique<base::DictionaryValue>(), clock_.NowTicks(),
|
| - 0);
|
| - cache_.AddReport(kDifferentUrl, kGroup_, kType_,
|
| - base::MakeUnique<base::DictionaryValue>(), clock_.NowTicks(),
|
| - 0);
|
| + cache()->AddReport(kUrl_, kGroup_, kType_,
|
| + base::MakeUnique<base::DictionaryValue>(),
|
| + tick_clock()->NowTicks(), 0);
|
| + cache()->AddReport(kDifferentUrl, kGroup_, kType_,
|
| + base::MakeUnique<base::DictionaryValue>(),
|
| + tick_clock()->NowTicks(), 0);
|
|
|
| - agent_.SendReports();
|
| + delivery_agent()->SendReports();
|
| ASSERT_EQ(1u, pending_uploads().size());
|
|
|
| pending_uploads()[0]->Complete(ReportingUploader::Outcome::SUCCESS);
|
| @@ -290,29 +223,29 @@ TEST_F(ReportingDeliveryAgentTest, SerializeUploadsToEndpoint) {
|
| static const GURL kDifferentUrl("https://origin2/path");
|
| static const url::Origin kDifferentOrigin(kDifferentUrl);
|
|
|
| - cache_.SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| - kGroup_, tomorrow());
|
| - cache_.SetClient(kDifferentOrigin, kEndpoint_,
|
| - ReportingClient::Subdomains::EXCLUDE, kGroup_, tomorrow());
|
| + cache()->SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| + kGroup_, tomorrow());
|
| + cache()->SetClient(kDifferentOrigin, kEndpoint_,
|
| + ReportingClient::Subdomains::EXCLUDE, kGroup_, tomorrow());
|
|
|
| - cache_.AddReport(kUrl_, kGroup_, kType_,
|
| - base::MakeUnique<base::DictionaryValue>(), clock_.NowTicks(),
|
| - 0);
|
| + cache()->AddReport(kUrl_, kGroup_, kType_,
|
| + base::MakeUnique<base::DictionaryValue>(),
|
| + tick_clock()->NowTicks(), 0);
|
|
|
| - agent_.SendReports();
|
| + delivery_agent()->SendReports();
|
| EXPECT_EQ(1u, pending_uploads().size());
|
|
|
| - cache_.AddReport(kDifferentUrl, kGroup_, kType_,
|
| - base::MakeUnique<base::DictionaryValue>(), clock_.NowTicks(),
|
| - 0);
|
| + cache()->AddReport(kDifferentUrl, kGroup_, kType_,
|
| + base::MakeUnique<base::DictionaryValue>(),
|
| + tick_clock()->NowTicks(), 0);
|
|
|
| - agent_.SendReports();
|
| + delivery_agent()->SendReports();
|
| ASSERT_EQ(1u, pending_uploads().size());
|
|
|
| pending_uploads()[0]->Complete(ReportingUploader::Outcome::SUCCESS);
|
| EXPECT_EQ(0u, pending_uploads().size());
|
|
|
| - agent_.SendReports();
|
| + delivery_agent()->SendReports();
|
| ASSERT_EQ(1u, pending_uploads().size());
|
|
|
| pending_uploads()[0]->Complete(ReportingUploader::Outcome::SUCCESS);
|
| @@ -325,30 +258,33 @@ TEST_F(ReportingDeliveryAgentTest, SerializeUploadsToEndpoint) {
|
| TEST_F(ReportingDeliveryAgentTest, SerializeUploadsToGroup) {
|
| static const GURL kDifferentEndpoint("https://endpoint2/");
|
|
|
| - cache_.SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| - kGroup_, tomorrow());
|
| - cache_.SetClient(kOrigin_, kDifferentEndpoint,
|
| - ReportingClient::Subdomains::EXCLUDE, kGroup_, tomorrow());
|
| + cache()->SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| + kGroup_, tomorrow());
|
| + cache()->SetClient(kOrigin_, kDifferentEndpoint,
|
| + ReportingClient::Subdomains::EXCLUDE, kGroup_, tomorrow());
|
|
|
| - cache_.AddReport(kUrl_, kGroup_, kType_,
|
| - base::MakeUnique<base::DictionaryValue>(), clock_.NowTicks(),
|
| - 0);
|
| + cache()->AddReport(kUrl_, kGroup_, kType_,
|
| + base::MakeUnique<base::DictionaryValue>(),
|
| + tick_clock()->NowTicks(), 0);
|
|
|
| - agent_.SendReports();
|
| + delivery_agent()->SendReports();
|
| EXPECT_EQ(1u, pending_uploads().size());
|
|
|
| - cache_.AddReport(kUrl_, kGroup_, kType_,
|
| - base::MakeUnique<base::DictionaryValue>(), clock_.NowTicks(),
|
| - 0);
|
| + cache()->AddReport(kUrl_, kGroup_, kType_,
|
| + base::MakeUnique<base::DictionaryValue>(),
|
| + tick_clock()->NowTicks(), 0);
|
|
|
| - agent_.SendReports();
|
| - EXPECT_EQ(1u, pending_uploads().size());
|
| + delivery_agent()->SendReports();
|
| + ASSERT_EQ(1u, pending_uploads().size());
|
|
|
| pending_uploads()[0]->Complete(ReportingUploader::Outcome::SUCCESS);
|
| EXPECT_EQ(0u, pending_uploads().size());
|
|
|
| - agent_.SendReports();
|
| - EXPECT_EQ(1u, pending_uploads().size());
|
| + delivery_agent()->SendReports();
|
| + ASSERT_EQ(1u, pending_uploads().size());
|
| +
|
| + pending_uploads()[0]->Complete(ReportingUploader::Outcome::SUCCESS);
|
| + EXPECT_EQ(0u, pending_uploads().size());
|
| }
|
|
|
| // Tests that the agent will start parallel uploads to different groups within
|
| @@ -357,21 +293,21 @@ TEST_F(ReportingDeliveryAgentTest, ParallelizeUploadsAcrossGroups) {
|
| static const GURL kDifferentEndpoint("https://endpoint2/");
|
| static const std::string kDifferentGroup("group2");
|
|
|
| - cache_.SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| - kGroup_, tomorrow());
|
| - cache_.SetClient(kOrigin_, kDifferentEndpoint,
|
| - ReportingClient::Subdomains::EXCLUDE, kDifferentGroup,
|
| - tomorrow());
|
| -
|
| - cache_.AddReport(kUrl_, kGroup_, kType_,
|
| - base::MakeUnique<base::DictionaryValue>(), clock_.NowTicks(),
|
| - 0);
|
| - cache_.AddReport(kUrl_, kDifferentGroup, kType_,
|
| - base::MakeUnique<base::DictionaryValue>(), clock_.NowTicks(),
|
| - 0);
|
| -
|
| - agent_.SendReports();
|
| - EXPECT_EQ(2u, pending_uploads().size());
|
| + cache()->SetClient(kOrigin_, kEndpoint_, ReportingClient::Subdomains::EXCLUDE,
|
| + kGroup_, tomorrow());
|
| + cache()->SetClient(kOrigin_, kDifferentEndpoint,
|
| + ReportingClient::Subdomains::EXCLUDE, kDifferentGroup,
|
| + tomorrow());
|
| +
|
| + cache()->AddReport(kUrl_, kGroup_, kType_,
|
| + base::MakeUnique<base::DictionaryValue>(),
|
| + tick_clock()->NowTicks(), 0);
|
| + cache()->AddReport(kUrl_, kDifferentGroup, kType_,
|
| + base::MakeUnique<base::DictionaryValue>(),
|
| + tick_clock()->NowTicks(), 0);
|
| +
|
| + delivery_agent()->SendReports();
|
| + ASSERT_EQ(2u, pending_uploads().size());
|
|
|
| pending_uploads()[1]->Complete(ReportingUploader::Outcome::SUCCESS);
|
| pending_uploads()[0]->Complete(ReportingUploader::Outcome::SUCCESS);
|
|
|