Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(718)

Unified Diff: net/socket/socket_test_util.cc

Issue 8801005: base::Bind: Convert Socket::Read. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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,

Powered by Google App Engine
This is Rietveld 408576698