//===-- 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
