Extract FakeStream into a separate file This can be used in unit tests elsewhere outside of XMPP channel. Change-Id: Id54cede355e4c07fe5bb39ab13c99f866ebd0057 Reviewed-on: https://weave-review.googlesource.com/1172 Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/libweave/Android.mk b/libweave/Android.mk index 215e13f..ac1185d 100644 --- a/libweave/Android.mk +++ b/libweave/Android.mk
@@ -147,6 +147,7 @@ LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include LOCAL_SRC_FILES := \ + src/test/fake_stream.cc \ src/test/mock_command.cc \ src/test/mock_http_client.cc \ src/test/mock_task_runner.cc \
diff --git a/libweave/include/weave/test/fake_stream.h b/libweave/include/weave/test/fake_stream.h new file mode 100644 index 0000000..3c21571 --- /dev/null +++ b/libweave/include/weave/test/fake_stream.h
@@ -0,0 +1,48 @@ +// 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 LIBWEAVE_INCLUDE_WEAVE_TEST_FAKE_STREAM_H_ +#define LIBWEAVE_INCLUDE_WEAVE_TEST_FAKE_STREAM_H_ + +#include <weave/stream.h> + +#include <string> + +#include <base/time/time.h> +#include <gmock/gmock.h> + +namespace weave { + +class TaskRunner; + +namespace test { + +class FakeStream : public Stream { + public: + explicit FakeStream(TaskRunner* task_runner); + FakeStream(TaskRunner* task_runner, const std::string& read_data); + + void ExpectWritePacketString(base::TimeDelta, const std::string& data); + void AddReadPacketString(base::TimeDelta, const std::string& data); + + void CancelPendingOperations() override; + void Read(void* buffer, + size_t size_to_read, + const ReadSuccessCallback& success_callback, + const ErrorCallback& error_callback) override; + void Write(const void* buffer, + size_t size_to_write, + const SuccessCallback& success_callback, + const ErrorCallback& error_callback) override; + + private: + TaskRunner* task_runner_{nullptr}; + std::string write_data_; + std::string read_data_; +}; + +} // namespace test +} // namespace weave + +#endif // LIBWEAVE_INCLUDE_WEAVE_TEST_FAKE_STREAM_H_
diff --git a/libweave/libweave.gypi b/libweave/libweave.gypi index 3eb64f3..544e127 100644 --- a/libweave/libweave.gypi +++ b/libweave/libweave.gypi
@@ -53,6 +53,7 @@ 'third_party/modp_b64/modp_b64.cc', ], 'weave_test_sources': [ + 'src/test/fake_stream.cc', 'src/test/mock_command.cc', 'src/test/mock_http_client.cc', 'src/test/mock_task_runner.cc',
diff --git a/libweave/src/notification/xmpp_channel_unittest.cc b/libweave/src/notification/xmpp_channel_unittest.cc index da555e0..a6992e9 100644 --- a/libweave/src/notification/xmpp_channel_unittest.cc +++ b/libweave/src/notification/xmpp_channel_unittest.cc
@@ -8,6 +8,7 @@ #include <queue> #include <gtest/gtest.h> +#include <weave/test/fake_stream.h> #include <weave/test/mock_network_provider.h> #include <weave/test/mock_task_runner.h> @@ -79,64 +80,12 @@ } // namespace -class FakeStream : public Stream { - public: - explicit FakeStream(TaskRunner* task_runner) : task_runner_{task_runner} {} - - void CancelPendingOperations() override {} - - void ExpectWritePacketString(base::TimeDelta, const std::string& data) { - write_data_ += data; - } - - void AddReadPacketString(base::TimeDelta, const std::string& data) { - read_data_ += data; - } - - void Read(void* buffer, - size_t size_to_read, - const ReadSuccessCallback& success_callback, - const ErrorCallback& error_callback) override { - if (read_data_.empty()) { - task_runner_->PostDelayedTask( - FROM_HERE, - base::Bind(&FakeStream::Read, base::Unretained(this), buffer, - size_to_read, success_callback, error_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(success_callback, size), - base::TimeDelta::FromSeconds(0)); - } - - void Write(const void* buffer, - size_t size_to_write, - const SuccessCallback& success_callback, - const ErrorCallback& error_callback) override { - 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, success_callback, - base::TimeDelta::FromSeconds(0)); - } - - private: - TaskRunner* task_runner_{nullptr}; - std::string write_data_; - std::string read_data_; -}; - class FakeXmppChannel : public XmppChannel { public: explicit FakeXmppChannel(TaskRunner* task_runner, weave::NetworkProvider* network) : XmppChannel{kAccountName, kAccessToken, task_runner, network}, - stream_{new FakeStream{task_runner_}}, + stream_{new test::FakeStream{task_runner_}}, fake_stream_{stream_.get()} {} void Connect( @@ -158,8 +107,8 @@ fake_stream_->AddReadPacketString(delta, data); } - std::unique_ptr<FakeStream> stream_; - FakeStream* fake_stream_{nullptr}; + std::unique_ptr<test::FakeStream> stream_; + test::FakeStream* fake_stream_{nullptr}; }; class MockNetworkProvider : public weave::test::MockNetworkProvider {
diff --git a/libweave/src/test/fake_stream.cc b/libweave/src/test/fake_stream.cc new file mode 100644 index 0000000..5adf462 --- /dev/null +++ b/libweave/src/test/fake_stream.cc
@@ -0,0 +1,62 @@ +// 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. + +#include <weave/test/fake_stream.h> + +#include <base/bind.h> +#include <gtest/gtest.h> +#include <weave/task_runner.h> + +namespace weave { +namespace test { + +FakeStream::FakeStream(TaskRunner* task_runner) : task_runner_{task_runner} {} +FakeStream::FakeStream(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 ReadSuccessCallback& success_callback, + const ErrorCallback& error_callback) { + if (read_data_.empty()) { + task_runner_->PostDelayedTask( + FROM_HERE, + base::Bind(&FakeStream::Read, base::Unretained(this), buffer, + size_to_read, success_callback, error_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(success_callback, size), + base::TimeDelta::FromSeconds(0)); +} + +void FakeStream::Write(const void* buffer, + size_t size_to_write, + const SuccessCallback& success_callback, + const ErrorCallback& error_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, success_callback, + base::TimeDelta::FromSeconds(0)); +} + +} // namespace test +} // namespace weave