diff options
Diffstat (limited to 'lldb/unittests/Host/SocketTest.cpp')
-rw-r--r-- | lldb/unittests/Host/SocketTest.cpp | 115 |
1 files changed, 84 insertions, 31 deletions
diff --git a/lldb/unittests/Host/SocketTest.cpp b/lldb/unittests/Host/SocketTest.cpp index 8685c930338..ebb2f319a9c 100644 --- a/lldb/unittests/Host/SocketTest.cpp +++ b/lldb/unittests/Host/SocketTest.cpp @@ -13,11 +13,20 @@ #include <eh.h> #endif +#include <cstdio> +#include <functional> #include <thread> #include "gtest/gtest.h" +#include "lldb/Host/Config.h" #include "lldb/Host/Socket.h" +#include "lldb/Host/common/TCPSocket.h" +#include "lldb/Host/common/UDPSocket.h" + +#ifndef LLDB_DISABLE_POSIX +#include "lldb/Host/posix/DomainSocket.h" +#endif using namespace lldb_private; @@ -46,27 +55,19 @@ class SocketTest : public testing::Test AcceptThread(Socket *listen_socket, const char *listen_remote_address, bool child_processes_inherit, Socket **accept_socket, Error *error) { - *error = listen_socket->BlockingAccept(listen_remote_address, child_processes_inherit, *accept_socket); + *error = listen_socket->Accept(listen_remote_address, child_processes_inherit, *accept_socket); } + template<typename SocketType> void - CreateConnectedSockets(std::unique_ptr<Socket> *a_up, std::unique_ptr<Socket> *b_up) + CreateConnectedSockets(const char *listen_remote_address, const std::function<std::string(const SocketType&)> &get_connect_addr, std::unique_ptr<SocketType> *a_up, std::unique_ptr<SocketType> *b_up) { - Predicate<uint16_t> port_predicate; - // Used when binding to port zero to wait for the thread - // that creates the socket, binds and listens to resolve - // the port number. - - port_predicate.SetValue(0, eBroadcastNever); - bool child_processes_inherit = false; - Socket *socket = nullptr; - const char *listen_remote_address = "localhost:0"; - Error error = Socket::TcpListen(listen_remote_address, child_processes_inherit, socket, &port_predicate); - std::unique_ptr<Socket> listen_socket_up(socket); - socket = nullptr; + Error error; + std::unique_ptr<SocketType> listen_socket_up(new SocketType(child_processes_inherit, error)); + EXPECT_FALSE(error.Fail()); + error = listen_socket_up->Listen(listen_remote_address, 5); EXPECT_FALSE(error.Fail()); - EXPECT_NE(nullptr, listen_socket_up.get()); EXPECT_TRUE(listen_socket_up->IsValid()); Error accept_error; @@ -74,17 +75,20 @@ class SocketTest : public testing::Test std::thread accept_thread(AcceptThread, listen_socket_up.get(), listen_remote_address, child_processes_inherit, &accept_socket, &accept_error); - char connect_remote_address[64]; - snprintf(connect_remote_address, sizeof(connect_remote_address), "localhost:%u", port_predicate.GetValue()); - error = Socket::TcpConnect(connect_remote_address, child_processes_inherit, socket); - a_up->reset(socket); - socket = nullptr; + std::string connect_remote_address = get_connect_addr(*listen_socket_up); + std::unique_ptr<SocketType> connect_socket_up(new SocketType(child_processes_inherit, error)); + EXPECT_FALSE(error.Fail()); + error = connect_socket_up->Connect(connect_remote_address.c_str()); + EXPECT_FALSE(error.Fail()); + EXPECT_TRUE(connect_socket_up->IsValid()); + + a_up->swap(connect_socket_up); EXPECT_TRUE(error.Success()); EXPECT_NE(nullptr, a_up->get()); EXPECT_TRUE((*a_up)->IsValid()); accept_thread.join(); - b_up->reset(accept_socket); + b_up->reset(static_cast<SocketType*>(accept_socket)); EXPECT_TRUE(accept_error.Success()); EXPECT_NE(nullptr, b_up->get()); EXPECT_TRUE((*b_up)->IsValid()); @@ -124,25 +128,74 @@ TEST_F (SocketTest, DecodeHostAndPort) EXPECT_STREQ ("0", port_str.c_str ()); EXPECT_EQ (0, port); EXPECT_TRUE (error.Success ()); - } -TEST_F (SocketTest, Listen0ConnectAccept) +#ifndef LLDB_DISABLE_POSIX +TEST_F (SocketTest, DomainListenConnectAccept) { - std::unique_ptr<Socket> socket_a_up; - std::unique_ptr<Socket> socket_b_up; - CreateConnectedSockets (&socket_a_up, &socket_b_up); + char* file_name_str = tempnam(nullptr, nullptr); + EXPECT_NE (nullptr, file_name_str); + const std::string file_name(file_name_str); + free(file_name_str); + + std::unique_ptr<DomainSocket> socket_a_up; + std::unique_ptr<DomainSocket> socket_b_up; + CreateConnectedSockets<DomainSocket>(file_name.c_str(), + [=](const DomainSocket &) + { + return file_name; + }, + &socket_a_up, &socket_b_up); } +#endif -TEST_F (SocketTest, GetAddress) +TEST_F (SocketTest, TCPListen0ConnectAccept) { - std::unique_ptr<Socket> socket_a_up; - std::unique_ptr<Socket> socket_b_up; - CreateConnectedSockets (&socket_a_up, &socket_b_up); - + std::unique_ptr<TCPSocket> socket_a_up; + std::unique_ptr<TCPSocket> socket_b_up; + CreateConnectedSockets<TCPSocket>("127.0.0.1:0", + [=](const TCPSocket &s) + { + char connect_remote_address[64]; + snprintf(connect_remote_address, sizeof(connect_remote_address), "localhost:%u", s.GetLocalPortNumber()); + return std::string(connect_remote_address); + }, + &socket_a_up, &socket_b_up); +} + +TEST_F (SocketTest, TCPGetAddress) +{ + std::unique_ptr<TCPSocket> socket_a_up; + std::unique_ptr<TCPSocket> socket_b_up; + CreateConnectedSockets<TCPSocket>("127.0.0.1:0", + [=](const TCPSocket &s) + { + char connect_remote_address[64]; + snprintf(connect_remote_address, sizeof(connect_remote_address), "localhost:%u", s.GetLocalPortNumber()); + return std::string(connect_remote_address); + }, + &socket_a_up, + &socket_b_up); + EXPECT_EQ (socket_a_up->GetLocalPortNumber (), socket_b_up->GetRemotePortNumber ()); EXPECT_EQ (socket_b_up->GetLocalPortNumber (), socket_a_up->GetRemotePortNumber ()); EXPECT_NE (socket_a_up->GetLocalPortNumber (), socket_b_up->GetLocalPortNumber ()); EXPECT_STREQ ("127.0.0.1", socket_a_up->GetRemoteIPAddress ().c_str ()); EXPECT_STREQ ("127.0.0.1", socket_b_up->GetRemoteIPAddress ().c_str ()); } + +TEST_F (SocketTest, UDPConnect) +{ + Socket* socket_a; + Socket* socket_b; + + bool child_processes_inherit = false; + auto error = UDPSocket::Connect("127.0.0.1:0", child_processes_inherit, socket_a, socket_b); + + std::unique_ptr<Socket> a_up(socket_a); + std::unique_ptr<Socket> b_up(socket_b); + + EXPECT_TRUE(error.Success ()); + EXPECT_TRUE(a_up->IsValid()); + EXPECT_TRUE(b_up->IsValid()); +} |