blob: af02dd696c0f848cac45bd1c0aa44e87020f6e54 [file] [log] [blame]
juliatuttle586843332017-03-27 16:22:371// Copyright 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/reporting/reporting_test_util.h"
6
juliatuttleee4b55e2017-04-07 17:09:457#include <memory>
8#include <string>
juliatuttle586843332017-03-27 16:22:379#include <vector>
10
juliatuttleee4b55e2017-04-07 17:09:4511#include "base/bind.h"
12#include "base/json/json_reader.h"
13#include "base/memory/ptr_util.h"
14#include "base/test/simple_test_clock.h"
15#include "base/test/simple_test_tick_clock.h"
juliatuttle9f970c02017-04-10 19:26:3716#include "base/timer/mock_timer.h"
juliatuttle586843332017-03-27 16:22:3717#include "net/reporting/reporting_cache.h"
18#include "net/reporting/reporting_client.h"
juliatuttleee4b55e2017-04-07 17:09:4519#include "net/reporting/reporting_context.h"
juliatuttlefcf47202017-05-23 15:53:0220#include "net/reporting/reporting_delegate.h"
juliatuttle830962a2017-04-19 17:50:0421#include "net/reporting/reporting_delivery_agent.h"
juliatuttle9f970c02017-04-10 19:26:3722#include "net/reporting/reporting_garbage_collector.h"
juliatuttleee4b55e2017-04-07 17:09:4523#include "net/reporting/reporting_policy.h"
24#include "net/reporting/reporting_uploader.h"
25#include "testing/gtest/include/gtest/gtest.h"
juliatuttle586843332017-03-27 16:22:3726#include "url/gurl.h"
27#include "url/origin.h"
28
29namespace net {
30
juliatuttleee4b55e2017-04-07 17:09:4531namespace {
32
33class PendingUploadImpl : public TestReportingUploader::PendingUpload {
34 public:
Julia Tuttleed8d84b2017-12-05 18:54:5335 PendingUploadImpl(const GURL& url,
36 const std::string& json,
37 ReportingUploader::UploadCallback callback,
38 base::OnceCallback<void(PendingUpload*)> complete_callback)
juliatuttleee4b55e2017-04-07 17:09:4539 : url_(url),
40 json_(json),
Julia Tuttleed8d84b2017-12-05 18:54:5341 callback_(std::move(callback)),
42 complete_callback_(std::move(complete_callback)) {}
juliatuttleee4b55e2017-04-07 17:09:4543
Chris Watkins806691b2017-12-01 06:01:2244 ~PendingUploadImpl() override = default;
juliatuttleee4b55e2017-04-07 17:09:4545
46 // PendingUpload implementationP:
47 const GURL& url() const override { return url_; }
48 const std::string& json() const override { return json_; }
49 std::unique_ptr<base::Value> GetValue() const override {
50 return base::JSONReader::Read(json_);
51 }
52
53 void Complete(ReportingUploader::Outcome outcome) override {
Julia Tuttleed8d84b2017-12-05 18:54:5354 std::move(callback_).Run(outcome);
juliatuttleee4b55e2017-04-07 17:09:4555 // Deletes |this|.
Julia Tuttleed8d84b2017-12-05 18:54:5356 std::move(complete_callback_).Run(this);
juliatuttleee4b55e2017-04-07 17:09:4557 }
58
59 private:
60 GURL url_;
61 std::string json_;
Julia Tuttleed8d84b2017-12-05 18:54:5362 ReportingUploader::UploadCallback callback_;
63 base::OnceCallback<void(PendingUpload*)> complete_callback_;
juliatuttleee4b55e2017-04-07 17:09:4564};
65
66void ErasePendingUpload(
67 std::vector<std::unique_ptr<TestReportingUploader::PendingUpload>>* uploads,
68 TestReportingUploader::PendingUpload* upload) {
69 for (auto it = uploads->begin(); it != uploads->end(); ++it) {
70 if (it->get() == upload) {
71 uploads->erase(it);
72 return;
73 }
74 }
75 NOTREACHED();
76}
77
78} // namespace
79
juliatuttle586843332017-03-27 16:22:3780const ReportingClient* FindClientInCache(const ReportingCache* cache,
81 const url::Origin& origin,
82 const GURL& endpoint) {
83 std::vector<const ReportingClient*> clients;
84 cache->GetClients(&clients);
85 for (const ReportingClient* client : clients) {
86 if (client->origin == origin && client->endpoint == endpoint)
87 return client;
88 }
89 return nullptr;
90}
91
Chris Watkins806691b2017-12-01 06:01:2292TestReportingUploader::PendingUpload::~PendingUpload() = default;
93TestReportingUploader::PendingUpload::PendingUpload() = default;
juliatuttleee4b55e2017-04-07 17:09:4594
Chris Watkins806691b2017-12-01 06:01:2295TestReportingUploader::TestReportingUploader() = default;
96TestReportingUploader::~TestReportingUploader() = default;
juliatuttleee4b55e2017-04-07 17:09:4597
98void TestReportingUploader::StartUpload(const GURL& url,
99 const std::string& json,
Julia Tuttleed8d84b2017-12-05 18:54:53100 UploadCallback callback) {
Jeremy Roman0579ed62017-08-29 15:56:19101 pending_uploads_.push_back(std::make_unique<PendingUploadImpl>(
Julia Tuttleed8d84b2017-12-05 18:54:53102 url, json, std::move(callback),
103 base::BindOnce(&ErasePendingUpload, &pending_uploads_)));
juliatuttleee4b55e2017-04-07 17:09:45104}
105
Chris Watkins806691b2017-12-01 06:01:22106TestReportingDelegate::TestReportingDelegate() = default;
juliatuttlefcf47202017-05-23 15:53:02107
Chris Watkins806691b2017-12-01 06:01:22108TestReportingDelegate::~TestReportingDelegate() = default;
juliatuttlefcf47202017-05-23 15:53:02109
110bool TestReportingDelegate::CanQueueReport(const url::Origin& origin) const {
111 return true;
112}
113
114bool TestReportingDelegate::CanSendReport(const url::Origin& origin) const {
115 return true;
116}
117
118bool TestReportingDelegate::CanSetClient(const url::Origin& origin,
119 const GURL& endpoint) const {
120 return true;
121}
122
123bool TestReportingDelegate::CanUseClient(const url::Origin& origin,
124 const GURL& endpoint) const {
125 return true;
126}
127
juliatuttleee4b55e2017-04-07 17:09:45128TestReportingContext::TestReportingContext(const ReportingPolicy& policy)
129 : ReportingContext(policy,
Jeremy Roman0579ed62017-08-29 15:56:19130 std::make_unique<base::SimpleTestClock>(),
131 std::make_unique<base::SimpleTestTickClock>(),
132 std::make_unique<TestReportingUploader>(),
133 std::make_unique<TestReportingDelegate>()),
juliatuttle830962a2017-04-19 17:50:04134 delivery_timer_(new base::MockTimer(/* retain_user_task= */ false,
135 /* is_repeating= */ false)),
juliatuttle9f970c02017-04-10 19:26:37136 garbage_collection_timer_(
137 new base::MockTimer(/* retain_user_task= */ false,
138 /* is_repeating= */ false)) {
139 garbage_collector()->SetTimerForTesting(
140 base::WrapUnique(garbage_collection_timer_));
juliatuttle830962a2017-04-19 17:50:04141 delivery_agent()->SetTimerForTesting(base::WrapUnique(delivery_timer_));
juliatuttle9f970c02017-04-10 19:26:37142}
juliatuttleee4b55e2017-04-07 17:09:45143
juliatuttle9f970c02017-04-10 19:26:37144TestReportingContext::~TestReportingContext() {
juliatuttle830962a2017-04-19 17:50:04145 delivery_timer_ = nullptr;
juliatuttle9f970c02017-04-10 19:26:37146 garbage_collection_timer_ = nullptr;
147}
juliatuttleee4b55e2017-04-07 17:09:45148
149ReportingTestBase::ReportingTestBase() {
150 // For tests, disable jitter.
151 ReportingPolicy policy;
152 policy.endpoint_backoff_policy.jitter_factor = 0.0;
juliatuttle7da13812017-04-13 19:18:19153
juliatuttle42c57312017-04-28 03:01:30154 CreateContext(policy, base::Time::Now(), base::TimeTicks::Now());
juliatuttleee4b55e2017-04-07 17:09:45155}
156
Chris Watkins806691b2017-12-01 06:01:22157ReportingTestBase::~ReportingTestBase() = default;
juliatuttleee4b55e2017-04-07 17:09:45158
juliatuttle7da13812017-04-13 19:18:19159void ReportingTestBase::UsePolicy(const ReportingPolicy& new_policy) {
juliatuttle42c57312017-04-28 03:01:30160 CreateContext(new_policy, clock()->Now(), tick_clock()->NowTicks());
juliatuttle7da13812017-04-13 19:18:19161}
162
163void ReportingTestBase::SimulateRestart(base::TimeDelta delta,
164 base::TimeDelta delta_ticks) {
juliatuttle42c57312017-04-28 03:01:30165 CreateContext(policy(), clock()->Now() + delta,
166 tick_clock()->NowTicks() + delta_ticks);
juliatuttle7da13812017-04-13 19:18:19167}
168
juliatuttle42c57312017-04-28 03:01:30169void ReportingTestBase::CreateContext(const ReportingPolicy& policy,
170 base::Time now,
171 base::TimeTicks now_ticks) {
Jeremy Roman0579ed62017-08-29 15:56:19172 context_ = std::make_unique<TestReportingContext>(policy);
juliatuttle7da13812017-04-13 19:18:19173 clock()->SetNow(now);
174 tick_clock()->SetNowTicks(now_ticks);
juliatuttleee4b55e2017-04-07 17:09:45175}
176
177base::TimeTicks ReportingTestBase::yesterday() {
178 return tick_clock()->NowTicks() - base::TimeDelta::FromDays(1);
179}
180
juliatuttle830962a2017-04-19 17:50:04181base::TimeTicks ReportingTestBase::now() {
182 return tick_clock()->NowTicks();
183}
184
juliatuttleee4b55e2017-04-07 17:09:45185base::TimeTicks ReportingTestBase::tomorrow() {
186 return tick_clock()->NowTicks() + base::TimeDelta::FromDays(1);
187}
188
juliatuttle586843332017-03-27 16:22:37189} // namespace net