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

Unified Diff: net/socket/socket_test_util.cc

Issue 353713005: Implements new, more robust design for communicating between SSLConnectJobs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Moved tests back to ssl_client_socket_unittest.cc, fixed various other issues. Created 6 years, 5 months 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 287bb53a37087867e30b9c98eb669d5d67935b89..b12004abe662530f9ae47df057e77b94742288a6 100644
--- a/net/socket/socket_test_util.cc
+++ b/net/socket/socket_test_util.cc
@@ -10,6 +10,7 @@
#include "base/basictypes.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
+#include "base/callback_helpers.h"
#include "base/compiler_specific.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
@@ -277,7 +278,9 @@ SSLSocketDataProvider::SSLSocketDataProvider(IoMode mode, int result)
client_cert_sent(false),
cert_request_info(NULL),
channel_id_sent(false),
- connection_status(0) {
+ connection_status(0),
+ should_block_on_connect(false),
+ is_in_session_cache(false) {
SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_TLS1_2,
&connection_status);
// Set to TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
@@ -699,10 +702,13 @@ scoped_ptr<SSLClientSocket> MockClientSocketFactory::CreateSSLClientSocket(
const HostPortPair& host_and_port,
const SSLConfig& ssl_config,
const SSLClientSocketContext& context) {
- return scoped_ptr<SSLClientSocket>(
+ scoped_ptr<MockSSLClientSocket> socket(
new MockSSLClientSocket(transport_socket.Pass(),
- host_and_port, ssl_config,
+ host_and_port,
+ ssl_config,
mock_ssl_data_.GetNext()));
+ ssl_client_sockets_.push_back(socket.get());
+ return socket.PassAs<SSLClientSocket>();
}
void MockClientSocketFactory::ClearSSLSessionCache() {
@@ -712,6 +718,7 @@ const char MockClientSocket::kTlsUnique[] = "MOCK_TLSUNIQ";
MockClientSocket::MockClientSocket(const BoundNetLog& net_log)
: connected_(false),
+ reached_connect_(false),
net_log_(net_log),
weak_factory_(this) {
IPAddressNumber ip;
@@ -758,6 +765,15 @@ const BoundNetLog& MockClientSocket::NetLog() const {
return net_log_;
}
+bool MockClientSocket::InSessionCache() const {
+ NOTIMPLEMENTED();
+ return false;
+}
+
+void MockClientSocket::SetHandshakeCompletionCallback(const base::Closure& cb) {
+ NOTIMPLEMENTED();
+}
+
void MockClientSocket::GetSSLCertRequestInfo(
SSLCertRequestInfo* cert_request_info) {
}
@@ -781,8 +797,9 @@ ChannelIDService* MockClientSocket::GetChannelIDService() const {
return NULL;
}
-SSLClientSocket::NextProtoStatus
-MockClientSocket::GetNextProto(std::string* proto) {
+SSLClientSocket::NextProtoStatus MockClientSocket::GetNextProto(
+ std::string* proto,
+ std::string* server_protos) {
wtc 2014/07/31 23:05:24 IMPORTANT: is this part of the CL?
mshelley 2014/08/02 23:59:14 Done.
proto->clear();
return SSLClientSocket::kNextProtoUnsupported;
}
@@ -1297,31 +1314,23 @@ void DeterministicMockTCPClientSocket::OnReadComplete(const MockRead& data) {}
void DeterministicMockTCPClientSocket::OnConnectComplete(
const MockConnect& data) {}
-// static
-void MockSSLClientSocket::ConnectCallback(
- MockSSLClientSocket* ssl_client_socket,
- const CompletionCallback& callback,
- int rv) {
- if (rv == OK)
- ssl_client_socket->connected_ = true;
- callback.Run(rv);
-}
-
MockSSLClientSocket::MockSSLClientSocket(
scoped_ptr<ClientSocketHandle> transport_socket,
const HostPortPair& host_port_pair,
const SSLConfig& ssl_config,
SSLSocketDataProvider* data)
: MockClientSocket(
- // Have to use the right BoundNetLog for LoadTimingInfo regression
- // tests.
- transport_socket->socket()->NetLog()),
+ // Have to use the right BoundNetLog for LoadTimingInfo regression
+ // tests.
+ transport_socket->socket()->NetLog()),
transport_(transport_socket.Pass()),
data_(data),
is_npn_state_set_(false),
new_npn_value_(false),
is_protocol_negotiated_set_(false),
- protocol_negotiated_(kProtoUnknown) {
+ protocol_negotiated_(kProtoUnknown),
+ next_connect_state_(STATE_NONE),
+ weak_factory_(this) {
DCHECK(data_);
peer_addr_ = data->connect.peer_addr;
}
@@ -1341,28 +1350,23 @@ int MockSSLClientSocket::Write(IOBuffer* buf, int buf_len,
}
int MockSSLClientSocket::Connect(const CompletionCallback& callback) {
- int rv = transport_->socket()->Connect(
- base::Bind(&ConnectCallback, base::Unretained(this), callback));
- if (rv == OK) {
- if (data_->connect.result == OK)
- connected_ = true;
- if (data_->connect.mode == ASYNC) {
- RunCallbackAsync(callback, data_->connect.result);
- return ERR_IO_PENDING;
- }
- return data_->connect.result;
- }
+ next_connect_state_ = STATE_TRANSPORT_CONNECT;
+ reached_connect_ = true;
+ int rv = DoConnectLoop(OK);
+ if (rv == ERR_IO_PENDING)
+ connect_callback_ = callback;
return rv;
}
void MockSSLClientSocket::Disconnect() {
+ weak_factory_.InvalidateWeakPtrs();
MockClientSocket::Disconnect();
if (transport_->socket() != NULL)
transport_->socket()->Disconnect();
}
bool MockSSLClientSocket::IsConnected() const {
- return transport_->socket()->IsConnected();
+ return transport_->socket()->IsConnected() && connected_;
}
bool MockSSLClientSocket::WasEverUsed() const {
@@ -1386,6 +1390,15 @@ bool MockSSLClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
return true;
}
+bool MockSSLClientSocket::InSessionCache() const {
+ return data_->is_in_session_cache;
+}
+
+void MockSSLClientSocket::SetHandshakeCompletionCallback(
+ const base::Closure& cb) {
+ handshake_completion_callback_ = cb;
+}
+
void MockSSLClientSocket::GetSSLCertRequestInfo(
SSLCertRequestInfo* cert_request_info) {
DCHECK(cert_request_info);
@@ -1399,7 +1412,8 @@ void MockSSLClientSocket::GetSSLCertRequestInfo(
}
SSLClientSocket::NextProtoStatus MockSSLClientSocket::GetNextProto(
- std::string* proto) {
+ std::string* proto,
+ std::string* server_protos) {
wtc 2014/07/31 23:05:24 IMPORTANT: is this part of the CL?
mshelley 2014/08/02 23:59:14 Done.
*proto = data_->next_proto;
return data_->next_proto_status;
}
@@ -1447,6 +1461,87 @@ void MockSSLClientSocket::OnConnectComplete(const MockConnect& data) {
NOTIMPLEMENTED();
}
+void MockSSLClientSocket::RestartPausedConnect() {
+ DCHECK(data_->should_block_on_connect);
+ DCHECK_EQ(next_connect_state_, STATE_SSL_CONNECT_COMPLETE);
+ OnIOComplete(data_->connect.result);
+}
+
+void MockSSLClientSocket::OnIOComplete(int result) {
+ int rv = DoConnectLoop(result);
+ if (rv != ERR_IO_PENDING) {
+ base::ResetAndReturn(&connect_callback_).Run(rv);
+ }
wtc 2014/07/31 23:05:24 Nit: omit curly braces.
mshelley 2014/08/02 23:59:14 Done.
+}
+
+int MockSSLClientSocket::DoConnectLoop(int result) {
+ DCHECK_NE(next_connect_state_, STATE_NONE);
+
+ int rv = result;
+ do {
+ ConnectState state = next_connect_state_;
+ next_connect_state_ = STATE_NONE;
+ switch (state) {
+ case STATE_TRANSPORT_CONNECT:
+ rv = DoTransportConnect();
+ break;
+ case STATE_TRANSPORT_CONNECT_COMPLETE:
+ rv = DoTransportConnectComplete(rv);
wtc 2014/07/31 23:05:24 BUG: add a break statement after this line.
mshelley 2014/08/02 23:59:14 Done.
+ case STATE_SSL_CONNECT:
+ rv = DoSSLConnect();
+ break;
+ case STATE_SSL_CONNECT_COMPLETE:
+ rv = DoSSLConnectComplete(rv);
+ break;
+ default:
+ NOTREACHED() << "bad state";
+ rv = ERR_UNEXPECTED;
+ break;
+ }
+ } while (rv != ERR_IO_PENDING && next_connect_state_ != STATE_NONE);
+
+ return rv;
+}
+
+int MockSSLClientSocket::DoTransportConnect() {
+ next_connect_state_ = STATE_TRANSPORT_CONNECT_COMPLETE;
+ return transport_->socket()->Connect(
+ base::Bind(&MockSSLClientSocket::OnIOComplete, base::Unretained(this)));
+}
+
+int MockSSLClientSocket::DoTransportConnectComplete(int result) {
+ if (result == OK)
+ next_connect_state_ = STATE_SSL_CONNECT;
+ return result;
+}
+
+int MockSSLClientSocket::DoSSLConnect() {
+ next_connect_state_ = STATE_SSL_CONNECT_COMPLETE;
+
+ if (data_->should_block_on_connect)
+ return ERR_IO_PENDING;
+
+ if (data_->connect.mode == ASYNC) {
+ base::MessageLoop::current()->PostTask(
+ FROM_HERE,
+ base::Bind(&MockSSLClientSocket::OnIOComplete,
+ weak_factory_.GetWeakPtr(),
+ data_->connect.result));
+ return ERR_IO_PENDING;
+ }
+
+ return data_->connect.result;
+}
+
+int MockSSLClientSocket::DoSSLConnectComplete(int result) {
+ if (result == OK)
+ connected_ = true;
+
+ if (!handshake_completion_callback_.is_null())
+ base::ResetAndReturn(&handshake_completion_callback_).Run();
+ return result;
+}
+
MockUDPClientSocket::MockUDPClientSocket(SocketDataProvider* data,
net::NetLog* net_log)
: connected_(false),

Powered by Google App Engine
This is Rietveld 408576698