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