Index: net/socket/socket_test_util.cc |
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc |
index eb1599fa0fc0fb5b6c72d22b28bc0ed14d9d62fd..376d54222f9ae449b95c453d75ff529452761c51 100644 |
--- a/net/socket/socket_test_util.cc |
+++ b/net/socket/socket_test_util.cc |
@@ -738,12 +738,14 @@ MockTCPClientSocket::MockTCPClientSocket(const net::AddressList& addresses, |
peer_closed_connection_(false), |
pending_buf_(NULL), |
pending_buf_len_(0), |
- pending_callback_(NULL), |
+ old_pending_callback_(NULL), |
was_used_to_convey_data_(false) { |
DCHECK(data_); |
data_->Reset(); |
} |
+MockTCPClientSocket::~MockTCPClientSocket() {} |
+ |
int MockTCPClientSocket::Read(net::IOBuffer* buf, int buf_len, |
net::OldCompletionCallback* callback) { |
if (!connected_) |
@@ -755,7 +757,7 @@ int MockTCPClientSocket::Read(net::IOBuffer* buf, int buf_len, |
// Store our async IO data. |
pending_buf_ = buf; |
pending_buf_len_ = buf_len; |
- pending_callback_ = callback; |
+ old_pending_callback_ = callback; |
if (need_read_data_) { |
read_data_ = data_->GetNextRead(); |
@@ -776,6 +778,39 @@ int MockTCPClientSocket::Read(net::IOBuffer* buf, int buf_len, |
return CompleteRead(); |
} |
+int MockTCPClientSocket::Read(net::IOBuffer* buf, int buf_len, |
+ const net::CompletionCallback& callback) { |
+ if (!connected_) |
+ return net::ERR_UNEXPECTED; |
+ |
+ // If the buffer is already in use, a read is already in progress! |
+ DCHECK(pending_buf_ == NULL); |
+ |
+ // Store our async IO data. |
+ pending_buf_ = buf; |
+ pending_buf_len_ = buf_len; |
+ pending_callback_ = callback; |
+ |
+ if (need_read_data_) { |
+ read_data_ = data_->GetNextRead(); |
+ if (read_data_.result == ERR_TEST_PEER_CLOSE_AFTER_NEXT_MOCK_READ) { |
+ // This MockRead is just a marker to instruct us to set |
+ // peer_closed_connection_. Skip it and get the next one. |
+ read_data_ = data_->GetNextRead(); |
+ peer_closed_connection_ = true; |
+ } |
+ // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility |
+ // to complete the async IO manually later (via OnReadComplete). |
+ if (read_data_.result == ERR_IO_PENDING) { |
+ // We need to be using async IO in this case. |
+ DCHECK(!callback.is_null()); |
+ return ERR_IO_PENDING; |
+ } |
+ need_read_data_ = false; |
+ } |
+ |
+ return CompleteRead(); |
+} |
int MockTCPClientSocket::Write(net::IOBuffer* buf, int buf_len, |
net::OldCompletionCallback* callback) { |
@@ -825,7 +860,8 @@ int MockTCPClientSocket::Connect(const net::CompletionCallback& callback) { |
void MockTCPClientSocket::Disconnect() { |
MockClientSocket::Disconnect(); |
- pending_callback_ = NULL; |
+ old_pending_callback_ = NULL; |
+ pending_callback_.Reset(); |
} |
bool MockTCPClientSocket::IsConnected() const { |
@@ -876,9 +912,15 @@ void MockTCPClientSocket::OnReadComplete(const MockRead& data) { |
// let CompleteRead() schedule a callback. |
read_data_.async = false; |
- net::OldCompletionCallback* callback = pending_callback_; |
- int rv = CompleteRead(); |
- RunOldCallback(callback, rv); |
+ if (old_pending_callback_) { |
+ net::OldCompletionCallback* callback = old_pending_callback_; |
+ int rv = CompleteRead(); |
+ RunOldCallback(callback, rv); |
+ } else { |
+ net::CompletionCallback callback = pending_callback_; |
+ int rv = CompleteRead(); |
+ RunCallback(callback, rv); |
+ } |
} |
int MockTCPClientSocket::CompleteRead() { |
@@ -890,10 +932,12 @@ int MockTCPClientSocket::CompleteRead() { |
// Save the pending async IO data and reset our |pending_| state. |
net::IOBuffer* buf = pending_buf_; |
int buf_len = pending_buf_len_; |
- net::OldCompletionCallback* callback = pending_callback_; |
+ net::OldCompletionCallback* old_callback = old_pending_callback_; |
+ net::CompletionCallback callback = pending_callback_; |
pending_buf_ = NULL; |
pending_buf_len_ = 0; |
- pending_callback_ = NULL; |
+ old_pending_callback_ = NULL; |
+ pending_callback_.Reset(); |
int result = read_data_.result; |
DCHECK(result != ERR_IO_PENDING); |
@@ -914,8 +958,11 @@ int MockTCPClientSocket::CompleteRead() { |
} |
if (read_data_.async) { |
- DCHECK(callback); |
- RunCallbackAsync(callback, result); |
+ DCHECK(old_callback || !callback.is_null()); |
+ if (old_callback) |
+ RunCallbackAsync(old_callback, result); |
+ else |
+ RunCallbackAsync(callback, result); |
return net::ERR_IO_PENDING; |
} |
return result; |
@@ -931,7 +978,7 @@ DeterministicMockTCPClientSocket::DeterministicMockTCPClientSocket( |
read_buf_(NULL), |
read_buf_len_(0), |
read_pending_(false), |
- read_callback_(NULL), |
+ old_read_callback_(NULL), |
data_(data), |
was_used_to_convey_data_(false) {} |
@@ -965,7 +1012,10 @@ int DeterministicMockTCPClientSocket::CompleteRead() { |
if (read_pending_) { |
read_pending_ = false; |
- read_callback_->Run(result); |
+ if (old_read_callback_) |
+ old_read_callback_->Run(result); |
+ else |
+ read_callback_.Run(result); |
} |
return result; |
@@ -1007,11 +1057,34 @@ int DeterministicMockTCPClientSocket::Read( |
read_buf_ = buf; |
read_buf_len_ = buf_len; |
+ old_read_callback_ = callback; |
+ |
+ if (read_data_.async || (read_data_.result == ERR_IO_PENDING)) { |
+ read_pending_ = true; |
+ DCHECK(old_read_callback_); |
+ return ERR_IO_PENDING; |
+ } |
+ |
+ was_used_to_convey_data_ = true; |
+ return CompleteRead(); |
+} |
+int DeterministicMockTCPClientSocket::Read( |
+ net::IOBuffer* buf, int buf_len, const net::CompletionCallback& callback) { |
+ if (!connected_) |
+ return net::ERR_UNEXPECTED; |
+ |
+ read_data_ = data_->GetNextRead(); |
+ // The buffer should always be big enough to contain all the MockRead data. To |
+ // use small buffers, split the data into multiple MockReads. |
+ DCHECK_LE(read_data_.data_len, buf_len); |
+ |
+ read_buf_ = buf; |
+ read_buf_len_ = buf_len; |
read_callback_ = callback; |
if (read_data_.async || (read_data_.result == ERR_IO_PENDING)) { |
read_pending_ = true; |
- DCHECK(read_callback_); |
+ DCHECK(!read_callback_.is_null()); |
return ERR_IO_PENDING; |
} |
@@ -1153,6 +1226,10 @@ int MockSSLClientSocket::Read(net::IOBuffer* buf, int buf_len, |
net::OldCompletionCallback* callback) { |
return transport_->socket()->Read(buf, buf_len, callback); |
} |
+int MockSSLClientSocket::Read(net::IOBuffer* buf, int buf_len, |
+ const net::CompletionCallback& callback) { |
+ return transport_->socket()->Read(buf, buf_len, callback); |
+} |
int MockSSLClientSocket::Write(net::IOBuffer* buf, int buf_len, |
net::OldCompletionCallback* callback) { |
@@ -1265,7 +1342,7 @@ MockUDPClientSocket::MockUDPClientSocket(SocketDataProvider* data, |
need_read_data_(true), |
pending_buf_(NULL), |
pending_buf_len_(0), |
- pending_callback_(NULL), |
+ old_pending_callback_(NULL), |
net_log_(NetLog::Source(), net_log), |
ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) { |
DCHECK(data_); |
@@ -1285,7 +1362,7 @@ int MockUDPClientSocket::Read(net::IOBuffer* buf, int buf_len, |
// Store our async IO data. |
pending_buf_ = buf; |
pending_buf_len_ = buf_len; |
- pending_callback_ = callback; |
+ old_pending_callback_ = callback; |
if (need_read_data_) { |
read_data_ = data_->GetNextRead(); |
@@ -1300,6 +1377,33 @@ int MockUDPClientSocket::Read(net::IOBuffer* buf, int buf_len, |
return CompleteRead(); |
} |
+int MockUDPClientSocket::Read(net::IOBuffer* buf, int buf_len, |
+ const net::CompletionCallback& callback) { |
+ if (!connected_) |
+ return net::ERR_UNEXPECTED; |
+ |
+ // If the buffer is already in use, a read is already in progress! |
+ DCHECK(pending_buf_ == NULL); |
+ |
+ // Store our async IO data. |
+ pending_buf_ = buf; |
+ pending_buf_len_ = buf_len; |
+ pending_callback_ = callback; |
+ |
+ if (need_read_data_) { |
+ read_data_ = data_->GetNextRead(); |
+ // ERR_IO_PENDING means that the SocketDataProvider is taking responsibility |
+ // to complete the async IO manually later (via OnReadComplete). |
+ if (read_data_.result == ERR_IO_PENDING) { |
+ // We need to be using async IO in this case. |
+ DCHECK(!callback.is_null()); |
+ return ERR_IO_PENDING; |
+ } |
+ need_read_data_ = false; |
+ } |
+ |
+ return CompleteRead(); |
+} |
int MockUDPClientSocket::Write(net::IOBuffer* buf, int buf_len, |
net::OldCompletionCallback* callback) { |
@@ -1365,9 +1469,15 @@ void MockUDPClientSocket::OnReadComplete(const MockRead& data) { |
// let CompleteRead() schedule a callback. |
read_data_.async = false; |
- net::OldCompletionCallback* callback = pending_callback_; |
- int rv = CompleteRead(); |
- RunCallback(callback, rv); |
+ if (old_pending_callback_) { |
+ net::OldCompletionCallback* callback = old_pending_callback_; |
+ int rv = CompleteRead(); |
+ RunOldCallback(callback, rv); |
+ } else { |
+ net::CompletionCallback callback = pending_callback_; |
+ int rv = CompleteRead(); |
+ RunCallback(callback, rv); |
+ } |
} |
int MockUDPClientSocket::CompleteRead() { |
@@ -1377,10 +1487,13 @@ int MockUDPClientSocket::CompleteRead() { |
// Save the pending async IO data and reset our |pending_| state. |
net::IOBuffer* buf = pending_buf_; |
int buf_len = pending_buf_len_; |
- net::OldCompletionCallback* callback = pending_callback_; |
+ net::OldCompletionCallback* old_callback = old_pending_callback_; |
+ net::CompletionCallback callback = pending_callback_; |
pending_buf_ = NULL; |
pending_buf_len_ = 0; |
- pending_callback_ = NULL; |
+ old_pending_callback_ = NULL; |
+ pending_callback_.Reset(); |
+ pending_callback_.Reset(); |
int result = read_data_.result; |
DCHECK(result != ERR_IO_PENDING); |
@@ -1400,8 +1513,11 @@ int MockUDPClientSocket::CompleteRead() { |
} |
if (read_data_.async) { |
- DCHECK(callback); |
- RunCallbackAsync(callback, result); |
+ DCHECK(old_callback || !callback.is_null()); |
+ if (old_callback) |
+ RunCallbackAsync(old_callback, result); |
+ else |
+ RunCallbackAsync(callback, result); |
return net::ERR_IO_PENDING; |
} |
return result; |
@@ -1410,15 +1526,26 @@ int MockUDPClientSocket::CompleteRead() { |
void MockUDPClientSocket::RunCallbackAsync(net::OldCompletionCallback* callback, |
int result) { |
MessageLoop::current()->PostTask(FROM_HERE, |
+ base::Bind(&MockUDPClientSocket::RunOldCallback, |
+ weak_factory_.GetWeakPtr(), callback, result)); |
+} |
+void MockUDPClientSocket::RunCallbackAsync( |
+ const net::CompletionCallback& callback, int result) { |
+ MessageLoop::current()->PostTask(FROM_HERE, |
base::Bind(&MockUDPClientSocket::RunCallback, weak_factory_.GetWeakPtr(), |
callback, result)); |
} |
-void MockUDPClientSocket::RunCallback(net::OldCompletionCallback* callback, |
+void MockUDPClientSocket::RunOldCallback(net::OldCompletionCallback* callback, |
int result) { |
if (callback) |
callback->Run(result); |
} |
+void MockUDPClientSocket::RunCallback(const net::CompletionCallback& callback, |
+ int result) { |
+ if (!callback.is_null()) |
+ callback.Run(result); |
+} |
TestSocketRequest::TestSocketRequest( |
std::vector<TestSocketRequest*>* request_order, |