blob: 8a7dbd06f4d99d0d4714d274f2feedc927c380e0 [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"
juliatuttle7da13812017-04-13 19:18:1917#include "base/timer/timer.h"
juliatuttle586843332017-03-27 16:22:3718#include "net/reporting/reporting_cache.h"
19#include "net/reporting/reporting_client.h"
juliatuttleee4b55e2017-04-07 17:09:4520#include "net/reporting/reporting_context.h"
21#include "net/reporting/reporting_delegate.h"
juliatuttle9f970c02017-04-10 19:26:3722#include "net/reporting/reporting_garbage_collector.h"
juliatuttle7da13812017-04-13 19:18:1923#include "net/reporting/reporting_persister.h"
juliatuttleee4b55e2017-04-07 17:09:4524#include "net/reporting/reporting_policy.h"
25#include "net/reporting/reporting_uploader.h"
26#include "testing/gtest/include/gtest/gtest.h"
juliatuttle586843332017-03-27 16:22:3727#include "url/gurl.h"
28#include "url/origin.h"
29
30namespace net {
31
juliatuttleee4b55e2017-04-07 17:09:4532namespace {
33
34class PendingUploadImpl : public TestReportingUploader::PendingUpload {
35 public:
36 PendingUploadImpl(
37 const GURL& url,
38 const std::string& json,
39 const ReportingUploader::Callback& callback,
40 const base::Callback<void(PendingUpload*)>& complete_callback)
41 : url_(url),
42 json_(json),
43 callback_(callback),
44 complete_callback_(complete_callback) {}
45
46 ~PendingUploadImpl() override {}
47
48 // PendingUpload implementationP:
49 const GURL& url() const override { return url_; }
50 const std::string& json() const override { return json_; }
51 std::unique_ptr<base::Value> GetValue() const override {
52 return base::JSONReader::Read(json_);
53 }
54
55 void Complete(ReportingUploader::Outcome outcome) override {
56 callback_.Run(outcome);
57 // Deletes |this|.
58 complete_callback_.Run(this);
59 }
60
61 private:
62 GURL url_;
63 std::string json_;
64 ReportingUploader::Callback callback_;
65 base::Callback<void(PendingUpload*)> complete_callback_;
66};
67
68void ErasePendingUpload(
69 std::vector<std::unique_ptr<TestReportingUploader::PendingUpload>>* uploads,
70 TestReportingUploader::PendingUpload* upload) {
71 for (auto it = uploads->begin(); it != uploads->end(); ++it) {
72 if (it->get() == upload) {
73 uploads->erase(it);
74 return;
75 }
76 }
77 NOTREACHED();
78}
79
80} // namespace
81
juliatuttle586843332017-03-27 16:22:3782const ReportingClient* FindClientInCache(const ReportingCache* cache,
83 const url::Origin& origin,
84 const GURL& endpoint) {
85 std::vector<const ReportingClient*> clients;
86 cache->GetClients(&clients);
87 for (const ReportingClient* client : clients) {
88 if (client->origin == origin && client->endpoint == endpoint)
89 return client;
90 }
91 return nullptr;
92}
93
juliatuttleee4b55e2017-04-07 17:09:4594TestReportingDelegate::TestReportingDelegate() {}
95TestReportingDelegate::~TestReportingDelegate() {}
96
97void TestReportingDelegate::PersistData(
98 std::unique_ptr<const base::Value> persisted_data) {
99 persisted_data_ = std::move(persisted_data);
100}
101
102std::unique_ptr<const base::Value> TestReportingDelegate::GetPersistedData() {
103 if (!persisted_data_)
104 return std::unique_ptr<const base::Value>();
105 return persisted_data_->CreateDeepCopy();
106}
107
108TestReportingUploader::PendingUpload::~PendingUpload() {}
109TestReportingUploader::PendingUpload::PendingUpload() {}
110
111TestReportingUploader::TestReportingUploader() {}
112TestReportingUploader::~TestReportingUploader() {}
113
114void TestReportingUploader::StartUpload(const GURL& url,
115 const std::string& json,
116 const Callback& callback) {
117 pending_uploads_.push_back(base::MakeUnique<PendingUploadImpl>(
118 url, json, callback, base::Bind(&ErasePendingUpload, &pending_uploads_)));
119}
120
121TestReportingContext::TestReportingContext(const ReportingPolicy& policy)
122 : ReportingContext(policy,
123 base::MakeUnique<TestReportingDelegate>(),
124 base::MakeUnique<base::SimpleTestClock>(),
125 base::MakeUnique<base::SimpleTestTickClock>(),
juliatuttle9f970c02017-04-10 19:26:37126 base::MakeUnique<TestReportingUploader>()),
juliatuttle7da13812017-04-13 19:18:19127 persistence_timer_(new base::MockTimer(/* retain_user_task= */ false,
128 /* is_repeating= */ false)),
juliatuttle9f970c02017-04-10 19:26:37129 garbage_collection_timer_(
130 new base::MockTimer(/* retain_user_task= */ false,
131 /* is_repeating= */ false)) {
juliatuttle7da13812017-04-13 19:18:19132 persister()->SetTimerForTesting(base::WrapUnique(persistence_timer_));
juliatuttle9f970c02017-04-10 19:26:37133 garbage_collector()->SetTimerForTesting(
134 base::WrapUnique(garbage_collection_timer_));
135}
juliatuttleee4b55e2017-04-07 17:09:45136
juliatuttle9f970c02017-04-10 19:26:37137TestReportingContext::~TestReportingContext() {
juliatuttle7da13812017-04-13 19:18:19138 persistence_timer_ = nullptr;
juliatuttle9f970c02017-04-10 19:26:37139 garbage_collection_timer_ = nullptr;
140}
juliatuttleee4b55e2017-04-07 17:09:45141
142ReportingTestBase::ReportingTestBase() {
143 // For tests, disable jitter.
144 ReportingPolicy policy;
145 policy.endpoint_backoff_policy.jitter_factor = 0.0;
juliatuttle7da13812017-04-13 19:18:19146
147 CreateAndInitializeContext(policy, std::unique_ptr<const base::Value>(),
148 base::Time::Now(), base::TimeTicks::Now());
juliatuttleee4b55e2017-04-07 17:09:45149}
150
151ReportingTestBase::~ReportingTestBase() {}
152
juliatuttle7da13812017-04-13 19:18:19153void ReportingTestBase::UsePolicy(const ReportingPolicy& new_policy) {
154 CreateAndInitializeContext(new_policy, delegate()->GetPersistedData(),
155 clock()->Now(), tick_clock()->NowTicks());
156}
157
158void ReportingTestBase::SimulateRestart(base::TimeDelta delta,
159 base::TimeDelta delta_ticks) {
160 CreateAndInitializeContext(policy(), delegate()->GetPersistedData(),
161 clock()->Now() + delta,
162 tick_clock()->NowTicks() + delta_ticks);
163}
164
165void ReportingTestBase::CreateAndInitializeContext(
166 const ReportingPolicy& policy,
167 std::unique_ptr<const base::Value> persisted_data,
168 base::Time now,
169 base::TimeTicks now_ticks) {
juliatuttleee4b55e2017-04-07 17:09:45170 context_ = base::MakeUnique<TestReportingContext>(policy);
juliatuttle7da13812017-04-13 19:18:19171 delegate()->PersistData(std::move(persisted_data));
172 clock()->SetNow(now);
173 tick_clock()->SetNowTicks(now_ticks);
174 context_->Initialize();
juliatuttleee4b55e2017-04-07 17:09:45175}
176
177base::TimeTicks ReportingTestBase::yesterday() {
178 return tick_clock()->NowTicks() - base::TimeDelta::FromDays(1);
179}
180
181base::TimeTicks ReportingTestBase::tomorrow() {
182 return tick_clock()->NowTicks() + base::TimeDelta::FromDays(1);
183}
184
juliatuttle586843332017-03-27 16:22:37185} // namespace net