xref: /aosp_15_r20/external/cronet/net/base/network_change_notifier_passive_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2012 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/base/network_change_notifier_passive.h"
6 
7 #include <utility>
8 
9 #include "base/functional/callback_forward.h"
10 #include "base/memory/raw_ptr.h"
11 #include "base/run_loop.h"
12 #include "base/test/task_environment.h"
13 #include "net/base/ip_address.h"
14 #include "net/base/ip_endpoint.h"
15 #include "net/base/network_change_notifier.h"
16 #include "net/dns/dns_config.h"
17 #include "net/dns/system_dns_config_change_notifier.h"
18 #include "net/dns/test_dns_config_service.h"
19 #include "testing/gmock/include/gmock/gmock.h"
20 
21 namespace net {
22 
23 class NetworkChangeNotifierPassiveTest : public testing::Test {
24  public:
NetworkChangeNotifierPassiveTest()25   NetworkChangeNotifierPassiveTest()
26       : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
27     // Create a SystemDnsConfigChangeNotifier instead of letting
28     // NetworkChangeNotifier create a global one, otherwise the global one will
29     // hold a TaskRunner handle to |task_environment_| and crash if any
30     // subsequent tests use it.
31     dns_config_notifier_ = std::make_unique<SystemDnsConfigChangeNotifier>();
32     notifier_ = base::WrapUnique(new NetworkChangeNotifierPassive(
33         NetworkChangeNotifier::CONNECTION_UNKNOWN,
34         NetworkChangeNotifier::SUBTYPE_UNKNOWN, dns_config_notifier_.get()));
35     auto dns_config_service = std::make_unique<TestDnsConfigService>();
36     dns_config_service_ = dns_config_service.get();
37     dns_config_notifier_->SetDnsConfigServiceForTesting(
38         std::move(dns_config_service), base::OnceClosure());
39   }
40 
FastForwardUntilIdle()41   void FastForwardUntilIdle() {
42     task_environment_.FastForwardUntilNoTasksRemain();
43   }
44 
notifier()45   NetworkChangeNotifierPassive* notifier() { return notifier_.get(); }
dns_config_service()46   TestDnsConfigService* dns_config_service() { return dns_config_service_; }
47 
48  private:
49   base::test::TaskEnvironment task_environment_;
50   net::NetworkChangeNotifier::DisableForTest mock_notifier_disabler_;
51   std::unique_ptr<SystemDnsConfigChangeNotifier> dns_config_notifier_;
52   std::unique_ptr<NetworkChangeNotifierPassive> notifier_;
53   raw_ptr<TestDnsConfigService> dns_config_service_;
54 };
55 
56 class MockIPAddressObserver : public NetworkChangeNotifier::IPAddressObserver {
57  public:
58   MOCK_METHOD0(OnIPAddressChanged, void());
59 };
60 
TEST_F(NetworkChangeNotifierPassiveTest,OnIPAddressChanged)61 TEST_F(NetworkChangeNotifierPassiveTest, OnIPAddressChanged) {
62   testing::StrictMock<MockIPAddressObserver> observer;
63   NetworkChangeNotifier::AddIPAddressObserver(&observer);
64 
65   EXPECT_CALL(observer, OnIPAddressChanged());
66   notifier()->OnIPAddressChanged();
67   FastForwardUntilIdle();
68 
69   NetworkChangeNotifier::RemoveIPAddressObserver(&observer);
70 }
71 
72 class MockNetworkChangeObserver
73     : public NetworkChangeNotifier::NetworkChangeObserver {
74  public:
75   MOCK_METHOD1(OnNetworkChanged, void(NetworkChangeNotifier::ConnectionType));
76 };
77 
TEST_F(NetworkChangeNotifierPassiveTest,OnNetworkChanged)78 TEST_F(NetworkChangeNotifierPassiveTest, OnNetworkChanged) {
79   testing::StrictMock<MockNetworkChangeObserver> observer;
80   NetworkChangeNotifier::AddNetworkChangeObserver(&observer);
81 
82   EXPECT_CALL(observer,
83               OnNetworkChanged(NetworkChangeNotifier::CONNECTION_NONE));
84   EXPECT_CALL(observer, OnNetworkChanged(NetworkChangeNotifier::CONNECTION_3G));
85   notifier()->OnConnectionChanged(NetworkChangeNotifier::CONNECTION_3G);
86   FastForwardUntilIdle();
87 
88   NetworkChangeNotifier::RemoveNetworkChangeObserver(&observer);
89 }
90 
91 class MockMaxBandwidthObserver
92     : public NetworkChangeNotifier::MaxBandwidthObserver {
93  public:
94   MOCK_METHOD2(OnMaxBandwidthChanged,
95                void(double, NetworkChangeNotifier::ConnectionType));
96 };
97 
TEST_F(NetworkChangeNotifierPassiveTest,OnMaxBandwidthChanged)98 TEST_F(NetworkChangeNotifierPassiveTest, OnMaxBandwidthChanged) {
99   testing::StrictMock<MockMaxBandwidthObserver> observer;
100   NetworkChangeNotifier::AddMaxBandwidthObserver(&observer);
101 
102   EXPECT_CALL(observer,
103               OnMaxBandwidthChanged(3.6, NetworkChangeNotifier::CONNECTION_4G));
104   notifier()->OnConnectionSubtypeChanged(NetworkChangeNotifier::CONNECTION_4G,
105                                          NetworkChangeNotifier::SUBTYPE_HSPA);
106   FastForwardUntilIdle();
107 
108   NetworkChangeNotifier::RemoveMaxBandwidthObserver(&observer);
109 }
110 
111 class TestDnsObserver : public NetworkChangeNotifier::DNSObserver {
112  public:
OnDNSChanged()113   void OnDNSChanged() override { dns_changes_++; }
114 
dns_changes() const115   int dns_changes() const { return dns_changes_; }
116 
117  private:
118   int dns_changes_ = 0;
119 };
120 
TEST_F(NetworkChangeNotifierPassiveTest,OnDNSChanged)121 TEST_F(NetworkChangeNotifierPassiveTest, OnDNSChanged) {
122   TestDnsObserver observer;
123   NetworkChangeNotifier::AddDNSObserver(&observer);
124 
125   FastForwardUntilIdle();
126   EXPECT_EQ(0, observer.dns_changes());
127 
128   DnsConfig config;
129   config.nameservers = {IPEndPoint(IPAddress(1, 2, 3, 4), 233)};
130 
131   dns_config_service()->SetConfigForRefresh(config);
132   notifier()->OnDNSChanged();
133   FastForwardUntilIdle();
134   EXPECT_EQ(1, observer.dns_changes());
135 
136   config.nameservers.emplace_back(IPAddress(2, 3, 4, 5), 234);
137   dns_config_service()->SetConfigForRefresh(config);
138   notifier()->OnDNSChanged();
139   FastForwardUntilIdle();
140   EXPECT_EQ(2, observer.dns_changes());
141 
142   config.nameservers.emplace_back(IPAddress(3, 4, 5, 6), 235);
143   dns_config_service()->SetConfigForRefresh(config);
144   notifier()->OnDNSChanged();
145   FastForwardUntilIdle();
146   EXPECT_EQ(3, observer.dns_changes());
147 
148   NetworkChangeNotifier::RemoveDNSObserver(&observer);
149 }
150 
151 }  // namespace net
152