brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · 8cb4599 Raw
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