| Index: net/socket/ssl_client_socket_pool_unittest.cc
|
| diff --git a/net/socket/ssl_client_socket_pool_unittest.cc b/net/socket/ssl_client_socket_pool_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..30ff5da15d3f93f1acd339d0a5a60c0357a13149
|
| --- /dev/null
|
| +++ b/net/socket/ssl_client_socket_pool_unittest.cc
|
| @@ -0,0 +1,720 @@
|
| +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "net/http/http_proxy_client_socket_pool.h"
|
| +
|
| +#include "base/callback.h"
|
| +#include "base/compiler_specific.h"
|
| +#include "base/time.h"
|
| +#include "net/base/auth.h"
|
| +#include "net/base/mock_host_resolver.h"
|
| +#include "net/base/net_errors.h"
|
| +#include "net/base/test_completion_callback.h"
|
| +#include "net/base/ssl_config_service_defaults.h"
|
| +#include "net/http/http_auth_controller.h"
|
| +#include "net/http/http_network_session.h"
|
| +#include "net/http/http_request_headers.h"
|
| +#include "net/http/http_response_headers.h"
|
| +#include "net/socket/client_socket_factory.h"
|
| +#include "net/socket/client_socket_handle.h"
|
| +#include "net/socket/client_socket_pool_histograms.h"
|
| +#include "net/socket/socket_test_util.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace net {
|
| +
|
| +namespace {
|
| +
|
| +const int kMaxSockets = 32;
|
| +const int kMaxSocketsPerGroup = 6;
|
| +
|
| +class SSLClientSocketPoolTest : public ClientSocketPoolTest {
|
| + protected:
|
| + SSLClientSocketPoolTest()
|
| + : direct_tcp_socket_params_(new TCPSocketParams(
|
| + HostPortPair("host", 443), MEDIUM, GURL(), false)),
|
| + tcp_socket_pool_(new MockTCPClientSocketPool(
|
| + kMaxSockets,
|
| + kMaxSocketsPerGroup,
|
| + make_scoped_refptr(new ClientSocketPoolHistograms("MockTCP")),
|
| + &socket_factory_)),
|
| + proxy_tcp_socket_params_(new TCPSocketParams(
|
| + HostPortPair("proxy", 443), MEDIUM, GURL(), false)),
|
| + http_proxy_socket_pool_(new HttpProxyClientSocketPool(
|
| + kMaxSockets,
|
| + kMaxSocketsPerGroup,
|
| + make_scoped_refptr(new ClientSocketPoolHistograms("MockHttpProxy")),
|
| + new MockHostResolver,
|
| + tcp_socket_pool_,
|
| + NULL)),
|
| + socks_socket_params_(new SOCKSSocketParams(
|
| + proxy_tcp_socket_params_, true, HostPortPair("sockshost", 443),
|
| + MEDIUM, GURL())),
|
| + socks_socket_pool_(new MockSOCKSClientSocketPool(
|
| + kMaxSockets,
|
| + kMaxSocketsPerGroup,
|
| + make_scoped_refptr(new ClientSocketPoolHistograms("MockSOCKS")),
|
| + tcp_socket_pool_)) {
|
| + scoped_refptr<SSLConfigService> ssl_config_service(
|
| + new SSLConfigServiceDefaults);
|
| + ssl_config_service->GetSSLConfig(&ssl_config_);
|
| + }
|
| +
|
| + void CreatePool(bool tcp_pool, bool http_proxy_pool, bool socks_pool) {
|
| + pool_ = new SSLClientSocketPool(
|
| + kMaxSockets,
|
| + kMaxSocketsPerGroup,
|
| + make_scoped_refptr(new ClientSocketPoolHistograms("SSLUnitTest")),
|
| + NULL,
|
| + &socket_factory_,
|
| + tcp_pool ? tcp_socket_pool_ : NULL,
|
| + http_proxy_pool ? http_proxy_socket_pool_ : NULL,
|
| + socks_pool ? socks_socket_pool_ : NULL,
|
| + NULL);
|
| + }
|
| +
|
| + scoped_refptr<SSLSocketParams> SSLParams(
|
| + ProxyServer::Scheme proxy, struct MockHttpAuthControllerData* auth_data,
|
| + size_t auth_data_len, bool want_spdy) {
|
| +
|
| + scoped_refptr<HttpProxySocketParams> http_proxy_params;
|
| + if (proxy == ProxyServer::SCHEME_HTTP) {
|
| + scoped_refptr<MockHttpAuthController> auth_controller =
|
| + new MockHttpAuthController();
|
| + auth_controller->SetMockAuthControllerData(auth_data, auth_data_len);
|
| + http_proxy_params = new HttpProxySocketParams(proxy_tcp_socket_params_,
|
| + GURL("http://host"),
|
| + HostPortPair("host", 80),
|
| + auth_controller, true);
|
| + }
|
| +
|
| + return make_scoped_refptr(new SSLSocketParams(
|
| + proxy == ProxyServer::SCHEME_DIRECT ? direct_tcp_socket_params_ : NULL,
|
| + http_proxy_params,
|
| + proxy == ProxyServer::SCHEME_SOCKS5 ? socks_socket_params_ : NULL,
|
| + proxy,
|
| + "host",
|
| + ssl_config_,
|
| + 0,
|
| + want_spdy));
|
| + }
|
| +
|
| + MockClientSocketFactory socket_factory_;
|
| +
|
| + scoped_refptr<TCPSocketParams> direct_tcp_socket_params_;
|
| + scoped_refptr<MockTCPClientSocketPool> tcp_socket_pool_;
|
| +
|
| + scoped_refptr<TCPSocketParams> proxy_tcp_socket_params_;
|
| + scoped_refptr<HttpProxySocketParams> http_proxy_socket_params_;
|
| + scoped_refptr<HttpProxyClientSocketPool> http_proxy_socket_pool_;
|
| +
|
| + scoped_refptr<SOCKSSocketParams> socks_socket_params_;
|
| + scoped_refptr<MockSOCKSClientSocketPool> socks_socket_pool_;
|
| +
|
| + SSLConfig ssl_config_;
|
| + scoped_refptr<SSLClientSocketPool> pool_;
|
| +};
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, TCPFail) {
|
| + StaticSocketDataProvider data;
|
| + data.set_connect_data(MockConnect(false, ERR_CONNECTION_FAILED));
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| +
|
| + CreatePool(true /* tcp pool */, false, false);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| + NULL, 0, false);
|
| +
|
| + ClientSocketHandle handle;
|
| + int rv = handle.Init("a", params, MEDIUM, NULL, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_CONNECTION_FAILED, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| + EXPECT_FALSE(handle.is_ssl_error());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, TCPFailAsync) {
|
| + StaticSocketDataProvider data;
|
| + data.set_connect_data(MockConnect(true, ERR_CONNECTION_FAILED));
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| +
|
| + CreatePool(true /* tcp pool */, false, false);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| + NULL, 0, false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| + EXPECT_FALSE(handle.is_ssl_error());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, BasicDirect) {
|
| + StaticSocketDataProvider data;
|
| + data.set_connect_data(MockConnect(false, OK));
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + SSLSocketDataProvider ssl(false, OK);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(true /* tcp pool */, false, false);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| + NULL, 0, false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(OK, rv);
|
| + EXPECT_TRUE(handle.is_initialized());
|
| + EXPECT_TRUE(handle.socket());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, BasicDirectAsync) {
|
| + StaticSocketDataProvider data;
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + SSLSocketDataProvider ssl(true, OK);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(true /* tcp pool */, false, false);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| + NULL, 0, false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(OK, callback.WaitForResult());
|
| + EXPECT_TRUE(handle.is_initialized());
|
| + EXPECT_TRUE(handle.socket());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, DirectCertError) {
|
| + StaticSocketDataProvider data;
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + SSLSocketDataProvider ssl(true, ERR_CERT_COMMON_NAME_INVALID);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(true /* tcp pool */, false, false);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| + NULL, 0, false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(ERR_CERT_COMMON_NAME_INVALID, callback.WaitForResult());
|
| + EXPECT_TRUE(handle.is_initialized());
|
| + EXPECT_TRUE(handle.socket());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, DirectSSLError) {
|
| + StaticSocketDataProvider data;
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + SSLSocketDataProvider ssl(true, ERR_SSL_PROTOCOL_ERROR);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(true /* tcp pool */, false, false);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| + NULL, 0, false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, callback.WaitForResult());
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| + EXPECT_TRUE(handle.is_ssl_error());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, DirectWithNPN) {
|
| + StaticSocketDataProvider data;
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + SSLSocketDataProvider ssl(true, OK);
|
| + ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated;
|
| + ssl.next_proto = "http/1.1";
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(true /* tcp pool */, false, false);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| + NULL, 0, false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(OK, callback.WaitForResult());
|
| + EXPECT_TRUE(handle.is_initialized());
|
| + EXPECT_TRUE(handle.socket());
|
| + SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket());
|
| + EXPECT_TRUE(ssl_socket->wasNpnNegotiated());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, DirectNoSPDY) {
|
| + StaticSocketDataProvider data;
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + SSLSocketDataProvider ssl(true, OK);
|
| + ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated;
|
| + ssl.next_proto = "http/1.1";
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(true /* tcp pool */, false, false);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| + NULL, 0, true);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(ERR_NPN_NEGOTIATION_FAILED, callback.WaitForResult());
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| + EXPECT_TRUE(handle.is_ssl_error());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, DirectGotSPDY) {
|
| + StaticSocketDataProvider data;
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + SSLSocketDataProvider ssl(true, OK);
|
| + ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated;
|
| + ssl.next_proto = "spdy/1";
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(true /* tcp pool */, false, false);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| + NULL, 0, true);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(OK, callback.WaitForResult());
|
| + EXPECT_TRUE(handle.is_initialized());
|
| + EXPECT_TRUE(handle.socket());
|
| +
|
| + SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket());
|
| + EXPECT_TRUE(ssl_socket->wasNpnNegotiated());
|
| + std::string proto;
|
| + ssl_socket->GetNextProto(&proto);
|
| + EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto),
|
| + SSLClientSocket::kProtoSPDY1);
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, DirectGotBonusSPDY) {
|
| + StaticSocketDataProvider data;
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + SSLSocketDataProvider ssl(true, OK);
|
| + ssl.next_proto_status = SSLClientSocket::kNextProtoNegotiated;
|
| + ssl.next_proto = "spdy/1";
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(true /* tcp pool */, false, false);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_DIRECT,
|
| + NULL, 0, false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(OK, callback.WaitForResult());
|
| + EXPECT_TRUE(handle.is_initialized());
|
| + EXPECT_TRUE(handle.socket());
|
| +
|
| + SSLClientSocket* ssl_socket = static_cast<SSLClientSocket*>(handle.socket());
|
| + EXPECT_TRUE(ssl_socket->wasNpnNegotiated());
|
| + std::string proto;
|
| + ssl_socket->GetNextProto(&proto);
|
| + EXPECT_EQ(SSLClientSocket::NextProtoFromString(proto),
|
| + SSLClientSocket::kProtoSPDY1);
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, SOCKSFail) {
|
| + StaticSocketDataProvider data;
|
| + data.set_connect_data(MockConnect(false, ERR_CONNECTION_FAILED));
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| +
|
| + CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
|
| + NULL, 0, false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_CONNECTION_FAILED, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| + EXPECT_FALSE(handle.is_ssl_error());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, SOCKSFailAsync) {
|
| + StaticSocketDataProvider data;
|
| + data.set_connect_data(MockConnect(true, ERR_CONNECTION_FAILED));
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| +
|
| + CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
|
| + NULL, 0, false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| + EXPECT_FALSE(handle.is_ssl_error());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, SOCKSBasic) {
|
| + StaticSocketDataProvider data;
|
| + data.set_connect_data(MockConnect(false, OK));
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + SSLSocketDataProvider ssl(false, OK);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
|
| + NULL, 0, false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(OK, rv);
|
| + EXPECT_TRUE(handle.is_initialized());
|
| + EXPECT_TRUE(handle.socket());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, SOCKSBasicAsync) {
|
| + StaticSocketDataProvider data;
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + SSLSocketDataProvider ssl(true, OK);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_SOCKS5,
|
| + NULL, 0, false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(OK, callback.WaitForResult());
|
| + EXPECT_TRUE(handle.is_initialized());
|
| + EXPECT_TRUE(handle.socket());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, HttpProxyFail) {
|
| + StaticSocketDataProvider data;
|
| + data.set_connect_data(MockConnect(false, ERR_CONNECTION_FAILED));
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| +
|
| + CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
|
| + NULL, 0, false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_CONNECTION_FAILED, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| + EXPECT_FALSE(handle.is_ssl_error());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, HttpProxyFailAsync) {
|
| + StaticSocketDataProvider data;
|
| + data.set_connect_data(MockConnect(true, ERR_CONNECTION_FAILED));
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| +
|
| + CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
|
| + NULL, 0, false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult());
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| + EXPECT_FALSE(handle.is_ssl_error());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, HttpProxyBasic) {
|
| + MockWrite writes[] = {
|
| + MockWrite(false,
|
| + "CONNECT host:80 HTTP/1.1\r\n"
|
| + "Host: host\r\n"
|
| + "Proxy-Connection: keep-alive\r\n"
|
| + "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
|
| + };
|
| + MockRead reads[] = {
|
| + MockRead(false, "HTTP/1.1 200 Connection Established\r\n\r\n"),
|
| + };
|
| + StaticSocketDataProvider data(reads, arraysize(reads), writes,
|
| + arraysize(writes));
|
| + data.set_connect_data(MockConnect(false, OK));
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + MockHttpAuthControllerData auth_data[] = {
|
| + MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="),
|
| + };
|
| + SSLSocketDataProvider ssl(false, OK);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
|
| + auth_data,
|
| + arraysize(auth_data),
|
| + false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(OK, rv);
|
| + EXPECT_TRUE(handle.is_initialized());
|
| + EXPECT_TRUE(handle.socket());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, HttpProxyBasicAsync) {
|
| + MockWrite writes[] = {
|
| + MockWrite("CONNECT host:80 HTTP/1.1\r\n"
|
| + "Host: host\r\n"
|
| + "Proxy-Connection: keep-alive\r\n"
|
| + "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
|
| + };
|
| + MockRead reads[] = {
|
| + MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"),
|
| + };
|
| + StaticSocketDataProvider data(reads, arraysize(reads), writes,
|
| + arraysize(writes));
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + MockHttpAuthControllerData auth_data[] = {
|
| + MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="),
|
| + };
|
| + SSLSocketDataProvider ssl(true, OK);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
|
| + auth_data,
|
| + arraysize(auth_data),
|
| + false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(OK, callback.WaitForResult());
|
| + EXPECT_TRUE(handle.is_initialized());
|
| + EXPECT_TRUE(handle.socket());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, NeedProxyAuth) {
|
| + MockWrite writes[] = {
|
| + MockWrite("CONNECT host:80 HTTP/1.1\r\n"
|
| + "Host: host\r\n"
|
| + "Proxy-Connection: keep-alive\r\n\r\n"),
|
| + };
|
| + MockRead reads[] = {
|
| + MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"),
|
| + MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"),
|
| + MockRead("Content-Length: 10\r\n\r\n"),
|
| + MockRead("0123456789"),
|
| + };
|
| + StaticSocketDataProvider data(reads, arraysize(reads), writes,
|
| + arraysize(writes));
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + MockHttpAuthControllerData auth_data[] = {
|
| + MockHttpAuthControllerData(""),
|
| + };
|
| + SSLSocketDataProvider ssl(true, OK);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
|
| + auth_data,
|
| + arraysize(auth_data),
|
| + false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult());
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| + EXPECT_FALSE(handle.is_ssl_error());
|
| + const HttpResponseInfo& tunnel_info = handle.tunnel_auth_response_info();
|
| + EXPECT_EQ(tunnel_info.headers->response_code(), 407);
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, DoProxyAuth) {
|
| + MockWrite writes[] = {
|
| + MockWrite("CONNECT host:80 HTTP/1.1\r\n"
|
| + "Host: host\r\n"
|
| + "Proxy-Connection: keep-alive\r\n\r\n"),
|
| + MockWrite("CONNECT host:80 HTTP/1.1\r\n"
|
| + "Host: host\r\n"
|
| + "Proxy-Connection: keep-alive\r\n"
|
| + "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
|
| + };
|
| + MockRead reads[] = {
|
| + MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"),
|
| + MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n"),
|
| + MockRead("Content-Length: 10\r\n\r\n"),
|
| + MockRead("0123456789"),
|
| + MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"),
|
| + };
|
| + StaticSocketDataProvider data(reads, arraysize(reads), writes,
|
| + arraysize(writes));
|
| + socket_factory_.AddSocketDataProvider(&data);
|
| + MockHttpAuthControllerData auth_data[] = {
|
| + MockHttpAuthControllerData(""),
|
| + MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="),
|
| + };
|
| + SSLSocketDataProvider ssl(true, OK);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
|
| + auth_data,
|
| + arraysize(auth_data),
|
| + false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult());
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| + EXPECT_FALSE(handle.is_ssl_error());
|
| + const HttpResponseInfo& tunnel_info = handle.tunnel_auth_response_info();
|
| + EXPECT_EQ(tunnel_info.headers->response_code(), 407);
|
| +
|
| + params->http_proxy_params()->auth_controller()->ResetAuth(std::wstring(),
|
| + std::wstring());
|
| + rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(OK, callback.WaitForResult());
|
| + EXPECT_TRUE(handle.is_initialized());
|
| + EXPECT_TRUE(handle.socket());
|
| +}
|
| +
|
| +TEST_F(SSLClientSocketPoolTest, DoProxyAuthNoKeepAlive) {
|
| + MockWrite writes1[] = {
|
| + MockWrite("CONNECT host:80 HTTP/1.1\r\n"
|
| + "Host: host\r\n"
|
| + "Proxy-Connection: keep-alive\r\n\r\n"),
|
| + };
|
| + MockWrite writes2[] = {
|
| + MockWrite("CONNECT host:80 HTTP/1.1\r\n"
|
| + "Host: host\r\n"
|
| + "Proxy-Connection: keep-alive\r\n"
|
| + "Proxy-Authorization: Basic Zm9vOmJheg==\r\n\r\n"),
|
| + };
|
| + MockRead reads1[] = {
|
| + MockRead("HTTP/1.1 407 Proxy Authentication Required\r\n"),
|
| + MockRead("Proxy-Authenticate: Basic realm=\"MyRealm1\"\r\n\r\n"),
|
| + MockRead("Content0123456789"),
|
| + };
|
| + MockRead reads2[] = {
|
| + MockRead("HTTP/1.1 200 Connection Established\r\n\r\n"),
|
| + };
|
| + StaticSocketDataProvider data1(reads1, arraysize(reads1), writes1,
|
| + arraysize(writes1));
|
| + socket_factory_.AddSocketDataProvider(&data1);
|
| + StaticSocketDataProvider data2(reads2, arraysize(reads2), writes2,
|
| + arraysize(writes2));
|
| + socket_factory_.AddSocketDataProvider(&data2);
|
| + MockHttpAuthControllerData auth_data[] = {
|
| + MockHttpAuthControllerData(""),
|
| + MockHttpAuthControllerData("Proxy-Authorization: Basic Zm9vOmJheg=="),
|
| + };
|
| + SSLSocketDataProvider ssl(true, OK);
|
| + socket_factory_.AddSSLSocketDataProvider(&ssl);
|
| +
|
| + CreatePool(false, true /* http proxy pool */, true /* socks pool */);
|
| + scoped_refptr<SSLSocketParams> params = SSLParams(ProxyServer::SCHEME_HTTP,
|
| + auth_data,
|
| + arraysize(auth_data),
|
| + false);
|
| +
|
| + ClientSocketHandle handle;
|
| + TestCompletionCallback callback;
|
| + int rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult());
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| + EXPECT_FALSE(handle.is_ssl_error());
|
| + const HttpResponseInfo& tunnel_info = handle.tunnel_auth_response_info();
|
| + EXPECT_EQ(tunnel_info.headers->response_code(), 407);
|
| +
|
| + params->http_proxy_params()->auth_controller()->ResetAuth(std::wstring(),
|
| + std::wstring());
|
| + rv = handle.Init("a", params, MEDIUM, &callback, pool_, BoundNetLog());
|
| + EXPECT_EQ(ERR_IO_PENDING, rv);
|
| + EXPECT_FALSE(handle.is_initialized());
|
| + EXPECT_FALSE(handle.socket());
|
| +
|
| + EXPECT_EQ(OK, callback.WaitForResult());
|
| + EXPECT_TRUE(handle.is_initialized());
|
| + EXPECT_TRUE(handle.socket());
|
| +}
|
| +
|
| +// It would be nice to also test the timeouts in SSLClientSocketPool.
|
| +
|
| +} // namespace
|
| +
|
| +} // namespace net
|
|
|