diff --git a/p2p/BUILD.gn b/p2p/BUILD.gn index 105536b7c0..bc2a647958 100644 --- a/p2p/BUILD.gn +++ b/p2p/BUILD.gn @@ -202,6 +202,7 @@ if (rtc_include_tests) { deps = [ ":rtc_p2p", "../rtc_base:net_helpers", + "../rtc_base:net_test_helpers", "../rtc_base:task_queue_for_test", "../rtc_base:threading", "../rtc_base/memory:always_valid_pointer", @@ -312,6 +313,7 @@ if (rtc_include_tests) { "../rtc_base:mdns_responder_interface", "../rtc_base:net_helper", "../rtc_base:net_helpers", + "../rtc_base:net_test_helpers", "../rtc_base:network", "../rtc_base:network_constants", "../rtc_base:proxy_info", diff --git a/p2p/base/fake_port_allocator.h b/p2p/base/fake_port_allocator.h index 05c631361f..20f6780b58 100644 --- a/p2p/base/fake_port_allocator.h +++ b/p2p/base/fake_port_allocator.h @@ -22,6 +22,7 @@ #include "p2p/base/udp_port.h" #include "rtc_base/memory/always_valid_pointer.h" #include "rtc_base/net_helpers.h" +#include "rtc_base/net_test_helpers.h" #include "rtc_base/task_queue_for_test.h" #include "rtc_base/thread.h" diff --git a/p2p/client/basic_port_allocator_unittest.cc b/p2p/client/basic_port_allocator_unittest.cc index 710d32a98f..44e39c39ac 100644 --- a/p2p/client/basic_port_allocator_unittest.cc +++ b/p2p/client/basic_port_allocator_unittest.cc @@ -34,6 +34,7 @@ #include "rtc_base/nat_types.h" #include "rtc_base/net_helper.h" #include "rtc_base/net_helpers.h" +#include "rtc_base/net_test_helpers.h" #include "rtc_base/network.h" #include "rtc_base/network_constants.h" #include "rtc_base/network_monitor.h" diff --git a/rtc_base/BUILD.gn b/rtc_base/BUILD.gn index 7dd8e9cdaf..ceb16a77b5 100644 --- a/rtc_base/BUILD.gn +++ b/rtc_base/BUILD.gn @@ -879,7 +879,10 @@ rtc_library("net_helpers") { "net_helpers.cc", "net_helpers.h", ] - deps = [ "system:rtc_export" ] + deps = [ + ":net_test_helpers", + "system:rtc_export", + ] if (is_android) { deps += [ ":ifaddrs_android" ] } @@ -892,6 +895,26 @@ rtc_library("net_helpers") { absl_deps = [ "//third_party/abseil-cpp/absl/strings" ] } +rtc_library("net_test_helpers") { + # TODO(mbonadei): Enable once net_helpers don't depend + # on this target anymore. + # testonly = true + sources = [ + "net_test_helpers.cc", + "net_test_helpers.h", + ] + deps = [ "system:rtc_export" ] + if (is_android) { + deps += [ ":ifaddrs_android" ] + } + if (is_win) { + deps += [ + ":win32", + "win:windows_version", + ] + } +} + rtc_library("async_resolver_interface") { visibility = [ "*" ] sources = [ @@ -1778,6 +1801,7 @@ if (rtc_include_tests) { ":logging", ":macromagic", ":net_helpers", + ":net_test_helpers", ":null_socket_server", ":platform_thread", ":rtc_base_tests_utils", @@ -2043,6 +2067,7 @@ if (rtc_include_tests) { ":logging", ":macromagic", ":net_helpers", + ":net_test_helpers", ":network", ":network_route", ":null_socket_server", diff --git a/rtc_base/nat_unittest.cc b/rtc_base/nat_unittest.cc index f6dd83cadb..19e53543ba 100644 --- a/rtc_base/nat_unittest.cc +++ b/rtc_base/nat_unittest.cc @@ -26,6 +26,7 @@ #include "rtc_base/nat_socket_factory.h" #include "rtc_base/nat_types.h" #include "rtc_base/net_helpers.h" +#include "rtc_base/net_test_helpers.h" #include "rtc_base/network.h" #include "rtc_base/physical_socket_server.h" #include "rtc_base/socket.h" diff --git a/rtc_base/net_helpers.cc b/rtc_base/net_helpers.cc index 73fe862313..00cd434a58 100644 --- a/rtc_base/net_helpers.cc +++ b/rtc_base/net_helpers.cc @@ -19,15 +19,9 @@ #include #include -#include "rtc_base/win/windows_version.h" #endif #if defined(WEBRTC_POSIX) && !defined(__native_client__) #include -#if defined(WEBRTC_ANDROID) -#include "rtc_base/ifaddrs_android.h" -#else -#include -#endif #endif // defined(WEBRTC_POSIX) && !defined(__native_client__) namespace rtc { @@ -48,83 +42,4 @@ int inet_pton(int af, absl::string_view src, void* dst) { return ::inet_pton(af, src_str.c_str(), dst); #endif } - -bool HasIPv4Enabled() { -#if defined(WEBRTC_POSIX) && !defined(__native_client__) - bool has_ipv4 = false; - struct ifaddrs* ifa; - if (getifaddrs(&ifa) < 0) { - return false; - } - for (struct ifaddrs* cur = ifa; cur != nullptr; cur = cur->ifa_next) { - if (cur->ifa_addr != nullptr && cur->ifa_addr->sa_family == AF_INET) { - has_ipv4 = true; - break; - } - } - freeifaddrs(ifa); - return has_ipv4; -#else - return true; -#endif -} - -bool HasIPv6Enabled() { -#if defined(WINUWP) - // WinUWP always has IPv6 capability. - return true; -#elif defined(WEBRTC_WIN) - if (rtc::rtc_win::GetVersion() >= rtc::rtc_win::Version::VERSION_VISTA) { - return true; - } - if (rtc::rtc_win::GetVersion() < rtc::rtc_win::Version::VERSION_XP) { - return false; - } - DWORD protbuff_size = 4096; - std::unique_ptr protocols; - LPWSAPROTOCOL_INFOW protocol_infos = nullptr; - int requested_protocols[2] = {AF_INET6, 0}; - - int err = 0; - int ret = 0; - // Check for protocols in a do-while loop until we provide a buffer large - // enough. (WSCEnumProtocols sets protbuff_size to its desired value). - // It is extremely unlikely that this will loop more than once. - do { - protocols.reset(new char[protbuff_size]); - protocol_infos = reinterpret_cast(protocols.get()); - ret = WSCEnumProtocols(requested_protocols, protocol_infos, &protbuff_size, - &err); - } while (ret == SOCKET_ERROR && err == WSAENOBUFS); - - if (ret == SOCKET_ERROR) { - return false; - } - - // Even if ret is positive, check specifically for IPv6. - // Non-IPv6 enabled WinXP will still return a RAW protocol. - for (int i = 0; i < ret; ++i) { - if (protocol_infos[i].iAddressFamily == AF_INET6) { - return true; - } - } - return false; -#elif defined(WEBRTC_POSIX) && !defined(__native_client__) - bool has_ipv6 = false; - struct ifaddrs* ifa; - if (getifaddrs(&ifa) < 0) { - return false; - } - for (struct ifaddrs* cur = ifa; cur != nullptr; cur = cur->ifa_next) { - if (cur->ifa_addr != nullptr && cur->ifa_addr->sa_family == AF_INET6) { - has_ipv6 = true; - break; - } - } - freeifaddrs(ifa); - return has_ipv6; -#else - return true; -#endif -} } // namespace rtc diff --git a/rtc_base/net_helpers.h b/rtc_base/net_helpers.h index 478cec3eed..5ce352875b 100644 --- a/rtc_base/net_helpers.h +++ b/rtc_base/net_helpers.h @@ -21,6 +21,8 @@ #include "absl/strings/string_view.h" #include "rtc_base/system/rtc_export.h" +// TODO(mbonadei): Remove this, after Chromium tests have been migrated. +#include "rtc_base/net_test_helpers.h" namespace rtc { @@ -29,9 +31,6 @@ namespace rtc { const char* inet_ntop(int af, const void* src, char* dst, socklen_t size); int inet_pton(int af, absl::string_view src, void* dst); -RTC_EXPORT bool HasIPv4Enabled(); -RTC_EXPORT bool HasIPv6Enabled(); - } // namespace rtc #endif // RTC_BASE_NET_HELPERS_H_ diff --git a/rtc_base/net_test_helpers.cc b/rtc_base/net_test_helpers.cc new file mode 100644 index 0000000000..806d7dee60 --- /dev/null +++ b/rtc_base/net_test_helpers.cc @@ -0,0 +1,111 @@ +/* + * Copyright 2023 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "rtc_base/net_test_helpers.h" + +#include +#include + +#if defined(WEBRTC_WIN) +#include +#include + +#include "rtc_base/win/windows_version.h" +#endif +#if defined(WEBRTC_POSIX) && !defined(__native_client__) +#include +#if defined(WEBRTC_ANDROID) +#include "rtc_base/ifaddrs_android.h" +#else +#include +#endif +#endif // defined(WEBRTC_POSIX) && !defined(__native_client__) + +namespace rtc { + +bool HasIPv4Enabled() { +#if defined(WEBRTC_POSIX) && !defined(__native_client__) + bool has_ipv4 = false; + struct ifaddrs* ifa; + if (getifaddrs(&ifa) < 0) { + return false; + } + for (struct ifaddrs* cur = ifa; cur != nullptr; cur = cur->ifa_next) { + if (cur->ifa_addr != nullptr && cur->ifa_addr->sa_family == AF_INET) { + has_ipv4 = true; + break; + } + } + freeifaddrs(ifa); + return has_ipv4; +#else + return true; +#endif +} + +bool HasIPv6Enabled() { +#if defined(WINUWP) + // WinUWP always has IPv6 capability. + return true; +#elif defined(WEBRTC_WIN) + if (rtc::rtc_win::GetVersion() >= rtc::rtc_win::Version::VERSION_VISTA) { + return true; + } + if (rtc::rtc_win::GetVersion() < rtc::rtc_win::Version::VERSION_XP) { + return false; + } + DWORD protbuff_size = 4096; + std::unique_ptr protocols; + LPWSAPROTOCOL_INFOW protocol_infos = nullptr; + int requested_protocols[2] = {AF_INET6, 0}; + + int err = 0; + int ret = 0; + // Check for protocols in a do-while loop until we provide a buffer large + // enough. (WSCEnumProtocols sets protbuff_size to its desired value). + // It is extremely unlikely that this will loop more than once. + do { + protocols.reset(new char[protbuff_size]); + protocol_infos = reinterpret_cast(protocols.get()); + ret = WSCEnumProtocols(requested_protocols, protocol_infos, &protbuff_size, + &err); + } while (ret == SOCKET_ERROR && err == WSAENOBUFS); + + if (ret == SOCKET_ERROR) { + return false; + } + + // Even if ret is positive, check specifically for IPv6. + // Non-IPv6 enabled WinXP will still return a RAW protocol. + for (int i = 0; i < ret; ++i) { + if (protocol_infos[i].iAddressFamily == AF_INET6) { + return true; + } + } + return false; +#elif defined(WEBRTC_POSIX) && !defined(__native_client__) + bool has_ipv6 = false; + struct ifaddrs* ifa; + if (getifaddrs(&ifa) < 0) { + return false; + } + for (struct ifaddrs* cur = ifa; cur != nullptr; cur = cur->ifa_next) { + if (cur->ifa_addr != nullptr && cur->ifa_addr->sa_family == AF_INET6) { + has_ipv6 = true; + break; + } + } + freeifaddrs(ifa); + return has_ipv6; +#else + return true; +#endif +} +} // namespace rtc diff --git a/rtc_base/net_test_helpers.h b/rtc_base/net_test_helpers.h new file mode 100644 index 0000000000..2e8320c4d8 --- /dev/null +++ b/rtc_base/net_test_helpers.h @@ -0,0 +1,23 @@ +/* + * Copyright 2023 The WebRTC Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#ifndef RTC_BASE_NET_TEST_HELPERS_H_ +#define RTC_BASE_NET_TEST_HELPERS_H_ + +#include "rtc_base/system/rtc_export.h" + +namespace rtc { + +RTC_EXPORT bool HasIPv4Enabled(); +RTC_EXPORT bool HasIPv6Enabled(); + +} // namespace rtc + +#endif // RTC_BASE_NET_TEST_HELPERS_H_ diff --git a/rtc_base/physical_socket_server_unittest.cc b/rtc_base/physical_socket_server_unittest.cc index f24c7e46ce..de64a31812 100644 --- a/rtc_base/physical_socket_server_unittest.cc +++ b/rtc_base/physical_socket_server_unittest.cc @@ -19,6 +19,7 @@ #include "rtc_base/ip_address.h" #include "rtc_base/logging.h" #include "rtc_base/net_helpers.h" +#include "rtc_base/net_test_helpers.h" #include "rtc_base/network_monitor.h" #include "rtc_base/socket_unittest.h" #include "rtc_base/test_utils.h" diff --git a/rtc_base/socket_unittest.cc b/rtc_base/socket_unittest.cc index 40da8c26cf..0a41a776ac 100644 --- a/rtc_base/socket_unittest.cc +++ b/rtc_base/socket_unittest.cc @@ -27,6 +27,7 @@ #include "rtc_base/gunit.h" #include "rtc_base/logging.h" #include "rtc_base/net_helpers.h" +#include "rtc_base/net_test_helpers.h" #include "rtc_base/socket_address.h" #include "rtc_base/socket_server.h" #include "rtc_base/socket_unittest.h" diff --git a/rtc_base/test_client_unittest.cc b/rtc_base/test_client_unittest.cc index a0c8b88e62..b2866a2d34 100644 --- a/rtc_base/test_client_unittest.cc +++ b/rtc_base/test_client_unittest.cc @@ -17,6 +17,7 @@ #include "rtc_base/async_udp_socket.h" #include "rtc_base/logging.h" #include "rtc_base/net_helpers.h" +#include "rtc_base/net_test_helpers.h" #include "rtc_base/physical_socket_server.h" #include "rtc_base/socket.h" #include "rtc_base/test_echo_server.h"