network_change_notifier_posix_unittest.cc 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // Copyright (c) 2012 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/base/network_change_notifier_posix.h"
  5. #include <utility>
  6. #include "base/memory/raw_ptr.h"
  7. #include "base/test/task_environment.h"
  8. #include "net/base/ip_address.h"
  9. #include "net/base/ip_endpoint.h"
  10. #include "net/base/network_change_notifier.h"
  11. #include "net/dns/dns_config.h"
  12. #include "net/dns/system_dns_config_change_notifier.h"
  13. #include "net/dns/test_dns_config_service.h"
  14. #include "testing/gmock/include/gmock/gmock.h"
  15. namespace net {
  16. class NetworkChangeNotifierPosixTest : public testing::Test {
  17. public:
  18. NetworkChangeNotifierPosixTest()
  19. : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {
  20. // Create a SystemDnsConfigChangeNotifier instead of letting
  21. // NetworkChangeNotifier create a global one, otherwise the global one will
  22. // hold a TaskRunner handle to |task_environment_| and crash if any
  23. // subsequent tests use it.
  24. dns_config_notifier_ = std::make_unique<SystemDnsConfigChangeNotifier>();
  25. notifier_ = base::WrapUnique(new NetworkChangeNotifierPosix(
  26. NetworkChangeNotifier::CONNECTION_UNKNOWN,
  27. NetworkChangeNotifier::SUBTYPE_UNKNOWN, dns_config_notifier_.get()));
  28. auto dns_config_service = std::make_unique<TestDnsConfigService>();
  29. dns_config_service_ = dns_config_service.get();
  30. dns_config_notifier_->SetDnsConfigServiceForTesting(
  31. std::move(dns_config_service));
  32. }
  33. void FastForwardUntilIdle() {
  34. task_environment_.FastForwardUntilNoTasksRemain();
  35. }
  36. NetworkChangeNotifierPosix* notifier() { return notifier_.get(); }
  37. TestDnsConfigService* dns_config_service() { return dns_config_service_; }
  38. private:
  39. base::test::TaskEnvironment task_environment_;
  40. net::NetworkChangeNotifier::DisableForTest mock_notifier_disabler_;
  41. std::unique_ptr<SystemDnsConfigChangeNotifier> dns_config_notifier_;
  42. std::unique_ptr<NetworkChangeNotifierPosix> notifier_;
  43. raw_ptr<TestDnsConfigService> dns_config_service_;
  44. };
  45. class MockIPAddressObserver : public NetworkChangeNotifier::IPAddressObserver {
  46. public:
  47. MOCK_METHOD0(OnIPAddressChanged, void());
  48. };
  49. TEST_F(NetworkChangeNotifierPosixTest, OnIPAddressChanged) {
  50. testing::StrictMock<MockIPAddressObserver> observer;
  51. NetworkChangeNotifier::AddIPAddressObserver(&observer);
  52. EXPECT_CALL(observer, OnIPAddressChanged());
  53. notifier()->OnIPAddressChanged();
  54. FastForwardUntilIdle();
  55. NetworkChangeNotifier::RemoveIPAddressObserver(&observer);
  56. }
  57. class MockNetworkChangeObserver
  58. : public NetworkChangeNotifier::NetworkChangeObserver {
  59. public:
  60. MOCK_METHOD1(OnNetworkChanged, void(NetworkChangeNotifier::ConnectionType));
  61. };
  62. TEST_F(NetworkChangeNotifierPosixTest, OnNetworkChanged) {
  63. testing::StrictMock<MockNetworkChangeObserver> observer;
  64. NetworkChangeNotifier::AddNetworkChangeObserver(&observer);
  65. EXPECT_CALL(observer,
  66. OnNetworkChanged(NetworkChangeNotifier::CONNECTION_NONE));
  67. EXPECT_CALL(observer, OnNetworkChanged(NetworkChangeNotifier::CONNECTION_3G));
  68. notifier()->OnConnectionChanged(NetworkChangeNotifier::CONNECTION_3G);
  69. FastForwardUntilIdle();
  70. NetworkChangeNotifier::RemoveNetworkChangeObserver(&observer);
  71. }
  72. class MockMaxBandwidthObserver
  73. : public NetworkChangeNotifier::MaxBandwidthObserver {
  74. public:
  75. MOCK_METHOD2(OnMaxBandwidthChanged,
  76. void(double, NetworkChangeNotifier::ConnectionType));
  77. };
  78. TEST_F(NetworkChangeNotifierPosixTest, OnMaxBandwidthChanged) {
  79. testing::StrictMock<MockMaxBandwidthObserver> observer;
  80. NetworkChangeNotifier::AddMaxBandwidthObserver(&observer);
  81. EXPECT_CALL(observer,
  82. OnMaxBandwidthChanged(3.6, NetworkChangeNotifier::CONNECTION_4G));
  83. notifier()->OnConnectionSubtypeChanged(NetworkChangeNotifier::CONNECTION_4G,
  84. NetworkChangeNotifier::SUBTYPE_HSPA);
  85. FastForwardUntilIdle();
  86. NetworkChangeNotifier::RemoveMaxBandwidthObserver(&observer);
  87. }
  88. class TestDnsObserver : public NetworkChangeNotifier::DNSObserver {
  89. public:
  90. void OnDNSChanged() override { dns_changes_++; }
  91. int dns_changes() const { return dns_changes_; }
  92. private:
  93. int dns_changes_ = 0;
  94. };
  95. TEST_F(NetworkChangeNotifierPosixTest, OnDNSChanged) {
  96. TestDnsObserver observer;
  97. NetworkChangeNotifier::AddDNSObserver(&observer);
  98. FastForwardUntilIdle();
  99. EXPECT_EQ(0, observer.dns_changes());
  100. DnsConfig config;
  101. config.nameservers = {IPEndPoint(IPAddress(1, 2, 3, 4), 233)};
  102. dns_config_service()->SetConfigForRefresh(config);
  103. notifier()->OnDNSChanged();
  104. FastForwardUntilIdle();
  105. EXPECT_EQ(1, observer.dns_changes());
  106. config.nameservers.emplace_back(IPAddress(2, 3, 4, 5), 234);
  107. dns_config_service()->SetConfigForRefresh(config);
  108. notifier()->OnDNSChanged();
  109. FastForwardUntilIdle();
  110. EXPECT_EQ(2, observer.dns_changes());
  111. config.nameservers.emplace_back(IPAddress(3, 4, 5, 6), 235);
  112. dns_config_service()->SetConfigForRefresh(config);
  113. notifier()->OnDNSChanged();
  114. FastForwardUntilIdle();
  115. EXPECT_EQ(3, observer.dns_changes());
  116. NetworkChangeNotifier::RemoveDNSObserver(&observer);
  117. }
  118. } // namespace net