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_network_change_observer.h"
6
7 #include <optional>
8
9 #include "base/functional/bind.h"
10 #include "base/memory/raw_ptr.h"
11 #include "base/run_loop.h"
12 #include "base/test/simple_test_tick_clock.h"
13 #include "base/unguessable_token.h"
14 #include "base/values.h"
15 #include "net/base/network_change_notifier.h"
16 #include "net/reporting/reporting_cache.h"
17 #include "net/reporting/reporting_report.h"
18 #include "net/reporting/reporting_test_util.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20
21 namespace net {
22 namespace {
23
24 class ReportingNetworkChangeObserverTest : public ReportingTestBase {
25 protected:
SimulateNetworkChange()26 void SimulateNetworkChange() {
27 // TODO: Need to SetTestNotificationsOnly(true) to keep things from flaking,
28 // but have to figure out how to do that before NCN is created or how to
29 // recreate NCN.
30 NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
31 NetworkChangeNotifier::CONNECTION_NONE);
32 base::RunLoop().RunUntilIdle();
33 NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
34 NetworkChangeNotifier::CONNECTION_WIFI);
35 base::RunLoop().RunUntilIdle();
36 }
37
SetEndpoint()38 void SetEndpoint() {
39 ASSERT_TRUE(SetEndpointInCache(kGroupKey_, kEndpoint_,
40 base::Time::Now() + base::Days(7)));
41 }
42
report_count()43 size_t report_count() {
44 std::vector<raw_ptr<const ReportingReport, VectorExperimental>> reports;
45 cache()->GetReports(&reports);
46 return reports.size();
47 }
48
49 const std::optional<base::UnguessableToken> kReportingSource_ = std::nullopt;
50 const NetworkAnonymizationKey kNak_;
51 const GURL kUrl_ = GURL("https://origin/path");
52 const url::Origin kOrigin_ = url::Origin::Create(kUrl_);
53 const GURL kEndpoint_ = GURL("https://endpoint/");
54 const std::string kUserAgent_ = "Mozilla/1.0";
55 const std::string kGroup_ = "group";
56 const std::string kType_ = "default";
57 const ReportingEndpointGroupKey kGroupKey_ =
58 ReportingEndpointGroupKey(NetworkAnonymizationKey(), kOrigin_, kGroup_);
59 };
60
TEST_F(ReportingNetworkChangeObserverTest,ClearNothing)61 TEST_F(ReportingNetworkChangeObserverTest, ClearNothing) {
62 ReportingPolicy new_policy = policy();
63 new_policy.persist_reports_across_network_changes = true;
64 new_policy.persist_clients_across_network_changes = true;
65 UsePolicy(new_policy);
66
67 cache()->AddReport(kReportingSource_, kNak_, kUrl_, kUserAgent_, kGroup_,
68 kType_, base::Value::Dict(), 0, tick_clock()->NowTicks(),
69 0);
70 SetEndpoint();
71 ASSERT_EQ(1u, report_count());
72 ASSERT_EQ(1u, cache()->GetEndpointCount());
73
74 SimulateNetworkChange();
75
76 EXPECT_EQ(1u, report_count());
77 EXPECT_EQ(1u, cache()->GetEndpointCount());
78 }
79
TEST_F(ReportingNetworkChangeObserverTest,ClearReports)80 TEST_F(ReportingNetworkChangeObserverTest, ClearReports) {
81 ReportingPolicy new_policy = policy();
82 new_policy.persist_reports_across_network_changes = false;
83 new_policy.persist_clients_across_network_changes = true;
84 UsePolicy(new_policy);
85
86 cache()->AddReport(kReportingSource_, kNak_, kUrl_, kUserAgent_, kGroup_,
87 kType_, base::Value::Dict(), 0, tick_clock()->NowTicks(),
88 0);
89 SetEndpoint();
90 ASSERT_EQ(1u, report_count());
91 ASSERT_EQ(1u, cache()->GetEndpointCount());
92
93 SimulateNetworkChange();
94
95 EXPECT_EQ(0u, report_count());
96 EXPECT_EQ(1u, cache()->GetEndpointCount());
97 }
98
TEST_F(ReportingNetworkChangeObserverTest,ClearClients)99 TEST_F(ReportingNetworkChangeObserverTest, ClearClients) {
100 ReportingPolicy new_policy = policy();
101 new_policy.persist_reports_across_network_changes = true;
102 new_policy.persist_clients_across_network_changes = false;
103 UsePolicy(new_policy);
104
105 cache()->AddReport(kReportingSource_, kNak_, kUrl_, kUserAgent_, kGroup_,
106 kType_, base::Value::Dict(), 0, tick_clock()->NowTicks(),
107 0);
108 SetEndpoint();
109 ASSERT_EQ(1u, report_count());
110 ASSERT_EQ(1u, cache()->GetEndpointCount());
111
112 SimulateNetworkChange();
113
114 EXPECT_EQ(1u, report_count());
115 EXPECT_EQ(0u, cache()->GetEndpointCount());
116 }
117
TEST_F(ReportingNetworkChangeObserverTest,ClearReportsAndClients)118 TEST_F(ReportingNetworkChangeObserverTest, ClearReportsAndClients) {
119 ReportingPolicy new_policy = policy();
120 new_policy.persist_reports_across_network_changes = false;
121 new_policy.persist_clients_across_network_changes = false;
122 UsePolicy(new_policy);
123
124 cache()->AddReport(kReportingSource_, kNak_, kUrl_, kUserAgent_, kGroup_,
125 kType_, base::Value::Dict(), 0, tick_clock()->NowTicks(),
126 0);
127 SetEndpoint();
128 ASSERT_EQ(1u, report_count());
129 ASSERT_EQ(1u, cache()->GetEndpointCount());
130
131 SimulateNetworkChange();
132
133 EXPECT_EQ(0u, report_count());
134 EXPECT_EQ(0u, cache()->GetEndpointCount());
135 }
136
137 } // namespace
138 } // namespace net
139