Author: John Harrison Date: 2024-12-05T09:08:17-08:00 New Revision: 0964328c2960159f66ad232bb2257fbabab3c0ec
URL: https://github.com/llvm/llvm-project/commit/0964328c2960159f66ad232bb2257fbabab3c0ec DIFF: https://github.com/llvm/llvm-project/commit/0964328c2960159f66ad232bb2257fbabab3c0ec.diff LOG: [lldb] Fix the SocketTest failure on unsupported hosts (#118673) The test `SocketTest::TCPListen0MultiListenerGetListeningConnectionURI` is failing on hosts that do not map `localhost` to both an ipv4 and ipv6 address. For example this build https://lab.llvm.org/buildbot/#/builders/195/builds/1909. To fix this, I added a helper to validate if the host has an /etc/hosts entry for both ipv4 and ipv6, otherwise we skip the test. Added: Modified: lldb/unittests/Host/SocketTest.cpp lldb/unittests/TestingSupport/Host/SocketTestUtilities.cpp lldb/unittests/TestingSupport/Host/SocketTestUtilities.h Removed: ################################################################################ diff --git a/lldb/unittests/Host/SocketTest.cpp b/lldb/unittests/Host/SocketTest.cpp index 689ef4019c618c..9cbf3e26b0883f 100644 --- a/lldb/unittests/Host/SocketTest.cpp +++ b/lldb/unittests/Host/SocketTest.cpp @@ -271,7 +271,7 @@ TEST_P(SocketTest, TCPListen0GetListeningConnectionURI) { } TEST_F(SocketTest, TCPListen0MultiListenerGetListeningConnectionURI) { - if (!HostSupportsIPv6() || !HostSupportsIPv4()) + if (!HostSupportsLocalhostToIPv4() || !HostSupportsLocalhostToIPv6()) return; llvm::Expected<std::unique_ptr<TCPSocket>> sock = diff --git a/lldb/unittests/TestingSupport/Host/SocketTestUtilities.cpp b/lldb/unittests/TestingSupport/Host/SocketTestUtilities.cpp index eb5bda0fabc770..80545b8c533a03 100644 --- a/lldb/unittests/TestingSupport/Host/SocketTestUtilities.cpp +++ b/lldb/unittests/TestingSupport/Host/SocketTestUtilities.cpp @@ -116,6 +116,30 @@ bool lldb_private::HostSupportsIPv6() { return CheckIPSupport("IPv6", "[::1]:0"); } +bool lldb_private::HostSupportsLocalhostToIPv4() { + if (!HostSupportsIPv4()) + return false; + + auto addresses = SocketAddress::GetAddressInfo( + "localhost", nullptr, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP); + return std::find_if(addresses.begin(), addresses.end(), + [](SocketAddress &addr) { + return addr.GetFamily() == AF_INET; + }) != addresses.end(); +} + +bool lldb_private::HostSupportsLocalhostToIPv6() { + if (!HostSupportsIPv6()) + return false; + + auto addresses = SocketAddress::GetAddressInfo( + "localhost", nullptr, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP); + return std::find_if(addresses.begin(), addresses.end(), + [](SocketAddress &addr) { + return addr.GetFamily() == AF_INET6; + }) != addresses.end(); +} + llvm::Expected<std::string> lldb_private::GetLocalhostIP() { if (HostSupportsIPv4()) return "127.0.0.1"; diff --git a/lldb/unittests/TestingSupport/Host/SocketTestUtilities.h b/lldb/unittests/TestingSupport/Host/SocketTestUtilities.h index efd17428ceefb6..e5bab163cf82eb 100644 --- a/lldb/unittests/TestingSupport/Host/SocketTestUtilities.h +++ b/lldb/unittests/TestingSupport/Host/SocketTestUtilities.h @@ -43,6 +43,11 @@ void CreateDomainConnectedSockets(llvm::StringRef path, bool HostSupportsIPv6(); bool HostSupportsIPv4(); +/// Returns true if the name `localhost` maps to a loopback IPv4 address. +bool HostSupportsLocalhostToIPv4(); +/// Returns true if the name `localhost` maps to a loopback IPv6 address. +bool HostSupportsLocalhostToIPv6(); + /// Return an IP for localhost based on host support. /// /// This will return either "127.0.0.1" if IPv4 is detected, or "[::1]" if IPv6 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits