forked from OSchip/llvm-project
70 lines
2.0 KiB
C++
70 lines
2.0 KiB
C++
//===-- 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
|