Chromium Code Reviews| Index: net/socket/socket_test_util.cc |
| diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc |
| index 0dfeb4d57acbeab3f51fa12c19dc8414437c5b94..67c25a625f2a8859daaee55531dae5c9fd7a28b1 100644 |
| --- a/net/socket/socket_test_util.cc |
| +++ b/net/socket/socket_test_util.cc |
| @@ -737,7 +737,7 @@ 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(); |
| @@ -754,7 +754,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(); |
| @@ -775,6 +775,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) { |
| @@ -824,7 +857,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 { |
| @@ -875,9 +909,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() { |
| @@ -889,10 +929,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); |
| @@ -913,8 +955,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; |
| @@ -930,7 +975,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) {} |
| @@ -964,7 +1009,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; |
| @@ -1006,11 +1054,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; |
| } |
| @@ -1152,6 +1223,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) { |
| @@ -1263,7 +1338,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_); |
| @@ -1283,7 +1358,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(); |
| @@ -1298,6 +1373,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) { |
| @@ -1363,9 +1465,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() { |
| @@ -1375,10 +1483,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(); |
|
csilv
2011/12/07 00:03:48
kill this line
|
| int result = read_data_.result; |
| DCHECK(result != ERR_IO_PENDING); |
| @@ -1398,8 +1509,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; |
| @@ -1408,15 +1522,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, |