//===-- GDBRemoteCommunicationServerTest.cpp ------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "gmock/gmock.h"
#include "gtest/gtest.h"

#include "GDBRemoteTestUtils.h"

#include "Plugins/Process/gdb-remote/GDBRemoteCommunicationServer.h"
#include "lldb/Utility/Connection.h"

namespace lldb_private {
namespace process_gdb_remote {

TEST(GDBRemoteCommunicationServerTest, SendErrorResponse_ErrorNumber) {
  MockServerWithMockConnection server;
  server.SendErrorResponse(0x42);

  EXPECT_THAT(server.GetPackets(), testing::ElementsAre("$E42#ab"));
}

TEST(GDBRemoteCommunicationServerTest, SendErrorResponse_Status) {
  MockServerWithMockConnection server;
  Status status;

  status.SetError(0x42, lldb::eErrorTypeGeneric);
  status.SetErrorString("Test error message");
  server.SendErrorResponse(status);

  EXPECT_THAT(
      server.GetPackets(),
      testing::ElementsAre("$E42;54657374206572726f72206d657373616765#ad"));
}

TEST(GDBRemoteCommunicationServerTest, SendErrorResponse_UnimplementedError) {
  MockServerWithMockConnection server;

  auto error =
      llvm::make_error<PacketUnimplementedError>("Test unimplemented error");
  server.SendErrorResponse(std::move(error));

  EXPECT_THAT(server.GetPackets(), testing::ElementsAre("$#00"));
}

TEST(GDBRemoteCommunicationServerTest, SendErrorResponse_StringError) {
  MockServerWithMockConnection server;

  auto error = llvm::createStringError(llvm::inconvertibleErrorCode(),
                                       "String error test");
  server.SendErrorResponse(std::move(error));

  EXPECT_THAT(
      server.GetPackets(),
      testing::ElementsAre("$Eff;537472696e67206572726f722074657374#b0"));
}

TEST(GDBRemoteCommunicationServerTest, SendErrorResponse_ErrorList) {
  MockServerWithMockConnection server;

  auto error = llvm::joinErrors(llvm::make_error<PacketUnimplementedError>(),
                                llvm::make_error<PacketUnimplementedError>());

  server.SendErrorResponse(std::move(error));
  // Make sure only one packet is sent even when there are multiple errors.
  EXPECT_EQ(server.GetPackets().size(), 1UL);
}

} // namespace process_gdb_remote
} // namespace lldb_private
