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 |