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