Home | History | Annotate | Download | only in p2p
      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