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