// Copyright 2015 The Chromium OS 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 LIBBRILLO_BRILLO_STREAMS_MOCK_STREAM_H_
#define LIBBRILLO_BRILLO_STREAMS_MOCK_STREAM_H_

#include <gmock/gmock.h>

#include <brillo/streams/stream.h>

namespace brillo {

// Mock Stream implementation for testing.
class MockStream : public Stream {
 public:
  MockStream() = default;

  MOCK_METHOD(bool, IsOpen, (), (const, override));
  MOCK_METHOD(bool, CanRead, (), (const, override));
  MOCK_METHOD(bool, CanWrite, (), (const, override));
  MOCK_METHOD(bool, CanSeek, (), (const, override));
  MOCK_METHOD(bool, CanGetSize, (), (const, override));

  MOCK_METHOD(uint64_t, GetSize, (), (const, override));
  MOCK_METHOD(bool, SetSizeBlocking, (uint64_t, ErrorPtr*), (override));
  MOCK_METHOD(uint64_t, GetRemainingSize, (), (const, override));

  MOCK_METHOD(uint64_t, GetPosition, (), (const, override));
  MOCK_METHOD(bool, Seek, (int64_t, Whence, uint64_t*, ErrorPtr*), (override));

  MOCK_METHOD(bool,
              ReadAsync,
              (void*,
               size_t,
               const base::Callback<void(size_t)>&,
               const ErrorCallback&,
               ErrorPtr*),
              (override));
  MOCK_METHOD(
      bool,
      ReadAllAsync,
      (void*, size_t, const base::Closure&, const ErrorCallback&, ErrorPtr*),
      (override));
  MOCK_METHOD(bool,
              ReadNonBlocking,
              (void*, size_t, size_t*, bool*, ErrorPtr*),
              (override));
  MOCK_METHOD(bool,
              ReadBlocking,
              (void*, size_t, size_t*, ErrorPtr*),
              (override));
  MOCK_METHOD(bool, ReadAllBlocking, (void*, size_t, ErrorPtr*), (override));

  MOCK_METHOD(bool,
              WriteAsync,
              (const void*,
               size_t,
               const base::Callback<void(size_t)>&,
               const ErrorCallback&,
               ErrorPtr*),
              (override));
  MOCK_METHOD(bool,
              WriteAllAsync,
              (const void*,
               size_t,
               const base::Closure&,
               const ErrorCallback&,
               ErrorPtr*),
              (override));
  MOCK_METHOD(bool,
              WriteNonBlocking,
              (const void*, size_t, size_t*, ErrorPtr*),
              (override));
  MOCK_METHOD(bool,
              WriteBlocking,
              (const void*, size_t, size_t*, ErrorPtr*),
              (override));
  MOCK_METHOD(bool,
              WriteAllBlocking,
              (const void*, size_t, ErrorPtr*),
              (override));

  MOCK_METHOD(bool, FlushBlocking, (ErrorPtr*), (override));
  MOCK_METHOD(bool, CloseBlocking, (ErrorPtr*), (override));

  MOCK_METHOD(bool,
              WaitForData,
              (AccessMode, const base::Callback<void(AccessMode)>&, ErrorPtr*),
              (override));
  MOCK_METHOD(bool,
              WaitForDataBlocking,
              (AccessMode, base::TimeDelta, AccessMode*, ErrorPtr*),
              (override));

 private:
  DISALLOW_COPY_AND_ASSIGN(MockStream);
};

}  // namespace brillo

#endif  // LIBBRILLO_BRILLO_STREAMS_MOCK_STREAM_H_
