// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This file defines MockFileStream, a test class for FileStream.

#ifndef NET_BASE_MOCK_FILE_STREAM_H_
#define NET_BASE_MOCK_FILE_STREAM_H_

#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/file_path.h"
#include "net/base/file_stream.h"
#include "net/base/net_errors.h"

namespace net {

class IOBuffer;

namespace testing {

class MockFileStream : public net::FileStream {
 public:
  MockFileStream(net::NetLog* net_log)
      : net::FileStream(net_log), forced_error_(net::OK) {}

  MockFileStream(base::PlatformFile file, int flags, net::NetLog* net_log)
      : net::FileStream(file, flags, net_log), forced_error_(net::OK) {}

  // FileStream methods.
  virtual int OpenSync(const FilePath& path, int open_flags) override;
  virtual int Seek(net::Whence whence, int64 offset,
                   const Int64CompletionCallback& callback) override;
  virtual int64 SeekSync(net::Whence whence, int64 offset) override;
  virtual int64 Available() override;
  virtual int Read(IOBuffer* buf,
                   int buf_len,
                   const CompletionCallback& callback) override;
  virtual int ReadSync(char* buf, int buf_len) override;
  virtual int ReadUntilComplete(char *buf, int buf_len) override;
  virtual int Write(IOBuffer* buf,
                    int buf_len,
                    const CompletionCallback& callback) override;
  virtual int WriteSync(const char* buf, int buf_len) override;
  virtual int64 Truncate(int64 bytes) override;
  virtual int Flush(const CompletionCallback& callback) override;
  virtual int FlushSync() override;

  void set_forced_error(int error) { forced_error_ = error; }
  void clear_forced_error() { forced_error_ = net::OK; }
  int forced_error() const { return forced_error_; }
  const FilePath& get_path() const { return path_; }

 private:
  int ReturnError(int function_error) {
    if (forced_error_ != net::OK) {
      int ret = forced_error_;
      clear_forced_error();
      return ret;
    }

    return function_error;
  }

  int64 ReturnError64(int64 function_error) {
    if (forced_error_ != net::OK) {
      int64 ret = forced_error_;
      clear_forced_error();
      return ret;
    }

    return function_error;
  }

  int forced_error_;
  FilePath path_;
};

}  // namespace testing

}  // namespace net

#endif  // NET_BASE_MOCK_FILE_STREAM_H_
