// Copyright 2018 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_SHARED_TEST_STREAM_BUFFER_H_
#define SRC_DEVELOPER_DEBUG_SHARED_TEST_STREAM_BUFFER_H_

#include <deque>

#include "src/developer/debug/shared/stream_buffer.h"
#include "src/lib/fxl/macros.h"

namespace debug {

// An implementation of StreamBuffer that provides the simplest-possible buffering to memory for
// test purposes.
//
// The stream buffer is bidirectional and has a buffer going both ways:
//
//   Writing to the stream buffer: stream().Write(...)
//   will come out in write_sink().
//
//   Reading from the stream buffer: stream().Read(...) or ...Peek();
//   data is provided by stream().AddReadData(...).
class TestStreamBuffer : public StreamBuffer::Writer {
 public:
  TestStreamBuffer();
  ~TestStreamBuffer();

  StreamBuffer& stream() { return stream_; }
  const StreamBuffer& stream() const { return stream_; }

  // Where data that is written to the stream buffer ends up. This emulates what would normally be
  // the system-specific destination (file, etc.).
  const std::deque<char>& write_sink() const { return write_sink_; }
  std::deque<char>& write_sink() { return write_sink_; }

 private:
  // StreamBuffer::Writer implementation.
  size_t ConsumeStreamBufferData(const char* data, size_t len) override;

  StreamBuffer stream_;

  std::deque<char> write_sink_;

  FXL_DISALLOW_COPY_AND_ASSIGN(TestStreamBuffer);
};

}  // namespace debug

#endif  // SRC_DEVELOPER_DEBUG_SHARED_TEST_STREAM_BUFFER_H_
