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

Side by Side Diff: net/http/http_stream_factory_impl_unittest.cc

Issue 1502453003: QUIC - Disable Preconnect when QUIC can be spoken to a server with 0RTT (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix test name Created 5 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 unified diff | Download patch
« no previous file with comments | « net/http/http_stream_factory_impl.cc ('k') | net/net.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/http/http_stream_factory_impl.h" 5 #include "net/http/http_stream_factory_impl.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/basictypes.h" 12 #include "base/basictypes.h"
13 #include "base/compiler_specific.h" 13 #include "base/compiler_specific.h"
14 #include "net/base/port_util.h" 14 #include "net/base/port_util.h"
15 #include "net/base/test_completion_callback.h" 15 #include "net/base/test_completion_callback.h"
16 #include "net/cert/mock_cert_verifier.h" 16 #include "net/cert/mock_cert_verifier.h"
17 #include "net/dns/mock_host_resolver.h" 17 #include "net/dns/mock_host_resolver.h"
18 #include "net/http/http_auth_handler_factory.h" 18 #include "net/http/http_auth_handler_factory.h"
19 #include "net/http/http_network_session.h" 19 #include "net/http/http_network_session.h"
20 #include "net/http/http_network_session_peer.h" 20 #include "net/http/http_network_session_peer.h"
21 #include "net/http/http_network_transaction.h" 21 #include "net/http/http_network_transaction.h"
22 #include "net/http/http_request_info.h" 22 #include "net/http/http_request_info.h"
23 #include "net/http/http_server_properties.h" 23 #include "net/http/http_server_properties.h"
24 #include "net/http/http_server_properties_impl.h" 24 #include "net/http/http_server_properties_impl.h"
25 #include "net/http/http_stream.h" 25 #include "net/http/http_stream.h"
26 #include "net/http/transport_security_state.h" 26 #include "net/http/transport_security_state.h"
27 #include "net/log/net_log.h" 27 #include "net/log/net_log.h"
28 #include "net/proxy/proxy_info.h" 28 #include "net/proxy/proxy_info.h"
29 #include "net/proxy/proxy_service.h" 29 #include "net/proxy/proxy_service.h"
30 #include "net/quic/quic_server_id.h"
31 #include "net/quic/test_tools/quic_stream_factory_peer.h"
30 #include "net/socket/client_socket_handle.h" 32 #include "net/socket/client_socket_handle.h"
31 #include "net/socket/mock_client_socket_pool_manager.h" 33 #include "net/socket/mock_client_socket_pool_manager.h"
32 #include "net/socket/next_proto.h" 34 #include "net/socket/next_proto.h"
33 #include "net/socket/socket_test_util.h" 35 #include "net/socket/socket_test_util.h"
34 #include "net/spdy/spdy_session.h" 36 #include "net/spdy/spdy_session.h"
35 #include "net/spdy/spdy_session_pool.h" 37 #include "net/spdy/spdy_session_pool.h"
36 #include "net/spdy/spdy_test_util_common.h" 38 #include "net/spdy/spdy_test_util_common.h"
37 #include "net/ssl/ssl_config_service.h" 39 #include "net/ssl/ssl_config_service.h"
38 #include "net/ssl/ssl_config_service_defaults.h" 40 #include "net/ssl/ssl_config_service_defaults.h"
39 // This file can be included from net/http even though 41 // This file can be included from net/http even though
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 111
110 // HttpStreamFactoryImpl subclass that can wait until a preconnect is complete. 112 // HttpStreamFactoryImpl subclass that can wait until a preconnect is complete.
111 class MockHttpStreamFactoryImplForPreconnect : public HttpStreamFactoryImpl { 113 class MockHttpStreamFactoryImplForPreconnect : public HttpStreamFactoryImpl {
112 public: 114 public:
113 MockHttpStreamFactoryImplForPreconnect(HttpNetworkSession* session, 115 MockHttpStreamFactoryImplForPreconnect(HttpNetworkSession* session,
114 bool for_websockets) 116 bool for_websockets)
115 : HttpStreamFactoryImpl(session, for_websockets), 117 : HttpStreamFactoryImpl(session, for_websockets),
116 preconnect_done_(false), 118 preconnect_done_(false),
117 waiting_for_preconnect_(false) {} 119 waiting_for_preconnect_(false) {}
118 120
119
120 void WaitForPreconnects() { 121 void WaitForPreconnects() {
121 while (!preconnect_done_) { 122 while (!preconnect_done_) {
122 waiting_for_preconnect_ = true; 123 waiting_for_preconnect_ = true;
123 base::MessageLoop::current()->Run(); 124 base::MessageLoop::current()->Run();
124 waiting_for_preconnect_ = false; 125 waiting_for_preconnect_ = false;
125 } 126 }
126 } 127 }
127 128
128 private: 129 private:
129 // HttpStreamFactoryImpl methods. 130 // HttpStreamFactoryImpl methods.
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after
632 ERR_QUIC_HANDSHAKE_FAILED, 633 ERR_QUIC_HANDSHAKE_FAILED,
633 ERR_SSL_PROTOCOL_ERROR, 634 ERR_SSL_PROTOCOL_ERROR,
634 ERR_MSG_TOO_BIG}; 635 ERR_MSG_TOO_BIG};
635 for (size_t i = 0; i < arraysize(mock_error); ++i) { 636 for (size_t i = 0; i < arraysize(mock_error); ++i) {
636 scoped_ptr<ProxyService> proxy_service; 637 scoped_ptr<ProxyService> proxy_service;
637 proxy_service = 638 proxy_service =
638 ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT"); 639 ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT");
639 640
640 HttpNetworkSession::Params params; 641 HttpNetworkSession::Params params;
641 params.enable_quic = true; 642 params.enable_quic = true;
643 params.quic_disable_preconnect_if_0rtt = false;
642 params.enable_quic_for_proxies = true; 644 params.enable_quic_for_proxies = true;
643 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( 645 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service(
644 new SSLConfigServiceDefaults); 646 new SSLConfigServiceDefaults);
645 HttpServerPropertiesImpl http_server_properties; 647 HttpServerPropertiesImpl http_server_properties;
646 MockClientSocketFactory socket_factory; 648 MockClientSocketFactory socket_factory;
647 params.client_socket_factory = &socket_factory; 649 params.client_socket_factory = &socket_factory;
648 MockHostResolver host_resolver; 650 MockHostResolver host_resolver;
649 params.host_resolver = &host_resolver; 651 params.host_resolver = &host_resolver;
650 TransportSecurityState transport_security_state; 652 TransportSecurityState transport_security_state;
651 params.transport_security_state = &transport_security_state; 653 params.transport_security_state = &transport_security_state;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
693 } // namespace 695 } // namespace
694 696
695 TEST_P(HttpStreamFactoryTest, QuicLossyProxyMarkedAsBad) { 697 TEST_P(HttpStreamFactoryTest, QuicLossyProxyMarkedAsBad) {
696 // Checks if a 698 // Checks if a
697 scoped_ptr<ProxyService> proxy_service; 699 scoped_ptr<ProxyService> proxy_service;
698 proxy_service = ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT"); 700 proxy_service = ProxyService::CreateFixedFromPacResult("QUIC bad:99; DIRECT");
699 701
700 HttpNetworkSession::Params params; 702 HttpNetworkSession::Params params;
701 params.enable_quic = true; 703 params.enable_quic = true;
702 params.enable_quic_for_proxies = true; 704 params.enable_quic_for_proxies = true;
705 params.quic_disable_preconnect_if_0rtt = false;
703 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service( 706 scoped_refptr<SSLConfigServiceDefaults> ssl_config_service(
704 new SSLConfigServiceDefaults); 707 new SSLConfigServiceDefaults);
705 HttpServerPropertiesImpl http_server_properties; 708 HttpServerPropertiesImpl http_server_properties;
706 MockClientSocketFactory socket_factory; 709 MockClientSocketFactory socket_factory;
707 params.client_socket_factory = &socket_factory; 710 params.client_socket_factory = &socket_factory;
708 MockHostResolver host_resolver; 711 MockHostResolver host_resolver;
709 params.host_resolver = &host_resolver; 712 params.host_resolver = &host_resolver;
710 TransportSecurityState transport_security_state; 713 TransportSecurityState transport_security_state;
711 params.transport_security_state = &transport_security_state; 714 params.transport_security_state = &transport_security_state;
712 params.proxy_service = proxy_service.get(); 715 params.proxy_service = proxy_service.get();
(...skipping 28 matching lines...) Expand all
741 // The proxy that failed should now be known to the proxy_service as bad. 744 // The proxy that failed should now be known to the proxy_service as bad.
742 const ProxyRetryInfoMap& retry_info = 745 const ProxyRetryInfoMap& retry_info =
743 session->proxy_service()->proxy_retry_info(); 746 session->proxy_service()->proxy_retry_info();
744 EXPECT_EQ(1u, retry_info.size()); 747 EXPECT_EQ(1u, retry_info.size());
745 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); 748 EXPECT_TRUE(waiter.used_proxy_info().is_direct());
746 749
747 ProxyRetryInfoMap::const_iterator iter = retry_info.find("quic://bad:99"); 750 ProxyRetryInfoMap::const_iterator iter = retry_info.find("quic://bad:99");
748 EXPECT_TRUE(iter != retry_info.end()); 751 EXPECT_TRUE(iter != retry_info.end());
749 } 752 }
750 753
754 TEST_P(HttpStreamFactoryTest, UsePreConnectIfNoZeroRTT) {
755 for (int num_streams = 1; num_streams < 3; ++num_streams) {
756 GURL url = GURL("https://www.google.com");
757
758 // Set up QUIC as alternative_service.
759 HttpServerPropertiesImpl http_server_properties;
760 const AlternativeService alternative_service(QUIC, url.host().c_str(),
761 url.IntPort());
762 AlternativeServiceInfoVector alternative_service_info_vector;
763 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
764 alternative_service_info_vector.push_back(
765 AlternativeServiceInfo(alternative_service, 1.0, expiration));
766 HostPortPair host_port_pair(alternative_service.host_port_pair());
767 http_server_properties.SetAlternativeServices(
768 host_port_pair, alternative_service_info_vector);
769
770 SpdySessionDependencies session_deps(
771 GetParam(), ProxyService::CreateFixed("http_proxy"));
772
773 // Setup params to disable preconnect, but QUIC doesn't 0RTT.
774 HttpNetworkSession::Params params =
775 SpdySessionDependencies::CreateSessionParams(&session_deps);
776 params.enable_quic = true;
777 params.quic_disable_preconnect_if_0rtt = true;
778 params.http_server_properties = http_server_properties.GetWeakPtr();
779
780 scoped_ptr<HttpNetworkSession> session(new HttpNetworkSession(params));
781 HttpNetworkSessionPeer peer(session.get());
782 HostPortPair proxy_host("http_proxy", 80);
783 CapturePreconnectsHttpProxySocketPool* http_proxy_pool =
784 new CapturePreconnectsHttpProxySocketPool(
785 session_deps.host_resolver.get(), session_deps.cert_verifier.get());
786 CapturePreconnectsSSLSocketPool* ssl_conn_pool =
787 new CapturePreconnectsSSLSocketPool(session_deps.host_resolver.get(),
788 session_deps.cert_verifier.get());
789 scoped_ptr<MockClientSocketPoolManager> mock_pool_manager(
790 new MockClientSocketPoolManager);
791 mock_pool_manager->SetSocketPoolForHTTPProxy(proxy_host, http_proxy_pool);
792 mock_pool_manager->SetSocketPoolForSSLWithProxy(proxy_host, ssl_conn_pool);
793 peer.SetClientSocketPoolManager(mock_pool_manager.Pass());
794 PreconnectHelperForURL(num_streams, url, session.get());
795 EXPECT_EQ(num_streams, ssl_conn_pool->last_num_streams());
796 }
797 }
798
799 TEST_P(HttpStreamFactoryTest, QuicDisablePreConnectIfZeroRtt) {
800 for (int num_streams = 1; num_streams < 3; ++num_streams) {
801 GURL url = GURL("https://www.google.com");
802
803 // Set up QUIC as alternative_service.
804 HttpServerPropertiesImpl http_server_properties;
805 const AlternativeService alternative_service(QUIC, "www.google.com", 443);
806 AlternativeServiceInfoVector alternative_service_info_vector;
807 base::Time expiration = base::Time::Now() + base::TimeDelta::FromDays(1);
808 alternative_service_info_vector.push_back(
809 AlternativeServiceInfo(alternative_service, 1.0, expiration));
810 HostPortPair host_port_pair(alternative_service.host_port_pair());
811 http_server_properties.SetAlternativeServices(
812 host_port_pair, alternative_service_info_vector);
813
814 SpdySessionDependencies session_deps(GetParam());
815
816 // Setup params to disable preconnect, but QUIC does 0RTT.
817 HttpNetworkSession::Params params =
818 SpdySessionDependencies::CreateSessionParams(&session_deps);
819 params.enable_quic = true;
820 params.quic_disable_preconnect_if_0rtt = true;
821 params.http_server_properties = http_server_properties.GetWeakPtr();
822
823 scoped_ptr<HttpNetworkSession> session(new HttpNetworkSession(params));
824
825 // Setup 0RTT for QUIC.
826 QuicStreamFactory* factory = session->quic_stream_factory();
827 factory->set_require_confirmation(false);
828 test::QuicStreamFactoryPeer::CacheDummyServerConfig(
829 factory, QuicServerId(host_port_pair, PRIVACY_MODE_DISABLED));
830
831 HttpNetworkSessionPeer peer(session.get());
832 CapturePreconnectsTransportSocketPool* transport_conn_pool =
833 new CapturePreconnectsTransportSocketPool(
834 session_deps.host_resolver.get(), session_deps.cert_verifier.get());
835 scoped_ptr<MockClientSocketPoolManager> mock_pool_manager(
836 new MockClientSocketPoolManager);
837 mock_pool_manager->SetTransportSocketPool(transport_conn_pool);
838 peer.SetClientSocketPoolManager(mock_pool_manager.Pass());
839
840 HttpRequestInfo request;
841 request.method = "GET";
842 request.url = url;
843 request.load_flags = 0;
844
845 SSLConfig ssl_config;
846 session->ssl_config_service()->GetSSLConfig(&ssl_config);
847 session->http_stream_factory()->PreconnectStreams(num_streams, request,
848 ssl_config, ssl_config);
849 EXPECT_EQ(-1, transport_conn_pool->last_num_streams());
850 }
851 }
852
751 namespace { 853 namespace {
752 854
753 TEST_P(HttpStreamFactoryTest, PrivacyModeDisablesChannelId) { 855 TEST_P(HttpStreamFactoryTest, PrivacyModeDisablesChannelId) {
754 SpdySessionDependencies session_deps( 856 SpdySessionDependencies session_deps(
755 GetParam(), ProxyService::CreateDirect()); 857 GetParam(), ProxyService::CreateDirect());
756 858
757 StaticSocketDataProvider socket_data; 859 StaticSocketDataProvider socket_data;
758 socket_data.set_connect_data(MockConnect(ASYNC, OK)); 860 socket_data.set_connect_data(MockConnect(ASYNC, OK));
759 session_deps.socket_factory->AddSocketDataProvider(&socket_data); 861 session_deps.socket_factory->AddSocketDataProvider(&socket_data);
760 862
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after
1440 EXPECT_TRUE(waiter.used_proxy_info().is_direct()); 1542 EXPECT_TRUE(waiter.used_proxy_info().is_direct());
1441 1543
1442 // Make sure there is no orphaned job. it is already canceled. 1544 // Make sure there is no orphaned job. it is already canceled.
1443 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>( 1545 ASSERT_EQ(0u, static_cast<HttpStreamFactoryImpl*>(
1444 session->http_stream_factory_for_websocket())->num_orphaned_jobs()); 1546 session->http_stream_factory_for_websocket())->num_orphaned_jobs());
1445 } 1547 }
1446 1548
1447 } // namespace 1549 } // namespace
1448 1550
1449 } // namespace net 1551 } // namespace net
OLDNEW
« no previous file with comments | « net/http/http_stream_factory_impl.cc ('k') | net/net.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698