https://github.com/JDevlieghere created 
https://github.com/llvm/llvm-project/pull/140480

None

>From 8cc54e7e1f2134e2e6352e4f572f3b0f9a3ce59f Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jo...@devlieghere.com>
Date: Sun, 18 May 2025 14:05:46 -0700
Subject: [PATCH] [lldb-dap] Add unit test for FifoFiles

---
 lldb/unittests/DAP/CMakeLists.txt    |   1 +
 lldb/unittests/DAP/FifoFilesTest.cpp | 102 +++++++++++++++++++++++++++
 2 files changed, 103 insertions(+)
 create mode 100644 lldb/unittests/DAP/FifoFilesTest.cpp

diff --git a/lldb/unittests/DAP/CMakeLists.txt 
b/lldb/unittests/DAP/CMakeLists.txt
index 429a12e9fb505..cd421401f167b 100644
--- a/lldb/unittests/DAP/CMakeLists.txt
+++ b/lldb/unittests/DAP/CMakeLists.txt
@@ -1,5 +1,6 @@
 add_lldb_unittest(DAPTests
   DAPTest.cpp
+  FifoFilesTest.cpp
   Handler/DisconnectTest.cpp
   JSONUtilsTest.cpp
   LLDBUtilsTest.cpp
diff --git a/lldb/unittests/DAP/FifoFilesTest.cpp 
b/lldb/unittests/DAP/FifoFilesTest.cpp
new file mode 100644
index 0000000000000..1b664fbb14010
--- /dev/null
+++ b/lldb/unittests/DAP/FifoFilesTest.cpp
@@ -0,0 +1,102 @@
+//===-- FifoFilesTest.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 "FifoFiles.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Testing/Support/Error.h"
+#include "gtest/gtest.h"
+#include <chrono>
+#include <thread>
+
+using namespace lldb_dap;
+using namespace llvm;
+
+namespace {
+
+std::string MakeTempFifoPath() {
+  llvm::SmallString<128> temp_path;
+  llvm::sys::fs::createUniquePath("lldb-dap-fifo-%%%%%%", temp_path,
+                                  /*MakeAbsolute=*/true);
+  return temp_path.str().str();
+}
+
+} // namespace
+
+TEST(FifoFilesTest, CreateAndDestroyFifoFile) {
+  std::string fifo_path = MakeTempFifoPath();
+  auto fifo = CreateFifoFile(fifo_path);
+  EXPECT_THAT_EXPECTED(fifo, llvm::Succeeded());
+
+  // File should exist and be a FIFO.
+  EXPECT_TRUE(llvm::sys::fs::exists(fifo_path));
+
+  // Destructor should remove the file.
+  fifo->reset();
+  EXPECT_FALSE(llvm::sys::fs::exists(fifo_path));
+}
+
+TEST(FifoFilesTest, SendAndReceiveJSON) {
+  std::string fifo_path = MakeTempFifoPath();
+  auto fifo = CreateFifoFile(fifo_path);
+  EXPECT_THAT_EXPECTED(fifo, llvm::Succeeded());
+
+  FifoFileIO writer(fifo_path, "writer");
+  FifoFileIO reader(fifo_path, "reader");
+
+  llvm::json::Object obj;
+  obj["foo"] = "bar";
+  obj["num"] = 42;
+
+  // Writer thread.
+  std::thread writer_thread([&]() {
+    EXPECT_THAT_ERROR(writer.SendJSON(llvm::json::Value(std::move(obj)),
+                                      std::chrono::milliseconds(500)),
+                      llvm::Succeeded());
+  });
+
+  // Reader thread.
+  std::thread reader_thread([&]() {
+    auto result = reader.ReadJSON(std::chrono::milliseconds(500));
+    EXPECT_THAT_EXPECTED(result, llvm::Succeeded());
+    auto *read_obj = result->getAsObject();
+
+    ASSERT_NE(read_obj, nullptr);
+    EXPECT_EQ((*read_obj)["foo"].getAsString(), "bar");
+    EXPECT_EQ((*read_obj)["num"].getAsInteger(), 42);
+  });
+
+  writer_thread.join();
+  reader_thread.join();
+}
+
+TEST(FifoFilesTest, ReadTimeout) {
+  std::string fifo_path = MakeTempFifoPath();
+  auto fifo = CreateFifoFile(fifo_path);
+  EXPECT_THAT_EXPECTED(fifo, llvm::Succeeded());
+
+  FifoFileIO reader(fifo_path, "reader");
+
+  // No writer, should timeout.
+  auto result = reader.ReadJSON(std::chrono::milliseconds(100));
+  EXPECT_THAT_EXPECTED(result, llvm::Failed());
+}
+
+TEST(FifoFilesTest, WriteTimeout) {
+  std::string fifo_path = MakeTempFifoPath();
+  auto fifo = CreateFifoFile(fifo_path);
+  EXPECT_THAT_EXPECTED(fifo, llvm::Succeeded());
+
+  FifoFileIO writer(fifo_path, "writer");
+
+  // No reader, should timeout.
+  llvm::json::Object obj;
+  obj["foo"] = "bar";
+  EXPECT_THAT_ERROR(writer.SendJSON(llvm::json::Value(std::move(obj)),
+                                    std::chrono::milliseconds(100)),
+                    llvm::Failed());
+}

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to