
Sadly IPv6 is still not present anywhere. The test was attempting to detect&skip such hosts, but the way it did that (essentially, by calling getaddrinfo) meant that it only detected hosts which have IPv6 support completely compiled out. It did not do anything about hosts which have it compiled in, but lack runtime configuration even for the ::1 loopback address. This patch changes the detection logic to use a new method. It does it by attempting to bind a socket to the appropriate loopback address. That should ensure the hosts loopback interface is fully set up. In an effort to avoid silently skipping the test on too many hosts, the test is fairly strict about the kind of error it expects in these cases -- it will only skip the test when receiving EADDRNOTAVAIL. If we find other error codes that can be reasonably returned in these situations, we can add more of them. The (small) change in TCPSocket.cpp is to ensure that the code correctly propagates the error received from the OS.
51 lines
1.5 KiB
C++
51 lines
1.5 KiB
C++
//===-- ConnectionFileDescriptorTest.cpp ----------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "SocketTestUtilities.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
#include "TestingSupport/SubsystemRAII.h"
|
|
#include "lldb/Host/posix/ConnectionFileDescriptorPosix.h"
|
|
#include "lldb/Utility/UriParser.h"
|
|
|
|
using namespace lldb_private;
|
|
|
|
class ConnectionFileDescriptorTest : public testing::Test {
|
|
public:
|
|
SubsystemRAII<Socket> subsystems;
|
|
|
|
void TestGetURI(std::string ip) {
|
|
std::unique_ptr<TCPSocket> socket_a_up;
|
|
std::unique_ptr<TCPSocket> socket_b_up;
|
|
CreateTCPConnectedSockets(ip, &socket_a_up, &socket_b_up);
|
|
auto socket = socket_a_up.release();
|
|
ConnectionFileDescriptor connection_file_descriptor(socket);
|
|
|
|
llvm::StringRef scheme;
|
|
llvm::StringRef hostname;
|
|
int port;
|
|
llvm::StringRef path;
|
|
std::string uri(connection_file_descriptor.GetURI());
|
|
EXPECT_TRUE(UriParser::Parse(uri, scheme, hostname, port, path));
|
|
EXPECT_EQ(ip, hostname);
|
|
EXPECT_EQ(socket->GetRemotePortNumber(), port);
|
|
}
|
|
};
|
|
|
|
TEST_F(ConnectionFileDescriptorTest, TCPGetURIv4) {
|
|
if (!HostSupportsIPv4())
|
|
return;
|
|
TestGetURI("127.0.0.1");
|
|
}
|
|
|
|
TEST_F(ConnectionFileDescriptorTest, TCPGetURIv6) {
|
|
if (!HostSupportsIPv6())
|
|
return;
|
|
TestGetURI("::1");
|
|
}
|