147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/*
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *
447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */
1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/network.h"
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <vector>
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX)
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <sys/types.h>
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if !defined(WEBRTC_ANDROID)
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <ifaddrs.h>
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/ifaddrs-android.h"
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/gunit.h"
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN)
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/logging.h"  // For LOG_GLE
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc {
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass NetworkTest : public testing::Test, public sigslot::has_slots<>  {
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public:
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkTest() : callback_called_(false) {}
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  void OnNetworksChanged() {
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    callback_called_ = true;
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  void MergeNetworkList(BasicNetworkManager& network_manager,
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                        const NetworkManager::NetworkList& list,
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                        bool* changed ) {
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    network_manager.MergeNetworkList(list, changed);
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool IsIgnoredNetwork(BasicNetworkManager& network_manager,
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                        const Network& network) {
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return network_manager.IsIgnoredNetwork(network);
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList GetNetworks(
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      const BasicNetworkManager& network_manager, bool include_ignored) {
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    NetworkManager::NetworkList list;
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    network_manager.CreateNetworks(include_ignored, &list);
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return list;
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX)
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Separated from CreateNetworks for tests.
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static void CallConvertIfAddrs(const BasicNetworkManager& network_manager,
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                 struct ifaddrs* interfaces,
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                 bool include_ignored,
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                 NetworkManager::NetworkList* networks) {
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    network_manager.ConvertIfAddrs(interfaces, include_ignored, networks);
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif  // defined(WEBRTC_POSIX)
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org protected:
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool callback_called_;
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test that the Network ctor works properly.
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestNetworkConstruct) {
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ipv4_network1("test_eth0", "Test Network Adapter 1",
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                        IPAddress(0x12345600U), 24);
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("test_eth0", ipv4_network1.name());
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ("Test Network Adapter 1", ipv4_network1.description());
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(IPAddress(0x12345600U), ipv4_network1.prefix());
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(24, ipv4_network1.prefix_length());
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(ipv4_network1.ignored());
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests that our ignore function works properly.
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestNetworkIgnore) {
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ipv4_network1("test_eth0", "Test Network Adapter 1",
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                        IPAddress(0x12345600U), 24);
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ipv4_network2("test_eth1", "Test Network Adapter 2",
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                        IPAddress(0x00010000U), 16);
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager network_manager;
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(IsIgnoredNetwork(network_manager, ipv4_network1));
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(IsIgnoredNetwork(network_manager, ipv4_network2));
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestIgnoreList) {
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ignore_me("ignore_me", "Ignore me please!",
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                    IPAddress(0x12345600U), 24);
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network include_me("include_me", "Include me please!",
9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                     IPAddress(0x12345600U), 24);
9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager network_manager;
9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(IsIgnoredNetwork(network_manager, ignore_me));
9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  std::vector<std::string> ignore_list;
10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ignore_list.push_back("ignore_me");
10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  network_manager.set_network_ignore_list(ignore_list);
10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(IsIgnoredNetwork(network_manager, ignore_me));
10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(IsIgnoredNetwork(network_manager, include_me));
10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test is failing on Windows opt: b/11288214
10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, DISABLED_TestCreateNetworks) {
10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager manager;
10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList result = GetNetworks(manager, true);
11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // We should be able to bind to any addresses we find.
11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList::iterator it;
11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (it = result.begin();
11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != result.end();
11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       ++it) {
11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    sockaddr_storage storage;
11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    memset(&storage, 0, sizeof(storage));
1172738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org    IPAddress ip = (*it)->GetBestIP();
11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    SocketAddress bindaddress(ip, 0);
11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    bindaddress.SetScopeID((*it)->scope_id());
12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // TODO(thaloun): Use rtc::AsyncSocket once it supports IPv6.
12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    int fd = static_cast<int>(socket(ip.family(), SOCK_STREAM, IPPROTO_TCP));
12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (fd > 0) {
12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      size_t ipsize = bindaddress.ToSockAddrStorage(&storage);
12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      EXPECT_GE(ipsize, 0U);
12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      int success = ::bind(fd,
12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                           reinterpret_cast<sockaddr*>(&storage),
12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                           static_cast<int>(ipsize));
12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN)
12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      if (success) LOG_GLE(LS_ERROR) << "Socket bind failed.";
13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      EXPECT_EQ(0, success);
13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN)
13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      closesocket(fd);
13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#else
13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      close(fd);
13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    delete (*it);
13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test that UpdateNetworks succeeds.
14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestUpdateNetworks) {
14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager manager;
14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.SignalNetworksChanged.connect(
14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.StartUpdating();
14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Thread::Current()->ProcessMessages(0);
14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(callback_called_);
15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  callback_called_ = false;
15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Callback should be triggered immediately when StartUpdating
15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // is called, after network update signal is already sent.
15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.StartUpdating();
15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(manager.started());
15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Thread::Current()->ProcessMessages(0);
15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(callback_called_);
15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.StopUpdating();
15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(manager.started());
15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.StopUpdating();
16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(manager.started());
16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.StopUpdating();
16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(manager.started());
16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  callback_called_ = false;
16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Callback should be triggered immediately after StartUpdating is called
16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // when start_count_ is reset to 0.
16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.StartUpdating();
16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Thread::Current()->ProcessMessages(0);
16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(callback_called_);
16947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
17047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
17147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Verify that MergeNetworkList() merges network lists properly.
17247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestBasicMergeNetworkList) {
17347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ipv4_network1("test_eth0", "Test Network Adapter 1",
17447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                        IPAddress(0x12345600U), 24);
17547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ipv4_network2("test_eth1", "Test Network Adapter 2",
17647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                        IPAddress(0x00010000U), 16);
17747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ipv4_network1.AddIP(IPAddress(0x12345678));
17847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ipv4_network2.AddIP(IPAddress(0x00010004));
17947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager manager;
18047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
18147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Add ipv4_network1 to the list of networks.
18247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList list;
18347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.push_back(new Network(ipv4_network1));
18447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool changed;
18547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MergeNetworkList(manager, list, &changed);
18647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(changed);
18747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.clear();
18847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
18947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.GetNetworks(&list);
19047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(1U, list.size());
19147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(ipv4_network1.ToString(), list[0]->ToString());
19247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network* net1 = list[0];
19347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.clear();
19447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
19547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Replace ipv4_network1 with ipv4_network2.
19647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.push_back(new Network(ipv4_network2));
19747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MergeNetworkList(manager, list, &changed);
19847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(changed);
19947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.clear();
20047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
20147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.GetNetworks(&list);
20247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(1U, list.size());
20347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(ipv4_network2.ToString(), list[0]->ToString());
20447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network* net2 = list[0];
20547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.clear();
20647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
20747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Add Network2 back.
20847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.push_back(new Network(ipv4_network1));
20947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.push_back(new Network(ipv4_network2));
21047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MergeNetworkList(manager, list, &changed);
21147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(changed);
21247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.clear();
21347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
21447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Verify that we get previous instances of Network objects.
21547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.GetNetworks(&list);
21647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(2U, list.size());
21747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
21847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org              (net1 == list[1] && net2 == list[0]));
21947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.clear();
22047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
22147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Call MergeNetworkList() again and verify that we don't get update
22247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // notification.
22347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.push_back(new Network(ipv4_network2));
22447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.push_back(new Network(ipv4_network1));
22547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MergeNetworkList(manager, list, &changed);
22647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(changed);
22747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.clear();
22847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
22947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Verify that we get previous instances of Network objects.
23047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.GetNetworks(&list);
23147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(2U, list.size());
23247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE((net1 == list[0] && net2 == list[1]) ||
23347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org              (net1 == list[1] && net2 == list[0]));
23447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.clear();
23547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
23647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
23747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Sets up some test IPv6 networks and appends them to list.
23847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Four networks are added - public and link local, for two interfaces.
23947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgvoid SetupNetworks(NetworkManager::NetworkList* list) {
24047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress ip;
24147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress prefix;
24247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(IPFromString("fe80::1234:5678:abcd:ef12", &ip));
24347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(IPFromString("fe80::", &prefix));
24447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // First, fake link-locals.
24547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ipv6_eth0_linklocalnetwork("test_eth0", "Test NetworkAdapter 1",
24647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                     prefix, 64);
24747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ipv6_eth0_linklocalnetwork.AddIP(ip);
24847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(IPFromString("fe80::5678:abcd:ef12:3456", &ip));
24947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ipv6_eth1_linklocalnetwork("test_eth1", "Test NetworkAdapter 2",
25047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                     prefix, 64);
25147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ipv6_eth1_linklocalnetwork.AddIP(ip);
25247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Public networks:
25347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &ip));
25447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  prefix = TruncateIP(ip, 64);
25547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ipv6_eth0_publicnetwork1_ip1("test_eth0", "Test NetworkAdapter 1",
25647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                       prefix, 64);
25747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ipv6_eth0_publicnetwork1_ip1.AddIP(ip);
25847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
25947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  prefix = TruncateIP(ip, 64);
26047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 1",
26147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                       prefix, 64);
26247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
26347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list->push_back(new Network(ipv6_eth0_linklocalnetwork));
26447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list->push_back(new Network(ipv6_eth1_linklocalnetwork));
26547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list->push_back(new Network(ipv6_eth0_publicnetwork1_ip1));
26647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list->push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
26747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
26847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
26947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test that the basic network merging case works.
27047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestIPv6MergeNetworkList) {
27147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager manager;
27247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.SignalNetworksChanged.connect(
27347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
27447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList original_list;
27547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SetupNetworks(&original_list);
27647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool changed = false;
27747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MergeNetworkList(manager, original_list, &changed);
27847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(changed);
27947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList list;
28047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.GetNetworks(&list);
28147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(original_list.size(), list.size());
28247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Verify that the original members are in the merged list.
28347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (NetworkManager::NetworkList::iterator it = original_list.begin();
28447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != original_list.end(); ++it) {
28547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    EXPECT_NE(list.end(), std::find(list.begin(), list.end(), *it));
28647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
28747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
28847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
28947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Tests that when two network lists that describe the same set of networks are
29047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// merged, that the changed callback is not called, and that the original
29147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// objects remain in the result list.
29247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestNoChangeMerge) {
29347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager manager;
29447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.SignalNetworksChanged.connect(
29547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
29647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList original_list;
29747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SetupNetworks(&original_list);
29847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool changed = false;
29947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MergeNetworkList(manager, original_list, &changed);
30047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(changed);
30147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Second list that describes the same networks but with new objects.
30247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList second_list;
30347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SetupNetworks(&second_list);
30447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  changed = false;
30547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MergeNetworkList(manager, second_list, &changed);
30647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(changed);
30747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList resulting_list;
30847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.GetNetworks(&resulting_list);
30947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(original_list.size(), resulting_list.size());
31047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Verify that the original members are in the merged list.
31147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (NetworkManager::NetworkList::iterator it = original_list.begin();
31247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != original_list.end(); ++it) {
31347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    EXPECT_NE(resulting_list.end(),
31447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org              std::find(resulting_list.begin(), resulting_list.end(), *it));
31547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
31647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Doublecheck that the new networks aren't in the list.
31747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (NetworkManager::NetworkList::iterator it = second_list.begin();
31847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != second_list.end(); ++it) {
31947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    EXPECT_EQ(resulting_list.end(),
32047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org              std::find(resulting_list.begin(), resulting_list.end(), *it));
32147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
32247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
32347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
32447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test that we can merge a network that is the same as another network but with
32547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// a different IP. The original network should remain in the list, but have its
32647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// IP changed.
32747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, MergeWithChangedIP) {
32847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager manager;
32947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.SignalNetworksChanged.connect(
33047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
33147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList original_list;
33247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SetupNetworks(&original_list);
33347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Make a network that we're going to change.
33447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress ip;
33547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:faa:fee:faa", &ip));
33647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress prefix = TruncateIP(ip, 64);
33747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network* network_to_change = new Network("test_eth0",
33847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                          "Test Network Adapter 1",
33947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                          prefix, 64);
34047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network* changed_network = new Network(*network_to_change);
34147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  network_to_change->AddIP(ip);
34247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress changed_ip;
34347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(IPFromString("2401:fa01:4:1000:be30:f00:f00:f00", &changed_ip));
34447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  changed_network->AddIP(changed_ip);
34547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  original_list.push_back(network_to_change);
34647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool changed = false;
34747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MergeNetworkList(manager, original_list, &changed);
34847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList second_list;
34947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SetupNetworks(&second_list);
35047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  second_list.push_back(changed_network);
35147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  changed = false;
35247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MergeNetworkList(manager, second_list, &changed);
35347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(changed);
35447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList list;
35547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.GetNetworks(&list);
35647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(original_list.size(), list.size());
35747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Make sure the original network is still in the merged list.
35847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_NE(list.end(),
35947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org            std::find(list.begin(), list.end(), network_to_change));
36047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(changed_ip, network_to_change->GetIPs().at(0));
36147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
36247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
36347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Testing a similar case to above, but checking that a network can be updated
36447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// with additional IPs (not just a replacement).
36547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestMultipleIPMergeNetworkList) {
36647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager manager;
36747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.SignalNetworksChanged.connect(
36847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
36947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList original_list;
37047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SetupNetworks(&original_list);
37147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool changed = false;
37247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MergeNetworkList(manager, original_list, &changed);
37347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(changed);
37447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress ip;
37547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress check_ip;
37647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress prefix;
37747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Add a second IP to the public network on eth0 (2401:fa00:4:1000/64).
37847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c6", &ip));
37947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  prefix = TruncateIP(ip, 64);
38047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ipv6_eth0_publicnetwork1_ip2("test_eth0", "Test NetworkAdapter 1",
38147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                       prefix, 64);
38247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // This is the IP that already existed in the public network on eth0.
38347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(IPFromString("2401:fa00:4:1000:be30:5bff:fee5:c3", &check_ip));
38447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ipv6_eth0_publicnetwork1_ip2.AddIP(ip);
38547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  original_list.push_back(new Network(ipv6_eth0_publicnetwork1_ip2));
38647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  changed = false;
38747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MergeNetworkList(manager, original_list, &changed);
38847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(changed);
38947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // There should still be four networks.
39047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList list;
39147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.GetNetworks(&list);
39247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(4U, list.size());
39347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Check the gathered IPs.
39447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int matchcount = 0;
39547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (NetworkManager::NetworkList::iterator it = list.begin();
39647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != list.end(); ++it) {
39747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if ((*it)->ToString() == original_list[2]->ToString()) {
39847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      ++matchcount;
39947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      EXPECT_EQ(1, matchcount);
40047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      // This should be the same network object as before.
40147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      EXPECT_EQ((*it), original_list[2]);
40247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      // But with two addresses now.
40347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      EXPECT_EQ(2U, (*it)->GetIPs().size());
40447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      EXPECT_NE((*it)->GetIPs().end(),
40547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                std::find((*it)->GetIPs().begin(),
40647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                          (*it)->GetIPs().end(),
40747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                          check_ip));
40847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      EXPECT_NE((*it)->GetIPs().end(),
40947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                std::find((*it)->GetIPs().begin(),
41047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                          (*it)->GetIPs().end(),
41147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                          ip));
41247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    } else {
41347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      // Check the IP didn't get added anywhere it wasn't supposed to.
41447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      EXPECT_EQ((*it)->GetIPs().end(),
41547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                std::find((*it)->GetIPs().begin(),
41647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                          (*it)->GetIPs().end(),
41747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                          ip));
41847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
41947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
42047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
42147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
42247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test that merge correctly distinguishes multiple networks on an interface.
42347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestMultiplePublicNetworksOnOneInterfaceMerge) {
42447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager manager;
42547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.SignalNetworksChanged.connect(
42647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      static_cast<NetworkTest*>(this), &NetworkTest::OnNetworksChanged);
42747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList original_list;
42847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SetupNetworks(&original_list);
42947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool changed = false;
43047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MergeNetworkList(manager, original_list, &changed);
43147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(changed);
43247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress ip;
43347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress prefix;
43447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // A second network for eth0.
43547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:5bff:fee5:c3", &ip));
43647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  prefix = TruncateIP(ip, 64);
43747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ipv6_eth0_publicnetwork2_ip1("test_eth0", "Test NetworkAdapter 1",
43847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                       prefix, 64);
43947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ipv6_eth0_publicnetwork2_ip1.AddIP(ip);
44047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  original_list.push_back(new Network(ipv6_eth0_publicnetwork2_ip1));
44147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  changed = false;
44247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MergeNetworkList(manager, original_list, &changed);
44347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(changed);
44447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // There should be five networks now.
44547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList list;
44647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.GetNetworks(&list);
44747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(5U, list.size());
44847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // Check the resulting addresses.
44947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (NetworkManager::NetworkList::iterator it = list.begin();
45047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != list.end(); ++it) {
45147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if ((*it)->prefix() == ipv6_eth0_publicnetwork2_ip1.prefix() &&
45247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        (*it)->name() == ipv6_eth0_publicnetwork2_ip1.name()) {
45347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      // Check the new network has 1 IP and that it's the correct one.
45447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      EXPECT_EQ(1U, (*it)->GetIPs().size());
45547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      EXPECT_EQ(ip, (*it)->GetIPs().at(0));
45647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    } else {
45747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      // Check the IP didn't get added anywhere it wasn't supposed to.
45847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      EXPECT_EQ((*it)->GetIPs().end(),
45947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                std::find((*it)->GetIPs().begin(),
46047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                          (*it)->GetIPs().end(),
46147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                          ip));
46247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
46347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
46447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
46547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
46647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test that DumpNetworks works.
46747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestDumpNetworks) {
46847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager manager;
46947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.DumpNetworks(true);
47047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
47147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
47247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Test that we can toggle IPv6 on and off.
47347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestIPv6Toggle) {
47447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager manager;
47547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool ipv6_found = false;
47647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList list;
47747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if !defined(WEBRTC_WIN)
47847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // There should be at least one IPv6 network (fe80::/64 should be in there).
47947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // TODO(thaloun): Disabling this test on windows for the moment as the test
48047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // machines don't seem to have IPv6 installed on them at all.
48147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.set_ipv6_enabled(true);
48247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list = GetNetworks(manager, true);
48347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (NetworkManager::NetworkList::iterator it = list.begin();
48447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != list.end(); ++it) {
48547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if ((*it)->prefix().family() == AF_INET6) {
48647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      ipv6_found = true;
48747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      break;
48847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
48947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
49047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(ipv6_found);
49147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (NetworkManager::NetworkList::iterator it = list.begin();
49247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != list.end(); ++it) {
49347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    delete (*it);
49447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
49547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
49647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ipv6_found = false;
49747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.set_ipv6_enabled(false);
49847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list = GetNetworks(manager, true);
49947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (NetworkManager::NetworkList::iterator it = list.begin();
50047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != list.end(); ++it) {
50147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if ((*it)->prefix().family() == AF_INET6) {
50247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      ipv6_found = true;
50347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      break;
50447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
50547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
50647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_FALSE(ipv6_found);
50747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (NetworkManager::NetworkList::iterator it = list.begin();
50847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != list.end(); ++it) {
50947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    delete (*it);
51047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
51147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
51247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
51347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestNetworkListSorting) {
51447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager manager;
51547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ipv4_network1("test_eth0", "Test Network Adapter 1",
51647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                        IPAddress(0x12345600U), 24);
51747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ipv4_network1.AddIP(IPAddress(0x12345600U));
51847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
51947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress ip;
52047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IPAddress prefix;
52147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:abcd:efab:cdef", &ip));
52247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  prefix = TruncateIP(ip, 64);
52347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ipv6_eth1_publicnetwork1_ip1("test_eth1", "Test NetworkAdapter 2",
52447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                       prefix, 64);
52547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ipv6_eth1_publicnetwork1_ip1.AddIP(ip);
52647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
52747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList list;
52847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.push_back(new Network(ipv4_network1));
52947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.push_back(new Network(ipv6_eth1_publicnetwork1_ip1));
53047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network* net1 = list[0];
53147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network* net2 = list[1];
53247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
53347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool changed = false;
53447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  MergeNetworkList(manager, list, &changed);
53547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ASSERT_TRUE(changed);
53647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // After sorting IPv6 network should be higher order than IPv4 networks.
53747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(net1->preference() < net2->preference());
53847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
53947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
54047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestNetworkAdapterTypes) {
54147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network wifi("wlan0", "Wireless Adapter", IPAddress(0x12345600U), 24,
54247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org               ADAPTER_TYPE_WIFI);
54347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(ADAPTER_TYPE_WIFI, wifi.type());
54447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network ethernet("eth0", "Ethernet", IPAddress(0x12345600U), 24,
54547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                   ADAPTER_TYPE_ETHERNET);
54647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(ADAPTER_TYPE_ETHERNET, ethernet.type());
54747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network cellular("test_cell", "Cellular Adapter", IPAddress(0x12345600U), 24,
54847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                   ADAPTER_TYPE_CELLULAR);
54947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(ADAPTER_TYPE_CELLULAR, cellular.type());
55047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network vpn("bridge_test", "VPN Adapter", IPAddress(0x12345600U), 24,
55147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org              ADAPTER_TYPE_VPN);
55247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(ADAPTER_TYPE_VPN, vpn.type());
55347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Network unknown("test", "Test Adapter", IPAddress(0x12345600U), 24,
55447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                  ADAPTER_TYPE_UNKNOWN);
55547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_EQ(ADAPTER_TYPE_UNKNOWN, unknown.type());
55647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
55747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
55847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX)
55947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Verify that we correctly handle interfaces with no address.
56047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestConvertIfAddrsNoAddress) {
56147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  ifaddrs list;
56247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  memset(&list, 0, sizeof(list));
56347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list.ifa_name = const_cast<char*>("test_iface");
56447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
56547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList result;
56647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager manager;
56747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  CallConvertIfAddrs(manager, &list, true, &result);
56847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  EXPECT_TRUE(result.empty());
56947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
57047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif  // defined(WEBRTC_POSIX)
57147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
57247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID)
57347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// If you want to test non-default routes, you can do the following on a linux
57447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// machine:
57547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// 1) Load the dummy network driver:
57647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// sudo modprobe dummy
57747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// sudo ifconfig dummy0 127.0.0.1
57847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// 2) Run this test and confirm the output says it found a dummy route (and
57947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// passes).
58047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// 3) When done:
58147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// sudo rmmmod dummy
58247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgTEST_F(NetworkTest, TestIgnoreNonDefaultRoutes) {
58347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  BasicNetworkManager manager;
58447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  NetworkManager::NetworkList list;
58547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list = GetNetworks(manager, false);
58647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool found_dummy = false;
58747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  LOG(LS_INFO) << "Looking for dummy network: ";
58847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (NetworkManager::NetworkList::iterator it = list.begin();
58947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != list.end(); ++it) {
59047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    LOG(LS_INFO) << "  Network name: " << (*it)->name();
59147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    found_dummy |= (*it)->name().find("dummy0") != std::string::npos;
59247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
59347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (NetworkManager::NetworkList::iterator it = list.begin();
59447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != list.end(); ++it) {
59547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    delete (*it);
59647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
59747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  if (!found_dummy) {
59847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    LOG(LS_INFO) << "No dummy found, quitting.";
59947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    return;
60047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
60147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  LOG(LS_INFO) << "Found dummy, running again while ignoring non-default "
60247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org               << "routes.";
60347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  manager.set_ignore_non_default_routes(true);
60447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  list = GetNetworks(manager, false);
60547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (NetworkManager::NetworkList::iterator it = list.begin();
60647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != list.end(); ++it) {
60747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    LOG(LS_INFO) << "  Network name: " << (*it)->name();
60847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    EXPECT_TRUE((*it)->name().find("dummy0") == std::string::npos);
60947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
61047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  for (NetworkManager::NetworkList::iterator it = list.begin();
61147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org       it != list.end(); ++it) {
61247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    delete (*it);
61347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
61447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
61547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
61647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
617b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org// Test MergeNetworkList successfully combines all IPs for the same
618b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org// prefix/length into a single Network.
619b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.orgTEST_F(NetworkTest, TestMergeNetworkList) {
620b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  BasicNetworkManager manager;
621b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  NetworkManager::NetworkList list;
622b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org
623b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  // Create 2 IPAddress classes with only last digit different.
624b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  IPAddress ip1, ip2;
625b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:1", &ip1));
626b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  EXPECT_TRUE(IPFromString("2400:4030:1:2c00:be30:0:0:2", &ip2));
627b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org
628b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  // Create 2 networks with the same prefix and length.
629b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  Network* net1 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
630b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  Network* net2 = new Network("em1", "em1", TruncateIP(ip1, 64), 64);
631b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org
632b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  // Add different IP into each.
633b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  net1->AddIP(ip1);
634b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  net2->AddIP(ip2);
635b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org
636b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  list.push_back(net1);
637b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  list.push_back(net2);
638b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  bool changed;
639b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  MergeNetworkList(manager, list, &changed);
640b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  EXPECT_TRUE(changed);
641b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org
642b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  NetworkManager::NetworkList list2;
643b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  manager.GetNetworks(&list2);
644b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org
645b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  // Make sure the resulted networklist has only 1 element and 2
646b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  // IPAddresses.
647b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  EXPECT_EQ(list2.size(), 1uL);
648b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  EXPECT_EQ(list2[0]->GetIPs().size(), 2uL);
649b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  EXPECT_EQ(list2[0]->GetIPs()[0], ip1);
650b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org  EXPECT_EQ(list2[0]->GetIPs()[1], ip2);
651b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org}
652b6f295d64986557701b1d10089eae0c9a206adabguoweis@webrtc.org
6532738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org// Test that the filtering logic follows the defined ruleset in network.h.
6542738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.orgTEST_F(NetworkTest, TestIPv6Selection) {
6552738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  InterfaceAddress ip;
6562738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  std::string ipstr;
6572738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org
6582738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c3";
6592738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_DEPRECATED, &ip));
6602738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org
6612738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  // Create a network with this prefix.
6622738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  Network ipv6_network(
6632738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org      "test_eth0", "Test NetworkAdapter", TruncateIP(ip, 64), 64);
6642738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org
6652738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  // When there is no address added, it should return an unspecified
6662738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  // address.
6672738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
6682738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  EXPECT_TRUE(IPIsUnspec(ipv6_network.GetBestIP()));
6692738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org
6702738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  // Deprecated one should not be returned.
6712738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  ipv6_network.AddIP(ip);
6722738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  EXPECT_EQ(ipv6_network.GetBestIP(), IPAddress());
6732738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org
6742738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  // Add ULA one. ULA is unique local address which is starting either
6752738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  // with 0xfc or 0xfd.
6762738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  ipstr = "fd00:fa00:4:1000:be30:5bff:fee5:c4";
6772738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
6782738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  ipv6_network.AddIP(ip);
6792738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
6802738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org
6812738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  // Add global one.
6822738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c5";
6832738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_NONE, &ip));
6842738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  ipv6_network.AddIP(ip);
6852738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
6862738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org
6872738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  // Add global dynamic temporary one.
6882738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  ipstr = "2401:fa00:4:1000:be30:5bff:fee5:c6";
6892738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  ASSERT_TRUE(IPFromString(ipstr, IPV6_ADDRESS_FLAG_TEMPORARY, &ip));
6902738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  ipv6_network.AddIP(ip);
6912738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org  EXPECT_EQ(ipv6_network.GetBestIP(), static_cast<IPAddress>(ip));
6922738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org}
6932738d4793348b524b02c8fcc5fabd113d4971cbdguoweis@webrtc.org
69447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}  // namespace rtc
695