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

Reply via email to