| //===-- GDBRemoteCommunicationTest.cpp --------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #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(Connect(client, server), llvm::Succeeded()); |
| } |
| |
| protected: |
| TestClient client; |
| MockServer server; |
| |
| bool Write(llvm::StringRef packet) { |
| ConnectionStatus status; |
| return server.Write(packet.data(), packet.size(), status, nullptr) == |
| packet.size(); |
| } |
| }; |
| } // end anonymous namespace |
| |
| TEST_F(GDBRemoteCommunicationTest, ReadPacket_checksum) { |
| struct TestCase { |
| llvm::StringLiteral Packet; |
| llvm::StringLiteral Payload; |
| }; |
| static constexpr TestCase Tests[] = { |
| {{"$#00"}, {""}}, |
| {{"$foobar#79"}, {"foobar"}}, |
| {{"$}}#fa"}, {"]"}}, |
| {{"$x*%#c7"}, {"xxxxxxxxx"}}, |
| }; |
| 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()); |
| } |
| } |