1 // Copyright 2017 The Chromium Authors
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_browsing_data_remover.h"
6
7 #include <memory>
8 #include <string>
9
10 #include "base/functional/bind.h"
11 #include "base/memory/raw_ptr.h"
12 #include "base/test/simple_test_tick_clock.h"
13 #include "net/base/network_anonymization_key.h"
14 #include "net/reporting/reporting_cache.h"
15 #include "net/reporting/reporting_context.h"
16 #include "net/reporting/reporting_report.h"
17 #include "net/reporting/reporting_test_util.h"
18 #include "testing/gtest/include/gtest/gtest.h"
19
20 namespace net {
21 namespace {
22
23 class ReportingBrowsingDataRemoverTest : public ReportingTestBase {
24 protected:
RemoveBrowsingData(bool remove_reports,bool remove_clients,std::string host)25 void RemoveBrowsingData(bool remove_reports,
26 bool remove_clients,
27 std::string host) {
28 uint64_t data_type_mask = 0;
29 if (remove_reports)
30 data_type_mask |= ReportingBrowsingDataRemover::DATA_TYPE_REPORTS;
31 if (remove_clients)
32 data_type_mask |= ReportingBrowsingDataRemover::DATA_TYPE_CLIENTS;
33
34 if (!host.empty()) {
35 base::RepeatingCallback<bool(const url::Origin&)> origin_filter =
36 base::BindRepeating(&ReportingBrowsingDataRemoverTest::HostIs, host);
37 ReportingBrowsingDataRemover::RemoveBrowsingData(cache(), data_type_mask,
38 origin_filter);
39 } else {
40 ReportingBrowsingDataRemover::RemoveAllBrowsingData(cache(),
41 data_type_mask);
42 }
43 }
44
45 // TODO(chlily): Take NAK.
AddReport(const GURL & url)46 void AddReport(const GURL& url) {
47 cache()->AddReport(std::nullopt, NetworkAnonymizationKey(), url,
48 kUserAgent_, kGroup_, kType_, base::Value::Dict(), 0,
49 tick_clock()->NowTicks(), 0);
50 }
51
52 // TODO(chlily): Take NAK.
SetEndpoint(const url::Origin & origin)53 void SetEndpoint(const url::Origin& origin) {
54 SetEndpointInCache(
55 ReportingEndpointGroupKey(NetworkAnonymizationKey(), origin, kGroup_),
56 kEndpoint_, base::Time::Now() + base::Days(7));
57 }
58
HostIs(std::string host,const url::Origin & origin)59 static bool HostIs(std::string host, const url::Origin& origin) {
60 return origin.host() == host;
61 }
62
report_count()63 size_t report_count() {
64 std::vector<raw_ptr<const ReportingReport, VectorExperimental>> reports;
65 cache()->GetReports(&reports);
66 return reports.size();
67 }
68
69 const GURL kUrl1_ = GURL("https://origin1/path");
70 const GURL kUrl2_ = GURL("https://origin2/path");
71 const url::Origin kOrigin1_ = url::Origin::Create(kUrl1_);
72 const url::Origin kOrigin2_ = url::Origin::Create(kUrl2_);
73 const GURL kEndpoint_ = GURL("https://endpoint/");
74 const std::string kUserAgent_ = "Mozilla/1.0";
75 const std::string kGroup_ = "group";
76 const std::string kType_ = "default";
77 };
78
TEST_F(ReportingBrowsingDataRemoverTest,RemoveNothing)79 TEST_F(ReportingBrowsingDataRemoverTest, RemoveNothing) {
80 AddReport(kUrl1_);
81 AddReport(kUrl2_);
82
83 SetEndpoint(kOrigin1_);
84 SetEndpoint(kOrigin2_);
85
86 RemoveBrowsingData(/* remove_reports= */ false, /* remove_clients= */ false,
87 /* host= */ "");
88 EXPECT_EQ(2u, report_count());
89 EXPECT_EQ(2u, cache()->GetEndpointCount());
90 }
91
TEST_F(ReportingBrowsingDataRemoverTest,RemoveAllReports)92 TEST_F(ReportingBrowsingDataRemoverTest, RemoveAllReports) {
93 AddReport(kUrl1_);
94 AddReport(kUrl2_);
95
96 SetEndpoint(kOrigin1_);
97 SetEndpoint(kOrigin2_);
98
99 RemoveBrowsingData(/* remove_reports= */ true, /* remove_clients= */ false,
100 /* host= */ "");
101 EXPECT_EQ(0u, report_count());
102 EXPECT_EQ(2u, cache()->GetEndpointCount());
103 }
104
TEST_F(ReportingBrowsingDataRemoverTest,RemoveAllClients)105 TEST_F(ReportingBrowsingDataRemoverTest, RemoveAllClients) {
106 AddReport(kUrl1_);
107 AddReport(kUrl2_);
108
109 SetEndpoint(kOrigin1_);
110 SetEndpoint(kOrigin2_);
111
112 RemoveBrowsingData(/* remove_reports= */ false, /* remove_clients= */ true,
113 /* host= */ "");
114 EXPECT_EQ(2u, report_count());
115 EXPECT_EQ(0u, cache()->GetEndpointCount());
116 }
117
TEST_F(ReportingBrowsingDataRemoverTest,RemoveAllReportsAndClients)118 TEST_F(ReportingBrowsingDataRemoverTest, RemoveAllReportsAndClients) {
119 AddReport(kUrl1_);
120 AddReport(kUrl2_);
121
122 SetEndpoint(kOrigin1_);
123 SetEndpoint(kOrigin2_);
124
125 RemoveBrowsingData(/* remove_reports= */ true, /* remove_clients= */ true,
126 /* host= */ "");
127 EXPECT_EQ(0u, report_count());
128 EXPECT_EQ(0u, cache()->GetEndpointCount());
129 }
130
TEST_F(ReportingBrowsingDataRemoverTest,RemoveSomeReports)131 TEST_F(ReportingBrowsingDataRemoverTest, RemoveSomeReports) {
132 AddReport(kUrl1_);
133 AddReport(kUrl2_);
134
135 SetEndpoint(kOrigin1_);
136 SetEndpoint(kOrigin2_);
137
138 RemoveBrowsingData(/* remove_reports= */ true, /* remove_clients= */ false,
139 /* host= */ kUrl1_.host());
140 EXPECT_EQ(2u, cache()->GetEndpointCount());
141
142 std::vector<raw_ptr<const ReportingReport, VectorExperimental>> reports;
143 cache()->GetReports(&reports);
144 ASSERT_EQ(1u, reports.size());
145 EXPECT_EQ(kUrl2_, reports[0]->url);
146 }
147
TEST_F(ReportingBrowsingDataRemoverTest,RemoveSomeClients)148 TEST_F(ReportingBrowsingDataRemoverTest, RemoveSomeClients) {
149 AddReport(kUrl1_);
150 AddReport(kUrl2_);
151
152 SetEndpoint(kOrigin1_);
153 SetEndpoint(kOrigin2_);
154
155 RemoveBrowsingData(/* remove_reports= */ false, /* remove_clients= */ true,
156 /* host= */ kUrl1_.host());
157 EXPECT_EQ(2u, report_count());
158 EXPECT_FALSE(FindEndpointInCache(
159 ReportingEndpointGroupKey(NetworkAnonymizationKey(), kOrigin1_, kGroup_),
160 kEndpoint_));
161 EXPECT_TRUE(FindEndpointInCache(
162 ReportingEndpointGroupKey(NetworkAnonymizationKey(), kOrigin2_, kGroup_),
163 kEndpoint_));
164 }
165
166 } // namespace
167 } // namespace net
168