brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.8 KiB · bacf8ca Raw
113 lines · c
1//===----------------------------------------------------------------------===//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#ifndef LLDB_UNITTESTS_TESTINGSUPPORT_HOST_JSONTRANSPORTTESTUTILITIES_H10#define LLDB_UNITTESTS_TESTINGSUPPORT_HOST_JSONTRANSPORTTESTUTILITIES_H11 12#include "lldb/Host/FileSystem.h"13#include "lldb/Host/JSONTransport.h"14#include "lldb/Host/MainLoop.h"15#include "lldb/Utility/FileSpec.h"16#include "llvm/Support/raw_ostream.h"17#include "llvm/Testing/Support/Error.h"18#include "gmock/gmock.h"19#include "gtest/gtest.h"20#include <cstddef>21#include <memory>22#include <utility>23 24template <typename Proto>25class TestTransport final26    : public lldb_private::transport::JSONTransport<Proto> {27public:28  using MessageHandler =29      typename lldb_private::transport::JSONTransport<Proto>::MessageHandler;30 31  static std::pair<std::unique_ptr<TestTransport<Proto>>,32                   std::unique_ptr<TestTransport<Proto>>>33  createPair() {34    std::unique_ptr<TestTransport<Proto>> transports[2] = {35        std::make_unique<TestTransport<Proto>>(),36        std::make_unique<TestTransport<Proto>>()};37    return std::make_pair(std::move(transports[0]), std::move(transports[1]));38  }39 40  explicit TestTransport() {41    llvm::Expected<lldb::FileUP> dummy_file =42        lldb_private::FileSystem::Instance().Open(43            lldb_private::FileSpec(lldb_private::FileSystem::DEV_NULL),44            lldb_private::File::eOpenOptionReadWrite);45    EXPECT_THAT_EXPECTED(dummy_file, llvm::Succeeded());46    m_dummy_file = std::move(*dummy_file);47  }48 49  llvm::Error Send(const typename Proto::Evt &evt) override {50    EXPECT_TRUE(m_loop && m_handler)51        << "Send called before RegisterMessageHandler";52    m_loop->AddPendingCallback([this, evt](lldb_private::MainLoopBase &) {53      m_handler->Received(evt);54    });55    return llvm::Error::success();56  }57 58  llvm::Error Send(const typename Proto::Req &req) override {59    EXPECT_TRUE(m_loop && m_handler)60        << "Send called before RegisterMessageHandler";61    m_loop->AddPendingCallback([this, req](lldb_private::MainLoopBase &) {62      m_handler->Received(req);63    });64    return llvm::Error::success();65  }66 67  llvm::Error Send(const typename Proto::Resp &resp) override {68    EXPECT_TRUE(m_loop && m_handler)69        << "Send called before RegisterMessageHandler";70    m_loop->AddPendingCallback([this, resp](lldb_private::MainLoopBase &) {71      m_handler->Received(resp);72    });73    return llvm::Error::success();74  }75 76  llvm::Expected<lldb_private::MainLoop::ReadHandleUP>77  RegisterMessageHandler(lldb_private::MainLoop &loop,78                         MessageHandler &handler) override {79    if (!m_loop)80      m_loop = &loop;81    if (!m_handler)82      m_handler = &handler;83    lldb_private::Status status;84    auto handle = loop.RegisterReadObject(85        m_dummy_file, [](lldb_private::MainLoopBase &) {}, status);86    if (status.Fail())87      return status.takeError();88    return handle;89  }90 91protected:92  void Log(llvm::StringRef message) override {};93 94private:95  lldb_private::MainLoop *m_loop = nullptr;96  MessageHandler *m_handler = nullptr;97  // Dummy file for registering with the MainLoop.98  lldb::FileSP m_dummy_file = nullptr;99};100 101template <typename Proto>102class MockMessageHandler final103    : public lldb_private::transport::JSONTransport<Proto>::MessageHandler {104public:105  MOCK_METHOD(void, Received, (const typename Proto::Req &), (override));106  MOCK_METHOD(void, Received, (const typename Proto::Resp &), (override));107  MOCK_METHOD(void, Received, (const typename Proto::Evt &), (override));108  MOCK_METHOD(void, OnError, (llvm::Error), (override));109  MOCK_METHOD(void, OnClosed, (), (override));110};111 112#endif113