diff --git a/webrtc/base/network.cc b/webrtc/base/network.cc index 32fe2e6d6..ec672655d 100644 --- a/webrtc/base/network.cc +++ b/webrtc/base/network.cc @@ -151,6 +151,13 @@ void NetworkManagerBase::GetNetworks(NetworkList* result) const { void NetworkManagerBase::MergeNetworkList(const NetworkList& new_networks, bool* changed) { + NetworkManager::Stats stats; + MergeNetworkList(new_networks, changed, &stats); +} + +void NetworkManagerBase::MergeNetworkList(const NetworkList& new_networks, + bool* changed, + NetworkManager::Stats* stats) { // AddressList in this map will track IP addresses for all Networks // with the same key. std::map consolidated_address_list; @@ -185,6 +192,13 @@ void NetworkManagerBase::MergeNetworkList(const NetworkList& new_networks, } if (!might_add_to_merged_list) { delete network; + } else { + if (current_list.ips[0].family() == AF_INET) { + stats->ipv4_network_count++; + } else { + ASSERT(current_list.ips[0].family() == AF_INET6); + stats->ipv6_network_count++; + } } } @@ -213,7 +227,7 @@ void NetworkManagerBase::MergeNetworkList(const NetworkList& new_networks, networks_ = merged_list; // If the network lists changes, we resort it. - if (changed) { + if (*changed) { std::sort(networks_.begin(), networks_.end(), SortNetworks); // Now network interfaces are sorted, we should set the preference value // for each of the interfaces we are planning to use. diff --git a/webrtc/base/network.h b/webrtc/base/network.h index 6f9d08e70..ee0673f40 100644 --- a/webrtc/base/network.h +++ b/webrtc/base/network.h @@ -76,6 +76,15 @@ class NetworkManager { // Dumps a list of networks available to LS_INFO. virtual void DumpNetworks(bool include_ignored) {} + + struct Stats { + int ipv4_network_count; + int ipv6_network_count; + Stats() { + ipv4_network_count = 0; + ipv6_network_count = 0; + } + }; }; // Base class for NetworkManager implementations. @@ -97,6 +106,11 @@ class NetworkManagerBase : public NetworkManager { // any change in the network list. void MergeNetworkList(const NetworkList& list, bool* changed); + // |stats| will be populated even if |*changed| is false. + void MergeNetworkList(const NetworkList& list, + bool* changed, + NetworkManager::Stats* stats); + private: friend class NetworkTest; void DoUpdateNetworks(); diff --git a/webrtc/base/network_unittest.cc b/webrtc/base/network_unittest.cc index acb118d4b..f54911592 100644 --- a/webrtc/base/network_unittest.cc +++ b/webrtc/base/network_unittest.cc @@ -34,10 +34,13 @@ class NetworkTest : public testing::Test, public sigslot::has_slots<> { callback_called_ = true; } - void MergeNetworkList(BasicNetworkManager& network_manager, - const NetworkManager::NetworkList& list, - bool* changed ) { - network_manager.MergeNetworkList(list, changed); + NetworkManager::Stats MergeNetworkList( + BasicNetworkManager& network_manager, + const NetworkManager::NetworkList& list, + bool* changed) { + NetworkManager::Stats stats; + network_manager.MergeNetworkList(list, changed, &stats); + return stats; } bool IsIgnoredNetwork(BasicNetworkManager& network_manager, @@ -182,8 +185,10 @@ TEST_F(NetworkTest, TestBasicMergeNetworkList) { NetworkManager::NetworkList list; list.push_back(new Network(ipv4_network1)); bool changed; - MergeNetworkList(manager, list, &changed); + NetworkManager::Stats stats = MergeNetworkList(manager, list, &changed); EXPECT_TRUE(changed); + EXPECT_EQ(stats.ipv6_network_count, 0); + EXPECT_EQ(stats.ipv4_network_count, 1); list.clear(); manager.GetNetworks(&list); @@ -194,8 +199,10 @@ TEST_F(NetworkTest, TestBasicMergeNetworkList) { // Replace ipv4_network1 with ipv4_network2. list.push_back(new Network(ipv4_network2)); - MergeNetworkList(manager, list, &changed); + stats = MergeNetworkList(manager, list, &changed); EXPECT_TRUE(changed); + EXPECT_EQ(stats.ipv6_network_count, 0); + EXPECT_EQ(stats.ipv4_network_count, 1); list.clear(); manager.GetNetworks(&list); @@ -207,8 +214,10 @@ TEST_F(NetworkTest, TestBasicMergeNetworkList) { // Add Network2 back. list.push_back(new Network(ipv4_network1)); list.push_back(new Network(ipv4_network2)); - MergeNetworkList(manager, list, &changed); + stats = MergeNetworkList(manager, list, &changed); EXPECT_TRUE(changed); + EXPECT_EQ(stats.ipv6_network_count, 0); + EXPECT_EQ(stats.ipv4_network_count, 2); list.clear(); // Verify that we get previous instances of Network objects. @@ -222,8 +231,10 @@ TEST_F(NetworkTest, TestBasicMergeNetworkList) { // notification. list.push_back(new Network(ipv4_network2)); list.push_back(new Network(ipv4_network1)); - MergeNetworkList(manager, list, &changed); + stats = MergeNetworkList(manager, list, &changed); EXPECT_FALSE(changed); + EXPECT_EQ(stats.ipv6_network_count, 0); + EXPECT_EQ(stats.ipv4_network_count, 2); list.clear(); // Verify that we get previous instances of Network objects. @@ -274,8 +285,11 @@ TEST_F(NetworkTest, TestIPv6MergeNetworkList) { NetworkManager::NetworkList original_list; SetupNetworks(&original_list); bool changed = false; - MergeNetworkList(manager, original_list, &changed); + NetworkManager::Stats stats = + MergeNetworkList(manager, original_list, &changed); EXPECT_TRUE(changed); + EXPECT_EQ(stats.ipv6_network_count, 4); + EXPECT_EQ(stats.ipv4_network_count, 0); NetworkManager::NetworkList list; manager.GetNetworks(&list); EXPECT_EQ(original_list.size(), list.size());