blob: 3aee52e5332c944dddc4f5e540eaf87a748c0142 [file] [log] [blame]
//===-- GDBRemoteTestUtils.cpp ----------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#if defined(_MSC_VER) && (_HAS_EXCEPTIONS == 0)
// Workaround for MSVC standard library bug, which fails to include <thread> when
// exceptions are disabled.
#include <eh.h>
#endif
#include "GDBRemoteTestUtils.h"
#include "lldb/Host/common/TCPSocket.h"
#include "lldb/Host/posix/ConnectionFileDescriptorPosix.h"
#include <future>
namespace lldb_private
{
namespace process_gdb_remote
{
void
GDBRemoteTest::SetUpTestCase()
{
#if defined(_MSC_VER)
WSADATA data;
::WSAStartup(MAKEWORD(2, 2), &data);
#endif
}
void
GDBRemoteTest::TearDownTestCase()
{
#if defined(_MSC_VER)
::WSACleanup();
#endif
}
void
Connect(GDBRemoteCommunication &client, GDBRemoteCommunication &server)
{
bool child_processes_inherit = false;
Error error;
TCPSocket listen_socket(child_processes_inherit, error);
ASSERT_FALSE(error.Fail());
error = listen_socket.Listen("127.0.0.1:0", 5);
ASSERT_FALSE(error.Fail());
Socket *accept_socket;
std::future<Error> accept_error = std::async(std::launch::async, [&] {
return listen_socket.Accept("127.0.0.1:0", child_processes_inherit, accept_socket);
});
char connect_remote_address[64];
snprintf(connect_remote_address, sizeof(connect_remote_address), "connect://localhost:%u",
listen_socket.GetLocalPortNumber());
std::unique_ptr<ConnectionFileDescriptor> conn_ap(new ConnectionFileDescriptor());
ASSERT_EQ(conn_ap->Connect(connect_remote_address, nullptr), lldb::eConnectionStatusSuccess);
client.SetConnection(conn_ap.release());
ASSERT_TRUE(accept_error.get().Success());
server.SetConnection(new ConnectionFileDescriptor(accept_socket));
}
} // namespace process_gdb_remote
} // namespace lldb_private