llvm-project/lldb/unittests/Process/gdb-remote/GDBRemoteCommunicationTest.cpp
Michał Górny 03b8f79048 [lldb] [gdb-remote] Use Communication::WriteAll() over Write()
Replace the uses of Communication::Write() with WriteAll() to avoid
partial writes.  None of the call sites actually accounted for that
possibility and even if it is unlikely to actually happen, there doesn't
seem to be any real harm from using WriteAll() instead.

Ideally, we'd remove Write() from the public API.  However, that would
change the API of SBCommunication.  The alternative would be to alias it
to WriteAll().

Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.llvm.org/D132395
2022-08-23 15:49:16 +02:00

72 lines
2.3 KiB
C++

//===-- GDBRemoteCommunicationTest.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 "GDBRemoteTestUtils.h"
#include "llvm/Testing/Support/Error.h"
using namespace lldb_private::process_gdb_remote;
using namespace lldb_private;
using namespace lldb;
typedef GDBRemoteCommunication::PacketResult PacketResult;
namespace {
class TestClient : public GDBRemoteCommunication {
public:
TestClient()
: GDBRemoteCommunication("test.client", "test.client.listener") {}
PacketResult ReadPacket(StringExtractorGDBRemote &response) {
return GDBRemoteCommunication::ReadPacket(response, std::chrono::seconds(1),
/*sync_on_timeout*/ false);
}
};
class GDBRemoteCommunicationTest : public GDBRemoteTest {
public:
void SetUp() override {
ASSERT_THAT_ERROR(GDBRemoteCommunication::ConnectLocally(client, server),
llvm::Succeeded());
}
protected:
TestClient client;
MockServer server;
bool Write(llvm::StringRef packet) {
ConnectionStatus status;
return server.WriteAll(packet.data(), packet.size(), status, nullptr) ==
packet.size();
}
};
} // end anonymous namespace
// Test that we can decode packets correctly. In particular, verify that
// checksum calculation works.
TEST_F(GDBRemoteCommunicationTest, ReadPacket) {
struct TestCase {
llvm::StringLiteral Packet;
llvm::StringLiteral Payload;
};
static constexpr TestCase Tests[] = {
{{"$#00"}, {""}},
{{"$foobar#79"}, {"foobar"}},
{{"$}]#da"}, {"}"}}, // Escaped }
{{"$x*%#c7"}, {"xxxxxxxxx"}}, // RLE
{{"+$#00"}, {""}}, // Spurious ACK
{{"-$#00"}, {""}}, // Spurious NAK
};
for (const auto &Test : Tests) {
SCOPED_TRACE(Test.Packet + " -> " + Test.Payload);
StringExtractorGDBRemote response;
ASSERT_TRUE(Write(Test.Packet));
ASSERT_EQ(PacketResult::Success, client.ReadPacket(response));
ASSERT_EQ(Test.Payload, response.GetStringRef());
ASSERT_EQ(PacketResult::Success, server.GetAck());
}
}