139 lines · cpp
1//===-- TestBase.cpp ------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "TestBase.h"10#include "DAPLog.h"11#include "TestingSupport/TestUtilities.h"12#include "lldb/API/SBDefines.h"13#include "lldb/API/SBStructuredData.h"14#include "lldb/Host/MainLoop.h"15#include "lldb/Host/Pipe.h"16#include "llvm/ADT/StringRef.h"17#include "llvm/Support/Error.h"18#include "llvm/Testing/Support/Error.h"19#include "gtest/gtest.h"20#include <cstdio>21#include <memory>22#include <system_error>23 24using namespace llvm;25using namespace lldb;26using namespace lldb_dap;27using namespace lldb_dap::protocol;28using namespace lldb_dap_tests;29using lldb_private::File;30using lldb_private::FileSpec;31using lldb_private::FileSystem;32using lldb_private::MainLoop;33using lldb_private::Pipe;34 35void TransportBase::SetUp() {36 std::tie(to_client, to_server) = TestDAPTransport::createPair();37 38 std::error_code EC;39 log = std::make_unique<Log>("-", EC);40 dap = std::make_unique<DAP>(41 /*log=*/log.get(),42 /*default_repl_mode=*/ReplMode::Auto,43 /*pre_init_commands=*/std::vector<std::string>(),44 /*no_lldbinit=*/false,45 /*client_name=*/"test_client",46 /*transport=*/*to_client, /*loop=*/loop);47 48 auto server_handle = to_server->RegisterMessageHandler(loop, *dap);49 EXPECT_THAT_EXPECTED(server_handle, Succeeded());50 handles[0] = std::move(*server_handle);51 52 auto client_handle = to_client->RegisterMessageHandler(loop, client);53 EXPECT_THAT_EXPECTED(client_handle, Succeeded());54 handles[1] = std::move(*client_handle);55}56 57void TransportBase::Run() {58 bool addition_succeeded = loop.AddPendingCallback(59 [](lldb_private::MainLoopBase &loop) { loop.RequestTermination(); });60 EXPECT_TRUE(addition_succeeded);61 EXPECT_THAT_ERROR(loop.Run().takeError(), llvm::Succeeded());62}63 64void DAPTestBase::SetUp() { TransportBase::SetUp(); }65 66void DAPTestBase::TearDown() {67 if (core)68 ASSERT_THAT_ERROR(core->discard(), Succeeded());69 if (binary)70 ASSERT_THAT_ERROR(binary->discard(), Succeeded());71}72 73void DAPTestBase::SetUpTestSuite() {74 lldb::SBError error = SBDebugger::InitializeWithErrorHandling();75 EXPECT_TRUE(error.Success());76}77void DAPTestBase::TeatUpTestSuite() { SBDebugger::Terminate(); }78 79bool DAPTestBase::GetDebuggerSupportsTarget(StringRef platform) {80 EXPECT_TRUE(dap->debugger);81 82 lldb::SBStructuredData data = dap->debugger.GetBuildConfiguration()83 .GetValueForKey("targets")84 .GetValueForKey("value");85 for (size_t i = 0; i < data.GetSize(); i++) {86 char buf[100] = {0};87 size_t size = data.GetItemAtIndex(i).GetStringValue(buf, sizeof(buf));88 if (StringRef(buf, size) == platform)89 return true;90 }91 92 return false;93}94 95void DAPTestBase::CreateDebugger() {96 dap->debugger = lldb::SBDebugger::Create();97 ASSERT_TRUE(dap->debugger);98 dap->target = dap->debugger.GetDummyTarget();99 100 Expected<lldb::FileUP> dev_null = FileSystem::Instance().Open(101 FileSpec(FileSystem::DEV_NULL), File::eOpenOptionReadWrite);102 ASSERT_THAT_EXPECTED(dev_null, Succeeded());103 lldb::FileSP dev_null_sp = std::move(*dev_null);104 105 std::FILE *dev_null_stream = dev_null_sp->GetStream();106 ASSERT_THAT_ERROR(dap->ConfigureIO(dev_null_stream, dev_null_stream),107 Succeeded());108 109 dap->debugger.SetInputFile(dap->in);110 auto out_fd = dap->out.GetWriteFileDescriptor();111 ASSERT_THAT_EXPECTED(out_fd, Succeeded());112 dap->debugger.SetOutputFile(lldb::SBFile(*out_fd, "w", false));113 auto err_fd = dap->out.GetWriteFileDescriptor();114 ASSERT_THAT_EXPECTED(err_fd, Succeeded());115 dap->debugger.SetErrorFile(lldb::SBFile(*err_fd, "w", false));116}117 118void DAPTestBase::LoadCore() {119 ASSERT_TRUE(dap->debugger);120 llvm::Expected<lldb_private::TestFile> binary_yaml =121 lldb_private::TestFile::fromYamlFile(k_linux_binary);122 ASSERT_THAT_EXPECTED(binary_yaml, Succeeded());123 llvm::Expected<llvm::sys::fs::TempFile> binary_file =124 binary_yaml->writeToTemporaryFile();125 ASSERT_THAT_EXPECTED(binary_file, Succeeded());126 binary = std::move(*binary_file);127 dap->target = dap->debugger.CreateTarget(binary->TmpName.data());128 ASSERT_TRUE(dap->target);129 llvm::Expected<lldb_private::TestFile> core_yaml =130 lldb_private::TestFile::fromYamlFile(k_linux_core);131 ASSERT_THAT_EXPECTED(core_yaml, Succeeded());132 llvm::Expected<llvm::sys::fs::TempFile> core_file =133 core_yaml->writeToTemporaryFile();134 ASSERT_THAT_EXPECTED(core_file, Succeeded());135 this->core = std::move(*core_file);136 SBProcess process = dap->target.LoadCore(this->core->TmpName.data());137 ASSERT_TRUE(process);138}139