Files
clang-p2996/lldb/unittests/tools/lldb-server/tests/TestClient.h
Pavel Labath 9a9556f07d Fix TestStopReplyContainsThreadPcs on 32-bit x86 (pr36013)
Summary:
The issue was that we were parsing the registers into 64-bit integers
and the calling swapByteOrder without regard for the actual size of the
register. This switches the test to use the RegisterValue class which
tracks the register size, and knows how to initialize itself from a
piece of memory (so we don't need to swap byte order ourselves).

Reviewers: eugene, davide

Subscribers: lldb-commits

Differential Revision: https://reviews.llvm.org/D43376

llvm-svn: 325511
2018-02-19 15:42:48 +00:00

113 lines
4.2 KiB
C++

//===-- TestClient.h --------------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef LLDB_SERVER_TESTS_TESTCLIENT_H
#define LLDB_SERVER_TESTS_TESTCLIENT_H
#include "MessageObjects.h"
#include "Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.h"
#include "lldb/Target/ProcessLaunchInfo.h"
#include "lldb/Utility/ArchSpec.h"
#include "lldb/Utility/Connection.h"
#include "llvm/ADT/Optional.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/FormatVariadic.h"
#include <memory>
#include <string>
#if LLDB_SERVER_IS_DEBUGSERVER
#define LLGS_TEST(x) DISABLED_ ## x
#define DS_TEST(x) x
#else
#define LLGS_TEST(x) x
#define DS_TEST(x) DISABLED_ ## x
#endif
namespace llgs_tests {
class TestClient
: public lldb_private::process_gdb_remote::GDBRemoteCommunicationClient {
public:
static bool IsDebugServer() { return LLDB_SERVER_IS_DEBUGSERVER; }
static bool IsLldbServer() { return !IsDebugServer(); }
/// Launches the server, connects it to the client and returns the client. If
/// Log is non-empty, the server will write it's log to this file.
static llvm::Expected<std::unique_ptr<TestClient>> launch(llvm::StringRef Log);
/// Launches the server, while specifying the inferior on its command line.
/// When the client connects, it already has a process ready.
static llvm::Expected<std::unique_ptr<TestClient>>
launch(llvm::StringRef Log, llvm::ArrayRef<llvm::StringRef> InferiorArgs);
/// Allows user to pass additional arguments to the server. Be careful when
/// using this for generic tests, as the two stubs have different
/// command-line interfaces.
static llvm::Expected<std::unique_ptr<TestClient>>
launchCustom(llvm::StringRef Log, llvm::ArrayRef<llvm::StringRef> ServerArgs, llvm::ArrayRef<llvm::StringRef> InferiorArgs);
~TestClient() override;
llvm::Error SetInferior(llvm::ArrayRef<std::string> inferior_args);
llvm::Error ListThreadsInStopReply();
llvm::Error SetBreakpoint(unsigned long address);
llvm::Error ContinueAll();
llvm::Error ContinueThread(unsigned long thread_id);
const ProcessInfo &GetProcessInfo();
llvm::Expected<JThreadsInfo> GetJThreadsInfo();
const StopReply &GetLatestStopReply();
template <typename T> llvm::Expected<const T &> GetLatestStopReplyAs() {
assert(m_stop_reply);
if (const auto *Reply = llvm::dyn_cast<T>(m_stop_reply.get()))
return *Reply;
return llvm::make_error<llvm::StringError>(
llvm::formatv("Unexpected Stop Reply {0}", m_stop_reply->getKind()),
llvm::inconvertibleErrorCode());
}
llvm::Error SendMessage(llvm::StringRef message);
llvm::Error SendMessage(llvm::StringRef message,
std::string &response_string);
llvm::Error SendMessage(llvm::StringRef message, std::string &response_string,
PacketResult expected_result);
template <typename P, typename... CreateArgs>
llvm::Expected<typename P::result_type> SendMessage(llvm::StringRef Message,
CreateArgs &&... Args);
unsigned int GetPcRegisterId();
private:
TestClient(std::unique_ptr<lldb_private::Connection> Conn);
llvm::Error qProcessInfo();
llvm::Error qRegisterInfos();
llvm::Error queryProcess();
llvm::Error Continue(llvm::StringRef message);
std::string FormatFailedResult(
const std::string &message,
lldb_private::process_gdb_remote::GDBRemoteCommunication::PacketResult
result);
llvm::Optional<ProcessInfo> m_process_info;
std::unique_ptr<StopReply> m_stop_reply;
std::vector<lldb_private::RegisterInfo> m_register_infos;
unsigned int m_pc_register = LLDB_INVALID_REGNUM;
};
template <typename P, typename... CreateArgs>
llvm::Expected<typename P::result_type>
TestClient::SendMessage(llvm::StringRef Message, CreateArgs &&... Args) {
std::string ResponseText;
if (llvm::Error E = SendMessage(Message, ResponseText))
return std::move(E);
return P::create(ResponseText, std::forward<CreateArgs>(Args)...);
}
} // namespace llgs_tests
#endif // LLDB_SERVER_TESTS_TESTCLIENT_H