| Index: net/socket/socket_test_util.cc
|
| diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc
|
| index f993801adeb2814aede788bcf82c693bfa99696f..9acfa23f4a105f010787f6fe18dc9b81f3ded0e1 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,10 @@ SSLSocketDataProvider::SSLSocketDataProvider(IoMode mode, int result)
|
| client_cert_sent(false),
|
| cert_request_info(NULL),
|
| channel_id_sent(false),
|
| - connection_status(0) {
|
| + connection_status(0),
|
| + block_in_connect_(false),
|
| + blocked_in_connect_(false),
|
| + is_in_session_cache_(true) {
|
| SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_TLS1_2,
|
| &connection_status);
|
| // Set to TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
|
| @@ -699,15 +703,23 @@ 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() {
|
| }
|
|
|
| +std::vector<MockSSLClientSocket*>
|
| +MockClientSocketFactory::GetSSLClientSockets() {
|
| + return ssl_client_sockets_;
|
| +}
|
| +
|
| const char MockClientSocket::kTlsUnique[] = "MOCK_TLSUNIQ";
|
|
|
| MockClientSocket::MockClientSocket(const BoundNetLog& net_log)
|
| @@ -735,6 +747,10 @@ bool MockClientSocket::IsConnected() const {
|
| return connected_;
|
| }
|
|
|
| +bool MockClientSocket::IsConnectedSSL() const {
|
| + return connected_;
|
| +}
|
| +
|
| bool MockClientSocket::IsConnectedAndIdle() const {
|
| return connected_;
|
| }
|
| @@ -758,6 +774,16 @@ const BoundNetLog& MockClientSocket::NetLog() const {
|
| return net_log_;
|
| }
|
|
|
| +bool MockClientSocket::InSessionCache() const {
|
| + return true;
|
| +}
|
| +
|
| +void MockClientSocket::SetHandshakeSuccessCallback(const base::Closure& cb) {
|
| +}
|
| +
|
| +void MockClientSocket::SetHandshakeFailureCallback(const base::Closure& cb) {
|
| +}
|
| +
|
| void MockClientSocket::GetSSLCertRequestInfo(
|
| SSLCertRequestInfo* cert_request_info) {
|
| }
|
| @@ -781,6 +807,10 @@ ServerBoundCertService* MockClientSocket::GetServerBoundCertService() const {
|
| return NULL;
|
| }
|
|
|
| +CompletionCallback MockClientSocket::GetResumptionCallback() {
|
| + return resumption_callback_;
|
| +}
|
| +
|
| SSLClientSocket::NextProtoStatus
|
| MockClientSocket::GetNextProto(std::string* proto, std::string* server_protos) {
|
| proto->clear();
|
| @@ -1314,9 +1344,9 @@ MockSSLClientSocket::MockSSLClientSocket(
|
| 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),
|
| @@ -1342,20 +1372,50 @@ 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));
|
| + int rv;
|
| + if (!data_->blocked_in_connect_)
|
| + rv = transport_->socket()->Connect(
|
| + base::Bind(&ConnectCallback, base::Unretained(this), callback));
|
| + else
|
| + rv = OK;
|
| +
|
| if (rv == OK) {
|
| - if (data_->connect.result == OK)
|
| + if (data_->connect.result == OK) {
|
| connected_ = true;
|
| - if (data_->connect.mode == ASYNC) {
|
| - RunCallbackAsync(callback, data_->connect.result);
|
| - return ERR_IO_PENDING;
|
| + if (data_->connect.mode == ASYNC) {
|
| + if (data_->block_in_connect_) {
|
| + resumption_callback_ = callback;
|
| + data_->block_in_connect_ = false;
|
| + data_->blocked_in_connect_ = true;
|
| + return ERR_IO_PENDING;
|
| + } else {
|
| + if (!success_callback_.is_null()) {
|
| + success_callback_.Run();
|
| + }
|
| + RunCallbackAsync(callback, data_->connect.result);
|
| + }
|
| + return ERR_IO_PENDING;
|
| + }
|
| +
|
| + // The presence of |success_callback_| indicates that SSL Connect Job
|
| + // Waiting is enabled.
|
| + if (!success_callback_.is_null()) {
|
| + success_callback_.Run();
|
| + }
|
| + } else if (!error_callback_.is_null()) {
|
| + if (data_->block_in_connect_) {
|
| + resumption_callback_ = callback;
|
| + data_->block_in_connect_ = false;
|
| + data_->blocked_in_connect_ = true;
|
| + return ERR_IO_PENDING;
|
| + }
|
| + error_callback_.Run();
|
| }
|
| +
|
| return data_->connect.result;
|
| }
|
| return rv;
|
| }
|
| -
|
| void MockSSLClientSocket::Disconnect() {
|
| MockClientSocket::Disconnect();
|
| if (transport_->socket() != NULL)
|
| @@ -1366,6 +1426,10 @@ bool MockSSLClientSocket::IsConnected() const {
|
| return transport_->socket()->IsConnected();
|
| }
|
|
|
| +bool MockSSLClientSocket::IsConnectedSSL() const {
|
| + return connected_;
|
| +}
|
| +
|
| bool MockSSLClientSocket::WasEverUsed() const {
|
| return transport_->socket()->WasEverUsed();
|
| }
|
| @@ -1399,6 +1463,18 @@ void MockSSLClientSocket::GetSSLCertRequestInfo(
|
| }
|
| }
|
|
|
| +bool MockSSLClientSocket::InSessionCache() const {
|
| + return data_->is_in_session_cache_;
|
| +}
|
| +
|
| +void MockSSLClientSocket::SetHandshakeSuccessCallback(const base::Closure& cb) {
|
| + success_callback_ = cb;
|
| +}
|
| +
|
| +void MockSSLClientSocket::SetHandshakeFailureCallback(const base::Closure& cb) {
|
| + error_callback_ = cb;
|
| +}
|
| +
|
| SSLClientSocket::NextProtoStatus MockSSLClientSocket::GetNextProto(
|
| std::string* proto, std::string* server_protos) {
|
| *proto = data_->next_proto;
|
|
|