Add stats for network merge.

Currently, in ipc_network_manager.cc, the UMA WebRTC.PeerConnection.IPv4Interfaces and its IPv6
counter part counts the addresses, instead of the interfaces as when
chromium delivers available networks to WebRTC, each address is wrapped
inside an individual network object.

The plan is to replace the current MergeNetworkList with the new one once it's rolled into chromium.

BUG=
R=pthatcher@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/36779004

Cr-Commit-Position: refs/heads/master@{#8188}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8188 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
guoweis@webrtc.org 2015-01-28 19:34:05 +00:00
parent 7d2b6a9346
commit a094cac11f
3 changed files with 52 additions and 10 deletions

View File

@ -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<std::string, AddressList> 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.

View File

@ -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();

View File

@ -34,10 +34,13 @@ class NetworkTest : public testing::Test, public sigslot::has_slots<> {
callback_called_ = true;
}
void MergeNetworkList(BasicNetworkManager& network_manager,
NetworkManager::Stats MergeNetworkList(
BasicNetworkManager& network_manager,
const NetworkManager::NetworkList& list,
bool* changed ) {
network_manager.MergeNetworkList(list, changed);
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;
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());