| // 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 |