blob: 2a7d1e0c8b61f8680d984c18b5a611ea3e0af51b [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"
juliatuttle830962a2017-04-19 17:50:0420#include "net/reporting/reporting_delivery_agent.h"
juliatuttle9f970c02017-04-10 19:26:3721#include "net/reporting/reporting_garbage_collector.h"
juliatuttle7da13812017-04-13 19:18:1922#include "net/reporting/reporting_persister.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:
35 PendingUploadImpl(
36 const GURL& url,
37 const std::string& json,
38 const ReportingUploader::Callback& callback,
39 const base::Callback<void(PendingUpload*)>& complete_callback)
40 : url_(url),
41 json_(json),
42 callback_(callback),
43 complete_callback_(complete_callback) {}
44
45 ~PendingUploadImpl() override {}
46
47 // PendingUpload implementationP:
48 const GURL& url() const override { return url_; }
49 const std::string& json() const override { return json_; }
50 std::unique_ptr<base::Value> GetValue() const override {
51 return base::JSONReader::Read(json_);
52 }
53
54 void Complete(ReportingUploader::Outcome outcome) override {
55 callback_.Run(outcome);
56 // Deletes |this|.
57 complete_callback_.Run(this);
58 }
59
60 private:
61 GURL url_;
62 std::string json_;
63 ReportingUploader::Callback callback_;
64 base::Callback<void(PendingUpload*)> complete_callback_;
65};
66
67void ErasePendingUpload(
68 std::vector<std::unique_ptr<TestReportingUploader::PendingUpload>>* uploads,
69 TestReportingUploader::PendingUpload* upload) {
70 for (auto it = uploads->begin(); it != uploads->end(); ++it) {
71 if (it->get() == upload) {
72 uploads->erase(it);
73 return;
74 }
75 }
76 NOTREACHED();
77}
78
79} // namespace
80
juliatuttle586843332017-03-27 16:22:3781const ReportingClient* FindClientInCache(const ReportingCache* cache,
82 const url::Origin& origin,
83 const GURL& endpoint) {
84 std::vector<const ReportingClient*> clients;
85 cache->GetClients(&clients);
86 for (const ReportingClient* client : clients) {
87 if (client->origin == origin && client->endpoint == endpoint)
88 return client;
89 }
90 return nullptr;
91}
92
juliatuttleee4b55e2017-04-07 17:09:4593TestReportingUploader::PendingUpload::~PendingUpload() {}
94TestReportingUploader::PendingUpload::PendingUpload() {}
95
96TestReportingUploader::TestReportingUploader() {}
97TestReportingUploader::~TestReportingUploader() {}
98
99void TestReportingUploader::StartUpload(const GURL& url,
100 const std::string& json,
101 const Callback& callback) {
102 pending_uploads_.push_back(base::MakeUnique<PendingUploadImpl>(
103 url, json, callback, base::Bind(&ErasePendingUpload, &pending_uploads_)));
104}
105
106TestReportingContext::TestReportingContext(const ReportingPolicy& policy)
107 : ReportingContext(policy,
juliatuttleee4b55e2017-04-07 17:09:45108 base::MakeUnique<base::SimpleTestClock>(),
109 base::MakeUnique<base::SimpleTestTickClock>(),
juliatuttle9f970c02017-04-10 19:26:37110 base::MakeUnique<TestReportingUploader>()),
juliatuttle830962a2017-04-19 17:50:04111 delivery_timer_(new base::MockTimer(/* retain_user_task= */ false,
112 /* is_repeating= */ false)),
juliatuttle9f970c02017-04-10 19:26:37113 garbage_collection_timer_(
114 new base::MockTimer(/* retain_user_task= */ false,
115 /* is_repeating= */ false)) {
116 garbage_collector()->SetTimerForTesting(
117 base::WrapUnique(garbage_collection_timer_));
juliatuttle830962a2017-04-19 17:50:04118 delivery_agent()->SetTimerForTesting(base::WrapUnique(delivery_timer_));
juliatuttle9f970c02017-04-10 19:26:37119}
juliatuttleee4b55e2017-04-07 17:09:45120
juliatuttle9f970c02017-04-10 19:26:37121TestReportingContext::~TestReportingContext() {
juliatuttle830962a2017-04-19 17:50:04122 delivery_timer_ = nullptr;
juliatuttle9f970c02017-04-10 19:26:37123 garbage_collection_timer_ = nullptr;
124}
juliatuttleee4b55e2017-04-07 17:09:45125
126ReportingTestBase::ReportingTestBase() {
127 // For tests, disable jitter.
128 ReportingPolicy policy;
129 policy.endpoint_backoff_policy.jitter_factor = 0.0;
juliatuttle7da13812017-04-13 19:18:19130
juliatuttle42c57312017-04-28 03:01:30131 CreateContext(policy, base::Time::Now(), base::TimeTicks::Now());
juliatuttleee4b55e2017-04-07 17:09:45132}
133
134ReportingTestBase::~ReportingTestBase() {}
135
juliatuttle7da13812017-04-13 19:18:19136void ReportingTestBase::UsePolicy(const ReportingPolicy& new_policy) {
juliatuttle42c57312017-04-28 03:01:30137 CreateContext(new_policy, clock()->Now(), tick_clock()->NowTicks());
juliatuttle7da13812017-04-13 19:18:19138}
139
140void ReportingTestBase::SimulateRestart(base::TimeDelta delta,
141 base::TimeDelta delta_ticks) {
juliatuttle42c57312017-04-28 03:01:30142 CreateContext(policy(), clock()->Now() + delta,
143 tick_clock()->NowTicks() + delta_ticks);
juliatuttle7da13812017-04-13 19:18:19144}
145
juliatuttle42c57312017-04-28 03:01:30146void ReportingTestBase::CreateContext(const ReportingPolicy& policy,
147 base::Time now,
148 base::TimeTicks now_ticks) {
juliatuttleee4b55e2017-04-07 17:09:45149 context_ = base::MakeUnique<TestReportingContext>(policy);
juliatuttle7da13812017-04-13 19:18:19150 clock()->SetNow(now);
151 tick_clock()->SetNowTicks(now_ticks);
juliatuttleee4b55e2017-04-07 17:09:45152}
153
154base::TimeTicks ReportingTestBase::yesterday() {
155 return tick_clock()->NowTicks() - base::TimeDelta::FromDays(1);
156}
157
juliatuttle830962a2017-04-19 17:50:04158base::TimeTicks ReportingTestBase::now() {
159 return tick_clock()->NowTicks();
160}
161
juliatuttleee4b55e2017-04-07 17:09:45162base::TimeTicks ReportingTestBase::tomorrow() {
163 return tick_clock()->NowTicks() + base::TimeDelta::FromDays(1);
164}
165
juliatuttle586843332017-03-27 16:22:37166} // namespace net