| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_DEVELOPER_DEBUG_ZXDB_DEBUG_ADAPTER_CONTEXT_TEST_H_ |
| #define SRC_DEVELOPER_DEBUG_ZXDB_DEBUG_ADAPTER_CONTEXT_TEST_H_ |
| |
| #include <memory> |
| |
| #include "src/developer/debug/shared/test_stream_buffer.h" |
| #include "src/developer/debug/zxdb/client/remote_api_test.h" |
| #include "src/developer/debug/zxdb/debug_adapter/context.h" |
| |
| namespace zxdb { |
| |
| class Process; |
| class Thread; |
| |
| // Test class that uses two StreamBuffer to create a two-way pipe. |
| class TestPipe { |
| public: |
| TestPipe() = default; |
| ~TestPipe() = default; |
| |
| debug_ipc::StreamBuffer* end1() { return &end1_; } |
| const debug_ipc::StreamBuffer& end1() const { return end1_; } |
| |
| debug_ipc::StreamBuffer* end2() { return &end2_; } |
| const debug_ipc::StreamBuffer& end2() const { return end2_; } |
| |
| class PipeWriter : public debug_ipc::StreamBuffer::Writer { |
| public: |
| PipeWriter(debug_ipc::StreamBuffer& src, debug_ipc::StreamBuffer& sink) |
| : src_(src), sink_(sink) { |
| src_.set_writer(this); |
| } |
| |
| private: |
| // StreamBuffer::Writer implementation. |
| size_t ConsumeStreamBufferData(const char* data, size_t len) override { |
| sink_.AddReadData(std::vector<char>(data, data + len)); |
| return len; |
| } |
| debug_ipc::StreamBuffer& src_; |
| debug_ipc::StreamBuffer& sink_; |
| }; |
| |
| private: |
| debug_ipc::StreamBuffer end1_; |
| debug_ipc::StreamBuffer end2_; |
| PipeWriter end1_to_2{end1_, end2_}; |
| PipeWriter end2_to_1{end2_, end1_}; |
| |
| FXL_DISALLOW_COPY_AND_ASSIGN(TestPipe); |
| }; |
| |
| // Test harness that sets up a RemoteAPITest (mocked target by replacing IPC) with a |
| // DebugAdapterContext and a debug adapter client session using the cppdap library. |
| // |
| // DebugAdapterContext is connected to the client via TestPipe. |
| // Client session can be used to send requests to DebugAdapterContext: |
| // |
| // auto response = client().send(dap::InitializeRequest{}); |
| // |
| // And then invoke context() to process incoming request: |
| // |
| // context().OnStreamReadable(); |
| // |
| // Lastly invoke client() to receive the response: |
| // |
| // RunClient(); |
| // auto got = response.get(); |
| // |
| class DebugAdapterContextTest : public RemoteAPITest { |
| public: |
| // The IDs associated with the process/thread that are set up by default. |
| static constexpr uint64_t kProcessKoid = 875123541; |
| static constexpr uint64_t kThreadKoid = 19028730; |
| |
| DebugAdapterContext& context() { return *context_.get(); } |
| dap::Session& client() { return *client_.get(); } |
| |
| void RunClient() { |
| if (auto payload = client_->getPayload()) { |
| payload(); |
| } |
| } |
| |
| // Helper method to set up debug adapter session between client and server. |
| void InitializeDebugging(); |
| |
| // testing::Test implementation. |
| void SetUp() override; |
| void TearDown() override; |
| |
| private: |
| std::unique_ptr<DebugAdapterContext> context_; |
| std::unique_ptr<dap::Session> client_; |
| TestPipe pipe_; |
| }; |
| |
| } // namespace zxdb |
| |
| #endif // SRC_DEVELOPER_DEBUG_ZXDB_DEBUG_ADAPTER_CONTEXT_TEST_H_ |