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

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: Rebase. 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 eb1599fa0fc0fb5b6c72d22b28bc0ed14d9d62fd..cd66f83499b86abbd7c617e2054f4f506aff2a91 100644
--- a/net/socket/socket_test_util.cc
+++ b/net/socket/socket_test_util.cc
@@ -738,7 +738,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();
@@ -755,7 +755,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 +776,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 +858,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 +910,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 +930,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 +956,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 +976,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 +1010,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 +1055,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 +1224,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 +1340,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 +1360,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 +1375,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 +1467,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 +1485,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 +1511,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 +1524,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