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