summaryrefslogtreecommitdiffstats
path: root/lldb/unittests/Host/SocketTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/unittests/Host/SocketTest.cpp')
-rw-r--r--lldb/unittests/Host/SocketTest.cpp115
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());
+}
OpenPOWER on IntegriCloud