1 // Copyright 2014 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 5 #include "base/memory/scoped_ptr.h" 6 #include "content/renderer/p2p/ipc_network_manager.h" 7 #include "content/renderer/p2p/network_list_manager.h" 8 #include "net/base/net_util.h" 9 #include "testing/gtest/include/gtest/gtest.h" 10 11 namespace content { 12 13 namespace { 14 15 class MockP2PSocketDispatcher : public NetworkListManager { 16 public: 17 virtual void AddNetworkListObserver( 18 NetworkListObserver* network_list_observer) OVERRIDE {} 19 20 virtual void RemoveNetworkListObserver( 21 NetworkListObserver* network_list_observer) OVERRIDE {} 22 23 virtual ~MockP2PSocketDispatcher() {} 24 }; 25 26 } // namespace 27 28 // 2 IPv6 addresses with only last digit different. 29 static const char kIPv6PublicAddrString1[] = 30 "2401:fa00:4:1000:be30:5bff:fee5:c3"; 31 static const char kIPv6PublicAddrString2[] = 32 "2401:fa00:4:1000:be30:5bff:fee5:c4"; 33 34 class IpcNetworkManagerTest : public testing::Test { 35 public: 36 IpcNetworkManagerTest() 37 : network_list_manager_(new MockP2PSocketDispatcher()), 38 network_manager_(new IpcNetworkManager(network_list_manager_.get())) {} 39 40 protected: 41 scoped_ptr<MockP2PSocketDispatcher> network_list_manager_; 42 scoped_ptr<IpcNetworkManager> network_manager_; 43 }; 44 45 // Test overall logic of IpcNetworkManager on OnNetworkListChanged 46 // that it should group addresses with the same network key under 47 // single Network class. This also tests the logic inside 48 // IpcNetworkManager in addition to MergeNetworkList. 49 // TODO(guoweis): disable this test case for now until fix for webrtc 50 // issue 19249005 integrated into chromium 51 TEST_F(IpcNetworkManagerTest, DISABLED_TestMergeNetworkList) { 52 net::NetworkInterfaceList list; 53 net::IPAddressNumber ip_number; 54 std::vector<rtc::Network*> networks; 55 rtc::IPAddress ip_address; 56 57 // Add 2 networks with the same prefix and prefix length. 58 EXPECT_TRUE(net::ParseIPLiteralToNumber(kIPv6PublicAddrString1, &ip_number)); 59 list.push_back( 60 net::NetworkInterface("em1", 61 "em1", 62 0, 63 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 64 ip_number, 65 64, 66 net::IP_ADDRESS_ATTRIBUTE_NONE)); 67 68 EXPECT_TRUE(net::ParseIPLiteralToNumber(kIPv6PublicAddrString2, &ip_number)); 69 list.push_back( 70 net::NetworkInterface("em1", 71 "em1", 72 0, 73 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 74 ip_number, 75 64, 76 net::IP_ADDRESS_ATTRIBUTE_NONE)); 77 78 network_manager_->OnNetworkListChanged(list); 79 network_manager_->GetNetworks(&networks); 80 EXPECT_EQ(1uL, networks.size()); 81 EXPECT_EQ(2uL, networks[0]->GetIPs().size()); 82 83 // Add another network with different prefix length, should result in 84 // a different network. 85 networks.clear(); 86 list.push_back( 87 net::NetworkInterface("em1", 88 "em1", 89 0, 90 net::NetworkChangeNotifier::CONNECTION_UNKNOWN, 91 ip_number, 92 48, 93 net::IP_ADDRESS_ATTRIBUTE_NONE)); 94 95 network_manager_->OnNetworkListChanged(list); 96 97 network_manager_->GetNetworks(&networks); 98 99 // Verify we have 2 networks now. 100 EXPECT_EQ(2uL, networks.size()); 101 // Verify the network with prefix length of 64 has 2 IP addresses. 102 EXPECT_EQ(64, networks[1]->prefix_length()); 103 EXPECT_EQ(2uL, networks[1]->GetIPs().size()); 104 EXPECT_TRUE(rtc::IPFromString(kIPv6PublicAddrString1, &ip_address)); 105 EXPECT_EQ(networks[1]->GetIPs()[0], ip_address); 106 EXPECT_TRUE(rtc::IPFromString(kIPv6PublicAddrString2, &ip_address)); 107 EXPECT_EQ(networks[1]->GetIPs()[1], ip_address); 108 // Verify the network with prefix length of 48 has 2 IP addresses. 109 EXPECT_EQ(48, networks[0]->prefix_length()); 110 EXPECT_EQ(1uL, networks[0]->GetIPs().size()); 111 EXPECT_TRUE(rtc::IPFromString(kIPv6PublicAddrString2, &ip_address)); 112 EXPECT_EQ(networks[0]->GetIPs()[0], ip_address); 113 } 114 115 } // namespace content 116