xref: /aosp_15_r20/external/cronet/net/reporting/reporting_network_change_observer_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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