blob: c78789f207297d17262dae8d0766cc4a27f81c91 [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"
Julia Tuttled56350d2017-12-07 19:11:1713#include "base/logging.h"
juliatuttleee4b55e2017-04-07 17:09:4514#include "base/memory/ptr_util.h"
Lily Chenefb6fcf2019-04-19 04:17:5415#include "base/strings/stringprintf.h"
juliatuttleee4b55e2017-04-07 17:09:4516#include "base/test/simple_test_clock.h"
17#include "base/test/simple_test_tick_clock.h"
juliatuttle9f970c02017-04-10 19:26:3718#include "base/timer/mock_timer.h"
Julia Tuttled56350d2017-12-07 19:11:1719#include "net/base/rand_callback.h"
juliatuttle586843332017-03-27 16:22:3720#include "net/reporting/reporting_cache.h"
21#include "net/reporting/reporting_client.h"
juliatuttleee4b55e2017-04-07 17:09:4522#include "net/reporting/reporting_context.h"
juliatuttlefcf47202017-05-23 15:53:0223#include "net/reporting/reporting_delegate.h"
juliatuttle830962a2017-04-19 17:50:0424#include "net/reporting/reporting_delivery_agent.h"
juliatuttle9f970c02017-04-10 19:26:3725#include "net/reporting/reporting_garbage_collector.h"
juliatuttleee4b55e2017-04-07 17:09:4526#include "net/reporting/reporting_policy.h"
27#include "net/reporting/reporting_uploader.h"
Julia Tuttle7d874942018-03-02 01:19:1328#include "net/url_request/url_request_test_util.h"
juliatuttleee4b55e2017-04-07 17:09:4529#include "testing/gtest/include/gtest/gtest.h"
juliatuttle586843332017-03-27 16:22:3730#include "url/gurl.h"
31#include "url/origin.h"
32
33namespace net {
34
juliatuttleee4b55e2017-04-07 17:09:4535namespace {
36
37class PendingUploadImpl : public TestReportingUploader::PendingUpload {
38 public:
Douglas Creager3428d812018-07-13 03:59:5639 PendingUploadImpl(const url::Origin& report_origin,
40 const GURL& url,
Julia Tuttleed8d84b2017-12-05 18:54:5341 const std::string& json,
42 ReportingUploader::UploadCallback callback,
43 base::OnceCallback<void(PendingUpload*)> complete_callback)
Douglas Creager3428d812018-07-13 03:59:5644 : report_origin_(report_origin),
45 url_(url),
juliatuttleee4b55e2017-04-07 17:09:4546 json_(json),
Julia Tuttleed8d84b2017-12-05 18:54:5347 callback_(std::move(callback)),
48 complete_callback_(std::move(complete_callback)) {}
juliatuttleee4b55e2017-04-07 17:09:4549
Chris Watkins806691b2017-12-01 06:01:2250 ~PendingUploadImpl() override = default;
juliatuttleee4b55e2017-04-07 17:09:4551
Julia Tuttle107e30672018-03-29 18:48:4252 // PendingUpload implementation:
Douglas Creager3428d812018-07-13 03:59:5653 const url::Origin& report_origin() const override { return report_origin_; }
juliatuttleee4b55e2017-04-07 17:09:4554 const GURL& url() const override { return url_; }
55 const std::string& json() const override { return json_; }
56 std::unique_ptr<base::Value> GetValue() const override {
Lei Zhanga8b4c5fb2019-02-16 03:02:0357 return base::JSONReader::ReadDeprecated(json_);
juliatuttleee4b55e2017-04-07 17:09:4558 }
59
60 void Complete(ReportingUploader::Outcome outcome) override {
Julia Tuttleed8d84b2017-12-05 18:54:5361 std::move(callback_).Run(outcome);
juliatuttleee4b55e2017-04-07 17:09:4562 // Deletes |this|.
Julia Tuttleed8d84b2017-12-05 18:54:5363 std::move(complete_callback_).Run(this);
juliatuttleee4b55e2017-04-07 17:09:4564 }
65
66 private:
Douglas Creager3428d812018-07-13 03:59:5667 url::Origin report_origin_;
juliatuttleee4b55e2017-04-07 17:09:4568 GURL url_;
69 std::string json_;
Julia Tuttleed8d84b2017-12-05 18:54:5370 ReportingUploader::UploadCallback callback_;
71 base::OnceCallback<void(PendingUpload*)> complete_callback_;
juliatuttleee4b55e2017-04-07 17:09:4572};
73
74void ErasePendingUpload(
75 std::vector<std::unique_ptr<TestReportingUploader::PendingUpload>>* uploads,
76 TestReportingUploader::PendingUpload* upload) {
77 for (auto it = uploads->begin(); it != uploads->end(); ++it) {
78 if (it->get() == upload) {
79 uploads->erase(it);
80 return;
81 }
82 }
83 NOTREACHED();
84}
85
86} // namespace
87
Chris Watkins806691b2017-12-01 06:01:2288TestReportingUploader::PendingUpload::~PendingUpload() = default;
89TestReportingUploader::PendingUpload::PendingUpload() = default;
juliatuttleee4b55e2017-04-07 17:09:4590
Chris Watkins806691b2017-12-01 06:01:2291TestReportingUploader::TestReportingUploader() = default;
92TestReportingUploader::~TestReportingUploader() = default;
juliatuttleee4b55e2017-04-07 17:09:4593
Douglas Creager3428d812018-07-13 03:59:5694void TestReportingUploader::StartUpload(const url::Origin& report_origin,
95 const GURL& url,
juliatuttleee4b55e2017-04-07 17:09:4596 const std::string& json,
Julia Tuttle107e30672018-03-29 18:48:4297 int max_depth,
Julia Tuttleed8d84b2017-12-05 18:54:5398 UploadCallback callback) {
Jeremy Roman0579ed62017-08-29 15:56:1999 pending_uploads_.push_back(std::make_unique<PendingUploadImpl>(
Douglas Creager3428d812018-07-13 03:59:56100 report_origin, url, json, std::move(callback),
Julia Tuttleed8d84b2017-12-05 18:54:53101 base::BindOnce(&ErasePendingUpload, &pending_uploads_)));
juliatuttleee4b55e2017-04-07 17:09:45102}
103
Lily Chen91b51e62019-03-01 16:46:07104void TestReportingUploader::OnShutdown() {
105 pending_uploads_.clear();
106}
107
108int TestReportingUploader::GetPendingUploadCountForTesting() const {
109 return pending_uploads_.size();
110}
111
Julia Tuttle7d874942018-03-02 01:19:13112TestReportingDelegate::TestReportingDelegate()
Douglas Creagerc8f4b682018-10-08 12:46:19113 : test_request_context_(std::make_unique<TestURLRequestContext>()) {}
juliatuttlefcf47202017-05-23 15:53:02114
Chris Watkins806691b2017-12-01 06:01:22115TestReportingDelegate::~TestReportingDelegate() = default;
juliatuttlefcf47202017-05-23 15:53:02116
117bool TestReportingDelegate::CanQueueReport(const url::Origin& origin) const {
118 return true;
119}
120
Douglas Creager7b07ea42018-02-27 21:08:08121void TestReportingDelegate::CanSendReports(
122 std::set<url::Origin> origins,
123 base::OnceCallback<void(std::set<url::Origin>)> result_callback) const {
Douglas Creager66494e12018-03-05 22:21:00124 if (pause_permissions_check_) {
125 saved_origins_ = std::move(origins);
126 permissions_check_callback_ = std::move(result_callback);
127 return;
128 }
129
Douglas Creager7b07ea42018-02-27 21:08:08130 if (disallow_report_uploads_)
131 origins.clear();
132 std::move(result_callback).Run(std::move(origins));
juliatuttlefcf47202017-05-23 15:53:02133}
134
Douglas Creager66494e12018-03-05 22:21:00135bool TestReportingDelegate::PermissionsCheckPaused() const {
136 return !permissions_check_callback_.is_null();
137}
138
139void TestReportingDelegate::ResumePermissionsCheck() {
140 if (disallow_report_uploads_)
141 saved_origins_.clear();
142 std::move(permissions_check_callback_).Run(std::move(saved_origins_));
143}
144
juliatuttlefcf47202017-05-23 15:53:02145bool TestReportingDelegate::CanSetClient(const url::Origin& origin,
146 const GURL& endpoint) const {
147 return true;
148}
149
150bool TestReportingDelegate::CanUseClient(const url::Origin& origin,
151 const GURL& endpoint) const {
152 return true;
153}
154
tzik26331742017-12-07 07:28:33155TestReportingContext::TestReportingContext(base::Clock* clock,
Greg Thompsonaa48ce8d2018-04-03 06:11:43156 const base::TickClock* tick_clock,
tzik26331742017-12-07 07:28:33157 const ReportingPolicy& policy)
Julia Tuttled56350d2017-12-07 19:11:17158 : ReportingContext(
159 policy,
160 clock,
161 tick_clock,
162 base::BindRepeating(&TestReportingContext::RandIntCallback,
163 base::Unretained(this)),
164 std::make_unique<TestReportingUploader>(),
165 std::make_unique<TestReportingDelegate>()),
166 rand_counter_(0),
tzik35945aa2018-06-22 00:33:26167 delivery_timer_(new base::MockOneShotTimer()),
168 garbage_collection_timer_(new base::MockOneShotTimer()) {
juliatuttle9f970c02017-04-10 19:26:37169 garbage_collector()->SetTimerForTesting(
170 base::WrapUnique(garbage_collection_timer_));
juliatuttle830962a2017-04-19 17:50:04171 delivery_agent()->SetTimerForTesting(base::WrapUnique(delivery_timer_));
juliatuttle9f970c02017-04-10 19:26:37172}
juliatuttleee4b55e2017-04-07 17:09:45173
juliatuttle9f970c02017-04-10 19:26:37174TestReportingContext::~TestReportingContext() {
juliatuttle830962a2017-04-19 17:50:04175 delivery_timer_ = nullptr;
juliatuttle9f970c02017-04-10 19:26:37176 garbage_collection_timer_ = nullptr;
177}
juliatuttleee4b55e2017-04-07 17:09:45178
Julia Tuttled56350d2017-12-07 19:11:17179int TestReportingContext::RandIntCallback(int min, int max) {
180 DCHECK_LE(min, max);
181 return min + (rand_counter_++ % (max - min + 1));
182}
183
juliatuttleee4b55e2017-04-07 17:09:45184ReportingTestBase::ReportingTestBase() {
185 // For tests, disable jitter.
186 ReportingPolicy policy;
187 policy.endpoint_backoff_policy.jitter_factor = 0.0;
juliatuttle7da13812017-04-13 19:18:19188
juliatuttle42c57312017-04-28 03:01:30189 CreateContext(policy, base::Time::Now(), base::TimeTicks::Now());
juliatuttleee4b55e2017-04-07 17:09:45190}
191
Chris Watkins806691b2017-12-01 06:01:22192ReportingTestBase::~ReportingTestBase() = default;
juliatuttleee4b55e2017-04-07 17:09:45193
juliatuttle7da13812017-04-13 19:18:19194void ReportingTestBase::UsePolicy(const ReportingPolicy& new_policy) {
juliatuttle42c57312017-04-28 03:01:30195 CreateContext(new_policy, clock()->Now(), tick_clock()->NowTicks());
juliatuttle7da13812017-04-13 19:18:19196}
197
Lily Chenefb6fcf2019-04-19 04:17:54198const ReportingClient ReportingTestBase::FindEndpointInCache(
199 const url::Origin& origin,
200 const std::string& group_name,
201 const GURL& url) {
202 return cache()->GetEndpointForTesting(origin, group_name, url);
203}
204
205bool ReportingTestBase::SetEndpointInCache(const url::Origin& origin,
206 const std::string& group_name,
207 const GURL& url,
208 base::Time expires,
209 OriginSubdomains include_subdomains,
210 int priority,
211 int weight) {
212 cache()->SetEndpointForTesting(origin, group_name, url, include_subdomains,
213 expires, priority, weight);
214 const ReportingClient endpoint = FindEndpointInCache(origin, group_name, url);
215 return endpoint.is_valid();
216}
217
218bool ReportingTestBase::EndpointExistsInCache(const url::Origin& origin,
219 const std::string& group_name,
220 const GURL& url) {
221 ReportingClient endpoint =
222 cache()->GetEndpointForTesting(origin, group_name, url);
223 return endpoint.is_valid();
224}
225
226ReportingClient::Statistics ReportingTestBase::GetEndpointStatistics(
227 const url::Origin& origin,
228 const std::string& group_name,
229 const GURL& url) {
230 ReportingClient endpoint =
231 cache()->GetEndpointForTesting(origin, group_name, url);
232 if (endpoint)
233 return endpoint.stats;
234 return ReportingClient::Statistics();
235}
236
237bool ReportingTestBase::EndpointGroupExistsInCache(
238 const url::Origin& origin,
239 const std::string& group_name,
240 OriginSubdomains include_subdomains,
241 base::Time expires) {
242 return cache()->EndpointGroupExistsForTesting(origin, group_name,
243 include_subdomains, expires);
244}
245
246bool ReportingTestBase::OriginClientExistsInCache(const url::Origin& origin) {
247 std::vector<url::Origin> all_origins = cache()->GetAllOrigins();
248 for (const url::Origin& cur_origin : all_origins) {
249 if (cur_origin == origin)
250 return true;
251 }
252 return false;
253}
254
255GURL ReportingTestBase::MakeURL(size_t index) {
256 return GURL(base::StringPrintf("https://example%zd.test", index));
257}
258
juliatuttle7da13812017-04-13 19:18:19259void ReportingTestBase::SimulateRestart(base::TimeDelta delta,
260 base::TimeDelta delta_ticks) {
juliatuttle42c57312017-04-28 03:01:30261 CreateContext(policy(), clock()->Now() + delta,
262 tick_clock()->NowTicks() + delta_ticks);
juliatuttle7da13812017-04-13 19:18:19263}
264
juliatuttle42c57312017-04-28 03:01:30265void ReportingTestBase::CreateContext(const ReportingPolicy& policy,
266 base::Time now,
267 base::TimeTicks now_ticks) {
tzik26331742017-12-07 07:28:33268 context_ =
269 std::make_unique<TestReportingContext>(&clock_, &tick_clock_, policy);
juliatuttle7da13812017-04-13 19:18:19270 clock()->SetNow(now);
271 tick_clock()->SetNowTicks(now_ticks);
juliatuttleee4b55e2017-04-07 17:09:45272}
273
274base::TimeTicks ReportingTestBase::yesterday() {
275 return tick_clock()->NowTicks() - base::TimeDelta::FromDays(1);
276}
277
juliatuttle830962a2017-04-19 17:50:04278base::TimeTicks ReportingTestBase::now() {
279 return tick_clock()->NowTicks();
280}
281
juliatuttleee4b55e2017-04-07 17:09:45282base::TimeTicks ReportingTestBase::tomorrow() {
283 return tick_clock()->NowTicks() + base::TimeDelta::FromDays(1);
284}
285
juliatuttle586843332017-03-27 16:22:37286} // namespace net