Index: net/base/socket_test_util.cc |
=================================================================== |
--- net/base/socket_test_util.cc (revision 18948) |
+++ net/base/socket_test_util.cc (working copy) |
@@ -1,379 +0,0 @@ |
-// Copyright (c) 2009 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/base/socket_test_util.h" |
- |
-#include "base/basictypes.h" |
-#include "base/compiler_specific.h" |
-#include "base/message_loop.h" |
-#include "net/base/io_buffer.h" |
-#include "net/base/socket.h" |
-#include "net/base/ssl_client_socket.h" |
-#include "net/base/ssl_info.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace { |
- |
-class MockClientSocket : public net::SSLClientSocket { |
- public: |
- MockClientSocket(); |
- |
- // ClientSocket methods: |
- virtual int Connect(net::CompletionCallback* callback) = 0; |
- |
- // SSLClientSocket methods: |
- virtual void GetSSLInfo(net::SSLInfo* ssl_info); |
- virtual void GetSSLCertRequestInfo( |
- net::SSLCertRequestInfo* cert_request_info); |
- virtual void Disconnect(); |
- virtual bool IsConnected() const; |
- virtual bool IsConnectedAndIdle() const; |
- |
- // Socket methods: |
- virtual int Read(net::IOBuffer* buf, int buf_len, |
- net::CompletionCallback* callback) = 0; |
- virtual int Write(net::IOBuffer* buf, int buf_len, |
- net::CompletionCallback* callback) = 0; |
- |
-#if defined(OS_LINUX) |
- virtual int GetPeerName(struct sockaddr *name, socklen_t *namelen); |
-#endif |
- |
- protected: |
- void RunCallbackAsync(net::CompletionCallback* callback, int result); |
- void RunCallback(int result); |
- |
- ScopedRunnableMethodFactory<MockClientSocket> method_factory_; |
- net::CompletionCallback* callback_; |
- bool connected_; |
-}; |
- |
-class MockTCPClientSocket : public MockClientSocket { |
- public: |
- MockTCPClientSocket(const net::AddressList& addresses, |
- net::MockSocket* socket); |
- |
- // ClientSocket methods: |
- virtual int Connect(net::CompletionCallback* callback); |
- |
- // Socket methods: |
- virtual int Read(net::IOBuffer* buf, int buf_len, |
- net::CompletionCallback* callback); |
- virtual int Write(net::IOBuffer* buf, int buf_len, |
- net::CompletionCallback* callback); |
- |
- private: |
- net::MockSocket* data_; |
- int read_offset_; |
- net::MockRead* read_data_; |
- bool need_read_data_; |
-}; |
- |
-class MockSSLClientSocket : public MockClientSocket { |
- public: |
- MockSSLClientSocket( |
- net::ClientSocket* transport_socket, |
- const std::string& hostname, |
- const net::SSLConfig& ssl_config, |
- net::MockSSLSocket* socket); |
- ~MockSSLClientSocket(); |
- |
- virtual void GetSSLInfo(net::SSLInfo* ssl_info); |
- |
- virtual int Connect(net::CompletionCallback* callback); |
- virtual void Disconnect(); |
- |
- // Socket methods: |
- virtual int Read(net::IOBuffer* buf, int buf_len, |
- net::CompletionCallback* callback); |
- virtual int Write(net::IOBuffer* buf, int buf_len, |
- net::CompletionCallback* callback); |
- |
- private: |
- class ConnectCallback; |
- |
- scoped_ptr<ClientSocket> transport_; |
- net::MockSSLSocket* data_; |
-}; |
- |
-MockClientSocket::MockClientSocket() |
- : ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)), |
- callback_(NULL), |
- connected_(false) { |
-} |
- |
-void MockClientSocket::GetSSLInfo(net::SSLInfo* ssl_info) { |
- NOTREACHED(); |
-} |
- |
-void MockClientSocket::GetSSLCertRequestInfo( |
- net::SSLCertRequestInfo* cert_request_info) { |
- NOTREACHED(); |
-} |
- |
-void MockClientSocket::Disconnect() { |
- connected_ = false; |
- callback_ = NULL; |
-} |
- |
-bool MockClientSocket::IsConnected() const { |
- return connected_; |
-} |
- |
-bool MockClientSocket::IsConnectedAndIdle() const { |
- return connected_; |
-} |
- |
-#if defined(OS_LINUX) |
-int MockClientSocket::GetPeerName(struct sockaddr *name, socklen_t *namelen) { |
- memset(reinterpret_cast<char *>(name), 0, *namelen); |
- return net::OK; |
-} |
-#endif // defined(OS_LINUX) |
- |
-void MockClientSocket::RunCallbackAsync(net::CompletionCallback* callback, |
- int result) { |
- callback_ = callback; |
- MessageLoop::current()->PostTask(FROM_HERE, |
- method_factory_.NewRunnableMethod( |
- &MockClientSocket::RunCallback, result)); |
-} |
- |
-void MockClientSocket::RunCallback(int result) { |
- net::CompletionCallback* c = callback_; |
- callback_ = NULL; |
- if (c) |
- c->Run(result); |
-} |
- |
-MockTCPClientSocket::MockTCPClientSocket(const net::AddressList& addresses, |
- net::MockSocket* socket) |
- : data_(socket), |
- read_offset_(0), |
- read_data_(NULL), |
- need_read_data_(true) { |
- DCHECK(data_); |
- data_->Reset(); |
-} |
- |
-int MockTCPClientSocket::Connect(net::CompletionCallback* callback) { |
- DCHECK(!callback_); |
- if (connected_) |
- return net::OK; |
- connected_ = true; |
- if (data_->connect_data().async) { |
- RunCallbackAsync(callback, data_->connect_data().result); |
- return net::ERR_IO_PENDING; |
- } |
- return data_->connect_data().result; |
-} |
- |
-int MockTCPClientSocket::Read(net::IOBuffer* buf, int buf_len, |
- net::CompletionCallback* callback) { |
- DCHECK(!callback_); |
- if (need_read_data_) { |
- read_data_ = data_->GetNextRead(); |
- need_read_data_ = false; |
- } |
- int result = read_data_->result; |
- if (read_data_->data) { |
- if (read_data_->data_len - read_offset_ > 0) { |
- result = std::min(buf_len, read_data_->data_len - read_offset_); |
- memcpy(buf->data(), read_data_->data + read_offset_, result); |
- read_offset_ += result; |
- if (read_offset_ == read_data_->data_len) { |
- need_read_data_ = true; |
- read_offset_ = 0; |
- } |
- } else { |
- result = 0; // EOF |
- } |
- } |
- if (read_data_->async) { |
- RunCallbackAsync(callback, result); |
- return net::ERR_IO_PENDING; |
- } |
- return result; |
-} |
- |
-int MockTCPClientSocket::Write(net::IOBuffer* buf, int buf_len, |
- net::CompletionCallback* callback) { |
- DCHECK(buf); |
- DCHECK(buf_len > 0); |
- DCHECK(!callback_); |
- |
- std::string data(buf->data(), buf_len); |
- net::MockWriteResult write_result = data_->OnWrite(data); |
- |
- if (write_result.async) { |
- RunCallbackAsync(callback, write_result.result); |
- return net::ERR_IO_PENDING; |
- } |
- return write_result.result; |
-} |
- |
-class MockSSLClientSocket::ConnectCallback : |
- public net::CompletionCallbackImpl<MockSSLClientSocket::ConnectCallback> { |
- public: |
- ConnectCallback(MockSSLClientSocket *ssl_client_socket, |
- net::CompletionCallback* user_callback, |
- int rv) |
- : ALLOW_THIS_IN_INITIALIZER_LIST( |
- net::CompletionCallbackImpl<MockSSLClientSocket::ConnectCallback>( |
- this, &ConnectCallback::Wrapper)), |
- ssl_client_socket_(ssl_client_socket), |
- user_callback_(user_callback), |
- rv_(rv) { |
- } |
- |
- private: |
- void Wrapper(int rv) { |
- if (rv_ == net::OK) |
- ssl_client_socket_->connected_ = true; |
- user_callback_->Run(rv_); |
- delete this; |
- } |
- |
- MockSSLClientSocket* ssl_client_socket_; |
- net::CompletionCallback* user_callback_; |
- int rv_; |
-}; |
- |
-MockSSLClientSocket::MockSSLClientSocket( |
- net::ClientSocket* transport_socket, |
- const std::string& hostname, |
- const net::SSLConfig& ssl_config, |
- net::MockSSLSocket* socket) |
- : transport_(transport_socket), |
- data_(socket) { |
- DCHECK(data_); |
-} |
- |
-MockSSLClientSocket::~MockSSLClientSocket() { |
- Disconnect(); |
-} |
- |
-void MockSSLClientSocket::GetSSLInfo(net::SSLInfo* ssl_info) { |
- ssl_info->Reset(); |
-} |
- |
-int MockSSLClientSocket::Connect(net::CompletionCallback* callback) { |
- DCHECK(!callback_); |
- ConnectCallback* connect_callback = new ConnectCallback( |
- this, callback, data_->connect.result); |
- int rv = transport_->Connect(connect_callback); |
- if (rv == net::OK) { |
- delete connect_callback; |
- if (data_->connect.async) { |
- RunCallbackAsync(callback, data_->connect.result); |
- return net::ERR_IO_PENDING; |
- } |
- if (data_->connect.result == net::OK) |
- connected_ = true; |
- return data_->connect.result; |
- } |
- return rv; |
-} |
- |
-void MockSSLClientSocket::Disconnect() { |
- MockClientSocket::Disconnect(); |
- if (transport_ != NULL) |
- transport_->Disconnect(); |
-} |
- |
-int MockSSLClientSocket::Read(net::IOBuffer* buf, int buf_len, |
- net::CompletionCallback* callback) { |
- DCHECK(!callback_); |
- return transport_->Read(buf, buf_len, callback); |
-} |
- |
-int MockSSLClientSocket::Write(net::IOBuffer* buf, int buf_len, |
- net::CompletionCallback* callback) { |
- DCHECK(!callback_); |
- return transport_->Write(buf, buf_len, callback); |
-} |
- |
-} // namespace |
- |
-namespace net { |
- |
-MockRead* StaticMockSocket::GetNextRead() { |
- return &reads_[read_index_++]; |
-} |
- |
-MockWriteResult StaticMockSocket::OnWrite(const std::string& data) { |
- if (!writes_) { |
- // Not using mock writes; succeed synchronously. |
- return MockWriteResult(false, data.length()); |
- } |
- |
- // Check that what we are writing matches the expectation. |
- // Then give the mocked return value. |
- net::MockWrite* w = &writes_[write_index_++]; |
- int result = w->result; |
- if (w->data) { |
- std::string expected_data(w->data, w->data_len); |
- EXPECT_EQ(expected_data, data); |
- if (expected_data != data) |
- return MockWriteResult(false, net::ERR_UNEXPECTED); |
- if (result == net::OK) |
- result = w->data_len; |
- } |
- return MockWriteResult(w->async, result); |
-} |
- |
-void StaticMockSocket::Reset() { |
- read_index_ = 0; |
- write_index_ = 0; |
-} |
- |
-DynamicMockSocket::DynamicMockSocket() |
- : read_(false, ERR_UNEXPECTED), |
- has_read_(false) { |
-} |
- |
-MockRead* DynamicMockSocket::GetNextRead() { |
- if (!has_read_) |
- return unexpected_read(); |
- has_read_ = false; |
- return &read_; |
-} |
- |
-void DynamicMockSocket::Reset() { |
- has_read_ = false; |
-} |
- |
-void DynamicMockSocket::SimulateRead(const char* data) { |
- EXPECT_FALSE(has_read_) << "Unconsumed read: " << read_.data; |
- read_ = MockRead(data); |
- has_read_ = true; |
-} |
- |
-void MockClientSocketFactory::AddMockSocket(MockSocket* socket) { |
- mock_sockets_.Add(socket); |
-} |
- |
-void MockClientSocketFactory::AddMockSSLSocket(MockSSLSocket* socket) { |
- mock_ssl_sockets_.Add(socket); |
-} |
- |
-void MockClientSocketFactory::ResetNextMockIndexes() { |
- mock_sockets_.ResetNextIndex(); |
- mock_ssl_sockets_.ResetNextIndex(); |
-} |
- |
-ClientSocket* MockClientSocketFactory::CreateTCPClientSocket( |
- const AddressList& addresses) { |
- return new MockTCPClientSocket(addresses, mock_sockets_.GetNext()); |
-} |
- |
-SSLClientSocket* MockClientSocketFactory::CreateSSLClientSocket( |
- ClientSocket* transport_socket, |
- const std::string& hostname, |
- const SSLConfig& ssl_config) { |
- return new MockSSLClientSocket(transport_socket, hostname, ssl_config, |
- mock_ssl_sockets_.GetNext()); |
-} |
- |
-} // namespace net |