// Copyright 2015 The Weave 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 <weave/test/fake_stream.h>

#include <base/bind.h>
#include <gtest/gtest.h>
#include <weave/provider/task_runner.h>

namespace weave {
namespace test {

FakeStream::FakeStream(provider::TaskRunner* task_runner)
    : task_runner_{task_runner} {}
FakeStream::FakeStream(provider::TaskRunner* task_runner,
                       const std::string& read_data)
    : task_runner_{task_runner}, read_data_{read_data} {}

void FakeStream::CancelPendingOperations() {}

void FakeStream::ExpectWritePacketString(base::TimeDelta,
                                         const std::string& data) {
  write_data_ += data;
}

void FakeStream::AddReadPacketString(base::TimeDelta, const std::string& data) {
  read_data_ += data;
}

void FakeStream::Read(void* buffer,
                      size_t size_to_read,
                      const ReadCallback& callback) {
  if (read_data_.empty()) {
    task_runner_->PostDelayedTask(
        FROM_HERE, base::Bind(&FakeStream::Read, base::Unretained(this), buffer,
                              size_to_read, callback),
        base::TimeDelta::FromSeconds(0));
    return;
  }
  size_t size = std::min(size_to_read, read_data_.size());
  memcpy(buffer, read_data_.data(), size);
  read_data_ = read_data_.substr(size);
  task_runner_->PostDelayedTask(FROM_HERE, base::Bind(callback, size, nullptr),
                                base::TimeDelta::FromSeconds(0));
}

void FakeStream::Write(const void* buffer,
                       size_t size_to_write,
                       const WriteCallback& callback) {
  size_t size = std::min(size_to_write, write_data_.size());
  EXPECT_EQ(
      write_data_.substr(0, size),
      std::string(reinterpret_cast<const char*>(buffer), size_to_write));
  write_data_ = write_data_.substr(size);
  task_runner_->PostDelayedTask(FROM_HERE, base::Bind(callback, nullptr),
                                base::TimeDelta::FromSeconds(0));
}

}  // namespace test
}  // namespace weave
