https://github.com/ashgti created https://github.com/llvm/llvm-project/pull/140738
This allows us to have a SBTarget and SBProcess for creating unit tests. >From ac49fd8160b358a809be627502e1c03ad9cde08a Mon Sep 17 00:00:00 2001 From: John Harrison <harj...@google.com> Date: Tue, 20 May 2025 07:34:02 -0700 Subject: [PATCH] [lldb-dap] In DAP unit tests, add helpers for loading a CoreFile. This allows us to have a SBTarget and SBProcess for creating unit tests. --- lldb/tools/lldb-dap/Protocol/ProtocolBase.h | 5 ++ lldb/unittests/DAP/CMakeLists.txt | 8 ++++ lldb/unittests/DAP/Handler/DisconnectTest.cpp | 32 ++++++++++++- lldb/unittests/DAP/Inputs/linux-x86_64.core | Bin 0 -> 49152 bytes lldb/unittests/DAP/Inputs/linux-x86_64.out | Bin 0 -> 2575 bytes lldb/unittests/DAP/TestBase.cpp | 44 ++++++++++++++++++ lldb/unittests/DAP/TestBase.h | 19 ++++++++ 7 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 lldb/unittests/DAP/Inputs/linux-x86_64.core create mode 100755 lldb/unittests/DAP/Inputs/linux-x86_64.out diff --git a/lldb/tools/lldb-dap/Protocol/ProtocolBase.h b/lldb/tools/lldb-dap/Protocol/ProtocolBase.h index 1cb9cb13dd0da..724da59b50cd2 100644 --- a/lldb/tools/lldb-dap/Protocol/ProtocolBase.h +++ b/lldb/tools/lldb-dap/Protocol/ProtocolBase.h @@ -141,6 +141,11 @@ using Message = std::variant<Request, Response, Event>; bool fromJSON(const llvm::json::Value &, Message &, llvm::json::Path); llvm::json::Value toJSON(const Message &); +inline llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Message &V) { + OS << toJSON(V); + return OS; +} + /// On error (whenever `success` is false), the body can provide more details. struct ErrorResponseBody { /// A structured error message. diff --git a/lldb/unittests/DAP/CMakeLists.txt b/lldb/unittests/DAP/CMakeLists.txt index cd421401f167b..16a3c2b736ee6 100644 --- a/lldb/unittests/DAP/CMakeLists.txt +++ b/lldb/unittests/DAP/CMakeLists.txt @@ -10,8 +10,16 @@ add_lldb_unittest(DAPTests VariablesTest.cpp LINK_LIBS + liblldb lldbDAP + lldbUtilityHelpers LLVMTestingSupport LINK_COMPONENTS Support ) + +set(test_inputs + linux-x86_64.out + linux-x86_64.core + ) +add_unittest_inputs(DAPTests "${test_inputs}") diff --git a/lldb/unittests/DAP/Handler/DisconnectTest.cpp b/lldb/unittests/DAP/Handler/DisconnectTest.cpp index 6f3470239e974..73e0f84f93af3 100644 --- a/lldb/unittests/DAP/Handler/DisconnectTest.cpp +++ b/lldb/unittests/DAP/Handler/DisconnectTest.cpp @@ -10,7 +10,10 @@ #include "Handler/RequestHandler.h" #include "Protocol/ProtocolBase.h" #include "TestBase.h" +#include "lldb/API/SBDefines.h" +#include "lldb/lldb-enumerations.h" #include "llvm/Testing/Support/Error.h" +#include "gmock/gmock.h" #include "gtest/gtest.h" #include <memory> #include <optional> @@ -23,7 +26,7 @@ using namespace lldb_dap::protocol; class DisconnectRequestHandlerTest : public DAPTestBase {}; -TEST_F(DisconnectRequestHandlerTest, DisconnectingTriggersTerminated) { +TEST_F(DisconnectRequestHandlerTest, DisconnectTriggersTerminated) { DisconnectRequestHandler handler(*dap); EXPECT_FALSE(dap->disconnecting); ASSERT_THAT_ERROR(handler.Run(std::nullopt), Succeeded()); @@ -31,5 +34,30 @@ TEST_F(DisconnectRequestHandlerTest, DisconnectingTriggersTerminated) { std::vector<Message> messages = DrainOutput(); EXPECT_THAT(messages, testing::Contains(testing::VariantWith<Event>(testing::FieldsAre( - /*event=*/"terminated", /*body=*/std::nullopt)))); + /*event=*/"terminated", /*body=*/testing::_)))); +} + +TEST_F(DisconnectRequestHandlerTest, DisconnectTriggersTerminateCommands) { + CreateDebugger(); + + if (!GetDebuggerSupportsTarget("X86")) + GTEST_SKIP() << "Unsupported platform"; + + LoadCore(DAPTestBase::k_linux_binary, DAPTestBase::k_linux_core); + + DisconnectRequestHandler handler(*dap); + + EXPECT_FALSE(dap->disconnecting); + dap->configuration.terminateCommands = {"?script print(1)", + "script print(2)"}; + EXPECT_EQ(dap->target.GetProcess().GetState(), lldb::eStateStopped); + ASSERT_THAT_ERROR(handler.Run(std::nullopt), Succeeded()); + EXPECT_TRUE(dap->disconnecting); + std::vector<Message> messages = DrainOutput(); + EXPECT_THAT(messages, testing::ElementsAre( + OutputMatcher("Running terminateCommands:\n"), + OutputMatcher("(lldb) script print(2)\n"), + OutputMatcher("2\n"), + testing::VariantWith<Event>(testing::FieldsAre( + /*event=*/"terminated", /*body=*/testing::_)))); } diff --git a/lldb/unittests/DAP/Inputs/linux-x86_64.core b/lldb/unittests/DAP/Inputs/linux-x86_64.core new file mode 100644 index 0000000000000000000000000000000000000000..2675eadd6a7f6c5d89f038c58941ae8af8cae4f5 GIT binary patch literal 49152 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 J1U^Ox`~gNvINbmM literal 0 HcmV?d00001 diff --git a/lldb/unittests/DAP/Inputs/linux-x86_64.out b/lldb/unittests/DAP/Inputs/linux-x86_64.out new file mode 100755 index 0000000000000000000000000000000000000000..842402fd519d285dd21fd5b1a4040446121a161c GIT binary patch literal 2575 zcmbtVO>7%Q6n?WC$98^Pr)fo_fMnF7HVCg1WL2Ti#9-1Gr9v&LQ4X|b*WTC`@fxjn zQHokP1W{Q%Kre8KICAF51(1l;DmQK%aSxGv=%I)UQV-_6`LWkqr>ewA^X9$p{ms1j z`*Q8_C5<sqO@kF6>0OrNke~pM$G9l5WzZo9(=fqpBLfw3IVp*;BSWhZAjS0*j(V3% zH0C&`#xoLEBiT~BdgxWg1^ZkyDXqx=1a=+!`ujy-e_i`=?1p`N^_wSq4`=SQPyG8! zqgZGk7TUMF_t$z>;qF@ZK4h-%b8z=jiWG&m-$CV8;cl^u2Ax9t&)y#g$|Q-Z(yvok zxZfyg_xE0}cd$<^Hp)$nef|Nkog|x|ipIXh+PsJu^{>$QBpJM&NPey5r^m0Lfz-W) z<4x3`4(e|V^dBL93-vDr^_xP!p3h%Mohw?t<N2wqv20}1ulrnD`eG?-EM^x33a_EF zMgf4*0?<0B6*+yHJVHopN{r1S&!R|Hv5#`pEYk(Xl!`BueD-XldV*L+tafj6>=H2j z6V5jw5+iP$jc?)*-D);5&C7CPyc!6zy`PbaAW<1aM+8mxk!ts@P{_Cn86z-Gb{L&J zC$1u4)9S$UA`-GkZpV}xuo?DBVs=tb%qM2p@o4e|3~ewyc46|($+L3=<xYM7&K%W3 zkKl9&e{WVhg;mOeFcV_r7)+uDmvsi26^w{W3rG4+M2ekcXL-nY1juE=V5@T?w#tc? zI9n>b1~hlZo+PG`@;i+Oj6uV!J4P8**y5VngW25;f9ao%gQeY#Lrp^mtJ!SWuCgYH zE=npd&POWU@O;O<ShXG7t(Q?W-E!^X&hq*6`D`j(g-i|IGux(RdbNyaw>&7dJk#}{ zT*JKwqjj_4nHG+oE5@4QoTg_RRmV3hzrI~b*DGLn_KpXJT`O(5X2S-f+-x*#2ce2> z`PGu?noiYjDY5QsH5G4KmTP~er0u$c-ogpfi5mPbI*;CT(#2H?zFQ)!daqOx^=>KI zK!%<~^@geKm?98c__|40D3NBd6Q=UlSPmtCnl#+u(twD|JdjtACDX+L#JP_2UkKq6 z=02oa$F8uTX<SYy95-zH;Sv6CNdL#dpd)Op5g55F=tKd25JR7a^M8t(Fh<4?q<_Be zDVVVBErbaRuX93f^z|eBRh${r%Tz;_Rq20c2z`346i4lS&~#C5^iML;6e{UmRr`<c z5N~m$qw;r1fh{A3K2`JX1J7V|tc?1<gJwF;Se^4>T*q^p3qqXN<;N0M=nx4*(q7%B zVYSY0>M%x<-ml8AP6t_p08Hy2gTH$Lh_h5zEwC>2rBU4p5C2l+G%8LK@#AP8{(kU# sfh6rz@?+!%?KHBZ@K=w(`|mkE!t{U2N4Zq8S}n!f71J}JWIGl350{SxdH?_b literal 0 HcmV?d00001 diff --git a/lldb/unittests/DAP/TestBase.cpp b/lldb/unittests/DAP/TestBase.cpp index eb146cb2fa9f4..1c58c351776ec 100644 --- a/lldb/unittests/DAP/TestBase.cpp +++ b/lldb/unittests/DAP/TestBase.cpp @@ -8,9 +8,16 @@ #include "TestBase.h" #include "Protocol/ProtocolBase.h" +#include "TestingSupport/TestUtilities.h" +#include "lldb/API/SBDefines.h" +#include "lldb/API/SBStructuredData.h" #include "lldb/Host/File.h" #include "lldb/Host/Pipe.h" +#include "lldb/lldb-forward.h" +#include "llvm/ADT/StringRef.h" #include "llvm/Testing/Support/Error.h" +#include "gtest/gtest.h" +#include <memory> using namespace llvm; using namespace lldb; @@ -55,6 +62,43 @@ void DAPTestBase::SetUp() { /*transport=*/*to_dap); } +void DAPTestBase::SetUpTestSuite() { + lldb::SBError error = SBDebugger::InitializeWithErrorHandling(); + EXPECT_TRUE(error.Success()); +} +void DAPTestBase::TeatUpTestSuite() { SBDebugger::Terminate(); } + +bool DAPTestBase::GetDebuggerSupportsTarget(llvm::StringRef platform) { + EXPECT_TRUE(dap->debugger); + + lldb::SBStructuredData data = dap->debugger.GetBuildConfiguration() + .GetValueForKey("targets") + .GetValueForKey("value"); + for (size_t i = 0; i < data.GetSize(); i++) { + char buf[100] = {0}; + size_t size = data.GetItemAtIndex(i).GetStringValue(buf, sizeof(buf)); + if (llvm::StringRef(buf, size) == platform) + return true; + } + + return false; +} + +void DAPTestBase::CreateDebugger() { + dap->debugger = lldb::SBDebugger::Create(); + ASSERT_TRUE(dap->debugger); +} + +void DAPTestBase::LoadCore(llvm::StringRef binary, llvm::StringRef core) { + ASSERT_TRUE(dap->debugger); + dap->target = + dap->debugger.CreateTarget(lldb_private::GetInputFilePath(binary).data()); + ASSERT_TRUE(dap->target); + SBProcess process = + dap->target.LoadCore(lldb_private::GetInputFilePath(core).data()); + ASSERT_TRUE(process); +} + std::vector<Message> DAPTestBase::DrainOutput() { std::vector<Message> msgs; output.CloseWriteFileDescriptor(); diff --git a/lldb/unittests/DAP/TestBase.h b/lldb/unittests/DAP/TestBase.h index c789adf53c225..c6c261fa2b64c 100644 --- a/lldb/unittests/DAP/TestBase.h +++ b/lldb/unittests/DAP/TestBase.h @@ -10,6 +10,8 @@ #include "Protocol/ProtocolBase.h" #include "Transport.h" #include "lldb/Host/Pipe.h" +#include "llvm/ADT/StringRef.h" +#include "gmock/gmock.h" #include "gtest/gtest.h" namespace lldb_dap_tests { @@ -33,13 +35,30 @@ class TransportBase : public PipeBase { void SetUp() override; }; +/// Matches an "output" event. +inline auto OutputMatcher(const llvm::StringRef output, + const llvm::StringRef category = "console") { + return testing::VariantWith<lldb_dap::protocol::Event>(testing::FieldsAre( + /*event=*/"output", /*body=*/testing::Optional<llvm::json::Value>( + llvm::json::Object{{"category", category}, {"output", output}}))); +} + /// A base class for tests that interact with a `lldb_dap::DAP` instance. class DAPTestBase : public TransportBase { protected: std::unique_ptr<lldb_dap::DAP> dap; + static constexpr llvm::StringLiteral k_linux_binary = "linux-x86_64.out"; + static constexpr llvm::StringLiteral k_linux_core = "linux-x86_64.core"; + + static void SetUpTestSuite(); + static void TeatUpTestSuite(); void SetUp() override; + bool GetDebuggerSupportsTarget(llvm::StringRef platform); + void CreateDebugger(); + void LoadCore(llvm::StringRef binary, llvm::StringRef core); + /// Closes the DAP output pipe and returns the remaining protocol messages in /// the buffer. std::vector<lldb_dap::protocol::Message> DrainOutput(); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits