// Copyright 2015 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.

#include "net/filter/mock_source_stream.h"

#include <utility>

#include "base/logging.h"
#include "net/base/io_buffer.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace net {

MockSourceStream::MockSourceStream()
    : SourceStream(SourceStream::TYPE_NONE),
      read_one_byte_at_a_time_(false),
      awaiting_completion_(false),
      dest_buffer_(nullptr),
      dest_buffer_size_(0) {}

MockSourceStream::~MockSourceStream() {
  DCHECK(!awaiting_completion_);
  // All data should have been consumed.
  EXPECT_TRUE(results_.empty());
}

int MockSourceStream::Read(IOBuffer* dest_buffer,
                           int buffer_size,
                           CompletionOnceCallback callback) {
  DCHECK(!awaiting_completion_);
  DCHECK(!results_.empty());

  if (results_.empty())
    return ERR_UNEXPECTED;

  QueuedResult r = results_.front();
  DCHECK_GE(buffer_size, r.len);
  if (r.mode == ASYNC) {
    awaiting_completion_ = true;
    dest_buffer_ = dest_buffer;
    dest_buffer_size_ = buffer_size;
    callback_ = std::move(callback);
    return ERR_IO_PENDING;
  }

  results_.pop();
  memcpy(dest_buffer->data(), r.data, r.len);
  return r.error == OK ? r.len : r.error;
}

std::string MockSourceStream::Description() const {
  return "";
}

MockSourceStream::QueuedResult::QueuedResult(const char* data,
                                             int len,
                                             Error error,
                                             Mode mode)
    : data(data), len(len), error(error), mode(mode) {}

void MockSourceStream::AddReadResult(const char* data,
                                     int len,
                                     Error error,
                                     Mode mode) {
  if (error != OK) {
    // Doesn't make any sense to have both an error and data.
    DCHECK_EQ(len, 0);
  } else {
    // The read result must be between 0 and 32k (inclusive) because the read
    // buffer used in FilterSourceStream is 32k.
    DCHECK_GE(32 * 1024, len);
    DCHECK_LE(0, len);
  }

  if (len > 0 && read_one_byte_at_a_time_) {
    for (int i = 0; i < len; ++i) {
      QueuedResult result(data + i, 1, OK, mode);
      results_.push(result);
    }
    return;
  }

  QueuedResult result(data, len, error, mode);
  results_.push(result);
}

void MockSourceStream::CompleteNextRead() {
  DCHECK(awaiting_completion_);

  awaiting_completion_ = false;
  QueuedResult r = results_.front();
  DCHECK_EQ(ASYNC, r.mode);
  results_.pop();
  DCHECK_GE(dest_buffer_size_, r.len);
  memcpy(dest_buffer_->data(), r.data, r.len);
  dest_buffer_ = nullptr;
  std::move(callback_).Run(r.error == OK ? r.len : r.error);
}

}  // namespace net
