| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include "webrtc/base/network.h" | 11 #include "webrtc/base/network.h" |
| 12 | 12 |
| 13 #include "webrtc/base/nethelpers.h" | 13 #include "webrtc/base/nethelpers.h" |
| 14 #include "webrtc/base/networkmonitor.h" | 14 #include "webrtc/base/networkmonitor.h" |
| 15 #include <vector> | 15 #include <vector> |
| 16 #if defined(WEBRTC_POSIX) | 16 #if defined(WEBRTC_POSIX) |
| 17 #include <sys/types.h> | 17 #include <sys/types.h> |
| 18 #include <net/if.h> | 18 #if !defined(WEBRTC_ANDROID) |
| 19 #include "webrtc/base/ifaddrs_converter.h" | 19 #include <ifaddrs.h> |
| 20 #endif // defined(WEBRTC_POSIX) | 20 #else |
| 21 #include "webrtc/base/ifaddrs-android.h" |
| 22 #endif |
| 23 #endif |
| 21 #include "webrtc/base/gunit.h" | 24 #include "webrtc/base/gunit.h" |
| 22 #if defined(WEBRTC_WIN) | 25 #if defined(WEBRTC_WIN) |
| 23 #include "webrtc/base/logging.h" // For LOG_GLE | 26 #include "webrtc/base/logging.h" // For LOG_GLE |
| 24 #endif | 27 #endif |
| 25 | 28 |
| 26 namespace rtc { | 29 namespace rtc { |
| 27 | 30 |
| 28 namespace { | |
| 29 | |
| 30 class FakeNetworkMonitor : public NetworkMonitorBase { | 31 class FakeNetworkMonitor : public NetworkMonitorBase { |
| 31 public: | 32 public: |
| 32 void Start() override {} | 33 void Start() override {} |
| 33 void Stop() override {} | 34 void Stop() override {} |
| 34 }; | 35 }; |
| 35 | 36 |
| 36 class FakeNetworkMonitorFactory : public NetworkMonitorFactory { | 37 class FakeNetworkMonitorFactory : public NetworkMonitorFactory { |
| 37 public: | 38 public: |
| 38 FakeNetworkMonitorFactory() {} | 39 FakeNetworkMonitorFactory() {} |
| 39 NetworkMonitorInterface* CreateNetworkMonitor() { | 40 NetworkMonitorInterface* CreateNetworkMonitor() { |
| 40 return new FakeNetworkMonitor(); | 41 return new FakeNetworkMonitor(); |
| 41 } | 42 } |
| 42 }; | 43 }; |
| 43 | 44 |
| 44 } // namespace | |
| 45 | |
| 46 class NetworkTest : public testing::Test, public sigslot::has_slots<> { | 45 class NetworkTest : public testing::Test, public sigslot::has_slots<> { |
| 47 public: | 46 public: |
| 48 NetworkTest() : callback_called_(false) {} | 47 NetworkTest() : callback_called_(false) {} |
| 49 | 48 |
| 50 void OnNetworksChanged() { | 49 void OnNetworksChanged() { |
| 51 callback_called_ = true; | 50 callback_called_ = true; |
| 52 } | 51 } |
| 53 | 52 |
| 54 NetworkManager::Stats MergeNetworkList( | 53 NetworkManager::Stats MergeNetworkList( |
| 55 BasicNetworkManager& network_manager, | 54 BasicNetworkManager& network_manager, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 83 network_manager.networks_.clear(); | 82 network_manager.networks_.clear(); |
| 84 network_manager.networks_map_.clear(); | 83 network_manager.networks_map_.clear(); |
| 85 } | 84 } |
| 86 | 85 |
| 87 #if defined(WEBRTC_POSIX) | 86 #if defined(WEBRTC_POSIX) |
| 88 // Separated from CreateNetworks for tests. | 87 // Separated from CreateNetworks for tests. |
| 89 static void CallConvertIfAddrs(const BasicNetworkManager& network_manager, | 88 static void CallConvertIfAddrs(const BasicNetworkManager& network_manager, |
| 90 struct ifaddrs* interfaces, | 89 struct ifaddrs* interfaces, |
| 91 bool include_ignored, | 90 bool include_ignored, |
| 92 NetworkManager::NetworkList* networks) { | 91 NetworkManager::NetworkList* networks) { |
| 93 // Use the base IfAddrsConverter for test cases. | 92 network_manager.ConvertIfAddrs(interfaces, include_ignored, networks); |
| 94 rtc::scoped_ptr<IfAddrsConverter> ifaddrs_converter(new IfAddrsConverter()); | |
| 95 network_manager.ConvertIfAddrs(interfaces, ifaddrs_converter.get(), | |
| 96 include_ignored, networks); | |
| 97 } | 93 } |
| 98 | 94 |
| 99 struct sockaddr_in6* CreateIpv6Addr(const std::string& ip_string, | 95 struct sockaddr_in6* CreateIpv6Addr(const std::string& ip_string, |
| 100 uint32_t scope_id) { | 96 uint32_t scope_id) { |
| 101 struct sockaddr_in6* ipv6_addr = new struct sockaddr_in6; | 97 struct sockaddr_in6* ipv6_addr = new struct sockaddr_in6; |
| 102 memset(ipv6_addr, 0, sizeof(struct sockaddr_in6)); | 98 memset(ipv6_addr, 0, sizeof(struct sockaddr_in6)); |
| 103 ipv6_addr->sin6_family = AF_INET6; | 99 ipv6_addr->sin6_family = AF_INET6; |
| 104 ipv6_addr->sin6_scope_id = scope_id; | 100 ipv6_addr->sin6_scope_id = scope_id; |
| 105 IPAddress ip; | 101 IPAddress ip; |
| 106 IPFromString(ip_string, &ip); | 102 IPFromString(ip_string, &ip); |
| 107 ipv6_addr->sin6_addr = ip.ipv6_address(); | 103 ipv6_addr->sin6_addr = ip.ipv6_address(); |
| 108 return ipv6_addr; | 104 return ipv6_addr; |
| 109 } | 105 } |
| 110 | 106 |
| 111 // Pointers created here need to be released via ReleaseIfAddrs. | 107 // Pointers created here need to be released via ReleaseIfAddrs. |
| 112 struct ifaddrs* AddIpv6Address(struct ifaddrs* list, | 108 struct ifaddrs* AddIpv6Address(struct ifaddrs* list, |
| 113 char* if_name, | 109 char* if_name, |
| 114 const std::string& ipv6_address, | 110 const std::string& ipv6_address, |
| 115 const std::string& ipv6_netmask, | 111 const std::string& ipv6_netmask, |
| 116 uint32_t scope_id) { | 112 uint32_t scope_id) { |
| 117 struct ifaddrs* if_addr = new struct ifaddrs; | 113 struct ifaddrs* if_addr = new struct ifaddrs; |
| 118 memset(if_addr, 0, sizeof(struct ifaddrs)); | 114 memset(if_addr, 0, sizeof(struct ifaddrs)); |
| 119 if_addr->ifa_name = if_name; | 115 if_addr->ifa_name = if_name; |
| 120 if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>( | 116 if_addr->ifa_addr = reinterpret_cast<struct sockaddr*>( |
| 121 CreateIpv6Addr(ipv6_address, scope_id)); | 117 CreateIpv6Addr(ipv6_address, scope_id)); |
| 122 if_addr->ifa_netmask = | 118 if_addr->ifa_netmask = |
| 123 reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0)); | 119 reinterpret_cast<struct sockaddr*>(CreateIpv6Addr(ipv6_netmask, 0)); |
| 124 if_addr->ifa_next = list; | 120 if_addr->ifa_next = list; |
| 125 if_addr->ifa_flags = IFF_RUNNING; | |
| 126 return if_addr; | 121 return if_addr; |
| 127 } | 122 } |
| 128 | 123 |
| 129 void ReleaseIfAddrs(struct ifaddrs* list) { | 124 void ReleaseIfAddrs(struct ifaddrs* list) { |
| 130 struct ifaddrs* if_addr = list; | 125 struct ifaddrs* if_addr = list; |
| 131 while (if_addr != nullptr) { | 126 while (if_addr != nullptr) { |
| 132 struct ifaddrs* next_addr = if_addr->ifa_next; | 127 struct ifaddrs* next_addr = if_addr->ifa_next; |
| 133 delete if_addr->ifa_addr; | 128 delete if_addr->ifa_addr; |
| 134 delete if_addr->ifa_netmask; | 129 delete if_addr->ifa_netmask; |
| 135 delete if_addr; | 130 delete if_addr; |
| (...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 760 "FFFF:FFFF:FFFF:FFFF::", 0); | 755 "FFFF:FFFF:FFFF:FFFF::", 0); |
| 761 NetworkManager::NetworkList result; | 756 NetworkManager::NetworkList result; |
| 762 BasicNetworkManager manager; | 757 BasicNetworkManager manager; |
| 763 CallConvertIfAddrs(manager, list, true, &result); | 758 CallConvertIfAddrs(manager, list, true, &result); |
| 764 EXPECT_EQ(1U, result.size()); | 759 EXPECT_EQ(1U, result.size()); |
| 765 bool changed; | 760 bool changed; |
| 766 // This ensures we release the objects created in CallConvertIfAddrs. | 761 // This ensures we release the objects created in CallConvertIfAddrs. |
| 767 MergeNetworkList(manager, result, &changed); | 762 MergeNetworkList(manager, result, &changed); |
| 768 ReleaseIfAddrs(list); | 763 ReleaseIfAddrs(list); |
| 769 } | 764 } |
| 770 | |
| 771 TEST_F(NetworkTest, TestConvertIfAddrsNotRunning) { | |
| 772 ifaddrs list; | |
| 773 memset(&list, 0, sizeof(list)); | |
| 774 list.ifa_name = const_cast<char*>("test_iface"); | |
| 775 sockaddr ifa_addr; | |
| 776 sockaddr ifa_netmask; | |
| 777 list.ifa_addr = &ifa_addr; | |
| 778 list.ifa_netmask = &ifa_netmask; | |
| 779 | |
| 780 NetworkManager::NetworkList result; | |
| 781 BasicNetworkManager manager; | |
| 782 CallConvertIfAddrs(manager, &list, true, &result); | |
| 783 EXPECT_TRUE(result.empty()); | |
| 784 } | |
| 785 #endif // defined(WEBRTC_POSIX) | 765 #endif // defined(WEBRTC_POSIX) |
| 786 | 766 |
| 787 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) | 767 #if defined(WEBRTC_LINUX) && !defined(WEBRTC_ANDROID) |
| 788 // If you want to test non-default routes, you can do the following on a linux | 768 // If you want to test non-default routes, you can do the following on a linux |
| 789 // machine: | 769 // machine: |
| 790 // 1) Load the dummy network driver: | 770 // 1) Load the dummy network driver: |
| 791 // sudo modprobe dummy | 771 // sudo modprobe dummy |
| 792 // sudo ifconfig dummy0 127.0.0.1 | 772 // sudo ifconfig dummy0 127.0.0.1 |
| 793 // 2) Run this test and confirm the output says it found a dummy route (and | 773 // 2) Run this test and confirm the output says it found a dummy route (and |
| 794 // passes). | 774 // passes). |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 999 manager.set_default_local_addresses(GetLoopbackIP(AF_INET), | 979 manager.set_default_local_addresses(GetLoopbackIP(AF_INET), |
| 1000 GetLoopbackIP(AF_INET6)); | 980 GetLoopbackIP(AF_INET6)); |
| 1001 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET, &ip)); | 981 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET, &ip)); |
| 1002 EXPECT_EQ(ip, GetLoopbackIP(AF_INET)); | 982 EXPECT_EQ(ip, GetLoopbackIP(AF_INET)); |
| 1003 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip)); | 983 EXPECT_TRUE(manager.GetDefaultLocalAddress(AF_INET6, &ip)); |
| 1004 EXPECT_EQ(ip, GetLoopbackIP(AF_INET6)); | 984 EXPECT_EQ(ip, GetLoopbackIP(AF_INET6)); |
| 1005 manager.StopUpdating(); | 985 manager.StopUpdating(); |
| 1006 } | 986 } |
| 1007 | 987 |
| 1008 } // namespace rtc | 988 } // namespace rtc |
| OLD | NEW |