Author: John Harrison Date: 2025-05-14T10:00:01-07:00 New Revision: 441d382f9350c1345555c958244f252c00923824
URL: https://github.com/llvm/llvm-project/commit/441d382f9350c1345555c958244f252c00923824 DIFF: https://github.com/llvm/llvm-project/commit/441d382f9350c1345555c958244f252c00923824.diff LOG: [lldb-dap] Adding unit tests for Transport. (#139926) This adds basic support for testing the Transport class and includes tests for 'Read' and 'Write'. Added: lldb/unittests/DAP/TransportTest.cpp Modified: lldb/unittests/DAP/CMakeLists.txt Removed: ################################################################################ diff --git a/lldb/unittests/DAP/CMakeLists.txt b/lldb/unittests/DAP/CMakeLists.txt index 8b240654046e2..110733e93b192 100644 --- a/lldb/unittests/DAP/CMakeLists.txt +++ b/lldb/unittests/DAP/CMakeLists.txt @@ -1,6 +1,7 @@ add_lldb_unittest(DAPTests JSONUtilsTest.cpp LLDBUtilsTest.cpp + TransportTest.cpp ProtocolTypesTest.cpp LINK_LIBS diff --git a/lldb/unittests/DAP/TransportTest.cpp b/lldb/unittests/DAP/TransportTest.cpp new file mode 100644 index 0000000000000..5c77b4bb26343 --- /dev/null +++ b/lldb/unittests/DAP/TransportTest.cpp @@ -0,0 +1,98 @@ +//===-- TransportTest.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 "Transport.h" +#include "Protocol/ProtocolBase.h" +#include "lldb/Host/File.h" +#include "lldb/Host/Pipe.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/Support/FormatVariadic.h" +#include "llvm/Testing/Support/Error.h" +#include "gtest/gtest.h" +#include <chrono> +#include <memory> +#include <optional> + +using namespace llvm; +using namespace lldb; +using namespace lldb_dap; +using namespace lldb_dap::protocol; +using lldb_private::File; +using lldb_private::NativeFile; +using lldb_private::Pipe; + +class TransportTest : public testing::Test { +protected: + Pipe input; + Pipe output; + std::unique_ptr<Transport> transport; + + void SetUp() override { + ASSERT_THAT_ERROR(input.CreateNew(false).ToError(), Succeeded()); + ASSERT_THAT_ERROR(output.CreateNew(false).ToError(), Succeeded()); + transport = std::make_unique<Transport>( + "stdio", nullptr, + std::make_shared<NativeFile>(input.GetReadFileDescriptor(), + File::eOpenOptionReadOnly, + NativeFile::Unowned), + std::make_shared<NativeFile>(output.GetWriteFileDescriptor(), + File::eOpenOptionWriteOnly, + NativeFile::Unowned)); + } + + void Write(StringRef json) { + std::string message = + formatv("Content-Length: {0}\r\n\r\n{1}", json.size(), json).str(); + ASSERT_THAT_EXPECTED(input.Write(message.data(), message.size()), + Succeeded()); + } +}; + +TEST_F(TransportTest, MalformedRequests) { + std::string malformed_header = "COnTent-LenGth: -1{}\r\n\r\nnotjosn"; + ASSERT_THAT_EXPECTED( + input.Write(malformed_header.data(), malformed_header.size()), + Succeeded()); + ASSERT_THAT_EXPECTED( + transport->Read(std::chrono::milliseconds(1)), + FailedWithMessage( + "expected 'Content-Length: ' and got 'COnTent-LenGth: '")); +} + +TEST_F(TransportTest, Read) { + Write(R"json({"seq": 1, "type": "request", "command": "abc"})json"); + ASSERT_THAT_EXPECTED( + transport->Read(std::chrono::milliseconds(1)), + HasValue(testing::VariantWith<Request>(testing::FieldsAre( + /*seq=*/1, /*command=*/"abc", /*arguments=*/std::nullopt)))); +} + +TEST_F(TransportTest, ReadWithTimeout) { + ASSERT_THAT_EXPECTED(transport->Read(std::chrono::milliseconds(1)), + Failed<TimeoutError>()); +} + +TEST_F(TransportTest, ReadWithEOF) { + input.CloseWriteFileDescriptor(); + ASSERT_THAT_EXPECTED(transport->Read(std::chrono::milliseconds(1)), + Failed<EndOfFileError>()); +} + +TEST_F(TransportTest, Write) { + ASSERT_THAT_ERROR(transport->Write(Event{"my-event", std::nullopt}), + Succeeded()); + output.CloseWriteFileDescriptor(); + char buf[1024]; + Expected<size_t> bytes_read = + output.Read(buf, sizeof(buf), std::chrono::milliseconds(1)); + ASSERT_THAT_EXPECTED(bytes_read, Succeeded()); + ASSERT_EQ( + StringRef(buf, *bytes_read), + StringRef("Content-Length: 43\r\n\r\n" + R"json({"event":"my-event","seq":0,"type":"event"})json")); +} _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits