blob: 7178ee951be9bd03f9dacd3d24ea4b3ab92d6647 [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"
Hans Wennborg0924470b2020-04-27 21:08:0512#include "base/check_op.h"
juliatuttleee4b55e2017-04-07 17:09:4513#include "base/json/json_reader.h"
14#include "base/memory/ptr_util.h"
Hans Wennborg0924470b2020-04-27 21:08:0515#include "base/notreached.h"
Lily Chenefb6fcf2019-04-19 04:17:5416#include "base/strings/stringprintf.h"
juliatuttleee4b55e2017-04-07 17:09:4517#include "base/test/simple_test_clock.h"
18#include "base/test/simple_test_tick_clock.h"
juliatuttle9f970c02017-04-10 19:26:3719#include "base/timer/mock_timer.h"
Ian Clelland52035be2021-10-07 16:38:5020#include "net/base/isolation_info.h"
Matt Menke5577421a2019-10-10 00:04:4921#include "net/base/network_isolation_key.h"
juliatuttle586843332017-03-27 16:22:3722#include "net/reporting/reporting_cache.h"
juliatuttleee4b55e2017-04-07 17:09:4523#include "net/reporting/reporting_context.h"
juliatuttlefcf47202017-05-23 15:53:0224#include "net/reporting/reporting_delegate.h"
juliatuttle830962a2017-04-19 17:50:0425#include "net/reporting/reporting_delivery_agent.h"
Lily Chenfc92ff42019-05-06 22:59:1026#include "net/reporting/reporting_endpoint.h"
juliatuttle9f970c02017-04-10 19:26:3727#include "net/reporting/reporting_garbage_collector.h"
juliatuttleee4b55e2017-04-07 17:09:4528#include "net/reporting/reporting_policy.h"
29#include "net/reporting/reporting_uploader.h"
30#include "testing/gtest/include/gtest/gtest.h"
juliatuttle586843332017-03-27 16:22:3731#include "url/gurl.h"
32#include "url/origin.h"
33
34namespace net {
35
juliatuttleee4b55e2017-04-07 17:09:4536namespace {
37
38class PendingUploadImpl : public TestReportingUploader::PendingUpload {
39 public:
Douglas Creager3428d812018-07-13 03:59:5640 PendingUploadImpl(const url::Origin& report_origin,
41 const GURL& url,
Ian Clelland52035be2021-10-07 16:38:5042 const IsolationInfo& isolation_info,
Julia Tuttleed8d84b2017-12-05 18:54:5343 const std::string& json,
44 ReportingUploader::UploadCallback callback,
45 base::OnceCallback<void(PendingUpload*)> complete_callback)
Douglas Creager3428d812018-07-13 03:59:5646 : report_origin_(report_origin),
47 url_(url),
Ian Clelland52035be2021-10-07 16:38:5048 isolation_info_(isolation_info),
juliatuttleee4b55e2017-04-07 17:09:4549 json_(json),
Julia Tuttleed8d84b2017-12-05 18:54:5350 callback_(std::move(callback)),
51 complete_callback_(std::move(complete_callback)) {}
juliatuttleee4b55e2017-04-07 17:09:4552
Chris Watkins806691b2017-12-01 06:01:2253 ~PendingUploadImpl() override = default;
juliatuttleee4b55e2017-04-07 17:09:4554
Julia Tuttle107e30672018-03-29 18:48:4255 // PendingUpload implementation:
Douglas Creager3428d812018-07-13 03:59:5656 const url::Origin& report_origin() const override { return report_origin_; }
juliatuttleee4b55e2017-04-07 17:09:4557 const GURL& url() const override { return url_; }
58 const std::string& json() const override { return json_; }
59 std::unique_ptr<base::Value> GetValue() const override {
Lei Zhanga8b4c5fb2019-02-16 03:02:0360 return base::JSONReader::ReadDeprecated(json_);
juliatuttleee4b55e2017-04-07 17:09:4561 }
62
63 void Complete(ReportingUploader::Outcome outcome) override {
Julia Tuttleed8d84b2017-12-05 18:54:5364 std::move(callback_).Run(outcome);
juliatuttleee4b55e2017-04-07 17:09:4565 // Deletes |this|.
Julia Tuttleed8d84b2017-12-05 18:54:5366 std::move(complete_callback_).Run(this);
juliatuttleee4b55e2017-04-07 17:09:4567 }
68
69 private:
Douglas Creager3428d812018-07-13 03:59:5670 url::Origin report_origin_;
juliatuttleee4b55e2017-04-07 17:09:4571 GURL url_;
Ian Clelland52035be2021-10-07 16:38:5072 IsolationInfo isolation_info_;
juliatuttleee4b55e2017-04-07 17:09:4573 std::string json_;
Julia Tuttleed8d84b2017-12-05 18:54:5374 ReportingUploader::UploadCallback callback_;
75 base::OnceCallback<void(PendingUpload*)> complete_callback_;
juliatuttleee4b55e2017-04-07 17:09:4576};
77
78void ErasePendingUpload(
79 std::vector<std::unique_ptr<TestReportingUploader::PendingUpload>>* uploads,
80 TestReportingUploader::PendingUpload* upload) {
81 for (auto it = uploads->begin(); it != uploads->end(); ++it) {
82 if (it->get() == upload) {
83 uploads->erase(it);
84 return;
85 }
86 }
87 NOTREACHED();
88}
89
90} // namespace
91
Matt Menke515136d2019-10-05 00:27:0992RandIntCallback TestReportingRandIntCallback() {
93 return base::BindRepeating(
94 [](int* rand_counter, int min, int max) {
95 DCHECK_LE(min, max);
96 return min + ((*rand_counter)++ % (max - min + 1));
97 },
98 base::Owned(std::make_unique<int>(0)));
99}
100
Chris Watkins806691b2017-12-01 06:01:22101TestReportingUploader::PendingUpload::~PendingUpload() = default;
102TestReportingUploader::PendingUpload::PendingUpload() = default;
juliatuttleee4b55e2017-04-07 17:09:45103
Chris Watkins806691b2017-12-01 06:01:22104TestReportingUploader::TestReportingUploader() = default;
105TestReportingUploader::~TestReportingUploader() = default;
juliatuttleee4b55e2017-04-07 17:09:45106
Ian Clelland52035be2021-10-07 16:38:50107void TestReportingUploader::StartUpload(const url::Origin& report_origin,
108 const GURL& url,
109 const IsolationInfo& isolation_info,
110 const std::string& json,
111 int max_depth,
112 bool eligible_for_credentials,
113 UploadCallback callback) {
Jeremy Roman0579ed62017-08-29 15:56:19114 pending_uploads_.push_back(std::make_unique<PendingUploadImpl>(
Ian Clelland52035be2021-10-07 16:38:50115 report_origin, url, isolation_info, json, std::move(callback),
Julia Tuttleed8d84b2017-12-05 18:54:53116 base::BindOnce(&ErasePendingUpload, &pending_uploads_)));
juliatuttleee4b55e2017-04-07 17:09:45117}
118
Lily Chen91b51e62019-03-01 16:46:07119void TestReportingUploader::OnShutdown() {
120 pending_uploads_.clear();
121}
122
123int TestReportingUploader::GetPendingUploadCountForTesting() const {
124 return pending_uploads_.size();
125}
126
Matt Menke515136d2019-10-05 00:27:09127TestReportingDelegate::TestReportingDelegate() = default;
juliatuttlefcf47202017-05-23 15:53:02128
Chris Watkins806691b2017-12-01 06:01:22129TestReportingDelegate::~TestReportingDelegate() = default;
juliatuttlefcf47202017-05-23 15:53:02130
131bool TestReportingDelegate::CanQueueReport(const url::Origin& origin) const {
132 return true;
133}
134
Douglas Creager7b07ea42018-02-27 21:08:08135void TestReportingDelegate::CanSendReports(
136 std::set<url::Origin> origins,
137 base::OnceCallback<void(std::set<url::Origin>)> result_callback) const {
Douglas Creager66494e12018-03-05 22:21:00138 if (pause_permissions_check_) {
139 saved_origins_ = std::move(origins);
140 permissions_check_callback_ = std::move(result_callback);
141 return;
142 }
143
Douglas Creager7b07ea42018-02-27 21:08:08144 if (disallow_report_uploads_)
145 origins.clear();
146 std::move(result_callback).Run(std::move(origins));
juliatuttlefcf47202017-05-23 15:53:02147}
148
Douglas Creager66494e12018-03-05 22:21:00149bool TestReportingDelegate::PermissionsCheckPaused() const {
150 return !permissions_check_callback_.is_null();
151}
152
153void TestReportingDelegate::ResumePermissionsCheck() {
154 if (disallow_report_uploads_)
155 saved_origins_.clear();
156 std::move(permissions_check_callback_).Run(std::move(saved_origins_));
157}
158
juliatuttlefcf47202017-05-23 15:53:02159bool TestReportingDelegate::CanSetClient(const url::Origin& origin,
160 const GURL& endpoint) const {
161 return true;
162}
163
164bool TestReportingDelegate::CanUseClient(const url::Origin& origin,
165 const GURL& endpoint) const {
166 return true;
167}
168
Lily Chen731a95c2019-05-06 22:27:22169TestReportingContext::TestReportingContext(
170 base::Clock* clock,
171 const base::TickClock* tick_clock,
172 const ReportingPolicy& policy,
173 ReportingCache::PersistentReportingStore* store)
Matt Menke515136d2019-10-05 00:27:09174 : ReportingContext(policy,
175 clock,
176 tick_clock,
177 TestReportingRandIntCallback(),
178 std::make_unique<TestReportingUploader>(),
179 std::make_unique<TestReportingDelegate>(),
180 store),
tzik35945aa2018-06-22 00:33:26181 delivery_timer_(new base::MockOneShotTimer()),
182 garbage_collection_timer_(new base::MockOneShotTimer()) {
juliatuttle9f970c02017-04-10 19:26:37183 garbage_collector()->SetTimerForTesting(
184 base::WrapUnique(garbage_collection_timer_));
juliatuttle830962a2017-04-19 17:50:04185 delivery_agent()->SetTimerForTesting(base::WrapUnique(delivery_timer_));
juliatuttle9f970c02017-04-10 19:26:37186}
juliatuttleee4b55e2017-04-07 17:09:45187
juliatuttle9f970c02017-04-10 19:26:37188TestReportingContext::~TestReportingContext() {
juliatuttle830962a2017-04-19 17:50:04189 delivery_timer_ = nullptr;
juliatuttle9f970c02017-04-10 19:26:37190 garbage_collection_timer_ = nullptr;
191}
juliatuttleee4b55e2017-04-07 17:09:45192
Lily Chen731a95c2019-05-06 22:27:22193ReportingTestBase::ReportingTestBase() : store_(nullptr) {
juliatuttleee4b55e2017-04-07 17:09:45194 // For tests, disable jitter.
195 ReportingPolicy policy;
196 policy.endpoint_backoff_policy.jitter_factor = 0.0;
juliatuttle7da13812017-04-13 19:18:19197
juliatuttle42c57312017-04-28 03:01:30198 CreateContext(policy, base::Time::Now(), base::TimeTicks::Now());
juliatuttleee4b55e2017-04-07 17:09:45199}
200
Chris Watkins806691b2017-12-01 06:01:22201ReportingTestBase::~ReportingTestBase() = default;
juliatuttleee4b55e2017-04-07 17:09:45202
juliatuttle7da13812017-04-13 19:18:19203void ReportingTestBase::UsePolicy(const ReportingPolicy& new_policy) {
juliatuttle42c57312017-04-28 03:01:30204 CreateContext(new_policy, clock()->Now(), tick_clock()->NowTicks());
juliatuttle7da13812017-04-13 19:18:19205}
206
Lily Chen731a95c2019-05-06 22:27:22207void ReportingTestBase::UseStore(
208 ReportingCache::PersistentReportingStore* store) {
209 store_ = store;
210 CreateContext(policy(), clock()->Now(), tick_clock()->NowTicks());
211}
212
Lily Chenfc92ff42019-05-06 22:59:10213const ReportingEndpoint ReportingTestBase::FindEndpointInCache(
Lily Chenad5dd0802020-03-10 21:58:09214 const ReportingEndpointGroupKey& group_key,
Lily Chenefb6fcf2019-04-19 04:17:54215 const GURL& url) {
Lily Chenad5dd0802020-03-10 21:58:09216 return cache()->GetEndpointForTesting(group_key, url);
Lily Chenefb6fcf2019-04-19 04:17:54217}
218
Lily Chenad5dd0802020-03-10 21:58:09219bool ReportingTestBase::SetEndpointInCache(
220 const ReportingEndpointGroupKey& group_key,
221 const GURL& url,
222 base::Time expires,
223 OriginSubdomains include_subdomains,
224 int priority,
225 int weight) {
226 cache()->SetEndpointForTesting(group_key, url, include_subdomains, expires,
227 priority, weight);
228 const ReportingEndpoint endpoint = FindEndpointInCache(group_key, url);
Lily Chenefb6fcf2019-04-19 04:17:54229 return endpoint.is_valid();
230}
231
Ian Clellanda52d5472021-08-23 18:33:53232void ReportingTestBase::SetV1EndpointInCache(
233 const ReportingEndpointGroupKey& group_key,
234 const base::UnguessableToken& reporting_source,
Ian Clelland52035be2021-10-07 16:38:50235 const IsolationInfo& isolation_info,
Ian Clellanda52d5472021-08-23 18:33:53236 const GURL& url) {
Ian Clelland52035be2021-10-07 16:38:50237 cache()->SetV1EndpointForTesting(group_key, reporting_source, isolation_info,
238 url);
Ian Clellanda52d5472021-08-23 18:33:53239}
240
Lily Chenad5dd0802020-03-10 21:58:09241bool ReportingTestBase::EndpointExistsInCache(
242 const ReportingEndpointGroupKey& group_key,
243 const GURL& url) {
244 ReportingEndpoint endpoint = cache()->GetEndpointForTesting(group_key, url);
Lily Chenefb6fcf2019-04-19 04:17:54245 return endpoint.is_valid();
246}
247
Lily Chenfc92ff42019-05-06 22:59:10248ReportingEndpoint::Statistics ReportingTestBase::GetEndpointStatistics(
Lily Chenad5dd0802020-03-10 21:58:09249 const ReportingEndpointGroupKey& group_key,
Lily Chenefb6fcf2019-04-19 04:17:54250 const GURL& url) {
Rodney Ding1e758462021-09-16 13:59:07251 ReportingEndpoint endpoint;
252 if (group_key.IsDocumentEndpoint()) {
253 endpoint = cache()->GetV1EndpointForTesting(
254 group_key.reporting_source.value(), group_key.group_name);
255 } else {
256 endpoint = cache()->GetEndpointForTesting(group_key, url);
257 }
Lily Chenefb6fcf2019-04-19 04:17:54258 if (endpoint)
259 return endpoint.stats;
Lily Chenfc92ff42019-05-06 22:59:10260 return ReportingEndpoint::Statistics();
Lily Chenefb6fcf2019-04-19 04:17:54261}
262
263bool ReportingTestBase::EndpointGroupExistsInCache(
Lily Chenad5dd0802020-03-10 21:58:09264 const ReportingEndpointGroupKey& group_key,
Lily Chenefb6fcf2019-04-19 04:17:54265 OriginSubdomains include_subdomains,
266 base::Time expires) {
Lily Chenad5dd0802020-03-10 21:58:09267 return cache()->EndpointGroupExistsForTesting(group_key, include_subdomains,
268 expires);
Lily Chenefb6fcf2019-04-19 04:17:54269}
270
Lily Chenad5dd0802020-03-10 21:58:09271bool ReportingTestBase::ClientExistsInCacheForOrigin(
272 const url::Origin& origin) {
273 std::set<url::Origin> all_origins = cache()->GetAllOrigins();
274 return all_origins.find(origin) != all_origins.end();
Lily Chenefb6fcf2019-04-19 04:17:54275}
276
277GURL ReportingTestBase::MakeURL(size_t index) {
278 return GURL(base::StringPrintf("https://example%zd.test", index));
279}
280
juliatuttle7da13812017-04-13 19:18:19281void ReportingTestBase::SimulateRestart(base::TimeDelta delta,
282 base::TimeDelta delta_ticks) {
juliatuttle42c57312017-04-28 03:01:30283 CreateContext(policy(), clock()->Now() + delta,
284 tick_clock()->NowTicks() + delta_ticks);
juliatuttle7da13812017-04-13 19:18:19285}
286
juliatuttle42c57312017-04-28 03:01:30287void ReportingTestBase::CreateContext(const ReportingPolicy& policy,
288 base::Time now,
289 base::TimeTicks now_ticks) {
Lily Chen731a95c2019-05-06 22:27:22290 context_ = std::make_unique<TestReportingContext>(&clock_, &tick_clock_,
291 policy, store_);
juliatuttle7da13812017-04-13 19:18:19292 clock()->SetNow(now);
293 tick_clock()->SetNowTicks(now_ticks);
juliatuttleee4b55e2017-04-07 17:09:45294}
295
296base::TimeTicks ReportingTestBase::yesterday() {
Peter Kastinge5a38ed2021-10-02 03:06:35297 return tick_clock()->NowTicks() - base::Days(1);
juliatuttleee4b55e2017-04-07 17:09:45298}
299
juliatuttle830962a2017-04-19 17:50:04300base::TimeTicks ReportingTestBase::now() {
301 return tick_clock()->NowTicks();
302}
303
juliatuttleee4b55e2017-04-07 17:09:45304base::TimeTicks ReportingTestBase::tomorrow() {
Peter Kastinge5a38ed2021-10-02 03:06:35305 return tick_clock()->NowTicks() + base::Days(1);
juliatuttleee4b55e2017-04-07 17:09:45306}
307
Lily Chen8a9e53722019-04-26 15:16:02308TestReportingService::Report::Report() = default;
309
Matt Menke643ae972020-10-22 13:47:02310TestReportingService::Report::Report(Report&& other) = default;
Lily Chen8a9e53722019-04-26 15:16:02311
Matt Menkedd2ed7a2020-10-22 04:09:20312TestReportingService::Report::Report(
313 const GURL& url,
314 const NetworkIsolationKey& network_isolation_key,
315 const std::string& user_agent,
316 const std::string& group,
317 const std::string& type,
318 std::unique_ptr<const base::Value> body,
319 int depth)
Lily Chen8a9e53722019-04-26 15:16:02320 : url(url),
Matt Menkedd2ed7a2020-10-22 04:09:20321 network_isolation_key(network_isolation_key),
Lily Chen8a9e53722019-04-26 15:16:02322 user_agent(user_agent),
323 group(group),
324 type(type),
325 body(std::move(body)),
326 depth(depth) {}
327
328TestReportingService::Report::~Report() = default;
329
330TestReportingService::TestReportingService() = default;
331
332TestReportingService::~TestReportingService() = default;
333
Matt Menkedd2ed7a2020-10-22 04:09:20334void TestReportingService::QueueReport(
335 const GURL& url,
Ian Clellande07e64b2021-08-23 16:29:43336 const absl::optional<base::UnguessableToken>& reporting_source,
Matt Menkedd2ed7a2020-10-22 04:09:20337 const NetworkIsolationKey& network_isolation_key,
338 const std::string& user_agent,
339 const std::string& group,
340 const std::string& type,
341 std::unique_ptr<const base::Value> body,
342 int depth) {
343 reports_.emplace_back(Report(url, network_isolation_key, user_agent, group,
344 type, std::move(body), depth));
Lily Chen8a9e53722019-04-26 15:16:02345}
346
Rodney Ding329e4bb2021-03-19 22:21:53347void TestReportingService::ProcessReportToHeader(
Matt Menkee4399022021-10-21 18:04:42348 const url::Origin& origin,
Matt Menke17b23c42020-10-22 05:14:57349 const NetworkIsolationKey& network_isolation_key,
350 const std::string& header_value) {
Lily Chen8a9e53722019-04-26 15:16:02351 NOTREACHED();
352}
353
354void TestReportingService::RemoveBrowsingData(
Marcus Pasellc3305c042020-06-03 22:14:36355 uint64_t data_type_mask,
Lily Chen8a9e53722019-04-26 15:16:02356 const base::RepeatingCallback<bool(const GURL&)>& origin_filter) {
357 NOTREACHED();
358}
359
Marcus Pasellc3305c042020-06-03 22:14:36360void TestReportingService::RemoveAllBrowsingData(uint64_t data_type_mask) {
Lily Chen8a9e53722019-04-26 15:16:02361 NOTREACHED();
362}
363
364void TestReportingService::OnShutdown() {}
365
366const ReportingPolicy& TestReportingService::GetPolicy() const {
367 NOTREACHED();
368 return dummy_policy_;
369}
370
371ReportingContext* TestReportingService::GetContextForTesting() const {
372 NOTREACHED();
373 return nullptr;
374}
375
Wolfgang Beyer14d8d41b82021-08-17 15:52:07376std::vector<const ReportingReport*> TestReportingService::GetReports() const {
377 NOTREACHED();
378 return std::vector<const ReportingReport*>();
379}
380
Wolfgang Beyerba1bf702021-11-15 12:49:47381base::flat_map<url::Origin, std::vector<ReportingEndpoint>>
382TestReportingService::GetV1ReportingEndpointsByOrigin() const {
383 NOTREACHED();
384 return base::flat_map<url::Origin, std::vector<ReportingEndpoint>>();
385}
386
Wolfgang Beyer14d8d41b82021-08-17 15:52:07387void TestReportingService::AddReportingCacheObserver(
388 ReportingCacheObserver* observer) {
389 NOTREACHED();
390}
391
392void TestReportingService::RemoveReportingCacheObserver(
393 ReportingCacheObserver* observer) {
394 NOTREACHED();
395}
396
juliatuttle586843332017-03-27 16:22:37397} // namespace net