| Index: net/http/http_network_transaction_unittest.cc
|
| diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc
|
| index 6058d8f6f9c761d338407699389b9032c7da5862..7d6db6f16f26dd59d517d053aeee3173ca5fdb36 100644
|
| --- a/net/http/http_network_transaction_unittest.cc
|
| +++ b/net/http/http_network_transaction_unittest.cc
|
| @@ -2,9 +2,12 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include "net/http/http_network_transaction.h"
|
| +
|
| #include <math.h> // ceil
|
| #include <vector>
|
|
|
| +#include "base/basictypes.h"
|
| #include "base/compiler_specific.h"
|
| #include "base/file_path.h"
|
| #include "base/file_util.h"
|
| @@ -19,7 +22,6 @@
|
| #include "net/http/http_auth_handler_ntlm.h"
|
| #include "net/http/http_basic_stream.h"
|
| #include "net/http/http_network_session.h"
|
| -#include "net/http/http_network_transaction.h"
|
| #include "net/http/http_stream.h"
|
| #include "net/http/http_transaction_unittest.h"
|
| #include "net/proxy/proxy_config_service_fixed.h"
|
| @@ -37,6 +39,34 @@
|
|
|
| namespace net {
|
|
|
| +class HttpNetworkSessionPeer {
|
| + public:
|
| + explicit HttpNetworkSessionPeer(
|
| + const scoped_refptr<HttpNetworkSession>& session)
|
| + : session_(session) {}
|
| +
|
| + void SetTCPSocketPool(const scoped_refptr<TCPClientSocketPool>& pool) {
|
| + session_->tcp_socket_pool_ = pool;
|
| + }
|
| +
|
| + void SetSocketPoolForSOCKSProxy(
|
| + const HostPortPair& socks_proxy,
|
| + const scoped_refptr<SOCKSClientSocketPool>& pool) {
|
| + session_->socks_socket_pool_[socks_proxy] = pool;
|
| + }
|
| +
|
| + void SetSocketPoolForHTTPProxy(
|
| + const HostPortPair& http_proxy,
|
| + const scoped_refptr<TCPClientSocketPool>& pool) {
|
| + session_->http_proxy_socket_pool_[http_proxy] = pool;
|
| + }
|
| +
|
| + private:
|
| + const scoped_refptr<HttpNetworkSession> session_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(HttpNetworkSessionPeer);
|
| +};
|
| +
|
| // Helper to manage the lifetimes of the dependencies for a
|
| // HttpNetworkTransaction.
|
| class SessionDependencies {
|
| @@ -190,13 +220,12 @@ std::string MockGetHostName() {
|
| return "WTC-WIN7";
|
| }
|
|
|
| -template<typename EmulatedClientSocketPool, typename SocketSourceType>
|
| +template<typename EmulatedClientSocketPool>
|
| class CaptureGroupNameSocketPool : public EmulatedClientSocketPool {
|
| public:
|
| - CaptureGroupNameSocketPool(HttpNetworkSession* session,
|
| - SocketSourceType* socket_source)
|
| + CaptureGroupNameSocketPool(HttpNetworkSession* session)
|
| : EmulatedClientSocketPool(0, 0, "CaptureGroupNameTestPool",
|
| - session->host_resolver(), socket_source,
|
| + session->host_resolver(), NULL,
|
| NULL) {}
|
| const std::string last_group_name_received() const {
|
| return last_group_name_;
|
| @@ -237,9 +266,9 @@ class CaptureGroupNameSocketPool : public EmulatedClientSocketPool {
|
| std::string last_group_name_;
|
| };
|
|
|
| -typedef CaptureGroupNameSocketPool<TCPClientSocketPool, ClientSocketFactory>
|
| +typedef CaptureGroupNameSocketPool<TCPClientSocketPool>
|
| CaptureGroupNameTCPSocketPool;
|
| -typedef CaptureGroupNameSocketPool<SOCKSClientSocketPool, TCPClientSocketPool>
|
| +typedef CaptureGroupNameSocketPool<SOCKSClientSocketPool>
|
| CaptureGroupNameSOCKSSocketPool;
|
| //-----------------------------------------------------------------------------
|
|
|
| @@ -3673,61 +3702,165 @@ TEST_F(HttpNetworkTransactionTest, SOCKS5_SSL_GET) {
|
| }
|
|
|
| // Tests that for connection endpoints the group names are correctly set.
|
| -TEST_F(HttpNetworkTransactionTest, GroupNameForProxyConnections) {
|
| - const struct {
|
| - const std::string proxy_server;
|
| - const std::string url;
|
| - const std::string expected_group_name;
|
| - } tests[] = {
|
| +
|
| +struct GroupNameTest {
|
| + std::string proxy_server;
|
| + std::string url;
|
| + std::string expected_group_name;
|
| +};
|
| +
|
| +scoped_refptr<HttpNetworkSession> SetupSessionForGroupNameTests(
|
| + const std::string& proxy_server) {
|
| + SessionDependencies session_deps(CreateFixedProxyService(proxy_server));
|
| + scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
|
| +
|
| + HttpAlternateProtocols* alternate_protocols =
|
| + session->mutable_alternate_protocols();
|
| + alternate_protocols->SetAlternateProtocolFor(
|
| + HostPortPair("host.with.alternate", 80), 443,
|
| + HttpAlternateProtocols::NPN_SPDY_1);
|
| +
|
| + return session;
|
| +}
|
| +
|
| +int GroupNameTransactionHelper(
|
| + const std::string& url,
|
| + const scoped_refptr<HttpNetworkSession>& session) {
|
| + scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session));
|
| +
|
| + HttpRequestInfo request;
|
| + request.method = "GET";
|
| + request.url = GURL(url);
|
| + request.load_flags = 0;
|
| +
|
| + TestCompletionCallback callback;
|
| +
|
| + // We do not complete this request, the dtor will clean the transaction up.
|
| + return trans->Start(&request, &callback, BoundNetLog());
|
| +}
|
| +
|
| +TEST_F(HttpNetworkTransactionTest, GroupNameForDirectConnections) {
|
| + const GroupNameTest tests[] = {
|
| {
|
| - "", // no proxy (direct)
|
| + "", // unused
|
| "http://www.google.com/direct",
|
| "www.google.com:80",
|
| },
|
| {
|
| - "", // no proxy (direct)
|
| + "", // unused
|
| "http://[2001:1418:13:1::25]/direct",
|
| "[2001:1418:13:1::25]:80",
|
| },
|
| - {
|
| - "http_proxy",
|
| - "http://www.google.com/http_proxy_normal",
|
| - "proxy/http_proxy:80/",
|
| - },
|
| - {
|
| - "socks4://socks_proxy:1080",
|
| - "http://www.google.com/socks4_direct",
|
| - "proxy/socks4://socks_proxy:1080/www.google.com:80",
|
| - },
|
|
|
| // SSL Tests
|
| {
|
| - "",
|
| + "", // unused
|
| "https://www.google.com/direct_ssl",
|
| "www.google.com:443",
|
| },
|
| {
|
| - "http_proxy",
|
| - "https://www.google.com/http_connect_ssl",
|
| - "proxy/http_proxy:80/www.google.com:443",
|
| - },
|
| - {
|
| - "socks4://socks_proxy:1080",
|
| - "https://www.google.com/socks4_ssl",
|
| - "proxy/socks4://socks_proxy:1080/www.google.com:443",
|
| + "", // unused
|
| + "https://[2001:1418:13:1::25]/direct",
|
| + "[2001:1418:13:1::25]:443",
|
| },
|
| {
|
| - "", // no proxy (direct)
|
| + "", // unused
|
| "http://host.with.alternate/direct",
|
| "host.with.alternate:443",
|
| },
|
| + };
|
| +
|
| + HttpNetworkTransaction::SetUseAlternateProtocols(true);
|
|
|
| - // TODO(willchan): Uncomment these tests when they work.
|
| + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| + scoped_refptr<HttpNetworkSession> session(
|
| + SetupSessionForGroupNameTests(tests[i].proxy_server));
|
| +
|
| + HttpNetworkSessionPeer peer(session);
|
| + scoped_refptr<CaptureGroupNameTCPSocketPool> tcp_conn_pool(
|
| + new CaptureGroupNameTCPSocketPool(session.get()));
|
| + peer.SetTCPSocketPool(tcp_conn_pool);
|
| +
|
| + EXPECT_EQ(ERR_IO_PENDING,
|
| + GroupNameTransactionHelper(tests[i].url, session));
|
| + EXPECT_EQ(tests[i].expected_group_name,
|
| + tcp_conn_pool->last_group_name_received());
|
| + }
|
| +
|
| + HttpNetworkTransaction::SetUseAlternateProtocols(false);
|
| +}
|
| +
|
| +TEST_F(HttpNetworkTransactionTest, GroupNameForHTTPProxyConnections) {
|
| + const GroupNameTest tests[] = {
|
| + {
|
| + "http_proxy",
|
| + "http://www.google.com/http_proxy_normal",
|
| + "www.google.com:80",
|
| + },
|
| +
|
| + // SSL Tests
|
| + {
|
| + "http_proxy",
|
| + "https://www.google.com/http_connect_ssl",
|
| + "www.google.com:443",
|
| + },
|
| +
|
| +// TODO(willchan): Uncomment these tests when they work.
|
| // {
|
| // "http_proxy",
|
| // "http://host.with.alternate/direct",
|
| // "proxy/http_proxy:80/host.with.alternate:443",
|
| // },
|
| + };
|
| +
|
| + HttpNetworkTransaction::SetUseAlternateProtocols(true);
|
| +
|
| + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| + scoped_refptr<HttpNetworkSession> session(
|
| + SetupSessionForGroupNameTests(tests[i].proxy_server));
|
| +
|
| + HttpNetworkSessionPeer peer(session);
|
| +
|
| + scoped_refptr<CaptureGroupNameTCPSocketPool> http_proxy_pool(
|
| + new CaptureGroupNameTCPSocketPool(session.get()));
|
| + peer.SetSocketPoolForHTTPProxy(
|
| + HostPortPair("http_proxy", 80), http_proxy_pool);
|
| +
|
| + EXPECT_EQ(ERR_IO_PENDING,
|
| + GroupNameTransactionHelper(tests[i].url, session));
|
| + EXPECT_EQ(tests[i].expected_group_name,
|
| + http_proxy_pool->last_group_name_received());
|
| + }
|
| +
|
| + HttpNetworkTransaction::SetUseAlternateProtocols(false);
|
| +}
|
| +
|
| +TEST_F(HttpNetworkTransactionTest, GroupNameForSOCKSConnections) {
|
| + const GroupNameTest tests[] = {
|
| + {
|
| + "socks4://socks_proxy:1080",
|
| + "http://www.google.com/socks4_direct",
|
| + "socks4/www.google.com:80",
|
| + },
|
| + {
|
| + "socks5://socks_proxy:1080",
|
| + "http://www.google.com/socks5_direct",
|
| + "socks5/www.google.com:80",
|
| + },
|
| +
|
| + // SSL Tests
|
| + {
|
| + "socks4://socks_proxy:1080",
|
| + "https://www.google.com/socks4_ssl",
|
| + "socks4/www.google.com:443",
|
| + },
|
| + {
|
| + "socks5://socks_proxy:1080",
|
| + "https://www.google.com/socks5_ssl",
|
| + "socks5/www.google.com:443",
|
| + },
|
| +
|
| +// TODO(willchan): Uncomment these tests when they work.
|
| // {
|
| // "socks4://socks_proxy:1080",
|
| // "http://host.with.alternate/direct",
|
| @@ -3738,40 +3871,21 @@ TEST_F(HttpNetworkTransactionTest, GroupNameForProxyConnections) {
|
| HttpNetworkTransaction::SetUseAlternateProtocols(true);
|
|
|
| for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
|
| - SessionDependencies session_deps(
|
| - CreateFixedProxyService(tests[i].proxy_server));
|
| -
|
| - scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps));
|
| -
|
| - HttpAlternateProtocols* alternate_protocols =
|
| - session->mutable_alternate_protocols();
|
| - alternate_protocols->SetAlternateProtocolFor(
|
| - HostPortPair("host.with.alternate", 80), 443,
|
| - HttpAlternateProtocols::NPN_SPDY_1);
|
| + scoped_refptr<HttpNetworkSession> session(
|
| + SetupSessionForGroupNameTests(tests[i].proxy_server));
|
| + HttpNetworkSessionPeer peer(session);
|
|
|
| - scoped_refptr<CaptureGroupNameTCPSocketPool> tcp_conn_pool(
|
| - new CaptureGroupNameTCPSocketPool(session.get(),
|
| - session->socket_factory()));
|
| - session->tcp_socket_pool_ = tcp_conn_pool.get();
|
| scoped_refptr<CaptureGroupNameSOCKSSocketPool> socks_conn_pool(
|
| - new CaptureGroupNameSOCKSSocketPool(session.get(),
|
| - tcp_conn_pool.get()));
|
| - session->socks_socket_pool_ = socks_conn_pool.get();
|
| + new CaptureGroupNameSOCKSSocketPool(session.get()));
|
| + peer.SetSocketPoolForSOCKSProxy(
|
| + HostPortPair("socks_proxy", 1080), socks_conn_pool);
|
|
|
| scoped_ptr<HttpTransaction> trans(new HttpNetworkTransaction(session));
|
|
|
| - HttpRequestInfo request;
|
| - request.method = "GET";
|
| - request.url = GURL(tests[i].url);
|
| - request.load_flags = 0;
|
| -
|
| - TestCompletionCallback callback;
|
| -
|
| - // We do not complete this request, the dtor will clean the transaction up.
|
| - EXPECT_EQ(ERR_IO_PENDING, trans->Start(&request, &callback, BoundNetLog()));
|
| - std::string allgroups = tcp_conn_pool->last_group_name_received() +
|
| - socks_conn_pool->last_group_name_received();
|
| - EXPECT_EQ(tests[i].expected_group_name, allgroups);
|
| + EXPECT_EQ(ERR_IO_PENDING,
|
| + GroupNameTransactionHelper(tests[i].url, session));
|
| + EXPECT_EQ(tests[i].expected_group_name,
|
| + socks_conn_pool->last_group_name_received());
|
| }
|
|
|
| HttpNetworkTransaction::SetUseAlternateProtocols(false);
|
|
|